From a847daafcf7e76f723ced63a0876909e1ad5447e Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sat, 1 Apr 2023 18:03:47 +0000 Subject: [PATCH 01/33] add play store badge --- .playstore/en_badge_web_generic.png | Bin 0 -> 4904 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .playstore/en_badge_web_generic.png diff --git a/.playstore/en_badge_web_generic.png b/.playstore/en_badge_web_generic.png new file mode 100644 index 0000000000000000000000000000000000000000..131f3acaa252a863c3b694d0f522ea750aebd81c GIT binary patch literal 4904 zcmZu#X*kqj*B?vC^fxJqAzKJz8HNyL8$|XkODM@MO?I+mn~{BA$1;lSlw{2|q>(kd zNMqlPoovtaK40Ds&$+JqKIi(~zjLm$eY)T3YCoU@vw%S$5S_Z3vOWkzi6+~BFHw>2 z%YvR`AP~iruBM^N1C*w*v9YD4rLC>4i;Ihum6f-*cT!SPK|w)ubhMkBo4L7pR#sMM zXlO!0g1x=Hy1F_H24iGoB*)?4;2;yQSgeGEgulN(27{54lQS?dFf}!GbaVuR!DNse znUj-KK|uk9LebOHzj^cK>C>m8qN2LGx-^VnriVOiPvCq3ay;&LSqx$HcUY>bsumU& zR#sNd&(CLOX5!=Hr>3U1x3@bwI@Z?K4i67!XJgwwD_V)Jo_gh+8mY0`(eSLR# zcdyHH{Q2{TL?UrHNTjBw@>p2U&(AkBG$5YW%0yReZEeYTj3|Ze-cP9M>FJSvuT7|6 za512i$=4pKWjJo6p3J9~hf~NFXqN?3aWGTd|DYXUNl6cY);>~OKA@B@(*7DlmE}pL zP^7IROA+Hp85b9qo15E{PE}c1+27xPuh0w8dyslD8GibTPTcb_T*4wKq!--YlsEE~=_}VEV1t$aCU!*Vi@x$yAJQcK#)|bwBR>jI92jI4+!@YWtUy zw}pN}U0Ko4n__Lu=-H|Qy-I7mx|CQ~u;^M~Vk{InTTy%m8?-@5j`_buJ~zFG=}C+0 zNK)eC@`)4b-rmvq&2S znYL+>MWNEpl?(mg_OiwMBs(k}nb*mWUPg0tC|{`x2!y zr?doYs^bD|j#gy5wbbyZbAtK7y`XdA7sF3#h<(zNhKNzC%(*dqpvPW0-X_8SiViAy z?#oc+!=HO3>QVI#$FGD2_Usus0-LVjF`>XvRKs>} zj!S2hKo1QD;<>*6S2fyAH>H@3;zVPnvyb6cq3I zpsU<=E?!Zh?1*wx^rDVE7s0-2YicvaW~$bZ8)jROv;lCag16 za=qp5L-`1v7FG`xG;1fQ1iIxSFeazO$`Nzj;*meZ<-?^I9ceLvQkscm8a7I{Wd1m z;b-2)IVa%Y^gjxAAjs%&;juCau?yHeURI8*YB%+!ZYd4#>%83`ee+Rb8HEYAR72CV z0n2h!f7LM*B>jcTHHED&E|vJm?8ahj_zbmz)a^_&!mZ+1tE86d{1FOgYyhO67Iot_ z8VmFdZksK(8_~3Iy4vVR13RbM*wZ1EGp;=XDvd(b2OR}?{j4w><4p;r5YZu&siNa4 zByAryabA(XC}GH;&?i1;U5nLTF4h7psMNw^ttyMWb$1_sWz1!92nHXn0&%7)z=%?XN?tKZSt zTuk^6i(t%ho6zuMs{VYt@5J^Wqpep&KOfia?QC_t8Pwpsn$5+4UtD~MS@z3Z>5lp| zrZAu`3{0J3pX6Y;|FuC5olV@)Fw=92SuepU#-Fh^v*=5JdY_STt7^QvQ|huE-Z=pm zFWI_VWo5ZZFB%bxvol#2m7lgg(lQOWF7+m{d0lG$UOvSxGt?J73|T*7A6!LST|D{w z%Tme@&OS%!!|aQm_NsO3^@{jOf$9l}n1M)N>|YZn56lfSEbJ_vCD3P1sY=Qg;A?~M zJKO%TUV=W7{k-@ZkaFgq1fjZL;}=||#s2JGlb$6%1x#Bx7409RXT0O&BmZu&LLP3g zHl+Zypq3x~;-#MUaJx~T3bWW!;1&Ap?1IX>DLuUUN zcb%TRrL*d!n3Fzjmu4j1ok)|vX&~7PijaB}m5#Gpl9`j6X3+np52K091A@L7s zi26+ukITIe=bsjO**D+K{6E$7Ky*lU&A~tRX`#C`i%vTt826j#zTgwUX?qpegW$v3 zRP=--|Cx#DH3B`MQ6a=OoGLM|k^U1H4aUrO%a(#eo&SN_#Jmi6m5QjLw6pDRQy;i@?48gM7z zAQ^?d)+fBSCCi_y#FR0ON^%F~ueVg^=e!W^?yPx#<~ruZ%u5Bo7_cJ0;gq=+`rM-> zT6f;oP&}LMyS5~=<@fXHk!R1hIJa;x?-7-7G>hL|#o^w{GRP7ue z?bnZ5cA9GJgHsmh-!4EtL=VR)&u2BH{HxyqG{JZBenSMgDTzj43U!lKqrRICNKEkP zn%qauN0>FIC~Ai45K2SUjz29DK z*WJXf4BrnB7cSL@MrL0?Fw_aDs-1f2b5uz z+U(1|4vFtIA7}CiSPqTrB*;+u2;q;|__%GpH_}r5>WvP_w$yp8XK?em>nY$9b`7&V z%jzO|yJSGz!QlqxJ{NOlzD5B1V_Os76Fs<%y$DCNlimHqrQ615)?0iOM)KrTTW}|$ znG34Pp(1a)K9?<8AL8OK_r(RC=m}eo9Y)$0SZt2-U@Dx?_67WY?};mixni2n1=R=F zpv5c(T`D1Sm!TKHi`AsmH4t~C=&gbIt z;-mUHpobeGas(*4`=LE$!f(Ip6TZ;AGx&6D3NjgOe6HOWS>`AGp-3y8=>9NOD68YP zpL@2I826~tm(+LV8S?1ZC5cy;lish|T>@W#5F1Bl#U-RKAG}*Yk2LPUCA>y$e|L)t za;8|dbmmOog4;6Rk@xo6>2kY2Q?D$>meY1t?TRkcUC<5qdk3#7Y?F33OuDw%0iJr) zsa1vG_)*$!il&nbINDQ##uQ6q4E*hl=VKK48i&Mk1vL2)nzE7W%M}qC%-=Rh5%uD?L!C=QIPG|sWIDb za}gZ9oOLeJmS3BpeEWV^7D(c-TRQe#B(HCx?&7t@Isw=CY?;dnPJ!gNiPLy0#OIxg ze$Y#;Ve}(Wk?T{hbUGE zA(KyqXrcPSqd$bqif#DyE*NQ3+A4J9@6L zLi@t!6XSCl>HDj*yByp`UG&$x+|DVcI4jX{HPOmuC>$U6O~@E8k3lvxjS6VE{rb|7 zZ&`cg!F)FiGxc0lbQob?P9k#GTjlvFO}(o?APXbLJNwrV60T^b!@L|Gli<>p{=@s} z9_K!YJ0r>e*jo(OR7GL2&pz(o5Zl%4S&sl%;ZF;7e}is2J+Cz<4%)fzEVZZ7rug{y zmnz9*e>m{?tWy<@3${^z5N8CvxUlTz z-?(Q7W${jQwBdhrxXoC`j0M$wQhM)N%CU26`hqwhkm6XMWSL{t+04{Xanbf|HNsEW z@NnU78EZ1+beNW{fY*36MH1wQ_d)~srb;^H*pH@JR(LsqCzGvl?$tmTn4>v&c#v&u z+M%@w`QTC%d^h5gQpM-mevO`-tGhX0Ez_-j$O$|xOuJ8Sgt!hfche7tbwz5w;C8bN zC|bKC41b+<7Wv3*KVuPs`xVn81Ef15y!8WqHdq^$0XE>x=DgWvfi3~ z(MZCITSkaIg93x6Q#N-ME$5LxV3hGvspX|&GbPgd@vRzh3aBJILN_0net2EZPy0dS zUc#KiRm6tJr!ZkX5w4em>Dg1)!Z>EfSe?-B_8Nwf9E}biqzEOVL$oUmQDPxEp_~*? zjPe0qa&7Od3pBDXPcxNQD-NkeIBNh7q>d=x3uu}gBjW3uMcU|VVVgMvuVz)7 zUDq$w{8;P&_V^9Fsn9ZD=*;J~5rS?m>5N7uAd2ZESxeKc3Xk;7;DOty$y{eF$H#4M zV_L){ysHb8&>YPP$!=`&#X?-rBfW>Vn36Sq-iAYd-j&PK!5+-pkOw`8AzI4-e?Z>9 zTIuenFFix7?vE=eZj-I9w*+BA_e>zhQ?-Q_@m$MRb_^UpbdPolSD1s9Oz)0vy;~QR zN|S{>sCoDPr%F1%K)lOEKXWYxG^BU3J@fmDCEn+z70){9>bIEizo--?J(LH~Oatzi zH}BLL+$Rc!e2jspRQuCo|E^95NoSh;I_oyWbT-;t!y4T5Es5Eik~n!q=uVp)>Li`Z z2lB!fWjdA|&oqOA0vaUIPnr@^-Ljsu)UpIbh8U$VBK&yBgdm9!k@YsmrIgOL{M8la zpGb0=w8}LD$4x_>hJ(-y7_^C>>}F`LJ!u>C<%|5{qDL~YtW}3yO-dM>QA~xUv$VMc z$v~TYyU8?@D7%~W)c)PV5X<`VBrbpNf1qJyURPnHczrJQj3><*r&}4YJnr9wT{Uc5 zL#DCCWEU?34HL}IEE~tmuj}u3jF}Z&k6*D4KO$``pB}?=P+=08c=Mj9ys|_tTa9u< zuIz()u~K<7+_H4xr-zPL5b*|6+DwO|46;HJy@wHCzsXX}nRPcZUlxyw+~}r1OLWc% zta)rq8$%^VuOR#9mDZRTfIo%Tb!%qjA3$>9>PDyMtt`*z{(H`7N{KVSM(JH(WyF*5 zNo1cCQH)S};#@sPMv z^CwKdmU^#-)~Z&*a{W2wZX34m;pzQu?=^Xf`jUHt~g4A>3^F^`QwuC zwS7#v>^`Zx-vjfi>vDBl7VCIM9b@5<5gGJs-tJL6%sq9 g6#x5Mf{gz51&^3@tr*$xbpPY1t7t2iD?JVV5121yGXMYp literal 0 HcmV?d00001 From 30631dbbc866644285eddf23eb1559bd01d1b8e4 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sat, 1 Apr 2023 18:11:01 +0000 Subject: [PATCH 02/33] add button to readme --- README.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 770196bb..1944ea53 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ # Waterfly III +

+ +

+ **Unofficial** Android App for [Firefly III](https://github.com/firefly-iii/firefly-iii), a free and open source personal finance manager. The app design is heavily influenced by [Bluecoins](https://play.google.com/store/apps/details?id=com.rammigsoftware.bluecoins). @@ -24,6 +28,7 @@ The app is still pretty much work in progress, but basic features already do wor - Add/Remove money from Piggy Banks ### Planned Features + The app does **not** try to replicate every single feature that the Webinterface has. Instead, it tries to be a good *companion* to access the most used functions on-the-go. More in-depth operations such as creating or deleting asset accounts, creating or modifying rules etc. are not planned. - Detailed Accounts page @@ -35,13 +40,13 @@ The app does **not** try to replicate every single feature that the Webinterface *All made with a Google Pixel 5.* -Dashboard | Transactions | Balance Sheet | -| :-: | :-: | :-: | -|| +| Dashboard | Transactions | Balance Sheet | +| :-----------------------------------------------------------: | :-----------------------------------------------------------------------: | :---------------------------------------------------------: | +| | | | -Transaction Edit | Split Transaction | Transaction Attachments -| :-: | :-: | :-: | -|| +| Transaction Edit | Split Transaction | Transaction Attachments | +| :-------------------------------------------------------------: | :-------------------------------------------------------------------: | :-------------------------------------------------------------------------: | +| | | | ## Technology @@ -51,4 +56,4 @@ The app is built using [Flutter](https://flutter.dev/), and tries to keep to the Having troubles with [Bluecoins](https://play.google.com/store/apps/details?id=com.rammigsoftware.bluecoins) syncing across devices and not always storing attachments online, I was looking for a self-hosted alternative and discovered [Firefly III](https://www.firefly-iii.org/). After a [quick script to migrate from Bluecoins to Firefly](https://github.com/dreautall/bluecoins-to-fireflyiii), the only thing left was to download an app to easy track expenses on-the-go... or so I thought. -Unfortunately, I discovered that the existing Android Apps for Firefly III are either outdated or very buggy and hardly maintained. Always wanting to use Flutter for something, I started to make my own app, modeling it after the Bluecoins app I used so far and whose interface I really liked. \ No newline at end of file +Unfortunately, I discovered that the existing Android Apps for Firefly III are either outdated or very buggy and hardly maintained. Always wanting to use Flutter for something, I started to make my own app, modeling it after the Bluecoins app I used so far and whose interface I really liked. From c3a51da94a1e12dd073515c576cc8b5b9cea640a Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 17:13:00 +0000 Subject: [PATCH 03/33] TransactionDetail: fix attachment upload --- lib/pages/transaction_detail.dart | 53 ++++++++++++++++--------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/lib/pages/transaction_detail.dart b/lib/pages/transaction_detail.dart index a152bc4b..ab70a161 100644 --- a/lib/pages/transaction_detail.dart +++ b/lib/pages/transaction_detail.dart @@ -4,6 +4,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:intl/intl.dart'; +import 'package:mime/mime.dart' show lookupMimeType; import 'package:collection/collection.dart'; import 'package:path_provider/path_provider.dart' show getTemporaryDirectory; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -2641,8 +2642,10 @@ class _AttachmentDialogState extends State headers: user.headers(), baseDirectory: BaseDirectory.temporary, post: 'binary', + mimeType: "application/octet-stream", ); - final TaskStatus result = await FileDownloader().upload( + debugPrint("AttachmentUpload: Starting Upload"); + await FileDownloader().upload( task, onProgress: (double progress) { debugPrint("Upload progress: $progress"); @@ -2650,31 +2653,31 @@ class _AttachmentDialogState extends State _dlProgress[newAttachmentIndex] = progress * -1; }); }, + onStatus: (TaskStatus result) async { + debugPrint("AttachmentUpload: status update"); + _dlProgress.remove(newAttachmentIndex); + if (result != TaskStatus.complete) { + late String error; + debugPrint(result.toString()); + try { + ValidationError valError = ValidationError.fromJson( + json.decode(respAttachment.error.toString())); + error = error = valError.message ?? l10n.errorUnknown; + } catch (_) { + error = l10n.errorUnknown; + } + debugPrint("error: $error"); + msg.showSnackBar(SnackBar( + content: Text( + l10n.transactionDialogAttachmentsErrorUpload(error)), + behavior: SnackBarBehavior.floating, + )); + widget.attachments.removeAt(newAttachmentIndex); + await api.v1AttachmentsIdDelete(id: newAttachment.id); + } + }, ); - - _dlProgress.remove(newAttachmentIndex); - - if (result != TaskStatus.complete) { - late String error; - debugPrint(result.toString()); - try { - ValidationError valError = ValidationError.fromJson( - json.decode(respAttachment.error.toString())); - error = error = valError.message ?? l10n.errorUnknown; - } catch (_) { - error = l10n.errorUnknown; - } - debugPrint("error: $error"); - msg.showSnackBar(SnackBar( - content: - Text(l10n.transactionDialogAttachmentsErrorUpload(error)), - behavior: SnackBarBehavior.floating, - )); - widget.attachments.removeAt(newAttachmentIndex); - await api.v1AttachmentsIdDelete(id: newAttachment.id); - - return; - } + debugPrint("AttachmentUpload: Done with Upload"); }, child: Text(S.of(context).formButtonUpload), ), From 10b78b79987383bd111ba8174740a530c809453c Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 17:37:21 +0000 Subject: [PATCH 04/33] TransactionDetail: don't require currency when launched from notification --- lib/pages/transaction_detail.dart | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/lib/pages/transaction_detail.dart b/lib/pages/transaction_detail.dart index ab70a161..0d0cf00b 100644 --- a/lib/pages/transaction_detail.dart +++ b/lib/pages/transaction_detail.dart @@ -4,7 +4,6 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:intl/intl.dart'; -import 'package:mime/mime.dart' show lookupMimeType; import 'package:collection/collection.dart'; import 'package:path_provider/path_provider.dart' show getTemporaryDirectory; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; @@ -306,7 +305,6 @@ class _TransactionPageState extends State } if (currencyStr.isEmpty) { debugPrint("no currency found"); - return; } if (_localCurrency!.attributes.code == currencyStr || _localCurrency!.attributes.symbol == currencyStr) { @@ -326,10 +324,6 @@ class _TransactionPageState extends State } } } - if (currency == null) { - debugPrint("api currency unknown"); - return; - } // Check if string has a decimal separator late double amount; final String amountStr = match.namedGroup("amount") ?? ""; @@ -363,12 +357,12 @@ class _TransactionPageState extends State if (currency == _localCurrency) { _localAmounts[0] = amount; _localAmountTextController.text = - amount.toStringAsFixed(currency.attributes.decimalPlaces ?? 2); + amount.toStringAsFixed(currency?.attributes.decimalPlaces ?? 2); } else { _foreignCurrency = currency; _foreignAmounts[0] = amount; _foreignAmountTextController.text = - amount.toStringAsFixed(currency.attributes.decimalPlaces ?? 2); + amount.toStringAsFixed(currency?.attributes.decimalPlaces ?? 2); } _noteTextControllers[0].text = widget.notification!.body; From 8d4c7871bfe9dd272f8cab55d7c1dfb7b7976968 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 19:03:34 +0000 Subject: [PATCH 05/33] Settings: separate page for notification listener --- lib/pages/settings.dart | 292 ++++++++++++++++++++++++++++++---------- 1 file changed, 221 insertions(+), 71 deletions(-) diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 6eb6e927..bc17f983 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -1,3 +1,4 @@ +import 'package:animations/animations.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; @@ -23,7 +24,7 @@ class SettingsPageState extends State final SettingsProvider settings = Provider.of(context); return ListView( - padding: const EdgeInsets.all(24), + padding: const EdgeInsets.symmetric(horizontal: 24), children: [ ListTile( title: Text(S.of(context).settingsLanguage), @@ -70,47 +71,19 @@ class SettingsPageState extends State future: nlStatus(), builder: (BuildContext context, AsyncSnapshot snapshot) { - final ScaffoldMessengerState msg = ScaffoldMessenger.of(context); final S l10n = S.of(context); late String subtitle; - Function? clickFn; - bool permissionsGranted = false; - bool isRunning = false; if (snapshot.connectionState == ConnectionState.done && snapshot.hasData) { if (!snapshot.data!.servicePermission) { - subtitle = l10n.settingsPermissionGrant; - clickFn = () async { - bool granted = await FlutterLocalNotificationsPlugin() - .resolvePlatformSpecificImplementation< - AndroidFlutterLocalNotificationsPlugin>()! - .requestPermission() ?? - false; - if (!granted) { - msg.showSnackBar(SnackBar( - content: Text(l10n.settingsPermissionNotGranted), - behavior: SnackBarBehavior.floating, - )); - return; - } - await NotificationServicePlugin.instance - .requestPermissionsIfDenied(); - await nlInit(); - }; + subtitle = l10n.settingsPermissionNotGranted; } else if (!snapshot.data!.notificationPermission) { - subtitle = l10n.settingsPermissionGrant; - clickFn = FlutterLocalNotificationsPlugin() - .resolvePlatformSpecificImplementation< - AndroidFlutterLocalNotificationsPlugin>()! - .requestPermission; + subtitle = l10n.settingsPermissionNotGranted; } else if (!snapshot.data!.serviceRunning) { subtitle = l10n.settingsServiceStopped; - permissionsGranted = true; } else { subtitle = l10n.settingsServiceRunning; - permissionsGranted = true; - isRunning = true; } } else if (snapshot.hasError) { subtitle = S @@ -119,47 +92,25 @@ class SettingsPageState extends State } else { subtitle = S.of(context).settingsServiceChecking; } - return ListTile( - title: Text(S.of(context).settingsNotificationListener), - subtitle: Text( - subtitle, - maxLines: 2, - ), - leading: const CircleAvatar( - child: Icon(Icons.notifications), - ), - onTap: clickFn != null - ? () async { - await clickFn!(); - setState(() {}); - } - : null, - // :TODO: stopService not working currently - /*trailing: Switch( - thumbIcon: MaterialStateProperty.resolveWith( - (Set states) { - if (states.contains(MaterialState.selected)) { - return const Icon(Icons.check); - } - return const Icon(Icons.close); - }, + return OpenContainer( + openBuilder: (BuildContext context, Function closedContainer) => + const SettingsNotifications(), + openColor: Theme.of(context).cardColor, + closedColor: Theme.of(context).cardColor, + closedElevation: 0, + closedBuilder: (BuildContext context, Function openContainer) => + ListTile( + title: Text(S.of(context).settingsNotificationListener), + subtitle: Text( + subtitle, + maxLines: 2, ), - value: isRunning, - onChanged: permissionsGranted - ? (bool value) async { - if (value) { - debugPrint("Starting Service"); - await NotificationServicePlugin.instance - .startService(); - } else { - debugPrint("Stopping Service"); - await NotificationServicePlugin.instance - .stopService(); - } - setState(() {}); - } - : null, - ),*/ + leading: const CircleAvatar( + child: Icon(Icons.notifications), + ), + onTap: () => openContainer(), + ), + onClosed: (_) => setState(() {}), ); }, ), @@ -222,3 +173,202 @@ class ThemeDialog extends StatelessWidget { ); } } + +class SettingsNotifications extends StatefulWidget { + const SettingsNotifications({ + super.key, + }); + + @override + State createState() => _SettingsNotificationsState(); +} + +class _SettingsNotificationsState extends State { + NotificationListenerStatus? status; + + @override + void initState() { + super.initState(); + } + + Future updateStatus() async { + status = await nlStatus(); + return status!; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text("Notification Service"), + ), + body: ListView( + padding: const EdgeInsets.symmetric(horizontal: 24), + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Text( + "This service allows you to fetch transaction details from incoming push notifications."), + ), + const Divider(), + FutureBuilder( + future: updateStatus(), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + final S l10n = S.of(context); + final ScaffoldMessengerState msg = ScaffoldMessenger.of(context); + + late String subtitle; + late Function clickFn; + if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + if (!snapshot.data!.servicePermission) { + subtitle = l10n.settingsPermissionGrant; + clickFn = () async { + bool granted = await FlutterLocalNotificationsPlugin() + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>()! + .requestPermission() ?? + false; + if (!granted) { + msg.showSnackBar(SnackBar( + content: Text(l10n.settingsPermissionNotGranted), + behavior: SnackBarBehavior.floating, + )); + return; + } + await NotificationServicePlugin.instance + .requestPermissionsIfDenied(); + await nlInit(); + }; + } else if (!snapshot.data!.notificationPermission) { + subtitle = l10n.settingsPermissionGrant; + clickFn = () async { + await FlutterLocalNotificationsPlugin() + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>()! + .requestPermission(); + }; + } else if (!snapshot.data!.serviceRunning) { + subtitle = l10n.settingsServiceStopped; + clickFn = () async { + await NotificationServicePlugin.instance.startService(); + }; + } else { + subtitle = l10n.settingsServiceRunning; + clickFn = () async { + final bool? ok = await showDialog( + context: context, + builder: (BuildContext context) => AlertDialog( + icon: const Icon(Icons.remove_done), + title: Text("Remove permission?"), + clipBehavior: Clip.hardEdge, + actions: [ + TextButton( + child: Text(S.of(context).formButtonCancel), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + FilledButton( + child: Text("Remove"), + onPressed: () { + Navigator.of(context).pop(true); + }, + ), + ], + content: Text( + "To disable this service, click on the app and remove the permissions in the next screen."), + ), + ); + if (!(ok ?? false)) { + return; + } + await NotificationServicePlugin.instance + .requestServicePermission(); + }; + } + } else if (snapshot.hasError) { + subtitle = S + .of(context) + .settingsServiceCheckingError(snapshot.error.toString()); + } else { + subtitle = S.of(context).settingsServiceChecking; + } + return ListTile( + title: const Text("Service Status"), + subtitle: Text( + subtitle, + maxLines: 2, + ), + onTap: () async { + await clickFn(); + setState(() {}); + }, + trailing: snapshot.data != null + ? Switch( + thumbIcon: MaterialStateProperty.resolveWith( + (Set states) { + if (states.contains(MaterialState.selected)) { + return const Icon(Icons.check); + } + return const Icon(Icons.close); + }, + ), + value: snapshot.data!.serviceRunning, + onChanged: snapshot.data!.servicePermission + ? (_) async { + await clickFn(); + setState(() {}); + } + : null, + ) + : null, + ); + }, + ), + const Divider(), + FutureBuilder>( + future: + Provider.of(context).notificationKnownApps(), + builder: + (BuildContext context, AsyncSnapshot> snapshot) { + if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ...snapshot.data!.map( + (String e) { + return Card( + clipBehavior: Clip.hardEdge, + child: Padding( + padding: const EdgeInsets.all(12), + child: Text(e), + ), + ); + }, + ), + ], + ); + } else if (snapshot.hasError) { + return Text(S + .of(context) + .settingsServiceCheckingError(snapshot.error.toString())); + } else { + return Text(S.of(context).settingsServiceChecking); + } + }, + ), + const Divider(), + if (status != null && + status!.serviceRunning && + status!.notificationPermission) ...[ + const Divider(), + const Text("yay"), + ], + ], + ), + ); + } +} From 6daee2e04955bba7c45696c21a100d44f2febc2e Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 19:05:03 +0000 Subject: [PATCH 06/33] NotificationListener: Use positive list Additionally, the app lists are always fetched from storage, as the backgorund process otherwise will not re-fetch the data when app settings are changed --- lib/notificationlistener.dart | 7 +++- lib/settings.dart | 66 ++++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 29 deletions(-) diff --git a/lib/notificationlistener.dart b/lib/notificationlistener.dart index f3351a73..08056a37 100644 --- a/lib/notificationlistener.dart +++ b/lib/notificationlistener.dart @@ -66,7 +66,7 @@ void nlCallback() async { debugPrint("nlCallback()"); NotificationServicePlugin.instance .executeNotificationListener((NotificationEvent? evt) async { - debugPrint("got event $evt"); + //debugPrint("got event $evt"); if (evt?.packageName?.startsWith("com.dreautall.waterflyiii") ?? false) { return; @@ -85,6 +85,11 @@ void nlCallback() async { SettingsProvider().notificationAddKnownApp(evt?.packageName ?? ""); + if (!(await SettingsProvider().notificationUsedApps()) + .contains(evt?.packageName ?? "")) { + debugPrint("nlCallback(): app not used"); + } + FlutterLocalNotificationsPlugin().show( evt?.id ?? 1, "Create Transaction?", diff --git a/lib/settings.dart b/lib/settings.dart index 1a77bb60..7fb8b5ca 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -9,7 +9,7 @@ class SettingsProvider with ChangeNotifier { static const String settingThemeSystem = "SYSTEM"; static const String settingLocale = "LOCALE"; static const String settingNLKnownApps = "NL_KNOWNAPPS"; - static const String settingNLIgnoredApps = "NL_IGNOREDAPPS"; + static const String settingNLUsedApps = "NL_USEDAPPS"; ThemeMode _theme = ThemeMode.system; ThemeMode get getTheme => _theme; @@ -20,11 +20,6 @@ class SettingsProvider with ChangeNotifier { bool _loaded = false; bool get loaded => _loaded; - List _notificationKnownApps = []; - List get notificationKnownApps => _notificationKnownApps; - List _notificationIgnoredApps = []; - List get notificationIgnoredApps => _notificationIgnoredApps; - Future loadSettings() async { SharedPreferences prefs = await SharedPreferences.getInstance(); debugPrint("reading prefs!"); @@ -51,11 +46,6 @@ class SettingsProvider with ChangeNotifier { _locale = locale; } - _notificationIgnoredApps = - prefs.getStringList(settingNLIgnoredApps) ?? []; - _notificationKnownApps = - prefs.getStringList(settingNLKnownApps) ?? []; - _loaded = true; debugPrint("notify SettingsProvider->loadSettings()"); notifyListeners(); @@ -94,42 +84,62 @@ class SettingsProvider with ChangeNotifier { } void notificationAddKnownApp(String packageName) async { - if (packageName.isEmpty || _notificationKnownApps.contains(packageName)) { + SharedPreferences prefs = await SharedPreferences.getInstance(); + final List apps = + prefs.getStringList(settingNLKnownApps) ?? []; + + if (packageName.isEmpty || apps.contains(packageName)) { return; } - _notificationKnownApps.add(packageName); - SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setStringList(settingNLKnownApps, _notificationKnownApps); + debugPrint("known apps: ${apps.join(",")}"); + + apps.add(packageName); + prefs.setStringList(settingNLKnownApps, apps); debugPrint("notify SettingsProvider->notificationAddKnownApp()"); notifyListeners(); } - void notificationAddIgnoredApp(String packageName) async { - if (packageName.isEmpty || _notificationIgnoredApps.contains(packageName)) { + void notificationAddApp(String packageName) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + final List apps = + prefs.getStringList(settingNLUsedApps) ?? []; + + if (packageName.isEmpty || apps.contains(packageName)) { return; } - _notificationIgnoredApps.add(packageName); - SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setStringList(settingNLIgnoredApps, _notificationIgnoredApps); + apps.add(packageName); + prefs.setStringList(settingNLUsedApps, apps); - debugPrint("notify SettingsProvider->notificationAddIgnoredApp()"); + debugPrint("notify SettingsProvider->notificationAddApp()"); notifyListeners(); } - void notificationRemoveIgnoredApp(String packageName) async { - if (packageName.isEmpty || - !_notificationIgnoredApps.contains(packageName)) { + void notificationRemoveApp(String packageName) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + final List apps = + prefs.getStringList(settingNLUsedApps) ?? []; + + if (packageName.isEmpty || !apps.contains(packageName)) { return; } - _notificationIgnoredApps.remove(packageName); - SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setStringList(settingNLIgnoredApps, _notificationIgnoredApps); + apps.remove(packageName); + prefs.setStringList(settingNLUsedApps, apps); - debugPrint("notify SettingsProvider->notificationRemoveIgnoredApp()"); + debugPrint("notify SettingsProvider->notificationRemoveApp()"); notifyListeners(); } + + Future> notificationKnownApps() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + return prefs.getStringList(settingNLKnownApps) ?? []; + } + + Future> notificationUsedApps() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + return prefs.getStringList(settingNLUsedApps) ?? []; + } } From e9837dc94378fcc36f35e2ec5f4b926f77a57147 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 19:12:54 +0000 Subject: [PATCH 07/33] l10n: Settings --- lib/l10n/app_de.arb | 8 +++---- lib/l10n/app_en.arb | 46 +++++++++++++++++++++++++++-------------- lib/pages/settings.dart | 44 +++++++++++++++++++-------------------- 3 files changed, 56 insertions(+), 42 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index c023711e..5365206a 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -72,13 +72,13 @@ "settingsDialogLanguageTitle": "Sprache auswählen", "settingsDialogThemeTitle": "Erscheinungsbild auswählen", "settingsLanguage": "Sprache", + "settingsNLServiceChecking": "Prüfe Status…", + "settingsNLServiceCheckingError": "Status konnte nicht überprüft werden: {error}", + "settingsNLServiceRunning": "Dienst läuft.", + "settingsNLServiceStopped": "Dienst gestoppt.", "settingsNotificationListener": "Benachrichtigungen auslesen?", "settingsPermissionGrant": "Klicke um die Berechtigung zu erteilen.", "settingsPermissionNotGranted": "Berechtigung nicht erteilt!", - "settingsServiceChecking": "Prüfe Status…", - "settingsServiceCheckingError": "Status konnte nicht überprüft werden: {error}", - "settingsServiceRunning": "Service läuft.", - "settingsServiceStopped": "Service gestoppt.", "settingsTheme": "Erscheinungsbild", "settingsThemeValue": "{theme, select, dark{Dunkel} light{Hell} other{Systemeinstellung}}", "transactionAttachments": "Anhänge", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 18703949..279989a8 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -72,6 +72,10 @@ "@formButtonLogout": { "description": "Button Label: Logout" }, + "formButtonRemove": "Remove", + "@formButtonRemove": { + "description": "Button Label: Remove" + }, "formButtonResetLogin": "Reset login", "@formButtonResetLogin": { "description": "Button Label: Reset login form (when error is shown)" @@ -395,24 +399,32 @@ "@settingsLanguage": { "description": "Currently selected language" }, - "settingsNotificationListener": "Notification Listener Service", - "@settingsNotificationListener": { - "description": "Setting for the notification listener service." + "settingsNLDescription": "This service allows you to fetch transaction details from incoming push notifications.", + "@settingsNLDescription": { + "description": "Description text for the notification listener service." }, - "settingsPermissionGrant": "Tap to grant permission.", - "@settingsPermissionGrant": { + "settingsNLPermissionGrant": "Tap to grant permission.", + "@settingsNLPermissionGrant": { "description": "Indicates user should tap the text to grant certain permissions (notification access)." }, - "settingsPermissionNotGranted": "Permission not granted.", - "@settingsPermissionNotGranted": { + "settingsNLPermissionNotGranted": "Permission not granted.", + "@settingsNLPermissionNotGranted": { "description": "A requested permission was not granted." }, - "settingsServiceChecking": "Checking status…", - "@settingsServiceChecking": { + "settingsNLPermissionRemove": "Remove permission?", + "@settingsNLPermissionRemove": { + "description": "Dialog title asking if permission should be removed." + }, + "settingsNLPermissionRemoveHelp": "To disable this service, click on the app and remove the permissions in the next screen.", + "@settingsNLPermissionRemoveHelp": { + "description": "Dialog text giving hint how to remove the permission." + }, + "settingsNLServiceChecking": "Checking status…", + "@settingsNLServiceChecking": { "description": "Checking the status of the background service" }, - "settingsServiceCheckingError": "Error checking status: {error}", - "@settingsServiceCheckingError": { + "settingsNLServiceCheckingError": "Error checking status: {error}", + "@settingsNLServiceCheckingError": { "description": "An error occured while checking the service status", "placeholders": { "error": { @@ -422,14 +434,18 @@ } } }, - "settingsServiceRunning": "Service is running.", - "@settingsServiceRunning": { + "settingsNLServiceRunning": "Service is running.", + "@settingsNLServiceRunning": { "description": "A background service is running normally." }, - "settingsServiceStopped": "Service is stopped.", - "@settingsServiceStopped": { + "settingsNLServiceStopped": "Service is stopped.", + "@settingsNLServiceStopped": { "description": "A background service is stopped." }, + "settingsNotificationListener": "Notification Listener Service", + "@settingsNotificationListener": { + "description": "Setting for the notification listener service." + }, "settingsTheme": "App Theme", "@settingsTheme": { "description": "App theme (dark or light)" diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index bc17f983..5b3a02d1 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -76,21 +76,20 @@ class SettingsPageState extends State late String subtitle; if (snapshot.connectionState == ConnectionState.done && snapshot.hasData) { - if (!snapshot.data!.servicePermission) { - subtitle = l10n.settingsPermissionNotGranted; - } else if (!snapshot.data!.notificationPermission) { - subtitle = l10n.settingsPermissionNotGranted; + if (!snapshot.data!.servicePermission || + !snapshot.data!.notificationPermission) { + subtitle = l10n.settingsNLPermissionNotGranted; } else if (!snapshot.data!.serviceRunning) { - subtitle = l10n.settingsServiceStopped; + subtitle = l10n.settingsNLServiceStopped; } else { - subtitle = l10n.settingsServiceRunning; + subtitle = l10n.settingsNLServiceRunning; } } else if (snapshot.hasError) { subtitle = S .of(context) - .settingsServiceCheckingError(snapshot.error.toString()); + .settingsNLServiceCheckingError(snapshot.error.toString()); } else { - subtitle = S.of(context).settingsServiceChecking; + subtitle = S.of(context).settingsNLServiceChecking; } return OpenContainer( openBuilder: (BuildContext context, Function closedContainer) => @@ -207,8 +206,7 @@ class _SettingsNotificationsState extends State { children: [ Padding( padding: const EdgeInsets.symmetric(horizontal: 12), - child: Text( - "This service allows you to fetch transaction details from incoming push notifications."), + child: Text(S.of(context).settingsNLDescription), ), const Divider(), FutureBuilder( @@ -223,7 +221,7 @@ class _SettingsNotificationsState extends State { if (snapshot.connectionState == ConnectionState.done && snapshot.hasData) { if (!snapshot.data!.servicePermission) { - subtitle = l10n.settingsPermissionGrant; + subtitle = l10n.settingsNLPermissionGrant; clickFn = () async { bool granted = await FlutterLocalNotificationsPlugin() .resolvePlatformSpecificImplementation< @@ -232,7 +230,7 @@ class _SettingsNotificationsState extends State { false; if (!granted) { msg.showSnackBar(SnackBar( - content: Text(l10n.settingsPermissionNotGranted), + content: Text(l10n.settingsNLPermissionNotGranted), behavior: SnackBarBehavior.floating, )); return; @@ -242,7 +240,7 @@ class _SettingsNotificationsState extends State { await nlInit(); }; } else if (!snapshot.data!.notificationPermission) { - subtitle = l10n.settingsPermissionGrant; + subtitle = l10n.settingsNLPermissionGrant; clickFn = () async { await FlutterLocalNotificationsPlugin() .resolvePlatformSpecificImplementation< @@ -250,18 +248,18 @@ class _SettingsNotificationsState extends State { .requestPermission(); }; } else if (!snapshot.data!.serviceRunning) { - subtitle = l10n.settingsServiceStopped; + subtitle = l10n.settingsNLServiceStopped; clickFn = () async { await NotificationServicePlugin.instance.startService(); }; } else { - subtitle = l10n.settingsServiceRunning; + subtitle = l10n.settingsNLServiceRunning; clickFn = () async { final bool? ok = await showDialog( context: context, builder: (BuildContext context) => AlertDialog( icon: const Icon(Icons.remove_done), - title: Text("Remove permission?"), + title: Text(S.of(context).settingsNLPermissionRemove), clipBehavior: Clip.hardEdge, actions: [ TextButton( @@ -271,14 +269,14 @@ class _SettingsNotificationsState extends State { }, ), FilledButton( - child: Text("Remove"), + child: Text(S.of(context).formButtonRemove), onPressed: () { Navigator.of(context).pop(true); }, ), ], - content: Text( - "To disable this service, click on the app and remove the permissions in the next screen."), + content: + Text(S.of(context).settingsNLPermissionRemoveHelp), ), ); if (!(ok ?? false)) { @@ -291,9 +289,9 @@ class _SettingsNotificationsState extends State { } else if (snapshot.hasError) { subtitle = S .of(context) - .settingsServiceCheckingError(snapshot.error.toString()); + .settingsNLServiceCheckingError(snapshot.error.toString()); } else { - subtitle = S.of(context).settingsServiceChecking; + subtitle = S.of(context).settingsNLServiceChecking; } return ListTile( title: const Text("Service Status"), @@ -354,9 +352,9 @@ class _SettingsNotificationsState extends State { } else if (snapshot.hasError) { return Text(S .of(context) - .settingsServiceCheckingError(snapshot.error.toString())); + .settingsNLServiceCheckingError(snapshot.error.toString())); } else { - return Text(S.of(context).settingsServiceChecking); + return Text(S.of(context).settingsNLServiceChecking); } }, ), From d1d351d450c5ac8211e91efaf3041d2427efb70a Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 19:53:55 +0000 Subject: [PATCH 08/33] Settings: Add App Dialog for Notification Listener --- lib/l10n/app_en.arb | 12 +++ lib/pages/settings.dart | 196 ++++++++++++++++++++++++++++------------ lib/settings.dart | 3 +- pubspec.lock | 8 ++ pubspec.yaml | 1 + 5 files changed, 161 insertions(+), 59 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 279989a8..93b5dadb 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -399,6 +399,14 @@ "@settingsLanguage": { "description": "Currently selected language" }, + "settingsNLAppAdd": "Add App", + "@settingsNLAppAdd": { + "description": "Button title to add a new app." + }, + "settingsNLAppAddHelp": "Click to add an app to listen to. Only eglible apps will show up in the list.", + "@settingsNLAppAddHelp": { + "description": "Help text below adding the new app button." + }, "settingsNLDescription": "This service allows you to fetch transaction details from incoming push notifications.", "@settingsNLDescription": { "description": "Description text for the notification listener service." @@ -438,6 +446,10 @@ "@settingsNLServiceRunning": { "description": "A background service is running normally." }, + "settingsNLServiceStatus": "Service Status", + "@settingsNLServiceStatus": { + "description": "Status of a background service." + }, "settingsNLServiceStopped": "Service is stopped.", "@settingsNLServiceStopped": { "description": "A background service is stopped." diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 5b3a02d1..d361ab0a 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -1,9 +1,11 @@ import 'package:animations/animations.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:installed_apps/app_info.dart'; import 'package:provider/provider.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:notifications_listener_service/notifications_listener_service.dart'; +import 'package:installed_apps/installed_apps.dart'; import 'package:waterflyiii/settings.dart'; import 'package:waterflyiii/notificationlistener.dart'; @@ -197,9 +199,11 @@ class _SettingsNotificationsState extends State { @override Widget build(BuildContext context) { + final SettingsProvider settings = Provider.of(context); + return Scaffold( appBar: AppBar( - title: const Text("Notification Service"), + title: Text(S.of(context).settingsNotificationListener), ), body: ListView( padding: const EdgeInsets.symmetric(horizontal: 24), @@ -294,79 +298,157 @@ class _SettingsNotificationsState extends State { subtitle = S.of(context).settingsNLServiceChecking; } return ListTile( - title: const Text("Service Status"), + title: Text(S.of(context).settingsNLServiceStatus), + leading: CircleAvatar( + child: (snapshot.data?.serviceRunning ?? false) + ? const Icon(Icons.check) + : const Icon(Icons.close), + ), subtitle: Text( subtitle, - maxLines: 2, + maxLines: 1, ), onTap: () async { await clickFn(); setState(() {}); }, - trailing: snapshot.data != null - ? Switch( - thumbIcon: MaterialStateProperty.resolveWith( - (Set states) { - if (states.contains(MaterialState.selected)) { - return const Icon(Icons.check); - } - return const Icon(Icons.close); - }, - ), - value: snapshot.data!.serviceRunning, - onChanged: snapshot.data!.servicePermission - ? (_) async { - await clickFn(); - setState(() {}); - } - : null, - ) - : null, ); }, ), - const Divider(), - FutureBuilder>( - future: - Provider.of(context).notificationKnownApps(), - builder: - (BuildContext context, AsyncSnapshot> snapshot) { - if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - ...snapshot.data!.map( - (String e) { - return Card( - clipBehavior: Clip.hardEdge, - child: Padding( - padding: const EdgeInsets.all(12), - child: Text(e), - ), - ); - }, - ), - ], - ); - } else if (snapshot.hasError) { - return Text(S - .of(context) - .settingsNLServiceCheckingError(snapshot.error.toString())); - } else { - return Text(S.of(context).settingsNLServiceChecking); - } - }, - ), - const Divider(), if (status != null && status!.serviceRunning && status!.notificationPermission) ...[ const Divider(), - const Text("yay"), + ListTile( + title: Text(S.of(context).settingsNLAppAdd), + leading: const CircleAvatar( + child: Icon(Icons.add), + ), + subtitle: Text( + S.of(context).settingsNLAppAddHelp, + maxLines: 2, + ), + isThreeLine: true, + onTap: () async { + String? app = await showDialog( + context: context, + builder: (BuildContext context) => const AppDialog(), + ); + debugPrint("app: $app"); + }, + ), + const Divider(), + FutureBuilder>( + future: settings.notificationUsedApps(), + builder: + (BuildContext context, AsyncSnapshot> snapshot) { + if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ...snapshot.data!.map( + (String e) { + return Card( + clipBehavior: Clip.hardEdge, + child: Padding( + padding: const EdgeInsets.all(12), + child: Text(e), + ), + ); + }, + ), + ], + ); + } else if (snapshot.hasError) { + return Text(S.of(context).settingsNLServiceCheckingError( + snapshot.error.toString())); + } else { + return Text(S.of(context).settingsNLServiceChecking); + } + }, + ), ], ], ), ); } } + +class AppDialog extends StatelessWidget { + const AppDialog({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return SimpleDialog( + title: Text(S.of(context).settingsNLAppAdd), + clipBehavior: Clip.hardEdge, + children: [ + FutureBuilder>( + future: + Provider.of(context).notificationKnownApps(), + builder: + (BuildContext context, AsyncSnapshot> snapshot) { + if (snapshot.hasData) { + List child = []; + for (String app in snapshot.data!) { + child.add(AppDialogEntry(app: app)); + child.add(const Divider()); + } + child.removeLast(); + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: child, + ); + } else if (snapshot.hasError) { + Navigator.pop(context); + return const CircularProgressIndicator(); + } else { + return const Center( + child: CircularProgressIndicator(), + ); + } + }, + ), + ], + ); + } +} + +class AppDialogEntry extends StatelessWidget { + const AppDialogEntry({ + super.key, + required this.app, + }); + + final String app; + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: InstalledApps.getAppInfo(app), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + return ListTile( + leading: CircleAvatar( + child: Image.memory(snapshot.data!.icon!), + ), + title: Text(snapshot.data!.name!), + subtitle: Text(app), + onTap: () { + Navigator.pop(context, app); + }, + ); + } else if (snapshot.hasError) { + debugPrint("error: ${snapshot.error}"); + return const SizedBox.shrink(); + } else { + return const CircularProgressIndicator(); + } + }, + ); + } +} diff --git a/lib/settings.dart b/lib/settings.dart index 7fb8b5ca..0af53d66 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -10,6 +10,7 @@ class SettingsProvider with ChangeNotifier { static const String settingLocale = "LOCALE"; static const String settingNLKnownApps = "NL_KNOWNAPPS"; static const String settingNLUsedApps = "NL_USEDAPPS"; + static const String settingNLAppPrefix = "NL_APP_"; ThemeMode _theme = ThemeMode.system; ThemeMode get getTheme => _theme; @@ -92,8 +93,6 @@ class SettingsProvider with ChangeNotifier { return; } - debugPrint("known apps: ${apps.join(",")}"); - apps.add(packageName); prefs.setStringList(settingNLKnownApps, apps); diff --git a/pubspec.lock b/pubspec.lock index d6fa7f6e..a271cd2a 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -501,6 +501,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.2.0" + installed_apps: + dependency: "direct main" + description: + name: installed_apps + sha256: "145af8eb6e4e7c830e9888d6de0573ae5c139e8e0742a3e67316e1db21ab6fe0" + url: "https://pub.dev" + source: hosted + version: "1.3.1" intl: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index a1882600..9702a5a5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,6 +33,7 @@ dependencies: flutter_local_notifications: ^13.0.0 notifications_listener_service: git: https://github.com/dreautall/notification_listener_service.git + installed_apps: ^1.3.1 dev_dependencies: From 2c1142109f4f69217a268d35e97633db0a02901b Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 19:59:24 +0000 Subject: [PATCH 09/33] TransactionDetail: read both currency before & aft Previously, a notification like "EUR 50,00 was booked..." would try to match the currency "was" instead of "EUR". now it should catch both variants. However, of course "EUR 50 USD was booked" is still wrong - let's hope that never happens ;) --- lib/pages/transaction_detail.dart | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/pages/transaction_detail.dart b/lib/pages/transaction_detail.dart index 0d0cf00b..12d6cdf5 100644 --- a/lib/pages/transaction_detail.dart +++ b/lib/pages/transaction_detail.dart @@ -299,15 +299,18 @@ class _TransactionPageState extends State return; } CurrencyRead? currency; - String currencyStr = match.namedGroup("postCurrency") ?? ""; + String currencyStr = match.namedGroup("preCurrency") ?? ""; + String currencyStrAlt = match.namedGroup("postCurrency") ?? ""; if (currencyStr.isEmpty) { - currencyStr = match.namedGroup("preCurrency") ?? ""; + currencyStr = currencyStrAlt; } if (currencyStr.isEmpty) { debugPrint("no currency found"); } if (_localCurrency!.attributes.code == currencyStr || - _localCurrency!.attributes.symbol == currencyStr) { + _localCurrency!.attributes.symbol == currencyStr || + _localCurrency!.attributes.code == currencyStrAlt || + _localCurrency!.attributes.symbol == currencyStrAlt) { currency = _localCurrency; } else { final Response response = @@ -318,7 +321,9 @@ class _TransactionPageState extends State } for (CurrencyRead cur in response.body!.data) { if (cur.attributes.code == currencyStr || - cur.attributes.symbol == currencyStr) { + cur.attributes.symbol == currencyStr || + cur.attributes.code == currencyStrAlt || + cur.attributes.symbol == currencyStrAlt) { currency = cur; break; } From aa2fe2543ad55111d1b81663465580ddcf170682 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 20:41:39 +0000 Subject: [PATCH 10/33] Settings: ability to add/delete apps to listen to --- lib/l10n/app_en.arb | 4 ++ lib/pages/settings.dart | 84 +++++++++++++++++++++++++++++++++-------- lib/settings.dart | 64 ++++++++++++++++++++++++++++--- 3 files changed, 131 insertions(+), 21 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 93b5dadb..d2a70ce9 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -403,6 +403,10 @@ "@settingsNLAppAdd": { "description": "Button title to add a new app." }, + "settingsNLAppAddEmpty": "No more possible apps available. Make some transactions where you receive phone notifications to add apps to this list. If the app still doesn't show up, please report it to app@vogt.pw.", + "@settingsNLAppAddEmpty": { + "description": "Help text when no more app is available to add." + }, "settingsNLAppAddHelp": "Click to add an app to listen to. Only eglible apps will show up in the list.", "@settingsNLAppAddHelp": { "description": "Help text below adding the new app button." diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index d361ab0a..d7751cf2 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -330,11 +330,19 @@ class _SettingsNotificationsState extends State { ), isThreeLine: true, onTap: () async { - String? app = await showDialog( + AppInfo? app = await showDialog( context: context, builder: (BuildContext context) => const AppDialog(), ); - debugPrint("app: $app"); + if (app == null || (app.packageName ?? "").isEmpty) { + return; + } + + setState(() { + settings.notificationAddUsedApp(app.packageName!); + settings.notificationSetAppSettings( + app.packageName!, NotificationAppSettings(app.name!)); + }); }, ), const Divider(), @@ -348,14 +356,8 @@ class _SettingsNotificationsState extends State { crossAxisAlignment: CrossAxisAlignment.stretch, children: [ ...snapshot.data!.map( - (String e) { - return Card( - clipBehavior: Clip.hardEdge, - child: Padding( - padding: const EdgeInsets.all(12), - child: Text(e), - ), - ); + (String app) { + return AppCard(app: app, update: setState); }, ), ], @@ -375,6 +377,49 @@ class _SettingsNotificationsState extends State { } } +class AppCard extends StatelessWidget { + const AppCard({ + super.key, + required this.app, + required this.update, + }); + + final String app; + final Function update; + + @override + Widget build(BuildContext context) { + return Card( + clipBehavior: Clip.hardEdge, + child: Padding( + padding: const EdgeInsets.all(12), + child: Row( + children: [ + Expanded( + child: Text(app), + ), + SizedBox( + width: 48, + child: Align( + alignment: Alignment.centerRight, + child: IconButton( + icon: const Icon(Icons.delete), + onPressed: () { + Provider.of(context, listen: false) + .notificationRemoveUsedApp(app); + update(() {}); + }, + tooltip: S.of(context).transactionSplitDelete, + ), + ), + ), + ], + ), + ), + ); + } +} + class AppDialog extends StatelessWidget { const AppDialog({ super.key, @@ -387,8 +432,8 @@ class AppDialog extends StatelessWidget { clipBehavior: Clip.hardEdge, children: [ FutureBuilder>( - future: - Provider.of(context).notificationKnownApps(), + future: Provider.of(context) + .notificationKnownApps(filterUsed: true), builder: (BuildContext context, AsyncSnapshot> snapshot) { if (snapshot.hasData) { @@ -397,7 +442,17 @@ class AppDialog extends StatelessWidget { child.add(AppDialogEntry(app: app)); child.add(const Divider()); } - child.removeLast(); + + if (child.isEmpty) { + child.add( + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Text(S.of(context).settingsNLAppAddEmpty), + ), + ); + } else { + child.removeLast(); + } return Column( crossAxisAlignment: CrossAxisAlignment.start, children: child, @@ -439,11 +494,10 @@ class AppDialogEntry extends StatelessWidget { title: Text(snapshot.data!.name!), subtitle: Text(app), onTap: () { - Navigator.pop(context, app); + Navigator.pop(context, snapshot.data); }, ); } else if (snapshot.hasError) { - debugPrint("error: ${snapshot.error}"); return const SizedBox.shrink(); } else { return const CircularProgressIndicator(); diff --git a/lib/settings.dart b/lib/settings.dart index 0af53d66..accec031 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -1,7 +1,32 @@ +import 'dart:convert'; + import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:shared_preferences/shared_preferences.dart'; +class NotificationAppSettings { + NotificationAppSettings( + this.appName, { + this.defaultAccountName, + this.defaultAccountId, + }); + + final String appName; + final String? defaultAccountName; + final String? defaultAccountId; + + NotificationAppSettings.fromJson(Map json) + : appName = json['appName'], + defaultAccountName = json['defaultAccountName'], + defaultAccountId = json['defaultAccountId']; + + Map toJson() => { + 'appName': appName, + 'defaultAccountName': defaultAccountName, + 'defaultAccountId': defaultAccountId, + }; +} + class SettingsProvider with ChangeNotifier { static const String settingTheme = "THEME"; static const String settingThemeDark = "DARK"; @@ -100,7 +125,21 @@ class SettingsProvider with ChangeNotifier { notifyListeners(); } - void notificationAddApp(String packageName) async { + Future> notificationKnownApps({bool filterUsed = false}) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + final List apps = + prefs.getStringList(settingNLKnownApps) ?? []; + if (filterUsed) { + final List knownApps = await notificationUsedApps(); + return apps + .where((String element) => !knownApps.contains(element)) + .toList(); + } + + return apps; + } + + void notificationAddUsedApp(String packageName) async { SharedPreferences prefs = await SharedPreferences.getInstance(); final List apps = prefs.getStringList(settingNLUsedApps) ?? []; @@ -116,7 +155,7 @@ class SettingsProvider with ChangeNotifier { notifyListeners(); } - void notificationRemoveApp(String packageName) async { + void notificationRemoveUsedApp(String packageName) async { SharedPreferences prefs = await SharedPreferences.getInstance(); final List apps = prefs.getStringList(settingNLUsedApps) ?? []; @@ -127,18 +166,31 @@ class SettingsProvider with ChangeNotifier { apps.remove(packageName); prefs.setStringList(settingNLUsedApps, apps); + prefs.setString("$settingNLAppPrefix$packageName", ""); debugPrint("notify SettingsProvider->notificationRemoveApp()"); notifyListeners(); } - Future> notificationKnownApps() async { + Future> notificationUsedApps() async { SharedPreferences prefs = await SharedPreferences.getInstance(); - return prefs.getStringList(settingNLKnownApps) ?? []; + return prefs.getStringList(settingNLUsedApps) ?? []; } - Future> notificationUsedApps() async { + Future notificationGetAppSettings( + String packageName, + ) async { SharedPreferences prefs = await SharedPreferences.getInstance(); - return prefs.getStringList(settingNLUsedApps) ?? []; + return NotificationAppSettings.fromJson( + jsonDecode(prefs.getString("$settingNLAppPrefix$packageName") ?? ""), + ); + } + + void notificationSetAppSettings( + String packageName, + NotificationAppSettings settings, + ) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + prefs.setString("$settingNLAppPrefix$packageName", jsonEncode(settings)); } } From 1ed6f4046cf3e12def3002cbdde441b8a97a8f56 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 21:20:59 +0000 Subject: [PATCH 11/33] Settings: Allow to select default account for notifications --- lib/l10n/app_en.arb | 10 ++- lib/pages/settings.dart | 133 ++++++++++++++++++++++++++++++++++++++-- lib/settings.dart | 6 +- 3 files changed, 139 insertions(+), 10 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index d2a70ce9..a936dde6 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -399,6 +399,14 @@ "@settingsLanguage": { "description": "Currently selected language" }, + "settingsNLAppAccount": "Default Account", + "@settingsNLAppAccount": { + "description": "Default account which will be used for the transaction." + }, + "settingsNLAppAccountDynamic": "", + "@settingsNLAppAccountDynamic": { + "description": "Account will be selected dynamically by the content of the notification." + }, "settingsNLAppAdd": "Add App", "@settingsNLAppAdd": { "description": "Button title to add a new app." @@ -411,7 +419,7 @@ "@settingsNLAppAddHelp": { "description": "Help text below adding the new app button." }, - "settingsNLDescription": "This service allows you to fetch transaction details from incoming push notifications.", + "settingsNLDescription": "This service allows you to fetch transaction details from incoming push notifications. Additionally, you can select a default account which the transaction should be assigned to - if no value is set, it tries to extract an account from the notification.", "@settingsNLDescription": { "description": "Description text for the notification listener service." }, diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index d7751cf2..1dada4c8 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -1,4 +1,5 @@ import 'package:animations/animations.dart'; +import 'package:chopper/chopper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:installed_apps/app_info.dart'; @@ -7,6 +8,8 @@ import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:notifications_listener_service/notifications_listener_service.dart'; import 'package:installed_apps/installed_apps.dart'; +import 'package:waterflyiii/auth.dart'; +import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; import 'package:waterflyiii/settings.dart'; import 'package:waterflyiii/notificationlistener.dart'; @@ -27,6 +30,7 @@ class SettingsPageState extends State return ListView( padding: const EdgeInsets.symmetric(horizontal: 24), + primary: false, children: [ ListTile( title: Text(S.of(context).settingsLanguage), @@ -207,6 +211,7 @@ class _SettingsNotificationsState extends State { ), body: ListView( padding: const EdgeInsets.symmetric(horizontal: 24), + primary: false, children: [ Padding( padding: const EdgeInsets.symmetric(horizontal: 12), @@ -377,7 +382,7 @@ class _SettingsNotificationsState extends State { } } -class AppCard extends StatelessWidget { +class AppCard extends StatefulWidget { const AppCard({ super.key, required this.app, @@ -387,6 +392,38 @@ class AppCard extends StatelessWidget { final String app; final Function update; + @override + State createState() => _AppCardState(); +} + +class _AppCardState extends State { + final TextEditingController accountTextController = TextEditingController(); + final FocusNode accountFocusNode = FocusNode(); + + String? appAccountId; + + Future _getData(BuildContext context) async { + final FireflyIii api = context.read().api; + + // Accounts + final Response respAccounts = + await api.v1AccountsGet(type: AccountTypeFilter.assetAccount); + if (!respAccounts.isSuccessful || respAccounts.body == null) { + if (context.mounted) { + throw Exception( + S + .of(context) + .errorAPIInvalidResponse(respAccounts.error?.toString() ?? ""), + ); + } else { + throw Exception( + "[nocontext] Invalid API response: ${respAccounts.error}", + ); + } + } + return respAccounts.body!; + } + @override Widget build(BuildContext context) { return Card( @@ -396,7 +433,95 @@ class AppCard extends StatelessWidget { child: Row( children: [ Expanded( - child: Text(app), + child: FutureBuilder( + future: Provider.of(context, listen: false) + .notificationGetAppSettings(widget.app), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + snapshot.data!.appName, + style: Theme.of(context).textTheme.titleMedium, + ), + const SizedBox(height: 16), + FutureBuilder( + future: _getData(context), + builder: (BuildContext context, + AsyncSnapshot accSnapshot) { + if (accSnapshot.connectionState == + ConnectionState.done && + accSnapshot.hasData) { + List> + accountOptions = + >[ + DropdownMenuEntry( + value: AccountRead( + id: "0", + type: "dummy", + attributes: Account( + name: S + .of(context) + .settingsNLAppAccountDynamic, + type: ShortAccountTypeProperty + .swaggerGeneratedUnknown, + ), + ), + label: + S.of(context).settingsNLAppAccountDynamic, + ) + ]; + AccountRead? currentAccount = + accountOptions.first.value; + for (AccountRead e in accSnapshot.data!.data) { + accountOptions + .add(DropdownMenuEntry( + value: e, + label: e.attributes.name, + )); + if (snapshot.data!.defaultAccountId == e.id) { + currentAccount = e; + } + } + + return DropdownMenu( + initialSelection: currentAccount, + leadingIcon: const Icon(Icons.account_balance), + label: Text(S.of(context).settingsNLAppAccount), + dropdownMenuEntries: accountOptions, + onSelected: (AccountRead? account) async { + final NotificationAppSettings settings = + snapshot.data!; + if ((account?.id ?? "0") == "0") { + settings.defaultAccountId = null; + } else { + settings.defaultAccountId = account!.id; + } + Provider.of(context, + listen: false) + .notificationSetAppSettings( + widget.app, settings); + }, + ); + } else if (accSnapshot.hasError) { + return const SizedBox.shrink(); + } else { + return const CircularProgressIndicator(); + } + }, + ), + ], + ); + } else if (snapshot.hasError) { + return const SizedBox.shrink(); + } else { + return const CircularProgressIndicator(); + } + }, + ), ), SizedBox( width: 48, @@ -406,8 +531,8 @@ class AppCard extends StatelessWidget { icon: const Icon(Icons.delete), onPressed: () { Provider.of(context, listen: false) - .notificationRemoveUsedApp(app); - update(() {}); + .notificationRemoveUsedApp(widget.app); + widget.update(() {}); }, tooltip: S.of(context).transactionSplitDelete, ), diff --git a/lib/settings.dart b/lib/settings.dart index accec031..4e8632c2 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -7,22 +7,18 @@ import 'package:shared_preferences/shared_preferences.dart'; class NotificationAppSettings { NotificationAppSettings( this.appName, { - this.defaultAccountName, this.defaultAccountId, }); final String appName; - final String? defaultAccountName; - final String? defaultAccountId; + String? defaultAccountId; NotificationAppSettings.fromJson(Map json) : appName = json['appName'], - defaultAccountName = json['defaultAccountName'], defaultAccountId = json['defaultAccountId']; Map toJson() => { 'appName': appName, - 'defaultAccountName': defaultAccountName, 'defaultAccountId': defaultAccountId, }; } From ca07758da61211a416b00f9bd74d9f9f6b89d568 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 21:26:06 +0000 Subject: [PATCH 12/33] TransactionDetail: respect default app id --- lib/pages/transaction_detail.dart | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/pages/transaction_detail.dart b/lib/pages/transaction_detail.dart index 12d6cdf5..c82917f9 100644 --- a/lib/pages/transaction_detail.dart +++ b/lib/pages/transaction_detail.dart @@ -14,6 +14,7 @@ import 'package:waterflyiii/auth.dart'; import 'package:waterflyiii/extensions.dart'; import 'package:waterflyiii/notificationlistener.dart'; import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; +import 'package:waterflyiii/settings.dart'; import 'package:waterflyiii/widgets/autocompletetext.dart'; import 'package:waterflyiii/widgets/input_number.dart'; import 'package:waterflyiii/widgets/materialiconbutton.dart'; @@ -289,6 +290,7 @@ class _TransactionPageState extends State if (widget.notification != null) { final FireflyIii api = context.read().api; + final SettingsProvider settings = context.read(); debugPrint("Got notification ${widget.notification}"); @@ -371,14 +373,19 @@ class _TransactionPageState extends State } _noteTextControllers[0].text = widget.notification!.body; + // Check account final Response response = await api.v1AccountsGet(type: AccountTypeFilter.assetAccount); if (!response.isSuccessful || response.body == null) { debugPrint("api account fetch failed"); return; } + final NotificationAppSettings appSettings = await settings + .notificationGetAppSettings(widget.notification!.appName); + final String settingAppId = appSettings.defaultAccountId ?? "0"; for (AccountRead acc in response.body!.data) { - if (widget.notification!.body.contains(acc.attributes.name)) { + if (acc.id == settingAppId || + widget.notification!.body.contains(acc.attributes.name)) { _ownAccountTextController.text = acc.attributes.name; _ownAccountId = acc.id; break; From bbac519114db087fff377f657ed59f5a07b3a40b Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 21:29:21 +0000 Subject: [PATCH 13/33] settings: refactor provider.of to context.read --- lib/pages/settings.dart | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 1dada4c8..d364dc3f 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -26,7 +26,7 @@ class SettingsPageState extends State Widget build(BuildContext context) { debugPrint("settings build()"); - final SettingsProvider settings = Provider.of(context); + final SettingsProvider settings = context.read(); return ListView( padding: const EdgeInsets.symmetric(horizontal: 24), @@ -156,7 +156,7 @@ class ThemeDialog extends StatelessWidget { @override Widget build(BuildContext context) { - final SettingsProvider settings = Provider.of(context); + final SettingsProvider settings = context.read(); return SimpleDialog( title: Text(S.of(context).settingsDialogThemeTitle), children: [ @@ -203,7 +203,7 @@ class _SettingsNotificationsState extends State { @override Widget build(BuildContext context) { - final SettingsProvider settings = Provider.of(context); + final SettingsProvider settings = context.read(); return Scaffold( appBar: AppBar( @@ -434,7 +434,8 @@ class _AppCardState extends State { children: [ Expanded( child: FutureBuilder( - future: Provider.of(context, listen: false) + future: context + .read() .notificationGetAppSettings(widget.app), builder: (BuildContext context, AsyncSnapshot snapshot) { @@ -500,8 +501,8 @@ class _AppCardState extends State { } else { settings.defaultAccountId = account!.id; } - Provider.of(context, - listen: false) + context + .read() .notificationSetAppSettings( widget.app, settings); }, @@ -530,7 +531,8 @@ class _AppCardState extends State { child: IconButton( icon: const Icon(Icons.delete), onPressed: () { - Provider.of(context, listen: false) + context + .read() .notificationRemoveUsedApp(widget.app); widget.update(() {}); }, @@ -557,7 +559,8 @@ class AppDialog extends StatelessWidget { clipBehavior: Clip.hardEdge, children: [ FutureBuilder>( - future: Provider.of(context) + future: context + .read() .notificationKnownApps(filterUsed: true), builder: (BuildContext context, AsyncSnapshot> snapshot) { From 9a17b8de36b8ff305d1f008d39d0cd38513f3aa4 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 22:18:49 +0000 Subject: [PATCH 14/33] Settings: use different dependency to not need QUERY_ALL_PACKAGES Google disallows QUERY_ALL_PACKAGES permission. The old library installed_apps was requesting this permission automatically, unfortunately. Now switched to device_apps which doesn't do this, and included a list of well-known banking apps to the section to read their information. Unfortunately, device_apps is unable to submit the app icon. In the future, a fork of installed_apps might be better suited. --- android/app/src/main/AndroidManifest.xml | 214 ++++++++++++++++++++--- lib/pages/settings.dart | 38 ++-- pubspec.lock | 16 +- pubspec.yaml | 2 +- 4 files changed, 220 insertions(+), 50 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index b61fec77..02b2a4e1 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -1,26 +1,11 @@ - - - + + + - + @@ -28,9 +13,7 @@ - + @@ -49,5 +32,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index d364dc3f..67b0a7bf 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -1,12 +1,12 @@ import 'package:animations/animations.dart'; -import 'package:chopper/chopper.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:installed_apps/app_info.dart'; import 'package:provider/provider.dart'; +import 'package:chopper/chopper.dart'; + +import 'package:device_apps/device_apps.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:notifications_listener_service/notifications_listener_service.dart'; -import 'package:installed_apps/installed_apps.dart'; import 'package:waterflyiii/auth.dart'; import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; @@ -335,18 +335,18 @@ class _SettingsNotificationsState extends State { ), isThreeLine: true, onTap: () async { - AppInfo? app = await showDialog( + Application? app = await showDialog( context: context, builder: (BuildContext context) => const AppDialog(), ); - if (app == null || (app.packageName ?? "").isEmpty) { + if (app == null || app.packageName.isEmpty) { return; } setState(() { - settings.notificationAddUsedApp(app.packageName!); + settings.notificationAddUsedApp(app.packageName); settings.notificationSetAppSettings( - app.packageName!, NotificationAppSettings(app.name!)); + app.packageName, NotificationAppSettings(app.appName)); }); }, ), @@ -568,7 +568,6 @@ class AppDialog extends StatelessWidget { List child = []; for (String app in snapshot.data!) { child.add(AppDialogEntry(app: app)); - child.add(const Divider()); } if (child.isEmpty) { @@ -578,8 +577,6 @@ class AppDialog extends StatelessWidget { child: Text(S.of(context).settingsNLAppAddEmpty), ), ); - } else { - child.removeLast(); } return Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -587,7 +584,7 @@ class AppDialog extends StatelessWidget { ); } else if (snapshot.hasError) { Navigator.pop(context); - return const CircularProgressIndicator(); + return const SizedBox.shrink(); } else { return const Center( child: CircularProgressIndicator(), @@ -610,16 +607,19 @@ class AppDialogEntry extends StatelessWidget { @override Widget build(BuildContext context) { - return FutureBuilder( - future: InstalledApps.getAppInfo(app), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { + return FutureBuilder( + future: DeviceApps.getApp(app), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + if (snapshot.data == null) { + return const SizedBox.shrink(); + } return ListTile( - leading: CircleAvatar( - child: Image.memory(snapshot.data!.icon!), + // :TODO: check for a library that can fetch the app icon + leading: const CircleAvatar( + child: Icon(Icons.api), ), - title: Text(snapshot.data!.name!), + title: Text(snapshot.data!.appName), subtitle: Text(app), onTap: () { Navigator.pop(context, snapshot.data); diff --git a/pubspec.lock b/pubspec.lock index a271cd2a..2deb2797 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -249,6 +249,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.8" + device_apps: + dependency: "direct main" + description: + name: device_apps + sha256: e84dc74d55749993fd671148cc0bd53096e1be0c268fc364285511b1d8a4c19b + url: "https://pub.dev" + source: hosted + version: "2.2.0" equatable: dependency: transitive description: @@ -501,14 +509,6 @@ packages: url: "https://pub.dev" source: hosted version: "3.2.0" - installed_apps: - dependency: "direct main" - description: - name: installed_apps - sha256: "145af8eb6e4e7c830e9888d6de0573ae5c139e8e0742a3e67316e1db21ab6fe0" - url: "https://pub.dev" - source: hosted - version: "1.3.1" intl: dependency: "direct main" description: diff --git a/pubspec.yaml b/pubspec.yaml index 9702a5a5..d13b7485 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,7 +33,7 @@ dependencies: flutter_local_notifications: ^13.0.0 notifications_listener_service: git: https://github.com/dreautall/notification_listener_service.git - installed_apps: ^1.3.1 + device_apps: ^2.2.0 dev_dependencies: From fdee58a93cd2c50ad091571d599296eb5cb6024f Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Fri, 14 Apr 2023 22:35:12 +0000 Subject: [PATCH 15/33] bump version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index d13b7485..cf685a2e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: waterflyiii description: WaterFly III, a mobile client for Firefly III publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.0.9-alpha +version: 0.0.10-alpha environment: sdk: '>=2.19.0 <3.0.0' From 0c4e3b941879aa8af39dad3b2cd40e293194053d Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:14:22 +0000 Subject: [PATCH 16/33] Auth: Delete shared preference on signOut --- lib/auth.dart | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/auth.dart b/lib/auth.dart index c52033df..dbf48500 100644 --- a/lib/auth.dart +++ b/lib/auth.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:chopper/chopper.dart' show Request, Response, StripStringExtension; +import 'package:shared_preferences/shared_preferences.dart'; import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; @@ -177,6 +178,8 @@ class FireflyService with ChangeNotifier { _signedIn = false; _storageSignInException = null; await storage.deleteAll(); + SharedPreferences prefs = await SharedPreferences.getInstance(); + await prefs.clear(); debugPrint("notify FireflyService->signOut"); notifyListeners(); From fd2edeccce3e2525434763c8bb33b56ab2c96e92 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:18:05 +0000 Subject: [PATCH 17/33] settings: proper await and reload for async processes Because the notification listener runs in an isolate, it wasn't getting up to date information from SharedPreferences. This should now be fixed. --- lib/settings.dart | 62 +++++++++++++++++++++++------------------------ 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/lib/settings.dart b/lib/settings.dart index 4e8632c2..a251f8db 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -73,52 +73,49 @@ class SettingsProvider with ChangeNotifier { notifyListeners(); } - void setTheme(ThemeMode theme) async { + Future setTheme(ThemeMode theme) async { _theme = theme; SharedPreferences prefs = await SharedPreferences.getInstance(); switch (theme) { case ThemeMode.dark: - prefs.setString(settingTheme, settingThemeDark); + await prefs.setString(settingTheme, settingThemeDark); break; case ThemeMode.light: - prefs.setString(settingTheme, settingThemeLight); + await prefs.setString(settingTheme, settingThemeLight); break; case ThemeMode.system: default: - prefs.setString(settingTheme, settingThemeSystem); + await prefs.setString(settingTheme, settingThemeSystem); } debugPrint("notify SettingsProvider->setTheme()"); notifyListeners(); } - void setLocale(Locale locale) async { + Future setLocale(Locale locale) async { if (!S.supportedLocales.contains(locale)) { return; } SharedPreferences prefs = await SharedPreferences.getInstance(); _locale = locale; - prefs.setString(settingLocale, locale.languageCode); + await prefs.setString(settingLocale, locale.languageCode); debugPrint("notify SettingsProvider->setLocale()"); notifyListeners(); } - void notificationAddKnownApp(String packageName) async { + Future notificationAddKnownApp(String packageName) async { SharedPreferences prefs = await SharedPreferences.getInstance(); final List apps = prefs.getStringList(settingNLKnownApps) ?? []; if (packageName.isEmpty || apps.contains(packageName)) { - return; + return false; } apps.add(packageName); - prefs.setStringList(settingNLKnownApps, apps); - - debugPrint("notify SettingsProvider->notificationAddKnownApp()"); - notifyListeners(); + return prefs.setStringList(settingNLKnownApps, apps); } Future> notificationKnownApps({bool filterUsed = false}) async { @@ -135,41 +132,39 @@ class SettingsProvider with ChangeNotifier { return apps; } - void notificationAddUsedApp(String packageName) async { + Future notificationAddUsedApp(String packageName) async { SharedPreferences prefs = await SharedPreferences.getInstance(); + await prefs.reload(); final List apps = prefs.getStringList(settingNLUsedApps) ?? []; if (packageName.isEmpty || apps.contains(packageName)) { - return; + return false; } apps.add(packageName); - prefs.setStringList(settingNLUsedApps, apps); - - debugPrint("notify SettingsProvider->notificationAddApp()"); - notifyListeners(); + return prefs.setStringList(settingNLUsedApps, apps); } - void notificationRemoveUsedApp(String packageName) async { + Future notificationRemoveUsedApp(String packageName) async { SharedPreferences prefs = await SharedPreferences.getInstance(); final List apps = prefs.getStringList(settingNLUsedApps) ?? []; if (packageName.isEmpty || !apps.contains(packageName)) { - return; + return false; } apps.remove(packageName); - prefs.setStringList(settingNLUsedApps, apps); - prefs.setString("$settingNLAppPrefix$packageName", ""); - - debugPrint("notify SettingsProvider->notificationRemoveApp()"); - notifyListeners(); + await prefs.remove("$settingNLAppPrefix$packageName"); + return prefs.setStringList(settingNLUsedApps, apps); } - Future> notificationUsedApps() async { + Future> notificationUsedApps({bool forceReload = false}) async { SharedPreferences prefs = await SharedPreferences.getInstance(); + if (forceReload) { + await prefs.reload(); + } return prefs.getStringList(settingNLUsedApps) ?? []; } @@ -177,16 +172,21 @@ class SettingsProvider with ChangeNotifier { String packageName, ) async { SharedPreferences prefs = await SharedPreferences.getInstance(); - return NotificationAppSettings.fromJson( - jsonDecode(prefs.getString("$settingNLAppPrefix$packageName") ?? ""), - ); + final String json = + prefs.getString("$settingNLAppPrefix$packageName") ?? ""; + try { + return NotificationAppSettings.fromJson(jsonDecode(json)); + } on FormatException catch (_) { + return NotificationAppSettings(packageName); + } } - void notificationSetAppSettings( + Future notificationSetAppSettings( String packageName, NotificationAppSettings settings, ) async { SharedPreferences prefs = await SharedPreferences.getInstance(); - prefs.setString("$settingNLAppPrefix$packageName", jsonEncode(settings)); + await prefs.setString( + "$settingNLAppPrefix$packageName", jsonEncode(settings)); } } From fc8343a36e7c70fc540df88672dcdce585a9cd11 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:18:23 +0000 Subject: [PATCH 18/33] NotificationListener: properly ignore unknown apps --- lib/notificationlistener.dart | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/notificationlistener.dart b/lib/notificationlistener.dart index 08056a37..9c2d5869 100644 --- a/lib/notificationlistener.dart +++ b/lib/notificationlistener.dart @@ -85,9 +85,10 @@ void nlCallback() async { SettingsProvider().notificationAddKnownApp(evt?.packageName ?? ""); - if (!(await SettingsProvider().notificationUsedApps()) + if (!(await SettingsProvider().notificationUsedApps(forceReload: true)) .contains(evt?.packageName ?? "")) { debugPrint("nlCallback(): app not used"); + return; } FlutterLocalNotificationsPlugin().show( From 6efb612bb1198062cd9a89fff9454fab3826f4ee Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:19:34 +0000 Subject: [PATCH 19/33] Settings: always show info text when adding NL app --- lib/l10n/app_en.arb | 8 ++++---- lib/pages/settings.dart | 26 ++++++++++++-------------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index a936dde6..c589a95a 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -411,14 +411,14 @@ "@settingsNLAppAdd": { "description": "Button title to add a new app." }, - "settingsNLAppAddEmpty": "No more possible apps available. Make some transactions where you receive phone notifications to add apps to this list. If the app still doesn't show up, please report it to app@vogt.pw.", - "@settingsNLAppAddEmpty": { - "description": "Help text when no more app is available to add." - }, "settingsNLAppAddHelp": "Click to add an app to listen to. Only eglible apps will show up in the list.", "@settingsNLAppAddHelp": { "description": "Help text below adding the new app button." }, + "settingsNLAppAddInfo": "Make some transactions where you receive phone notifications to add apps to this list. If the app still doesn't show up, please report it to app@vogt.pw.", + "@settingsNLAppAddInfo": { + "description": "Help text when no more app is available to add." + }, "settingsNLDescription": "This service allows you to fetch transaction details from incoming push notifications. Additionally, you can select a default account which the transaction should be assigned to - if no value is set, it tries to extract an account from the notification.", "@settingsNLDescription": { "description": "Description text for the notification listener service." diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 67b0a7bf..6a53ea2b 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -343,11 +343,12 @@ class _SettingsNotificationsState extends State { return; } - setState(() { - settings.notificationAddUsedApp(app.packageName); - settings.notificationSetAppSettings( - app.packageName, NotificationAppSettings(app.appName)); - }); + await settings.notificationAddUsedApp(app.packageName); + await settings.notificationSetAppSettings( + app.packageName, + NotificationAppSettings(app.appName), + ); + setState(() {}); }, ), const Divider(), @@ -566,18 +567,15 @@ class AppDialog extends StatelessWidget { (BuildContext context, AsyncSnapshot> snapshot) { if (snapshot.hasData) { List child = []; + child.add( + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Text(S.of(context).settingsNLAppAddInfo), + ), + ); for (String app in snapshot.data!) { child.add(AppDialogEntry(app: app)); } - - if (child.isEmpty) { - child.add( - Padding( - padding: const EdgeInsets.symmetric(horizontal: 24), - child: Text(S.of(context).settingsNLAppAddEmpty), - ), - ); - } return Column( crossAxisAlignment: CrossAxisAlignment.start, children: child, From 5db86597905672e46de9cb62cd24dc365612853d Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:54:31 +0000 Subject: [PATCH 20/33] Settings: less futures, more context watching --- lib/pages/settings.dart | 205 +++++++++++++++++++--------------------- lib/settings.dart | 31 +++++- 2 files changed, 127 insertions(+), 109 deletions(-) diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 6a53ea2b..2c6e8986 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -203,8 +203,6 @@ class _SettingsNotificationsState extends State { @override Widget build(BuildContext context) { - final SettingsProvider settings = context.read(); - return Scaffold( appBar: AppBar( title: Text(S.of(context).settingsNotificationListener), @@ -335,6 +333,8 @@ class _SettingsNotificationsState extends State { ), isThreeLine: true, onTap: () async { + final SettingsProvider settings = + context.read(); Application? app = await showDialog( context: context, builder: (BuildContext context) => const AppDialog(), @@ -352,30 +352,7 @@ class _SettingsNotificationsState extends State { }, ), const Divider(), - FutureBuilder>( - future: settings.notificationUsedApps(), - builder: - (BuildContext context, AsyncSnapshot> snapshot) { - if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - ...snapshot.data!.map( - (String app) { - return AppCard(app: app, update: setState); - }, - ), - ], - ); - } else if (snapshot.hasError) { - return Text(S.of(context).settingsNLServiceCheckingError( - snapshot.error.toString())); - } else { - return Text(S.of(context).settingsNLServiceChecking); - } - }, - ), + const NotificationApps(), ], ], ), @@ -383,27 +360,12 @@ class _SettingsNotificationsState extends State { } } -class AppCard extends StatefulWidget { - const AppCard({ +class NotificationApps extends StatelessWidget { + const NotificationApps({ super.key, - required this.app, - required this.update, }); - final String app; - final Function update; - - @override - State createState() => _AppCardState(); -} - -class _AppCardState extends State { - final TextEditingController accountTextController = TextEditingController(); - final FocusNode accountFocusNode = FocusNode(); - - String? appAccountId; - - Future _getData(BuildContext context) async { + Future _getAccounts(BuildContext context) async { final FireflyIii api = context.read().api; // Accounts @@ -425,6 +387,58 @@ class _AppCardState extends State { return respAccounts.body!; } + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _getAccounts(context), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ...context.watch().notificationApps.map( + (String app) { + return AppCard( + app: app, + accounts: snapshot.data!, + ); + }, + ), + ], + ); + } else if (snapshot.hasError) { + return Text(S + .of(context) + .settingsNLServiceCheckingError(snapshot.error.toString())); + } else { + return const Center(child: CircularProgressIndicator()); + } + }, + ); + } +} + +class AppCard extends StatefulWidget { + const AppCard({ + super.key, + required this.app, + required this.accounts, + }); + + final String app; + final AccountArray accounts; + + @override + State createState() => _AppCardState(); +} + +class _AppCardState extends State { + final TextEditingController accountTextController = TextEditingController(); + final FocusNode accountFocusNode = FocusNode(); + + String? appAccountId; + @override Widget build(BuildContext context) { return Card( @@ -442,6 +456,31 @@ class _AppCardState extends State { AsyncSnapshot snapshot) { if (snapshot.connectionState == ConnectionState.done && snapshot.hasData) { + List> accountOptions = + >[ + DropdownMenuEntry( + value: AccountRead( + id: "0", + type: "dummy", + attributes: Account( + name: S.of(context).settingsNLAppAccountDynamic, + type: ShortAccountTypeProperty + .swaggerGeneratedUnknown, + ), + ), + label: S.of(context).settingsNLAppAccountDynamic, + ) + ]; + AccountRead? currentAccount = accountOptions.first.value; + for (AccountRead e in widget.accounts.data) { + accountOptions.add(DropdownMenuEntry( + value: e, + label: e.attributes.name, + )); + if (snapshot.data!.defaultAccountId == e.id) { + currentAccount = e; + } + } return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -450,69 +489,24 @@ class _AppCardState extends State { style: Theme.of(context).textTheme.titleMedium, ), const SizedBox(height: 16), - FutureBuilder( - future: _getData(context), - builder: (BuildContext context, - AsyncSnapshot accSnapshot) { - if (accSnapshot.connectionState == - ConnectionState.done && - accSnapshot.hasData) { - List> - accountOptions = - >[ - DropdownMenuEntry( - value: AccountRead( - id: "0", - type: "dummy", - attributes: Account( - name: S - .of(context) - .settingsNLAppAccountDynamic, - type: ShortAccountTypeProperty - .swaggerGeneratedUnknown, - ), - ), - label: - S.of(context).settingsNLAppAccountDynamic, - ) - ]; - AccountRead? currentAccount = - accountOptions.first.value; - for (AccountRead e in accSnapshot.data!.data) { - accountOptions - .add(DropdownMenuEntry( - value: e, - label: e.attributes.name, - )); - if (snapshot.data!.defaultAccountId == e.id) { - currentAccount = e; - } - } - - return DropdownMenu( - initialSelection: currentAccount, - leadingIcon: const Icon(Icons.account_balance), - label: Text(S.of(context).settingsNLAppAccount), - dropdownMenuEntries: accountOptions, - onSelected: (AccountRead? account) async { - final NotificationAppSettings settings = - snapshot.data!; - if ((account?.id ?? "0") == "0") { - settings.defaultAccountId = null; - } else { - settings.defaultAccountId = account!.id; - } - context - .read() - .notificationSetAppSettings( - widget.app, settings); - }, - ); - } else if (accSnapshot.hasError) { - return const SizedBox.shrink(); + DropdownMenu( + initialSelection: currentAccount, + leadingIcon: const Icon(Icons.account_balance), + label: Text(S.of(context).settingsNLAppAccount), + dropdownMenuEntries: accountOptions, + onSelected: (AccountRead? account) async { + FocusManager.instance.primaryFocus?.unfocus(); + final NotificationAppSettings settings = + snapshot.data!; + if ((account?.id ?? "0") == "0") { + settings.defaultAccountId = null; } else { - return const CircularProgressIndicator(); + settings.defaultAccountId = account!.id; } + await context + .read() + .notificationSetAppSettings( + widget.app, settings); }, ), ], @@ -535,7 +529,6 @@ class _AppCardState extends State { context .read() .notificationRemoveUsedApp(widget.app); - widget.update(() {}); }, tooltip: S.of(context).transactionSplitDelete, ), diff --git a/lib/settings.dart b/lib/settings.dart index a251f8db..6fd34f2f 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -42,6 +42,9 @@ class SettingsProvider with ChangeNotifier { bool _loaded = false; bool get loaded => _loaded; + List _notificationApps = []; + List get notificationApps => _notificationApps; + Future loadSettings() async { SharedPreferences prefs = await SharedPreferences.getInstance(); debugPrint("reading prefs!"); @@ -68,6 +71,8 @@ class SettingsProvider with ChangeNotifier { _locale = locale; } + _notificationApps = prefs.getStringList(settingNLUsedApps) ?? []; + _loaded = true; debugPrint("notify SettingsProvider->loadSettings()"); notifyListeners(); @@ -143,7 +148,13 @@ class SettingsProvider with ChangeNotifier { } apps.add(packageName); - return prefs.setStringList(settingNLUsedApps, apps); + await prefs.setStringList(settingNLUsedApps, apps); + + _notificationApps = apps; + + debugPrint("notify SettingsProvider->notificationAddUsedApp()"); + notifyListeners(); + return true; } Future notificationRemoveUsedApp(String packageName) async { @@ -157,7 +168,14 @@ class SettingsProvider with ChangeNotifier { apps.remove(packageName); await prefs.remove("$settingNLAppPrefix$packageName"); - return prefs.setStringList(settingNLUsedApps, apps); + await prefs.setStringList(settingNLUsedApps, apps); + + _notificationApps = apps; + + debugPrint("notify SettingsProvider->notificationRemoveUsedApp()"); + + notifyListeners(); + return true; } Future> notificationUsedApps({bool forceReload = false}) async { @@ -165,7 +183,14 @@ class SettingsProvider with ChangeNotifier { if (forceReload) { await prefs.reload(); } - return prefs.getStringList(settingNLUsedApps) ?? []; + final List apps = + prefs.getStringList(settingNLUsedApps) ?? []; + _notificationApps = apps; + + debugPrint("notify SettingsProvider->notificationUsedApps()"); + notifyListeners(); + + return _notificationApps; } Future notificationGetAppSettings( From c1cd4b16d05092c827d0fd1ecb74e67ccfd8d723 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 16 Apr 2023 13:54:59 +0000 Subject: [PATCH 21/33] bump version --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index cf685a2e..b135c4d8 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: waterflyiii description: WaterFly III, a mobile client for Firefly III publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.0.10-alpha +version: 0.0.11-alpha environment: sdk: '>=2.19.0 <3.0.0' From 43e988af1b654776dd54fe7ae1528c95b4e267e9 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 16 Apr 2023 15:45:25 +0000 Subject: [PATCH 22/33] refactor: separate file for notification settings --- lib/pages/settings.dart | 455 +------------------------ lib/pages/settings_notifications.dart | 461 ++++++++++++++++++++++++++ 2 files changed, 462 insertions(+), 454 deletions(-) create mode 100644 lib/pages/settings_notifications.dart diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 2c6e8986..1191b98c 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -2,14 +2,8 @@ import 'package:animations/animations.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; -import 'package:chopper/chopper.dart'; +import 'package:waterflyiii/pages/settings_notifications.dart'; -import 'package:device_apps/device_apps.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:notifications_listener_service/notifications_listener_service.dart'; - -import 'package:waterflyiii/auth.dart'; -import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; import 'package:waterflyiii/settings.dart'; import 'package:waterflyiii/notificationlistener.dart'; @@ -178,450 +172,3 @@ class ThemeDialog extends StatelessWidget { ); } } - -class SettingsNotifications extends StatefulWidget { - const SettingsNotifications({ - super.key, - }); - - @override - State createState() => _SettingsNotificationsState(); -} - -class _SettingsNotificationsState extends State { - NotificationListenerStatus? status; - - @override - void initState() { - super.initState(); - } - - Future updateStatus() async { - status = await nlStatus(); - return status!; - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text(S.of(context).settingsNotificationListener), - ), - body: ListView( - padding: const EdgeInsets.symmetric(horizontal: 24), - primary: false, - children: [ - Padding( - padding: const EdgeInsets.symmetric(horizontal: 12), - child: Text(S.of(context).settingsNLDescription), - ), - const Divider(), - FutureBuilder( - future: updateStatus(), - builder: (BuildContext context, - AsyncSnapshot snapshot) { - final S l10n = S.of(context); - final ScaffoldMessengerState msg = ScaffoldMessenger.of(context); - - late String subtitle; - late Function clickFn; - if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - if (!snapshot.data!.servicePermission) { - subtitle = l10n.settingsNLPermissionGrant; - clickFn = () async { - bool granted = await FlutterLocalNotificationsPlugin() - .resolvePlatformSpecificImplementation< - AndroidFlutterLocalNotificationsPlugin>()! - .requestPermission() ?? - false; - if (!granted) { - msg.showSnackBar(SnackBar( - content: Text(l10n.settingsNLPermissionNotGranted), - behavior: SnackBarBehavior.floating, - )); - return; - } - await NotificationServicePlugin.instance - .requestPermissionsIfDenied(); - await nlInit(); - }; - } else if (!snapshot.data!.notificationPermission) { - subtitle = l10n.settingsNLPermissionGrant; - clickFn = () async { - await FlutterLocalNotificationsPlugin() - .resolvePlatformSpecificImplementation< - AndroidFlutterLocalNotificationsPlugin>()! - .requestPermission(); - }; - } else if (!snapshot.data!.serviceRunning) { - subtitle = l10n.settingsNLServiceStopped; - clickFn = () async { - await NotificationServicePlugin.instance.startService(); - }; - } else { - subtitle = l10n.settingsNLServiceRunning; - clickFn = () async { - final bool? ok = await showDialog( - context: context, - builder: (BuildContext context) => AlertDialog( - icon: const Icon(Icons.remove_done), - title: Text(S.of(context).settingsNLPermissionRemove), - clipBehavior: Clip.hardEdge, - actions: [ - TextButton( - child: Text(S.of(context).formButtonCancel), - onPressed: () { - Navigator.of(context).pop(); - }, - ), - FilledButton( - child: Text(S.of(context).formButtonRemove), - onPressed: () { - Navigator.of(context).pop(true); - }, - ), - ], - content: - Text(S.of(context).settingsNLPermissionRemoveHelp), - ), - ); - if (!(ok ?? false)) { - return; - } - await NotificationServicePlugin.instance - .requestServicePermission(); - }; - } - } else if (snapshot.hasError) { - subtitle = S - .of(context) - .settingsNLServiceCheckingError(snapshot.error.toString()); - } else { - subtitle = S.of(context).settingsNLServiceChecking; - } - return ListTile( - title: Text(S.of(context).settingsNLServiceStatus), - leading: CircleAvatar( - child: (snapshot.data?.serviceRunning ?? false) - ? const Icon(Icons.check) - : const Icon(Icons.close), - ), - subtitle: Text( - subtitle, - maxLines: 1, - ), - onTap: () async { - await clickFn(); - setState(() {}); - }, - ); - }, - ), - if (status != null && - status!.serviceRunning && - status!.notificationPermission) ...[ - const Divider(), - ListTile( - title: Text(S.of(context).settingsNLAppAdd), - leading: const CircleAvatar( - child: Icon(Icons.add), - ), - subtitle: Text( - S.of(context).settingsNLAppAddHelp, - maxLines: 2, - ), - isThreeLine: true, - onTap: () async { - final SettingsProvider settings = - context.read(); - Application? app = await showDialog( - context: context, - builder: (BuildContext context) => const AppDialog(), - ); - if (app == null || app.packageName.isEmpty) { - return; - } - - await settings.notificationAddUsedApp(app.packageName); - await settings.notificationSetAppSettings( - app.packageName, - NotificationAppSettings(app.appName), - ); - setState(() {}); - }, - ), - const Divider(), - const NotificationApps(), - ], - ], - ), - ); - } -} - -class NotificationApps extends StatelessWidget { - const NotificationApps({ - super.key, - }); - - Future _getAccounts(BuildContext context) async { - final FireflyIii api = context.read().api; - - // Accounts - final Response respAccounts = - await api.v1AccountsGet(type: AccountTypeFilter.assetAccount); - if (!respAccounts.isSuccessful || respAccounts.body == null) { - if (context.mounted) { - throw Exception( - S - .of(context) - .errorAPIInvalidResponse(respAccounts.error?.toString() ?? ""), - ); - } else { - throw Exception( - "[nocontext] Invalid API response: ${respAccounts.error}", - ); - } - } - return respAccounts.body!; - } - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: _getAccounts(context), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - return Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - ...context.watch().notificationApps.map( - (String app) { - return AppCard( - app: app, - accounts: snapshot.data!, - ); - }, - ), - ], - ); - } else if (snapshot.hasError) { - return Text(S - .of(context) - .settingsNLServiceCheckingError(snapshot.error.toString())); - } else { - return const Center(child: CircularProgressIndicator()); - } - }, - ); - } -} - -class AppCard extends StatefulWidget { - const AppCard({ - super.key, - required this.app, - required this.accounts, - }); - - final String app; - final AccountArray accounts; - - @override - State createState() => _AppCardState(); -} - -class _AppCardState extends State { - final TextEditingController accountTextController = TextEditingController(); - final FocusNode accountFocusNode = FocusNode(); - - String? appAccountId; - - @override - Widget build(BuildContext context) { - return Card( - clipBehavior: Clip.hardEdge, - child: Padding( - padding: const EdgeInsets.all(12), - child: Row( - children: [ - Expanded( - child: FutureBuilder( - future: context - .read() - .notificationGetAppSettings(widget.app), - builder: (BuildContext context, - AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.done && - snapshot.hasData) { - List> accountOptions = - >[ - DropdownMenuEntry( - value: AccountRead( - id: "0", - type: "dummy", - attributes: Account( - name: S.of(context).settingsNLAppAccountDynamic, - type: ShortAccountTypeProperty - .swaggerGeneratedUnknown, - ), - ), - label: S.of(context).settingsNLAppAccountDynamic, - ) - ]; - AccountRead? currentAccount = accountOptions.first.value; - for (AccountRead e in widget.accounts.data) { - accountOptions.add(DropdownMenuEntry( - value: e, - label: e.attributes.name, - )); - if (snapshot.data!.defaultAccountId == e.id) { - currentAccount = e; - } - } - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Text( - snapshot.data!.appName, - style: Theme.of(context).textTheme.titleMedium, - ), - const SizedBox(height: 16), - DropdownMenu( - initialSelection: currentAccount, - leadingIcon: const Icon(Icons.account_balance), - label: Text(S.of(context).settingsNLAppAccount), - dropdownMenuEntries: accountOptions, - onSelected: (AccountRead? account) async { - FocusManager.instance.primaryFocus?.unfocus(); - final NotificationAppSettings settings = - snapshot.data!; - if ((account?.id ?? "0") == "0") { - settings.defaultAccountId = null; - } else { - settings.defaultAccountId = account!.id; - } - await context - .read() - .notificationSetAppSettings( - widget.app, settings); - }, - ), - ], - ); - } else if (snapshot.hasError) { - return const SizedBox.shrink(); - } else { - return const CircularProgressIndicator(); - } - }, - ), - ), - SizedBox( - width: 48, - child: Align( - alignment: Alignment.centerRight, - child: IconButton( - icon: const Icon(Icons.delete), - onPressed: () { - context - .read() - .notificationRemoveUsedApp(widget.app); - }, - tooltip: S.of(context).transactionSplitDelete, - ), - ), - ), - ], - ), - ), - ); - } -} - -class AppDialog extends StatelessWidget { - const AppDialog({ - super.key, - }); - - @override - Widget build(BuildContext context) { - return SimpleDialog( - title: Text(S.of(context).settingsNLAppAdd), - clipBehavior: Clip.hardEdge, - children: [ - FutureBuilder>( - future: context - .read() - .notificationKnownApps(filterUsed: true), - builder: - (BuildContext context, AsyncSnapshot> snapshot) { - if (snapshot.hasData) { - List child = []; - child.add( - Padding( - padding: const EdgeInsets.symmetric(horizontal: 24), - child: Text(S.of(context).settingsNLAppAddInfo), - ), - ); - for (String app in snapshot.data!) { - child.add(AppDialogEntry(app: app)); - } - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: child, - ); - } else if (snapshot.hasError) { - Navigator.pop(context); - return const SizedBox.shrink(); - } else { - return const Center( - child: CircularProgressIndicator(), - ); - } - }, - ), - ], - ); - } -} - -class AppDialogEntry extends StatelessWidget { - const AppDialogEntry({ - super.key, - required this.app, - }); - - final String app; - - @override - Widget build(BuildContext context) { - return FutureBuilder( - future: DeviceApps.getApp(app), - builder: (BuildContext context, AsyncSnapshot snapshot) { - if (snapshot.connectionState == ConnectionState.done) { - if (snapshot.data == null) { - return const SizedBox.shrink(); - } - return ListTile( - // :TODO: check for a library that can fetch the app icon - leading: const CircleAvatar( - child: Icon(Icons.api), - ), - title: Text(snapshot.data!.appName), - subtitle: Text(app), - onTap: () { - Navigator.pop(context, snapshot.data); - }, - ); - } else if (snapshot.hasError) { - return const SizedBox.shrink(); - } else { - return const CircularProgressIndicator(); - } - }, - ); - } -} diff --git a/lib/pages/settings_notifications.dart b/lib/pages/settings_notifications.dart new file mode 100644 index 00000000..f23f0d88 --- /dev/null +++ b/lib/pages/settings_notifications.dart @@ -0,0 +1,461 @@ +import 'package:chopper/chopper.dart'; + +import 'package:flutter/material.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:provider/provider.dart'; + +import 'package:device_apps/device_apps.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:notifications_listener_service/notifications_listener_service.dart'; + +import 'package:waterflyiii/auth.dart'; +import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; +import 'package:waterflyiii/notificationlistener.dart'; +import 'package:waterflyiii/settings.dart'; + +class SettingsNotifications extends StatefulWidget { + const SettingsNotifications({ + super.key, + }); + + @override + State createState() => _SettingsNotificationsState(); +} + +class _SettingsNotificationsState extends State { + NotificationListenerStatus? status; + + @override + void initState() { + super.initState(); + } + + Future updateStatus() async { + status = await nlStatus(); + return status!; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: Text(S.of(context).settingsNotificationListener), + ), + body: ListView( + padding: const EdgeInsets.symmetric(horizontal: 24), + primary: false, + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 12), + child: Text(S.of(context).settingsNLDescription), + ), + const Divider(), + FutureBuilder( + future: updateStatus(), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + final S l10n = S.of(context); + final ScaffoldMessengerState msg = ScaffoldMessenger.of(context); + + late String subtitle; + late Function clickFn; + if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + if (!snapshot.data!.servicePermission) { + subtitle = l10n.settingsNLPermissionGrant; + clickFn = () async { + bool granted = await FlutterLocalNotificationsPlugin() + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>()! + .requestPermission() ?? + false; + if (!granted) { + msg.showSnackBar(SnackBar( + content: Text(l10n.settingsNLPermissionNotGranted), + behavior: SnackBarBehavior.floating, + )); + return; + } + await NotificationServicePlugin.instance + .requestPermissionsIfDenied(); + await nlInit(); + }; + } else if (!snapshot.data!.notificationPermission) { + subtitle = l10n.settingsNLPermissionGrant; + clickFn = () async { + await FlutterLocalNotificationsPlugin() + .resolvePlatformSpecificImplementation< + AndroidFlutterLocalNotificationsPlugin>()! + .requestPermission(); + }; + } else if (!snapshot.data!.serviceRunning) { + subtitle = l10n.settingsNLServiceStopped; + clickFn = () async { + await NotificationServicePlugin.instance.startService(); + }; + } else { + subtitle = l10n.settingsNLServiceRunning; + clickFn = () async { + final bool? ok = await showDialog( + context: context, + builder: (BuildContext context) => AlertDialog( + icon: const Icon(Icons.remove_done), + title: Text(S.of(context).settingsNLPermissionRemove), + clipBehavior: Clip.hardEdge, + actions: [ + TextButton( + child: Text(S.of(context).formButtonCancel), + onPressed: () { + Navigator.of(context).pop(); + }, + ), + FilledButton( + child: Text(S.of(context).formButtonRemove), + onPressed: () { + Navigator.of(context).pop(true); + }, + ), + ], + content: + Text(S.of(context).settingsNLPermissionRemoveHelp), + ), + ); + if (!(ok ?? false)) { + return; + } + await NotificationServicePlugin.instance + .requestServicePermission(); + }; + } + } else if (snapshot.hasError) { + subtitle = S + .of(context) + .settingsNLServiceCheckingError(snapshot.error.toString()); + } else { + subtitle = S.of(context).settingsNLServiceChecking; + } + return ListTile( + title: Text(S.of(context).settingsNLServiceStatus), + leading: CircleAvatar( + child: (snapshot.data?.serviceRunning ?? false) + ? const Icon(Icons.check) + : const Icon(Icons.close), + ), + subtitle: Text( + subtitle, + maxLines: 1, + ), + onTap: () async { + await clickFn(); + setState(() {}); + }, + ); + }, + ), + if (status != null && + status!.serviceRunning && + status!.notificationPermission) ...[ + const Divider(), + ListTile( + title: Text(S.of(context).settingsNLAppAdd), + leading: const CircleAvatar( + child: Icon(Icons.add), + ), + subtitle: Text( + S.of(context).settingsNLAppAddHelp, + maxLines: 2, + ), + isThreeLine: true, + onTap: () async { + final SettingsProvider settings = + context.read(); + Application? app = await showDialog( + context: context, + builder: (BuildContext context) => const AppDialog(), + ); + if (app == null || app.packageName.isEmpty) { + return; + } + + await settings.notificationAddUsedApp(app.packageName); + await settings.notificationSetAppSettings( + app.packageName, + NotificationAppSettings(app.appName), + ); + setState(() {}); + }, + ), + const Divider(), + const NotificationApps(), + ], + ], + ), + ); + } +} + +class NotificationApps extends StatelessWidget { + const NotificationApps({ + super.key, + }); + + Future _getAccounts(BuildContext context) async { + final FireflyIii api = context.read().api; + + // Accounts + final Response respAccounts = + await api.v1AccountsGet(type: AccountTypeFilter.assetAccount); + if (!respAccounts.isSuccessful || respAccounts.body == null) { + if (context.mounted) { + throw Exception( + S + .of(context) + .errorAPIInvalidResponse(respAccounts.error?.toString() ?? ""), + ); + } else { + throw Exception( + "[nocontext] Invalid API response: ${respAccounts.error}", + ); + } + } + return respAccounts.body!; + } + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: _getAccounts(context), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + return Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + ...context.watch().notificationApps.map( + (String app) { + return AppCard( + app: app, + accounts: snapshot.data!, + ); + }, + ), + ], + ); + } else if (snapshot.hasError) { + return Text(S + .of(context) + .settingsNLServiceCheckingError(snapshot.error.toString())); + } else { + return const Center(child: CircularProgressIndicator()); + } + }, + ); + } +} + +class AppCard extends StatefulWidget { + const AppCard({ + super.key, + required this.app, + required this.accounts, + }); + + final String app; + final AccountArray accounts; + + @override + State createState() => _AppCardState(); +} + +class _AppCardState extends State { + final TextEditingController accountTextController = TextEditingController(); + final FocusNode accountFocusNode = FocusNode(); + + String? appAccountId; + + @override + Widget build(BuildContext context) { + return Card( + clipBehavior: Clip.hardEdge, + child: Padding( + padding: const EdgeInsets.all(12), + child: Row( + children: [ + Expanded( + child: FutureBuilder( + future: context + .read() + .notificationGetAppSettings(widget.app), + builder: (BuildContext context, + AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.done && + snapshot.hasData) { + List> accountOptions = + >[ + DropdownMenuEntry( + value: AccountRead( + id: "0", + type: "dummy", + attributes: Account( + name: S.of(context).settingsNLAppAccountDynamic, + type: ShortAccountTypeProperty + .swaggerGeneratedUnknown, + ), + ), + label: S.of(context).settingsNLAppAccountDynamic, + ) + ]; + AccountRead? currentAccount = accountOptions.first.value; + for (AccountRead e in widget.accounts.data) { + accountOptions.add(DropdownMenuEntry( + value: e, + label: e.attributes.name, + )); + if (snapshot.data!.defaultAccountId == e.id) { + currentAccount = e; + } + } + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + snapshot.data!.appName, + style: Theme.of(context).textTheme.titleMedium, + ), + const SizedBox(height: 16), + DropdownMenu( + initialSelection: currentAccount, + leadingIcon: const Icon(Icons.account_balance), + label: Text(S.of(context).settingsNLAppAccount), + dropdownMenuEntries: accountOptions, + onSelected: (AccountRead? account) async { + FocusManager.instance.primaryFocus?.unfocus(); + final NotificationAppSettings settings = + snapshot.data!; + if ((account?.id ?? "0") == "0") { + settings.defaultAccountId = null; + } else { + settings.defaultAccountId = account!.id; + } + await context + .read() + .notificationSetAppSettings( + widget.app, settings); + }, + ), + ], + ); + } else if (snapshot.hasError) { + return const SizedBox.shrink(); + } else { + return const CircularProgressIndicator(); + } + }, + ), + ), + SizedBox( + width: 48, + child: Align( + alignment: Alignment.centerRight, + child: IconButton( + icon: const Icon(Icons.delete), + onPressed: () { + context + .read() + .notificationRemoveUsedApp(widget.app); + }, + tooltip: S.of(context).transactionSplitDelete, + ), + ), + ), + ], + ), + ), + ); + } +} + +class AppDialog extends StatelessWidget { + const AppDialog({ + super.key, + }); + + @override + Widget build(BuildContext context) { + return SimpleDialog( + title: Text(S.of(context).settingsNLAppAdd), + clipBehavior: Clip.hardEdge, + children: [ + FutureBuilder>( + future: context + .read() + .notificationKnownApps(filterUsed: true), + builder: + (BuildContext context, AsyncSnapshot> snapshot) { + if (snapshot.hasData) { + List child = []; + child.add( + Padding( + padding: const EdgeInsets.symmetric(horizontal: 24), + child: Text(S.of(context).settingsNLAppAddInfo), + ), + ); + for (String app in snapshot.data!) { + child.add(AppDialogEntry(app: app)); + } + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: child, + ); + } else if (snapshot.hasError) { + Navigator.pop(context); + return const SizedBox.shrink(); + } else { + return const Center( + child: CircularProgressIndicator(), + ); + } + }, + ), + ], + ); + } +} + +class AppDialogEntry extends StatelessWidget { + const AppDialogEntry({ + super.key, + required this.app, + }); + + final String app; + + @override + Widget build(BuildContext context) { + return FutureBuilder( + future: DeviceApps.getApp(app), + builder: (BuildContext context, AsyncSnapshot snapshot) { + if (snapshot.connectionState == ConnectionState.done) { + if (snapshot.data == null) { + return const SizedBox.shrink(); + } + return ListTile( + // :TODO: check for a library that can fetch the app icon + leading: const CircleAvatar( + child: Icon(Icons.api), + ), + title: Text(snapshot.data!.appName), + subtitle: Text(app), + onTap: () { + Navigator.pop(context, snapshot.data); + }, + ); + } else if (snapshot.hasError) { + return const SizedBox.shrink(); + } else { + return const CircularProgressIndicator(); + } + }, + ); + } +} From 1bf65548c757399861060fc60b810246a59ad6e9 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 16 Apr 2023 15:58:21 +0000 Subject: [PATCH 23/33] refactor: identical import orders everywhere --- lib/app.dart | 5 +++-- lib/auth.dart | 3 ++- lib/notificationlistener.dart | 1 + lib/pages/home.dart | 6 +++--- lib/pages/home_balance.dart | 7 ++++--- lib/pages/home_main.dart | 10 +++++----- lib/pages/home_piggybank.dart | 10 +++++----- lib/pages/home_transactions.dart | 11 ++++++----- lib/pages/login.dart | 4 ++-- lib/pages/settings.dart | 4 ++-- lib/pages/settings_notifications.dart | 3 +-- lib/pages/splash.dart | 2 +- lib/pages/transaction_detail.dart | 22 +++++++++++----------- lib/settings.dart | 1 + 14 files changed, 47 insertions(+), 42 deletions(-) diff --git a/lib/app.dart b/lib/app.dart index 820ee06e..c7198f6d 100644 --- a/lib/app.dart +++ b/lib/app.dart @@ -2,17 +2,18 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; + import 'package:waterflyiii/auth.dart'; import 'package:waterflyiii/notificationlistener.dart'; -import 'package:waterflyiii/settings.dart'; import 'package:waterflyiii/pages/login.dart'; import 'package:waterflyiii/pages/navigation.dart'; import 'package:waterflyiii/pages/splash.dart'; import 'package:waterflyiii/pages/transaction_detail.dart'; +import 'package:waterflyiii/settings.dart'; final GlobalKey navigatorKey = GlobalKey(debugLabel: "Main Navigator"); diff --git a/lib/auth.dart b/lib/auth.dart index dbf48500..7d5c79fb 100644 --- a/lib/auth.dart +++ b/lib/auth.dart @@ -2,9 +2,10 @@ import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; + import 'package:chopper/chopper.dart' show Request, Response, StripStringExtension; +import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; diff --git a/lib/notificationlistener.dart b/lib/notificationlistener.dart index 9c2d5869..5296145f 100644 --- a/lib/notificationlistener.dart +++ b/lib/notificationlistener.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; + import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:notifications_listener_service/notifications_listener_service.dart'; diff --git a/lib/pages/home.dart b/lib/pages/home.dart index 4baceb8e..da9cc229 100644 --- a/lib/pages/home.dart +++ b/lib/pages/home.dart @@ -3,11 +3,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; -import 'package:waterflyiii/pages/navigation.dart'; -import 'package:waterflyiii/pages/home_main.dart'; -import 'package:waterflyiii/pages/home_transactions.dart'; import 'package:waterflyiii/pages/home_balance.dart'; +import 'package:waterflyiii/pages/home_main.dart'; import 'package:waterflyiii/pages/home_piggybank.dart'; +import 'package:waterflyiii/pages/home_transactions.dart'; +import 'package:waterflyiii/pages/navigation.dart'; import 'package:waterflyiii/pages/transaction_detail.dart'; class HomePage extends StatefulWidget { diff --git a/lib/pages/home_balance.dart b/lib/pages/home_balance.dart index b5ca7bdf..6d926714 100644 --- a/lib/pages/home_balance.dart +++ b/lib/pages/home_balance.dart @@ -1,15 +1,16 @@ import 'dart:ui'; -import 'package:chopper/chopper.dart' show Response; import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; +import 'package:chopper/chopper.dart' show Response; + import 'package:waterflyiii/auth.dart'; import 'package:waterflyiii/extensions.dart'; -import 'package:waterflyiii/pages/home_transactions.dart'; import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; +import 'package:waterflyiii/pages/home_transactions.dart'; class HomeBalance extends StatefulWidget { const HomeBalance({ diff --git a/lib/pages/home_main.dart b/lib/pages/home_main.dart index 2b8d185e..b6aab40d 100644 --- a/lib/pages/home_main.dart +++ b/lib/pages/home_main.dart @@ -1,21 +1,21 @@ import 'dart:async'; import 'dart:ui'; -import 'package:chopper/chopper.dart' show Response; import 'package:collection/collection.dart'; -import 'package:intl/intl.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; +import 'package:chopper/chopper.dart' show Response; +import 'package:community_charts_flutter/community_charts_flutter.dart' + as charts; + import 'package:waterflyiii/animations.dart'; import 'package:waterflyiii/auth.dart'; import 'package:waterflyiii/extensions.dart'; import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; -import 'package:community_charts_flutter/community_charts_flutter.dart' - as charts; - class HomeMain extends StatefulWidget { const HomeMain({super.key}); diff --git a/lib/pages/home_piggybank.dart b/lib/pages/home_piggybank.dart index 7966dfdf..f2394469 100644 --- a/lib/pages/home_piggybank.dart +++ b/lib/pages/home_piggybank.dart @@ -1,22 +1,22 @@ import 'dart:convert'; import 'dart:ui'; -import 'package:chopper/chopper.dart' show Response; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; +import 'package:chopper/chopper.dart' show Response; +import 'package:community_charts_flutter/community_charts_flutter.dart' + as charts; + import 'package:waterflyiii/animations.dart'; import 'package:waterflyiii/auth.dart'; import 'package:waterflyiii/extensions.dart'; +import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; import 'package:waterflyiii/widgets/input_number.dart'; import 'package:waterflyiii/widgets/materialiconbutton.dart'; -import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; - -import 'package:community_charts_flutter/community_charts_flutter.dart' - as charts; class HomePiggybank extends StatefulWidget { const HomePiggybank({ diff --git a/lib/pages/home_transactions.dart b/lib/pages/home_transactions.dart index f2de48aa..de6a40b5 100644 --- a/lib/pages/home_transactions.dart +++ b/lib/pages/home_transactions.dart @@ -1,19 +1,20 @@ import 'dart:async'; import 'dart:ui'; + import 'package:animations/animations.dart'; -import 'package:chopper/chopper.dart' show Response; import 'package:flutter/material.dart'; -import 'package:intl/intl.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; +import 'package:chopper/chopper.dart' show Response; +import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; + import 'package:waterflyiii/auth.dart'; import 'package:waterflyiii/extensions.dart'; +import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; import 'package:waterflyiii/pages/home.dart'; import 'package:waterflyiii/pages/transaction_detail.dart'; -import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; - -import 'package:infinite_scroll_pagination/infinite_scroll_pagination.dart'; class TransactionFilters with ChangeNotifier { TransactionFilters({this.account, this.text, this.currency}); diff --git a/lib/pages/login.dart b/lib/pages/login.dart index f0f8cbe1..6abfe770 100644 --- a/lib/pages/login.dart +++ b/lib/pages/login.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:url_launcher/url_launcher.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; +import 'package:url_launcher/url_launcher.dart'; import 'package:waterflyiii/animations.dart'; import 'package:waterflyiii/pages/splash.dart'; -import 'package:waterflyiii/widgets/logo.dart'; import 'package:waterflyiii/widgets/erroricon.dart'; +import 'package:waterflyiii/widgets/logo.dart'; class UriScheme { static const String https = "https://"; diff --git a/lib/pages/settings.dart b/lib/pages/settings.dart index 1191b98c..5905b11c 100644 --- a/lib/pages/settings.dart +++ b/lib/pages/settings.dart @@ -2,10 +2,10 @@ import 'package:animations/animations.dart'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; -import 'package:waterflyiii/pages/settings_notifications.dart'; -import 'package:waterflyiii/settings.dart'; import 'package:waterflyiii/notificationlistener.dart'; +import 'package:waterflyiii/pages/settings_notifications.dart'; +import 'package:waterflyiii/settings.dart'; class SettingsPage extends StatefulWidget { const SettingsPage({Key? key}) : super(key: key); diff --git a/lib/pages/settings_notifications.dart b/lib/pages/settings_notifications.dart index f23f0d88..c1c9f337 100644 --- a/lib/pages/settings_notifications.dart +++ b/lib/pages/settings_notifications.dart @@ -1,9 +1,8 @@ -import 'package:chopper/chopper.dart'; - import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; +import 'package:chopper/chopper.dart' show Response; import 'package:device_apps/device_apps.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:notifications_listener_service/notifications_listener_service.dart'; diff --git a/lib/pages/splash.dart b/lib/pages/splash.dart index 179f443c..020fba3c 100644 --- a/lib/pages/splash.dart +++ b/lib/pages/splash.dart @@ -5,8 +5,8 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; import 'package:waterflyiii/animations.dart'; -import 'package:waterflyiii/widgets/logo.dart'; import 'package:waterflyiii/auth.dart'; +import 'package:waterflyiii/widgets/logo.dart'; enum SplashState { login, diff --git a/lib/pages/transaction_detail.dart b/lib/pages/transaction_detail.dart index c82917f9..8f31a9ae 100644 --- a/lib/pages/transaction_detail.dart +++ b/lib/pages/transaction_detail.dart @@ -1,31 +1,31 @@ -import 'dart:io'; import 'dart:convert'; +import 'dart:io'; +import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:intl/intl.dart'; -import 'package:collection/collection.dart'; import 'package:path_provider/path_provider.dart' show getTemporaryDirectory; -import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:provider/provider.dart'; +import 'package:background_downloader/background_downloader.dart'; +import 'package:badges/badges.dart' as badges; +import 'package:chopper/chopper.dart' show Response; +import 'package:file_picker/file_picker.dart'; +import 'package:filesize/filesize.dart'; +import 'package:open_filex/open_filex.dart'; + import 'package:waterflyiii/animations.dart'; import 'package:waterflyiii/auth.dart'; import 'package:waterflyiii/extensions.dart'; -import 'package:waterflyiii/notificationlistener.dart'; import 'package:waterflyiii/generated/swagger_fireflyiii_api/firefly_iii.swagger.dart'; +import 'package:waterflyiii/notificationlistener.dart'; import 'package:waterflyiii/settings.dart'; import 'package:waterflyiii/widgets/autocompletetext.dart'; import 'package:waterflyiii/widgets/input_number.dart'; import 'package:waterflyiii/widgets/materialiconbutton.dart'; -import 'package:chopper/chopper.dart' show Response; -import 'package:badges/badges.dart' as badges; -import 'package:filesize/filesize.dart'; -import 'package:background_downloader/background_downloader.dart'; -import 'package:open_filex/open_filex.dart'; -import 'package:file_picker/file_picker.dart'; - class TransactionPage extends StatefulWidget { const TransactionPage({ Key? key, diff --git a/lib/settings.dart b/lib/settings.dart index 6fd34f2f..9b17410c 100644 --- a/lib/settings.dart +++ b/lib/settings.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'package:flutter/material.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + import 'package:shared_preferences/shared_preferences.dart'; class NotificationAppSettings { From 403bdbb33870bc3946b64a3ee0abb144e9b6f731 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 16 Apr 2023 16:51:30 +0000 Subject: [PATCH 24/33] TransactionDetail: fix attachment upload unfortunately, there is still an issue together with the notification listener service, which I will need to check in more detail --- lib/pages/transaction_detail.dart | 60 +++++++++++++++++-------------- pubspec.lock | 40 ++++++++++----------- pubspec.yaml | 2 +- 3 files changed, 54 insertions(+), 48 deletions(-) diff --git a/lib/pages/transaction_detail.dart b/lib/pages/transaction_detail.dart index 8f31a9ae..ed6ba0ee 100644 --- a/lib/pages/transaction_detail.dart +++ b/lib/pages/transaction_detail.dart @@ -2650,40 +2650,46 @@ class _AttachmentDialogState extends State post: 'binary', mimeType: "application/octet-stream", ); - debugPrint("AttachmentUpload: Starting Upload"); - await FileDownloader().upload( + debugPrint( + "AttachmentUpload: Starting Upload $newAttachmentIndex"); + final TaskStatus result = await FileDownloader().upload( task, onProgress: (double progress) { - debugPrint("Upload progress: $progress"); + debugPrint( + "AttachmentUpload $newAttachmentIndex: progress $progress"); setState(() { _dlProgress[newAttachmentIndex] = progress * -1; }); }, - onStatus: (TaskStatus result) async { - debugPrint("AttachmentUpload: status update"); - _dlProgress.remove(newAttachmentIndex); - if (result != TaskStatus.complete) { - late String error; - debugPrint(result.toString()); - try { - ValidationError valError = ValidationError.fromJson( - json.decode(respAttachment.error.toString())); - error = error = valError.message ?? l10n.errorUnknown; - } catch (_) { - error = l10n.errorUnknown; - } - debugPrint("error: $error"); - msg.showSnackBar(SnackBar( - content: Text( - l10n.transactionDialogAttachmentsErrorUpload(error)), - behavior: SnackBarBehavior.floating, - )); - widget.attachments.removeAt(newAttachmentIndex); - await api.v1AttachmentsIdDelete(id: newAttachment.id); - } - }, ); - debugPrint("AttachmentUpload: Done with Upload"); + + debugPrint( + "AttachmentUpload: Done with Upload $newAttachmentIndex, Result: $result"); + setState(() { + _dlProgress.remove(newAttachmentIndex); + }); + + if (result != TaskStatus.complete) { + late String error; + debugPrint(result.toString()); + try { + ValidationError valError = ValidationError.fromJson( + json.decode(respAttachment.error.toString())); + error = error = valError.message ?? l10n.errorUnknown; + } catch (_) { + error = l10n.errorUnknown; + } + debugPrint("error: $error"); + msg.showSnackBar(SnackBar( + content: + Text(l10n.transactionDialogAttachmentsErrorUpload(error)), + behavior: SnackBarBehavior.floating, + )); + await api.v1AttachmentsIdDelete(id: newAttachment.id); + setState(() { + widget.attachments.removeAt(newAttachmentIndex); + }); + } }, child: Text(S.of(context).formButtonUpload), ), diff --git a/pubspec.lock b/pubspec.lock index 2deb2797..80b2e8f0 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -53,18 +53,18 @@ packages: dependency: "direct main" description: name: background_downloader - sha256: "650acae252591a421ba1e5aaa77fb09245928b6cf3a0fef34af8c2a423d1ea5b" + sha256: "3f452ea7e8357f5a63498e9d95c5c8ef43bc3d1442d9d73048dc9c07b0c76030" url: "https://pub.dev" source: hosted - version: "5.4.4" + version: "5.4.5" badges: dependency: "direct main" description: name: badges - sha256: "183514a2d7716297abd19d19ebe8bf667fb89c5739eaec58c6210f3631444206" + sha256: "6e7f3ec561ec08f47f912cfe349d4a1707afdc8dda271e17b046aa6d42c89e77" url: "https://pub.dev" source: hosted - version: "3.1.0" + version: "3.1.1" boolean_selector: dependency: transitive description: @@ -293,10 +293,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "0d923fb610d0abf67f2149c3a50ef85f78bebecfc4d645719ca70bcf4abc788f" + sha256: dcde5ad1a0cebcf3715ea3f24d0db1888bf77027a26c77d7779e8ef63b8ade62 url: "https://pub.dev" source: hosted - version: "5.2.7" + version: "5.2.9" filesize: dependency: "direct main" description: @@ -674,10 +674,10 @@ packages: dependency: transitive description: name: path_provider_android - sha256: "019f18c9c10ae370b08dce1f3e3b73bc9f58e7f087bb5e921f06529438ac0ae7" + sha256: da97262be945a72270513700a92b39dd2f4a54dad55d061687e2e37a6390366a url: "https://pub.dev" source: hosted - version: "2.0.24" + version: "2.0.25" path_provider_foundation: dependency: transitive description: @@ -738,10 +738,10 @@ packages: dependency: transitive description: name: pointycastle - sha256: c3120a968135aead39699267f4c74bc9a08e4e909e86bc1b0af5bfd78691123c + sha256: "7c1e5f0d23c9016c5bbd8b1473d0d3fb3fc851b876046039509e18e0c7485f2c" url: "https://pub.dev" source: hosted - version: "3.7.2" + version: "3.7.3" pool: dependency: transitive description: @@ -802,10 +802,10 @@ packages: dependency: transitive description: name: shared_preferences_android - sha256: "8304d8a1f7d21a429f91dee552792249362b68a331ac5c3c1caf370f658873f6" + sha256: "7fa90471a6875d26ad78c7e4a675874b2043874586891128dc5899662c97db46" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.2" shared_preferences_foundation: dependency: transitive description: @@ -935,10 +935,10 @@ packages: dependency: "direct dev" description: name: swagger_dart_code_generator - sha256: b7ca5ee87fb678a216f261f711b013ad935448d0d32f655b04e5ed87f09a81a8 + sha256: a3088b1f01d2cd20375b6d5c79a8bca2ede685738645ff36a335dfa6224311f9 url: "https://pub.dev" source: hosted - version: "2.10.3" + version: "2.10.4" term_glyph: dependency: transitive description: @@ -999,10 +999,10 @@ packages: dependency: transitive description: name: url_launcher_android - sha256: dd729390aa936bf1bdf5cd1bc7468ff340263f80a2c4f569416507667de8e3c8 + sha256: a52628068d282d01a07cd86e6ba99e497aa45ce8c91159015b2416907d78e411 url: "https://pub.dev" source: hosted - version: "6.0.26" + version: "6.0.27" url_launcher_ios: dependency: transitive description: @@ -1023,10 +1023,10 @@ packages: dependency: transitive description: name: url_launcher_macos - sha256: "0ef2b4f97942a16523e51256b799e9aa1843da6c60c55eefbfa9dbc2dcb8331a" + sha256: "91ee3e75ea9dadf38036200c5d3743518f4a5eb77a8d13fda1ee5764373f185e" url: "https://pub.dev" source: hosted - version: "3.0.4" + version: "3.0.5" url_launcher_platform_interface: dependency: transitive description: @@ -1095,10 +1095,10 @@ packages: dependency: transitive description: name: web_socket_channel - sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b + sha256: d88238e5eac9a42bb43ca4e721edba3c08c6354d4a53063afaa568516217621b url: "https://pub.dev" source: hosted - version: "2.3.0" + version: "2.4.0" win32: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b135c4d8..6071c4b9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: infinite_scroll_pagination: ^3.2.0 badges: ^3.1.0 filesize: ^2.0.1 - background_downloader: ^5.4.4 + background_downloader: ^5.4.5 community_charts_flutter: ^1.0.1 open_filex: ^4.3.2 file_picker: ^5.2.7 From 5547cef4afa0f6500d1fe0645a31273676c67b84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 20:05:38 +0000 Subject: [PATCH 25/33] Bump file_picker from 5.2.7 to 5.2.9 Bumps [file_picker](https://github.com/miguelpruivo/flutter_file_picker) from 5.2.7 to 5.2.9. - [Release notes](https://github.com/miguelpruivo/flutter_file_picker/releases) - [Changelog](https://github.com/miguelpruivo/flutter_file_picker/blob/master/CHANGELOG.md) - [Commits](https://github.com/miguelpruivo/flutter_file_picker/compare/5.2.7...5.2.9) --- updated-dependencies: - dependency-name: file_picker dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 431 ++++++++++++++++++--------------------------------- pubspec.yaml | 2 +- 2 files changed, 148 insertions(+), 285 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 2deb2797..e4180f0f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,312 +5,273 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: a36ec4843dc30ea6bf652bf25e3448db6c5e8bcf4aa55f063a5d1dad216d8214 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "58.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: cc4242565347e98424ce9945c819c192ec0838cb9d1f6aa4a97cc96becbc5b27 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "5.10.0" animations: dependency: "direct main" description: name: animations - sha256: fe8a6bdca435f718bb1dc8a11661b2c22504c6da40ef934cee8327ed77934164 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.7" archive: dependency: transitive description: name: archive - sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.3.7" args: dependency: transitive description: name: args - sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.4.0" async: dependency: transitive description: name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.10.0" background_downloader: dependency: "direct main" description: name: background_downloader - sha256: "650acae252591a421ba1e5aaa77fb09245928b6cf3a0fef34af8c2a423d1ea5b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "5.4.4" + version: "5.4.5" badges: dependency: "direct main" description: name: badges - sha256: "183514a2d7716297abd19d19ebe8bf667fb89c5739eaec58c6210f3631444206" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "3.1.0" + version: "3.1.1" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" build: dependency: transitive description: name: build - sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.3.1" build_config: dependency: transitive description: name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.1" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" build_runner: dependency: "direct dev" description: name: build_runner - sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.3.3" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "7.2.7" built_collection: dependency: transitive description: name: built_collection - sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - sha256: "31b7c748fd4b9adf8d25d72a4c4a59ef119f12876cf414f94f8af5131d5fa2b0" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "8.4.4" characters: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.1" checked_yaml: dependency: transitive description: name: checked_yaml - sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.2" chopper: dependency: "direct main" description: name: chopper - sha256: b2645618fa760df06d7609c96b092d7b3e7a8f23639d34269f62f45a5edabc7d - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.1" chopper_generator: dependency: "direct dev" description: name: chopper_generator - sha256: "62360a1a3536645aaee030dd7719089838a478682867d46dbcf30a3c0e5305b4" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.0.0" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.4.0" collection: dependency: "direct main" description: name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.17.0" community_charts_common: dependency: transitive description: name: community_charts_common - sha256: bcda2831d8c3225036102dff007e2a901a2fdfcbba604e10c78db3fe5d9362a5 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" community_charts_flutter: dependency: "direct main" description: name: community_charts_flutter - sha256: "2294cba46b67659109b665f2d9ffeffef93bb1540a5e7a7bcf2630b809a9363e" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" convert: dependency: transitive description: name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.1" crypto: dependency: transitive description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.2" csslib: dependency: transitive description: name: csslib - sha256: b36c7f7e24c0bdf1bf9a3da461c837d1de64b9f8beb190c9011d8c72a3dfd745 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.17.2" dart_style: dependency: transitive description: name: dart_style - sha256: "6d691edde054969f0e0f26abb1b30834b5138b963793e56f69d3a9a4435e6352" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.3.0" dbus: dependency: transitive description: name: dbus - sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.7.8" device_apps: dependency: "direct main" description: name: device_apps - sha256: e84dc74d55749993fd671148cc0bd53096e1be0c268fc364285511b1d8a4c19b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" equatable: dependency: transitive description: name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.5" fake_async: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" file: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.4" file_picker: dependency: "direct main" description: name: file_picker - sha256: "0d923fb610d0abf67f2149c3a50ef85f78bebecfc4d645719ca70bcf4abc788f" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "5.2.7" + version: "5.2.9" filesize: dependency: "direct main" description: name: filesize - sha256: f53df1f27ff60e466eefcd9df239e02d4722d5e2debee92a87dfd99ac66de2af - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" fixnum: dependency: transitive description: name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.0" flutter: @@ -322,32 +283,28 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" flutter_local_notifications: dependency: "direct main" description: name: flutter_local_notifications - sha256: "293995f94e120c8afce768981bd1fa9c5d6de67c547568e3b42ae2defdcbb4a0" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "13.0.0" flutter_local_notifications_linux: dependency: transitive description: name: flutter_local_notifications_linux - sha256: ccb08b93703aeedb58856e5637450bf3ffec899adb66dc325630b68994734b89 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.0+1" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "5ec1feac5f7f7d9266759488bc5f76416152baba9aa1b26fe572246caa00d1ab" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.0.0" flutter_localizations: @@ -359,72 +316,63 @@ packages: dependency: "direct dev" description: name: flutter_native_splash - sha256: af665ef80a213a9ed502845a3d7a61b9acca4100ee7e9f067a7440bc3acd6730 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.19" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: c224ac897bed083dabf11f238dd11a239809b446740be0c2044608c50029ffdf - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.9" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage - sha256: "98352186ee7ad3639ccc77ad7924b773ff6883076ab952437d20f18a61f0a7c5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "8.0.0" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - sha256: "0912ae29a572230ad52d8a4697e5518d7f0f429052fd51df7e5a7952c7efe2a3" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.3" flutter_secure_storage_macos: dependency: transitive description: name: flutter_secure_storage_macos - sha256: "083add01847fc1c80a07a08e1ed6927e9acd9618a35e330239d4422cd2a58c50" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.0" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: b3773190e385a3c8a382007893d678ae95462b3c2279e987b55d140d3b0cb81b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - sha256: "42938e70d4b872e856e678c423cc0e9065d7d294f45bc41fc1981a4eb4beaffe" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: fc2910ec9b28d60598216c29ea763b3a96c401f0ce1d13cdf69ccb0e5c93c3ee - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.0" flutter_svg: dependency: "direct main" description: name: flutter_svg - sha256: f991fdb1533c3caeee0cdc14b04f50f0c3916f0dbcbc05237ccbe4e3c6b93f3f - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.5" flutter_test: @@ -441,184 +389,161 @@ packages: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.2.0" glob: dependency: transitive description: name: glob - sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" graphs: dependency: transitive description: name: graphs - sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" html: dependency: transitive description: name: html - sha256: "79d498e6d6761925a34ee5ea8fa6dfef38607781d2fa91e37523474282af55cb" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.15.2" http: dependency: transitive description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.13.5" http_multi_server: dependency: transitive description: name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.0.2" image: dependency: transitive description: name: image - sha256: "483a389d6ccb292b570c31b3a193779b1b0178e7eb571986d9a49904b6861227" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.0.15" infinite_scroll_pagination: dependency: "direct main" description: name: infinite_scroll_pagination - sha256: "9517328f4e373f08f57dbb11c5aac5b05554142024d6b60c903f3b73476d52db" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.2.0" intl: dependency: "direct main" description: name: intl - sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.17.0" io: dependency: transitive description: name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.4" js: dependency: transitive description: name: js - sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.6.5" json_annotation: dependency: "direct main" description: name: json_annotation - sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.8.0" json_serializable: dependency: "direct dev" description: name: json_serializable - sha256: dadc08bd61f72559f938dd08ec20dbfec6c709bba83515085ea943d2078d187a - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.6.1" lints: dependency: transitive description: name: lints - sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" localstore: dependency: transitive description: name: localstore - sha256: "42a0afb7696cfab1b4bd7d08355b4ee01f975fd364553b28d51496eccaf11cce" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.5" logging: dependency: transitive description: name: logging - sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" markdown: dependency: transitive description: name: markdown - sha256: d95a9d12954aafc97f984ca29baaa7690ed4d9ec4140a23ad40580bcdb6c87f5 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "7.0.2" matcher: dependency: transitive description: name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.2.0" meta: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.8.0" mime: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.4" nested: dependency: transitive description: name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.0" notifications_listener_service: @@ -634,232 +559,203 @@ packages: dependency: "direct main" description: name: open_filex - sha256: "854aefd72dfd74219dc8c8d1767c34ec1eae64b8399a5be317bddb1ec2108915" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.3.2" package_config: dependency: transitive description: name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.8.2" path_parsing: dependency: transitive description: name: path_parsing - sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" path_provider: dependency: "direct main" description: name: path_provider - sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.14" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "019f18c9c10ae370b08dce1f3e3b73bc9f58e7f087bb5e921f06529438ac0ae7" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.0.24" + version: "2.0.25" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: ad4c4d011830462633f03eb34445a45345673dfd4faf1ab0b4735fbd93b19183 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.2" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.10" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.6" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.5" petitparser: dependency: transitive description: name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "5.1.0" platform: dependency: transitive description: name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.4" pointycastle: dependency: transitive description: name: pointycastle - sha256: c3120a968135aead39699267f4c74bc9a08e4e909e86bc1b0af5bfd78691123c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "3.7.2" + version: "3.7.3" pool: dependency: transitive description: name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.5.1" process: dependency: transitive description: name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.2.4" provider: dependency: "direct main" description: name: provider - sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.0.5" pub_semver: dependency: transitive description: name: pub_semver - sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.3" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: ec85d7d55339d85f44ec2b682a82fea340071e8978257e5a43e69f79e98ef50c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.2" recase: dependency: transitive description: name: recase - sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.1.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "858aaa72d8f61637d64e776aca82e1c67e6d9ee07979123c5d17115031c1b13b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8304d8a1f7d21a429f91dee552792249362b68a331ac5c3c1caf370f658873f6" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.2" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "0c1c16c56c9708aa9c361541a6f0e5cc6fc12a3232d866a687a7b7db30032b07" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.1" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9d387433ca65717bbf1be88f4d5bb18f10508917a8fa2fb02e0fd0d7479a9afa" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: fb5cf25c0235df2d0640ac1b1174f6466bd311f621574997ac59018a6664548d - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "74083203a8eae241e0de4a0d597dbedab3b8fef5563f33cf3c12d7e93c655ca5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "5e588e2efef56916a3b229c3bfe81e6a525665a454519ca51dbcc4236a274173" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" shelf: dependency: transitive description: name: shelf - sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.4.0" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.3" sky_engine: @@ -871,264 +767,231 @@ packages: dependency: transitive description: name: sliver_tools - sha256: ccdc502098a8bfa07b3ec582c282620031481300035584e1bb3aca296a505e8c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.2.10" source_gen: dependency: transitive description: name: source_gen - sha256: c2bea18c95cfa0276a366270afaa2850b09b4a76db95d546f3d003dcc7011298 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.7" source_helper: dependency: transitive description: name: source_helper - sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.3" source_span: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.0" swagger_dart_code_generator: dependency: "direct dev" description: name: swagger_dart_code_generator - sha256: b7ca5ee87fb678a216f261f711b013ad935448d0d32f655b04e5ed87f09a81a8 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.10.3" + version: "2.10.4" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.4.16" timezone: dependency: transitive description: name: timezone - sha256: "24c8fcdd49a805d95777a39064862133ff816ebfffe0ceff110fb5960e557964" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.9.1" timing: dependency: transitive description: name: timing - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.1" universal_io: dependency: transitive description: name: universal_io - sha256: "06866290206d196064fd61df4c7aea1ffe9a4e7c4ccaa8fcded42dd41948005d" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" url_launcher: dependency: "direct main" description: name: url_launcher - sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.10" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: dd729390aa936bf1bdf5cd1bc7468ff340263f80a2c4f569416507667de8e3c8 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "6.0.26" + version: "6.0.27" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.4" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "206fb8334a700ef7754d6a9ed119e7349bc830448098f21a69bf1b4ed038cabc" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.4" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "0ef2b4f97942a16523e51256b799e9aa1843da6c60c55eefbfa9dbc2dcb8331a" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "3.0.4" + version: "3.0.5" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.16" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: a83ba3607a507758669cfafb03f9de09bf6e6280c14d9b9cb18f013e406dcacd - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.5" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: ea8d3fc7b2e0f35de38a7465063ecfcf03d8217f7962aa2a6717132cb5d43a79 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: a5eaa5d19e123ad4f61c3718ca1ed921c4e6254238d9145f82aa214955d9aced - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "15edc42f7eaa478ce854eaf1fbb9062a899c0e4e56e775dd73b7f4709c97c4ca" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" vector_math: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.4" watcher: dependency: transitive description: name: watcher - sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.2" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.4.0" win32: dependency: transitive description: name: win32 - sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.4" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.2.0+3" xml: dependency: transitive description: name: xml - sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.2.2" yaml: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.1" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index b135c4d8..1849cce3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -28,7 +28,7 @@ dependencies: background_downloader: ^5.4.4 community_charts_flutter: ^1.0.1 open_filex: ^4.3.2 - file_picker: ^5.2.7 + file_picker: ^5.2.9 animations: ^2.0.7 flutter_local_notifications: ^13.0.0 notifications_listener_service: From aec46ae281815409ce7de3c5a4b0fe85d256f8cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 20:05:51 +0000 Subject: [PATCH 26/33] Bump background_downloader from 5.4.4 to 5.4.5 Bumps [background_downloader](https://github.com/781flyingdutchman/background_downloader) from 5.4.4 to 5.4.5. - [Release notes](https://github.com/781flyingdutchman/background_downloader/releases) - [Changelog](https://github.com/781flyingdutchman/background_downloader/blob/main/CHANGELOG.md) - [Commits](https://github.com/781flyingdutchman/background_downloader/compare/V5.4.4...V5.4.5) --- updated-dependencies: - dependency-name: background_downloader dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 431 ++++++++++++++++++--------------------------------- pubspec.yaml | 2 +- 2 files changed, 148 insertions(+), 285 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 2deb2797..e4180f0f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,312 +5,273 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: a36ec4843dc30ea6bf652bf25e3448db6c5e8bcf4aa55f063a5d1dad216d8214 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "58.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: cc4242565347e98424ce9945c819c192ec0838cb9d1f6aa4a97cc96becbc5b27 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "5.10.0" animations: dependency: "direct main" description: name: animations - sha256: fe8a6bdca435f718bb1dc8a11661b2c22504c6da40ef934cee8327ed77934164 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.7" archive: dependency: transitive description: name: archive - sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.3.7" args: dependency: transitive description: name: args - sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.4.0" async: dependency: transitive description: name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.10.0" background_downloader: dependency: "direct main" description: name: background_downloader - sha256: "650acae252591a421ba1e5aaa77fb09245928b6cf3a0fef34af8c2a423d1ea5b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "5.4.4" + version: "5.4.5" badges: dependency: "direct main" description: name: badges - sha256: "183514a2d7716297abd19d19ebe8bf667fb89c5739eaec58c6210f3631444206" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "3.1.0" + version: "3.1.1" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" build: dependency: transitive description: name: build - sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.3.1" build_config: dependency: transitive description: name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.1" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" build_runner: dependency: "direct dev" description: name: build_runner - sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.3.3" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "7.2.7" built_collection: dependency: transitive description: name: built_collection - sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - sha256: "31b7c748fd4b9adf8d25d72a4c4a59ef119f12876cf414f94f8af5131d5fa2b0" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "8.4.4" characters: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.1" checked_yaml: dependency: transitive description: name: checked_yaml - sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.2" chopper: dependency: "direct main" description: name: chopper - sha256: b2645618fa760df06d7609c96b092d7b3e7a8f23639d34269f62f45a5edabc7d - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.1" chopper_generator: dependency: "direct dev" description: name: chopper_generator - sha256: "62360a1a3536645aaee030dd7719089838a478682867d46dbcf30a3c0e5305b4" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.0.0" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.4.0" collection: dependency: "direct main" description: name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.17.0" community_charts_common: dependency: transitive description: name: community_charts_common - sha256: bcda2831d8c3225036102dff007e2a901a2fdfcbba604e10c78db3fe5d9362a5 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" community_charts_flutter: dependency: "direct main" description: name: community_charts_flutter - sha256: "2294cba46b67659109b665f2d9ffeffef93bb1540a5e7a7bcf2630b809a9363e" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" convert: dependency: transitive description: name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.1" crypto: dependency: transitive description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.2" csslib: dependency: transitive description: name: csslib - sha256: b36c7f7e24c0bdf1bf9a3da461c837d1de64b9f8beb190c9011d8c72a3dfd745 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.17.2" dart_style: dependency: transitive description: name: dart_style - sha256: "6d691edde054969f0e0f26abb1b30834b5138b963793e56f69d3a9a4435e6352" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.3.0" dbus: dependency: transitive description: name: dbus - sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.7.8" device_apps: dependency: "direct main" description: name: device_apps - sha256: e84dc74d55749993fd671148cc0bd53096e1be0c268fc364285511b1d8a4c19b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" equatable: dependency: transitive description: name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.5" fake_async: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" file: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.4" file_picker: dependency: "direct main" description: name: file_picker - sha256: "0d923fb610d0abf67f2149c3a50ef85f78bebecfc4d645719ca70bcf4abc788f" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "5.2.7" + version: "5.2.9" filesize: dependency: "direct main" description: name: filesize - sha256: f53df1f27ff60e466eefcd9df239e02d4722d5e2debee92a87dfd99ac66de2af - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" fixnum: dependency: transitive description: name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.0" flutter: @@ -322,32 +283,28 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" flutter_local_notifications: dependency: "direct main" description: name: flutter_local_notifications - sha256: "293995f94e120c8afce768981bd1fa9c5d6de67c547568e3b42ae2defdcbb4a0" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "13.0.0" flutter_local_notifications_linux: dependency: transitive description: name: flutter_local_notifications_linux - sha256: ccb08b93703aeedb58856e5637450bf3ffec899adb66dc325630b68994734b89 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.0+1" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "5ec1feac5f7f7d9266759488bc5f76416152baba9aa1b26fe572246caa00d1ab" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.0.0" flutter_localizations: @@ -359,72 +316,63 @@ packages: dependency: "direct dev" description: name: flutter_native_splash - sha256: af665ef80a213a9ed502845a3d7a61b9acca4100ee7e9f067a7440bc3acd6730 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.19" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: c224ac897bed083dabf11f238dd11a239809b446740be0c2044608c50029ffdf - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.9" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage - sha256: "98352186ee7ad3639ccc77ad7924b773ff6883076ab952437d20f18a61f0a7c5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "8.0.0" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - sha256: "0912ae29a572230ad52d8a4697e5518d7f0f429052fd51df7e5a7952c7efe2a3" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.3" flutter_secure_storage_macos: dependency: transitive description: name: flutter_secure_storage_macos - sha256: "083add01847fc1c80a07a08e1ed6927e9acd9618a35e330239d4422cd2a58c50" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.0" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: b3773190e385a3c8a382007893d678ae95462b3c2279e987b55d140d3b0cb81b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - sha256: "42938e70d4b872e856e678c423cc0e9065d7d294f45bc41fc1981a4eb4beaffe" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: fc2910ec9b28d60598216c29ea763b3a96c401f0ce1d13cdf69ccb0e5c93c3ee - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.0" flutter_svg: dependency: "direct main" description: name: flutter_svg - sha256: f991fdb1533c3caeee0cdc14b04f50f0c3916f0dbcbc05237ccbe4e3c6b93f3f - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.5" flutter_test: @@ -441,184 +389,161 @@ packages: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.2.0" glob: dependency: transitive description: name: glob - sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" graphs: dependency: transitive description: name: graphs - sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" html: dependency: transitive description: name: html - sha256: "79d498e6d6761925a34ee5ea8fa6dfef38607781d2fa91e37523474282af55cb" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.15.2" http: dependency: transitive description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.13.5" http_multi_server: dependency: transitive description: name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.0.2" image: dependency: transitive description: name: image - sha256: "483a389d6ccb292b570c31b3a193779b1b0178e7eb571986d9a49904b6861227" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.0.15" infinite_scroll_pagination: dependency: "direct main" description: name: infinite_scroll_pagination - sha256: "9517328f4e373f08f57dbb11c5aac5b05554142024d6b60c903f3b73476d52db" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.2.0" intl: dependency: "direct main" description: name: intl - sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.17.0" io: dependency: transitive description: name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.4" js: dependency: transitive description: name: js - sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.6.5" json_annotation: dependency: "direct main" description: name: json_annotation - sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.8.0" json_serializable: dependency: "direct dev" description: name: json_serializable - sha256: dadc08bd61f72559f938dd08ec20dbfec6c709bba83515085ea943d2078d187a - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.6.1" lints: dependency: transitive description: name: lints - sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" localstore: dependency: transitive description: name: localstore - sha256: "42a0afb7696cfab1b4bd7d08355b4ee01f975fd364553b28d51496eccaf11cce" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.5" logging: dependency: transitive description: name: logging - sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" markdown: dependency: transitive description: name: markdown - sha256: d95a9d12954aafc97f984ca29baaa7690ed4d9ec4140a23ad40580bcdb6c87f5 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "7.0.2" matcher: dependency: transitive description: name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.2.0" meta: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.8.0" mime: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.4" nested: dependency: transitive description: name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.0" notifications_listener_service: @@ -634,232 +559,203 @@ packages: dependency: "direct main" description: name: open_filex - sha256: "854aefd72dfd74219dc8c8d1767c34ec1eae64b8399a5be317bddb1ec2108915" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.3.2" package_config: dependency: transitive description: name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.8.2" path_parsing: dependency: transitive description: name: path_parsing - sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" path_provider: dependency: "direct main" description: name: path_provider - sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.14" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "019f18c9c10ae370b08dce1f3e3b73bc9f58e7f087bb5e921f06529438ac0ae7" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.0.24" + version: "2.0.25" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: ad4c4d011830462633f03eb34445a45345673dfd4faf1ab0b4735fbd93b19183 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.2" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.10" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.6" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.5" petitparser: dependency: transitive description: name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "5.1.0" platform: dependency: transitive description: name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.4" pointycastle: dependency: transitive description: name: pointycastle - sha256: c3120a968135aead39699267f4c74bc9a08e4e909e86bc1b0af5bfd78691123c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "3.7.2" + version: "3.7.3" pool: dependency: transitive description: name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.5.1" process: dependency: transitive description: name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.2.4" provider: dependency: "direct main" description: name: provider - sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.0.5" pub_semver: dependency: transitive description: name: pub_semver - sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.3" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: ec85d7d55339d85f44ec2b682a82fea340071e8978257e5a43e69f79e98ef50c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.2" recase: dependency: transitive description: name: recase - sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.1.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "858aaa72d8f61637d64e776aca82e1c67e6d9ee07979123c5d17115031c1b13b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8304d8a1f7d21a429f91dee552792249362b68a331ac5c3c1caf370f658873f6" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.2" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "0c1c16c56c9708aa9c361541a6f0e5cc6fc12a3232d866a687a7b7db30032b07" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.1" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9d387433ca65717bbf1be88f4d5bb18f10508917a8fa2fb02e0fd0d7479a9afa" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: fb5cf25c0235df2d0640ac1b1174f6466bd311f621574997ac59018a6664548d - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "74083203a8eae241e0de4a0d597dbedab3b8fef5563f33cf3c12d7e93c655ca5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "5e588e2efef56916a3b229c3bfe81e6a525665a454519ca51dbcc4236a274173" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" shelf: dependency: transitive description: name: shelf - sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.4.0" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.3" sky_engine: @@ -871,264 +767,231 @@ packages: dependency: transitive description: name: sliver_tools - sha256: ccdc502098a8bfa07b3ec582c282620031481300035584e1bb3aca296a505e8c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.2.10" source_gen: dependency: transitive description: name: source_gen - sha256: c2bea18c95cfa0276a366270afaa2850b09b4a76db95d546f3d003dcc7011298 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.7" source_helper: dependency: transitive description: name: source_helper - sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.3" source_span: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.0" swagger_dart_code_generator: dependency: "direct dev" description: name: swagger_dart_code_generator - sha256: b7ca5ee87fb678a216f261f711b013ad935448d0d32f655b04e5ed87f09a81a8 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.10.3" + version: "2.10.4" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.4.16" timezone: dependency: transitive description: name: timezone - sha256: "24c8fcdd49a805d95777a39064862133ff816ebfffe0ceff110fb5960e557964" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.9.1" timing: dependency: transitive description: name: timing - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.1" universal_io: dependency: transitive description: name: universal_io - sha256: "06866290206d196064fd61df4c7aea1ffe9a4e7c4ccaa8fcded42dd41948005d" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" url_launcher: dependency: "direct main" description: name: url_launcher - sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.10" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: dd729390aa936bf1bdf5cd1bc7468ff340263f80a2c4f569416507667de8e3c8 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "6.0.26" + version: "6.0.27" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.4" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "206fb8334a700ef7754d6a9ed119e7349bc830448098f21a69bf1b4ed038cabc" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.4" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "0ef2b4f97942a16523e51256b799e9aa1843da6c60c55eefbfa9dbc2dcb8331a" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "3.0.4" + version: "3.0.5" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.16" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: a83ba3607a507758669cfafb03f9de09bf6e6280c14d9b9cb18f013e406dcacd - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.5" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: ea8d3fc7b2e0f35de38a7465063ecfcf03d8217f7962aa2a6717132cb5d43a79 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: a5eaa5d19e123ad4f61c3718ca1ed921c4e6254238d9145f82aa214955d9aced - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "15edc42f7eaa478ce854eaf1fbb9062a899c0e4e56e775dd73b7f4709c97c4ca" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" vector_math: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.4" watcher: dependency: transitive description: name: watcher - sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.2" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.4.0" win32: dependency: transitive description: name: win32 - sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.4" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.2.0+3" xml: dependency: transitive description: name: xml - sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.2.2" yaml: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.1" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index b135c4d8..6071c4b9 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: infinite_scroll_pagination: ^3.2.0 badges: ^3.1.0 filesize: ^2.0.1 - background_downloader: ^5.4.4 + background_downloader: ^5.4.5 community_charts_flutter: ^1.0.1 open_filex: ^4.3.2 file_picker: ^5.2.7 From 18179a171dc4556a34952e9c565fefe8f29d3286 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 20:06:06 +0000 Subject: [PATCH 27/33] Bump badges from 3.1.0 to 3.1.1 Bumps [badges](https://github.com/yako-dev/flutter_badges) from 3.1.0 to 3.1.1. - [Release notes](https://github.com/yako-dev/flutter_badges/releases) - [Changelog](https://github.com/yako-dev/flutter_badges/blob/master/CHANGELOG.md) - [Commits](https://github.com/yako-dev/flutter_badges/commits) --- updated-dependencies: - dependency-name: badges dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 431 ++++++++++++++++++--------------------------------- pubspec.yaml | 2 +- 2 files changed, 148 insertions(+), 285 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 2deb2797..e4180f0f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,312 +5,273 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: a36ec4843dc30ea6bf652bf25e3448db6c5e8bcf4aa55f063a5d1dad216d8214 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "58.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: cc4242565347e98424ce9945c819c192ec0838cb9d1f6aa4a97cc96becbc5b27 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "5.10.0" animations: dependency: "direct main" description: name: animations - sha256: fe8a6bdca435f718bb1dc8a11661b2c22504c6da40ef934cee8327ed77934164 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.7" archive: dependency: transitive description: name: archive - sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.3.7" args: dependency: transitive description: name: args - sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.4.0" async: dependency: transitive description: name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.10.0" background_downloader: dependency: "direct main" description: name: background_downloader - sha256: "650acae252591a421ba1e5aaa77fb09245928b6cf3a0fef34af8c2a423d1ea5b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "5.4.4" + version: "5.4.5" badges: dependency: "direct main" description: name: badges - sha256: "183514a2d7716297abd19d19ebe8bf667fb89c5739eaec58c6210f3631444206" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "3.1.0" + version: "3.1.1" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" build: dependency: transitive description: name: build - sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.3.1" build_config: dependency: transitive description: name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.1" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" build_runner: dependency: "direct dev" description: name: build_runner - sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.3.3" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "7.2.7" built_collection: dependency: transitive description: name: built_collection - sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - sha256: "31b7c748fd4b9adf8d25d72a4c4a59ef119f12876cf414f94f8af5131d5fa2b0" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "8.4.4" characters: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.1" checked_yaml: dependency: transitive description: name: checked_yaml - sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.2" chopper: dependency: "direct main" description: name: chopper - sha256: b2645618fa760df06d7609c96b092d7b3e7a8f23639d34269f62f45a5edabc7d - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.1" chopper_generator: dependency: "direct dev" description: name: chopper_generator - sha256: "62360a1a3536645aaee030dd7719089838a478682867d46dbcf30a3c0e5305b4" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.0.0" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.4.0" collection: dependency: "direct main" description: name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.17.0" community_charts_common: dependency: transitive description: name: community_charts_common - sha256: bcda2831d8c3225036102dff007e2a901a2fdfcbba604e10c78db3fe5d9362a5 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" community_charts_flutter: dependency: "direct main" description: name: community_charts_flutter - sha256: "2294cba46b67659109b665f2d9ffeffef93bb1540a5e7a7bcf2630b809a9363e" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" convert: dependency: transitive description: name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.1" crypto: dependency: transitive description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.2" csslib: dependency: transitive description: name: csslib - sha256: b36c7f7e24c0bdf1bf9a3da461c837d1de64b9f8beb190c9011d8c72a3dfd745 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.17.2" dart_style: dependency: transitive description: name: dart_style - sha256: "6d691edde054969f0e0f26abb1b30834b5138b963793e56f69d3a9a4435e6352" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.3.0" dbus: dependency: transitive description: name: dbus - sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.7.8" device_apps: dependency: "direct main" description: name: device_apps - sha256: e84dc74d55749993fd671148cc0bd53096e1be0c268fc364285511b1d8a4c19b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" equatable: dependency: transitive description: name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.5" fake_async: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" file: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.4" file_picker: dependency: "direct main" description: name: file_picker - sha256: "0d923fb610d0abf67f2149c3a50ef85f78bebecfc4d645719ca70bcf4abc788f" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "5.2.7" + version: "5.2.9" filesize: dependency: "direct main" description: name: filesize - sha256: f53df1f27ff60e466eefcd9df239e02d4722d5e2debee92a87dfd99ac66de2af - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" fixnum: dependency: transitive description: name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.0" flutter: @@ -322,32 +283,28 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" flutter_local_notifications: dependency: "direct main" description: name: flutter_local_notifications - sha256: "293995f94e120c8afce768981bd1fa9c5d6de67c547568e3b42ae2defdcbb4a0" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "13.0.0" flutter_local_notifications_linux: dependency: transitive description: name: flutter_local_notifications_linux - sha256: ccb08b93703aeedb58856e5637450bf3ffec899adb66dc325630b68994734b89 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.0+1" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "5ec1feac5f7f7d9266759488bc5f76416152baba9aa1b26fe572246caa00d1ab" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.0.0" flutter_localizations: @@ -359,72 +316,63 @@ packages: dependency: "direct dev" description: name: flutter_native_splash - sha256: af665ef80a213a9ed502845a3d7a61b9acca4100ee7e9f067a7440bc3acd6730 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.19" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: c224ac897bed083dabf11f238dd11a239809b446740be0c2044608c50029ffdf - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.9" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage - sha256: "98352186ee7ad3639ccc77ad7924b773ff6883076ab952437d20f18a61f0a7c5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "8.0.0" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - sha256: "0912ae29a572230ad52d8a4697e5518d7f0f429052fd51df7e5a7952c7efe2a3" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.3" flutter_secure_storage_macos: dependency: transitive description: name: flutter_secure_storage_macos - sha256: "083add01847fc1c80a07a08e1ed6927e9acd9618a35e330239d4422cd2a58c50" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.0" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: b3773190e385a3c8a382007893d678ae95462b3c2279e987b55d140d3b0cb81b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - sha256: "42938e70d4b872e856e678c423cc0e9065d7d294f45bc41fc1981a4eb4beaffe" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: fc2910ec9b28d60598216c29ea763b3a96c401f0ce1d13cdf69ccb0e5c93c3ee - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.0" flutter_svg: dependency: "direct main" description: name: flutter_svg - sha256: f991fdb1533c3caeee0cdc14b04f50f0c3916f0dbcbc05237ccbe4e3c6b93f3f - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.5" flutter_test: @@ -441,184 +389,161 @@ packages: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.2.0" glob: dependency: transitive description: name: glob - sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" graphs: dependency: transitive description: name: graphs - sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" html: dependency: transitive description: name: html - sha256: "79d498e6d6761925a34ee5ea8fa6dfef38607781d2fa91e37523474282af55cb" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.15.2" http: dependency: transitive description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.13.5" http_multi_server: dependency: transitive description: name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.0.2" image: dependency: transitive description: name: image - sha256: "483a389d6ccb292b570c31b3a193779b1b0178e7eb571986d9a49904b6861227" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.0.15" infinite_scroll_pagination: dependency: "direct main" description: name: infinite_scroll_pagination - sha256: "9517328f4e373f08f57dbb11c5aac5b05554142024d6b60c903f3b73476d52db" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.2.0" intl: dependency: "direct main" description: name: intl - sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.17.0" io: dependency: transitive description: name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.4" js: dependency: transitive description: name: js - sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.6.5" json_annotation: dependency: "direct main" description: name: json_annotation - sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.8.0" json_serializable: dependency: "direct dev" description: name: json_serializable - sha256: dadc08bd61f72559f938dd08ec20dbfec6c709bba83515085ea943d2078d187a - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.6.1" lints: dependency: transitive description: name: lints - sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" localstore: dependency: transitive description: name: localstore - sha256: "42a0afb7696cfab1b4bd7d08355b4ee01f975fd364553b28d51496eccaf11cce" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.5" logging: dependency: transitive description: name: logging - sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" markdown: dependency: transitive description: name: markdown - sha256: d95a9d12954aafc97f984ca29baaa7690ed4d9ec4140a23ad40580bcdb6c87f5 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "7.0.2" matcher: dependency: transitive description: name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.2.0" meta: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.8.0" mime: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.4" nested: dependency: transitive description: name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.0" notifications_listener_service: @@ -634,232 +559,203 @@ packages: dependency: "direct main" description: name: open_filex - sha256: "854aefd72dfd74219dc8c8d1767c34ec1eae64b8399a5be317bddb1ec2108915" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.3.2" package_config: dependency: transitive description: name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.8.2" path_parsing: dependency: transitive description: name: path_parsing - sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" path_provider: dependency: "direct main" description: name: path_provider - sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.14" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "019f18c9c10ae370b08dce1f3e3b73bc9f58e7f087bb5e921f06529438ac0ae7" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.0.24" + version: "2.0.25" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: ad4c4d011830462633f03eb34445a45345673dfd4faf1ab0b4735fbd93b19183 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.2" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.10" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.6" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.5" petitparser: dependency: transitive description: name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "5.1.0" platform: dependency: transitive description: name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.4" pointycastle: dependency: transitive description: name: pointycastle - sha256: c3120a968135aead39699267f4c74bc9a08e4e909e86bc1b0af5bfd78691123c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "3.7.2" + version: "3.7.3" pool: dependency: transitive description: name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.5.1" process: dependency: transitive description: name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.2.4" provider: dependency: "direct main" description: name: provider - sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.0.5" pub_semver: dependency: transitive description: name: pub_semver - sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.3" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: ec85d7d55339d85f44ec2b682a82fea340071e8978257e5a43e69f79e98ef50c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.2" recase: dependency: transitive description: name: recase - sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.1.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "858aaa72d8f61637d64e776aca82e1c67e6d9ee07979123c5d17115031c1b13b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8304d8a1f7d21a429f91dee552792249362b68a331ac5c3c1caf370f658873f6" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.2" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "0c1c16c56c9708aa9c361541a6f0e5cc6fc12a3232d866a687a7b7db30032b07" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.1" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9d387433ca65717bbf1be88f4d5bb18f10508917a8fa2fb02e0fd0d7479a9afa" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: fb5cf25c0235df2d0640ac1b1174f6466bd311f621574997ac59018a6664548d - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "74083203a8eae241e0de4a0d597dbedab3b8fef5563f33cf3c12d7e93c655ca5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "5e588e2efef56916a3b229c3bfe81e6a525665a454519ca51dbcc4236a274173" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" shelf: dependency: transitive description: name: shelf - sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.4.0" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.3" sky_engine: @@ -871,264 +767,231 @@ packages: dependency: transitive description: name: sliver_tools - sha256: ccdc502098a8bfa07b3ec582c282620031481300035584e1bb3aca296a505e8c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.2.10" source_gen: dependency: transitive description: name: source_gen - sha256: c2bea18c95cfa0276a366270afaa2850b09b4a76db95d546f3d003dcc7011298 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.7" source_helper: dependency: transitive description: name: source_helper - sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.3" source_span: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.0" swagger_dart_code_generator: dependency: "direct dev" description: name: swagger_dart_code_generator - sha256: b7ca5ee87fb678a216f261f711b013ad935448d0d32f655b04e5ed87f09a81a8 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.10.3" + version: "2.10.4" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.4.16" timezone: dependency: transitive description: name: timezone - sha256: "24c8fcdd49a805d95777a39064862133ff816ebfffe0ceff110fb5960e557964" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.9.1" timing: dependency: transitive description: name: timing - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.1" universal_io: dependency: transitive description: name: universal_io - sha256: "06866290206d196064fd61df4c7aea1ffe9a4e7c4ccaa8fcded42dd41948005d" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" url_launcher: dependency: "direct main" description: name: url_launcher - sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.10" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: dd729390aa936bf1bdf5cd1bc7468ff340263f80a2c4f569416507667de8e3c8 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "6.0.26" + version: "6.0.27" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.4" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "206fb8334a700ef7754d6a9ed119e7349bc830448098f21a69bf1b4ed038cabc" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.4" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "0ef2b4f97942a16523e51256b799e9aa1843da6c60c55eefbfa9dbc2dcb8331a" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "3.0.4" + version: "3.0.5" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.16" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: a83ba3607a507758669cfafb03f9de09bf6e6280c14d9b9cb18f013e406dcacd - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.5" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: ea8d3fc7b2e0f35de38a7465063ecfcf03d8217f7962aa2a6717132cb5d43a79 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: a5eaa5d19e123ad4f61c3718ca1ed921c4e6254238d9145f82aa214955d9aced - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "15edc42f7eaa478ce854eaf1fbb9062a899c0e4e56e775dd73b7f4709c97c4ca" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" vector_math: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.4" watcher: dependency: transitive description: name: watcher - sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.2" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.4.0" win32: dependency: transitive description: name: win32 - sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.4" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.2.0+3" xml: dependency: transitive description: name: xml - sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.2.2" yaml: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.1" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index b135c4d8..c7840c62 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: flutter_svg: ^2.0.5 url_launcher: ^6.1.8 infinite_scroll_pagination: ^3.2.0 - badges: ^3.1.0 + badges: ^3.1.1 filesize: ^2.0.1 background_downloader: ^5.4.4 community_charts_flutter: ^1.0.1 From da00331547d088af0c49fd13d76585d2f49a69a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Apr 2023 20:06:24 +0000 Subject: [PATCH 28/33] Bump swagger_dart_code_generator from 2.10.3 to 2.10.4 Bumps [swagger_dart_code_generator](https://github.com/epam-cross-platform-lab/swagger-dart-code-generator) from 2.10.3 to 2.10.4. - [Release notes](https://github.com/epam-cross-platform-lab/swagger-dart-code-generator/releases) - [Changelog](https://github.com/epam-cross-platform-lab/swagger-dart-code-generator/blob/master/CHANGELOG.md) - [Commits](https://github.com/epam-cross-platform-lab/swagger-dart-code-generator/commits) --- updated-dependencies: - dependency-name: swagger_dart_code_generator dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pubspec.lock | 431 ++++++++++++++++++--------------------------------- pubspec.yaml | 2 +- 2 files changed, 148 insertions(+), 285 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 2deb2797..e4180f0f 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,312 +5,273 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: a36ec4843dc30ea6bf652bf25e3448db6c5e8bcf4aa55f063a5d1dad216d8214 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "58.0.0" analyzer: dependency: transitive description: name: analyzer - sha256: cc4242565347e98424ce9945c819c192ec0838cb9d1f6aa4a97cc96becbc5b27 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "5.10.0" animations: dependency: "direct main" description: name: animations - sha256: fe8a6bdca435f718bb1dc8a11661b2c22504c6da40ef934cee8327ed77934164 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.7" archive: dependency: transitive description: name: archive - sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.3.7" args: dependency: transitive description: name: args - sha256: "4cab82a83ffef80b262ddedf47a0a8e56ee6fbf7fe21e6e768b02792034dd440" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.4.0" async: dependency: transitive description: name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.10.0" background_downloader: dependency: "direct main" description: name: background_downloader - sha256: "650acae252591a421ba1e5aaa77fb09245928b6cf3a0fef34af8c2a423d1ea5b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "5.4.4" + version: "5.4.5" badges: dependency: "direct main" description: name: badges - sha256: "183514a2d7716297abd19d19ebe8bf667fb89c5739eaec58c6210f3631444206" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "3.1.0" + version: "3.1.1" boolean_selector: dependency: transitive description: name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" build: dependency: transitive description: name: build - sha256: "3fbda25365741f8251b39f3917fb3c8e286a96fd068a5a242e11c2012d495777" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.3.1" build_config: dependency: transitive description: name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" build_daemon: dependency: transitive description: name: build_daemon - sha256: "757153e5d9cd88253cb13f28c2fb55a537dc31fefd98137549895b5beb7c6169" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.1" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: db49b8609ef8c81cca2b310618c3017c00f03a92af44c04d310b907b2d692d95 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" build_runner: dependency: "direct dev" description: name: build_runner - sha256: b0a8a7b8a76c493e85f1b84bffa0588859a06197863dba8c9036b15581fd9727 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.3.3" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: "14febe0f5bac5ae474117a36099b4de6f1dbc52df6c5e55534b3da9591bf4292" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "7.2.7" built_collection: dependency: transitive description: name: built_collection - sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "5.1.1" built_value: dependency: transitive description: name: built_value - sha256: "31b7c748fd4b9adf8d25d72a4c4a59ef119f12876cf414f94f8af5131d5fa2b0" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "8.4.4" characters: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.1" checked_yaml: dependency: transitive description: name: checked_yaml - sha256: "3d1505d91afa809d177efd4eed5bb0eb65805097a1463abdd2add076effae311" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.2" chopper: dependency: "direct main" description: name: chopper - sha256: b2645618fa760df06d7609c96b092d7b3e7a8f23639d34269f62f45a5edabc7d - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.1" chopper_generator: dependency: "direct dev" description: name: chopper_generator - sha256: "62360a1a3536645aaee030dd7719089838a478682867d46dbcf30a3c0e5305b4" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.0.0" clock: dependency: transitive description: name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" code_builder: dependency: transitive description: name: code_builder - sha256: "0d43dd1288fd145de1ecc9a3948ad4a6d5a82f0a14c4fdd0892260787d975cbe" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.4.0" collection: dependency: "direct main" description: name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.17.0" community_charts_common: dependency: transitive description: name: community_charts_common - sha256: bcda2831d8c3225036102dff007e2a901a2fdfcbba604e10c78db3fe5d9362a5 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" community_charts_flutter: dependency: "direct main" description: name: community_charts_flutter - sha256: "2294cba46b67659109b665f2d9ffeffef93bb1540a5e7a7bcf2630b809a9363e" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" convert: dependency: transitive description: name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.1" crypto: dependency: transitive description: name: crypto - sha256: aa274aa7774f8964e4f4f38cc994db7b6158dd36e9187aaceaddc994b35c6c67 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.2" csslib: dependency: transitive description: name: csslib - sha256: b36c7f7e24c0bdf1bf9a3da461c837d1de64b9f8beb190c9011d8c72a3dfd745 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.17.2" dart_style: dependency: transitive description: name: dart_style - sha256: "6d691edde054969f0e0f26abb1b30834b5138b963793e56f69d3a9a4435e6352" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.3.0" dbus: dependency: transitive description: name: dbus - sha256: "6f07cba3f7b3448d42d015bfd3d53fe12e5b36da2423f23838efc1d5fb31a263" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.7.8" device_apps: dependency: "direct main" description: name: device_apps - sha256: e84dc74d55749993fd671148cc0bd53096e1be0c268fc364285511b1d8a4c19b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" equatable: dependency: transitive description: name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.5" fake_async: dependency: transitive description: name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.1" ffi: dependency: transitive description: name: ffi - sha256: a38574032c5f1dd06c4aee541789906c12ccaab8ba01446e800d9c5b79c4a978 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" file: dependency: transitive description: name: file - sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.4" file_picker: dependency: "direct main" description: name: file_picker - sha256: "0d923fb610d0abf67f2149c3a50ef85f78bebecfc4d645719ca70bcf4abc788f" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "5.2.7" + version: "5.2.9" filesize: dependency: "direct main" description: name: filesize - sha256: f53df1f27ff60e466eefcd9df239e02d4722d5e2debee92a87dfd99ac66de2af - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" fixnum: dependency: transitive description: name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.0" flutter: @@ -322,32 +283,28 @@ packages: dependency: "direct dev" description: name: flutter_lints - sha256: aeb0b80a8b3709709c9cc496cdc027c5b3216796bc0af0ce1007eaf24464fd4c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" flutter_local_notifications: dependency: "direct main" description: name: flutter_local_notifications - sha256: "293995f94e120c8afce768981bd1fa9c5d6de67c547568e3b42ae2defdcbb4a0" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "13.0.0" flutter_local_notifications_linux: dependency: transitive description: name: flutter_local_notifications_linux - sha256: ccb08b93703aeedb58856e5637450bf3ffec899adb66dc325630b68994734b89 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.0+1" flutter_local_notifications_platform_interface: dependency: transitive description: name: flutter_local_notifications_platform_interface - sha256: "5ec1feac5f7f7d9266759488bc5f76416152baba9aa1b26fe572246caa00d1ab" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.0.0" flutter_localizations: @@ -359,72 +316,63 @@ packages: dependency: "direct dev" description: name: flutter_native_splash - sha256: af665ef80a213a9ed502845a3d7a61b9acca4100ee7e9f067a7440bc3acd6730 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.19" flutter_plugin_android_lifecycle: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: c224ac897bed083dabf11f238dd11a239809b446740be0c2044608c50029ffdf - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.9" flutter_secure_storage: dependency: "direct main" description: name: flutter_secure_storage - sha256: "98352186ee7ad3639ccc77ad7924b773ff6883076ab952437d20f18a61f0a7c5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "8.0.0" flutter_secure_storage_linux: dependency: transitive description: name: flutter_secure_storage_linux - sha256: "0912ae29a572230ad52d8a4697e5518d7f0f429052fd51df7e5a7952c7efe2a3" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.3" flutter_secure_storage_macos: dependency: transitive description: name: flutter_secure_storage_macos - sha256: "083add01847fc1c80a07a08e1ed6927e9acd9618a35e330239d4422cd2a58c50" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.0" flutter_secure_storage_platform_interface: dependency: transitive description: name: flutter_secure_storage_platform_interface - sha256: b3773190e385a3c8a382007893d678ae95462b3c2279e987b55d140d3b0cb81b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" flutter_secure_storage_web: dependency: transitive description: name: flutter_secure_storage_web - sha256: "42938e70d4b872e856e678c423cc0e9065d7d294f45bc41fc1981a4eb4beaffe" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" flutter_secure_storage_windows: dependency: transitive description: name: flutter_secure_storage_windows - sha256: fc2910ec9b28d60598216c29ea763b3a96c401f0ce1d13cdf69ccb0e5c93c3ee - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.0" flutter_svg: dependency: "direct main" description: name: flutter_svg - sha256: f991fdb1533c3caeee0cdc14b04f50f0c3916f0dbcbc05237ccbe4e3c6b93f3f - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.5" flutter_test: @@ -441,184 +389,161 @@ packages: dependency: transitive description: name: frontend_server_client - sha256: "408e3ca148b31c20282ad6f37ebfa6f4bdc8fede5b74bc2f08d9d92b55db3612" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.2.0" glob: dependency: transitive description: name: glob - sha256: "4515b5b6ddb505ebdd242a5f2cc5d22d3d6a80013789debfbda7777f47ea308c" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" graphs: dependency: transitive description: name: graphs - sha256: f9e130f3259f52d26f0cfc0e964513796dafed572fa52e45d2f8d6ca14db39b2 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" html: dependency: transitive description: name: html - sha256: "79d498e6d6761925a34ee5ea8fa6dfef38607781d2fa91e37523474282af55cb" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.15.2" http: dependency: transitive description: name: http - sha256: "6aa2946395183537c8b880962d935877325d6a09a2867c3970c05c0fed6ac482" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.13.5" http_multi_server: dependency: transitive description: name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.2.1" http_parser: dependency: transitive description: name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.0.2" image: dependency: transitive description: name: image - sha256: "483a389d6ccb292b570c31b3a193779b1b0178e7eb571986d9a49904b6861227" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.0.15" infinite_scroll_pagination: dependency: "direct main" description: name: infinite_scroll_pagination - sha256: "9517328f4e373f08f57dbb11c5aac5b05554142024d6b60c903f3b73476d52db" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.2.0" intl: dependency: "direct main" description: name: intl - sha256: "910f85bce16fb5c6f614e117efa303e85a1731bb0081edf3604a2ae6e9a3cc91" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.17.0" io: dependency: transitive description: name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.4" js: dependency: transitive description: name: js - sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.6.5" json_annotation: dependency: "direct main" description: name: json_annotation - sha256: c33da08e136c3df0190bd5bbe51ae1df4a7d96e7954d1d7249fea2968a72d317 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.8.0" json_serializable: dependency: "direct dev" description: name: json_serializable - sha256: dadc08bd61f72559f938dd08ec20dbfec6c709bba83515085ea943d2078d187a - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.6.1" lints: dependency: transitive description: name: lints - sha256: "5e4a9cd06d447758280a8ac2405101e0e2094d2a1dbdd3756aec3fe7775ba593" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.1" localstore: dependency: transitive description: name: localstore - sha256: "42a0afb7696cfab1b4bd7d08355b4ee01f975fd364553b28d51496eccaf11cce" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.5" logging: dependency: transitive description: name: logging - sha256: "04094f2eb032cbb06c6f6e8d3607edcfcb0455e2bb6cbc010cb01171dcb64e6d" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.1" markdown: dependency: transitive description: name: markdown - sha256: d95a9d12954aafc97f984ca29baaa7690ed4d9ec4140a23ad40580bcdb6c87f5 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "7.0.2" matcher: dependency: transitive description: name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.12.13" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.2.0" meta: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.8.0" mime: dependency: transitive description: name: mime - sha256: e4ff8e8564c03f255408decd16e7899da1733852a9110a58fe6d1b817684a63e - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.4" nested: dependency: transitive description: name: nested - sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.0" notifications_listener_service: @@ -634,232 +559,203 @@ packages: dependency: "direct main" description: name: open_filex - sha256: "854aefd72dfd74219dc8c8d1767c34ec1eae64b8399a5be317bddb1ec2108915" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.3.2" package_config: dependency: transitive description: name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" path: dependency: transitive description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.8.2" path_parsing: dependency: transitive description: name: path_parsing - sha256: e3e67b1629e6f7e8100b367d3db6ba6af4b1f0bb80f64db18ef1fbabd2fa9ccf - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" path_provider: dependency: "direct main" description: name: path_provider - sha256: c7edf82217d4b2952b2129a61d3ad60f1075b9299e629e149a8d2e39c2e6aad4 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.14" path_provider_android: dependency: transitive description: name: path_provider_android - sha256: "019f18c9c10ae370b08dce1f3e3b73bc9f58e7f087bb5e921f06529438ac0ae7" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.0.24" + version: "2.0.25" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: ad4c4d011830462633f03eb34445a45345673dfd4faf1ab0b4735fbd93b19183 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.2" path_provider_linux: dependency: transitive description: name: path_provider_linux - sha256: "2ae08f2216225427e64ad224a24354221c2c7907e448e6e0e8b57b1eb9f10ad1" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.10" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - sha256: "57585299a729335f1298b43245842678cb9f43a6310351b18fb577d6e33165ec" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.6" path_provider_windows: dependency: transitive description: name: path_provider_windows - sha256: f53720498d5a543f9607db4b0e997c4b5438884de25b0f73098cc2671a51b130 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.5" petitparser: dependency: transitive description: name: petitparser - sha256: "49392a45ced973e8d94a85fdb21293fbb40ba805fc49f2965101ae748a3683b4" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "5.1.0" platform: dependency: transitive description: name: platform - sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - sha256: "6a2128648c854906c53fa8e33986fc0247a1116122f9534dd20e3ab9e16a32bc" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.4" pointycastle: dependency: transitive description: name: pointycastle - sha256: c3120a968135aead39699267f4c74bc9a08e4e909e86bc1b0af5bfd78691123c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "3.7.2" + version: "3.7.3" pool: dependency: transitive description: name: pool - sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.5.1" process: dependency: transitive description: name: process - sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.2.4" provider: dependency: "direct main" description: name: provider - sha256: cdbe7530b12ecd9eb455bdaa2fcb8d4dad22e80b8afb4798b41479d5ce26847f - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.0.5" pub_semver: dependency: transitive description: name: pub_semver - sha256: "307de764d305289ff24ad257ad5c5793ce56d04947599ad68b3baa124105fc17" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.3" pubspec_parse: dependency: transitive description: name: pubspec_parse - sha256: ec85d7d55339d85f44ec2b682a82fea340071e8978257e5a43e69f79e98ef50c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.2" recase: dependency: transitive description: name: recase - sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "4.1.0" shared_preferences: dependency: "direct main" description: name: shared_preferences - sha256: "858aaa72d8f61637d64e776aca82e1c67e6d9ee07979123c5d17115031c1b13b" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" shared_preferences_android: dependency: transitive description: name: shared_preferences_android - sha256: "8304d8a1f7d21a429f91dee552792249362b68a331ac5c3c1caf370f658873f6" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.1.0" + version: "2.1.2" shared_preferences_foundation: dependency: transitive description: name: shared_preferences_foundation - sha256: "0c1c16c56c9708aa9c361541a6f0e5cc6fc12a3232d866a687a7b7db30032b07" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.1" shared_preferences_linux: dependency: transitive description: name: shared_preferences_linux - sha256: "9d387433ca65717bbf1be88f4d5bb18f10508917a8fa2fb02e0fd0d7479a9afa" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" shared_preferences_platform_interface: dependency: transitive description: name: shared_preferences_platform_interface - sha256: fb5cf25c0235df2d0640ac1b1174f6466bd311f621574997ac59018a6664548d - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" shared_preferences_web: dependency: transitive description: name: shared_preferences_web - sha256: "74083203a8eae241e0de4a0d597dbedab3b8fef5563f33cf3c12d7e93c655ca5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" shared_preferences_windows: dependency: transitive description: name: shared_preferences_windows - sha256: "5e588e2efef56916a3b229c3bfe81e6a525665a454519ca51dbcc4236a274173" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" shelf: dependency: transitive description: name: shelf - sha256: c24a96135a2ccd62c64b69315a14adc5c3419df63b4d7c05832a346fdb73682c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.4.0" shelf_web_socket: dependency: transitive description: name: shelf_web_socket - sha256: a988c0e8d8ffbdb8a28aa7ec8e449c260f3deb808781fe1284d22c5bba7156e8 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.3" sky_engine: @@ -871,264 +767,231 @@ packages: dependency: transitive description: name: sliver_tools - sha256: ccdc502098a8bfa07b3ec582c282620031481300035584e1bb3aca296a505e8c - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.2.10" source_gen: dependency: transitive description: name: source_gen - sha256: c2bea18c95cfa0276a366270afaa2850b09b4a76db95d546f3d003dcc7011298 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.7" source_helper: dependency: transitive description: name: source_helper - sha256: "3b67aade1d52416149c633ba1bb36df44d97c6b51830c2198e934e3fca87ca1f" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.3" source_span: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.1" stream_transform: dependency: transitive description: name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.0" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.0" swagger_dart_code_generator: dependency: "direct dev" description: name: swagger_dart_code_generator - sha256: b7ca5ee87fb678a216f261f711b013ad935448d0d32f655b04e5ed87f09a81a8 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.10.3" + version: "2.10.4" term_glyph: dependency: transitive description: name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.2.1" test_api: dependency: transitive description: name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.4.16" timezone: dependency: transitive description: name: timezone - sha256: "24c8fcdd49a805d95777a39064862133ff816ebfffe0ceff110fb5960e557964" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.9.1" timing: dependency: transitive description: name: timing - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.1" typed_data: dependency: transitive description: name: typed_data - sha256: "26f87ade979c47a150c9eaab93ccd2bebe70a27dc0b4b29517f2904f04eb11a5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.3.1" universal_io: dependency: transitive description: name: universal_io - sha256: "06866290206d196064fd61df4c7aea1ffe9a4e7c4ccaa8fcded42dd41948005d" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.2.0" url_launcher: dependency: "direct main" description: name: url_launcher - sha256: "75f2846facd11168d007529d6cd8fcb2b750186bea046af9711f10b907e1587e" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.10" url_launcher_android: dependency: transitive description: name: url_launcher_android - sha256: dd729390aa936bf1bdf5cd1bc7468ff340263f80a2c4f569416507667de8e3c8 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "6.0.26" + version: "6.0.27" url_launcher_ios: dependency: transitive description: name: url_launcher_ios - sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.1.4" url_launcher_linux: dependency: transitive description: name: url_launcher_linux - sha256: "206fb8334a700ef7754d6a9ed119e7349bc830448098f21a69bf1b4ed038cabc" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.4" url_launcher_macos: dependency: transitive description: name: url_launcher_macos - sha256: "0ef2b4f97942a16523e51256b799e9aa1843da6c60c55eefbfa9dbc2dcb8331a" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "3.0.4" + version: "3.0.5" url_launcher_platform_interface: dependency: transitive description: name: url_launcher_platform_interface - sha256: "6c9ca697a5ae218ce56cece69d46128169a58aa8653c1b01d26fcd4aad8c4370" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.2" url_launcher_web: dependency: transitive description: name: url_launcher_web - sha256: "81fe91b6c4f84f222d186a9d23c73157dc4c8e1c71489c4d08be1ad3b228f1aa" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.0.16" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: a83ba3607a507758669cfafb03f9de09bf6e6280c14d9b9cb18f013e406dcacd - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.0.5" vector_graphics: dependency: transitive description: name: vector_graphics - sha256: ea8d3fc7b2e0f35de38a7465063ecfcf03d8217f7962aa2a6717132cb5d43a79 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" vector_graphics_codec: dependency: transitive description: name: vector_graphics_codec - sha256: a5eaa5d19e123ad4f61c3718ca1ed921c4e6254238d9145f82aa214955d9aced - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" vector_graphics_compiler: dependency: transitive description: name: vector_graphics_compiler - sha256: "15edc42f7eaa478ce854eaf1fbb9062a899c0e4e56e775dd73b7f4709c97c4ca" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.1.5" vector_math: dependency: transitive description: name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "2.1.4" watcher: dependency: transitive description: name: watcher - sha256: "6a7f46926b01ce81bfc339da6a7f20afbe7733eff9846f6d6a5466aa4c6667c0" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "1.0.2" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: ca49c0bc209c687b887f30527fb6a9d80040b072cc2990f34b9bec3e7663101b - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted - version: "2.3.0" + version: "2.4.0" win32: dependency: transitive description: name: win32 - sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.4" xdg_directories: dependency: transitive description: name: xdg_directories - sha256: bd512f03919aac5f1313eb8249f223bacf4927031bf60b02601f81f687689e86 - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "0.2.0+3" xml: dependency: transitive description: name: xml - sha256: "979ee37d622dec6365e2efa4d906c37470995871fe9ae080d967e192d88286b5" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "6.2.2" yaml: dependency: transitive description: name: yaml - sha256: "23812a9b125b48d4007117254bca50abb6c712352927eece9e155207b1db2370" - url: "https://pub.dev" + url: "https://pub.dartlang.org" source: hosted version: "3.1.1" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index b135c4d8..ac3a5f47 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -44,7 +44,7 @@ dev_dependencies: build_runner: ^2.1.7 chopper_generator: ^6.0.0 json_serializable: ^6.6.0 - swagger_dart_code_generator: ^2.10.3 + swagger_dart_code_generator: ^2.10.4 flutter_native_splash: ^2.2.19 flutter: From 30339517e6729445f7b3ab1e22137b86d82ee090 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 23 Apr 2023 09:23:55 +0000 Subject: [PATCH 29/33] TransactionDetail: use HttpClient directly The background_downloader package was unfortunately causing issues with the NotificationListener service, since it somehow was unable to register it's (android internal) callback functions, and so it wasn't able to report progress properly. Now we're using the dart:io internal HttpClient with streams. This is enough for our usecase since we don't really do it "in the background" anyways, and shouldn't be handling very large files. Plus, one less dependency which could break or be outdated :) --- lib/pages/transaction_detail.dart | 197 +++++++++++++++++++----------- pubspec.lock | 18 +-- pubspec.yaml | 1 - 3 files changed, 126 insertions(+), 90 deletions(-) diff --git a/lib/pages/transaction_detail.dart b/lib/pages/transaction_detail.dart index ed6ba0ee..c4aac7be 100644 --- a/lib/pages/transaction_detail.dart +++ b/lib/pages/transaction_detail.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:convert'; import 'dart:io'; @@ -9,7 +10,6 @@ import 'package:intl/intl.dart'; import 'package:path_provider/path_provider.dart' show getTemporaryDirectory; import 'package:provider/provider.dart'; -import 'package:background_downloader/background_downloader.dart'; import 'package:badges/badges.dart' as badges; import 'package:chopper/chopper.dart' show Response; import 'package:file_picker/file_picker.dart'; @@ -2464,32 +2464,30 @@ class _AttachmentDialogState extends State ScaffoldMessenger.of(context); final AuthUser? user = context.read().user; final S l10n = S.of(context); + //late http.StreamedResponse resp; + late int total; + int received = 0; + final List fileData = []; if (user == null) { throw Exception("API not ready."); } - final DownloadTask task = DownloadTask( - url: attachment.attributes.downloadUrl!, - filename: attachment.attributes.filename, - headers: user.headers(), - creationTime: attachment.attributes.updatedAt, - baseDirectory: BaseDirectory.temporary, - ); - final TaskStatus result = await FileDownloader().download( - task, - onProgress: (double progress) { - setState(() { - _dlProgress[i] = progress; - }); - }, - ); - // We awaited the download, so we're behind it now! - setState(() { - _dlProgress.remove(i); - }); + final Directory tmpPath = await getTemporaryDirectory(); + final String filePath = + "${tmpPath.path}/${attachment.attributes.filename}"; + total = attachment.attributes.size ?? 0; - if (result != TaskStatus.complete) { + final HttpClientRequest request = await HttpClient().getUrl( + Uri.parse(attachment.attributes.downloadUrl!), + ); + user.headers().forEach( + (String key, String value) => + request.headers.add(key, value), + ); + final HttpClientResponse resp = await request.close(); + if (resp.statusCode != 200) { + debugPrint("got invalid status code ${resp.statusCode}"); msg.showSnackBar(SnackBar( content: Text(l10n.transactionDialogAttachmentsErrorDownload), @@ -2497,15 +2495,53 @@ class _AttachmentDialogState extends State )); return; } - final String path = await task.filePath(); - final OpenResult file = await OpenFilex.open(path); - if (file.type != ResultType.done) { - msg.showSnackBar(SnackBar( - content: Text(l10n - .transactionDialogAttachmentsErrorOpen(file.message)), - behavior: SnackBarBehavior.floating, - )); + total = resp.headers.contentLength; + if (total == 0) { + total = attachment.attributes.size ?? 0; } + resp.listen( + (List value) { + setState(() { + fileData.addAll(value); + received += value.length; + _dlProgress[i] = received / total; + debugPrint( + "received ${value.length} bytes (total $received of $total), ${received / total * 100}%", + ); + }); + }, + cancelOnError: true, + onDone: () async { + setState(() { + _dlProgress.remove(i); + }); + debugPrint( + "writing ${fileData.length} bytes to $filePath"); + //debugPrint(String.fromCharCodes(fileData)); + await File(filePath).writeAsBytes(fileData, flush: true); + final OpenResult file = await OpenFilex.open(filePath); + if (file.type != ResultType.done) { + debugPrint("error: ${file.message}"); + msg.showSnackBar(SnackBar( + content: Text( + l10n.transactionDialogAttachmentsErrorOpen( + file.message)), + behavior: SnackBarBehavior.floating, + )); + } + }, + onError: (Object _) { + debugPrint("got error"); + setState(() { + _dlProgress.remove(i); + }); + msg.showSnackBar(SnackBar( + content: Text( + l10n.transactionDialogAttachmentsErrorDownload), + behavior: SnackBarBehavior.floating, + )); + }, + ); } : null, ), @@ -2632,64 +2668,81 @@ class _AttachmentDialogState extends State final AttachmentRead newAttachment = respAttachment.body!.data; int newAttachmentIndex = widget .attachments.length; // Will be added later, no -1 needed. + final int total = file.files.first.size; + int sent = 0; setState(() { widget.attachments.add(newAttachment); _dlProgress[newAttachmentIndex] = -0.0001; }); - Directory tmpPath = await getTemporaryDirectory(); - String newPath = "${tmpPath.path}/${file.files.first.name}"; - await File(file.files.first.path!).rename(newPath); - - final UploadTask task = UploadTask( - url: newAttachment.attributes.uploadUrl!, - filename: file.files.first.name, - headers: user.headers(), - baseDirectory: BaseDirectory.temporary, - post: 'binary', - mimeType: "application/octet-stream", + final HttpClientRequest request = await HttpClient().postUrl( + Uri.parse(newAttachment.attributes.uploadUrl!), ); + user.headers().forEach( + (String key, String value) => + request.headers.add(key, value), + ); + request.headers.set( + HttpHeaders.contentTypeHeader, "application/octet-stream"); debugPrint( "AttachmentUpload: Starting Upload $newAttachmentIndex"); - final TaskStatus result = await FileDownloader().upload( - task, - onProgress: (double progress) { - debugPrint( - "AttachmentUpload $newAttachmentIndex: progress $progress"); - setState(() { - _dlProgress[newAttachmentIndex] = progress * -1; - }); - }, - ); + final Stream> listenStream = + File(file.files.first.path!).openRead().transform( + StreamTransformer, List>.fromHandlers( + handleData: + (List data, EventSink> sink) { + setState(() { + sent += data.length; + _dlProgress[newAttachmentIndex] = + sent / total * -1; + debugPrint( + "sent ${data.length} bytes (total $sent of $total), ${sent / total * 100}%", + ); + }); + sink.add(data); + }, + handleDone: (EventSink> sink) { + sink.close(); + }, + ), + ); + + await request.addStream(listenStream); + final HttpClientResponse resp = await request.close(); debugPrint( - "AttachmentUpload: Done with Upload $newAttachmentIndex, Result: $result"); + "AttachmentUpload: Done with Upload $newAttachmentIndex"); setState(() { _dlProgress.remove(newAttachmentIndex); }); - - if (result != TaskStatus.complete) { - late String error; - debugPrint(result.toString()); - try { - ValidationError valError = ValidationError.fromJson( - json.decode(respAttachment.error.toString())); - error = error = valError.message ?? l10n.errorUnknown; - } catch (_) { - error = l10n.errorUnknown; - } - debugPrint("error: $error"); - msg.showSnackBar(SnackBar( - content: - Text(l10n.transactionDialogAttachmentsErrorUpload(error)), - behavior: SnackBarBehavior.floating, - )); - await api.v1AttachmentsIdDelete(id: newAttachment.id); - setState(() { - widget.attachments.removeAt(newAttachmentIndex); - }); + if (resp.statusCode == HttpStatus.ok || + resp.statusCode == HttpStatus.created || + resp.statusCode == HttpStatus.noContent) { + return; } + late String error; + debugPrint(resp.toString()); + try { + final String respString = + await resp.transform(utf8.decoder).join(); + debugPrint(respString); + ValidationError valError = + ValidationError.fromJson(json.decode(respString)); + error = error = valError.message ?? l10n.errorUnknown; + } catch (_) { + error = l10n.errorUnknown; + } + debugPrint("error: $error"); + msg.showSnackBar(SnackBar( + content: + Text(l10n.transactionDialogAttachmentsErrorUpload(error)), + behavior: SnackBarBehavior.floating, + )); + await api.v1AttachmentsIdDelete(id: newAttachment.id); + setState(() { + widget.attachments.removeAt(newAttachmentIndex); + }); }, child: Text(S.of(context).formButtonUpload), ), diff --git a/pubspec.lock b/pubspec.lock index 80b2e8f0..50d0b68d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -49,14 +49,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.10.0" - background_downloader: - dependency: "direct main" - description: - name: background_downloader - sha256: "3f452ea7e8357f5a63498e9d95c5c8ef43bc3d1442d9d73048dc9c07b0c76030" - url: "https://pub.dev" - source: hosted - version: "5.4.5" badges: dependency: "direct main" description: @@ -557,14 +549,6 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.1" - localstore: - dependency: transitive - description: - name: localstore - sha256: "42a0afb7696cfab1b4bd7d08355b4ee01f975fd364553b28d51496eccaf11cce" - url: "https://pub.dev" - source: hosted - version: "1.3.5" logging: dependency: transitive description: @@ -626,7 +610,7 @@ packages: description: path: "." ref: HEAD - resolved-ref: "280a7b869fe57c81dd1842cd08fa16045d828f0a" + resolved-ref: "24aca93f341427338f1546080e6b37eee8e4dc38" url: "https://github.com/dreautall/notification_listener_service.git" source: git version: "0.0.2" diff --git a/pubspec.yaml b/pubspec.yaml index 6071c4b9..5958adf4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -25,7 +25,6 @@ dependencies: infinite_scroll_pagination: ^3.2.0 badges: ^3.1.0 filesize: ^2.0.1 - background_downloader: ^5.4.5 community_charts_flutter: ^1.0.1 open_filex: ^4.3.2 file_picker: ^5.2.7 From c7bd5ed47a33803f9da0620e3dbf3de7a7910d0a Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 23 Apr 2023 09:41:17 +0000 Subject: [PATCH 30/33] l10n: fix typo --- lib/l10n/app_en.arb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index c589a95a..fdec8355 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -411,7 +411,7 @@ "@settingsNLAppAdd": { "description": "Button title to add a new app." }, - "settingsNLAppAddHelp": "Click to add an app to listen to. Only eglible apps will show up in the list.", + "settingsNLAppAddHelp": "Click to add an app to listen to. Only eligible apps will show up in the list.", "@settingsNLAppAddHelp": { "description": "Help text below adding the new app button." }, From 809fdbc1115bdcf13df079d1e74fd1b3b10353b1 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 23 Apr 2023 09:41:27 +0000 Subject: [PATCH 31/33] l10n: add missing german translations --- lib/l10n/app_de.arb | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 5365206a..212607b2 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -15,6 +15,7 @@ "formButtonHelp": "Hilfe", "formButtonLogin": "Login", "formButtonLogout": "Logout", + "formButtonRemove": "Entfernen", "formButtonResetLogin": "Login zurücksetzen", "formButtonSave": "Speichern", "formButtonTransactionAdd": "Transaktion hinzufügen", @@ -72,13 +73,22 @@ "settingsDialogLanguageTitle": "Sprache auswählen", "settingsDialogThemeTitle": "Erscheinungsbild auswählen", "settingsLanguage": "Sprache", - "settingsNLServiceChecking": "Prüfe Status…", - "settingsNLServiceCheckingError": "Status konnte nicht überprüft werden: {error}", + "settingsNLAppAccount": "Standard-Konto", + "settingsNLAppAccountDynamic": "", + "settingsNLAppAdd": "App hinzufügen", + "settingsNLAppAddHelp": "Füge eine neue App hinzu. Nur qualifizierte Apps werden gelistet.", + "settingsNLAppAddInfo": "Führe eine Zahlung durch, bei der die gewünschte Benachrichtigung erscheint, um eine App zu dieser Liste hinzuzufügen. Wenn die App trotzdem nicht erscheint, bitte melde dies an app@vogt.pw.", + "settingsNLDescription": "Dieser Dienst erlaubt dir, Transaktionen aus Benachrichtigungen zu erstellen. Außerdem kannst du das Standard-Konto auswählen, zu dem die Transaktion zugeordnet wird - ansonsten wird dynamisch versucht, ein Konto zu ermitteln.", + "settingsNLPermissionGrant": "Klicke um die Berechtigung zu erteilen.", + "settingsNLPermissionNotGranted": "Berechtigung nicht erteilt.", + "settingsNLPermissionRemove": "Berechtigung löschen?", + "settingsNLPermissionRemoveHelp": "Um den Dienst zu deaktivieren, klicke auf die App und entferne die Berechtigungen im nächsten Bildschirm.", + "settingsNLServiceChecking": "Status wird geprüft…", + "settingsNLServiceCheckingError": "Fehler beim Status prüfen: {error}", "settingsNLServiceRunning": "Dienst läuft.", - "settingsNLServiceStopped": "Dienst gestoppt.", - "settingsNotificationListener": "Benachrichtigungen auslesen?", - "settingsPermissionGrant": "Klicke um die Berechtigung zu erteilen.", - "settingsPermissionNotGranted": "Berechtigung nicht erteilt!", + "settingsNLServiceStatus": "Dienst-Status", + "settingsNLServiceStopped": "Dienst ist gestoppt.", + "settingsNotificationListener": "Dienst zum Auslesen von Benachrichtigungen", "settingsTheme": "Erscheinungsbild", "settingsThemeValue": "{theme, select, dark{Dunkel} light{Hell} other{Systemeinstellung}}", "transactionAttachments": "Anhänge", From ece0d2eda04cf5ee109a6707421b76180e4dae70 Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 23 Apr 2023 09:41:34 +0000 Subject: [PATCH 32/33] bump version --- pubspec.lock | 8 ++++---- pubspec.yaml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pubspec.lock b/pubspec.lock index 50d0b68d..2afcc9ff 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -285,10 +285,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: dcde5ad1a0cebcf3715ea3f24d0db1888bf77027a26c77d7779e8ef63b8ade62 + sha256: b85eb92b175767fdaa0c543bf3b0d1f610fe966412ea72845fe5ba7801e763ff url: "https://pub.dev" source: hosted - version: "5.2.9" + version: "5.2.10" filesize: dependency: "direct main" description: @@ -943,10 +943,10 @@ packages: dependency: transitive description: name: timezone - sha256: "24c8fcdd49a805d95777a39064862133ff816ebfffe0ceff110fb5960e557964" + sha256: "1cfd8ddc2d1cfd836bc93e67b9be88c3adaeca6f40a00ca999104c30693cdca0" url: "https://pub.dev" source: hosted - version: "0.9.1" + version: "0.9.2" timing: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index dee5ed56..9a01593e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: waterflyiii description: WaterFly III, a mobile client for Firefly III publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.0.11-alpha +version: 0.1.0-beta environment: sdk: '>=2.19.0 <3.0.0' From 43e9cb0dd61752b9cb7974f6bc4340b0c3cd2d4f Mon Sep 17 00:00:00 2001 From: dreautall <109872040+dreautall@users.noreply.github.com> Date: Sun, 23 Apr 2023 10:02:40 +0000 Subject: [PATCH 33/33] [wf] disable dart analytics --- .github/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4b2b280b..665aa2d6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -49,6 +49,9 @@ jobs: - run: | sed -i 's/^\(version: [0-9\.]\{1,\}\(-[a-z]\{1,\}\)\{0,1\}\)$/\1+${{ github.run_number }}/m' pubspec.yaml + # No dart analytics. + - run: dart --disable-analytics + # No flutter analytics. - run: flutter config --no-analytics