From 3e45630381e1960d1c3056f502d4028899ed2217 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Thu, 21 May 2020 23:29:02 +0200 Subject: [PATCH 001/127] notifiche --- .../main/res/drawable/banner_calendaroo.png | Bin 5794 -> 0 bytes flutter_launcher_icons.yml | 15 +-- lib/environments/develop.dart | 28 ++++++ lib/model/received-notification.dart | 15 +++ lib/pages/home.page.dart | 90 ++++++++++++++++++ pubspec.lock | 28 ++++++ pubspec.yaml | 1 + 7 files changed, 171 insertions(+), 6 deletions(-) delete mode 100644 android/app/src/main/res/drawable/banner_calendaroo.png create mode 100644 lib/model/received-notification.dart diff --git a/android/app/src/main/res/drawable/banner_calendaroo.png b/android/app/src/main/res/drawable/banner_calendaroo.png deleted file mode 100644 index b8ae343485d9f56259616acab7082959a7269dc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5794 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 setUp() async { Environment().version = VERSION; InitializerAppService().preLoadingData(); await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + + notificationAppLaunchDetails = + await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); + + var initializationSettingsAndroid = AndroidInitializationSettings('app_icon'); + // Note: permissions aren't requested here just to demonstrate that can be done later using the `requestPermissions()` method + // of the `IOSFlutterLocalNotificationsPlugin` class + var initializationSettingsIOS = IOSInitializationSettings( + requestAlertPermission: false, + requestBadgePermission: false, + requestSoundPermission: false, + onDidReceiveLocalNotification: + (int id, String title, String body, String payload) async { + didReceiveLocalNotificationSubject.add(ReceivedNotification( + id: id, title: title, body: body, payload: payload)); + }); + var initializationSettings = InitializationSettings( + initializationSettingsAndroid, initializationSettingsIOS); + await flutterLocalNotificationsPlugin.initialize(initializationSettings, + onSelectNotification: (String payload) async { + if (payload != null) { + debugPrint('notification payload: ' + payload); + } + selectNotificationSubject.add(payload); + }); } diff --git a/lib/model/received-notification.dart b/lib/model/received-notification.dart new file mode 100644 index 0000000..9fa5359 --- /dev/null +++ b/lib/model/received-notification.dart @@ -0,0 +1,15 @@ +import 'package:flutter/cupertino.dart'; + +class ReceivedNotification { + final int id; + final String title; + final String body; + final String payload; + + ReceivedNotification({ + @required this.id, + @required this.title, + @required this.body, + @required this.payload, + }); +} \ No newline at end of file diff --git a/lib/pages/home.page.dart b/lib/pages/home.page.dart index 105ed2a..26d832f 100644 --- a/lib/pages/home.page.dart +++ b/lib/pages/home.page.dart @@ -1,4 +1,5 @@ import 'package:calendaroo/colors.dart'; +import 'package:calendaroo/model/received-notification.dart'; import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/routes.dart'; @@ -8,6 +9,20 @@ import 'package:calendaroo/theme.dart'; import 'package:calendaroo/widgets/calendar/calendar.widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:rxdart/rxdart.dart'; + +final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + +// Streams are created so that app can respond to notification-related events since the plugin is initialised in the `main` function +final BehaviorSubject didReceiveLocalNotificationSubject = + BehaviorSubject(); + +final BehaviorSubject selectNotificationSubject = + BehaviorSubject(); + +NotificationAppLaunchDetails notificationAppLaunchDetails; class HomePage extends StatefulWidget { @override @@ -15,6 +30,66 @@ class HomePage extends StatefulWidget { } class _HomePageState extends State with TickerProviderStateMixin { + @override + void initState() { + super.initState(); + _requestIOSPermissions(); + _configureDidReceiveLocalNotificationSubject(); + _configureSelectNotificationSubject(); + } + + void _requestIOSPermissions() { + flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + IOSFlutterLocalNotificationsPlugin>() + ?.requestPermissions( + alert: true, + badge: true, + sound: true, + ); + } + + void _configureDidReceiveLocalNotificationSubject() { + didReceiveLocalNotificationSubject.stream + .listen((ReceivedNotification receivedNotification) async { + await showDialog( + context: context, + builder: (BuildContext context) => CupertinoAlertDialog( + title: receivedNotification.title != null + ? Text(receivedNotification.title) + : null, + content: receivedNotification.body != null + ? Text(receivedNotification.body) + : null, + actions: [ + CupertinoDialogAction( + isDefaultAction: true, + child: Text('Ok'), + onPressed: () async { + Navigator.of(context, rootNavigator: true).pop(); + await NavigationService().navigateTo(SHOW_EVENT, + arguments: receivedNotification.payload); + }, + ) + ], + ), + ); + }); + } + + void _configureSelectNotificationSubject() { + selectNotificationSubject.stream.listen((String payload) async { + await NavigationService().navigateTo(SHOW_EVENT, arguments: payload); + }); + } + + @override + void dispose() { + didReceiveLocalNotificationSubject.close(); + selectNotificationSubject.close(); + super.dispose(); + } + @override Widget build(BuildContext context) { return Theme( @@ -41,6 +116,21 @@ class _HomePageState extends State with TickerProviderStateMixin { AppLocalizations.of(context).translate('today'), () => calendarooState.dispatch(SelectDay(DateTime.now()))), _buildBottomIcon(Icons.account_circle, "Account", () {}), + _buildBottomIcon(Icons.notifications, "Notifica", () async { + var androidPlatformChannelSpecifics = + AndroidNotificationDetails('your channel id', + 'your channel name', 'your channel description', + importance: Importance.Max, + priority: Priority.High, + ticker: 'ticker'); + var iOSPlatformChannelSpecifics = IOSNotificationDetails(); + var platformChannelSpecifics = NotificationDetails( + androidPlatformChannelSpecifics, + iOSPlatformChannelSpecifics); + await flutterLocalNotificationsPlugin.show( + 0, 'plain title', 'plain body', platformChannelSpecifics, + payload: 'item x'); + }), ]), ), ); diff --git a/pubspec.lock b/pubspec.lock index 2ec1471..c8af3e3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -76,6 +76,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.7.5" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.3" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" flutter_localizations: dependency: "direct main" description: flutter @@ -154,6 +168,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" quiver: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4b8eb3c..0d13c84 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,6 +32,7 @@ dependencies: sqflite: ^1.3.0 path_provider: ^0.5.0+1 scroll_to_index: ^1.0.6 + flutter_local_notifications: ^1.4.3 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. From 207778df1a3e45a43f46291526a5fbc1f7366d6c Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Thu, 21 May 2020 23:31:13 +0200 Subject: [PATCH 002/127] app icon --- android/app/src/main/AndroidManifest.xml | 4 ++-- .../main/res/drawable/banner_calendaroo.png | Bin 0 -> 5794 bytes .../app/src/main/res/mipmap-hdpi/app_icon.png | Bin 0 -> 2114 bytes .../app/src/main/res/mipmap-mdpi/app_icon.png | Bin 0 -> 1377 bytes .../src/main/res/mipmap-xhdpi/app_icon.png | Bin 0 -> 2639 bytes .../src/main/res/mipmap-xxhdpi/app_icon.png | Bin 0 -> 3834 bytes .../src/main/res/mipmap-xxxhdpi/app_icon.png | Bin 0 -> 5015 bytes assets/images/app_icon.png | Bin 0 -> 62334 bytes .../Icon-App-1024x1024@1x.png | Bin 10932 -> 32067 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 640 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 1187 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 1796 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 885 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 1695 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 2497 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 1187 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 2302 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 3261 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 1470 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 2751 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 1622 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 3062 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 3261 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 4770 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 2114 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 3834 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 2146 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 4033 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 4434 bytes 29 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 android/app/src/main/res/drawable/banner_calendaroo.png create mode 100644 android/app/src/main/res/mipmap-hdpi/app_icon.png create mode 100644 android/app/src/main/res/mipmap-mdpi/app_icon.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/app_icon.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/app_icon.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/app_icon.png create mode 100644 assets/images/app_icon.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index e703d55..9f18093 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -8,7 +8,7 @@ + android:icon="@mipmap/app_icon"> - + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/banner_calendaroo.png b/android/app/src/main/res/drawable/banner_calendaroo.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ae343485d9f56259616acab7082959a7269dc5 GIT binary patch literal 5794 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/app_icon.png b/android/app/src/main/res/mipmap-mdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0639584aed9fafac8aaf27b16b0401f2fb843af5 GIT binary patch literal 1377 zcmV-n1)lneP)mLglb@k$fR9~%-YMB)z#tw)gh*IFz^8pI<( zh%~#$F{o?HE0uM6YH_dc=i5Hccyp7utvuW>XV$zIrp4%@9%rg@BGf0 zdxbdT2>As)Jv~@iS*dI&c@1lR+4?dhnlxl~1y*}|(36!dFJV@ohdt$Xb8~ap-QAU! z6$F@=m|$jRX5Y;>cOVi!g1mxz%I?fJ(ASLV|6r7b-!`^kBr88l#HA0!SXFLkZf=fO zuU^T^LgfZ$jq@#F@eMwFy9HzEE=0<8v#(*PNkjPlPyDfhk5@ObW+cShD<)VvsGmv! zUBBb@SDnb8ScD^>cw_c3Kw$kHX8*I*hu~O-=d%2#=9tX8g9P7C@S}3OeFC0H;OYN8 ze%Mkm>bm0j5*z~S(bgUcKd#utuiGaewHsNd$#@w%dl05{A)CuO^RFui;0!ky`V+2N zwM-3uS-?$0DNMNRy6l>Q04W#mxy7W>_^x5}I2#Rdkbtwug#cZ1{smky)`l4ev-Af0 zkEA>f6(Hi`(O+L{*djH#oCB;#53WD|E_B+t5TI)=1n8P$3E0`$K~qx`8XFriH8lm1 zNCanRXGBLw!^Oqr(7q!hBPcH~$J3`zv9Ym%>({R%BqRj)@85?|sJ=OB_gGk1U=Qr? z?^n1^29=hUA|W9G+1c3;2m}iC^eQAREe$z2Io#jJf48Rb@o_XaH>0qyko{h}cJ1T@ zY;JBMARvH^qJe<{A|fK-<>iI-^>s8fG@!e?8@ai;kVqt`uC9iWk&(P#WMm}j>grh8 z+uNIsxT&cr8;HuvN(>DR!PnOpgM))GHa`0Huagp;Ju)MsC;NV~;j>yQ!U^784(TMQya70B#!N$$;ohZbcBb82h7aOFh4)fW{li~W~{8NjLn)duCA^~O-)65dODlA z6A?f@JUKbZ@_~VY2e$L`^JBkcG#O7KNDM7_a*>0edy;?`FJ3?@m9oH~Q2_*h@f}7_ zPY>?hyT{z;>eZ`gYioONbUH3a7C=$O!NCDzV`FGz3}(FLSBDET-=CL$;(2(`7f@^DCNz}D858A=PZqoV_%p`r3HT2WEKW{d(re0==L2@s3L zY^uq>2L=XEQc}VapSZX<tnu7qyF;cOBfm&!pX^r9VPf~#fR2VR#q0lFmhnf=`{cY;e_YRSe! j+2B&gyQGRUA4dNM-ksk`lA|al00000NkvXXu0mjfGX9b{ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/app_icon.png b/android/app/src/main/res/mipmap-xhdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4a93d5233948459cf4571f2737777e2e95e8e1 GIT binary patch literal 2639 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 T{34i(A^>s4!mt8<>-oO`6s7a) literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/app_icon.png b/android/app/src/main/res/mipmap-xxhdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..be08a80e64e8b4da30dcee82bfccad628abf0152 GIT binary patch literal 3834 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 AO#lD@ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/app_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f44060d1f887d41f7ec13da146859925bf85335e GIT binary patch literal 5015 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 TQ;H!9ZU8+k1I;Q8B<4Q=a!OIO literal 0 HcmV?d00001 diff --git a/assets/images/app_icon.png b/assets/images/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a94eab4e15b60001b6202f102417410c40a6c6d8 GIT binary patch literal 62334 zcmeFaWmHvb`!_lX1yn#qWz(XRf`D{`Nk}LL9ZE}g!&0#6lvXJf3F&4DN;d-1C@r<< zhI7q@d;i~eykE|T^WmH`bd2@vHP)K*p7(wA?{{5`=fzEBS@J`)hY$oImzTS$iXbEy z^hJ6QKH+(%P>mp`5&5f^?zqIx47kP)IC{=6tSR2R{G6HW>Q$!?nEH1oOV+5&zO2l?zCq!2eDZ8jb&box zeX{13I_i}hJI!kn34tWu_Tx*tP20iUvHS$^^uPc9O5p#V1US@UEI(8Z55Fn7Le)3F zG^H^V`Bo_DP|aL$&(O{i{lq$g$Rw67$!?_5QIDrnDBm4)ms>5jP>rBPqHk-((90TZ z)VL$@`A_Kh&uDEQKh`L)AfhVi$v8sZjm5#;7AA(neOLg#KMtcyMB8e_tJ_zLN?C#AAJ(dFz64p%-GllQi&lbD4#}lj(qw>!8$v3QF;LDn>T@GN1@)!4) zTl;ZLqr3yh)oZKH$SBCQHp?rJ!xIyBvbpJYTNhhRn|i#+d1houPezMpm^mgR^a&&gJwSmJn?4ev5%nWabYA20MRtjNDV`z& z$Leb{2hcS%>#{~$7c@%NmKKMXWKF8q8SGZZLKmN#yb&b*_x`cy_9(J6;jx_?CHC!) z^F;LrKl%j};i~|zDzA}_rC+uhSvAT7N<&UTgI;vAg#wNYN)lQ4vvU*zLf?%k5lYlj>nGQ@dRekeJ;`)^Hl>FvUw$xZs93 zzp`C_r|M}qQiA_M=V!j(EAY!9&x{V?4Fy~sX1Yx?peO`356D__e89gj$_OO zROrKxVq#jtn*Fr$&P_=7hu==+X&RhbS;Chr!=l0hqKgMye_<9jzAQO6o{UtgKQ3#{ zO~~s%{vz=>p^g3I>$snN@8++ljK_5_wvmioO>Q?=xXCH zwYdoX3<)V=u`YX+f6dFwYDacm=d};t%|$g7%pq8QK{Foa!ejsKexf=*(5>A4S~=@B zA$kGsj^*Jm&niyOm;Wm4pEK=C_;z(;e)z4Qq+_5c;2c<{q1g zx^5b5^y)NZ+vj+Z|eW2D8FHBv?j`FU*&&zaq);i zUm6K|$D1gI3Kd4t?E@P*72<4bbc<8}b4R=-)7p02GrPHBf0}m1Ogi*>%wxaW;Xd71 z>sd)5Ycx28$DjW|7UgzZk`EvW!&Vy5+b~F%a}ocIdcow)?*kyr1ak%1KhE}iPoM1 z-9tHC2Gg6gc%##g*{M#QP+4mcm$LQ9a10t!{_pzv{IY51wqB1NbIMWg)J&^P3iJ?& z*R$2pFe1Jk?1Jmgv%qF!lTD@n^k-e{VoVXgtDds^Yhgw;wHqH25tYtMCB{|LYYlXn zBHRVyy_x?-(u&n`t;L^d6GnE{E%`&i_%mSGgt%O{E^YLxsnqv1ty}-6wbAxwzan#2 zF>e9sXWxg%@SDLp@tb9GNj(gtckM~yGFwSIv>#-1-H_ek)#+QPHp(Z=-N)^Crz@J!DA(AZW_u#Vah&tSq*$MhB@{^Ck<`N7Q)?X8ti`-f@D z7yexNl3*P+QfhL|%dV=*^%}YEzE}hrKf9Z>1-p+v52TL^Pj_Jb)zZQ}jZ1$nze|W4>W@|Nni`A^O&4^zh?mMu63aR>o+irjg{RxsIA@su z?EDbH`uAzOzPu&7%jCLv??%2iCzNv7Q+i+09kjjUc0*V8&$6S42YBM%@ z#6wT#xIO1v8h8L z4HY)dyFx_&Y2*E#y-oR2Ug%PU@$PTboQII7sq)+VVya%>EE8R^6dtFYc$%sVUtIe4 zi{p=eLO}U>PHd#hL+;-X`%XO?+8FWpHuaN|3ceG8ovj6~jn045!|&^Twc5m}⁢e z)WkM!iwuh+iRBlx-kOQkj!NgoKM)D0QOqb8POX@a@c2QBE6FP&zxxk8y~WECJ>CoK z-p0yaKl(-@S@EmAIrWsygfSvV+Wvu5#}S|0ygFNf2q=LBt{~;6*8|oo%QmKZ{}+vH zm;9uWSQ~R~U=L`?bF6rQrUJFI+ovKM>lue!d2_!0+2q^7Tpdrnaz{u{^%A%kV*Pa< z$fT2W)T8CsbZCAG?HjSmw2*PFAf@5>s76oCRh&5??>0L_PRC#o%UX*@{6x{ddcXJm z5~Nv3JW%A`7gM5mV9)ryI5x9MC)|vm+K7jJ-|NS-W|eeG{OSkfSA}U@NO-rOt@Vec z?QT4xA31}6R;zXjcjGJNo%>c7=}57-y*N~8^<|<}g8On1)e#rY6y1r?wvy7+(Mn^& zJUl`{(KWsZDfx@u>(G)ei`pRCQhNNw!%?*HUzYTOLo+3~r864H`+7%3XdA>aW@df6 z9NU4X4DGO2;SoNaBx%+>A)zsryQj(5Pgbe3A^Cn{+s3Vnwe=+C-fRzeK&m zY-#EEr@lpkrS^y0oo44RiioK9{7iK)?iU^(e*xmY?}@*VqkEEp-=^!WYmaPTUFpa2 z+I%6=fa*mGea&W`gj$t9s^b`X>Tg!zdCPdi9h-ZcQvAZ0wN-PCwI>USCIfyM&8o}@ z|)iVSUzi>}}kPnSVbSS_|ppY<^|HTh_5 z518XGF%>1MTVraLR+?&5AGs|CYw%WZN*9`IIOXpfMsCVCbG~15V^L;a3hc=3QaG{W zkk@JNhi3ctTS`YKTxl-8Fp;~-z!4Kzm3-XC$A^4l$f>azH!t~`eImWl^u~S&DG8|S zs*n=lDTP8;;MYHvmUi_1V+`06vp+LD^!8m2*&V1~p>gYe**|wWOaVzzXNrxd%5ddn z*Vw1y)?2Ki6C&e0-3RA6!sL(?IWSQv%Uc;u_qOoq4A~oSTw1Dwy1Uwp!yi!$j`-9v zF|QdBm%eYm+d?b*yEk|D?LPGvgy6lw82cv%w_Xa} zP<`^{%a_?*@7dRJs~`x+rF+J?xBguDuu{3lZS!r^dT?S#URhul9)%4OC|-o^QvV4q z!&90Aac?OO7nW zs*ikT!+($STV{3UYRC(a&7s1WxuNCkP)vfs1v31%5_APTjk^;{4d(*n_|fmzKGhcF z@7&wZuGpNFP}Ysuv+a$<`q915QYO}8sK-xp?n}6@iYL;zQlnsut0qYU(m)t^mMr4m&DrNAFTIV<<^f5Mig%^&h1CF;i7RJtiV}< z*C|VHr$h%!y!RzL(VOo~kl?D-Y;PJ30kI=0hfhsozu+|W^>#f&Eh^A-6-oJ^Ey4e6 zu$Y5H^WX2pBaF9;ZZD|?DCHc*n4PDTifTz6GRAK}W~9ID43oW8^b=U{HGoNBuKHuA z_D!1BZ2Z@ZYnxwbdz;xoLS7|VmK>lm0OEMU?rzr{B1mI(0squDhlpZ2R@XPRf3AOzgM+`$IWwWY zUq-xdZ;7vsA(w%>z7Kxmx1XG;$tg+3--S6ZnR`AFJidVTkr)-`Lz!&X=t$pgq1gUO zI>$4b4bR>*A>_^Lg3ZJQPMC7;Z^qH4@7IiUGJgrJPw{cghrEpV*v}rGPc`<<<^7ZL zT!@#l{+D#%nZ2c*qJ5Y5SB&fbERp(;FM3b9B~t?L?81!szA3y>p3{k+&=EN+OZ!9& z{o06*kJWQ^|8c)f+Ikf)9(H6wZfmWj*XwESo5A};Z;gmV@+%DRly*o&^VBMa)YJGU zA&$#GqWwg?H3v=Ue_uyZA|jk7LXP~{m-G8f+3qp=rJKTVFac*rUF&`D^QPIWi0c{M z^WtNe4{;FqTQVbz9vkfoO3dBE@@azf1#e@P-(V3=5!SWOJhu7qU$!1OmDv*Y^qn%X z{=OKt%b8NFWz-)_!GAmkRcUk?SBchsnm0X2nO+}&CaCIn+;CU2x&2_|V6MiW zZ%;J{jcOa*qK54){wOZ}c4l9A{81Hb?Em-`AH{qK-%^`6{c8WDO{1xt*;+L-M}%n| zPb0VKVA=bDPDV-B_II9=&1z{bJi%~1kpiA%@U6PEh4#;Sn!Rzi$z>TxvEQqIt%!F0 z_i+~6Gui+#c#OaMJtH3TKaZJ=ze^*Y%x~Z?+X)N(tfUdOb98>Hxo_E~3OjYZO|B&i z@1qgL3!etVI=J>#Cy+BnXP-^*0sUBFFfQ@JzaN7NjuNQ?0i>y(CFHKPA1zFcoimyX z19~>;Iu{YuBB)${oz?02a{SMR>H0(R{XI9R&Z@E!ysl603n?&c-H$;sOYYh1-d5K? zf{7G$N{SBd+rA9hJ&VSlPm>e~dBe5JnR)W|A9M5Zx9OY$<_{r=;uxbwBZdv{ zX3TuQD1OCX{w}fpdBJ3Us#BRwq@4TTUYoojv@+INopc@+>ursp;y2wt`y2Y{f>9BB z)sqCT6<|;Dr}nQ`XwMV%wz&Bb^1_FVczTQdgTGRjuHkjX9n^-*o?J@*&uN&yPqVo&73=P4=*pl?4W z5Bvf$AG$1?t*Y@?YE*oql-gfbQ74AKIT!yp^X=jN!yn4aW>2)dfqzu}zZc%TA#D8G z^21|9(deGlf)5_CAslz~_>wzP-?qEJ^HIu4GDc#5zcNK`TT7}-?WTnE;ghp11l;>K zgjp^p%na~P+wq~9Tf~1VQ@2UN-v}TVQDpTP$8$i)&Eg9? zH1`ehS9*=?J2;2Vp3GC)sOwb!FY7M;XnF4Y?<@fRK*-1j_wM}o za9yM{m%hIKD*=B8Thrx^>xtP#reW7kb+p^LXvD}49dw~{WU81b*0)WtHy_p5+Rpls;GT&Z+0p;H)TIAy-S@xd z^ZzuY|EEd)KaK1En%SrSYjFQv?yv0h|Ad6UhVt*&$6v4b>lJ^!Vm~bW%@v<>4wE^E z>D-|4e$#*lC2?PJza@X#`;vT6jFRA=Nrz$wPNUzf8RDqG91gN?r-ga%)u3N$$?O-a z$lnZ2{MVoU`V(FPf9qCK?7k@=e~a{g$7}y)nZIc6uUG7c1)0A%{ohIazq#W7x48nX zsu8T-%1EGe#ND)e;nw9FDW9|oGF;Q=J@KWZvfP^&fdwaS%ecRePL*Lh&23;qN<8r1mN`$806|eRfMe5{d zxVkM*{yam3;8MvTE?L~Qw&K<)&gIg`PV(5@m>6r|so>J{Sh%L~`N1{*hznZzg6mz~ zdPAfAx=ur$YvU=VW%6P+!`Su;?>*!1nOiHF{NAf$}5`v3fYXi>dje6u*&&_4CF3FX=499~<{%Q5QVE*Qk&%tod z)t*$>^h?l-`gDi@5sPw5Tnbf@I>+R>d}{+&McDvC(>%qat1Y!PlQTX(QSDDBzU})x zCd=`=_ga6E{oYW8mUS!z4PR2xx#A(Ot#Bd=kvB6Hd%H~{I4seD2MFn1A}gJx?+Xhx zOv0J3PF;A|CGJSRFwLMK_HJdmTUc6_p(1rINL89xty@x%l#)R#S7ZA7t#0X+oeZ70 zgCs~R4QjKGe&6#se2R->zGBad{~=5I=YoLz_+HB!Wwym*CJ9oWo7TH0SImALJ9|CM zhf->tI&qL=z$`URtU-VPOYtGYRcd|MCw)5p$zkeE44@zACiVQbH5*YU=v zijBJI{En3>8^;0rTIOd02BWpXM(enr6+Q205e!2NFgaO1X<8@BcUJqx(hCO9&zCMK z^FN&FKNdeaOZq$Xt99wZb$+jm_$uLt-{13rvW@*{_)}cd`;>{0KD~ix*XCH!u>t2H zOWo<{)apTUI-x>ZZ)}9RZVi=+#KNmReNeMym)J7~Cw2bc-7DuFAc&J9{6q*#Vb~Nc zIJVNQ$CG2+^e}$rwWPa~{XL$&(&7t-aYJHW8CHod-*3r=Ck9Ft(>!DHa+&JMNrg_- z-kZ)eHDRV^x1}cG7)KSIJ@q9E@fEosu@uFq?3KN?0_!2;xZB<0HT3q1G~!Mc_T%t- zB!&byXzQcSrQf=)W8sTnVuD|s2TNU>R=sjlq!BH8VC;rFR_!GlchGoOw6 z3vI_*uTWYxGaf|V7<|5*cydB{aCgrFf@_vogW+8v(+%I`Medzqg#^Fpqr8~TSo;ZcHyH*kELt& zyMW{yk;U``zeD>R6=Ov{Z`}W#-GB zZt^(t&ks94E{=w(2qpd=C~+3u7!7ThN=+E_yI=LxarGP_V)}#~V}`y$*)flVEc**T z_YC6T4CgyilsN6j8*L@UqKcIsNZy$Ll+%2EBHrD~K0iL4ia;*MYiE-WTz9dNzeON% z&hGLAzr$oJ8*#Uw%Fb!+Ox?2WQ%E|FnAdU3<7xy5qQyp*Hxe5`C5u zOg+JPJUJn6Iy@&7Iby;2ikgQzP-@eZ%4=Gv1sqkVd)r8-#OcCFwLfR1j*~{wx`mKyD5^SUDzMrwqao)fL}6YKZFc+5e9*MBT$*Ke#LGV%o#d&Jg!#gNl8 z2UApG!u>W^ihh4gQ~2msOtvNJ za12wzBy}jFNLL)~h+u}?rjjG0m+p~JGHTBij!-N_QlR&93J-bM=ScqQRMVSPe292; zM+=%q4=7a!F!Xr@O=gtL9rvEXfvz;>z#93C8()t*7kH`XFt!mQ*u7)W7u_}Q{CIb) zS$v-B>~%km)L1)(C<)i>CC{FpX!aLPvxQh=1krpf-hJ+zd3S~*Gr zeZI`OXs&p=9um4Dg?Q3tiTM3WUp~{;H+FrN1sknw2-X|&wM?p-^@#zO5&tHoRxRtY zyrOf5$i|yu)U1l9QpTOPR{N~?^j7DH#2U_Pt*;*>ATK-r{`B2*XRj&H`rZ3B$3my!9&CL90RBOw_r`t9xxVwvlSuy$eh4OhF)i0X_ygWo~z$lGCxF zDba1^chs>71QDM+K^kYH`u-;K2fd2&PwJl^H&(Sp@aS>pnRg4BZ-ayLlR?)|{l!5@ z7Fh}p9=t1>&Tv`yrJ7@`q*3f}jtNn}qEhMm>{-k)sA(dF4VtY7OY5K=Pe1wn!|nET zEn(NiI`$^tP=lI)U}N=bshbYJzt?$CdaVC^X16+{fzA(LX$3&7n3E0@dk`d;4;(td z>pU>qR}lEM>Y?=RdZK`Nm*UG4=gxpphJZeM7>^@1#5yCT+lvjxP5g$nNBL=~v!c8x zkI;+UjCcEe&UI&{d#v^C6%T0XV@BFgC=lQ@)y}%HJ`&i}ytg*!-V*zi0OuXRD0$wx zY$d|=oR|wvznX;*6WE(?86#lvf@YN{wFT=EUe!a32trK-EgkINHs-~CdceSL&Sxvpg$1`a(x6D=J2-Irl1v&dthK7 z&uc@OpH470JT#D_V}_SQjmGq3I>v?+_?H&OWf z;M*t!5%@`y@-bTwn7t|bL+k{8?_G~`x8C`}NTrtDcq7em(!w@~d}CvgdJ&LhmG7l% zUYjJqUR$PE1xOIpWEIM$^k9U1*jU(lFbra#0)&cWla_exi?EuzX=se<)kOJYS}$Yufi+kn1t81 z%aSAv9SzUoH<+24NU4=?aSjc+j?-Piyx3Qhl3`GRL@39J)rE7a$&n)x82I+a2i4>x z`-x_|jYXr&WG=z*R{j|ULy}=#$hiASu)G+&Y3p(_Ghc%8UVn~0?xMlL7lfr@@xC;Y zZn>f~{7y6K%GC%~vb~NCbQ(-6_^=kh4=K~|x7E1;^KvyhAq$S00EV-7VKvVE)y&%7 zT~jS}vE7(V3>@vvGiM>g5x8m2HVF?2tPy4ElthFPU>UxC`&L)ORSu&nQFbu_R!5Dyl_xMr4N%haRTp4!Vr2 zAO89Cr|Kv5i&H}t6)bFQ$IoC%bSk_C`YAtAy(-_^bytNS$(0_&E8(P7e<8CE3FSEP zk>S&zbU}85^4(2yd1Ym`JmmD5itWW$-_y0!AVZq$(qQJrZGZU+n6}FN?#|??31nhV zgfoudH4xaBb>D}ErmxK1xjL1ABGKTjp8KpI83o0-?hWML4G6hV!bRP#ICkt<{xc$* zB#4*M^9wxX>zAztOXWi#RMoU15L6hK`m8HZl_(mRc4z3Y5ZYu-PMV$rl(#(9A$$Dz zaXCRGZBmRK+-uNtO-HDNfWmpUSI`x*V3I{ocDCd6y>=KIm3WNCR^0P%uc%{eTSjUE z*$FVL4&U7&?KT~51H=;Qgao9n`G5`97`N8}R+JOb4~`Reepyjbu{_yUwT(`S*|6h9 zp6)FFd0*jTI>doV1|A~l1#BXz|WyC_D8nVC;=rb`8Nt(8v z=0CuC{`^Z7bQL=MDwfO2T#_r|M)fBiQ>ZJ?SJI0)yca!LW2TQN+nM)1ir?-a=RvZ( z_q;yb`4CdN)GQu*5aeNn4>*OfgDZU*I^t+PiIsGZz!0s+l^-QPbSOl(%+2;P1*WAh z$0RU}M{ls-IfH!<8IFLwg{Cr5^2PxyD5(>#q)5#ItGKZ9cNHMwUVTHb&1xCqu{o8h z`u6gH4haH8FUg-F?qQZe4aFkKu=Uh<0S1Fi^%d~Y!E7U@0k0nJ;Gm$>5OhOPJOYV~ zj1ME;TkcsBc0ubN`0=$YWc^5-6`IKSd+&Bjg9OD^pq!Tq26>4(Odef;iNJFKsBYwJ zH;-S@Gd@DY_tj5~2vd^0_Nxq{i)w+DPLadZaa*F{&NFAuppKbs(ZhHAz;L`}Pxd!O ziq~R}=f8kEoO_91<<{onWxWR$efj=a!b0nU=<{j!($73cN(17T%knhFDxVx?A;o&W z^7jwV%HlQa$xiGj1c^~5G4l3|U`oIR`5VFcv~F%70~pwRXTYUyS_vfgSJ**zgfY-n~|JCbiuoAno7Jo^@w z@k~UQnY-cPQJQPkaUB8-I4hz(JJXY6%;HetwbNLqkJvn0nrOKJRi4q0tovW-Fnx_N z!YcI<7tB-88PR@D)JBKn8KgYaw|91o;Go2m7%f&-R{55A$z-syMexgG9td}GVtgJ! z;%!m{JK#_s(xn4IgLM_X6>lGFh8v4xs^uQ88vxr#>5;$}&z}b!I(feK5fO&CDT zW#jr?1b6D<#f!%D4nyUhbz~S4re=st9#*NUx78d98wx@b?1Y2QFg4jbATa1A-mhh=Aoe>zX%eN7AfI>x0k)f7+N<9$Ll3H&A|e|tpM&Hf5cHt- zJoAWfI5b5ift#lk_ZW(-U}8dm8F<^SK*Kf#gIFy9Te+LadhU-O>SW~P;eg_T<&eEA z-4ejpJVl*l7{R$h-U}KY))%!KC9NYy5PW{opEMf+{MxX-FhWL($hIC-DRG)ja-JV# zIf0#bXi5xK1|m%MCL&V(#fO9yTp-_~=dvo;BYJ?-#@auYTBLa(Wn3k~jDRF+1Rh)W z7hbX>X!!Q^t6aKfo+0GO{AYw1BAr5;OXt-x6m{VEsQmQB8K_SE^A86&YqsPGgkDkh zlCWtjrlg7B)j%)q6b(&X4T3Qkh@KH}T{H|if?&Sk@A?d-#|=5T=i9(YcpO1Q2BFMK zg19zLd>Sc<6|uei`0-=IzI;nVM$E{R;6Ijq`Qebl9vi{~&!L8^{t!IfSmFnO#&uF8 ztGd{6y0Jw{l8h8f@r;s5sA=fRGm2na+iP>{)0{ zpD-&rpq!F|LWrG+KqOSx@fL8Q(G|$2HNck*K#(d@K>_;;byn<|9Fvv^IGsFLff03^Z{!q2yDAHYaQNqd(ISoOb-J_<*~KaOz7W63|)Y9KmT55ZCA$|tcO zFe4-?w+2p6HSgiw4cK5E8?yZb#b%IVijG5>@(c}am@0U>JaB0z;UG42y~I$rXJ5T` z?HC(YmYhjSJ6g!HzD@`!^f79PkcUcs-IWZ%_~6C*#bL&NYjsxsBGUf^2(268=kKE6 z!1pkYxvs8m5diON9*ATbMRu$sZwL?@UQ~-BVM5+CTSt(!aj@NS;Hn3z;J2zcy&eI+ArdHp#7g0n^K1ZN8%LtsRn2Mp;v0rp9AoH#pZAcXZs#8G2x6IAtQfTSOdK8)C) zbhAu~a-70@xa~gv=KF4h*HtP_!Cr^mpcD)hbNpTFOGfovX!xMKynK6+y~$KpI^EBM zh_KsArY;)F9F3);M*KKu1{s#f|%U7>L0SDDX z-XP;g3VZzNgp+JXs?qR&nG(TJqVXF;si3SJ0l=mX@~J!%;vxr$l!c4SFE|%-Si9V# zN89$I^`J!MVTAEG9UUhqE#j!1(p2(o?@HOTd&mV7`6ya*$}MD`TfrxFtr*AAAs z%ahwASXris*pDA!CPsLuXlTx5maWp7LAI2|8>Z|`Ux5nv(s=-FEJn!i6XjSD=1Z3@ zWg9oqwiERyYK?sN-kKG@Oad?&>I2|+PPan|MTxf(%0io;kA0s$tp|IOr$$^Z?uY_4 z;<(XWv3o5VQzD>`MF61~YE7)D9A+U<=cc`z|ud@ZOu2j^{1lBW`NTjuych%miT z`UK=~?eG^Ld1@OvRNHT_kf7*^lnPl7Qqy(4<}^R3R1Zn+ftefyf()kLh~yqGXT`=O zE5+Pngr*CW^fAEsudHQ4^GP0h6Jx=$j2HC^l2j6OfBpK!A}Xo@9*u&rap@QS{(>=# z%R@YRC|2Yf+LHVShOj2dbByN@00s7r(U^7#ohqW>K%;N(upEfLY2viF`rJn~dbo;8Rgx=YnepwjwZ1~z zL|zup`6dZ_7mpcddWn6lb&T^yB{lEZO$ zdwZkhVyvir2&uXf-9bU~t}sZLJ&cE3UT0V0_%c_QXH+ZLu_B1w<@!xs(UPCxcU(!O`+;~v0ip!_ z*W*i({lsX|M0{vRs!AwNp>M$1@6_=pIqwPhf8aB!ua(|ipiD4Z9!!Iv9!>pDEJayZ z4N_0k?I?`+Np5ZR2ri8WyTlf`5IWHO+d(_*v}rF4l?+r0C?HMgiDABSP?qg-OhxgA zC8VNkp!qc_yvocdrt|19X^qi>4FL2?X~^|mj>C%(Uc`Uimn0>z0AKMEXw|3M%-<#_ zd$f3@;0L^{yu7XbZRY$8iG}y84lX4t-M3WaRXCQBGIC|5`Sy+%u|>ASl&abH_s7YUy=hFoPGn|(bR!lORmaXnH6lKs2Tcx`@JUkSnx;!@xXgFr-5~cv6o(lQ`e-4Bf z`rf)5@H~x#3$JS>QOE63NNOR#cf5{#;}*%Ys|)7b;{qL<^U!a7Li2&N@Uc~GtN5eo z?o1Vr`%j=stTWFnt7fAs^oyVDTv0~()|2P^i@e-7%ijABL$Z#lI|0Si(s%{8hp#eq zJ6qOmmF}vwHsmQg`f5d1PKG!@SBWiVDfk0tc zo_j7fC}=pRg>W9y#KVon2A*WVZiXZQU8yQeQv)T!^4DM1hp;xx$MiciEdggqHB9oR zy9KPdU%+Rj1w4LZCI_2?B8Hqga@=(R%ujiEk-_WOpZDoNZ9bf1DX|+nBwDEh#Y6(i zghUINJy70wc$@4TkC0H8z~hRoIq{{`UGbpf&?_ZMk-`QqD;x&cZ~N=&alaG6&~`+D zoW`1IhcGa5#9arL-PKe`TB7)6PjRWA22RDfpT9D%+K=We)Yb=YJ?#dF_Yv|%L%!G^4zQbOz5wmbP;k^&6&2D1_BjAiP)|Y`Jr@@dcAo|8vb*c=?;k>hEHxjK z$+o(C(Ft2wC{qzq{%VtD3WqW^+TRL=tpaB4M^%J7Hm|BUG)D{GXpWaO@5~w5os{ec zdMy}|djx4^+8?F-ZwmU|l^z3F-nSo!105$o9U*9x)^+)LKzY-RtV~#4@40dm-?!KZ zf;qLZ`tUJmiU=Dh5$HMntUQ1Mv2D=F=&`kHDyzT4If}>IjPTf*!~x0uf9T2b-Y50@)jtTllP^CxvRdm zA3&8FR{D~q(0J@_yY^K*+PeAfDw+KQKA_iqDW#?+61*dzaZ(RqPyX~=RQ##$pML_# z2m${)F2e);iHazBj^eo{B9IG@pxNIg zs2tbM#{1^b369ecJW(dM4&Ya^gV|G~^)qEPd1f6ci$Dy&z8)X%)k@uu9T4%{%!PRU zdg>@9vvsRA!F$)0f0w3^PDN@X>Bv94Sc_;d@{skdEh=HAez|8w)z%xGv@h-nj;^nX3A;UL)_~1O~D$8fmY~iUG`wqAqgyaA)@hF{NU}Y0)DIyk2jit%{&J- z^DD{k+j3G^IpPm)`0^xYFC#^oVQtW*LAU7(8_?NBd-np5ZDrl;wC6Rx4>4d03iB?# z1#WwkxZp0ZXFb5C7M*$vWjApHUvYEiN=Ame+A(j4lbI~$(b(N-phr|<2G2I|#AqPJfKvdAO-xa?9xaM1Rb#%+wv-P&( zsLMm~8$GQ|NJR7^e9U1WZCa1^%c_E$Tu@iKRs(!zK?$uYt1D>RL%0{JNwgmmq;*}T z)MBtSs+woFCjEL=z!N4h2M%ZEU)E++$#!G)c60rrkBI|C-B&+t&~t0$`>_o3OqFGt zcYO*5E*>aW=}VQ~MV+Kwju+W0XLEpXe0U$YpXVs+V)d>huBx)~pAoZQ&|4Js8@CA^ z;FK&WNvuYogbPLuDu7<}!S&Ip3L@`($h%~uq(Oj6j?xvzdCe`eOypbkkxK2#LIVVa zdgFs?11v~?K*lRa&rj2aIy_a3ZjKnMm%y!N$l_1cHqcx=P1C&gl}e=+y5CK&#Tg!v z_NOaG@zr4nh!hi(Aya)N-x~qIH0~QGq=7iMiEBd|ZknK6PlOa-2d(UL(49dW8OP}Q zsdU(<-88zJioKpLO~J^~m3XB#Ad?tTP|&Xrpuo6*KlTCy|MBINfThlkK}hjuMhbc0 zkfAUe)g_<<#r2h=3wqpoP6zF@fQMy3i+--2S4~yEz#!%j1kPOtZB(NS z0c7r3Mx^7wr)d)%*=aZ0<`ktppi@GP5JcM#6)AU0Netv!b0_htqRUsV7@?KYvN8Bq zoq(!ufL7<{3g~Nx0$WIRXL}BSVtcOHZ6J?DE)jKdk)>Nk~rB!&XM$)`PSWHY) zA(C53d-!;9e3xThMy6vNxe1sk?``0jFw^*Q84p&Vygl=kB1x$TfM(3?L;bEK&b8s3 zk%}=wO3?g12gCx~_S3mQjXIc^xpIA`E2kEnB+Ei zq|f&DwjmU|*#PTZ$D>T-4jkE$AU<%Q?z2G+Dd}7fWJ*>RmaAxs4yO-^R2$7UFge9? z8pomIJiV#a{j-?ynf+vSp7W4rq#q$NO!z4ph*Sc}m9&xiVS2Q6Y*3G4bxP@N-l!*P zt;R!;%+UIZg}54cU6i^8pSvz&)9sLJjY8A@qR=;&pjKmsVXF{8Lvrv)GSbq=85NEU z8Pm2pkyWA&zkTBu!3WRbsaEdROg(8)$KNO3IzES`>N9joL{<)GCZ#@-^`~Wp>MR^O zW3eok{#OFwNPipDEiCXid;p;-XX$6qv`zQ&+O5Q=MRXzp0%3P9!3OZ%Js2}N zdSv@TnRqdTVu)-f9~%}yjZ_O1oFOp7A?zxQeN_ZJsnd2k3DaUa-P1Tvv^xZykx+RA zQ9X(}z3LCB94@?g@xr&WW{UJ~nYkYoFOF3#pa0C6N{h?#k=zVLIohhKA-Vemg_%1C zjv6`y_q}RBZ$}v$pl#XG&pZfifBEq9;jmN6wuJk|y4{ZA9(pjiGzy8<@Hn(GE<-fK zoLGkOxVmhk2GS3K9c<-;SHh*ez51>YFs%UBB?pv4!u@~1O@*D=2n!r$d+&mwo`E#_ z^{X8^oIoxB7!18S*_=VAV0x3Gd=^@N#%H0^Do2BoGIGprkFV>!uXKhEL7iU}J+zpT zlwu+jD^nq`D}(Bcb?2&d-Hv;J#?h{%)B#>91*oa2@1Epk_mtjQzO9jK8f@4Q;g7+l zP8I8P&ld-DuSj@w!(cD?c2(|req%xPDh z?keFa!Ry+=bIO{()Nm>cEIzzDj{6_%jLGZ^2825EA zgLWL_uHhtMe<9=7foU50;hm zm%4`XZXT69nFW11GpLDY-(sFD>kgyccA($oDynj!egd3)*@vXMF^WGK#$*&ZK5Kux z^8pQ8d=I~K2$g|VS3 zWi`lmqW0q~Vp3~s zgANM4c=<8}+CZp3ih6AqZg5TRL}Y1!FDWgl?GfYF;0c>D)5I>)Wi4J<41wVx1mk`c zja*y2Ffdd(PPA+o8~^l|*X`lC$ubwQ^Ks*k*3REf@w+N3djrNO@IC@9SJW?HJ7?)5 zIuiQCR-@9mF(rvBkGjYd+i~Qu_0bbxKWq3xWNi|_=EQO)r75(3i|9hfd2Fl?o#HZ$ zCKY&878vlm>!2s#G0^x`G^7J7cqUaPfsH~bLSB2+-MIuxucXM5a4LM0?A7pO{X(%ivAXd)eX1};k2J_ z5c0YWB^b&87)o_qh0Gyn;78JMY68}%{7tZV*$sM%r8B<4VPP!j%zw{O1kDb+E1BM( z#|czx)5Ra<#bef@VJHxtKR5!eLyeb0GFII1ID8^xdcNi$CY z=2GU@O}@oJbuIt#Uix{Mbw8~c0rf*%W4xr+px2fqNT<-RiwZsxTscr0YW1|(ZRLCq z0WwU1KMu8!WiLx`aIkOv;V~FZgs4@yBcwA)A=ZM1UTeoh3`AvS8{VFNq zw)`Gyt*EWS`vu@3^&r(`=p=w&*c8Ff5?*g!o<8D|0HvS(H3$ral7s!=w$z}9xMidF zbFJRLUa*7V4GW1Kas%TIk@9qV9A61DmZC2L0?@JI-dinCwsI`{gmR7z0~>y|)vnjK z-Jf|s6=C{JJ>NP$?V`g;!PI6DkUo4w2-Xs0+#@rPqZ`Y>3mRkK`5a7Zn@lRRTn?Jzqj9C#1y!@FzIU{Qw^Wy2kxpNrjwxK{E zNZFx5-H$JW=VY9ztF}C#@iIOpg0yhJ03MpoIzFCz1C+&aMn-NLK11Aw$rqm(uo=ki zvM_V^B4rGs{sW<>yi>$Ddi=s`DA3RV`3vFYPX}=;_}uN3qi1+JU;q$W204;PFf{|k znfK;7zU`n>`4IEvfn~o!%nZ<1(4Y(L2=j7vzq@wWp2Q4@euxmmwwlhSI|TFD?rT=| z!eY=8F-MD+LVuW9L%U$ii)Vly2;be=>SH{JHAlIKQV(;W9^{Kipmi%$VUYWigoTwA zAg$EfLT%0M`eLVrFOpdCURAlRYS4q*tJY!bRj01L*S zn8Ha>)!s!t0EYkDA*mj>rxwtKAuR!NX&K>Y=#;3S!&cJ<_r(YPd8ZbL&cdwTM091R zDbugyGCo>UFLn7$FJgm%9v}|yZaCrb<~U9u{#hh+&%k)<;?CO84HybX9~7Qzdl7Oe zjezMnp)*V7djU2HFb5vJ#Y%la^Xm5tYv>PB0PZEj^cz?zPE+%lspLCH zvQmf5CaB;M55k|~VK~00ul;F1;TGu0Yp8&a52ZOIk@L%0EXP+%} zas)^Oz{(e{4%tC0;!j+r6MP6s4arPhdEUi}V}!634lUx~V=$uNivm;c`!KnHBB;wF ztU%nH2UL;^>TW>;HF%FN6`%Lb3~jtG0Q_-p8X}8NRMNBD-GvZp_ys!UW1;WgbD&J< z>|4a+X&0+z0#+Obd|oern+;dsLkEw|X1Dv~;Wj|T=ou!UCG*W9$rT*$lZr0%~0P`~5vk=P3MELL~`YA|x#AssP>}_}Qf4ClRQI%`{U@%LwOr zVQi8Qf+`b^4Te0VHvoc@y`Y|KeM_{qOGxq7nIKdB^JTCa<7*0eKht=8^L~;5Pjv+b zcsXI=JgHMhU7>crMm*qhxy9WBcCNt zU`9*_-mM itUlL~B5<8G6n#mFv(IyXLb&1{OH5rRw>TzGcsMmw;!;&xn%5ZWHj zEki6$q29I}HiJ@uKd}XBK?QCu)b3+auEIxXjF8hTFx`3Qctqlr8zX|*Lm4j2o}8kh zz!PzaH24k2ulaeEQwWLs)@*?i|J9f?%5T}d-z6p{1LNc2zzhTUVQAOA*pc%~mNxY6 z3{fBgnGF(*NOTvEW(_u{D^u_PqU%k-YFyj)@nO0*1?OoBwCb8{TN=^bIpz&eopBp{N?R2I* z^7pxQJlcD$#gape8Vp4rr&T*SnoL3FSqeS}p5Z)?uW-kcx60|N{bW3WFD`g7WeBuK z4~exHyeHBvdb`^vSRNC0L~Zd?3;XlSbnt6X9v@x2GAhIFeR-pdzayxfo3{Ms3-Bag z9&7;0vSW@g=+`sXi>>EupD0r2&SFL-Ft zFJ4%`jMj+6vALbtbG-7Oj#%(CW0t&TnD>GLS_QcAM51`fDMjhHn}Ug$dZtX$TrIGz znqtNc^h0G9U*0&Hok7O+c_sE7G^MGSj-STZOlaL>8r_4wqxSa*q@At&XLTLd588)$ z-7Kc^%MQSraz~V|UAv0@$YZx0leMw<{1Ox{;G-4a`f^fz(Rh+Tgn%F_Sc@s@>aV7! zW~%^cRFgjmmh($+?bLRBye}f0cK+YL4e`kyD{z5y=_T5ffZdLoGH>+C z8@D3l<;+&NFnePZx`5Q3OAAaOKPYZbMcH-e$QlO?*71pkONWgbPm%N2;Xiv`8;QmF zfD}Z8^l~xA`2->-Hz;U8-_Y>G&zbC}s*%PjDB|yRyku2JL^%Ay#3Orac6!8(%DEwrhUW)-GD&(@Nm8=gqEIduY@^yiC<&` zEW*(A7>`Z7d|4T-#JYPUj$^)U=k1*aWrB{#Q(s4up40swF2{>8eREg0Z>|yU%?j$d zNn`03!hdBN9{)U_zq=IBt-{e^ya;?1&pF@ZG?za8o?nqQ*zNBQ^w?UCQZliQ{8E)$ zSD^pV9dj9J8?lnBxH%^=K+1Uk7I%gbu)&>o2v}xZ)mP_qbO5#Ar#Bsmz5NPj^(kn4 zJ39IA?rPENC5wd#Su=lfW_0^Qj^#tRqe?Cjrp7OZiaJ) zs-D{cpw#QWl4pTQrPMbV6+ zJk14k*9}xT{w@4@N=t^=haA2;-`jNJM5LsEN5{z-tL-us$2UZ%`ZfsvXmHlO(-pQJ z7c_pQRewP9>-;G)_`Y{SAaSg~xOet28%PK+OYEvpI#m0`aK}fzEqTWhkaZh8)5%;}wPf8g6-`$pu@U~@|yW{eO!Xj(e*zul-o-BH~;RD|Sj zf46XE~BdQZsolVcfVa4xP2rO&Z3H88ZbXi>k)VYg~*E8Zc`RDexs7t=WX`EDS_#!lR~M;jkUtrh1DP*=&)NQ-+sSN8eAen6qDCKg~5V`XSpUi=G_wQHzP3 zHA!~o9MIZs93LEZ8pG@hv(_IXyj)F)$gh6i0?|#12v?wWxL_1;v)_=#v|a8wRcYfr ziI(OQwMNcUpzR=OPE?zv-Wn!j4GQ&Q=Q@%ngp~pm)^g2Uc2R$)gSK+spMhJ;Zmn2^ zreeWNt!vQ?=r}Wkhe@E~fSSbUWe&}uav|XorNvs_z2`+nhCx)DKnn&u$GP)1lkJGo zgBoDUSi3(Tlz$;j1JltHCu;F4@2D!A?ds}^#yH?r%+6c@zYP0GrOj%c{Lu5@{-;q+ z=PakU{G{eOYW2o$MTTt)>MpV3pH8B2v97Nl07h&h(2!>K9@O9d{xuF%hw`21`)>ON zae5BHHTO1Y2t3A&Fzp5C6pgg?{A{5pC|V|+iGefXOhYf~tG{rz$O_;+`qEVa&vxxe+DEfj>CpWPE;vI(}GqNleE8SF(=1F_@F%gae( z`yR=~Z9ad>ofw`{rc7(c=K_lfjE5*K!Zr*JR{;vK$%ughH$S{dgkh&*H`+KmE94DL zMptx>DuYXN_466t^6N3x$8LBq%o@Sc?Vn#3iYDW+pDe?hMYOQo&|vh08a5mfu8o$F z$v?lGakJs8--*X_$ALgP;lH0FT6|F=zH~7!oM2ui@w=FSy z99b(24&W%kX}PSiH)E*Eq~e;R4npLE&#;JhYXsg-AQ9TH$^V?SyJYm>xRS|g5({Dd z`j|WM_apZ46%BnYsMt$lF%dLn^f(AY`UTl}-Z@~p>8_Juc)O^A0^RCNY zA<^PZ92B(laIr0l$vtu|k^BUPnM2KO8dyoan=v$d><5Z{paSMykM(Dnn#Qr$w1GOM ztC2}4z2JNQ{pe26ps5d`pZ|QqYA6Ol*nWY2+vfg+Y=q>9FiVCL*!=OqEugapuU$g(j` zd64|1iO&iPi|F;GA4BC_6#JaT zC?}&7u?Oc}3&q0Zhi8laLSW(BG#KZ77-=aY>j*tx8-_j^?FpQbBxs)?o!%85f70$Mz^lZ zB(3DPh&@=q!5&Dm&>R+7YQKOtfd-v@Kn1cA%!=0o;o^2Fj{@7>u9>M|58hUTUet14 zQxLkOXmn79zh|)+FJJJOXkq|(E#~9`lH3A%`|*B#B&3*?uLo@TS{Y+C@N5UFOnIC2 zIIfQF#X`)<(ZG^Q-WP#kCgW)B?0gci>Y1@v3z6iOZ>-2Ga9-}i_m-6U}QnZuBfGb;hjf3Bct74k=rfsm8}JD z4mH+fQq<*Z%PAdOJQYBLURr$%IBC)b9q}98330^v8kOpnkrOVbZj8#QrYVEAyRlp%7%JE;7Bj{3= z!}QrIP3s&8hJdecXTv)N1rgIWKHwbxl7Y`Y{t4{y0U)h#TsDjL>O`8Zsd@!AGh z2svYZmwf%-rM^sp0c*bYojjfq2`MuXn5c~MR>MnQp5eW=tyP$*t_0nkGLk(4`9RA-CKoXo7Fn8)NN;`E_w1YQVdmfP~kR=NFGP9mZo{k z^Xv69H)ry(e=L4Ctj;!rtUyp>s@~mS^?=O+?l&FtQ({$N!lr8azb&uu6q0n*!9~8533-Hw)L~K`B32gkYq7D1HpkT z=<}=!`gY@5>@Sq$Ssfod<86>DOGY}qp8@EbsP-5rKR^=TEu~(8tL=~0ztD67!*y_Z zh1pXqzT=ss%*8keii6uhJ0p$Oqq;q7NPU^441P@%WY50SMlsc#VQJesmGES}zfW#f zucC9ki_{Oqu15#kCt{8tqycbv4#n9NE5*ju*;d#ZqXelg&9CY~9J^jzut++jz{k&| zFn>Ud#CaFy2Bv^dABPh#83#c z0f#Pmruw*1@dI`ww(fXAT3+iPz0G8xIniN{F#t-Wh=oEzLSNxHa6lArXZ#CP%?$~M zl~fQ_H@#h(LMjiQ-f<4{s^r0#Z6+uj1fL9R)+|GRa3L#f?IRSYq&#bYpk44rXW?@_ z?O{Wo=y;?_(=U$jL)#GbO=UpH0QFo%$Q)q27Mn2t%4_VguWcRrs$g^#t?x#=slvDHpM6Y&wn zaL0(Z>rIWVs}b$SZ;32U4=Q3Bnf>_ws1E=A5$lBc2a%|1OP$Uz z|8fD6mm)4aK?ORWe-|qjB`JU8=uw|)T^7?S$d3lC)d7llmpuD{ihF2h(t~=o&X&-G zG+E0n`+Y1*5Vq8}Syk{82*eW^t!KkGqo{Jp3BrD|M*39jcVRs40i-9*COd5@77dZ%sfYo$LWVIOYlSlk6}Dc0WPscbG7Bqe85#| zDk}RBOYo0@1T8qjaD{>%xk4yG6wIUvQM61Lvz(s3GQxxYGfn|@4EX2pF`N@@B^xlP zZyb^%uD`bHG#oH&LHxrrr_IL%5|dA4B;-DkN+z5CJhA>4Nzn^K9lazH0=+DOAgTHR z9542XGNz5-=bVAT*2y{6m@d-L7PCZagqMH+Yg!fj<9(T!Y42{H!Qe8cdp@Qxs$@rk z$sFDi{qF*v48F!p0#;JpOpYEuuJ+)h%EIs$fYS)L6TwSi7%dtiFx3w*9K_Sz+6XNn zerZmy{*8SQjJv^nMvOR_20=F4#Id5cldBkJ^0R~px_A0d50`^A*F zD`d)efN@Sga&n4$p2IX(HE^9HLbMr9jv(GP(NVpjeMNO4TsmwfgrWxVh00@g_t5*S z_U79+TZg{P-OD5#7$2^ZGu^sbdUypW6*gj9RFoGj5m~5d8?C-Rp||$5!&LEvk+y-& zLenbzMI=tveQeVI5g>PC_eYcVs@1EEx>mM%nwdUsY773km-CQo(en$VZ6T#2G)!40BCTI85BdWR>ECY_dG=dsUfX zN5pll$=U_Y{Kk>XIiz|bdbOr=n(|r*5nGJxtJZs;KzR|R#c-DxP%t&Xo4a~l8x7f% zLbnMFJBz$AHgBGa)h3M-3N@%NJy?}%Q_jrZXsh9_1ktJ>u|%sZ91;F)zPz@Jck2Td zM}H7>2tp`)J9zWHiD)iOITR2W`Sv+9FtUQfxfC=S&D$f<`o6eZHH>M~ z!_eo(>IXLs2j#Cr<~we%_!!C@v-K!iCqgdyZ=qX1%B^ahg(hR119LNLj4ahjTqzFf z*W=qRkC#TNFS4a^Uj9JQ1FV%`cl|xgrzoDSbv>g0n#FrrlM}p>_%z@yPhO~izBY;u zCL-Kk3>gpgoZHs<3qi!9^9Ep)qt4vNl_<3Mv{TPL4&a|9S{qddFJ_|lnu6GEF!cIY&t0Jg^qwt9lU(Y+J)Lk`5@;yGiRT*ikn34*9H zptXm^eREOQGXenh8NWdfxoOL+uUxspel5YUH)PgUpkX|mSA^sF-+nWB)CmX=4f;p3 zct=Cg7dD1efjl$+z_{Lthz&G$#yeJh(=%2l>hajJQF!j(FRk^}MF)fYmUF|I$OcTG z2>}N2St>t&GenC-4Z^t6QW-8YPlAeiU}4nKZHG=@5Z~`^X0nu|)EM4Sb!LDaCV(4( z_#_D>LJTrH_~&-Y3(^dCJs9*85*{lE9y%ue6-DlYvHTVTJBITD9e6TED+2c!PQrRF ziu3@)5#zhi*2%^l6VMTswbBx;K%q5d>eM4bS+Bt~`HDI!BFB_r%K^lpk8jDIx;9o;is|81B;A zUV9EqBo1PrYwm>L2txhOCnI$hd&s{LlSLgIk!#8H-9iCt1075Q;MEPnq`HMVlFX;* z$#4Bb0Ri*~BDVlkDSyvu4FU@|Is|rN4te%WhUe2GGMk?6w6~W?Fb6hc-=z;}!2uR? zL^dEz7z!38K_R8(6@)TuEVeM@5a8w$`Dg)wpXHMuy=(Xd04hMmJk z3Pu@TT&kP@MI3kj%q#?KUwnQU#-Tw%s5g9ZIC?Mey(N@i3$oar)`0OZLsr$_Ii@zCICo4os=v|JnwT-=4fyRYQ28 z=_yQ1ybWEgT7pKT6ppO_&lq6uu(aT(&!4}-d*7b1jFI&1YFq>tox4PrPJc4hJvV#Y zU@SOzLg0!WOiA=N5v^KJMes1%{3|ZAT21k~?=>uC8F0aFPR5KdeRH|WEAa*H!2_#~8jwFVX1mt(miQj?$jPozvoO%?7aN34ooRGKSL* z{Q44kIMK|aM;UBE@-?*uu8CvJ+m-26(IZ>EpMJ(zdKHx(2~DObX3wB;c<=j|33&m` zoqSSg2={6jfigIc)|gGx$7KW`cX7NHGIN{+<1v!favQBSGP8Al4WTwGTr`-v1l2v{ z;f6%MY!nU1fCNQ>&M$-Qx!zg-aT&2k0Lk5N@cqv(8L|FyjVE{t=}1;_^Ey!mdA=C*j0JFt$E-|M^`YjS*_7|-YSx$0w0=pkbSL#1TIYq{zZ1l%{3 z#Xo8cVzJNRNX4}OMs4ae&KhI+jj$U+;X4)*6XCtixADqITSZoFC<<$T8era+678QO z(tAW+Cl1|M+U$C+-1|dTIIw8=~xgFK0R!SB;h+4D`>Zuo9LJD3y%9?uQf7?@qv2T3JjAVGJS>H(#>^2rtt6Se?Sl+6xlUj_# z+Y0n%GMpWP&FO?$e0ZBB?GDJko?hgO@>Zc{iNWKT_46Xu&qMsxTQ9 z|8BfZ*Cw@&m6lefa0nZc_euwQa{C)6=n7b~Qpe}FJ3+-3veQ_P$q3(5*E}%1E!udu zudWbKoWF~y0gRd~BS*AbX3Dl>tEFK*GwRaT79^qe&fYHMmsvqY(>w>6z~E7m#blz z^mmSLA^iR~m<|Qn9*oa7a?iLtPx!*jwLZ+KGa}3(5$+pBI%`54*O~o zi+@Zcwp?6UyCulFYN7Weh<*GlFeH5_nBXtP-z$--wyWEfhcVF&VfI$DpNs_^fnU5MCLdA9@%)Dv&y zU_hk?PsEc@Eqzj&#krQmS9Y7~V|EpnN^hs)&*KhC52p|*;w-r2?WxJ+50lnM6XUtd zccMwqX^Y7SkC}%2f9CBIIk0w?;+xxFE}~U!j*^D`h7Q*D4D#Y9rGGdYN&HE!V)?&m z7ytdkGZf`7pqDabyaZ0CU=QBO+{E~-M?ZE|+^@5K;phjkaZT6en)KXW`F_#0W6c(f zVpXdxdDQ?XEyC8^9yyUK`?@DGWk1i2rmrFWKTa7jTw6g9tvFl=1If?AJk|jB55Uq& zSAC9#KIk^OnL`*WPF`4qpKVRy1(M%KCL{PQ&YLa`zr6lp&17|T%hd>#MEf!cVj|~N znPjJZ9S7BYdS^O|nJGAkmDmxVR6CBq^jW|z_^Ut=k;|g!DzhJTvVWx560nnb_yGcSU z&R4W747LQZCK+VMId0%+6Rn){uD&o*2e8aTlVOqNotJR1&bpa!#LBOR&sll@rI4V3 zNKBjpE=r~6+AL5$?NH=quT$YxB->Fwj^&HB3Q>dXUc|c#cJO$<8-R^I!U(k|Wv)5f1GtC^89VyfR zNQ|a!?I7~{l8damea9;~7~ZN=A&0(^oxf9Bm-30{xpwVZ zLV*0wXDrCV>nU&E0LQ&BSSYOu=ZM&?zS!BOqG#V6YA5Gl zSeQqAU*g=3PGysdIYuUq7M;*D+5rA5X_DvU_`4R&(vN$Gv=*Z?iD9TnU{r|yj8<{( z683B2Og{3eN&h*(qU#?@^cL;uZ;&??J8O4QPtcgb+k1VmT;-diOioI7n z0CgJ1BWd*Bs~1)2W~S_IYSz1e!V`52N6=DqxVH-Z)C%Pm6)feN{=2bPgNbrIw}A*7 z*!N(i-K10yJ5$Eo>O4|ut=<9F`vq0Hxj*Z}-w(Jtpi^+JD6L}6E59F_8p*sgKBWWb^(!YOW7q+Q%0_JEac(saEX>P$-_yQo)Ofv<_!6Hcq5|oq3WVoq;P<+V2>H82gd{0O z-GEgwQ6Xm+7+-fqNta}MCVZw=WA{-8s?<52OO;>(IC9SfCgpOSduGI5&j&j`orSiu z!<_c$Vc3 zF^4Mxj-|NsRvFnOA;c}i3jNEJ7a2Cp7CHIo(*i=y5N%0Ad&`fBCA*$YV#E`?K79j> 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≶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 Xn=R3hJB!-rBQKse(9J(*_0RtSW6DL9 literal 10932 zcmeHN2~<R zh`|8`A_PQ1nSu(UMFx?8j8PC!!VDphaL#`F42fd#7Vlc`zIE4n%Y~eiz4y1j|NDpi z?<@|pSJ-HM`qifhf@m%MamgwK83`XpBA<+azdF#2QsT{X@z0A9Bq>~TVErigKH1~P zRX-!h-f0NJ4Mh++{D}J+K>~~rq}d%o%+4dogzXp7RxX4C>Km5XEI|PAFDmo;DFm6G zzjVoB`@qW98Yl0Kvc-9w09^PrsobmG*Eju^=3f?0o-t$U)TL1B3;sZ^!++3&bGZ!o-*6w?;oOhf z=A+Qb$scV5!RbG+&2S}BQ6YH!FKb0``VVX~T$dzzeSZ$&9=X$3)_7Z{SspSYJ!lGE z7yig_41zpQ)%5dr4ff0rh$@ky3-JLRk&DK)NEIHecf9c*?Z1bUB4%pZjQ7hD!A0r-@NF(^WKdr(LXj|=UE7?gBYGgGQV zidf2`ZT@pzXf7}!NH4q(0IMcxsUGDih(0{kRSez&z?CFA0RVXsVFw3^u=^KMtt95q z43q$b*6#uQDLoiCAF_{RFc{!H^moH_cmll#Fc^KXi{9GDl{>%+3qyfOE5;Zq|6#Hb zp^#1G+z^AXfRKaa9HK;%b3Ux~U@q?xg<2DXP%6k!3E)PA<#4$ui8eDy5|9hA5&{?v z(-;*1%(1~-NTQ`Is1_MGdQ{+i*ccd96ab$R$T3=% zw_KuNF@vI!A>>Y_2pl9L{9h1-C6H8<)J4gKI6{WzGBi<@u3P6hNsXG=bRq5c+z;Gc3VUCe;LIIFDmQAGy+=mRyF++u=drBWV8-^>0yE9N&*05XHZpPlE zxu@?8(ZNy7rm?|<+UNe0Vs6&o?l`Pt>P&WaL~M&#Eh%`rg@Mbb)J&@DA-wheQ>hRV z<(XhigZAT z>=M;URcdCaiO3d^?H<^EiEMDV+7HsTiOhoaMX%P65E<(5xMPJKxf!0u>U~uVqnPN7T!X!o@_gs3Ct1 zlZ_$5QXP4{Aj645wG_SNT&6m|O6~Tsl$q?nK*)(`{J4b=(yb^nOATtF1_aS978$x3 zx>Q@s4i3~IT*+l{@dx~Hst21fR*+5}S1@cf>&8*uLw-0^zK(+OpW?cS-YG1QBZ5q! zgTAgivzoF#`cSz&HL>Ti!!v#?36I1*l^mkrx7Y|K6L#n!-~5=d3;K<;Zqi|gpNUn_ z_^GaQDEQ*jfzh;`j&KXb66fWEk1K7vxQIMQ_#Wu_%3 z4Oeb7FJ`8I>Px;^S?)}2+4D_83gHEq>8qSQY0PVP?o)zAv3K~;R$fnwTmI-=ZLK`= zTm+0h*e+Yfr(IlH3i7gUclNH^!MU>id$Jw>O?2i0Cila#v|twub21@e{S2v}8Z13( zNDrTXZVgris|qYm<0NU(tAPouG!QF4ZNpZPkX~{tVf8xY690JqY1NVdiTtW+NqyRP zZ&;T0ikb8V{wxmFhlLTQ&?OP7 z;(z*<+?J2~z*6asSe7h`$8~Se(@t(#%?BGLVs$p``;CyvcT?7Y!{tIPva$LxCQ&4W z6v#F*);|RXvI%qnoOY&i4S*EL&h%hP3O zLsrFZhv&Hu5tF$Lx!8(hs&?!Kx5&L(fdu}UI5d*wn~A`nPUhG&Rv z2#ixiJdhSF-K2tpVL=)5UkXRuPAFrEW}7mW=uAmtVQ&pGE-&az6@#-(Te^n*lrH^m@X-ftVcwO_#7{WI)5v(?>uC9GG{lcGXYJ~Q8q zbMFl7;t+kV;|;KkBW2!P_o%Czhw&Q(nXlxK9ak&6r5t_KH8#1Mr-*0}2h8R9XNkr zto5-b7P_auqTJb(TJlmJ9xreA=6d=d)CVbYP-r4$hDn5|TIhB>SReMfh&OVLkMk-T zYf%$taLF0OqYF?V{+6Xkn>iX@TuqQ?&cN6UjC9YF&%q{Ut3zv{U2)~$>-3;Dp)*(? zg*$mu8^i=-e#acaj*T$pNowo{xiGEk$%DusaQiS!KjJH96XZ-hXv+jk%ard#fu=@Q z$AM)YWvE^{%tDfK%nD49=PI|wYu}lYVbB#a7wtN^Nml@CE@{Gv7+jo{_V?I*jkdLD zJE|jfdrmVbkfS>rN*+`#l%ZUi5_bMS<>=MBDNlpiSb_tAF|Zy`K7kcp@|d?yaTmB^ zo?(vg;B$vxS|SszusORgDg-*Uitzdi{dUV+glA~R8V(?`3GZIl^egW{a919!j#>f` znL1o_^-b`}xnU0+~KIFLQ)$Q6#ym%)(GYC`^XM*{g zv3AM5$+TtDRs%`2TyR^$(hqE7Y1b&`Jd6dS6B#hDVbJlUXcG3y*439D8MrK!2D~6gn>UD4Imctb z+IvAt0iaW73Iq$K?4}H`7wq6YkTMm`tcktXgK0lKPmh=>h+l}Y+pDtvHnG>uqBA)l zAH6BV4F}v$(o$8Gfo*PB>IuaY1*^*`OTx4|hM8jZ?B6HY;F6p4{`OcZZ(us-RVwDx zUzJrCQlp@mz1ZFiSZ*$yX3c_#h9J;yBE$2g%xjmGF4ca z&yL`nGVs!Zxsh^j6i%$a*I3ZD2SoNT`{D%mU=LKaEwbN(_J5%i-6Va?@*>=3(dQy` zOv%$_9lcy9+(t>qohkuU4r_P=R^6ME+wFu&LA9tw9RA?azGhjrVJKy&8=*qZT5Dr8g--d+S8zAyJ$1HlW3Olryt`yE zFIph~Z6oF&o64rw{>lgZISC6p^CBer9C5G6yq%?8tC+)7*d+ib^?fU!JRFxynRLEZ zj;?PwtS}Ao#9whV@KEmwQgM0TVP{hs>dg(1*DiMUOKHdQGIqa0`yZnHk9mtbPfoLx zo;^V6pKUJ!5#n`w2D&381#5#_t}AlTGEgDz$^;u;-vxDN?^#5!zN9ngytY@oTv!nc zp1Xn8uR$1Z;7vY`-<*?DfPHB;x|GUi_fI9@I9SVRv1)qETbNU_8{5U|(>Du84qP#7 z*l9Y$SgA&wGbj>R1YeT9vYjZuC@|{rajTL0f%N@>3$DFU=`lSPl=Iv;EjuGjBa$Gw zHD-;%YOE@<-!7-Mn`0WuO3oWuL6tB2cpPw~Nvuj|KM@))ixuDK`9;jGMe2d)7gHin zS<>k@!x;!TJEc#HdL#RF(`|4W+H88d4V%zlh(7#{q2d0OQX9*FW^`^_<3r$kabWAB z$9BONo5}*(%kx zOXi-yM_cmB3>inPpI~)duvZykJ@^^aWzQ=eQ&STUa}2uT@lV&WoRzkUoE`rR0)`=l zFT%f|LA9fCw>`enm$p7W^E@U7RNBtsh{_-7vVz3DtB*y#*~(L9+x9*wn8VjWw|Q~q zKFsj1Yl>;}%MG3=PY`$g$_mnyhuV&~O~u~)968$0b2!Jkd;2MtAP#ZDYw9hmK_+M$ zb3pxyYC&|CuAbtiG8HZjj?MZJBFbt`ryf+c1dXFuC z0*ZQhBzNBd*}s6K_G}(|Z_9NDV162#y%WSNe|FTDDhx)K!c(mMJh@h87@8(^YdK$&d*^WQe8Z53 z(|@MRJ$Lk-&ii74MPIs80WsOFZ(NX23oR-?As+*aq6b?~62@fSVmM-_*cb1RzZ)`5$agEiL`-E9s7{GM2?(KNPgK1(+c*|-FKoy}X(D_b#etO|YR z(BGZ)0Ntfv-7R4GHoXp?l5g#*={S1{u-QzxCGng*oWr~@X-5f~RA14b8~B+pLKvr4 zfgL|7I>jlak9>D4=(i(cqYf7#318!OSR=^`xxvI!bBlS??`xxWeg?+|>MxaIdH1U~#1tHu zB{QMR?EGRmQ_l4p6YXJ{o(hh-7Tdm>TAX380TZZZyVkqHNzjUn*_|cb?T? zt;d2s-?B#Mc>T-gvBmQZx(y_cfkXZO~{N zT6rP7SD6g~n9QJ)8F*8uHxTLCAZ{l1Y&?6v)BOJZ)=R-pY=Y=&1}jE7fQ>USS}xP#exo57uND0i*rEk@$;nLvRB@u~s^dwRf?G?_enN@$t* zbL%JO=rV(3Ju8#GqUpeE3l_Wu1lN9Y{D4uaUe`g>zlj$1ER$6S6@{m1!~V|bYkhZA z%CvrDRTkHuajMU8;&RZ&itnC~iYLW4DVkP<$}>#&(`UO>!n)Po;Mt(SY8Yb`AS9lt znbX^i?Oe9r_o=?})IHKHoQGKXsps_SE{hwrg?6dMI|^+$CeC&z@*LuF+P`7LfZ*yr+KN8B4{Nzv<`A(wyR@!|gw{zB6Ha ziwPAYh)oJ(nlqSknu(8g9N&1hu0$vFK$W#mp%>X~AU1ay+EKWcFdif{% z#4!4aoVVJ;ULmkQf!ke2}3hqxLK>eq|-d7Ly7-J9zMpT`?dxo6HdfJA|t)?qPEVBDv z{y_b?4^|YA4%WW0VZd8C(ZgQzRI5(I^)=Ub`Y#MHc@nv0w-DaJAqsbEHDWG8Ia6ju zo-iyr*sq((gEwCC&^TYBWt4_@|81?=B-?#P6NMff(*^re zYqvDuO`K@`mjm_Jd;mW_tP`3$cS?R$jR1ZN09$YO%_iBqh5ftzSpMQQtxKFU=FYmP zeY^jph+g<4>YO;U^O>-NFLn~-RqlHvnZl2yd2A{Yc1G@Ga$d+Q&(f^tnPf+Z7serIU};17+2DU_f4Z z@GaPFut27d?!YiD+QP@)T=77cR9~MK@bd~pY%X(h%L={{OIb8IQmf-!xmZkm8A0Ga zQSWONI17_ru5wpHg3jI@i9D+_Y|pCqVuHJNdHUauTD=R$JcD2K_liQisqG$(sm=k9;L* z!L?*4B~ql7uioSX$zWJ?;q-SWXRFhz2Jt4%fOHA=Bwf|RzhwqdXGr78y$J)LR7&3T zE1WWz*>GPWKZ0%|@%6=fyx)5rzUpI;bCj>3RKzNG_1w$fIFCZ&UR0(7S?g}`&Pg$M zf`SLsz8wK82Vyj7;RyKmY{a8G{2BHG%w!^T|Njr!h9TO2LaP^_f22Q1=l$QiU84ao zHe_#{S6;qrC6w~7{y(hs-?-j?lbOfgH^E=XcSgnwW*eEz{_Z<_qWdJM_~J|SY|xXabVJN2ktl0rgjIsb3I^PBI?aK2$7N~_hvX0wqgRya5qKscty3rOfChkv6Z0WyaHE5x_kZFD*v zu*7&g9ux`%nmBh2H(3V!(nZ*%fR5|PZw;VYx`bKcL!l7z`TRDJ=>8jcpRVC7w*|e7 z!D#*wu1Epbzhd8z2TSr!o3TI;Bu;_PKH|iU+qfqHvfTw&moYB|{54O!qO(0RM-^0tbTu zYPA|hqY>P0H=E|&`mg<>+W*XvP;UayB-E=N2bN3~kTa5#j|=Yz#! zp$|%>QWOsCkp`B_Wmv6N-9P~jzb_2Kr9wRIDZ_baWa-lC8&;HkOp?UU8vRS zAD(Q>>-8d&$-r*^c^Wku4b4?e+Ops8M>?HGB9Q>gvdCt$C>Dz_nM`mxod^bl5Cj30 zN(ISe5)0e}AgOL~aglDB=Xo?54H%6^dXLOW10WxT%t@7)1SHbwbcjSEf5Z(21ESIB zxFyoSe_;^?lKwXo$6KpngWZ@8(E7AJ%0&jh3p{5*tu=$SJFjryZ>riqgLj9mc>M7B z4zT&;K}WlKPx$?ny*JR5%f>l)FnDQ543{x%ZCiu33$W zg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9Hfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH z&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr)C01LsCxk=72-vXmVcK>PAbAwTqj;`=7>HX zM93AwkN~n3*c#^KTQF}AzdqL{zi@>Zh*Ssn#E}f z?2!Tdd=!N|E`LQqfZ!&&jLDjEQ&kRm2Au4n1MK0N35-SfX2&{q-XJr=-ElMh0X1pR zv9tJC^8;Ev)6EqkFe?kk}Ykyy<_4SDiTi$Rn#7M z#~7%V)LWyXv{s~4MNooAQOx#(NRVokSg*RehExT?52E|Q8iT7uL)vITMJ;Y^P^)|N zok@1tH@+J*`*y1(e;9mb=GmFwJ2TH53UR_EG|j}t#X%yGuzwtG-AD8THKfEo_a+u2 zr1;sA4u^lmC-?qf1^71m|ayd6(R#q0GqM}$0KI}opgGF2FX!Q{6Y4D1noY*a3b{9Ws^swa%;;8z48?K-Bp}X7#A23-ZC*X}cxT+Cb zAI>0VNeP>#aTVqOnf2geb*iVd_6TCr{OOG1lcX1bmVe4DV3-8>=6&lx)G6s1%_*~h zXI}$8eD~i%V(X^LeBJ4t;*+8mfR^f5fLmKzXl-qUQmKSar-PrLAJWp&;Oy+o>A$hD zftHpQOifL}hPg`x1Oy;8H5HDIj{E~oOiUm?J|64q>&CL)-d@zy)S#oI0}&AsEPrw{ zPE1UsAAe;~cXv1SC%+2`3E>ZLWn~4?(a}(=)hH?|LP|;s1OfrNy1GzRRfX8tSlTIh z(-5__wIMSzla6v(Ss4Y@Gq>RO_IA|O)lvW1*;%-{y7B|q(9l3fqN1V#<>lqZa*_`W z3`BEtGeSc{DMWR3HA+iMVP|KD&dyH6#Kai=YkzBN;o#tal9CeC*VjWPlko#MHa158 z78Dd5s*8+_q)DUEATKWuO-)U3a&p4p;2?s6f)4rT=jYQ=HMGeK;O_1&ol=oV#96cTBS)ovfy}dpD0KL4tFgG`c;o;#!&(h7!O}eHgCnw?S z>wilj#bPm?-mtK+LlHhYI*R@MecC2(fVsK3w8QM|Z1nf{!{6VZmJ{fNgaj-sEYK(> zQEG2*kDi_$I-*jk6n%Yt@b>nm{?pUb$jHbrw#ge{aBwgUj>^hPx|ex)c+hE5sZ=yl z)6>)G+OxHN{G1`%QBF<{E%Wj5fv2Y@^?#e6pQnLDf+RdVoIgM!60xK+5{YEvB^{Az zDl9BSa&j`=h>eXh@Qsa)^utKB&dkiva`JJ-#l>{gkE&yxBxGbrIyg9>dBccti2##n zCW%Bi$&)}kuAb{Geij&KC&K4H^8a6#h5tgQ7f{b6jm|m{`e)R!07Wlhd;5v~D%PDHLkV1h`xN6Y{K delta 1263 zcmV@pi1MCNO0)IV#%ludY7y^C(P8nmq zn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^ z0;J00)_^G=au=8Yo;1b`CV&@#=jIBojN^JNVfYSs)+kDdGe7`1&8!?MQYKS?D#s$vI-^)!+G(}fY0@GZE%Iy@h8^{To?*ybtdaV z#dGpubbrm88$G&G)t}RfNfHWj;miff!TI4N-053E5yn?^gn~>Efgal6v3aRQH6&5h z5RdxeaKF#Z3DF+wT}ipqw*r>6L_o>H)_@;IH+E!`$CjnG=I69xv5?4rFE5T<_4z9k zUE13=6Yl7M&)0VYdRh(na56)ifvXBQ9rBHSpMOyB?&C3B2(E?0{drE@DA2pu(A#El zY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEUghdWK)^71EWCP(@(=c4kfH1Y(4iugD z4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ!)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup z8Gny~yBS`4IM3Ejiyx@r7k6FNj3I&(u=gRCXSyuIdEq9`!w_5#8|1lh<}9zje~vrj zSvOi;kBKp1x_^6dt;HYDvVDC|!;npFnu?Iwkp16`aq;61 z(bxp^tR-32bxI*$q^qN~E=WtXi*Lvr13@UdTP>e%gS9JH6E0gj#d#qJ@j6<$^6L;U z96QH9<5?VA^D`+63@3jYg0zM}Vnuf+7mvTh#+B{(=`1atgKG`0V?kn3XB$_3zkkE- z<6kn8$>UfOK*JmOBy6`wGVJO*%iu3V&@!!@aV?BzS+#yS=il1R z>g7u?fH5<|9S}wLf|2wx@ELQ^JW3#kM*rj72*DX61F^` z1H57+xxlx;4(6i$CY4j99!ubU1ZbWz@uFLa`oyWZf~=MV)|yJn`M^$N%ul5);JuQv zaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$NIIaX+dr)NRWXcxoR{>fqI{SF Z_dm1Ylv~=3YHI)h002ovPDHLkV1gJJWqkku diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index f091b6b0bca859a3f474b03065bef75ba58a9e4c..e8798c9c33656890b3ed4f1431dbc7cc9ef210eb 100644 GIT binary patch delta 1781 zcmVN5p3D5{0!84lrhgP|zAV*Y)5U7o!RjEWd+Cqhh2m+NNH!RS7zp~ps zId<7?yY45M>~DTE^PBhm&71e$&WtYJGj#uL15}NKU_(PgTz|fNS>^%hRS3(k#cJWc zP#1i^#sxQ&V4r}SwFpYB!g}Gp0DBZfcp^#GF*|nbKxb#CNS}mYJv}{yg@wsHaYYF{ z^EnXN!QB@%VLr+g-1q>lsoJ9Fby|QoVV}wtynFZVi3O`W8o}z$xPm+SVVYKnb>%Hs zFu(H+gY@=3SWRTivsQS}GFjuNi{IYDg_eH|0b+hcZ1QSs_{WtyQl&D|_2PspSMb9j3-MJi~KlCel+W#xouTw2}H z2v&DAf`8Q=jbKF?92~^R$Ot$bjzZ%M3=FVe0|SHUFiXI+2(GQI#o4oGaqHGCG&D4@ zzL_&;A|N0DyLRn@mzUS1#;K^Nz`1khaOch)G&MD`zBzN|VCBk{h>VPctE;QRwkjle zbaWJ_PoKu2Lx?7kK)LYBZ74c3kxh>yqF0qFE3}JNx;dICsAKt z&%}$nI=OB{Le%Vm?&-QCS5PhR8}Tvk?w=;-Lb z2Y=DkW#Y;0`1joK@G!1ky~BZ{IGmoy3vhZfJ0mXVQFc}L=lyhl}v17V({Yq(xlvT}86Yb!D{Gg+Ggn7g~XJf_PhSX*10 zMdi4-IP~=NAT%_TRas_cW+MCb_xEG-=FQBN`NxqcN>zL)ol$-zD2Sz|rm_!fgz4() z!rHZK@$TI_woXBkzD1D-xzo~t0|!{KKxHN6WC}ie_wI#{j}N;_R4|aZntz%awm-Qp zxiGo1FcjsDjEvaCQCgyP8fVFpCCvTr-@lJjr%nkacU?PO0P2eM=F2DuGfQg-S~& zCnr34@`T-!X=!P!x)O&{$$$Ct=i%VsAak5Wix#m`lnM-r3H-puhdhQprAkapWCe^O zDEx29%E}5!NlA#0k4Ir)A#-sGROEVe^_`t3_vy#%*|U+Ioy}agsHg}pUc6wrmvT7$ z>$0=6Q`A((wEZ6@gSKwns_-~-=gu9sa#Iw|6AyJqBUs(h2v&DAf`7H7yjLFL6;M&7 zsxe4j`nZyPTI@SJQ6vN#>!S+>_;c)|F2*qLsD!dbN_ag00000NkvXXu0mjfzRiQE delta 1572 zcmV+<2HW|B4zvuABYy?^Nklc)UfJ<2uenUn3ARN>mf|M z+(eagCX~wv_9N9Br6dE4W@{R1X8yU75JVAXqB_2?1W&7xoYHg zkR5NEVWsUG^?wLzRHH9Aa#eCDK9NvdPE(De9-HaQc(6~^lpTe2pm3&x9G1K5Xawdi z4F*DRWI%>vgEBPFqaRR51|&E>B!fiay027YsK+Vrn=1PqDKdi{m<&P1nQ3_Gw<%cH zHU+slT8moWCbIKH=(W3t1j5BNfsIKQ#Mzi(J59kx zT!xVJ&SKqb4XjdxWQV7$IrZ-{l-x3`7M}qzHsPzP1S_$c=96h(q%b9ZXPvcV z;D5oPsau6Q(U`-YLD*G41z_cgz)a99av0W_U=aHAj?mj@2KZI50efIA zO8^kn_?FjaZ_hfbhSh@3^GzxJx*P{Jc7Hi*OHPZ!wvEV2a9XKq###zPPeRs75i0(W zU?doBGb9yqT58~qn?wQ4oCi3oWdc^W%JAgTVR)*l33@Ky3ip4Rqz14Wx_gwsGYGq) zMY~B;*z8j>WF8xV`^#!USYHDVZf}I{OZGzBnutHA1D(}!4{};5>;)mO27l7F zHh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG;P%vktHcXwTj~+IE(~px)3*MY z77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC(zYC$g|@+I+kY;dg_dE>scBf& zbP1Nc@Hz<3R)V`=AGkc;8CXqdi+`PV3Vc;#lxQO~AoO*}pfE+=*r3ffZ_YMC zflq>i%a-`Xw)YRuK;MUtq{SGa7vtY^gg0bKSp&F>y|A>h5qhqSvgdtV{(lh0c$xz5 z;*U?KQl%W)htLmD=yhL!@aldLHW(=H00^&qu7J0mA5v0IaX@pn_bKobsC(e>(nAjI zzjyto3Dmc!oOxjlw&JZqeL%+vsN0Zy8@1@rs~rRNAqO?umG&QV WYK#ibz}*4>0000kw~v5k`E^KjGrtm$<&fj2iO;%*=yio>ED1xi2(K4&;cIJ18j2c4LuQ`AZbx->HGjs(#}N?`f#Tv~G&MCLGBPrF zsMqVI0VXCUP*+!n*w|PYjYec-WWZvvK&e#1YPBLSFAwqY@#yI2z~bT}tyZ(Mvlt#8 z29L)J4r;U6U^bgEHa3Rr?5%frVPPTK+uM%=>NA;42oDdZV^UL7p;DF8jSy?`xKp;R>RTbLW+USvz`q4HfX3! zCWFW0!PL|gT|Lp}<|b-uYbms~wUsWQx3?E1B_#+8qm>ZT)6-a8UG=NYoS_7ilaqt| z{CqStG|(bU?sQ~i1pWQ}C@3hP3o0usqu|QQN`E*U4%FAz)6*e$A2gIC!N9-(v|23< z=yJJ`oScl&(NTJ5L@6mLG;7I@)oL|_LLvR+F&GSfN6r~aB#}ta+1W{V=ytmy7K;PM zBqb%$3@3{sIY8Qe;`DOh5=0sYywyRT@!HH?E|j zMhb#%s#4upT=)UH*V?AKa$!XfDp{yYMM4EjBZ*)|sUM-0QcIzVVEUzzCX>V@GwETqrXGsdu zA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnb zRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yIC*%Wgg22K|8E#!~c zTNYR~@Y9Kep?_ava@M;M8kmViU%_&qKVn19EJb6L%o<5ryPpl%8u^fhsfT?9!(e|z zYg7{msk{Fg=+Yccm!Y>{*q;KO>K8^PXf0r1U?zrb1;c^{Splu&<;=9>z4K+dat5se?oWZUF&sQo;?$JL1+gmMrdqaw4-)Uy6fE`VS`NRWHPm9hb$Oljeq3qzfzL34WA)&3E*EQj_ z#)s*NZh!yi@GmiUwp(6LfzxI2{CJ7UMd-?TP+;I{8J_M5c&a;WSjjcpVCBWnFDBgE zY1z>1fzN(l;@ioDEiIOtTMPkWDu!pahV1DHm#V&=)a||1#W682UO8Ff#AHHe&ajZc zxl(1kEaPYZ6hwubN6i<8QHgsu0oE)iJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+& zK7ZsKxz;@6=dLht@F-X3N(9#6>iA+L6@m3xzycB{LJO~c@)K`<_zg5y-Q>ju`fuOJ z$ZNaU+|lB5Y}R-@XC#dRJIOdB32iJUA<4bXt Z%s>0@A=V4gM}z;=Six@BjSnIrp6N|B&Dvfq&%xR=`})B06*COk`$e zj`$DJ#VF|=fQw@6>VW6PF^Cx_{REQBk^k3oOi`6ptVE=pjqdqdw{FGFn>W>DT14I4 z+^}fTq7g4DsYN(sa956<&^gLVL%h^06J|J^gT1o%gp4@A>|W=J8bW&u;i=%KWm2uW4(8!D()|ml%kn zNkJ&Ev&EpUHFOdkcm+v9DUP0~$BMC(;0D~&2o&ak>NT6?hWM=&5k+-~KN*WCxk#ot zUnkM@YHZVoutIBm*)X8jGjT2-qwK-VRi>1Lz)Y4!jYH84m=qJ;F zZ$rje69bW11C%w4Jx?#9-Y&q$(~Q(;oFFe%^@7!PEe%$pmIf6&AUS0?Z3BkH`>kttU0UMhU9;vIKs;UaPxw)vWu0~s18=Re;F>BT= z#Kpy7&6+isFkymGdKyKvp`igWF)_Gv=Z>2E(W6HwDk>5!IyxE$4<3Z8tET^l+B$x7ykbK;x}5kx3?F~ z&CLi8566`&R}c^oU_PQGuy*ZQB}poqlanJ{R)Jf$ZXqEd0rmCuxN+kKVq;@*>Cz>o z8-H`7mMmFu2y1tBbz$}D)u^edfvxQbFI`Mc^y<~C zsI06MeOgs2l|mv>Uy5$V^R{f+GIVx!3S|`}Z{NNxNIri2Sd3@So{ckS&S1(EwHIcX zIB_Bh3JTEO-Hr0{auEY6Dk`va=~D9$Eq^O3Q}%c6+^I!Ufk~4l;r#jYc=6%|JUl#v zj2pCk`EsE=5g8dNHfp3ZOzZ91wM!5sPMtbsKB9N;-W7j&E*C6VFzQ@JOGU&ye*8F+ zlanEn4L?XvN=g!u*52NJ)HQf6c`Vx7+m+XTT^K}kaB%qbhMk?AUa5oFw{IUdZ-3q_ z&Ns1T%NAiNeg9wKHHvG$E({{->pT3~gAtLbB`7Fp#JN-~H8oYF2!gK2{>F_P#du&~ zK#(2D{Ru{G#d)4FV}>Cr8%A{T;>F6>|7mGyB46sV3|*A2N|z-Z9UVn+!3a#SxL`p* z&nPS`go}%d)*3{5db--R4S_*K`G4x4k&;o6iJU25&z?PM)eDP;RjXEsgikOqm6nzw zG&EE>CowS*XV0D$edb`2Rd@@*qG9{??Kp7YfEe@p3Kk%Sz#yV@zx@1sQRXpvW@TlG z$jNBPf}yFYNu&!_Jp|p2X~ECWPi>w3`}d=@wNoI7_;lz>#`$&)9@%gfW6$EZw8YF0&rkB^TiBI4uYMH-?7nYvWd7r}_j z<1ugEJVVtruGVE0Lu)Xi^6arxBWUqCbLNN|mIe7}frj~&?n}4L&d$cQYu7}8BIw4f zt~PDjBwXJZ7=8ER?(U8qJAZbF#xjio#?#aDweB{!F(kxBt3G}DR0Jk|3S=sn^nR42 z*^GgMg9D~cooXVD{)6?#+tOeqYH6?%wKV8Ow5=DoaBsX-F$@p8$DTuI5%q9F$1@FC zW$SQzTR;vS8Zs@SzV2vo_dpZBuQQWgCWV(X+5)^$Tc!R4R+}hqD}R3o$2V~$kaB1y z{Y-}M!>~>I3tnoVhIis3_f`*D0#H4c2# k)*^4a$C&rdk{r|k@#O8@`>07*qoM6N<$f+X%jMgRZ+ literal 1716 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 2ccbfd967d9697cd4b83225558af2911e9571c9b..c17185100b27ace20f681c27e9d5b48f0674f060 100644 GIT binary patch delta 1167 zcmV;A1aSL<3Zn^-B!6m2L_t(|0qvM+NSsF)$N#cx59_v4jg1Sn+b%>SDiTi$Rn#7M z#~7%V)LWyXv{s~4MNooAQOx#(NRVokSg*RehExT?52E|Q8iT7uL)vITMJ;Y^P^)|N zok@1tH@+J*`*y1(e;9mb=GmFwJ2TH53UR_EG|j}t#X%yGuzwtG-AD8THKfEo_a+u2 zr1;sA4u^lmC-?qf1^71m|ayd6(R#q0GqM}$0KI}opgGF2FX!Q{6Y4D1noY*a3b{9Ws^swa%;;8z48?K-Bp}X7#A23-ZC*X}cxT+Cb zAI>0VNeP>#aTVqOnf2geb*iVd_6TCr{OOG1lcX1bmVe4DV3-8>=6&lx)G6s1%_*~h zXI}$8eD~i%V(X^LeBJ4t;*+8mfR^f5fLmKzXl-qUQmKSar-PrLAJWp&;Oy+o>A$hD zftHpQOifL}hPg`x1Oy;8H5HDIj{E~oOiUm?J|64q>&CL)-d@zy)S#oI0}&AsEPrw{ zPE1UsAAe;~cXv1SC%+2`3E>ZLWn~4?(a}(=)hH?|LP|;s1OfrNy1GzRRfX8tSlTIh z(-5__wIMSzla6v(Ss4Y@Gq>RO_IA|O)lvW1*;%-{y7B|q(9l3fqN1V#<>lqZa*_`W z3`BEtGeSc{DMWR3HA+iMVP|KD&dyH6#Kai=YkzBN;o#tal9CeC*VjWPlko#MHa158 z78Dd5s*8+_q)DUEATKWuO-)U3a&p4p;2?s6f)4rT=jYQ=HMGeK;O_1&ol=oV#96cTBS)ovfy}dpD0KL4tFgG`c;o;#!&(h7!O}eHgCnw?S z>wilj#bPm?-mtK+LlHhYI*R@MecC2(fVsK3w8QM|Z1nf{!{6VZmJ{fNgaj-sEYK(> zQEG2*kDi_$I-*jk6n%Yt@b>nm{?pUb$jHbrw#ge{aBwgUj>^hPx|ex)c+hE5sZ=yl z)6>)G+OxHN{G1`%QBF<{E%Wj5fv2Y@^?#e6pQnLDf+RdVoIgM!60xK+5{YEvB^{Az zDl9BSa&j`=h>eXh@Qsa)^utKB&dkiva`JJ-#l>{gkE&yxBxGbrIyg9>dBccti2##n zCW%Bi$&)}kuAb{Geij&KC&K4H^8a6#h5tgQ7f{b6jm|m{`e)R!07Wlhd;5v~D%PDHLkV1h`xN6Y{K delta 1263 zcmV@pi1MCNO0)IV#%ludY7y^C(P8nmq zn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^ z0;J00)_^G=au=8Yo;1b`CV&@#=jIBojN^JNVfYSs)+kDdGe7`1&8!?MQYKS?D#s$vI-^)!+G(}fY0@GZE%Iy@h8^{To?*ybtdaV z#dGpubbrm88$G&G)t}RfNfHWj;miff!TI4N-053E5yn?^gn~>Efgal6v3aRQH6&5h z5RdxeaKF#Z3DF+wT}ipqw*r>6L_o>H)_@;IH+E!`$CjnG=I69xv5?4rFE5T<_4z9k zUE13=6Yl7M&)0VYdRh(na56)ifvXBQ9rBHSpMOyB?&C3B2(E?0{drE@DA2pu(A#El zY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEUghdWK)^71EWCP(@(=c4kfH1Y(4iugD z4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ!)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup z8Gny~yBS`4IM3Ejiyx@r7k6FNj3I&(u=gRCXSyuIdEq9`!w_5#8|1lh<}9zje~vrj zSvOi;kBKp1x_^6dt;HYDvVDC|!;npFnu?Iwkp16`aq;61 z(bxp^tR-32bxI*$q^qN~E=WtXi*Lvr13@UdTP>e%gS9JH6E0gj#d#qJ@j6<$^6L;U z96QH9<5?VA^D`+63@3jYg0zM}Vnuf+7mvTh#+B{(=`1atgKG`0V?kn3XB$_3zkkE- z<6kn8$>UfOK*JmOBy6`wGVJO*%iu3V&@!!@aV?BzS+#yS=il1R z>g7u?fH5<|9S}wLf|2wx@ELQ^JW3#kM*rj72*DX61F^` z1H57+xxlx;4(6i$CY4j99!ubU1ZbWz@uFLa`oyWZf~=MV)|yJn`M^$N%ul5);JuQv zaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$NIIaX+dr)NRWXcxoR{>fqI{SF Z_dm1Ylv~=3YHI)h002ovPDHLkV1gJJWqkku diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..ed410302431d07099b74a694be9e92504f476889 100644 GIT binary patch delta 2291 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 P00000NkvXXu0mjfCj%OO diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..aa1a8676fb921d138a98582211f4e4349c56a48c GIT binary patch literal 1470 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 URXYu{>Hq)$07*qoM6N<$f|HyVt^fc4 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..02bd49646fa5b64638c1393c9a93b67ffec5fe7f GIT binary patch literal 3062 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index a6d6b8609df07bf62e5100a53a01510388bd2b22..1211a85d05b2c8ded303d2bd3ff9487913b94c5c 100644 GIT binary patch literal 3261 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 P00000NkvXXu0mjfCj%OO diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..b51900afffc13b9528597cdd42b0b7b93681ac6b 100644 GIT binary patch literal 4770 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 F{sTHMI1&H= literal 3831 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..d016cd5f6d45d18cf680a0890b477cfbaefc442f GIT binary patch literal 2114 zcmV-I2)*}-P)97uT&aE>HGjHb3N~h-il9ze!zU|y^&OP_s``)vK zh*oU>YXdADL4j;+Y!Db2sP)9|9#|FEB1pB|$_hO}o+vVreR@$+hd^mJY*fqrJy2q2 z4XL(sOG``9+1aU9E+~+jn;RZIdZg7DNhchgc0%nSnLyo-lGKgt4_q^F_hScKRLif& z!^6uN_1ez$@$o@rWu;oV*u*%90&x%p;vfpdL1%&5rLcS5gs(cJaG>orDI7H&TT%<{ zU7(qe^{m!H$#kCG4ku* zQLM|&`-{*lK$|*y%*{rfK&OAk=a}VNVt39gw1O<|*>fF$R;bynYLio@Q zcger4rABq1pg>(curs?=7KUt)D_CbSQRE;B#6c8@gD4OOQ6LVYKpaGYIOrvim2B~G zGm|C#L}fFZanKpP1ag!e{c5egCRrAqzW{X--H#WW7za@x4x&IDM1eSn0&x%p;vfpd zK@^CCC=ds;3e?!xh>D5|w6(Rt!@~okMva24t#P-MN~L)5;st7JYhiD1kC7usV(?(| zJ()7OKph<&IC}Ib4jw#+f`S6{^z;sVTwPr;fBt-I*suW;CQQ)lx{n_}#_rv_apue! zG&ME#*%uTPgq15-A}%ftj*c3ih#Q1S1u8Eu$HIjRQCL_gxWBo%8QIy{IDY&%Hg4RA zw6rw#Hk&p`U^;H=)~(EYgeWR1!n$?quy^lXoH}(1!NI{s*F}!W1fqX9G&GdCK9BD1 zZfxJa9nYUX$FXC_H2&-KO5Ezzt8w`7VV!KC>&=`w6W6X?Lr6%7UiNFkBm#Z-@BtAK z5q-p&HfhEMQ(manD#xA`p4Qt5>fS+lh&Z*tTsOtgUv2^KD%$_|PPoF+z<@E9-iKi?Oi8g1>oIdYK`uh6f%9Se^J9ez1Y`}m4 z?2nl@ZyvK@^XAR0yt=xYty3H{7NZ4fZEeMY0|yk_QBhGyPfv%Hm6hP}RMFeFZ?k{- z?c2AweEBjHPYwx36{g-#&g99HapA%RczJmVUX$*Xl$3;L&z|APkt3{(e#wp@Lxvbt zKcfYr$}0CNhxqvTKHd1HO`CM`Mpcw;ptQnRj24KJ zKRLQ|@ybwlPXRq6BSTR}fju)blL=-B$~Gw5W++Ar6c7-gSf@mhf-7~wJSfLmv0??w zgXBYAG;UASWj$tXj2- zH47puD+^=BjKP*ITLj}rRaF(j!^8UwM<}>ox^xNS#*I^y6&Dw?eCgf0cWis=)TzkJ z%fsl=qt&iS!;w9E_F(`1{fe^K*jUR+6e$5bdGaL7YlxJT6x_OXi^Ui6Flr*SFDEC5 zHBZOq#Ouix)2{&ZTS7 zeN2H#1afzG$GLOoFl*KSDWmF*#A<=|#9J(eo!R5=BGw}%;Mo@-K z3r%%UzC(dt8S-cv(wM?~2$Ky~Dciks=MEbum6eq#%E|pz#Uatwu3d{=yLPdPYJ!3` zC4SUoDG5|g1B3)8kE59a@=8--(&-NBH6A{E$i_ev50r%>NQ}92=dv6}*U>gjhtPCK zOiT=R?AXB)N*bgpV+tF$Y&J&{ry=JFa-Jnk~)C) z_I4(GU0od$oKlM6!-wmgQ0j_Vr(8#j7{L}(LVtiMC&YM&llB}$fjEc)aS#RKAPU4m z6o`W;5C>5p4tfjJ-enFmEEhq6>}^0(=k!p$PyXI26UXuAezB|H`BY~$1O*ysi`Fl{ zK*ftDsLxJ)hIl%m+I}GF-@I4fr?H8}2H{9bKGMu-n5FQ20J2YO*r!pTgb-vNE5_3D zM);Y@E{nj+8C6Nskgm5t&i0VxEk=0w3FLjQB6+*uuM07lKV%>pG##V07aKDO6%XSu z>9+#>aH158%j)6ZDTU@K!2bcZ*65Vg>shovPW|`|esyz%)~Abt0@1T^r3t9NWy{V_ s%l{sFC{!w2Qa>#`#6*#UC=iE#04BQYN-Kn8=Kufz07*qoM6N<$f|sW40RR91 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..be08a80e64e8b4da30dcee82bfccad628abf0152 GIT binary patch literal 3834 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 AO#lD@ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..7134b69b2ae4e345eae0016752c7778feba7d5b3 100644 GIT binary patch delta 2134 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%0AT2~zJ7ohZA4qib zp)%`_8Mlfvd^7Pm$vS&^X+O!u6M890Bt_w}(3k*|_OO%N4Aq=$zx)cvBo>EahnNrc z*;wC+&!3?-Q?EsUy;tfKpGvCo)DZ1uve=1zOOP zg^)Mvq$aQXf|sZZT{7{B+D7b<^@&>AHQ#D!Rny6lf41~SS$~D)Z%%yXgIzBN1?L!= z(J#Id?%A~@-+X)yQ=gD>Ak`U1hQ3c$?@rM?t=L6T`80kudVgQUN1hiMD)9|^R@M^; zS=?uSVD2j^6g#!me&&dD3q10J`bT#bg*;hR++c zG+G<0%&Kui4zZX8_)Ir(eyz4uVjJ_51YacHzj5|Tj!<3OR^`a>j%ltnM2Q`&vi$YQ zDiu2L+VkkV6Y33~DMlx4#5VxdTWXa~#U4SAr;BWd;75A1NWrv@;YA^+qX)9HQ6 zLEzoUMo}<_I1;Oog1BHHW%D+U)*7sl=-_)pKd%eB?xzk;`fnBi;fTU3OT%wjcOBR? z@&pLn07KS9-*zT;f0K9@jZZVfM+l2CV&-LbTN5?6aY%xnO>P`V$QW~&B1T6xI4P-DJ+;m@IY0NMKE17&^c>z3HhmreIZ7FKDBSPi~Z{Cdv-eLH6gq4+&hL>z-ZaD`l>r-NVv zb5I=%k=mxG{cxn<_$HwKxln>H%q1dAS7uN9k2qxzq*aFfxE5>AKfJQD?EOo>Xq&jI zFl9IEr8KVxFmv7>UPowUGm7Wr#-M&J!+8~6%+bT7rA^d9!EekaE0W}ImeFrtX6t}v zc0RuqoSARD+>dWh+AxcI!W6)b1%&Wv#OcJaR6ljyZhH;Yn|U*-ga&*%Bc$0< zbRf5hA3T`N3&4!lx_B0rLtDFEiOJRZ!xImcxi%243v=d)%*+ORqj62GUqh9R0oR4m zT{4~W$VWVslf{qoMubmj86b=EHcvQnqTX%Yln>&T8^67m8}G%=hgyks6~GloZo)a# ze15D-k=yR!KrB-BhPzmKO@*t>zlHfaHekK*^FL}X1>Q6 d`QJFWxM5K?!0fHkO&iV6!S&7b-sw0;{Re;3fYks1 delta 3291 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 literal 3612 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 iW8 Date: Fri, 22 May 2020 09:49:39 +0200 Subject: [PATCH 003/127] close #7 --- .../main/res/drawable/notification_icon.png | Bin 0 -> 47955 bytes lib/environments/develop.dart | 19 +++--- lib/environments/integration.dart | 26 ++++++++ lib/pages/home.page.dart | 60 ------------------ 4 files changed, 36 insertions(+), 69 deletions(-) create mode 100644 android/app/src/main/res/drawable/notification_icon.png diff --git a/android/app/src/main/res/drawable/notification_icon.png b/android/app/src/main/res/drawable/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0afc078c14ac17110c8e64246a34cccab2110004 GIT binary patch literal 47955 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 jKM?rufdI+ZZdFPt setUp() async { InitializerAppService().preLoadingData(); await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + // TODO: too much duplicated code! develop and integration are very similar notificationAppLaunchDetails = - await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); + await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); - var initializationSettingsAndroid = AndroidInitializationSettings('app_icon'); + var initializationSettingsAndroid = + AndroidInitializationSettings('notification_icon'); // Note: permissions aren't requested here just to demonstrate that can be done later using the `requestPermissions()` method // of the `IOSFlutterLocalNotificationsPlugin` class var initializationSettingsIOS = IOSInitializationSettings( @@ -43,11 +46,9 @@ Future setUp() async { initializationSettingsAndroid, initializationSettingsIOS); await flutterLocalNotificationsPlugin.initialize(initializationSettings, onSelectNotification: (String payload) async { - if (payload != null) { - debugPrint('notification payload: ' + payload); - } - selectNotificationSubject.add(payload); - }); + if (payload != null) { + debugPrint('notification payload: ' + payload); + } + selectNotificationSubject.add(payload); + }); } - - diff --git a/lib/environments/integration.dart b/lib/environments/integration.dart index 68b46fa..0eaba77 100644 --- a/lib/environments/integration.dart +++ b/lib/environments/integration.dart @@ -1,10 +1,13 @@ import 'package:calendaroo/constants.dart'; import 'package:calendaroo/main.dart'; +import 'package:calendaroo/model/received-notification.dart'; +import 'package:calendaroo/pages/home.page.dart'; import 'package:calendaroo/services/initializer-app.service.dart'; import 'package:calendaroo/services/shared-preferences.service.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'environment.dart'; @@ -20,4 +23,27 @@ Future setUp() async { Environment().version = VERSION; InitializerAppService().preLoadingData(); await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + + var initializationSettingsAndroid = + AndroidInitializationSettings('notification_icon'); + // Note: permissions aren't requested here just to demonstrate that can be done later using the `requestPermissions()` method + // of the `IOSFlutterLocalNotificationsPlugin` class + var initializationSettingsIOS = IOSInitializationSettings( + requestAlertPermission: false, + requestBadgePermission: false, + requestSoundPermission: false, + onDidReceiveLocalNotification: + (int id, String title, String body, String payload) async { + didReceiveLocalNotificationSubject.add(ReceivedNotification( + id: id, title: title, body: body, payload: payload)); + }); + var initializationSettings = InitializationSettings( + initializationSettingsAndroid, initializationSettingsIOS); + await flutterLocalNotificationsPlugin.initialize(initializationSettings, + onSelectNotification: (String payload) async { + if (payload != null) { + debugPrint('notification payload: ' + payload); + } + selectNotificationSubject.add(payload); + }); } diff --git a/lib/pages/home.page.dart b/lib/pages/home.page.dart index 26d832f..f959d88 100644 --- a/lib/pages/home.page.dart +++ b/lib/pages/home.page.dart @@ -30,66 +30,6 @@ class HomePage extends StatefulWidget { } class _HomePageState extends State with TickerProviderStateMixin { - @override - void initState() { - super.initState(); - _requestIOSPermissions(); - _configureDidReceiveLocalNotificationSubject(); - _configureSelectNotificationSubject(); - } - - void _requestIOSPermissions() { - flutterLocalNotificationsPlugin - .resolvePlatformSpecificImplementation< - IOSFlutterLocalNotificationsPlugin>() - ?.requestPermissions( - alert: true, - badge: true, - sound: true, - ); - } - - void _configureDidReceiveLocalNotificationSubject() { - didReceiveLocalNotificationSubject.stream - .listen((ReceivedNotification receivedNotification) async { - await showDialog( - context: context, - builder: (BuildContext context) => CupertinoAlertDialog( - title: receivedNotification.title != null - ? Text(receivedNotification.title) - : null, - content: receivedNotification.body != null - ? Text(receivedNotification.body) - : null, - actions: [ - CupertinoDialogAction( - isDefaultAction: true, - child: Text('Ok'), - onPressed: () async { - Navigator.of(context, rootNavigator: true).pop(); - await NavigationService().navigateTo(SHOW_EVENT, - arguments: receivedNotification.payload); - }, - ) - ], - ), - ); - }); - } - - void _configureSelectNotificationSubject() { - selectNotificationSubject.stream.listen((String payload) async { - await NavigationService().navigateTo(SHOW_EVENT, arguments: payload); - }); - } - - @override - void dispose() { - didReceiveLocalNotificationSubject.close(); - selectNotificationSubject.close(); - super.dispose(); - } - @override Widget build(BuildContext context) { return Theme( From b3b9366a6ff38e30e69698f0ad0124f5bec9aa8e Mon Sep 17 00:00:00 2001 From: Pellegrino Durante Date: Sat, 23 May 2020 03:41:49 +0200 Subject: [PATCH 004/127] Add UI for Settings page --- lib/pages/add-event/add-event.page.dart | 21 +-- lib/pages/home.page.dart | 3 +- lib/pages/settings/settings.page.dart | 156 +++++++++++++++++++++ lib/pages/settings/settings.viewmodel.dart | 10 ++ lib/routes.dart | 3 + lib/widgets/common/page-title.dart | 37 +++++ 6 files changed, 210 insertions(+), 20 deletions(-) create mode 100644 lib/pages/settings/settings.page.dart create mode 100644 lib/pages/settings/settings.viewmodel.dart create mode 100644 lib/widgets/common/page-title.dart diff --git a/lib/pages/add-event/add-event.page.dart b/lib/pages/add-event/add-event.page.dart index 7db2732..40d649a 100644 --- a/lib/pages/add-event/add-event.page.dart +++ b/lib/pages/add-event/add-event.page.dart @@ -3,6 +3,7 @@ import 'package:calendaroo/model/event.model.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/services/navigation.service.dart'; import 'package:calendaroo/theme.dart'; +import 'package:calendaroo/widgets/common/page-title.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -57,28 +58,10 @@ class _AddEventPageState extends State { padding: const EdgeInsets.all(16.0), child: Column( children: [ - SizedBox( - height: 8, - ), Expanded( child: ListView( children: [ - Row( - children: [ - Text('Nuovo Evento', - textAlign: TextAlign.left, - style: Theme.of(context).textTheme.headline4), - IconButton( - onPressed: () { - NavigationService().pop(); - }, - icon: Icon( - Icons.close, - color: secondaryLightGrey, - )) - ], - mainAxisAlignment: MainAxisAlignment.spaceBetween, - ), + PageTitle('Nuovo Evento'), _buildTitle(), _buildTime(store, true, context, _formatterDate, _formatterTime), diff --git a/lib/pages/home.page.dart b/lib/pages/home.page.dart index 105ed2a..51ff29b 100644 --- a/lib/pages/home.page.dart +++ b/lib/pages/home.page.dart @@ -40,7 +40,8 @@ class _HomePageState extends State with TickerProviderStateMixin { Icons.today, AppLocalizations.of(context).translate('today'), () => calendarooState.dispatch(SelectDay(DateTime.now()))), - _buildBottomIcon(Icons.account_circle, "Account", () {}), + _buildBottomIcon(Icons.settings, "Settings", + () => NavigationService().navigateTo(SETTINGS)), ]), ), ); diff --git a/lib/pages/settings/settings.page.dart b/lib/pages/settings/settings.page.dart new file mode 100644 index 0000000..b5d8993 --- /dev/null +++ b/lib/pages/settings/settings.page.dart @@ -0,0 +1,156 @@ +import 'package:calendaroo/colors.dart'; +import 'package:calendaroo/pages/settings/settings.viewmodel.dart'; +import 'package:calendaroo/redux/states/app.state.dart'; +import 'package:calendaroo/theme.dart'; +import 'package:calendaroo/widgets/common/page-title.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_redux/flutter_redux.dart'; + +class SettingsPage extends StatefulWidget { + @override + _SettingsPageState createState() => _SettingsPageState(); +} + +class _SettingsPageState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + body: StoreConnector( + converter: (store) => SettingsViewModel.fromStore(store), + builder: (context, store) { + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + PageTitle('Settings'), + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _buildNotificationSetting(), + _buildFeedbackSetting(), + ], + ), + ), + _buildVersion(), + ], + ), + ); + }, + ), + ); + } + + Widget _buildNotificationSetting() { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Notifications', + style: Theme.of(context).textTheme.headline6, + ), + ) + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _buildButton( + icon: Icons.done, label: 'Yes', onTap: () => print('Yes')), + _buildButton( + icon: Icons.close, label: 'No', onTap: () => print('No')) + ], + ) + ], + ), + ); + } + + Widget _buildFeedbackSetting() { + return Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Text( + 'Feedbacks', + style: Theme.of(context).textTheme.headline6, + ), + ) + ], + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + _buildButton( + icon: Icons.done, label: 'Yes', onTap: () => print('Yes')), + _buildButton( + icon: Icons.close, label: 'No', onTap: () => print('No')) + ], + ) + ], + ), + ); + } + + Widget _buildVersion() { + return Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text('Version 0.1 - Made with ❤ by LoowCode', style: AppTheme.primaryTheme.textTheme.caption,), + ], + ); + } + + Widget _buildButton( + {@required IconData icon, + @required String label, + @required VoidCallback onTap}) { + return Padding( + padding: const EdgeInsets.all(8.0), + child: GestureDetector( + onTap: onTap, + child: Container( + width: 100, + height: 70, + decoration: BoxDecoration( + color: Colors.white, + borderRadius: BorderRadius.all(Radius.circular(8.0)), + boxShadow: [ + BoxShadow( + color: Colors.black.withOpacity(0.2), + offset: Offset(0, 1), + blurRadius: 8.0, + spreadRadius: 0, + ) + ], + ), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Icon( + icon, + size: 24.0, + ), + Text( + label, + style: TextStyle(fontSize: 16.0, fontWeight: FontWeight.normal), + ) + ], + ), + ), + ), + ); + } +} diff --git a/lib/pages/settings/settings.viewmodel.dart b/lib/pages/settings/settings.viewmodel.dart new file mode 100644 index 0000000..9cc5412 --- /dev/null +++ b/lib/pages/settings/settings.viewmodel.dart @@ -0,0 +1,10 @@ +import 'package:calendaroo/redux/states/app.state.dart'; +import 'package:redux/redux.dart'; + +class SettingsViewModel { + SettingsViewModel(); + + static SettingsViewModel fromStore(Store store) { + return SettingsViewModel(); + } +} \ No newline at end of file diff --git a/lib/routes.dart b/lib/routes.dart index bcd4b19..35a43a8 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -1,13 +1,16 @@ import 'package:calendaroo/pages/add-event/add-event.page.dart'; import 'package:calendaroo/pages/home.page.dart'; +import 'package:calendaroo/pages/settings/settings.page.dart'; import 'package:calendaroo/pages/show-event/show-event.page.dart'; const HOMEPAGE = '/home'; const ADD_EVENT = '/add_event'; const SHOW_EVENT = '/show_event'; +const SETTINGS = '/settings'; final routes = { HOMEPAGE: (context) => HomePage(), ADD_EVENT: (context) => AddEventPage(), SHOW_EVENT: (context) => ShowEventPage(), + SETTINGS: (context) => SettingsPage(), }; diff --git a/lib/widgets/common/page-title.dart b/lib/widgets/common/page-title.dart new file mode 100644 index 0000000..2b005e3 --- /dev/null +++ b/lib/widgets/common/page-title.dart @@ -0,0 +1,37 @@ +import 'package:calendaroo/colors.dart'; +import 'package:calendaroo/services/navigation.service.dart'; +import 'package:flutter/material.dart'; + +class PageTitle extends StatefulWidget { + final String title; + + PageTitle(this.title); + + @override + _TitleState createState() => _TitleState(); +} + +class _TitleState extends State { + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.only(top: 16.0), + child: Row( + children: [ + Text(widget.title, + textAlign: TextAlign.left, + style: Theme.of(context).textTheme.headline4), + IconButton( + onPressed: () { + NavigationService().pop(); + }, + icon: Icon( + Icons.close, + color: secondaryLightGrey, + )) + ], + mainAxisAlignment: MainAxisAlignment.spaceBetween, + ), + ); + } +} From ab6dddee777a0f5e76246662c17344c9785f1d42 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Sat, 23 May 2020 10:40:53 +0200 Subject: [PATCH 005/127] Update issue-branch.yml --- .github/issue-branch.yml | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/.github/issue-branch.yml b/.github/issue-branch.yml index 34b7c35..3f813cd 100644 --- a/.github/issue-branch.yml +++ b/.github/issue-branch.yml @@ -3,12 +3,17 @@ silent: false branchName: '${issue.number}-${issue.title}' autoCloseIssue: true branches: - - label: task + - label: feature prefix: feature/ - name: master - - label: bug + name: develop + - label: fix + prefix: fix/ + name: develop + - label: bugfix prefix: bugfix/ + name: release + - label: hotfix + prefix: hotfix/ name: master - label: '*' - prefix: issues/ - name: master + name: develop From 42cd52fc1aa3c20dd7e2c1e459c74101daf6f659 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Sat, 23 May 2020 11:03:42 +0200 Subject: [PATCH 006/127] fix readme --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 80596ea..eafa43d 100644 --- a/README.md +++ b/README.md @@ -24,16 +24,16 @@ A Fancy Flutter Calendar 3. In a terminal run `git fetch` to update the list of branch ### BranchName Convention -- from develop (default branch): `feature/` `fix/` -- from release: `bugfix/` -- from master: `hotfix/` +- from develop (default branch): `feature/-` `fix/-` +- from release: `bugfix/-` +- from master: `hotfix/-` ## Pull Request 1. When you create a pull request **include in the message a [keyword](https://help.github.com/en/enterprise/2.16/user/github/managing-your-work-on-github/closing-issues-using-keywords#about-issue-references)** (ex: `Close #1` this comment automitally closes the issue when you merge the PR). Select a reviewer. 2. When the reviewer approves your PR, merge it *(I suggest you to use **squash and delete branch** to remove useless branch)* # Credits -Thanks to [Vladimir Gubanov](https://dribbble.com/Vladimir_Gubanov) fo inspirations +Thanks to [Vladimir Gubanov](https://dribbble.com/Vladimir_Gubanov) for inspirations # Contributors Made with ❤ by Jacopo Carlini, Durante Pellegrino, Giovanna Flore From 2d48f59848418ec398c7ef99a6e16918cc5c1918 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Sat, 23 May 2020 13:53:31 +0200 Subject: [PATCH 007/127] fix --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index eafa43d..cf3c6df 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,9 @@ A Fancy Flutter Calendar 3. In a terminal run `git fetch` to update the list of branch ### BranchName Convention -- from develop (default branch): `feature/-` `fix/-` -- from release: `bugfix/-` -- from master: `hotfix/-` +- from develop (default branch): `feature/-` `fix/-` +- from release: `bugfix/-` +- from master: `hotfix/-` ## Pull Request 1. When you create a pull request **include in the message a [keyword](https://help.github.com/en/enterprise/2.16/user/github/managing-your-work-on-github/closing-issues-using-keywords#about-issue-references)** (ex: `Close #1` this comment automitally closes the issue when you merge the PR). Select a reviewer. From 18e0456216c74bf0ade8026032b1c42467f6490f Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Sat, 23 May 2020 15:12:55 +0200 Subject: [PATCH 008/127] Update dart.yml --- .github/workflows/dart.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index 2e2658b..fea4cb9 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -2,9 +2,9 @@ name: Flutter basics on: push: - branches: [ master ] + branches: [ master, release, develop ] pull_request: - branches: [ master ] + branches: [ master, release, develop ] env: flutter_version: "1.17.1" From f3afab9901a1d8eb42d476c061e9c192f4a44eea Mon Sep 17 00:00:00 2001 From: JavannaF Date: Sat, 23 May 2020 19:54:14 +0200 Subject: [PATCH 009/127] close #18 --- lib/redux/reducers/calendar.reducer.dart | 3 ++- lib/services/calendar.service.dart | 1 + .../upcoming-events.widget.dart | 4 ++++ pubspec.lock | 23 +++++++------------ 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/lib/redux/reducers/calendar.reducer.dart b/lib/redux/reducers/calendar.reducer.dart index 7bdfd8e..3376cba 100644 --- a/lib/redux/reducers/calendar.reducer.dart +++ b/lib/redux/reducers/calendar.reducer.dart @@ -33,7 +33,8 @@ CalendarState _openEvent(CalendarState state, OpenEvent action) { } CalendarState _selectDay(CalendarState state, SelectDay action) { - return state.copyWith(selectedDay: action.day); + return state.copyWith(selectedDay: CalendarService().removeTime(action.day)); + } CalendarState _removeEvent(CalendarState state, RemoveEvent action) { diff --git a/lib/services/calendar.service.dart b/lib/services/calendar.service.dart index 9275e51..f068206 100644 --- a/lib/services/calendar.service.dart +++ b/lib/services/calendar.service.dart @@ -66,6 +66,7 @@ class CalendarService { int getIndex(Map> days, DateTime day) { if (days.keys.length == null || days.keys.length == 0) return 0; + return days.keys.toList().indexOf(day); } diff --git a/lib/widgets/upcoming-events/upcoming-events.widget.dart b/lib/widgets/upcoming-events/upcoming-events.widget.dart index ef8dc38..1771b6d 100644 --- a/lib/widgets/upcoming-events/upcoming-events.widget.dart +++ b/lib/widgets/upcoming-events/upcoming-events.widget.dart @@ -56,6 +56,10 @@ class _UpcomingEventsWidgetState extends State try { _listController.scrollToIndex(CalendarService() .getIndex(viewModel.eventMapped, viewModel.selectedDay)); + + print("INDICE: "+CalendarService().getIndex(viewModel.eventMapped, viewModel.selectedDay).toString()); + + print("EVENTI: "+viewModel.eventMapped.keys.toList().toString()); // _animationController.forward(from: 0); } catch (e) { print('no events for selected day'); diff --git a/pubspec.lock b/pubspec.lock index 406f289..2ec1471 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -36,13 +36,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" collection: dependency: transitive description: @@ -71,13 +64,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -153,7 +139,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.6.4" path_provider: dependency: "direct main" description: @@ -168,6 +154,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.0" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" redux: dependency: transitive description: From b53115ba014afcf6c8749d515ad1ae803c0bbd86 Mon Sep 17 00:00:00 2001 From: JavannaF Date: Sat, 23 May 2020 19:58:48 +0200 Subject: [PATCH 010/127] close #18 --- lib/widgets/upcoming-events/upcoming-events.widget.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/widgets/upcoming-events/upcoming-events.widget.dart b/lib/widgets/upcoming-events/upcoming-events.widget.dart index 1771b6d..7a249a4 100644 --- a/lib/widgets/upcoming-events/upcoming-events.widget.dart +++ b/lib/widgets/upcoming-events/upcoming-events.widget.dart @@ -56,10 +56,7 @@ class _UpcomingEventsWidgetState extends State try { _listController.scrollToIndex(CalendarService() .getIndex(viewModel.eventMapped, viewModel.selectedDay)); - - print("INDICE: "+CalendarService().getIndex(viewModel.eventMapped, viewModel.selectedDay).toString()); - - print("EVENTI: "+viewModel.eventMapped.keys.toList().toString()); + // _animationController.forward(from: 0); } catch (e) { print('no events for selected day'); From 71ceb876457f04a6d37eaf7f1a4fe0f9db1fd02a Mon Sep 17 00:00:00 2001 From: Giovanna Date: Sat, 23 May 2020 21:19:31 +0200 Subject: [PATCH 011/127] close #18 (#23) * close #18 * close #18 --- lib/redux/reducers/calendar.reducer.dart | 3 ++- lib/services/calendar.service.dart | 1 + .../upcoming-events.widget.dart | 1 + pubspec.lock | 23 +++++++------------ 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/lib/redux/reducers/calendar.reducer.dart b/lib/redux/reducers/calendar.reducer.dart index 7bdfd8e..3376cba 100644 --- a/lib/redux/reducers/calendar.reducer.dart +++ b/lib/redux/reducers/calendar.reducer.dart @@ -33,7 +33,8 @@ CalendarState _openEvent(CalendarState state, OpenEvent action) { } CalendarState _selectDay(CalendarState state, SelectDay action) { - return state.copyWith(selectedDay: action.day); + return state.copyWith(selectedDay: CalendarService().removeTime(action.day)); + } CalendarState _removeEvent(CalendarState state, RemoveEvent action) { diff --git a/lib/services/calendar.service.dart b/lib/services/calendar.service.dart index 9275e51..f068206 100644 --- a/lib/services/calendar.service.dart +++ b/lib/services/calendar.service.dart @@ -66,6 +66,7 @@ class CalendarService { int getIndex(Map> days, DateTime day) { if (days.keys.length == null || days.keys.length == 0) return 0; + return days.keys.toList().indexOf(day); } diff --git a/lib/widgets/upcoming-events/upcoming-events.widget.dart b/lib/widgets/upcoming-events/upcoming-events.widget.dart index ef8dc38..7a249a4 100644 --- a/lib/widgets/upcoming-events/upcoming-events.widget.dart +++ b/lib/widgets/upcoming-events/upcoming-events.widget.dart @@ -56,6 +56,7 @@ class _UpcomingEventsWidgetState extends State try { _listController.scrollToIndex(CalendarService() .getIndex(viewModel.eventMapped, viewModel.selectedDay)); + // _animationController.forward(from: 0); } catch (e) { print('no events for selected day'); diff --git a/pubspec.lock b/pubspec.lock index 406f289..2ec1471 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -36,13 +36,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.3" - clock: - dependency: transitive - description: - name: clock - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.1" collection: dependency: transitive description: @@ -71,13 +64,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.1.3" - fake_async: - dependency: transitive - description: - name: fake_async - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" flutter: dependency: "direct main" description: flutter @@ -153,7 +139,7 @@ packages: name: path url: "https://pub.dartlang.org" source: hosted - version: "1.7.0" + version: "1.6.4" path_provider: dependency: "direct main" description: @@ -168,6 +154,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.0" + quiver: + dependency: transitive + description: + name: quiver + url: "https://pub.dartlang.org" + source: hosted + version: "2.1.3" redux: dependency: transitive description: From 8a245621d300370626feeed99c422947e319a23b Mon Sep 17 00:00:00 2001 From: JavannaF Date: Sat, 23 May 2020 22:32:17 +0200 Subject: [PATCH 012/127] fimal close #18, perfectioned --- lib/widgets/upcoming-events/upcoming-events.widget.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/widgets/upcoming-events/upcoming-events.widget.dart b/lib/widgets/upcoming-events/upcoming-events.widget.dart index 7a249a4..2998bb0 100644 --- a/lib/widgets/upcoming-events/upcoming-events.widget.dart +++ b/lib/widgets/upcoming-events/upcoming-events.widget.dart @@ -26,7 +26,9 @@ class _UpcomingEventsWidgetState extends State _listController = AutoScrollController( viewportBoundaryGetter: () => Rect.fromLTRB(0, 0, 0, MediaQuery.of(context).padding.bottom), - axis: Axis.vertical); + axis: Axis.vertical, + // suggestedRowHeight: 500 + ); _animationController = AnimationController( duration: const Duration(seconds: 1), @@ -55,7 +57,7 @@ class _UpcomingEventsWidgetState extends State onDidChange: (viewModel) { try { _listController.scrollToIndex(CalendarService() - .getIndex(viewModel.eventMapped, viewModel.selectedDay)); + .getIndex(viewModel.eventMapped, viewModel.selectedDay),preferPosition: AutoScrollPosition.begin); // _animationController.forward(from: 0); } catch (e) { From ce66966ef64737158bc0fb88abed64e2c11f60ad Mon Sep 17 00:00:00 2001 From: Pellegrino Durante Date: Sat, 23 May 2020 23:20:09 +0200 Subject: [PATCH 013/127] Add pubspec.lock to gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ae1f183..cccd79a 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ .pub-cache/ .pub/ /build/ +pubspec.lock # Web related lib/generated_plugin_registrant.dart From d63851cbbc1ea27b9767469acdf546b988040225 Mon Sep 17 00:00:00 2001 From: Pellegrino Durante Date: Sun, 24 May 2020 00:33:26 +0200 Subject: [PATCH 014/127] Finish UI --- lib/pages/settings/settings.page.dart | 95 +++++++++++++++++---------- 1 file changed, 62 insertions(+), 33 deletions(-) diff --git a/lib/pages/settings/settings.page.dart b/lib/pages/settings/settings.page.dart index b5d8993..52f4141 100644 --- a/lib/pages/settings/settings.page.dart +++ b/lib/pages/settings/settings.page.dart @@ -1,4 +1,5 @@ import 'package:calendaroo/colors.dart'; +import 'package:calendaroo/environments/environment.dart'; import 'package:calendaroo/pages/settings/settings.viewmodel.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/theme.dart'; @@ -6,12 +7,15 @@ import 'package:calendaroo/widgets/common/page-title.dart'; import 'package:flutter/material.dart'; import 'package:flutter_redux/flutter_redux.dart'; +// TODO: Use Theme class SettingsPage extends StatefulWidget { @override _SettingsPageState createState() => _SettingsPageState(); } class _SettingsPageState extends State { + bool _notifications = false; + @override Widget build(BuildContext context) { return Scaffold( @@ -29,7 +33,7 @@ class _SettingsPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ _buildNotificationSetting(), - _buildFeedbackSetting(), + _buildFeedbackButton(), ], ), ), @@ -63,9 +67,23 @@ class _SettingsPageState extends State { mainAxisAlignment: MainAxisAlignment.center, children: [ _buildButton( - icon: Icons.done, label: 'Yes', onTap: () => print('Yes')), + icon: Icons.done, + label: 'Yes', + onTap: () { + setState(() { + _notifications = true; + }); + }, + selected: _notifications), _buildButton( - icon: Icons.close, label: 'No', onTap: () => print('No')) + icon: Icons.close, + label: 'No', + onTap: () { + setState(() { + _notifications = false; + }); + }, + selected: !_notifications), ], ) ], @@ -73,7 +91,8 @@ class _SettingsPageState extends State { ); } - Widget _buildFeedbackSetting() { + // TODO: make a common widget for button + Widget _buildFeedbackButton() { return Padding( padding: const EdgeInsets.all(8.0), child: Column( @@ -84,21 +103,34 @@ class _SettingsPageState extends State { Padding( padding: const EdgeInsets.all(8.0), child: Text( - 'Feedbacks', + 'Feedback', style: Theme.of(context).textTheme.headline6, ), ) ], ), - Row( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - _buildButton( - icon: Icons.done, label: 'Yes', onTap: () => print('Yes')), - _buildButton( - icon: Icons.close, label: 'No', onTap: () => print('No')) - ], - ) + RaisedButton( + elevation: 5, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text('Send us an email'), + ), + color: AppTheme.primaryTheme.buttonColor, + textColor: AppTheme.primaryTheme.textTheme.button.color, + onPressed: () {}, + ), + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Text( + 'Every feedback is important to us!', + style: AppTheme.primaryTheme.textTheme.bodyText1.copyWith( + color: Colors.black, + ), + ), + ), ], ), ); @@ -108,7 +140,11 @@ class _SettingsPageState extends State { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ - Text('Version 0.1 - Made with ❤ by LoowCode', style: AppTheme.primaryTheme.textTheme.caption,), + Text( + 'Version ' + Environment().version + '\nMade with ❤ by LoowCode', + style: AppTheme.primaryTheme.textTheme.caption, + textAlign: TextAlign.center, + ), ], ); } @@ -116,26 +152,19 @@ class _SettingsPageState extends State { Widget _buildButton( {@required IconData icon, @required String label, - @required VoidCallback onTap}) { + @required VoidCallback onTap, + @required bool selected}) { return Padding( padding: const EdgeInsets.all(8.0), - child: GestureDetector( - onTap: onTap, - child: Container( - width: 100, - height: 70, - decoration: BoxDecoration( - color: Colors.white, - borderRadius: BorderRadius.all(Radius.circular(8.0)), - boxShadow: [ - BoxShadow( - color: Colors.black.withOpacity(0.2), - offset: Offset(0, 1), - blurRadius: 8.0, - spreadRadius: 0, - ) - ], - ), + child: RaisedButton( + onPressed: onTap, + color: selected ? secondaryBlue : Colors.white, + textColor: selected ? Colors.white : Colors.black, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ From a48207e3c2c1b3a99d621134d86cb9fb911518a3 Mon Sep 17 00:00:00 2001 From: Pellegrino Durante Date: Sun, 24 May 2020 11:46:35 +0200 Subject: [PATCH 015/127] Add more padding --- lib/pages/settings/settings.page.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pages/settings/settings.page.dart b/lib/pages/settings/settings.page.dart index 52f4141..1a2b167 100644 --- a/lib/pages/settings/settings.page.dart +++ b/lib/pages/settings/settings.page.dart @@ -94,7 +94,7 @@ class _SettingsPageState extends State { // TODO: make a common widget for button Widget _buildFeedbackButton() { return Padding( - padding: const EdgeInsets.all(8.0), + padding: const EdgeInsets.all(32.0), child: Column( children: [ Row( From 0d86e4b611f071a9fee96116f5dbf655da3046be Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Mon, 25 May 2020 12:46:12 +0200 Subject: [PATCH 016/127] notification send --- README.md | 5 +- android/app/src/main/AndroidManifest.xml | 24 +++++-- lib/environments/develop.dart | 45 +------------- lib/environments/integration.dart | 41 +----------- lib/main.dart | 2 +- lib/pages/home.page.dart | 30 --------- .../middlewares/calendar.middlewares.dart | 5 +- lib/services/calendar.service.dart | 2 +- lib/services/events.repository.dart | 13 ++++ lib/services/initializer-app.service.dart | 62 ++++++++++++++++++- lib/services/notification.utils.dart | 35 +++++++++++ 11 files changed, 137 insertions(+), 127 deletions(-) create mode 100644 lib/services/notification.utils.dart diff --git a/README.md b/README.md index cf3c6df..9115e05 100644 --- a/README.md +++ b/README.md @@ -30,10 +30,11 @@ A Fancy Flutter Calendar ## Pull Request 1. When you create a pull request **include in the message a [keyword](https://help.github.com/en/enterprise/2.16/user/github/managing-your-work-on-github/closing-issues-using-keywords#about-issue-references)** (ex: `Close #1` this comment automitally closes the issue when you merge the PR). Select a reviewer. -2. When the reviewer approves your PR, merge it *(I suggest you to use **squash and delete branch** to remove useless branch)* +2. **Select the project** +3. When the reviewer approves your PR, merge it *(I suggest you to use **squash and delete branch** to remove useless branch)* # Credits Thanks to [Vladimir Gubanov](https://dribbble.com/Vladimir_Gubanov) for inspirations # Contributors -Made with ❤ by Jacopo Carlini, Durante Pellegrino, Giovanna Flore +Made with ❤ by Jacopo Carlini, Pellegrino Durante, Giovanna Flore diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 9f18093..87b507f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -5,24 +5,36 @@ In most cases you can leave this as-is, but you if you want to provide additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> + + + + + + android:icon="@mipmap/app_icon" + android:label="Calendaroo"> - - + + + + + + + + + diff --git a/lib/environments/develop.dart b/lib/environments/develop.dart index e28815f..3d5ad49 100644 --- a/lib/environments/develop.dart +++ b/lib/environments/develop.dart @@ -1,54 +1,11 @@ import 'package:calendaroo/constants.dart'; import 'package:calendaroo/main.dart'; -import 'package:calendaroo/model/received-notification.dart'; -import 'package:calendaroo/pages/home.page.dart'; import 'package:calendaroo/services/initializer-app.service.dart'; -import 'package:calendaroo/services/shared-preferences.service.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; - -import 'environment.dart'; // TODO: main have too much work and some frames are skipped void main() async { - await setUp(); + await InitializerAppService().setUp(DEVELOP, VERSION); runApp(MyApp()); } - -Future setUp() async { - WidgetsFlutterBinding.ensureInitialized(); - await SharedPreferenceService().getSharedPreferencesInstance(); - Environment().environment = DEVELOP; - Environment().version = VERSION; - InitializerAppService().preLoadingData(); - await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); - - // TODO: too much duplicated code! develop and integration are very similar - notificationAppLaunchDetails = - await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); - - var initializationSettingsAndroid = - AndroidInitializationSettings('notification_icon'); - // Note: permissions aren't requested here just to demonstrate that can be done later using the `requestPermissions()` method - // of the `IOSFlutterLocalNotificationsPlugin` class - var initializationSettingsIOS = IOSInitializationSettings( - requestAlertPermission: false, - requestBadgePermission: false, - requestSoundPermission: false, - onDidReceiveLocalNotification: - (int id, String title, String body, String payload) async { - didReceiveLocalNotificationSubject.add(ReceivedNotification( - id: id, title: title, body: body, payload: payload)); - }); - var initializationSettings = InitializationSettings( - initializationSettingsAndroid, initializationSettingsIOS); - await flutterLocalNotificationsPlugin.initialize(initializationSettings, - onSelectNotification: (String payload) async { - if (payload != null) { - debugPrint('notification payload: ' + payload); - } - selectNotificationSubject.add(payload); - }); -} diff --git a/lib/environments/integration.dart b/lib/environments/integration.dart index 0eaba77..5fff5bb 100644 --- a/lib/environments/integration.dart +++ b/lib/environments/integration.dart @@ -1,49 +1,10 @@ import 'package:calendaroo/constants.dart'; import 'package:calendaroo/main.dart'; -import 'package:calendaroo/model/received-notification.dart'; -import 'package:calendaroo/pages/home.page.dart'; import 'package:calendaroo/services/initializer-app.service.dart'; -import 'package:calendaroo/services/shared-preferences.service.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; - -import 'environment.dart'; void main() async { - await setUp(); + await InitializerAppService().setUp(INTEGRATION, VERSION); runApp(MyApp()); } - -Future setUp() async { - WidgetsFlutterBinding.ensureInitialized(); - await SharedPreferenceService().getSharedPreferencesInstance(); - Environment().environment = INTEGRATION; - Environment().version = VERSION; - InitializerAppService().preLoadingData(); - await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); - - var initializationSettingsAndroid = - AndroidInitializationSettings('notification_icon'); - // Note: permissions aren't requested here just to demonstrate that can be done later using the `requestPermissions()` method - // of the `IOSFlutterLocalNotificationsPlugin` class - var initializationSettingsIOS = IOSInitializationSettings( - requestAlertPermission: false, - requestBadgePermission: false, - requestSoundPermission: false, - onDidReceiveLocalNotification: - (int id, String title, String body, String payload) async { - didReceiveLocalNotificationSubject.add(ReceivedNotification( - id: id, title: title, body: body, payload: payload)); - }); - var initializationSettings = InitializationSettings( - initializationSettingsAndroid, initializationSettingsIOS); - await flutterLocalNotificationsPlugin.initialize(initializationSettings, - onSelectNotification: (String payload) async { - if (payload != null) { - debugPrint('notification payload: ' + payload); - } - selectNotificationSubject.add(payload); - }); -} diff --git a/lib/main.dart b/lib/main.dart index f4ef407..e2e9ef8 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -26,7 +26,7 @@ class MyApp extends StatelessWidget { GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, DefaultCupertinoLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, // Add global cupertino localiztions. + GlobalCupertinoLocalizations.delegate, ], localeResolutionCallback: (locale, supportedLocales) { for (var supportedLocale in supportedLocales) { diff --git a/lib/pages/home.page.dart b/lib/pages/home.page.dart index f959d88..105ed2a 100644 --- a/lib/pages/home.page.dart +++ b/lib/pages/home.page.dart @@ -1,5 +1,4 @@ import 'package:calendaroo/colors.dart'; -import 'package:calendaroo/model/received-notification.dart'; import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/routes.dart'; @@ -9,20 +8,6 @@ import 'package:calendaroo/theme.dart'; import 'package:calendaroo/widgets/calendar/calendar.widget.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import 'package:rxdart/rxdart.dart'; - -final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = - FlutterLocalNotificationsPlugin(); - -// Streams are created so that app can respond to notification-related events since the plugin is initialised in the `main` function -final BehaviorSubject didReceiveLocalNotificationSubject = - BehaviorSubject(); - -final BehaviorSubject selectNotificationSubject = - BehaviorSubject(); - -NotificationAppLaunchDetails notificationAppLaunchDetails; class HomePage extends StatefulWidget { @override @@ -56,21 +41,6 @@ class _HomePageState extends State with TickerProviderStateMixin { AppLocalizations.of(context).translate('today'), () => calendarooState.dispatch(SelectDay(DateTime.now()))), _buildBottomIcon(Icons.account_circle, "Account", () {}), - _buildBottomIcon(Icons.notifications, "Notifica", () async { - var androidPlatformChannelSpecifics = - AndroidNotificationDetails('your channel id', - 'your channel name', 'your channel description', - importance: Importance.Max, - priority: Priority.High, - ticker: 'ticker'); - var iOSPlatformChannelSpecifics = IOSNotificationDetails(); - var platformChannelSpecifics = NotificationDetails( - androidPlatformChannelSpecifics, - iOSPlatformChannelSpecifics); - await flutterLocalNotificationsPlugin.show( - 0, 'plain title', 'plain body', platformChannelSpecifics, - payload: 'item x'); - }), ]), ), ); diff --git a/lib/redux/middlewares/calendar.middlewares.dart b/lib/redux/middlewares/calendar.middlewares.dart index b62e841..648fbf6 100644 --- a/lib/redux/middlewares/calendar.middlewares.dart +++ b/lib/redux/middlewares/calendar.middlewares.dart @@ -1,6 +1,7 @@ import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/routes.dart'; +import 'package:calendaroo/services/notification.utils.dart'; import 'package:calendaroo/services/events.repository.dart'; import 'package:calendaroo/services/navigation.service.dart'; import 'package:redux/redux.dart'; @@ -8,20 +9,20 @@ import 'package:redux/redux.dart'; class CalendarMiddleware extends MiddlewareClass { @override void call(Store store, dynamic action, NextDispatcher next) async { - if (action is AddEvent) { var id = await EventsRepository().insertEvent(action.event); action.event.setId(id); + scheduleNotification(action.event); } if (action is RemoveEvent) { EventsRepository().deleteEvent(action.event.id); + cancelNotification(action.event.id); } if (action is OpenEvent) { NavigationService().navigateTo(SHOW_EVENT, arguments: action.event); } - next(action); } } diff --git a/lib/services/calendar.service.dart b/lib/services/calendar.service.dart index f068206..112b34b 100644 --- a/lib/services/calendar.service.dart +++ b/lib/services/calendar.service.dart @@ -36,7 +36,7 @@ class CalendarService { return result; } - _insertIntoStore(map, date, event) { + _insertIntoStore(SplayTreeMap> map, date, event) { if (map.containsKey(date)) { var list = map[date]; list.add(event); diff --git a/lib/services/events.repository.dart b/lib/services/events.repository.dart index 07205c8..89d191d 100644 --- a/lib/services/events.repository.dart +++ b/lib/services/events.repository.dart @@ -29,6 +29,19 @@ class EventsRepository{ return client.delete('events', where: 'id = ?', whereArgs: [id]); } + Future event(int id) async { + var client = await LocalStorageService().db; + final List> maps = await client.query('events', where: 'id = ?', whereArgs: [id]); + return Event( + id: maps[0]['id'], + title: maps[0]['title'], + uuid: maps[0]['uuid'], + description: maps[0]['description'], + start: DateTime.parse(maps[0]['start']), + end: DateTime.parse(maps[0]['end']), + ); + } + Future> events() async { final Database client = await LocalStorageService().db; diff --git a/lib/services/initializer-app.service.dart b/lib/services/initializer-app.service.dart index 0e4ad50..e28a176 100644 --- a/lib/services/initializer-app.service.dart +++ b/lib/services/initializer-app.service.dart @@ -1,17 +1,77 @@ +import 'package:calendaroo/environments/environment.dart'; +import 'package:calendaroo/model/event.model.dart'; +import 'package:calendaroo/model/received-notification.dart'; import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/services/events.repository.dart'; +import 'package:calendaroo/services/shared-preferences.service.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import '../routes.dart'; +import 'navigation.service.dart'; +import 'notification.utils.dart'; class InitializerAppService { static final InitializerAppService _instance = InitializerAppService._(); + InitializerAppService._(); factory InitializerAppService() { return _instance; } - preLoadingData() async { + Future setUp(environment, version) async { + WidgetsFlutterBinding.ensureInitialized(); + // sharedPref init + SharedPreferenceService().getSharedPreferencesInstance(); + + // Environment init + Environment().environment = environment; + Environment().version = version; + + // loadData init + await _preLoadingDataFromDB(); + + // setup orientation + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + + // init Notification + _initNotification(); + } + + Future _initNotification() async { + notificationAppLaunchDetails = + await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); + + var initializationSettingsAndroid = AndroidInitializationSettings( + 'notification_icon'); // android/app/src/main/res/drawable/notification_icon.png + var initializationSettingsIOS = IOSInitializationSettings( + requestAlertPermission: false, + requestBadgePermission: false, + requestSoundPermission: false, + onDidReceiveLocalNotification: + (int id, String title, String body, String payload) async { + didReceiveLocalNotificationSubject.add(ReceivedNotification( + id: id, title: title, body: body, payload: payload)); + }); + var initializationSettings = InitializationSettings( + initializationSettingsAndroid, initializationSettingsIOS); + await flutterLocalNotificationsPlugin.initialize(initializationSettings, + onSelectNotification: _onSelectNotification); + } + + Future _onSelectNotification(String payload) async { + if (payload != null) { + debugPrint('notification payload: ' + payload); + Event event = await EventsRepository().event(int.parse(payload)); + NavigationService().navigateTo(SHOW_EVENT, arguments: event); + } + selectNotificationSubject.add(payload); + } + + _preLoadingDataFromDB() async { var eventsList = await EventsRepository().events(); calendarooState.dispatch(LoadedEventsList(eventsList)); } diff --git a/lib/services/notification.utils.dart b/lib/services/notification.utils.dart new file mode 100644 index 0000000..3e972c3 --- /dev/null +++ b/lib/services/notification.utils.dart @@ -0,0 +1,35 @@ +import 'package:calendaroo/model/event.model.dart'; +import 'package:calendaroo/model/received-notification.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:rxdart/rxdart.dart'; + +final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = +FlutterLocalNotificationsPlugin(); + +// Streams are created so that app can respond to notification-related events since the plugin is initialised in the `main` function +final BehaviorSubject didReceiveLocalNotificationSubject = +BehaviorSubject(); + +final BehaviorSubject selectNotificationSubject = +BehaviorSubject(); + +NotificationAppLaunchDetails notificationAppLaunchDetails; + +Future scheduleNotification(Event event) async { + var date = DateTime.now().add(Duration(seconds: 5)); + + var androidPlatformChannelSpecifics = AndroidNotificationDetails( + 'event_notification', 'Notifiche evento', 'Mostra le notifiche evento', + importance: Importance.Max, priority: Priority.High, ticker: 'ticker'); + var iOSPlatformChannelSpecifics = IOSNotificationDetails(); + var platformChannelSpecifics = NotificationDetails( + androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); + + await flutterLocalNotificationsPlugin.schedule( + event.id, event.title, event.description, date, platformChannelSpecifics, + androidAllowWhileIdle: true, payload: event.id.toString()); +} + +Future cancelNotification(int id) async { + await flutterLocalNotificationsPlugin.cancel(id); +} From db2754763d5d796143f604de4ebb36bda24b2da4 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Mon, 25 May 2020 13:28:41 +0200 Subject: [PATCH 017/127] main.dart to statefulwidget --- lib/main.dart | 9 +++- lib/services/initializer-app.service.dart | 37 +--------------- lib/services/notification.utils.dart | 53 +++++++++++++++++++++-- 3 files changed, 58 insertions(+), 41 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index e2e9ef8..86787ff 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,9 +8,16 @@ import 'package:flutter/material.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_redux/flutter_redux.dart'; -class MyApp extends StatelessWidget { + +class MyApp extends StatefulWidget { MyApp({Key key}) : super(key: key); + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + @override Widget build(BuildContext context) { return StoreProvider( diff --git a/lib/services/initializer-app.service.dart b/lib/services/initializer-app.service.dart index e28a176..6c7f5c4 100644 --- a/lib/services/initializer-app.service.dart +++ b/lib/services/initializer-app.service.dart @@ -1,16 +1,11 @@ import 'package:calendaroo/environments/environment.dart'; -import 'package:calendaroo/model/event.model.dart'; -import 'package:calendaroo/model/received-notification.dart'; import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/services/events.repository.dart'; import 'package:calendaroo/services/shared-preferences.service.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/services.dart'; -import 'package:flutter_local_notifications/flutter_local_notifications.dart'; -import '../routes.dart'; -import 'navigation.service.dart'; import 'notification.utils.dart'; class InitializerAppService { @@ -38,37 +33,7 @@ class InitializerAppService { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); // init Notification - _initNotification(); - } - - Future _initNotification() async { - notificationAppLaunchDetails = - await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); - - var initializationSettingsAndroid = AndroidInitializationSettings( - 'notification_icon'); // android/app/src/main/res/drawable/notification_icon.png - var initializationSettingsIOS = IOSInitializationSettings( - requestAlertPermission: false, - requestBadgePermission: false, - requestSoundPermission: false, - onDidReceiveLocalNotification: - (int id, String title, String body, String payload) async { - didReceiveLocalNotificationSubject.add(ReceivedNotification( - id: id, title: title, body: body, payload: payload)); - }); - var initializationSettings = InitializationSettings( - initializationSettingsAndroid, initializationSettingsIOS); - await flutterLocalNotificationsPlugin.initialize(initializationSettings, - onSelectNotification: _onSelectNotification); - } - - Future _onSelectNotification(String payload) async { - if (payload != null) { - debugPrint('notification payload: ' + payload); - Event event = await EventsRepository().event(int.parse(payload)); - NavigationService().navigateTo(SHOW_EVENT, arguments: event); - } - selectNotificationSubject.add(payload); + initNotification(); } _preLoadingDataFromDB() async { diff --git a/lib/services/notification.utils.dart b/lib/services/notification.utils.dart index 3e972c3..6e2ca79 100644 --- a/lib/services/notification.utils.dart +++ b/lib/services/notification.utils.dart @@ -1,22 +1,36 @@ +import 'package:calendaroo/constants.dart'; +import 'package:calendaroo/environments/environment.dart'; import 'package:calendaroo/model/event.model.dart'; import 'package:calendaroo/model/received-notification.dart'; +import 'package:calendaroo/redux/actions/calendar.actions.dart'; +import 'package:calendaroo/redux/states/app.state.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:rxdart/rxdart.dart'; +import '../routes.dart'; +import 'events.repository.dart'; +import 'navigation.service.dart'; + final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = -FlutterLocalNotificationsPlugin(); + FlutterLocalNotificationsPlugin(); // Streams are created so that app can respond to notification-related events since the plugin is initialised in the `main` function final BehaviorSubject didReceiveLocalNotificationSubject = -BehaviorSubject(); + BehaviorSubject(); final BehaviorSubject selectNotificationSubject = -BehaviorSubject(); + BehaviorSubject(); NotificationAppLaunchDetails notificationAppLaunchDetails; Future scheduleNotification(Event event) async { - var date = DateTime.now().add(Duration(seconds: 5)); + var date; + if (Environment().environment == DEVELOP) { + date = DateTime.now().add(Duration(seconds: 10)); + } else { + date = event.start; + } var androidPlatformChannelSpecifics = AndroidNotificationDetails( 'event_notification', 'Notifiche evento', 'Mostra le notifiche evento', @@ -33,3 +47,34 @@ Future scheduleNotification(Event event) async { Future cancelNotification(int id) async { await flutterLocalNotificationsPlugin.cancel(id); } + +Future initNotification() async { + notificationAppLaunchDetails = + await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); + + var initializationSettingsAndroid = AndroidInitializationSettings( + 'notification_icon'); // android/app/src/main/res/drawable/notification_icon.png + var initializationSettingsIOS = IOSInitializationSettings( + requestAlertPermission: false, + requestBadgePermission: false, + requestSoundPermission: false, + onDidReceiveLocalNotification: + (int id, String title, String body, String payload) async { + didReceiveLocalNotificationSubject.add(ReceivedNotification( + id: id, title: title, body: body, payload: payload)); + }); + var initializationSettings = InitializationSettings( + initializationSettingsAndroid, initializationSettingsIOS); + await flutterLocalNotificationsPlugin.initialize(initializationSettings, + onSelectNotification: _onSelectNotification); +} + +Future _onSelectNotification(String payload) async { + if (payload != null) { + debugPrint('notification payload: ' + payload); + Event event = await EventsRepository().event(int.parse(payload)); + calendarooState.dispatch(OpenEvent(event)); + NavigationService().navigateTo(SHOW_EVENT, arguments: event); + } + selectNotificationSubject.add(payload); +} From aa83cc990bb68161943c751c24a160b3a2a4d3b6 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Mon, 25 May 2020 15:46:57 +0200 Subject: [PATCH 018/127] new navigator page --- lib/main.dart | 71 ++++++++++++++++++++++- lib/pages/show-event/show-event.page.dart | 6 +- lib/routes.dart | 17 ++++-- lib/services/notification.utils.dart | 13 ++--- 4 files changed, 92 insertions(+), 15 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index 86787ff..c889e49 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,13 +1,20 @@ +import 'package:calendaroo/pages/show-event/show-event.page.dart'; +import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/routes.dart'; import 'package:calendaroo/services/app-localizations.service.dart'; +import 'package:calendaroo/services/events.repository.dart'; import 'package:calendaroo/services/navigation.service.dart'; +import 'package:calendaroo/services/notification.utils.dart'; import 'package:calendaroo/theme.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_redux/flutter_redux.dart'; +import 'model/event.model.dart'; +import 'model/received-notification.dart'; class MyApp extends StatefulWidget { MyApp({Key key}) : super(key: key); @@ -16,7 +23,67 @@ class MyApp extends StatefulWidget { _MyAppState createState() => _MyAppState(); } -class _MyAppState extends State { +class _MyAppState extends State { + @override + void initState() { + super.initState(); + _requestIOSPermissions(); + _configureDidReceiveLocalNotificationSubject(); + _configureSelectNotificationSubject(); + } + + void _requestIOSPermissions() { + flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + IOSFlutterLocalNotificationsPlugin>() + ?.requestPermissions( + alert: true, + badge: true, + sound: true, + ); + } + + void _configureDidReceiveLocalNotificationSubject() { + didReceiveLocalNotificationSubject.stream + .listen((ReceivedNotification receivedNotification) async { + await showDialog( + context: context, + builder: (BuildContext context) => CupertinoAlertDialog( + title: receivedNotification.title != null + ? Text(receivedNotification.title) + : null, + content: receivedNotification.body != null + ? Text(receivedNotification.body) + : null, + actions: [ + CupertinoDialogAction( + isDefaultAction: true, + child: Text('Ok'), + onPressed: () async { + Event event = await EventsRepository().event(int.parse(receivedNotification.payload)); + calendarooState.dispatch(OpenEvent(event)); + await NavigationService().navigateTo(SHOW_EVENT, arguments: event); + }, + ) + ], + ), + ); + }); + } + + void _configureSelectNotificationSubject() { + selectNotificationSubject.stream.listen((String payload) async { + Event event = await EventsRepository().event(int.parse(payload)); + calendarooState.dispatch(OpenEvent(event)); + }); + } + + @override + void dispose() { + didReceiveLocalNotificationSubject.close(); + selectNotificationSubject.close(); + super.dispose(); + } @override Widget build(BuildContext context) { @@ -48,7 +115,7 @@ class _MyAppState extends State { theme: AppTheme.primaryTheme, navigatorKey: NavigationService.navigatorKey, initialRoute: HOMEPAGE, - routes: routes, + onGenerateRoute: routes, ), ); } diff --git a/lib/pages/show-event/show-event.page.dart b/lib/pages/show-event/show-event.page.dart index 921f2f6..78bba74 100644 --- a/lib/pages/show-event/show-event.page.dart +++ b/lib/pages/show-event/show-event.page.dart @@ -11,6 +11,10 @@ import 'package:flutter_rounded_date_picker/rounded_picker.dart'; import 'package:intl/intl.dart'; class ShowEventPage extends StatefulWidget { + Event event; + + ShowEventPage(this.event); + @override _ShowEventPageState createState() => _ShowEventPageState(); } @@ -45,7 +49,7 @@ class _ShowEventPageState extends State { @override Widget build(BuildContext context) { - Event event = ModalRoute.of(context).settings.arguments; + Event event = widget.event; var _formatterDate = new DateFormat.yMMMMd(Localizations.localeOf(context).toString()); var _formatterTime = diff --git a/lib/routes.dart b/lib/routes.dart index bcd4b19..dfdfbd3 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -1,13 +1,22 @@ import 'package:calendaroo/pages/add-event/add-event.page.dart'; import 'package:calendaroo/pages/home.page.dart'; import 'package:calendaroo/pages/show-event/show-event.page.dart'; +import 'package:flutter/material.dart'; const HOMEPAGE = '/home'; const ADD_EVENT = '/add_event'; const SHOW_EVENT = '/show_event'; -final routes = { - HOMEPAGE: (context) => HomePage(), - ADD_EVENT: (context) => AddEventPage(), - SHOW_EVENT: (context) => ShowEventPage(), +MaterialPageRoute Function(RouteSettings) routes = + (RouteSettings settings) { + switch (settings.name) { + case HOMEPAGE: + return MaterialPageRoute(builder: (context) => HomePage(), settings: settings); + case ADD_EVENT: + return MaterialPageRoute(builder: (context) => AddEventPage(), settings: settings); + case SHOW_EVENT: + return MaterialPageRoute(builder: (context) => ShowEventPage(settings.arguments), settings: settings); + default: + return MaterialPageRoute(builder: (context) => HomePage(), settings: settings); + } }; diff --git a/lib/services/notification.utils.dart b/lib/services/notification.utils.dart index 6e2ca79..3606dba 100644 --- a/lib/services/notification.utils.dart +++ b/lib/services/notification.utils.dart @@ -26,11 +26,8 @@ NotificationAppLaunchDetails notificationAppLaunchDetails; Future scheduleNotification(Event event) async { var date; - if (Environment().environment == DEVELOP) { - date = DateTime.now().add(Duration(seconds: 10)); - } else { - date = event.start; - } + date = DateTime.now().add(Duration(seconds: 15)); + var androidPlatformChannelSpecifics = AndroidNotificationDetails( 'event_notification', 'Notifiche evento', 'Mostra le notifiche evento', @@ -72,9 +69,9 @@ Future initNotification() async { Future _onSelectNotification(String payload) async { if (payload != null) { debugPrint('notification payload: ' + payload); - Event event = await EventsRepository().event(int.parse(payload)); - calendarooState.dispatch(OpenEvent(event)); - NavigationService().navigateTo(SHOW_EVENT, arguments: event); +// Event event = await EventsRepository().event(int.parse(payload)); +// calendarooState.dispatch(OpenEvent(event)); +// NavigationService().navigateTo(SHOW_EVENT, arguments: event); } selectNotificationSubject.add(payload); } From 57e2b26a3cf675802bbcc94476abf843b25de817 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Wed, 27 May 2020 09:47:10 +0200 Subject: [PATCH 019/127] Create LICENSE (#33) --- LICENSE | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 674 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f288702 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. From 4ce3b805643fd6c0c7f269bdeada8a8bce461f15 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Wed, 27 May 2020 11:59:20 +0200 Subject: [PATCH 020/127] new show event page --- lib/pages/show-event/show-event.page.dart | 394 ++++++---------------- lib/theme.dart | 144 ++++---- pubspec.lock | 7 + pubspec.yaml | 1 + 4 files changed, 191 insertions(+), 355 deletions(-) diff --git a/lib/pages/show-event/show-event.page.dart b/lib/pages/show-event/show-event.page.dart index 78bba74..4658c37 100644 --- a/lib/pages/show-event/show-event.page.dart +++ b/lib/pages/show-event/show-event.page.dart @@ -2,12 +2,13 @@ import 'package:calendaroo/colors.dart'; import 'package:calendaroo/model/event.model.dart'; import 'package:calendaroo/pages/show-event/show-event.viewmodel.dart'; import 'package:calendaroo/redux/states/app.state.dart'; +import 'package:calendaroo/routes.dart'; import 'package:calendaroo/services/navigation.service.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_redux/flutter_redux.dart'; -import 'package:flutter_rounded_date_picker/rounded_picker.dart'; +import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; class ShowEventPage extends StatefulWidget { @@ -50,316 +51,133 @@ class _ShowEventPageState extends State { @override Widget build(BuildContext context) { Event event = widget.event; - var _formatterDate = - new DateFormat.yMMMMd(Localizations.localeOf(context).toString()); - var _formatterTime = - new DateFormat.Hm(Localizations.localeOf(context).toString()); return Scaffold( body: StoreConnector( converter: (store) => ShowEventViewModel.fromStore(store), builder: (context, store) { - return Form( - key: _formKey, - child: Padding( - padding: const EdgeInsets.all(16.0), - child: Column( - children: [ - SizedBox( - height: 8, - ), - Expanded( - child: ListView( - children: [ - Row( - children: [ - Text('Evento', - textAlign: TextAlign.left, - style: Theme.of(context).textTheme.headline4), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - IconButton( - onPressed: () { - setState(() { - _canModify = !_canModify; - }); - }, - icon: Icon( - Icons.mode_edit, - color: secondaryLightGrey, - )), - IconButton( - onPressed: () { - NavigationService().pop(); - }, - icon: Icon( - Icons.close, - color: secondaryLightGrey, - )), - ], - ) - ], - mainAxisAlignment: MainAxisAlignment.spaceBetween, - ), - buildTitle(event), - Padding( - padding: const EdgeInsets.only( - top: 8.0, - ), - child: Text( - 'Inizio Evento', - style: Theme.of(context).textTheme.subtitle2, - ), - ), - buildTime(true, context, _formatterDate, - _formatterTime, event), - Padding( - padding: const EdgeInsets.only( - top: 8.0, - ), - child: Text( - 'Fine Evento', - style: Theme.of(context).textTheme.subtitle2, - ), - ), - buildTime(false, context, _formatterDate, - _formatterTime, event), - ], - ), - ), - _canModify ? _buildButton(store, context) : SizedBox() - ], - ), - ), - ); + return _buildHead(store, event); }), ); } - Row buildTime(bool start, BuildContext context, DateFormat _formatterDate, - DateFormat _formatterTime, Event event) { - return Row( - mainAxisAlignment: MainAxisAlignment.start, - mainAxisSize: MainAxisSize.max, - children: [ - GestureDetector( - onTap: () { - if (_canModify) { - return CupertinoRoundedDatePicker.show( - context, -// minimumYear: 1700, - initialDate: start ? _startDate : _endDate, - minimumYear: start ? 1700 : _startDate.year, - maximumYear: 3000, - minimumDate: start - ? DateTime.now().subtract(Duration(days: 7)) - : _startDate, - textColor: primaryWhite, - background: secondaryBlue, - borderRadius: 16, - initialDatePickerMode: CupertinoDatePickerMode.date, - onDateTimeChanged: (newDate) { - setState(() { - if (start) { - _startDate = newDate; - } else { - _endDate = newDate; - } - }); - }, - ); - } - }, - child: Chip( - backgroundColor: backgroundForm, - label: Text(start - ? _formatterDate.format(event.start) - : _formatterDate.format(event.end)), - avatar: Icon( - Icons.date_range, - color: secondaryBlue, - ), + Widget _buildHead(ShowEventViewModel store, Event event) { + return CustomScrollView(slivers: [ + SliverAppBar( + expandedHeight: 200, + shape: ContinuousRectangleBorder( + borderRadius: BorderRadius.only( + bottomLeft: Radius.circular(30), + bottomRight: Radius.circular(30))), + floating: false, + pinned: true, + iconTheme: Theme.of(context).iconTheme.copyWith(color: primaryWhite), + actions: [ + IconButton( + icon: Icon( + Icons.edit, + color: primaryWhite, + ), + onPressed: () => NavigationService().navigateTo(ADD_EVENT)) + ], + flexibleSpace: FlexibleSpaceBar( + title: Text( + event.title, + style: Theme.of(context) + .textTheme + .headline6 + .copyWith(color: primaryWhite, fontSize: 20), ), ), - SizedBox( - width: 8, - ), - GestureDetector( - onTap: () { - if (_canModify) { - return CupertinoRoundedDatePicker.show( - context, - initialDate: start ? _startTime : _endTime, - minimumYear: 1700, - maximumYear: 3000, - minimumDate: start - ? DateTime.now().subtract(Duration(days: 7)) - : DateTime.now().subtract(Duration(days: 7)), - textColor: primaryWhite, - background: secondaryBlue, - borderRadius: 16, - initialDatePickerMode: CupertinoDatePickerMode.time, - onDateTimeChanged: (newDate) { - setState(() { - if (start) { - _startTime = newDate; - } else { - _endTime = newDate; - } - }); - }, - ); - } - }, - child: Chip( - backgroundColor: backgroundForm, - label: Text(start - ? _formatterTime.format(event.start) - : _formatterTime.format(event.end)), - avatar: Icon( - Icons.access_time, - color: accentPink, - ), + backgroundColor: secondaryBlue, + ), + SliverFillRemaining( + child: _buildBody(store, event), + ) + ]); + } + + Widget _buildBody(ShowEventViewModel store, Event event) { + return Padding( + padding: const EdgeInsets.all(16.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + event.description != null && event.description.isNotEmpty + ? _buildDescription(event) + : null, + SizedBox( + height: 24, ), - ), - ], + _buildTime(true), + Padding( + padding: const EdgeInsets.only(top: 8.0), + child: _buildTime(false), + ), + ], + ), ); } - Column buildTitle(Event event) { - return Column( + Row _buildDescription(Event event) { + return Row( children: [ Container( - padding: EdgeInsets.only(top: 16, bottom: 16), - margin: EdgeInsets.only(top: 16), - decoration: BoxDecoration( - color: backgroundForm, - borderRadius: BorderRadius.only(topRight: Radius.circular(16))), - child: ListTile( - leading: Icon( - Icons.title, - color: secondaryDarkBlue, - ), - title: TextFormField( - enabled: _canModify, - initialValue: event.title, - decoration: new InputDecoration( - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide(color: secondaryDarkBlue), - ), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide(color: secondaryDarkBlue), - ), - errorBorder: UnderlineInputBorder( - borderSide: BorderSide(color: secondaryDarkBlue), - ), - disabledBorder: UnderlineInputBorder( - borderSide: BorderSide(color: secondaryDarkBlue), - ), - contentPadding: - EdgeInsets.only(left: 15, bottom: 11, top: 11, right: 15), - hintText: 'Titolo'), - validator: (value) { - if (value != null && value.length > 0) { - return null; - } - return 'Inserisci un titolo'; - }, - onSaved: (value) { - setState(() { - _title = value; - }); - }, - ), - ), - ), - Container( - padding: EdgeInsets.only(top: 16, bottom: 16), - margin: EdgeInsets.only(top: 8, bottom: 16), - decoration: BoxDecoration( - color: backgroundForm, - borderRadius: BorderRadius.only( - bottomLeft: Radius.circular(16), - bottomRight: Radius.circular(16))), - child: Container( - child: ListTile( - leading: Icon( - Icons.subject, - color: accentYellowText, - ), - title: TextFormField( - initialValue: event.description, - enabled: _canModify, - decoration: new InputDecoration( - focusedBorder: UnderlineInputBorder( - borderSide: BorderSide(color: secondaryDarkBlue), - ), - enabledBorder: UnderlineInputBorder( - borderSide: BorderSide(color: secondaryDarkBlue), - ), - errorBorder: UnderlineInputBorder( - borderSide: BorderSide(color: secondaryDarkBlue), - ), - disabledBorder: UnderlineInputBorder( - borderSide: BorderSide(color: secondaryDarkBlue), - ), - contentPadding: EdgeInsets.only( - left: 15, bottom: 11, top: 11, right: 15), - hintText: 'Descrizione'), - onSaved: (value) { - setState(() { - _description = value; - }); - }, - ), - ), + margin: EdgeInsets.only(right: 8), + child: Icon( + Icons.subject, + color: secondaryLightGrey, ), ), + Text( + event.description, + textAlign: TextAlign.left, + style: Theme.of(context).textTheme.subtitle1, + ) ], ); } - Padding _buildButton(ShowEventViewModel store, BuildContext context) { - return Padding( - padding: const EdgeInsets.only(top: 8, bottom: 8, left: 32, right: 32), - child: RaisedButton( - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(8.0), - ), - color: secondaryBlue, - onPressed: () { - // Validate returns true if the form is valid, otherwise false. - if (_formKey.currentState.validate()) { - _formKey.currentState.save(); - // If the form is valid, display a snackbar. In the real world, - // you'd often call a server or save the information in a database. - store.editEvent(store.showEvent, _createEvent()); - NavigationService().pop(); - } - }, - child: SizedBox( - height: 50, - width: 300, - child: Center( - child: Text( - 'Salva Modifiche', - style: Theme.of(context).textTheme.button, - ), - ), + Widget _buildTime(bool start) { + var _formatterDate = + new DateFormat.yMMMMEEEEd(Localizations.localeOf(context).toString()); + var _formatterTime = + new DateFormat.Hm(Localizations.localeOf(context).toString()); + return Row( + children: [ + Container( + margin: EdgeInsets.only(right: 8), + child: start + ? FaIcon( + FontAwesomeIcons.clock, + color: secondaryDarkBlue, + ) + : FaIcon( + FontAwesomeIcons.dotCircle, + color: secondaryDarkBlue, + )), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ +// Text( +// start ? 'Inizio Evento' : 'Fine Evento', +// textAlign: TextAlign.left, +// style: Theme.of(context).textTheme.subtitle2, +// ), + Row(children: [ + Container( + margin: EdgeInsets.only(right: 8), + child: Text( + _formatterTime.format(start ? _startTime : _endTime), + style: Theme.of(context) + .textTheme + .bodyText2 + .copyWith(color: secondaryDarkBlue), + )), + Text(_formatterDate.format(start ? _startDate : _endDate)), + ]), + ], ), - ), + ], ); } - - Event _createEvent() { - return Event( - id: null, - title: _title, - uuid: _uuid, - description: _description, - start: DateTime(_startDate.year, _startDate.month, _startDate.day, - _startTime.hour, _startTime.minute), - end: DateTime(_endDate.year, _endDate.month, _endDate.day, - _endTime.hour, _endTime.minute)); - } } diff --git a/lib/theme.dart b/lib/theme.dart index 7199bb5..0129d62 100644 --- a/lib/theme.dart +++ b/lib/theme.dart @@ -1,10 +1,12 @@ import 'package:calendaroo/colors.dart'; +import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; class AppTheme { static ThemeData get primaryTheme { final ThemeData base = ThemeData.light(); return base.copyWith( + appBarTheme: _buildAppBarTheme(base), backgroundColor: primaryWhite, accentColor: accentYellow, primaryColor: primaryWhite, @@ -33,42 +35,44 @@ class AppTheme { static TextTheme _buildPrimaryTextTheme(TextTheme base) { return base .copyWith( - headline4: base.headline4.copyWith( - color: primaryBlack, - fontWeight: FontWeight.w700, - ), - headline5: base.headline5.copyWith( - fontWeight: FontWeight.w700, - ), - subtitle1: base.subtitle1.copyWith( - fontWeight: FontWeight.w700, - ), - headline6: base.headline6.copyWith( - fontWeight: FontWeight.normal, - ), - subtitle2: base.subtitle2.copyWith( - fontWeight: FontWeight.w600, - color: secondaryDarkGrey, - ), - bodyText2: base.bodyText2.copyWith( - fontWeight: FontWeight.w700, - color: primaryBlack, - ), - bodyText1: base.bodyText1.copyWith( - fontWeight: FontWeight.normal, - color: primaryWhite, - ), - caption: base.caption.copyWith( - fontWeight: FontWeight.normal, - ), - button: base.button.copyWith( - fontWeight: FontWeight.bold, - color: primaryWhite, - ), - ) + headline4: base.headline4.copyWith( + color: primaryBlack, + fontWeight: FontWeight.w700, + ), + headline5: base.headline5.copyWith( + fontWeight: FontWeight.w700, + ), + headline6: base.headline6.copyWith( + fontWeight: FontWeight.w600, + ), + subtitle1: base.subtitle1.copyWith( + fontWeight: FontWeight.w500, + fontSize: 20, + color: secondaryGrey, + ), + subtitle2: base.subtitle2.copyWith( + fontWeight: FontWeight.w600, + color: secondaryDarkGrey, + ), + bodyText2: base.bodyText2.copyWith( + fontWeight: FontWeight.w700, + color: primaryBlack, + ), + bodyText1: base.bodyText1.copyWith( + fontWeight: FontWeight.normal, + color: primaryWhite, + ), + caption: base.caption.copyWith( + fontWeight: FontWeight.normal, + ), + button: base.button.copyWith( + fontWeight: FontWeight.bold, + color: primaryWhite, + ), + ) .apply( - fontFamily: 'SourceSansPro', - ); + fontFamily: 'SourceSansPro', + ); } static get secondaryTheme { @@ -110,51 +114,57 @@ class AppTheme { ); } + static AppBarTheme _buildAppBarTheme(ThemeData base){ + return AppBarTheme( + textTheme: _buildPrimaryTextTheme(base.textTheme) + ); + } + static TextTheme _buildSecondaryTextTheme(TextTheme base) { return base .copyWith( - headline4: base.headline4.copyWith( + headline4: base.headline4.copyWith( // fontSize: 32, - fontWeight: FontWeight.w700, - ), - headline5: base.headline5.copyWith( + fontWeight: FontWeight.w700, + ), + headline5: base.headline5.copyWith( // fontSize: 32, - fontWeight: FontWeight.w700, - ), - subtitle1: base.subtitle1.copyWith( + fontWeight: FontWeight.w700, + ), + subtitle1: base.subtitle1.copyWith( // fontSize: 28, - fontWeight: FontWeight.w700, - ), - headline6: base.headline6.copyWith( + fontWeight: FontWeight.w700, + ), + headline6: base.headline6.copyWith( // fontSize: 24.0, - fontWeight: FontWeight.normal, - ), - subtitle2: base.subtitle2.copyWith( + fontWeight: FontWeight.normal, + ), + subtitle2: base.subtitle2.copyWith( // fontSize: 20.0, - fontWeight: FontWeight.w600, - color: secondaryDarkGrey), - bodyText2: base.bodyText2.copyWith( + fontWeight: FontWeight.w600, + color: secondaryDarkGrey), + bodyText2: base.bodyText2.copyWith( // fontSize: 20.0, - fontWeight: FontWeight.w700, - color: primaryWhite, - ), - bodyText1: base.bodyText1.copyWith( + fontWeight: FontWeight.w700, + color: primaryWhite, + ), + bodyText1: base.bodyText1.copyWith( // fontSize: 20.0, - fontWeight: FontWeight.normal, - color: primaryWhite, - ), - caption: base.caption.copyWith( - fontWeight: FontWeight.normal, + fontWeight: FontWeight.normal, + color: primaryWhite, + ), + caption: base.caption.copyWith( + fontWeight: FontWeight.normal, // fontSize: 24.0, - ), - button: base.button.copyWith( - fontWeight: FontWeight.bold, + ), + button: base.button.copyWith( + fontWeight: FontWeight.bold, // fontSize: 24.0, - color: primaryWhite), - ) + color: primaryWhite), + ) .apply( - fontFamily: 'SourceSansPro', - ); + fontFamily: 'SourceSansPro', + ); } } diff --git a/pubspec.lock b/pubspec.lock index c8af3e3..f19c81e 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -119,6 +119,13 @@ packages: description: flutter source: sdk version: "0.0.0" + font_awesome_flutter: + dependency: "direct main" + description: + name: font_awesome_flutter + url: "https://pub.dartlang.org" + source: hosted + version: "8.8.1" image: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 0d13c84..af93bb0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,6 +33,7 @@ dependencies: path_provider: ^0.5.0+1 scroll_to_index: ^1.0.6 flutter_local_notifications: ^1.4.3 + font_awesome_flutter: ^8.8.1 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. From 5a1fca1fd1d0ad7675d99bd14c09e5fd11ba899b Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Wed, 27 May 2020 12:10:39 +0200 Subject: [PATCH 021/127] dart analysis passed --- lib/main.dart | 7 +-- lib/pages/add-event/add-event.page.dart | 18 +++++--- lib/pages/show-event/show-event.page.dart | 52 +++++------------------ lib/routes.dart | 2 +- lib/services/local-storage.service.dart | 3 +- lib/services/notification.utils.dart | 11 +---- 6 files changed, 28 insertions(+), 65 deletions(-) diff --git a/lib/main.dart b/lib/main.dart index c889e49..0e837bc 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,4 +1,3 @@ -import 'package:calendaroo/pages/show-event/show-event.page.dart'; import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/routes.dart'; @@ -60,9 +59,11 @@ class _MyAppState extends State { isDefaultAction: true, child: Text('Ok'), onPressed: () async { - Event event = await EventsRepository().event(int.parse(receivedNotification.payload)); + Event event = await EventsRepository() + .event(int.parse(receivedNotification.payload)); calendarooState.dispatch(OpenEvent(event)); - await NavigationService().navigateTo(SHOW_EVENT, arguments: event); + await NavigationService() + .navigateTo(SHOW_EVENT, arguments: event); }, ) ], diff --git a/lib/pages/add-event/add-event.page.dart b/lib/pages/add-event/add-event.page.dart index 7db2732..28e9b5a 100644 --- a/lib/pages/add-event/add-event.page.dart +++ b/lib/pages/add-event/add-event.page.dart @@ -5,7 +5,6 @@ import 'package:calendaroo/services/navigation.service.dart'; import 'package:calendaroo/theme.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; - import 'package:flutter/rendering.dart'; import 'package:flutter_redux/flutter_redux.dart'; import 'package:flutter_rounded_date_picker/rounded_picker.dart'; @@ -15,6 +14,10 @@ import 'package:uuid/uuid.dart'; import 'add-event.viewmodel.dart'; class AddEventPage extends StatefulWidget { + final Event event; + + AddEventPage(this.event); + @override _AddEventPageState createState() => _AddEventPageState(); } @@ -29,16 +32,17 @@ class _AddEventPageState extends State { DateTime _startTime; DateTime _endTime; + @override void initState() { super.initState(); - _title = ""; - _description = ""; + _title = widget.event.title ?? ""; + _description = widget.event.description ??""; final now = DateTime.now(); - _startDate = calendarooState.state.calendarState.selectedDay; - _startTime = now; - _endDate = _startDate; - _endTime = now.add(Duration(hours: 1)); + _startDate = widget.event.start ?? calendarooState.state.calendarState.selectedDay; + _startTime = widget.event.start ?? now; + _endDate = widget.event.end ?? _startDate; + _endTime = widget.event.end ?? now.add(Duration(hours: 1)); } @override diff --git a/lib/pages/show-event/show-event.page.dart b/lib/pages/show-event/show-event.page.dart index 4658c37..accc392 100644 --- a/lib/pages/show-event/show-event.page.dart +++ b/lib/pages/show-event/show-event.page.dart @@ -12,7 +12,7 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; class ShowEventPage extends StatefulWidget { - Event event; + final Event event; ShowEventPage(this.event); @@ -21,33 +21,6 @@ class ShowEventPage extends StatefulWidget { } class _ShowEventPageState extends State { - final _formKey = GlobalKey(); - - String _title; - String _description; - String _uuid; - DateTime _startDate; - DateTime _endDate; - DateTime _startTime; - DateTime _endTime; - var _canModify = false; - - var _titleController = TextEditingController(); - - @override - void initState() { - super.initState(); - _title = calendarooState.state.calendarState.showEvent.title; - _uuid = calendarooState.state.calendarState.showEvent.uuid; - _titleController.text = _title; - _description = calendarooState.state.calendarState.showEvent.description; - final now = DateTime.now(); - _startDate = now; - _startTime = now; - _endDate = now.add(Duration(days: 1)); - _endTime = now.add(Duration(hours: 1)); - } - @override Widget build(BuildContext context) { Event event = widget.event; @@ -55,12 +28,12 @@ class _ShowEventPageState extends State { body: StoreConnector( converter: (store) => ShowEventViewModel.fromStore(store), builder: (context, store) { - return _buildHead(store, event); + return _buildPage(store, event); }), ); } - Widget _buildHead(ShowEventViewModel store, Event event) { + Widget _buildPage(ShowEventViewModel store, Event event) { return CustomScrollView(slivers: [ SliverAppBar( expandedHeight: 200, @@ -91,12 +64,12 @@ class _ShowEventPageState extends State { backgroundColor: secondaryBlue, ), SliverFillRemaining( - child: _buildBody(store, event), + child: _buildInfoEvent(store, event), ) ]); } - Widget _buildBody(ShowEventViewModel store, Event event) { + Widget _buildInfoEvent(ShowEventViewModel store, Event event) { return Padding( padding: const EdgeInsets.all(16.0), child: Column( @@ -108,10 +81,10 @@ class _ShowEventPageState extends State { SizedBox( height: 24, ), - _buildTime(true), + _buildTime(event, start: true), Padding( padding: const EdgeInsets.only(top: 8.0), - child: _buildTime(false), + child: _buildTime(event, start: false), ), ], ), @@ -137,7 +110,7 @@ class _ShowEventPageState extends State { ); } - Widget _buildTime(bool start) { + Widget _buildTime(Event event, {bool start}) { var _formatterDate = new DateFormat.yMMMMEEEEd(Localizations.localeOf(context).toString()); var _formatterTime = @@ -158,22 +131,17 @@ class _ShowEventPageState extends State { Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ -// Text( -// start ? 'Inizio Evento' : 'Fine Evento', -// textAlign: TextAlign.left, -// style: Theme.of(context).textTheme.subtitle2, -// ), Row(children: [ Container( margin: EdgeInsets.only(right: 8), child: Text( - _formatterTime.format(start ? _startTime : _endTime), + _formatterTime.format(start ? event.start : event.end), style: Theme.of(context) .textTheme .bodyText2 .copyWith(color: secondaryDarkBlue), )), - Text(_formatterDate.format(start ? _startDate : _endDate)), + Text(_formatterDate.format(start ? event.start : event.end)), ]), ], ), diff --git a/lib/routes.dart b/lib/routes.dart index dfdfbd3..6850d4e 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -13,7 +13,7 @@ MaterialPageRoute Function(RouteSettings) routes = case HOMEPAGE: return MaterialPageRoute(builder: (context) => HomePage(), settings: settings); case ADD_EVENT: - return MaterialPageRoute(builder: (context) => AddEventPage(), settings: settings); + return MaterialPageRoute(builder: (context) => AddEventPage(settings.arguments), settings: settings); case SHOW_EVENT: return MaterialPageRoute(builder: (context) => ShowEventPage(settings.arguments), settings: settings); default: diff --git a/lib/services/local-storage.service.dart b/lib/services/local-storage.service.dart index 1bbbd4d..98b4b10 100644 --- a/lib/services/local-storage.service.dart +++ b/lib/services/local-storage.service.dart @@ -3,11 +3,10 @@ import 'dart:io'; import 'package:calendaroo/constants.dart'; import 'package:calendaroo/environments/environment.dart'; -import 'package:calendaroo/model/event.model.dart'; +import 'package:flutter/services.dart' show rootBundle; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import 'package:sqflite/sqflite.dart'; -import 'package:flutter/services.dart' show rootBundle; class LocalStorageService { static final LocalStorageService _instance = LocalStorageService._(); diff --git a/lib/services/notification.utils.dart b/lib/services/notification.utils.dart index 3606dba..db0105d 100644 --- a/lib/services/notification.utils.dart +++ b/lib/services/notification.utils.dart @@ -1,17 +1,9 @@ -import 'package:calendaroo/constants.dart'; -import 'package:calendaroo/environments/environment.dart'; import 'package:calendaroo/model/event.model.dart'; import 'package:calendaroo/model/received-notification.dart'; -import 'package:calendaroo/redux/actions/calendar.actions.dart'; -import 'package:calendaroo/redux/states/app.state.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:rxdart/rxdart.dart'; -import '../routes.dart'; -import 'events.repository.dart'; -import 'navigation.service.dart'; - final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); @@ -26,8 +18,7 @@ NotificationAppLaunchDetails notificationAppLaunchDetails; Future scheduleNotification(Event event) async { var date; - date = DateTime.now().add(Duration(seconds: 15)); - + date = DateTime.now().add(Duration(seconds: 15)); var androidPlatformChannelSpecifics = AndroidNotificationDetails( 'event_notification', 'Notifiche evento', 'Mostra le notifiche evento', From f02fc2311e17247c532a67116fa8efe14f386410 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Wed, 27 May 2020 16:41:18 +0200 Subject: [PATCH 022/127] improvements --- lib/pages/add-event/add-event.viewmodel.dart | 4 +- lib/pages/show-event/show-event.page.dart | 112 +++++++++--------- .../show-event/show-event.viewmodel.dart | 5 +- .../middlewares/calendar.middlewares.dart | 2 +- 4 files changed, 62 insertions(+), 61 deletions(-) diff --git a/lib/pages/add-event/add-event.viewmodel.dart b/lib/pages/add-event/add-event.viewmodel.dart index ef6ed93..5be81fa 100644 --- a/lib/pages/add-event/add-event.viewmodel.dart +++ b/lib/pages/add-event/add-event.viewmodel.dart @@ -7,13 +7,15 @@ class AddEventViewModel { final DateTime selectedDay; final Function(Event) createEvent; + final Function(Event, Event) editEvent; - AddEventViewModel({this.selectedDay, this.createEvent}); + AddEventViewModel({this.selectedDay, this.createEvent, this.editEvent}); static AddEventViewModel fromStore(Store store) { return AddEventViewModel( selectedDay: store.state.calendarState.selectedDay, createEvent: (newEvent) => store.dispatch(new AddEvent(newEvent)), + editEvent: (oldEvent, newEvent) => store.dispatch(new EditEvent(oldEvent, newEvent)), ); } } diff --git a/lib/pages/show-event/show-event.page.dart b/lib/pages/show-event/show-event.page.dart index accc392..61de7b8 100644 --- a/lib/pages/show-event/show-event.page.dart +++ b/lib/pages/show-event/show-event.page.dart @@ -75,38 +75,37 @@ class _ShowEventPageState extends State { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - event.description != null && event.description.isNotEmpty + event.description != null && event.description.length > 0 ? _buildDescription(event) - : null, - SizedBox( - height: 24, - ), + : SizedBox( + height: 0, + ), _buildTime(event, start: true), - Padding( - padding: const EdgeInsets.only(top: 8.0), - child: _buildTime(event, start: false), - ), + _buildTime(event, start: false), ], ), ); } - Row _buildDescription(Event event) { - return Row( - children: [ - Container( - margin: EdgeInsets.only(right: 8), - child: Icon( - Icons.subject, - color: secondaryLightGrey, + Widget _buildDescription(Event event) { + return Padding( + padding: const EdgeInsets.only(bottom: 8.0), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 8), + child: Icon( + Icons.subject, + color: secondaryLightGrey, + ), ), - ), - Text( - event.description, - textAlign: TextAlign.left, - style: Theme.of(context).textTheme.subtitle1, - ) - ], + Text( + event.description, + textAlign: TextAlign.left, + style: Theme.of(context).textTheme.subtitle1, + ) + ], + ), ); } @@ -115,37 +114,40 @@ class _ShowEventPageState extends State { new DateFormat.yMMMMEEEEd(Localizations.localeOf(context).toString()); var _formatterTime = new DateFormat.Hm(Localizations.localeOf(context).toString()); - return Row( - children: [ - Container( - margin: EdgeInsets.only(right: 8), - child: start - ? FaIcon( - FontAwesomeIcons.clock, - color: secondaryDarkBlue, - ) - : FaIcon( - FontAwesomeIcons.dotCircle, - color: secondaryDarkBlue, - )), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Row(children: [ - Container( - margin: EdgeInsets.only(right: 8), - child: Text( - _formatterTime.format(start ? event.start : event.end), - style: Theme.of(context) - .textTheme - .bodyText2 - .copyWith(color: secondaryDarkBlue), - )), - Text(_formatterDate.format(start ? event.start : event.end)), - ]), - ], - ), - ], + return Padding( + padding: const EdgeInsets.only(top: 8.0), + child: Row( + children: [ + Container( + margin: EdgeInsets.only(right: 8), + child: start + ? FaIcon( + FontAwesomeIcons.clock, + color: secondaryDarkBlue, + ) + : FaIcon( + FontAwesomeIcons.dotCircle, + color: secondaryDarkBlue, + )), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row(children: [ + Container( + margin: EdgeInsets.only(right: 8), + child: Text( + _formatterTime.format(start ? event.start : event.end), + style: Theme.of(context) + .textTheme + .bodyText2 + .copyWith(color: secondaryDarkBlue), + )), + Text(_formatterDate.format(start ? event.start : event.end)), + ]), + ], + ), + ], + ), ); } } diff --git a/lib/pages/show-event/show-event.viewmodel.dart b/lib/pages/show-event/show-event.viewmodel.dart index 253e1be..0fa2fc5 100644 --- a/lib/pages/show-event/show-event.viewmodel.dart +++ b/lib/pages/show-event/show-event.viewmodel.dart @@ -6,15 +6,12 @@ import 'package:redux/redux.dart'; class ShowEventViewModel { final Event showEvent; - final Function(Event, Event) editEvent; - ShowEventViewModel({this.showEvent, this.editEvent}); + ShowEventViewModel({this.showEvent}); static ShowEventViewModel fromStore(Store store) { return ShowEventViewModel( showEvent: store.state.calendarState.showEvent, - editEvent: (oldEvent, newEvent) => - store.dispatch(new EditEvent(oldEvent, newEvent)), ); } } diff --git a/lib/redux/middlewares/calendar.middlewares.dart b/lib/redux/middlewares/calendar.middlewares.dart index 648fbf6..ef5c50a 100644 --- a/lib/redux/middlewares/calendar.middlewares.dart +++ b/lib/redux/middlewares/calendar.middlewares.dart @@ -1,9 +1,9 @@ import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/routes.dart'; -import 'package:calendaroo/services/notification.utils.dart'; import 'package:calendaroo/services/events.repository.dart'; import 'package:calendaroo/services/navigation.service.dart'; +import 'package:calendaroo/services/notification.utils.dart'; import 'package:redux/redux.dart'; class CalendarMiddleware extends MiddlewareClass { From 5b8bc7e043d51d48a243422bb1fc76458c6de839 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Wed, 27 May 2020 17:21:32 +0200 Subject: [PATCH 023/127] fix --- android/app/src/main/AndroidManifest.xml | 7 +++---- lib/services/notification.utils.dart | 3 --- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 87b507f..4c43849 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -26,15 +26,14 @@ - - + - + diff --git a/lib/services/notification.utils.dart b/lib/services/notification.utils.dart index 3606dba..3328275 100644 --- a/lib/services/notification.utils.dart +++ b/lib/services/notification.utils.dart @@ -69,9 +69,6 @@ Future initNotification() async { Future _onSelectNotification(String payload) async { if (payload != null) { debugPrint('notification payload: ' + payload); -// Event event = await EventsRepository().event(int.parse(payload)); -// calendarooState.dispatch(OpenEvent(event)); -// NavigationService().navigateTo(SHOW_EVENT, arguments: event); } selectNotificationSubject.add(payload); } From 0e1ab53d0a052da6a2aa5aeca238b19c2ee3e9c2 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Wed, 27 May 2020 21:01:23 +0200 Subject: [PATCH 024/127] Feature/notifications (#26) * notifiche * app icon * close #7 * fix readme * fix * notification send * main.dart to statefulwidget * new navigator page * fix --- README.md | 13 +-- android/app/src/main/AndroidManifest.xml | 27 ++++-- .../main/res/drawable/notification_icon.png | Bin 0 -> 47955 bytes .../app/src/main/res/mipmap-hdpi/app_icon.png | Bin 0 -> 2114 bytes .../app/src/main/res/mipmap-mdpi/app_icon.png | Bin 0 -> 1377 bytes .../src/main/res/mipmap-xhdpi/app_icon.png | Bin 0 -> 2639 bytes .../src/main/res/mipmap-xxhdpi/app_icon.png | Bin 0 -> 3834 bytes .../src/main/res/mipmap-xxxhdpi/app_icon.png | Bin 0 -> 5015 bytes assets/images/app_icon.png | Bin 0 -> 62334 bytes flutter_launcher_icons.yml | 15 ++-- .../Icon-App-1024x1024@1x.png | Bin 10932 -> 32067 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 564 -> 640 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 1283 -> 1187 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 1588 -> 1796 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 1025 -> 885 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 1716 -> 1695 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 1920 -> 2497 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 1283 -> 1187 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 1895 -> 2302 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 2665 -> 3261 bytes .../AppIcon.appiconset/Icon-App-50x50@1x.png | Bin 0 -> 1470 bytes .../AppIcon.appiconset/Icon-App-50x50@2x.png | Bin 0 -> 2751 bytes .../AppIcon.appiconset/Icon-App-57x57@1x.png | Bin 0 -> 1622 bytes .../AppIcon.appiconset/Icon-App-57x57@2x.png | Bin 0 -> 3062 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 2665 -> 3261 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 3831 -> 4770 bytes .../AppIcon.appiconset/Icon-App-72x72@1x.png | Bin 0 -> 2114 bytes .../AppIcon.appiconset/Icon-App-72x72@2x.png | Bin 0 -> 3834 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 1888 -> 2146 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 3294 -> 4033 bytes .../Icon-App-83.5x83.5@2x.png | Bin 3612 -> 4434 bytes lib/environments/develop.dart | 18 +--- lib/environments/integration.dart | 15 +--- lib/main.dart | 80 +++++++++++++++++- lib/model/received-notification.dart | 15 ++++ lib/pages/show-event/show-event.page.dart | 6 +- .../middlewares/calendar.middlewares.dart | 5 +- lib/routes.dart | 17 +++- lib/services/calendar.service.dart | 2 +- lib/services/events.repository.dart | 13 +++ lib/services/initializer-app.service.dart | 27 +++++- lib/services/notification.utils.dart | 74 ++++++++++++++++ pubspec.lock | 28 ++++++ pubspec.yaml | 1 + 44 files changed, 294 insertions(+), 62 deletions(-) create mode 100644 android/app/src/main/res/drawable/notification_icon.png create mode 100644 android/app/src/main/res/mipmap-hdpi/app_icon.png create mode 100644 android/app/src/main/res/mipmap-mdpi/app_icon.png create mode 100644 android/app/src/main/res/mipmap-xhdpi/app_icon.png create mode 100644 android/app/src/main/res/mipmap-xxhdpi/app_icon.png create mode 100644 android/app/src/main/res/mipmap-xxxhdpi/app_icon.png create mode 100644 assets/images/app_icon.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png create mode 100644 ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png create mode 100644 lib/model/received-notification.dart create mode 100644 lib/services/notification.utils.dart diff --git a/README.md b/README.md index 80596ea..9115e05 100644 --- a/README.md +++ b/README.md @@ -24,16 +24,17 @@ A Fancy Flutter Calendar 3. In a terminal run `git fetch` to update the list of branch ### BranchName Convention -- from develop (default branch): `feature/` `fix/` -- from release: `bugfix/` -- from master: `hotfix/` +- from develop (default branch): `feature/-` `fix/-` +- from release: `bugfix/-` +- from master: `hotfix/-` ## Pull Request 1. When you create a pull request **include in the message a [keyword](https://help.github.com/en/enterprise/2.16/user/github/managing-your-work-on-github/closing-issues-using-keywords#about-issue-references)** (ex: `Close #1` this comment automitally closes the issue when you merge the PR). Select a reviewer. -2. When the reviewer approves your PR, merge it *(I suggest you to use **squash and delete branch** to remove useless branch)* +2. **Select the project** +3. When the reviewer approves your PR, merge it *(I suggest you to use **squash and delete branch** to remove useless branch)* # Credits -Thanks to [Vladimir Gubanov](https://dribbble.com/Vladimir_Gubanov) fo inspirations +Thanks to [Vladimir Gubanov](https://dribbble.com/Vladimir_Gubanov) for inspirations # Contributors -Made with ❤ by Jacopo Carlini, Durante Pellegrino, Giovanna Flore +Made with ❤ by Jacopo Carlini, Pellegrino Durante, Giovanna Flore diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index e703d55..4c43849 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -5,26 +5,37 @@ In most cases you can leave this as-is, but you if you want to provide additional functionality it is fine to subclass or reimplement FlutterApplication and put your custom class here. --> + + + + + + android:icon="@mipmap/app_icon" + android:label="Calendaroo"> - - + + + + + + + + + This is used by the Flutter tool to generate GeneratedPluginRegistrant.java --> - + \ No newline at end of file diff --git a/android/app/src/main/res/drawable/notification_icon.png b/android/app/src/main/res/drawable/notification_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0afc078c14ac17110c8e64246a34cccab2110004 GIT binary patch literal 47955 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 literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-mdpi/app_icon.png b/android/app/src/main/res/mipmap-mdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..0639584aed9fafac8aaf27b16b0401f2fb843af5 GIT binary patch literal 1377 zcmV-n1)lneP)mLglb@k$fR9~%-YMB)z#tw)gh*IFz^8pI<( zh%~#$F{o?HE0uM6YH_dc=i5Hccyp7utvuW>XV$zIrp4%@9%rg@BGf0 zdxbdT2>As)Jv~@iS*dI&c@1lR+4?dhnlxl~1y*}|(36!dFJV@ohdt$Xb8~ap-QAU! z6$F@=m|$jRX5Y;>cOVi!g1mxz%I?fJ(ASLV|6r7b-!`^kBr88l#HA0!SXFLkZf=fO zuU^T^LgfZ$jq@#F@eMwFy9HzEE=0<8v#(*PNkjPlPyDfhk5@ObW+cShD<)VvsGmv! zUBBb@SDnb8ScD^>cw_c3Kw$kHX8*I*hu~O-=d%2#=9tX8g9P7C@S}3OeFC0H;OYN8 ze%Mkm>bm0j5*z~S(bgUcKd#utuiGaewHsNd$#@w%dl05{A)CuO^RFui;0!ky`V+2N zwM-3uS-?$0DNMNRy6l>Q04W#mxy7W>_^x5}I2#Rdkbtwug#cZ1{smky)`l4ev-Af0 zkEA>f6(Hi`(O+L{*djH#oCB;#53WD|E_B+t5TI)=1n8P$3E0`$K~qx`8XFriH8lm1 zNCanRXGBLw!^Oqr(7q!hBPcH~$J3`zv9Ym%>({R%BqRj)@85?|sJ=OB_gGk1U=Qr? z?^n1^29=hUA|W9G+1c3;2m}iC^eQAREe$z2Io#jJf48Rb@o_XaH>0qyko{h}cJ1T@ zY;JBMARvH^qJe<{A|fK-<>iI-^>s8fG@!e?8@ai;kVqt`uC9iWk&(P#WMm}j>grh8 z+uNIsxT&cr8;HuvN(>DR!PnOpgM))GHa`0Huagp;Ju)MsC;NV~;j>yQ!U^784(TMQya70B#!N$$;ohZbcBb82h7aOFh4)fW{li~W~{8NjLn)duCA^~O-)65dODlA z6A?f@JUKbZ@_~VY2e$L`^JBkcG#O7KNDM7_a*>0edy;?`FJ3?@m9oH~Q2_*h@f}7_ zPY>?hyT{z;>eZ`gYioONbUH3a7C=$O!NCDzV`FGz3}(FLSBDET-=CL$;(2(`7f@^DCNz}D858A=PZqoV_%p`r3HT2WEKW{d(re0==L2@s3L zY^uq>2L=XEQc}VapSZX<tnu7qyF;cOBfm&!pX^r9VPf~#fR2VR#q0lFmhnf=`{cY;e_YRSe! j+2B&gyQGRUA4dNM-ksk`lA|al00000NkvXXu0mjfGX9b{ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xhdpi/app_icon.png b/android/app/src/main/res/mipmap-xhdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cd4a93d5233948459cf4571f2737777e2e95e8e1 GIT binary patch literal 2639 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 T{34i(A^>s4!mt8<>-oO`6s7a) literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxhdpi/app_icon.png b/android/app/src/main/res/mipmap-xxhdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..be08a80e64e8b4da30dcee82bfccad628abf0152 GIT binary patch literal 3834 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 AO#lD@ literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/app_icon.png b/android/app/src/main/res/mipmap-xxxhdpi/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f44060d1f887d41f7ec13da146859925bf85335e GIT binary patch literal 5015 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 TQ;H!9ZU8+k1I;Q8B<4Q=a!OIO literal 0 HcmV?d00001 diff --git a/assets/images/app_icon.png b/assets/images/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a94eab4e15b60001b6202f102417410c40a6c6d8 GIT binary patch literal 62334 zcmeFaWmHvb`!_lX1yn#qWz(XRf`D{`Nk}LL9ZE}g!&0#6lvXJf3F&4DN;d-1C@r<< zhI7q@d;i~eykE|T^WmH`bd2@vHP)K*p7(wA?{{5`=fzEBS@J`)hY$oImzTS$iXbEy z^hJ6QKH+(%P>mp`5&5f^?zqIx47kP)IC{=6tSR2R{G6HW>Q$!?nEH1oOV+5&zO2l?zCq!2eDZ8jb&box zeX{13I_i}hJI!kn34tWu_Tx*tP20iUvHS$^^uPc9O5p#V1US@UEI(8Z55Fn7Le)3F zG^H^V`Bo_DP|aL$&(O{i{lq$g$Rw67$!?_5QIDrnDBm4)ms>5jP>rBPqHk-((90TZ z)VL$@`A_Kh&uDEQKh`L)AfhVi$v8sZjm5#;7AA(neOLg#KMtcyMB8e_tJ_zLN?C#AAJ(dFz64p%-GllQi&lbD4#}lj(qw>!8$v3QF;LDn>T@GN1@)!4) zTl;ZLqr3yh)oZKH$SBCQHp?rJ!xIyBvbpJYTNhhRn|i#+d1houPezMpm^mgR^a&&gJwSmJn?4ev5%nWabYA20MRtjNDV`z& z$Leb{2hcS%>#{~$7c@%NmKKMXWKF8q8SGZZLKmN#yb&b*_x`cy_9(J6;jx_?CHC!) z^F;LrKl%j};i~|zDzA}_rC+uhSvAT7N<&UTgI;vAg#wNYN)lQ4vvU*zLf?%k5lYlj>nGQ@dRekeJ;`)^Hl>FvUw$xZs93 zzp`C_r|M}qQiA_M=V!j(EAY!9&x{V?4Fy~sX1Yx?peO`356D__e89gj$_OO zROrKxVq#jtn*Fr$&P_=7hu==+X&RhbS;Chr!=l0hqKgMye_<9jzAQO6o{UtgKQ3#{ zO~~s%{vz=>p^g3I>$snN@8++ljK_5_wvmioO>Q?=xXCH zwYdoX3<)V=u`YX+f6dFwYDacm=d};t%|$g7%pq8QK{Foa!ejsKexf=*(5>A4S~=@B zA$kGsj^*Jm&niyOm;Wm4pEK=C_;z(;e)z4Qq+_5c;2c<{q1g zx^5b5^y)NZ+vj+Z|eW2D8FHBv?j`FU*&&zaq);i zUm6K|$D1gI3Kd4t?E@P*72<4bbc<8}b4R=-)7p02GrPHBf0}m1Ogi*>%wxaW;Xd71 z>sd)5Ycx28$DjW|7UgzZk`EvW!&Vy5+b~F%a}ocIdcow)?*kyr1ak%1KhE}iPoM1 z-9tHC2Gg6gc%##g*{M#QP+4mcm$LQ9a10t!{_pzv{IY51wqB1NbIMWg)J&^P3iJ?& z*R$2pFe1Jk?1Jmgv%qF!lTD@n^k-e{VoVXgtDds^Yhgw;wHqH25tYtMCB{|LYYlXn zBHRVyy_x?-(u&n`t;L^d6GnE{E%`&i_%mSGgt%O{E^YLxsnqv1ty}-6wbAxwzan#2 zF>e9sXWxg%@SDLp@tb9GNj(gtckM~yGFwSIv>#-1-H_ek)#+QPHp(Z=-N)^Crz@J!DA(AZW_u#Vah&tSq*$MhB@{^Ck<`N7Q)?X8ti`-f@D z7yexNl3*P+QfhL|%dV=*^%}YEzE}hrKf9Z>1-p+v52TL^Pj_Jb)zZQ}jZ1$nze|W4>W@|Nni`A^O&4^zh?mMu63aR>o+irjg{RxsIA@su z?EDbH`uAzOzPu&7%jCLv??%2iCzNv7Q+i+09kjjUc0*V8&$6S42YBM%@ z#6wT#xIO1v8h8L z4HY)dyFx_&Y2*E#y-oR2Ug%PU@$PTboQII7sq)+VVya%>EE8R^6dtFYc$%sVUtIe4 zi{p=eLO}U>PHd#hL+;-X`%XO?+8FWpHuaN|3ceG8ovj6~jn045!|&^Twc5m}⁢e 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%0Ad&`fBCA*$YV#E`?K79j> z#R*YEMPRd4_mjHNFR%z2gU-!Z(Z+Q(;MFW4KQ z#C>tjw!p`zPJ9T5{Uk8oF+tez75Pi%cd(`ZEWU9xfD5M?)(C<>GK@%H$;Ug68K#dZy$iwhHMO);ZkAIr)j+1XD~ z-jo!qXKML~_+(t$RX6>z)C)vjP4uZq3c8nuV`wP0yXjKk_Q?9ZB(M>nn5H4`kA>MW znM$8c3xm}bU3{DEA_A08z%(CHhDLHJ(DM3Dm4Oa6#$Q+rb}|WlH*dZ^u4g0?8=2Eh z0}1i(BNk))3CEx^JmM6($>$-FUY{P8i0xU!HO-X#ym4&%6`h!5>r+pDV)&9FSPx@! ztn<;rA}H`Suq9Y75-)B# z@mp7Acqd5xuH7g84ixc?E^d&)4m0eP518_0l*rTaFs2Pl;>_)KN$`MX-1X?RX>>YgMI) z?XJg{W=pxsf(98Kj$k1rI3dyqzNSW7AA&sF$kJrW%4PBf%)7y0Ngi=_BoF~))boe$ zrp3$&eb7IMnb!xUXHLKb&ye{Wx{S7hm8?Ef*PYFo3#uk{Xy1N=A0RMaG`2vzm;wRF z)30QNn+(knEkLgOs(iTIu(3maI!2t5GNriDTsxPIuWo+z%a}n!n z!*ML{Ig~P&=L%p+5SK&&vkJso3*d=IjDaIBN0tDv0s6lKv11L2^Qz;0q1ZaZl{Q`T zT(;~qDb;6c_0pIgRbK<%%|k1hCe&m*OGR^ceZN?cBGKWMS^BzXShgd2t{VuZQi611 z1s@y(A#{H$dK8}LRGJ2 z_*6^7LS^)@YV#`j%u-J8%Tua{$>i@9Uca8|PtkVm+y;e~&OY8g{oQ(fq!|-W{$$GC1lyq}*rp#t;3n zLLQys9@2U6`;v?^Z44|dqk$l=_J7A2Y!14DT1%}hnG_eL8xg9c3d0qFA}6V8&kguy z;o|m4Zngz+J<#HPXzXn@5leS_3<+rpvnjHhx0>G3qRlqj@!L_SgN*5aW% zoBdnl$okBP*F6VPrt>a!E2*L8Uxo>>l|V^VczLA5E>>_V3Ikh|%A19ReJo<;X1=kH zF-cp40c%N90&@35tFk-ggwO|{-~rk;~B$zL&nFV5Booty<0xD`h&|fc~FVvx!d?KA<<96aV>SlMab@YUDdG_vH$RY#i(#&|oP+>*M=}DMinb8Tk3# zZu?0*(uN3|$Y{tL==3eHGG%QBI#(C*&_)#eRNxd|;fuKHG-tAEPt@dLFPTzWGG^_F zNE`Wnux0;NlcH_dk@S|L==umf8ODSkhBASD&m>mmD1-}c z88RGWtQ29mXGZ{S!8%%7Fv&>LhAniBh@aqndwmn*{qc9b%oo0xmpjkh!WNeoeV>JM z_g)b84)~vQfu`+9nOO6J*K~0OM7mq?jJjrryU2e<=Vz@SUg!(S|7>XO?j4if_2%Bp z2Zl6X#&56z+ChN8ODx)sNTI$7u2RjJoO5a+3(yD|?tyEqhF~{ooCa1+H*Op)v)UYe z3wZ`KG@r?-(!q8@_h-{H>fVPcPLYm(>`_aWe#o_IUWwH zhy#N6CPy>bQnh_M`+-XoZ?>~keX@ewDi`gA=-|gVfrO3>ZbOtj9?_f;Hq&6Dd{8== zNFX_C;Za8#Y{0KYHmp`ZSJZRTKI{}N|#Qwndcffp359#*>W?KKrBPEIBNv)I zL%#z*ec=?~>Lsbh$<3HWYtHzJYlfo3e)HWo1&(S>4(oN>)4!1dR=m*2mi~4iduK6z z`IN{hXb#P;E#rrp=w$a_1qSdP!=E_BMc7I=JDw<1%abb znV}N262-_!m?FTD1$ZTAAVM5{Ly9g%*mAywy^MPf_8m(Fe((UMZX`C4k2k7@ikr)) ze@f(rp|!FG_s$k>66JMdYX0`-ay!AU_`;ETGq@`!tZIl!|@M9l=fZ1m% z?1zR)DcL8Pwo#pS%|UTDKzs%9QSpA*1zr8$YqB0y=Z3}zt!|^6ZfHz`ErQ(=7Bx4} z>jQ31*m9mhw$_W@jt{vf_O=A&rSzHv4N2C`!DLGJE^5@L0#E#>vrPPKCtb`h3jp9sdWeA);RW=h6 zkM*UTQh1l_ zO&mK~;L4>7s2!2QZlI3j&YJ7dE%5{N|5w7)S>1Ne zb6c8ZJx_s62C@A(WDO`Mr)ViqOB*fhKXE#5QMai}dtnbf^s@xrK7@UDaH|j_T}ZKq zr$TlnK)Ym9_oL9Uq?smgy^DxgBhi3Zkx?fq$>DQ7yd8-}3bjs@@;ssW`RmKe^Dt!j z{A-~C-D3kZKrkvrC8{dNj;#&jhi24978rJCgu^#%=@QtjaR~j;2K!(<<>8}MYoW@T zhVE;Q=dw#C!IeJ^c#{z@&mozTwH!hN7xLKSju;Ci^{nE(Y^l>%6jzj!vk0F_Zos8y ztK=sHSm^P*g7WV4)(rek>iz6}7X4ILy$l{heou@%ZY(`?x8U#p2<1E70!2ksbW$BYAPln6)HY+p(YOsa0bOZP%BKr-Jd&`5& z?)1J33LDil-fT~HlJ%*5Bd}KllqT=}&?8-_(eqBhE+oWo3Py^J`I|APeD~a`9~8~v zB2{2#XOIkJ)&E$5t63~rg1saw;bJ+dG!;7*Gy?H)Ltl^{D8^{Q;;FSZC&s&DS$FQL z_V^yt)$P}Ma>tjxLsozx?Bp@@b_JVt7>ZrGbnar5-!?sVIy-0l#J@zf1SuZas^lLAVy(vy;`e+55xkge|mHoJni%;*KlI8`|6MVK+u(WGzDgAUeAA?g^2t3YZ0YqfK^KF zbC5${fXw|uBJ9n>9c#$$7ajCzZ{7;xyplv3UBh~jUo}t~mmIS*>S;tUR6B6EVsL$q zW98t+oSlah(K=~h5Rvc^i_4m>4}fAb?0@L~E0sqtkU^7BiV!ogbasJRMVSqB4FE5u z`GSPB?@4G56oZ@e)ZeJ_G*fd2Zqimp@pFUq$5LYjNefZks-tB*HT0{=?7)G%^1-z^ zI+b|%&|VWNOHTnY${=zKQ*AxzV;OGG7_DY)-g*`Ss55XrC7JDJkuP!NtPU=BvE+HA zvVHlXSlu$cJ-E@u!o0&El#|*dbZ`I2A)N| zp8=%10YKY};wq#6Mv)toqS1OEzc2U%4^V!WX4>hvx|>;{cDN7?w$cwxB#k){L2i$I zlgIs*U?0QrxzKqh^Nnnu20FMX)arHHL|_ei>9$rU|uPXZNMb>yikV@*B~?`0^`fd{Xs^#dWqN$FqxK^iyHox+ z#TT5Y{`v%dCs$Q)WF}{hTnFU!snmi=`yN8wXe_5_;C-2{TJZ>}#!;dRN1|q}x4hT& z85E6&R{N~v#*d!{FNICpr}4g16%DFA`Lk?2XayR!Ds``0MxUL&vb0q)$FE89bN|eo zo$m%$=0v_5Ty=49F`dv4_dM-T(!RjE`0IQt_5gG+DvE45!DM^sXL&zY`Eu66JixiS zMhdx~0qLc)JJ-?uLWUFk0C^G=dh@Uq&1pyuL|ENxo-S_RDM{K79B{FoF_lz)rnl!v zVh=tY>1}G!?$~3xynSU)?(%l`9@DXX1%SE?)fs$;AF3hj`6c~#2UjRX?>ivn*kL!- z_mO^iK`>6l5H4+!h8dT^^8C;i$qKY7b||LRh-mZmAjWGOo@b)*zjSX@=To|257`nh zJ$GeGuLtBKCEAWWpO)VExM0*J)O(1Ck3N}juD>m-z1So&BIxSc$gnFziu{p69DVT^ z&Ga6KKmygRrH;61Ey=K*V~5>9<2@hq=-Chv>MeG6si4 zT}z5IA_(FZFlm^K?EY|$*waxaliG1Hh{hs=C)m!#bvIxjvt+UHT@-k*w$1>WR$V>R z*WWq3$cfM{0APE^HIe4pb2xhg^@kW6-dnNvzc$*uwsA@TXyR}-Yqw(ZUvbaV@!Ni@ zE1p|nPhW2Af!o*~;yR{7ylV59+yQ18S$-&n<#^|S8QL{^?;Jx$qx|p?cmgN!8{#tS zZ?x#i{f>J(7>Ar*F0pGrjHNDg<@ChC3F!5DZO-9x*I#ri3I^LJ$7F*j`PbwC3()F$zx_R;8Tj9AaUR6=BPPz>Reb!rE8;b*!fo1WbNEO2`vxVH zjGd_+uJ6Dg^8fJ9E&-ui8}i>M9Ukm?h{{Cn#+DkdyolQ5z-2tgAdpjOj zoUz%&ES0R5)@uHVH2sC_d+kHZl~L}$19xR}&rqk)#aR}3mo*0}iBn_-g6jRczKgAU zO1b*!+FrT_jqWB88j1#H^8%^1*f7_qayPgNjd_l|Ex5X46)yCfPVT&R>>2;=U|in# z-<1<3vH=d0)AXl?CUY|uC(OS(?zWUAcEAh}H6BfC4jUS*Yy4G?NvUk@L{lDEA&=(H5*h@-4@-7a6Ma{zHW_x}#mFZw6+u7f_BeSRh0=-QubK=aX zin*v85{6Kv)A!vY5druW?A12yY7~BWapu~6xccIf&B%@;D7r4le|{rISTwG{qo&ZEJ|LR5*TTZy6SIi@Z_pwR(XCO7J=rGzm$x>?DB=!;Y>hiYae3@RV-gPl(bM(qdUf&it{x0tdlA2_?eSB`v*@vdmqS^TX;r46d0f-g|x?K z?pMd;r+1IPT5Lq-J4Jn%#AdfoX)clsl1v>yuqxR+|92hk=9*&$yzNa+*wB}-ZEseF zy)PNLlW=~ef|RoT>2R6chhX39re3wmIdlHQxco*f7`Eu>2rZqP3RRfN83P!drqPb z*W$a-k=fyp-uS0OK1k`7gCQlZ4<*Cd(|5eWMY&atO*TGt!q>{>Rd8{EIoPU8`LXNx@&w}n)}IP+;qM(Xrt9Ei zwKQ)}=qt!vZe!O15uJi8ea)V$T2Zqh=_btus3IKb%^lA&RzkaZ0nYa!9r61i>NoR57TL3_j)+)qNnC(k20usyufQ{BNOtu9oTDl1_VIqFy-+Ow_qiQQc^Q#7G z$Z1I?n-kF-kNfdHQ%g%*)eaXW9Dzk z%JN@Ga@XX{C*H#Nmy~lvth>+fCJ!iPWBO0hJHQBi3WE209T%;?JZ>$*WW=}Gzf}xJ zE1?m}T}THUtJC;QANG@&T+IhNP_@i-Q0pa{qWyw0tAMD{s9R1;ql^wLXfCy=Nf^$3 zaKAH+ICk#2#x}y780cTjNrpq>MPJ;4MDi~tgf3X8D(tijQ*Bn z;FB$w#CS{ZaA+1@qUbb&VH*vsE6MQrLS2EHIQs&6C-QQGMfLd#z>^i717sd$iL1N> z;E`lv)>_*CD73HL2Tt0Z6RoRu#6tZQ|(SZK~#Ud(W&Dw_}TFX*FT-gz~`n4K6if3UR+#d2LVVz zF@{h$@1+Ng%Z={ks@%Txa3tJ`4>wV%ObrG6`=WUj=(k|>pm@FRAleb_+Z=Ff76Zc+So-d2weDv*d*Yhs z)_p9kD@`F~@n&_^Lkwp|_gu`|cQ?+J1`+izVMb>w9_2$HvVB)Ri!%cf0aZxxuhw!l zj@R3)j24jqttCOYvDRvcv<&0tY`4CPYxo3*OY2$|kBn)cJ;p4Bn~&wtASqLoTkwh5 z!e^&})l9`7z?DKP+mwot*l`oY#E%NR>U z5nO|73;ceOGBYs|C#*4RQQjBk?=6j-;O=>wF-3xT{!!d7nT^{2^;ed+J8G^dl*M*1 zIvS44FW>l;_RO7u-a}57VHD_@+@Tj}CtIr@JB7>ZILu^1Rsez_V4tc?8CLa5l)vN^ zKrAjHA>O_2x!ZBH8ec#J!7(E!iwTQH4@`IDfHM1p#q&cLR!6Nnt8OFQbMPu>WB(9H zh(YnmF-&|y-Kv3_eaA zNWb_fPL*A>`Ux1MmWKp_y;ChkQL)1ui+mOh(1k+~SKfkBxkw{EL}gOgue*JN_lj8^ zeZ&i&rGP}NVZylGGT$pib9&r`thbOTFh?|0kq;6``~=$!asYcG#0vn4Rg*5-!1X%^ z>lya6pwxS4?g?X>hkH(gEF$+qEMr1)!Kw5GoL}N^SzYy9bjLNTGWM=G69>y8 z6Wx@5P>;NY+=-8HdfP2$HMZQs46v~C_M;k~0+)eAWMJMY!48aESoYzq?wlSMk6KeP zo_OZSM$}&C5E<PG`0lZ){NICIEwUDIS-Vu?YVK$*3B)BSCQr1-qofy? z;S{xKE7Tk<)K*~H&H@RhBET?A7d7-(DJUf}sgu}%kxpY40y57=u%8?OhO3cWsB5v_ z+9wANh;ye9KNkEy-MO6z{**iMj-xP*-O4DJ9>je+=V~BtoR0|0yCL`!KJyDzzIl1n zjFDh`rl2H9-|%uYvAJmrPG=&EVA%Y)sT`(K(kr_+J_7xrOA+C$<31&4jscR1|4Ms| z)WpYdou)fMSCxRuH7Jd+*nV1mz4r2?y(aADrjmcSR-@Wn-5$3t)yd=63wI^qNm zKO$yR51nLxAkeUo@evkWpq*1((ynVV?ABDlGPPFhOV4k!h2LF$2j9 zeHZ2&9IX>V;G1bIE!yD>7e_7P;sLmHL~OERGudvqO=1IPzchKer>npyS-M}mgq{Pt zQ0V1uB!Ifh+#gEq#>rxgu{BvGXrD(YiLgaRNbp9rtB_1TJlYvAH)HkbG}f;ZaiQ1Ne*u=ONop!(#&r6>KolKBoIfXP zrWbGfytoD(C|ys7eK@Szf(?>!&{VnxWeeHw9k&wkcEqr}0glX@wi`1Bdm~aO0db;u zggVN65$pU*W?+6RZfAKWgVe^IA$Tp1$`32jC}rI46-dte#I(pX@7|X{w0oPNGBH?$ zYdA?3(%NTtQkm5ws+FXZ8=)}kiTyD4pZ=zP92Vvg5yzNnhrqE5I&S`l3n0vIz6YSd zZ_Z4Q1Vl5#kiIlSWYk#uLUVqES!n+qMBTUJ)2yj!4jY8lacva@@!oR&N4U&Ybz|vLgH})+_>_Txt&yZkYL;koY#PUOhq`tRPCY( zRH0HY8!s$T@WN6rtFG-?YlFJISa>N@N>?Ayy(jkPXU-!v-*T37I}OzkA7kWssC&GE zCvsGqwTECMOo9}uyRINmM$+7g$+kppAQmzKk6?Hu&g4khp_Sb-fS>6Eml|757Eh;p z_;KuoS99C5Rl#UeQ9_qgv;$hJbEw>`smz#+6E|Lv_NvMoQ|Ih88*J4r6&DRzjDXSr zba7Lw?%V+uFMf*s`Nd@7dG+$lvEw^t7`3fx4+L{!Iv8ZjAi-dd5xo8BTi#p;$|<<# z3Su_2d6Dy3ZYfx>O@-}%xD>*mXPgWN(@k3bXny3TF6J~dI#&zV;QG~)cm($_#AoQ&=6M#3+qL!8DN;QJ8L^A%Q}Nt-$H)?n;r54L4(y0!8aw(Qx@Vw z3#fzwLu5cZYd{UMzs(U7g{_L%q!5p`K>t?VLRjiB?t~IN*q!Ad|5mCS`z1-6Ku%x1aq_DScP96EFG+^u&O$2qQoh_iKNPR9z55I%DckXqdmL^par!j%M_1CgXzA;k%IIce%P? zSWz$Lav7~8DcyB<(2KU9uQZmjJFg3SRGseGCPxh@sWyuU`&`GwhV~!e*C^;*M$cf_ z=l96Nb@@q%KJ_gd_FEoST8K7D7aGhNl1=`z(1BT6&{7-XbFGIIrvz zDx7;{!A|2~w0Js+btUja(?8)6x=M`uWiYWb3n|3SA0atHkRJ^q=Ip~;wN+JM3lYv( zasWpK23iU-xJdSmWm@j-#6?;=HnG@g?9O@;$A9JS71rB>8gIQIOGorrsrKPLfWIXT z#P;fYZfIYB{{^vxkH*fqA%=7JkawJ{UCgSWJuN67wXoSw%k)K~8MnbC<11K&Wa;}7 zt!pQKS)ri(n5ctRVzvjD!Jz6m9c`M!m$PKRX!sQ`me7i7kFXTe3#Or&xB#2v;;M*1 z%f_t0>1`OgEef=AQ?MF>hLGS`{_}^;A3`jj4VNqsKSiD$K7)MWx$7CfjU6g|5zJN7 z;c(4BYkM1$qbDI%VQ>|V(sWX{mAD1+$Qtt526=1!cxjaKq-ubsdF zHHX;q`>-5*L3=AJ`9_jhc~b%K9>_0SOGh;B6wf}mXKcXj zd$rO0(jLrhaMktj9z?l5vFeuvs#{AVYaabLKXd&ErO)RUfA!j#F4nQ(emfMDW>>p{)}?R*9JrU83eMB>r(zkDbA)%Q2Ajo8lOXpEWT zw1K~+e*gbt62jEK0-K=Z!%e(E-KGdu%2~ZFOL33(RhnnC?khi4hJj@PFn@BhCHD`S z;$A4&h_kUZVng}!_O3EB$Jb2#e{PEXAGgLbKHu@D>6Y29#r`NQh>bMcGS=qw)Kd`6 zEdVQtvT*%&`1chq1nWkg2L`+iQxXhA+w)tBDSgN_8omrXOfrNOuM0_Ci+2sbks>ET|(uC*2%ON>KO?$47Aq= zzinyr$=q>ip6vMZD_$pz+Y#|yV!^iQD(S~(cod{1PSx{}UKPcx{l{GWfV8zl!q(E? zdj87}FfRk!dqeW-4C`*FabMo)eH`mo_PZ*0=eF-Mho3pr!N5EHVOMhUvj#)PP%iap z#ftqhe0oZT3L5D3>5DdlF>x2Oj@2C|t!V{U?%lih;hf0Sqm2Cp5sz0qN!es+ zj%G9?u`D0cgfAbrrJlHznwz=H&mRR{V};1`2*nBD*56)OhpbYFR~Hj%!)z9M=Cq_O z<4Z(FyFd2?YMinhYNVoC}-cI+t0)iM_q=bpAd0*f=QWD?^K8KTgEMR`4DbUhpu856^1Lyft=T*q^TW!b^d* zs|LS4Z!X1lmcdmADK#Q9uI%&?zW=`F)5nh&J3onXUTLO;hHE5gp?>?RnGzhnEy4Zw zx0Qz;2+O73c^}-KvmP$XH$ubR+i{;@N&rU>`$COzI+VLYk-6N7K-JVR!GBFpclT2e z1Geg0w8OSF1Et(H_hV+$y)ORv7;dF7w!LMB7klj9K*XE}6D}hgJPcwMU#b7-iG=Z> z?5IXu-;ce){b_<^;v-^!y7dk z**j|LuFZ0t>3!R8u~XfA7Th16zs5|;w9f-REwgb`d->G~VLrmU!AE&;eN71B_UbkF zaAn|IrESi?{FuwLTGNZPXCV=M^jw1t8_vJ9!%WJ!!yGW!&7WIOU}80=;lQz#%Z^Vn zGlg<{@!3W{RvW_MuTq*0D~u`QG^qz286J`_uR7JkLDOJolc@S?)Ra+4KyuJ0WU9DvTVMJ1O@r)yHGbI~4;HNno!}7r6ZcP_KZ}7w5zm4n;FTbk^%U4gyh8`Pod3jb z1l&20KL_TX1egG3-Q@Tl^((t&ojdhc+eu3&R};H(z?ing*L0`M!b{ z_z0BJiiZv5`Wc*#g>9L~v#hMFISfTO>$;E6iJ+jMu~(1F>GC0Vwu9T!7~Mnj1@T~( zTCxE|=gOyywssr8#HB(zbr{TgyP1T1NM|k!2Gf&s)z||jegFtEd=Ahb7-9FHe}CEl zc*Gw+_|pcQ$neJx{x4Bsq|0gIO^10&KJD6M~RCu?GP|Zx{G4})uZ`UhCdz%2Lc*hG} zg~Bev6D@!}bA>4Qn}of)hdP(=vdtiNjo;7%^8I6g+45q2!5U#}n|>>F?Z+gTiTuLG zT8OHi*YcwOt^>3CVCE4adCbQTIGVy>sw4ew$7P_>m0-u0|CMUVuJX$9rFH)huet#4 z7Xk3LAxyhr2h2QC<%VPACoYY1Zba?iOS#In9HrIkx*cOzD^!2Fl4NgWaS{uXDmzjO z7a$UP27~;R&HTokHTj3bJ5r0+isib|DX-7*^N`zpW=Oa5bRq1!ZO=8OzwEyaGr{uD zMm|^*<8fvv((O4%arGOEv@8D=D~xMeK?44>%y4~2$S2reaq!}Xl$Xt>~BZn2Z{DuvyB_jb<8CH=lWEZYLUJm?0_P;fw1vfX8! z%r}sm_#`8SkD{}9&S~Kd$5nJP>WzKWTk9RYImU}X3C!i+?VeMO0yd3aN zt&e$y;W^t1W`qXb{Od`3I$}xTGv``Rijv#L?CnF`*;(LIPUkVH0$j69#-pB@at-gg zTP=(>#&2+bL#@TBj&xSh9f&lH=+t|cWzQ{d7@i)iW~gk;Ue)B^j2n!somZIfx`zk& z91dVwM40Al>|Xx^j)uSM{h@N`Dah-2Q3Z)FOu5E(!U_+c^Nv?3t!f6^w_dV#hNg0L3dFhIq||1n@c?rxI>{n-Z!a^zR+L88&&unG=Vs=rSK@+Z^l{&X<7u1mLBJ`uGL23g zv!L(g+UR4?u|daKl39eE{e*qbs+=E`U818eJSD!NMbEX=1hcE(Yo?$ zlVyxM2-MU<=qoOf0b=42Rn2^sl>lCj{Spp>IlNZ=esBfDN0i$Oeq!mJtn9yX&TatZ zH8$Jqd%S&+7&nN%o=(({a0T>{%Itg8ov;trgk+^de^<$-e>84`A<$Th{5jWRTjjW z7%t^7>qdFGa{ER*&QFZjF`OEWGerp4lfc|@6w$H&UEBXYa-V_{5%}BX?cf%L%@Ppf z&NlvHLsDOj`T-tt*!fXjUHmybg%7eF0X}^52{UwbCF|_QTJ>UYVNy$z)OKkTuIF@$ z82Hr3$*17%Q66#XD{qN1YRJ1FqR-`Ij_zr;@4hlENi+t^ro7N@4j9oUU5095^km>5 zgXKG!xW&W4=VRSkjzEUPTTV>_@D}szp zhtR->nFl)kr{ZEW-3^s&x#3F9NGgaFJ!rGOK3b^}!qU5%C*n<`7-gIA^D1MLHI-yp zu~?>^D7V93A`SYI(n7G8ZJpcR>cRFtFiOF-kISJmpK#+y5Bf*CKX&f1_GibKTQHLY zl*lepvP`H8IE4bBcFupkm<7I`$h=S4wb?Tzds|i2(fRXLhPDzlOKlBg>?W7&c zA65l@7nDt_!Q+ngI^fA1pfaBD08!WGm0J(tM3$mkdQop!@wyDOPE zt2CZMZ+mTSkW!D<6)`luGp{rjZJKRhz^nWuMFll}1WVFxxzDBW=4cK@5Ch*DZ!J)? zm0&bcSw=HNZjypjAXghBQQl56T{D}Hx$!ESUS45YwdyJdnt)Tt01_?w!!vWJ6`&(; zKFy;lO2BT)X(271P8GqBH6aZ398`ixKg#>E?d2t>ec+R@%{s`_haKH|(F~}*)mBJC z+RRK+Y(m91@gJCpd6#Dg`6$-kLlvC31mG$Jzwz*U>&CV!r+iEOc92I+Y+P^Y1*N;IqJAgU_yy=q7d_#k?5hnMCe}fnjo@))JU`?+ExPA&E8g`1CRH` z(|evnt-j-SEQVIrd}&+1^6A6}qx$lJLC;Et=jt07Qxhwy(Ydu55Gj~vtBCnvyk+IS zx!m@JlH#|xkMZ!@Eg~Nb>)ST(r5Yiyu2Zv3?%PM-uJ&UF>0A*RHJ_F0MZ@ zvFK8-lG7BqUO-?J7S@kjSStViC;^8zwy_x5L*Z(Qa3iwnM_JQK3Q-7aI7^U6BBUkZ zc0DT8t$<}QQ>Y4IopDC=9crY+wLccW!U|=08&I@AaBRZac{o2Xo#!Un@?m z?o@D5N|b5L1Bc%LeC$|3J2pMMqjDWI^z)g?pL`CTr}g=CT|M4kQdYTO%?);sNx{BE zj8K}4TD^UzF0XQ>5Cy&G6^%A?d@p6)XYO3VH-FhTlI{2LBiYx@FSqdH^I-01IHx)D zM(L&eMbF?}A-Hc1Wb1$GxO(_R_^r73k9x1p;RHNuKl}041kYQ!EJLC>(2n@ykzZ13 zCaJ8Lb*I{X93_;^HXAd-A}5IBKV`VlT|Hkv7EL*ZMz=6Zq9m!V>y>B0fxSwjew6M| zRj9A68ysRb&~(`4VsA)mXQ!O;(k)dEy%_BJ$qR_8UDXSyc*?$qIZ`z4z)AdCZ;kuq z7af^dB-kY6@Duzxk5%KG@KdpiRC@#VTgx(tqyq*^WWCj8mPCQp9WWHyuTO>7+5|5o z`ga8Q(f%6IJdx(MDx`&l%}j{b>7`F>D;bP4Jcct|t3{u45~{t`Vux6?#fSD*;!Oo| zYrjB>>wSxo-D;z&d@%Yb2t}y@M|hQIhoUmKb*;PhWm=2+)*TV;j0)N9`)m#0`MoTB zgp?|^n5K)0!=y#POsWnK?$=l28+das>EW!n8BH+0S9-nWz%__|x=-X@+EiKeonR0O z!(7N=tN1VY2J%*B8dyCA>|MH|N*4zGx#;5;<#eB8Y*|g2gH=t%tW{~6#0Z<&zY?{_ z{|y=pGDAu)AGoFs;h)jE!EexV+l6AE42Dx|>3MOmSjEU>xl&=a+TX$?yqD#0BTe+p zP{`MdC4bo7QXPEiJqjJNR4Iv31ihnK`&3&lk9Nr7rGf44gZCzSMQH|Re+h9;S;Anx z_s}`CydYvkfN=%d{6&7@nzrkK^o*aZ*1zT{9ci|R;Ac4Q?EX1=#*>sP+!AHZUYWG& z9yLC|Ww8^+rpjy8mnX>*lRW*ksg_^3`VKS&Hs&+mUydETt2RVS0V}5Lm1G>)j9#%r zR3oc#bRFiG&QUgZ@grrC7Ct{NVrha9p(!Rv+e9(7_<+wy8p`txpk_KcD6dh0$|2<* z*9G#r!D|5kYM&(_k(zKVh0_aDJ8?0$7VK6Vly~x=jhFe1U7@DpujXJ}aT*aC-qWWp z?ut$lL#3!45CZeE5y4U6ja>iPP+KrwkWbV{1@5nAM}AUy)IfulS9;TlV8XT>-8YzN ze^|Zxn>uUow@e)uM)^Yq63Qpj#z}tuTFM-WU=P~%F>YdUA97=G_w8y5z%rcT=aa9$LeQ)kC5!LvU zwoWnq+G|4j(^xN_4T`d-&fteva?lQ86A*pE6md98oRqp1lM>{QZ`P(G|9imN%e+{( zRCi_NwlMW}n(f4LEySZzWo%vM_nY##uCL9k+V*k(*Q( z{Se3Xeq{~6kHJk1PorNtcOU+3#T2s*&s=Qd;b!%JArbM{1=tzeWkgnX|PlcEp8Wa z7uQ@m?Z32fVm`@x`YXOV`1oPgx0fCX%oGQX6$rlyp9nZIFo*eSCFq`Iys zMkj6|e2-h+*B*j9G?DhRB{gk*(IfhIsHZCT_jV*qm1_KQ>}#*YI~Xcn9Owmu_v%CW zmeE5`)ats}pKf_nX{Lq+ra{`*+Lk;fCz;Vx>@^h|gAn7*`@}S~K$;^dGIKBAz{`U9 zBz57_Uq4l6R9>6;d%Ve_$_!eYItcCG-ShctL6hCD+=@M(RlocV@|>>%hu0K0G~G}; z-MAt;JX#Y+ug*Yv7ona}xH=s;u-m3$dVVNh#=2s+r%Y$eG!+#J5)fQwzuYzXg`+SN zh`N9|R#tA3{33TSWc6$8>A8>qaBJ#$II#p=h^v)&SQqBu?Sk(V@63SloYzQy zU+t{GG$^XnhJNacd!lgggI`NKo?fDj2%raC-m)g(<_{yZskgQMmyR60*O#N1gTe0- zoYfVDTHXe`|JxAyV0%rq4z0pwn)y2A@KvkLB$!FbOKrEmVfn%Z@TUAm(SVg+*HX4- za>=qK2B831;IY|Q-V_{*I71n zsVS%SeWw+D={Pt%qjZ_W*kNblvfo4wt6~J@zU4|C$Qf)uaZ%CUIMeVf)C5nh?)wx! zDtfg?)Go^wtMskC-Eqa^;1De?8*k(G{t107p;X{1$O3lT%4qC_dFKF~vfrH=SF$WB zM5d&^I~CVYZZ7iLW8C-wo0Mn-$|$jF*u?xtXN;uwX5(*2aG3n;Vo*)A6i;Qf-c4}a z8B6)Q!St3%+$Ko{jUl(fyBUsX{>WRlhct$Kym!`UiMQ{Y^xDVgzq(w^u9V&$q5+S=%HrXSi$T)=T?Pw#8ifmCFvXf0lS;;h zUS$71_zQ>OdVwHb2j!%1X}D6&^wIte)!e3?XXSkT{CSW4+eaL;HnCWkvH5&OsCuz?byZ@* zC6Nw>i5pUi5{18!<}C*FulooM`WJ%~75W#=ee_Q$s{fz-s<~3cg?zS##p4P2%wvHj zw*^wtiFhaS*}%uoB8< zD1`A8ng|@GK?Jh$CGmoM=k>-KTV%~5c)G_L5oBOIp09=cBB<9$Xb-PeoZp%cHG=q1 zbE3N(hoFIgaH2m#kb`mPpa1u(|Jw~T4*uWR@QM8QkP>d)`!d{oDsaDl7m^k$=ev@Egv_FOSRPnCI};(w5vW2Xm0gf&d-eKbjWn04I=;+|2!tOhlgl6!Y0y zEO&&su(R4z^J1EtA@gy7(jGOWIf35onuyoRBj=wd_Lw~D)rGC(QS{fc4Gf@0F)Zp+$Vm_#aBwZ*=8uj_fgBwZLRm*0;Fyy^5dSI8>7h)3zOLl-a(I%*QM-A8Qp~ z(VB5o4*I*mI#+WA%c@RR1bB}2JC;co_)4N!gt8tXY!=ZqQng15U)LEenW6vH#49FL zs!ko5m-Jd`9@rRLHR-b{G1+D|d~5JJ2+wG54$!hQkYLe1U83XNSv>p$Z#@#w5bB#M zs4qa)wZRuS{KWG~xQJN>QTt?0ieBiBrFhP`Y)g);&Uv269&6l#AfDOBOuo#H@m7;b zk?~#uf2ZCoOl)ffWS{h&nuO7v z@|$ol|FV7=IoOPouB73u96Bw*T!Rzqn7fG}^Sqf}Mayo5BPENk7#2-xXRWiptr;m?Y<6To=*EBU@b!@UMzYSc%Jl56 zbz_NK!&lSTH~iVTwd%t3)iZnSCq8325vJeMcT9%*$oL-dEr=p@t2GY3S>?XrpPRVT z%)B=rZ1KCWBz~ffyVbjLZ_9Dj#%^LW-XwJQk=64nzjfBkweJS8X}t|RqI-#@KITnw zJYs=xh%-ig+S1UcEc~?yMt7oF=e5`IS-kf}^5%@2$%Kh^P}z86MTk1mmepTj(ik&` z=l{fVrY9iwXuACbtcZnKYEOG?dytRdbEJgfK*rL^3&v;{M=tRf4I6vo{|=W4-t`@*~^Yt>d^HiVTa zL&dm=6`JB5m*ESprKuN-@);jj)1uKdxQW5}Eld zJe89>T-mF;=6ujc#BMk^s|%}Ar=h-93w^q*&*G}GI&JyH>0x|Y6W%%HH!|NbFQhveBB9=V8dbcUw z;rd>;wJS7Ifkh(?I%D-oBgVVCAbvARCR(s&Y2nw;)XF=B+4H6ceVE$JUF*M3^w}+b zwe!Zo723G&?3p96Oe$FDd|Pe*w(=U4+?(Bc>zCeYoub_p^?_KcI! z*3h$oDsOlg4UFgJWpQE*CLzZW!LxNK~)f3zY&LtTU7Ve8$EdNZet}nmv*0(*lez|H6Q)S zt~$0OaF2sIe1gAd)z6gIlLucL192XA*<+4W5Lac_*qM$AB75vkdmrn*c?3a1td|PH$7ep-P12P4?|~zDMIHC5uZP3AF$Oj@?i2vF z^V$q8jnpAkBqy$E=PB=I_qTA--F?slcy=s+cpZVbi!aO$k)mpT-Z*(|v#QeKC` z!t12J+EmTgVbp{*;947pA8x3DG+&!+` z(O^5ihV`bJ4D(D3$9N-g5}q=;(rMD!%Lp52*JXNYzYTw2V(TRwJWgEq8iF$m9@>)S?=abMB;Hc62c#$%H8yTKZ|j5)U0+bI;P++a>fK0kJTfkYEc)qVzt2maJw1IHiF`vH$7rzeJRiUi2_DJXX}?w;Y(HTkebC3O4fi-L zMig$4lsHLTOlwl;LZZPplK_b57EUCxw$IC$uzIiR@NOu!1qans=TKaEJ05&9ajg5F zk2I?okL~W_R7-JuYJA&CL<#mt@slgp_@CW_XEE5eug~5LvQM%QgAs{~F*+PBpuBzD z1sok6|HOPg22-pRWv#jX-`>Sju~t)W%V@}?sQif`yoYK0+_P;=c99fBjshu^57-b$ z^m4LDTkBGZZTO!L{8lkp{%;ap-&7b7B_*on!>pjmD0Q(cbXcVJ+0DjECBrb8PDdsb}{+}EpCZGQ2xs!H}Xr)f5 zBLXjuNCvWwg2+VfH@yz@)3rCZ5P)^f|KtEn+g+F7QgC<%<@Z#ClP8?qZK~!<7M7#@ zc*Bc{{~d0IlD{kDv434nhIJT%Dh%}Z?*Tp>`7k^)a4>r!Rlo=qAPwty(km^4z-$Fx zWt}k2>t$r}qmJ_nj5>;OKo@4Q*MviQ^M8J-6wc5(fzGOVf3-@$+*o5XNDZYYzY-v2 zqvy-EHnaYR-|ED_w_TO&SKxC+|L2GNf8h>I{YvAP zt{3z|Q^x!uR4%s@30bkNAu$eb?4Tf=resTiSzSJ^#rC zF!Hlk2Qq7KPY{EwyK|Dg`-_~WEqd~-6(zTq_$m(bS1R&1FknO+eOG3CY6AEh&p6cc z$vAmYHV1-Ow+3k`J55x;G)!u=Vjtakeb{fc-y^d~Vr#zQ%neJ8fU`HhZ@6t--Q03` zGF<7`jw4G-))0eYarj)TPV#_u4IX3Cp=+KlQ86Cv&^YCAb^C{As@6>k?;e4xG)TF| z#$6(_=*?bQKXSe{)D$$euSijaUq6WWTy9R)&YbKo@#uAE5?_F+?{P~q&qVVMy66TGy2J${yD=Bo8xY^FK;b2 z;l_-NoZ2r#QNi9#+7>hCJo!o)+vJf(rOu{qzI}c z`sv4IV;`laeV1Rpxe^?^mC(&XQ{JhLAX{Pi{q9`kGRlrCta!NUv{9N(D4cU^Z&sv! zx9U@PKFeJOo^)LK23DWGuxbz;Ycypu) zlgv&a^$QJnIye!Ao?+c)*`uBufAA#hu9G_5=;FUR-WnyLK8E~0=LbKQhzf-xZD|^o zhEIRew0~4)ku@!c17wk;tT&~8q(&~OB1o0&i-nA`osEK(ZmW?l^VkMV5;=kDMXW8O z@XWW0l-gdaj6$;~*$sm2fsP^>M=d0egRAs$jd?O5AzNTl&|Z zaOxjmgm&jMS{5C;+kF=Cfx|9kn+EmQDh?OMQwcEAAkFuQN)AO>1sUmPunzY8YD?Z#EfxKzd&H6`qnMqVVXuJHy=5y{kFKRSwpn!d;2@YZE4IJV zVWZTU7z+BFd#Y~HVl)~KgIGI=#ATE$R5ROckdkUNwGA|9SCdu}9+{H#%py#OkKoqs zZt3*k$rjQwu)&(4Q0W zDGFX$OLCZMU0!NcVV=?Ea9^G}*<({|eb!?p%dSmTM)R)EV!`G1xLYq$etP3}7Gu-( zQchq!swW=oA9KD%rGd{vTebO{res6HXh+n^W5xx9v4A!1icVs zPJz!k?rbNKiD(Dq+#+n4fpb>Xfv;G2T4KrkuS4xfVa}WA>X6s5F?Q9Ac2y^}HO%ei zN>=+@5|yH0YH|s*l{^MTl{BaIkB-y?HDTVEU3Z-yoLXzmA+ULUB79Cla%HKIwgiZ= zR3`uB-)un|GIcF$#20EJI8nMDdD~VL8G7G8^e5rg|rCPahW=O-2}kgRp}t{ftTyfKgU$`iR@z1*(d zgrP0fj69AT`>0+0=ndx7oj3Fim^V!Cv;+tvm?rU6{R-u0k#S)7{F==lFjRV_vdKB* zfW0}(WR<2`A}2Z)qJB32Zo?ELrkT=B^7zO3lPGGc3kFYJhN9Ga;;digdnqQ~!F zqe0%a)3SOV-JC1K=>rND#@~-8K4{N5c&_19{q z_Xv{Av}d16^**hjYcFrDI`!bH%f-0+2a$7ckFnj;P+)6~E6Wi(UfS@$wnTF_RXJ&I zv~xGsY|pzsG#+(N_HQg2h_8pXOk7E}}er&Jw!15;~ z03$4EY60Z6Pez$VBiy&(S-t|jwyEiP{xYmy0xk?pzxkWQPH<%u7~gQ)7Ajj;A`1(A z%ju**stSw`k`RHc5GzVgcQJkMB&5(@fY_{F`?@jw9syy1sTpDe8Xc^>rEA6z^l^@! zqh?Xor;bQ&J#{ih1l}yYUh!qa|Hi!7w>%zYTdil6t{LNby;I)-eE^(TbJ}YMd0TV!1M~T1+uR*MC3@{Fu7w%8W6yfd|130V9we@sUZJuno)t{mi!|J$LImFC z)KEGe*rwyFs@@@L;Wj0kG{e?QQnm`&sOY3&CdpKL_Ep|vwq_`CU;cx6^_=k8C%@NTVR>9I z<`j5)fNPmryh_o+d@c+JS0FEHr&8IJZLjD6SAo03^b%6kb!;q-X(fz(=Z+1DyF0JP zh8Z}Oz>mPWi|OZXPR6|$28z^xp}7JWVR+;8xfq7QgcEU>0X^B@ht?*Ze}Y|?Z2Q0# zBzAot9g~LjfpD`(EE?T`%tAaUJ{Ih3OgqRt3C z)EeB`ETYa&$ei=J#A7yC*@r-~;+3KV3rFso5chN>M%gf}_ByES{@ytRB1%XCuHa;E zp#xc13Ip6nonSjq+Fo8Jz|Cx_%k*`*f_3K`Qw9x%^zwxA{Je^R@XB8kll8H%AS22~ zXJI_z1gt_aO8_grd-^593za8KUY*qPr4#&n&V|8JS|me&Zu^CM7F?gI$(DGNI_~^{ zj`Rl;_&sfqAg|pe8df?=tR%<<+sizgn`u>%Oy7qkv?Kd0?Yd0Esvv?0l?fRMKYg%c zeSq&rPaAn=b+MN}2Br}_tAg85U!Fg*%t_~=VA}{cI?3{G`Al}xC(+~FX+U(^y{A0p zN`zb(!i~d>yxo>ZAcY!Vg3|P5#HaQ{qb7uFiGr;sFC5UN7uy&Q0K{)ww?+q#?=ly%y~$n&?hJVjk!MoMqgc%{L;SX?{$M8f@2kz)da~ z!T%Q#pCkGJgBN-RcJjI<=>ji&jF|1o56W&7;c{V!qlYt}8wC!MyzfZYqDs7+?ek8! zRR!dtX=7kNjgTomgvz0*gzwR>m%XZSwJ}~RT`iyQ(8}zk9)KKM~lZN zIF!@&Rd5%MerWecm@0t6P7lQzCoqa*FSQ==o`2D+>cd1pkkXdVZ&;Xiv&J4hMZH-f zkXRkab`CO+u85=b_B)QV>Ti}w>Ir4I*?HmK8zi_8mhY&MHNA@0bgBJY0|0`B@ltQy zL13AnY`KD7^eR0>o&|&_lphn9*4qgRVFj@HDYO?jcabjranUBZIF*%ZCm0^&?^y9; zeLPBACgGOfy+9^S;Po^*k!K|#GmqmdT|%_3I!(1*HuPFmrl7L`{esx5YzMWt_?Rfxrc zH1s1SMv(_%O-S-Gyop?1c*0305`W-$d!|v@U;8@l)RR=C)xGE7D2zTdo+t$t;ZS37 zhQCqRt~eqIlyayZQhfWwU!ZmsI*`#!p3$88s#TT1 zr4*xbWILGaWCTcnpj$8YRh2*66R#30v4G+`SLP2jFTB@Mi%i2jB|(hD5IaEGS+xTa zI*zAq+fM`i5#k;zX^CVoJV@klmr+*{U!LPiKl|`sj7z^;d**_3k9C;n z!TWoF3|->pR@vO4tKT3K8>Z#C(izG&+A~w8Wh6ILgC%EF{D4;7fV5LGwV_`W;XVJ8 zHkB|#l0TB8_-P4>v)p;U*-a9nD+4$R)R1vW(f0CZ?JAEInzW_Q;V7H!6P+T{Y3c^p z%Qzd7gCj`mlnjA){BneH&;@5ue036Etmn_Wqx2fKKYIf&PjlqHAaJXjBLV!w>G}PC zF!4N≶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 Xn=R3hJB!-rBQKse(9J(*_0RtSW6DL9 literal 10932 zcmeHN2~<R zh`|8`A_PQ1nSu(UMFx?8j8PC!!VDphaL#`F42fd#7Vlc`zIE4n%Y~eiz4y1j|NDpi z?<@|pSJ-HM`qifhf@m%MamgwK83`XpBA<+azdF#2QsT{X@z0A9Bq>~TVErigKH1~P zRX-!h-f0NJ4Mh++{D}J+K>~~rq}d%o%+4dogzXp7RxX4C>Km5XEI|PAFDmo;DFm6G zzjVoB`@qW98Yl0Kvc-9w09^PrsobmG*Eju^=3f?0o-t$U)TL1B3;sZ^!++3&bGZ!o-*6w?;oOhf z=A+Qb$scV5!RbG+&2S}BQ6YH!FKb0``VVX~T$dzzeSZ$&9=X$3)_7Z{SspSYJ!lGE z7yig_41zpQ)%5dr4ff0rh$@ky3-JLRk&DK)NEIHecf9c*?Z1bUB4%pZjQ7hD!A0r-@NF(^WKdr(LXj|=UE7?gBYGgGQV zidf2`ZT@pzXf7}!NH4q(0IMcxsUGDih(0{kRSez&z?CFA0RVXsVFw3^u=^KMtt95q z43q$b*6#uQDLoiCAF_{RFc{!H^moH_cmll#Fc^KXi{9GDl{>%+3qyfOE5;Zq|6#Hb zp^#1G+z^AXfRKaa9HK;%b3Ux~U@q?xg<2DXP%6k!3E)PA<#4$ui8eDy5|9hA5&{?v z(-;*1%(1~-NTQ`Is1_MGdQ{+i*ccd96ab$R$T3=% zw_KuNF@vI!A>>Y_2pl9L{9h1-C6H8<)J4gKI6{WzGBi<@u3P6hNsXG=bRq5c+z;Gc3VUCe;LIIFDmQAGy+=mRyF++u=drBWV8-^>0yE9N&*05XHZpPlE zxu@?8(ZNy7rm?|<+UNe0Vs6&o?l`Pt>P&WaL~M&#Eh%`rg@Mbb)J&@DA-wheQ>hRV z<(XhigZAT z>=M;URcdCaiO3d^?H<^EiEMDV+7HsTiOhoaMX%P65E<(5xMPJKxf!0u>U~uVqnPN7T!X!o@_gs3Ct1 zlZ_$5QXP4{Aj645wG_SNT&6m|O6~Tsl$q?nK*)(`{J4b=(yb^nOATtF1_aS978$x3 zx>Q@s4i3~IT*+l{@dx~Hst21fR*+5}S1@cf>&8*uLw-0^zK(+OpW?cS-YG1QBZ5q! zgTAgivzoF#`cSz&HL>Ti!!v#?36I1*l^mkrx7Y|K6L#n!-~5=d3;K<;Zqi|gpNUn_ z_^GaQDEQ*jfzh;`j&KXb66fWEk1K7vxQIMQ_#Wu_%3 z4Oeb7FJ`8I>Px;^S?)}2+4D_83gHEq>8qSQY0PVP?o)zAv3K~;R$fnwTmI-=ZLK`= zTm+0h*e+Yfr(IlH3i7gUclNH^!MU>id$Jw>O?2i0Cila#v|twub21@e{S2v}8Z13( zNDrTXZVgris|qYm<0NU(tAPouG!QF4ZNpZPkX~{tVf8xY690JqY1NVdiTtW+NqyRP zZ&;T0ikb8V{wxmFhlLTQ&?OP7 z;(z*<+?J2~z*6asSe7h`$8~Se(@t(#%?BGLVs$p``;CyvcT?7Y!{tIPva$LxCQ&4W z6v#F*);|RXvI%qnoOY&i4S*EL&h%hP3O zLsrFZhv&Hu5tF$Lx!8(hs&?!Kx5&L(fdu}UI5d*wn~A`nPUhG&Rv z2#ixiJdhSF-K2tpVL=)5UkXRuPAFrEW}7mW=uAmtVQ&pGE-&az6@#-(Te^n*lrH^m@X-ftVcwO_#7{WI)5v(?>uC9GG{lcGXYJ~Q8q zbMFl7;t+kV;|;KkBW2!P_o%Czhw&Q(nXlxK9ak&6r5t_KH8#1Mr-*0}2h8R9XNkr zto5-b7P_auqTJb(TJlmJ9xreA=6d=d)CVbYP-r4$hDn5|TIhB>SReMfh&OVLkMk-T zYf%$taLF0OqYF?V{+6Xkn>iX@TuqQ?&cN6UjC9YF&%q{Ut3zv{U2)~$>-3;Dp)*(? zg*$mu8^i=-e#acaj*T$pNowo{xiGEk$%DusaQiS!KjJH96XZ-hXv+jk%ard#fu=@Q z$AM)YWvE^{%tDfK%nD49=PI|wYu}lYVbB#a7wtN^Nml@CE@{Gv7+jo{_V?I*jkdLD zJE|jfdrmVbkfS>rN*+`#l%ZUi5_bMS<>=MBDNlpiSb_tAF|Zy`K7kcp@|d?yaTmB^ zo?(vg;B$vxS|SszusORgDg-*Uitzdi{dUV+glA~R8V(?`3GZIl^egW{a919!j#>f` znL1o_^-b`}xnU0+~KIFLQ)$Q6#ym%)(GYC`^XM*{g zv3AM5$+TtDRs%`2TyR^$(hqE7Y1b&`Jd6dS6B#hDVbJlUXcG3y*439D8MrK!2D~6gn>UD4Imctb z+IvAt0iaW73Iq$K?4}H`7wq6YkTMm`tcktXgK0lKPmh=>h+l}Y+pDtvHnG>uqBA)l zAH6BV4F}v$(o$8Gfo*PB>IuaY1*^*`OTx4|hM8jZ?B6HY;F6p4{`OcZZ(us-RVwDx zUzJrCQlp@mz1ZFiSZ*$yX3c_#h9J;yBE$2g%xjmGF4ca z&yL`nGVs!Zxsh^j6i%$a*I3ZD2SoNT`{D%mU=LKaEwbN(_J5%i-6Va?@*>=3(dQy` zOv%$_9lcy9+(t>qohkuU4r_P=R^6ME+wFu&LA9tw9RA?azGhjrVJKy&8=*qZT5Dr8g--d+S8zAyJ$1HlW3Olryt`yE zFIph~Z6oF&o64rw{>lgZISC6p^CBer9C5G6yq%?8tC+)7*d+ib^?fU!JRFxynRLEZ zj;?PwtS}Ao#9whV@KEmwQgM0TVP{hs>dg(1*DiMUOKHdQGIqa0`yZnHk9mtbPfoLx zo;^V6pKUJ!5#n`w2D&381#5#_t}AlTGEgDz$^;u;-vxDN?^#5!zN9ngytY@oTv!nc zp1Xn8uR$1Z;7vY`-<*?DfPHB;x|GUi_fI9@I9SVRv1)qETbNU_8{5U|(>Du84qP#7 z*l9Y$SgA&wGbj>R1YeT9vYjZuC@|{rajTL0f%N@>3$DFU=`lSPl=Iv;EjuGjBa$Gw zHD-;%YOE@<-!7-Mn`0WuO3oWuL6tB2cpPw~Nvuj|KM@))ixuDK`9;jGMe2d)7gHin zS<>k@!x;!TJEc#HdL#RF(`|4W+H88d4V%zlh(7#{q2d0OQX9*FW^`^_<3r$kabWAB z$9BONo5}*(%kx zOXi-yM_cmB3>inPpI~)duvZykJ@^^aWzQ=eQ&STUa}2uT@lV&WoRzkUoE`rR0)`=l zFT%f|LA9fCw>`enm$p7W^E@U7RNBtsh{_-7vVz3DtB*y#*~(L9+x9*wn8VjWw|Q~q zKFsj1Yl>;}%MG3=PY`$g$_mnyhuV&~O~u~)968$0b2!Jkd;2MtAP#ZDYw9hmK_+M$ zb3pxyYC&|CuAbtiG8HZjj?MZJBFbt`ryf+c1dXFuC z0*ZQhBzNBd*}s6K_G}(|Z_9NDV162#y%WSNe|FTDDhx)K!c(mMJh@h87@8(^YdK$&d*^WQe8Z53 z(|@MRJ$Lk-&ii74MPIs80WsOFZ(NX23oR-?As+*aq6b?~62@fSVmM-_*cb1RzZ)`5$agEiL`-E9s7{GM2?(KNPgK1(+c*|-FKoy}X(D_b#etO|YR z(BGZ)0Ntfv-7R4GHoXp?l5g#*={S1{u-QzxCGng*oWr~@X-5f~RA14b8~B+pLKvr4 zfgL|7I>jlak9>D4=(i(cqYf7#318!OSR=^`xxvI!bBlS??`xxWeg?+|>MxaIdH1U~#1tHu zB{QMR?EGRmQ_l4p6YXJ{o(hh-7Tdm>TAX380TZZZyVkqHNzjUn*_|cb?T? zt;d2s-?B#Mc>T-gvBmQZx(y_cfkXZO~{N zT6rP7SD6g~n9QJ)8F*8uHxTLCAZ{l1Y&?6v)BOJZ)=R-pY=Y=&1}jE7fQ>USS}xP#exo57uND0i*rEk@$;nLvRB@u~s^dwRf?G?_enN@$t* zbL%JO=rV(3Ju8#GqUpeE3l_Wu1lN9Y{D4uaUe`g>zlj$1ER$6S6@{m1!~V|bYkhZA z%CvrDRTkHuajMU8;&RZ&itnC~iYLW4DVkP<$}>#&(`UO>!n)Po;Mt(SY8Yb`AS9lt znbX^i?Oe9r_o=?})IHKHoQGKXsps_SE{hwrg?6dMI|^+$CeC&z@*LuF+P`7LfZ*yr+KN8B4{Nzv<`A(wyR@!|gw{zB6Ha ziwPAYh)oJ(nlqSknu(8g9N&1hu0$vFK$W#mp%>X~AU1ay+EKWcFdif{% z#4!4aoVVJ;ULmkQf!ke2}3hqxLK>eq|-d7Ly7-J9zMpT`?dxo6HdfJA|t)?qPEVBDv z{y_b?4^|YA4%WW0VZd8C(ZgQzRI5(I^)=Ub`Y#MHc@nv0w-DaJAqsbEHDWG8Ia6ju zo-iyr*sq((gEwCC&^TYBWt4_@|81?=B-?#P6NMff(*^re zYqvDuO`K@`mjm_Jd;mW_tP`3$cS?R$jR1ZN09$YO%_iBqh5ftzSpMQQtxKFU=FYmP zeY^jph+g<4>YO;U^O>-NFLn~-RqlHvnZl2yd2A{Yc1G@Ga$d+Q&(f^tnPf+Z7serIU};17+2DU_f4Z z@GaPFut27d?!YiD+QP@)T=77cR9~MK@bd~pY%X(h%L={{OIb8IQmf-!xmZkm8A0Ga zQSWONI17_ru5wpHg3jI@i9D+_Y|pCqVuHJNdHUauTD=R$JcD2K_liQisqG$(sm=k9;L* z!L?*4B~ql7uioSX$zWJ?;q-SWXRFhz2Jt4%fOHA=Bwf|RzhwqdXGr78y$J)LR7&3T zE1WWz*>GPWKZ0%|@%6=fyx)5rzUpI;bCj>3RKzNG_1w$fIFCZ&UR0(7S?g}`&Pg$M zf`SLsz8wK82Vyj7;RyKmY{a8G{2BHG%w!^T|Njr!h9TO2LaP^_f22Q1=l$QiU84ao zHe_#{S6;qrC6w~7{y(hs-?-j?lbOfgH^E=XcSgnwW*eEz{_Z<_qWdJM_~J|SY|xXabVJN2ktl0rgjIsb3I^PBI?aK2$7N~_hvX0wqgRya5qKscty3rOfChkv6Z0WyaHE5x_kZFD*v zu*7&g9ux`%nmBh2H(3V!(nZ*%fR5|PZw;VYx`bKcL!l7z`TRDJ=>8jcpRVC7w*|e7 z!D#*wu1Epbzhd8z2TSr!o3TI;Bu;_PKH|iU+qfqHvfTw&moYB|{54O!qO(0RM-^0tbTu zYPA|hqY>P0H=E|&`mg<>+W*XvP;UayB-E=N2bN3~kTa5#j|=Yz#! zp$|%>QWOsCkp`B_Wmv6N-9P~jzb_2Kr9wRIDZ_baWa-lC8&;HkOp?UU8vRS zAD(Q>>-8d&$-r*^c^Wku4b4?e+Ops8M>?HGB9Q>gvdCt$C>Dz_nM`mxod^bl5Cj30 zN(ISe5)0e}AgOL~aglDB=Xo?54H%6^dXLOW10WxT%t@7)1SHbwbcjSEf5Z(21ESIB zxFyoSe_;^?lKwXo$6KpngWZ@8(E7AJ%0&jh3p{5*tu=$SJFjryZ>riqgLj9mc>M7B z4zT&;K}WlKPx$?ny*JR5%f>l)FnDQ543{x%ZCiu33$W zg!pQFfT_}?5Q|_VSlIbLC`dpoMXL}9Hfd9&47Mo(7D231gb+kjFxZHS4-m~7WurTH z&doVX2KI5sU4v(sJ1@T9eCIKPjsqSr)C01LsCxk=72-vXmVcK>PAbAwTqj;`=7>HX zM93AwkN~n3*c#^KTQF}AzdqL{zi@>Zh*Ssn#E}f z?2!Tdd=!N|E`LQqfZ!&&jLDjEQ&kRm2Au4n1MK0N35-SfX2&{q-XJr=-ElMh0X1pR zv9tJC^8;Ev)6EqkFe?kk}Ykyy<_4SDiTi$Rn#7M z#~7%V)LWyXv{s~4MNooAQOx#(NRVokSg*RehExT?52E|Q8iT7uL)vITMJ;Y^P^)|N zok@1tH@+J*`*y1(e;9mb=GmFwJ2TH53UR_EG|j}t#X%yGuzwtG-AD8THKfEo_a+u2 zr1;sA4u^lmC-?qf1^71m|ayd6(R#q0GqM}$0KI}opgGF2FX!Q{6Y4D1noY*a3b{9Ws^swa%;;8z48?K-Bp}X7#A23-ZC*X}cxT+Cb zAI>0VNeP>#aTVqOnf2geb*iVd_6TCr{OOG1lcX1bmVe4DV3-8>=6&lx)G6s1%_*~h zXI}$8eD~i%V(X^LeBJ4t;*+8mfR^f5fLmKzXl-qUQmKSar-PrLAJWp&;Oy+o>A$hD zftHpQOifL}hPg`x1Oy;8H5HDIj{E~oOiUm?J|64q>&CL)-d@zy)S#oI0}&AsEPrw{ zPE1UsAAe;~cXv1SC%+2`3E>ZLWn~4?(a}(=)hH?|LP|;s1OfrNy1GzRRfX8tSlTIh z(-5__wIMSzla6v(Ss4Y@Gq>RO_IA|O)lvW1*;%-{y7B|q(9l3fqN1V#<>lqZa*_`W z3`BEtGeSc{DMWR3HA+iMVP|KD&dyH6#Kai=YkzBN;o#tal9CeC*VjWPlko#MHa158 z78Dd5s*8+_q)DUEATKWuO-)U3a&p4p;2?s6f)4rT=jYQ=HMGeK;O_1&ol=oV#96cTBS)ovfy}dpD0KL4tFgG`c;o;#!&(h7!O}eHgCnw?S z>wilj#bPm?-mtK+LlHhYI*R@MecC2(fVsK3w8QM|Z1nf{!{6VZmJ{fNgaj-sEYK(> zQEG2*kDi_$I-*jk6n%Yt@b>nm{?pUb$jHbrw#ge{aBwgUj>^hPx|ex)c+hE5sZ=yl z)6>)G+OxHN{G1`%QBF<{E%Wj5fv2Y@^?#e6pQnLDf+RdVoIgM!60xK+5{YEvB^{Az zDl9BSa&j`=h>eXh@Qsa)^utKB&dkiva`JJ-#l>{gkE&yxBxGbrIyg9>dBccti2##n zCW%Bi$&)}kuAb{Geij&KC&K4H^8a6#h5tgQ7f{b6jm|m{`e)R!07Wlhd;5v~D%PDHLkV1h`xN6Y{K delta 1263 zcmV@pi1MCNO0)IV#%ludY7y^C(P8nmq zn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^ z0;J00)_^G=au=8Yo;1b`CV&@#=jIBojN^JNVfYSs)+kDdGe7`1&8!?MQYKS?D#s$vI-^)!+G(}fY0@GZE%Iy@h8^{To?*ybtdaV z#dGpubbrm88$G&G)t}RfNfHWj;miff!TI4N-053E5yn?^gn~>Efgal6v3aRQH6&5h z5RdxeaKF#Z3DF+wT}ipqw*r>6L_o>H)_@;IH+E!`$CjnG=I69xv5?4rFE5T<_4z9k zUE13=6Yl7M&)0VYdRh(na56)ifvXBQ9rBHSpMOyB?&C3B2(E?0{drE@DA2pu(A#El zY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEUghdWK)^71EWCP(@(=c4kfH1Y(4iugD z4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ!)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup z8Gny~yBS`4IM3Ejiyx@r7k6FNj3I&(u=gRCXSyuIdEq9`!w_5#8|1lh<}9zje~vrj zSvOi;kBKp1x_^6dt;HYDvVDC|!;npFnu?Iwkp16`aq;61 z(bxp^tR-32bxI*$q^qN~E=WtXi*Lvr13@UdTP>e%gS9JH6E0gj#d#qJ@j6<$^6L;U z96QH9<5?VA^D`+63@3jYg0zM}Vnuf+7mvTh#+B{(=`1atgKG`0V?kn3XB$_3zkkE- z<6kn8$>UfOK*JmOBy6`wGVJO*%iu3V&@!!@aV?BzS+#yS=il1R z>g7u?fH5<|9S}wLf|2wx@ELQ^JW3#kM*rj72*DX61F^` z1H57+xxlx;4(6i$CY4j99!ubU1ZbWz@uFLa`oyWZf~=MV)|yJn`M^$N%ul5);JuQv zaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$NIIaX+dr)NRWXcxoR{>fqI{SF Z_dm1Ylv~=3YHI)h002ovPDHLkV1gJJWqkku diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png index f091b6b0bca859a3f474b03065bef75ba58a9e4c..e8798c9c33656890b3ed4f1431dbc7cc9ef210eb 100644 GIT binary patch delta 1781 zcmVN5p3D5{0!84lrhgP|zAV*Y)5U7o!RjEWd+Cqhh2m+NNH!RS7zp~ps zId<7?yY45M>~DTE^PBhm&71e$&WtYJGj#uL15}NKU_(PgTz|fNS>^%hRS3(k#cJWc zP#1i^#sxQ&V4r}SwFpYB!g}Gp0DBZfcp^#GF*|nbKxb#CNS}mYJv}{yg@wsHaYYF{ z^EnXN!QB@%VLr+g-1q>lsoJ9Fby|QoVV}wtynFZVi3O`W8o}z$xPm+SVVYKnb>%Hs zFu(H+gY@=3SWRTivsQS}GFjuNi{IYDg_eH|0b+hcZ1QSs_{WtyQl&D|_2PspSMb9j3-MJi~KlCel+W#xouTw2}H z2v&DAf`8Q=jbKF?92~^R$Ot$bjzZ%M3=FVe0|SHUFiXI+2(GQI#o4oGaqHGCG&D4@ zzL_&;A|N0DyLRn@mzUS1#;K^Nz`1khaOch)G&MD`zBzN|VCBk{h>VPctE;QRwkjle zbaWJ_PoKu2Lx?7kK)LYBZ74c3kxh>yqF0qFE3}JNx;dICsAKt z&%}$nI=OB{Le%Vm?&-QCS5PhR8}Tvk?w=;-Lb z2Y=DkW#Y;0`1joK@G!1ky~BZ{IGmoy3vhZfJ0mXVQFc}L=lyhl}v17V({Yq(xlvT}86Yb!D{Gg+Ggn7g~XJf_PhSX*10 zMdi4-IP~=NAT%_TRas_cW+MCb_xEG-=FQBN`NxqcN>zL)ol$-zD2Sz|rm_!fgz4() z!rHZK@$TI_woXBkzD1D-xzo~t0|!{KKxHN6WC}ie_wI#{j}N;_R4|aZntz%awm-Qp zxiGo1FcjsDjEvaCQCgyP8fVFpCCvTr-@lJjr%nkacU?PO0P2eM=F2DuGfQg-S~& zCnr34@`T-!X=!P!x)O&{$$$Ct=i%VsAak5Wix#m`lnM-r3H-puhdhQprAkapWCe^O zDEx29%E}5!NlA#0k4Ir)A#-sGROEVe^_`t3_vy#%*|U+Ioy}agsHg}pUc6wrmvT7$ z>$0=6Q`A((wEZ6@gSKwns_-~-=gu9sa#Iw|6AyJqBUs(h2v&DAf`7H7yjLFL6;M&7 zsxe4j`nZyPTI@SJQ6vN#>!S+>_;c)|F2*qLsD!dbN_ag00000NkvXXu0mjfzRiQE delta 1572 zcmV+<2HW|B4zvuABYy?^Nklc)UfJ<2uenUn3ARN>mf|M z+(eagCX~wv_9N9Br6dE4W@{R1X8yU75JVAXqB_2?1W&7xoYHg zkR5NEVWsUG^?wLzRHH9Aa#eCDK9NvdPE(De9-HaQc(6~^lpTe2pm3&x9G1K5Xawdi z4F*DRWI%>vgEBPFqaRR51|&E>B!fiay027YsK+Vrn=1PqDKdi{m<&P1nQ3_Gw<%cH zHU+slT8moWCbIKH=(W3t1j5BNfsIKQ#Mzi(J59kx zT!xVJ&SKqb4XjdxWQV7$IrZ-{l-x3`7M}qzHsPzP1S_$c=96h(q%b9ZXPvcV z;D5oPsau6Q(U`-YLD*G41z_cgz)a99av0W_U=aHAj?mj@2KZI50efIA zO8^kn_?FjaZ_hfbhSh@3^GzxJx*P{Jc7Hi*OHPZ!wvEV2a9XKq###zPPeRs75i0(W zU?doBGb9yqT58~qn?wQ4oCi3oWdc^W%JAgTVR)*l33@Ky3ip4Rqz14Wx_gwsGYGq) zMY~B;*z8j>WF8xV`^#!USYHDVZf}I{OZGzBnutHA1D(}!4{};5>;)mO27l7F zHh@r23lDAk8oF(C+P0rsBpv85EP>4CVMx#04MOfG;P%vktHcXwTj~+IE(~px)3*MY z77e}p#|c>TD?sMatC0Tu4iKKJ0(X8jxQY*gYtxsC(zYC$g|@+I+kY;dg_dE>scBf& zbP1Nc@Hz<3R)V`=AGkc;8CXqdi+`PV3Vc;#lxQO~AoO*}pfE+=*r3ffZ_YMC zflq>i%a-`Xw)YRuK;MUtq{SGa7vtY^gg0bKSp&F>y|A>h5qhqSvgdtV{(lh0c$xz5 z;*U?KQl%W)htLmD=yhL!@aldLHW(=H00^&qu7J0mA5v0IaX@pn_bKobsC(e>(nAjI zzjyto3Dmc!oOxjlw&JZqeL%+vsN0Zy8@1@rs~rRNAqO?umG&QV WYK#ibz}*4>0000kw~v5k`E^KjGrtm$<&fj2iO;%*=yio>ED1xi2(K4&;cIJ18j2c4LuQ`AZbx->HGjs(#}N?`f#Tv~G&MCLGBPrF zsMqVI0VXCUP*+!n*w|PYjYec-WWZvvK&e#1YPBLSFAwqY@#yI2z~bT}tyZ(Mvlt#8 z29L)J4r;U6U^bgEHa3Rr?5%frVPPTK+uM%=>NA;42oDdZV^UL7p;DF8jSy?`xKp;R>RTbLW+USvz`q4HfX3! zCWFW0!PL|gT|Lp}<|b-uYbms~wUsWQx3?E1B_#+8qm>ZT)6-a8UG=NYoS_7ilaqt| z{CqStG|(bU?sQ~i1pWQ}C@3hP3o0usqu|QQN`E*U4%FAz)6*e$A2gIC!N9-(v|23< z=yJJ`oScl&(NTJ5L@6mLG;7I@)oL|_LLvR+F&GSfN6r~aB#}ta+1W{V=ytmy7K;PM zBqb%$3@3{sIY8Qe;`DOh5=0sYywyRT@!HH?E|j zMhb#%s#4upT=)UH*V?AKa$!XfDp{yYMM4EjBZ*)|sUM-0QcIzVVEUzzCX>V@GwETqrXGsdu zA8$)?`v2seloOCza43C{NQ$$gAOH**MCn0Q?+L7dl7qnb zRdqZ8LSVp1ItDxhxD?t@5_yHg6A8yIC*%Wgg22K|8E#!~c zTNYR~@Y9Kep?_ava@M;M8kmViU%_&qKVn19EJb6L%o<5ryPpl%8u^fhsfT?9!(e|z zYg7{msk{Fg=+Yccm!Y>{*q;KO>K8^PXf0r1U?zrb1;c^{Splu&<;=9>z4K+dat5se?oWZUF&sQo;?$JL1+gmMrdqaw4-)Uy6fE`VS`NRWHPm9hb$Oljeq3qzfzL34WA)&3E*EQj_ z#)s*NZh!yi@GmiUwp(6LfzxI2{CJ7UMd-?TP+;I{8J_M5c&a;WSjjcpVCBWnFDBgE zY1z>1fzN(l;@ioDEiIOtTMPkWDu!pahV1DHm#V&=)a||1#W682UO8Ff#AHHe&ajZc zxl(1kEaPYZ6hwubN6i<8QHgsu0oE)iJ(p;Wxm>sf!K+cw>R-(^Y2_bahB+& zK7ZsKxz;@6=dLht@F-X3N(9#6>iA+L6@m3xzycB{LJO~c@)K`<_zg5y-Q>ju`fuOJ z$ZNaU+|lB5Y}R-@XC#dRJIOdB32iJUA<4bXt Z%s>0@A=V4gM}z;=Six@BjSnIrp6N|B&Dvfq&%xR=`})B06*COk`$e zj`$DJ#VF|=fQw@6>VW6PF^Cx_{REQBk^k3oOi`6ptVE=pjqdqdw{FGFn>W>DT14I4 z+^}fTq7g4DsYN(sa956<&^gLVL%h^06J|J^gT1o%gp4@A>|W=J8bW&u;i=%KWm2uW4(8!D()|ml%kn zNkJ&Ev&EpUHFOdkcm+v9DUP0~$BMC(;0D~&2o&ak>NT6?hWM=&5k+-~KN*WCxk#ot zUnkM@YHZVoutIBm*)X8jGjT2-qwK-VRi>1Lz)Y4!jYH84m=qJ;F zZ$rje69bW11C%w4Jx?#9-Y&q$(~Q(;oFFe%^@7!PEe%$pmIf6&AUS0?Z3BkH`>kttU0UMhU9;vIKs;UaPxw)vWu0~s18=Re;F>BT= z#Kpy7&6+isFkymGdKyKvp`igWF)_Gv=Z>2E(W6HwDk>5!IyxE$4<3Z8tET^l+B$x7ykbK;x}5kx3?F~ z&CLi8566`&R}c^oU_PQGuy*ZQB}poqlanJ{R)Jf$ZXqEd0rmCuxN+kKVq;@*>Cz>o z8-H`7mMmFu2y1tBbz$}D)u^edfvxQbFI`Mc^y<~C zsI06MeOgs2l|mv>Uy5$V^R{f+GIVx!3S|`}Z{NNxNIri2Sd3@So{ckS&S1(EwHIcX zIB_Bh3JTEO-Hr0{auEY6Dk`va=~D9$Eq^O3Q}%c6+^I!Ufk~4l;r#jYc=6%|JUl#v zj2pCk`EsE=5g8dNHfp3ZOzZ91wM!5sPMtbsKB9N;-W7j&E*C6VFzQ@JOGU&ye*8F+ zlanEn4L?XvN=g!u*52NJ)HQf6c`Vx7+m+XTT^K}kaB%qbhMk?AUa5oFw{IUdZ-3q_ z&Ns1T%NAiNeg9wKHHvG$E({{->pT3~gAtLbB`7Fp#JN-~H8oYF2!gK2{>F_P#du&~ zK#(2D{Ru{G#d)4FV}>Cr8%A{T;>F6>|7mGyB46sV3|*A2N|z-Z9UVn+!3a#SxL`p* z&nPS`go}%d)*3{5db--R4S_*K`G4x4k&;o6iJU25&z?PM)eDP;RjXEsgikOqm6nzw zG&EE>CowS*XV0D$edb`2Rd@@*qG9{??Kp7YfEe@p3Kk%Sz#yV@zx@1sQRXpvW@TlG z$jNBPf}yFYNu&!_Jp|p2X~ECWPi>w3`}d=@wNoI7_;lz>#`$&)9@%gfW6$EZw8YF0&rkB^TiBI4uYMH-?7nYvWd7r}_j z<1ugEJVVtruGVE0Lu)Xi^6arxBWUqCbLNN|mIe7}frj~&?n}4L&d$cQYu7}8BIw4f zt~PDjBwXJZ7=8ER?(U8qJAZbF#xjio#?#aDweB{!F(kxBt3G}DR0Jk|3S=sn^nR42 z*^GgMg9D~cooXVD{)6?#+tOeqYH6?%wKV8Ow5=DoaBsX-F$@p8$DTuI5%q9F$1@FC zW$SQzTR;vS8Zs@SzV2vo_dpZBuQQWgCWV(X+5)^$Tc!R4R+}hqD}R3o$2V~$kaB1y z{Y-}M!>~>I3tnoVhIis3_f`*D0#H4c2# k)*^4a$C&rdk{r|k@#O8@`>07*qoM6N<$f+X%jMgRZ+ literal 1716 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png index 2ccbfd967d9697cd4b83225558af2911e9571c9b..c17185100b27ace20f681c27e9d5b48f0674f060 100644 GIT binary patch delta 1167 zcmV;A1aSL<3Zn^-B!6m2L_t(|0qvM+NSsF)$N#cx59_v4jg1Sn+b%>SDiTi$Rn#7M z#~7%V)LWyXv{s~4MNooAQOx#(NRVokSg*RehExT?52E|Q8iT7uL)vITMJ;Y^P^)|N zok@1tH@+J*`*y1(e;9mb=GmFwJ2TH53UR_EG|j}t#X%yGuzwtG-AD8THKfEo_a+u2 zr1;sA4u^lmC-?qf1^71m|ayd6(R#q0GqM}$0KI}opgGF2FX!Q{6Y4D1noY*a3b{9Ws^swa%;;8z48?K-Bp}X7#A23-ZC*X}cxT+Cb zAI>0VNeP>#aTVqOnf2geb*iVd_6TCr{OOG1lcX1bmVe4DV3-8>=6&lx)G6s1%_*~h zXI}$8eD~i%V(X^LeBJ4t;*+8mfR^f5fLmKzXl-qUQmKSar-PrLAJWp&;Oy+o>A$hD zftHpQOifL}hPg`x1Oy;8H5HDIj{E~oOiUm?J|64q>&CL)-d@zy)S#oI0}&AsEPrw{ zPE1UsAAe;~cXv1SC%+2`3E>ZLWn~4?(a}(=)hH?|LP|;s1OfrNy1GzRRfX8tSlTIh z(-5__wIMSzla6v(Ss4Y@Gq>RO_IA|O)lvW1*;%-{y7B|q(9l3fqN1V#<>lqZa*_`W z3`BEtGeSc{DMWR3HA+iMVP|KD&dyH6#Kai=YkzBN;o#tal9CeC*VjWPlko#MHa158 z78Dd5s*8+_q)DUEATKWuO-)U3a&p4p;2?s6f)4rT=jYQ=HMGeK;O_1&ol=oV#96cTBS)ovfy}dpD0KL4tFgG`c;o;#!&(h7!O}eHgCnw?S z>wilj#bPm?-mtK+LlHhYI*R@MecC2(fVsK3w8QM|Z1nf{!{6VZmJ{fNgaj-sEYK(> zQEG2*kDi_$I-*jk6n%Yt@b>nm{?pUb$jHbrw#ge{aBwgUj>^hPx|ex)c+hE5sZ=yl z)6>)G+OxHN{G1`%QBF<{E%Wj5fv2Y@^?#e6pQnLDf+RdVoIgM!60xK+5{YEvB^{Az zDl9BSa&j`=h>eXh@Qsa)^utKB&dkiva`JJ-#l>{gkE&yxBxGbrIyg9>dBccti2##n zCW%Bi$&)}kuAb{Geij&KC&K4H^8a6#h5tgQ7f{b6jm|m{`e)R!07Wlhd;5v~D%PDHLkV1h`xN6Y{K delta 1263 zcmV@pi1MCNO0)IV#%ludY7y^C(P8nmq zn9fp!i+?vr`bziDE=bx`%2W#Xyrj|i!XQ4v1%L`m{7KT7q+LZNB^h8Ha2e=`Wp65^ z0;J00)_^G=au=8Yo;1b`CV&@#=jIBojN^JNVfYSs)+kDdGe7`1&8!?MQYKS?D#s$vI-^)!+G(}fY0@GZE%Iy@h8^{To?*ybtdaV z#dGpubbrm88$G&G)t}RfNfHWj;miff!TI4N-053E5yn?^gn~>Efgal6v3aRQH6&5h z5RdxeaKF#Z3DF+wT}ipqw*r>6L_o>H)_@;IH+E!`$CjnG=I69xv5?4rFE5T<_4z9k zUE13=6Yl7M&)0VYdRh(na56)ifvXBQ9rBHSpMOyB?&C3B2(E?0{drE@DA2pu(A#El zY&6el60Rn|Qpn-FkfQ8M93AfWIr)drgDFEUghdWK)^71EWCP(@(=c4kfH1Y(4iugD z4fve6;nSUpLT%!)MUHs1!zJYy4y||C+SwQ!)KM&$7_tyM`sljP2fz6&Z;jxRn{Wup z8Gny~yBS`4IM3Ejiyx@r7k6FNj3I&(u=gRCXSyuIdEq9`!w_5#8|1lh<}9zje~vrj zSvOi;kBKp1x_^6dt;HYDvVDC|!;npFnu?Iwkp16`aq;61 z(bxp^tR-32bxI*$q^qN~E=WtXi*Lvr13@UdTP>e%gS9JH6E0gj#d#qJ@j6<$^6L;U z96QH9<5?VA^D`+63@3jYg0zM}Vnuf+7mvTh#+B{(=`1atgKG`0V?kn3XB$_3zkkE- z<6kn8$>UfOK*JmOBy6`wGVJO*%iu3V&@!!@aV?BzS+#yS=il1R z>g7u?fH5<|9S}wLf|2wx@ELQ^JW3#kM*rj72*DX61F^` z1H57+xxlx;4(6i$CY4j99!ubU1ZbWz@uFLa`oyWZf~=MV)|yJn`M^$N%ul5);JuQv zaU1r2wt(}J_Qgyy`qWQI`hEeRX0uC@c1(dQ2}=U$NIIaX+dr)NRWXcxoR{>fqI{SF Z_dm1Ylv~=3YHI)h002ovPDHLkV1gJJWqkku diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png index c8f9ed8f5cee1c98386d13b17e89f719e83555b2..ed410302431d07099b74a694be9e92504f476889 100644 GIT binary patch delta 2291 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 P00000NkvXXu0mjfCj%OO diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-50x50@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..aa1a8676fb921d138a98582211f4e4349c56a48c GIT binary patch literal 1470 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 URXYu{>Hq)$07*qoM6N<$f|HyVt^fc4 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-57x57@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..02bd49646fa5b64638c1393c9a93b67ffec5fe7f GIT binary patch literal 3062 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 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png index a6d6b8609df07bf62e5100a53a01510388bd2b22..1211a85d05b2c8ded303d2bd3ff9487913b94c5c 100644 GIT binary patch literal 3261 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 P00000NkvXXu0mjfCj%OO diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png index 75b2d164a5a98e212cca15ea7bf2ab5de5108680..b51900afffc13b9528597cdd42b0b7b93681ac6b 100644 GIT binary patch literal 4770 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 F{sTHMI1&H= literal 3831 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 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..d016cd5f6d45d18cf680a0890b477cfbaefc442f GIT binary patch literal 2114 zcmV-I2)*}-P)97uT&aE>HGjHb3N~h-il9ze!zU|y^&OP_s``)vK zh*oU>YXdADL4j;+Y!Db2sP)9|9#|FEB1pB|$_hO}o+vVreR@$+hd^mJY*fqrJy2q2 z4XL(sOG``9+1aU9E+~+jn;RZIdZg7DNhchgc0%nSnLyo-lGKgt4_q^F_hScKRLif& z!^6uN_1ez$@$o@rWu;oV*u*%90&x%p;vfpdL1%&5rLcS5gs(cJaG>orDI7H&TT%<{ zU7(qe^{m!H$#kCG4ku* zQLM|&`-{*lK$|*y%*{rfK&OAk=a}VNVt39gw1O<|*>fF$R;bynYLio@Q zcger4rABq1pg>(curs?=7KUt)D_CbSQRE;B#6c8@gD4OOQ6LVYKpaGYIOrvim2B~G zGm|C#L}fFZanKpP1ag!e{c5egCRrAqzW{X--H#WW7za@x4x&IDM1eSn0&x%p;vfpd zK@^CCC=ds;3e?!xh>D5|w6(Rt!@~okMva24t#P-MN~L)5;st7JYhiD1kC7usV(?(| zJ()7OKph<&IC}Ib4jw#+f`S6{^z;sVTwPr;fBt-I*suW;CQQ)lx{n_}#_rv_apue! zG&ME#*%uTPgq15-A}%ftj*c3ih#Q1S1u8Eu$HIjRQCL_gxWBo%8QIy{IDY&%Hg4RA zw6rw#Hk&p`U^;H=)~(EYgeWR1!n$?quy^lXoH}(1!NI{s*F}!W1fqX9G&GdCK9BD1 zZfxJa9nYUX$FXC_H2&-KO5Ezzt8w`7VV!KC>&=`w6W6X?Lr6%7UiNFkBm#Z-@BtAK z5q-p&HfhEMQ(manD#xA`p4Qt5>fS+lh&Z*tTsOtgUv2^KD%$_|PPoF+z<@E9-iKi?Oi8g1>oIdYK`uh6f%9Se^J9ez1Y`}m4 z?2nl@ZyvK@^XAR0yt=xYty3H{7NZ4fZEeMY0|yk_QBhGyPfv%Hm6hP}RMFeFZ?k{- z?c2AweEBjHPYwx36{g-#&g99HapA%RczJmVUX$*Xl$3;L&z|APkt3{(e#wp@Lxvbt zKcfYr$}0CNhxqvTKHd1HO`CM`Mpcw;ptQnRj24KJ zKRLQ|@ybwlPXRq6BSTR}fju)blL=-B$~Gw5W++Ar6c7-gSf@mhf-7~wJSfLmv0??w zgXBYAG;UASWj$tXj2- zH47puD+^=BjKP*ITLj}rRaF(j!^8UwM<}>ox^xNS#*I^y6&Dw?eCgf0cWis=)TzkJ z%fsl=qt&iS!;w9E_F(`1{fe^K*jUR+6e$5bdGaL7YlxJT6x_OXi^Ui6Flr*SFDEC5 zHBZOq#Ouix)2{&ZTS7 zeN2H#1afzG$GLOoFl*KSDWmF*#A<=|#9J(eo!R5=BGw}%;Mo@-K z3r%%UzC(dt8S-cv(wM?~2$Ky~Dciks=MEbum6eq#%E|pz#Uatwu3d{=yLPdPYJ!3` zC4SUoDG5|g1B3)8kE59a@=8--(&-NBH6A{E$i_ev50r%>NQ}92=dv6}*U>gjhtPCK zOiT=R?AXB)N*bgpV+tF$Y&J&{ry=JFa-Jnk~)C) z_I4(GU0od$oKlM6!-wmgQ0j_Vr(8#j7{L}(LVtiMC&YM&llB}$fjEc)aS#RKAPU4m z6o`W;5C>5p4tfjJ-enFmEEhq6>}^0(=k!p$PyXI26UXuAezB|H`BY~$1O*ysi`Fl{ zK*ftDsLxJ)hIl%m+I}GF-@I4fr?H8}2H{9bKGMu-n5FQ20J2YO*r!pTgb-vNE5_3D zM);Y@E{nj+8C6Nskgm5t&i0VxEk=0w3FLjQB6+*uuM07lKV%>pG##V07aKDO6%XSu z>9+#>aH158%j)6ZDTU@K!2bcZ*65Vg>shovPW|`|esyz%)~Abt0@1T^r3t9NWy{V_ s%l{sFC{!w2Qa>#`#6*#UC=iE#04BQYN-Kn8=Kufz07*qoM6N<$f|sW40RR91 literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-72x72@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..be08a80e64e8b4da30dcee82bfccad628abf0152 GIT binary patch literal 3834 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 AO#lD@ literal 0 HcmV?d00001 diff --git a/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png index c4df70d39da7941ef3f6dcb7f06a192d8dcb308d..7134b69b2ae4e345eae0016752c7778feba7d5b3 100644 GIT binary patch delta 2134 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%0AT2~zJ7ohZA4qib zp)%`_8Mlfvd^7Pm$vS&^X+O!u6M890Bt_w}(3k*|_OO%N4Aq=$zx)cvBo>EahnNrc z*;wC+&!3?-Q?EsUy;tfKpGvCo)DZ1uve=1zOOP zg^)Mvq$aQXf|sZZT{7{B+D7b<^@&>AHQ#D!Rny6lf41~SS$~D)Z%%yXgIzBN1?L!= z(J#Id?%A~@-+X)yQ=gD>Ak`U1hQ3c$?@rM?t=L6T`80kudVgQUN1hiMD)9|^R@M^; zS=?uSVD2j^6g#!me&&dD3q10J`bT#bg*;hR++c zG+G<0%&Kui4zZX8_)Ir(eyz4uVjJ_51YacHzj5|Tj!<3OR^`a>j%ltnM2Q`&vi$YQ zDiu2L+VkkV6Y33~DMlx4#5VxdTWXa~#U4SAr;BWd;75A1NWrv@;YA^+qX)9HQ6 zLEzoUMo}<_I1;Oog1BHHW%D+U)*7sl=-_)pKd%eB?xzk;`fnBi;fTU3OT%wjcOBR? z@&pLn07KS9-*zT;f0K9@jZZVfM+l2CV&-LbTN5?6aY%xnO>P`V$QW~&B1T6xI4P-DJ+;m@IY0NMKE17&^c>z3HhmreIZ7FKDBSPi~Z{Cdv-eLH6gq4+&hL>z-ZaD`l>r-NVv zb5I=%k=mxG{cxn<_$HwKxln>H%q1dAS7uN9k2qxzq*aFfxE5>AKfJQD?EOo>Xq&jI zFl9IEr8KVxFmv7>UPowUGm7Wr#-M&J!+8~6%+bT7rA^d9!EekaE0W}ImeFrtX6t}v zc0RuqoSARD+>dWh+AxcI!W6)b1%&Wv#OcJaR6ljyZhH;Yn|U*-ga&*%Bc$0< zbRf5hA3T`N3&4!lx_B0rLtDFEiOJRZ!xImcxi%243v=d)%*+ORqj62GUqh9R0oR4m zT{4~W$VWVslf{qoMubmj86b=EHcvQnqTX%Yln>&T8^67m8}G%=hgyks6~GloZo)a# ze15D-k=yR!KrB-BhPzmKO@*t>zlHfaHekK*^FL}X1>Q6 d`QJFWxM5K?!0fHkO&iV6!S&7b-sw0;{Re;3fYks1 delta 3291 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 literal 3612 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 iW8 setUp() async { - WidgetsFlutterBinding.ensureInitialized(); - await SharedPreferenceService().getSharedPreferencesInstance(); - Environment().environment = DEVELOP; - Environment().version = VERSION; - InitializerAppService().preLoadingData(); - await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); -} - - diff --git a/lib/environments/integration.dart b/lib/environments/integration.dart index 68b46fa..5fff5bb 100644 --- a/lib/environments/integration.dart +++ b/lib/environments/integration.dart @@ -1,23 +1,10 @@ import 'package:calendaroo/constants.dart'; import 'package:calendaroo/main.dart'; import 'package:calendaroo/services/initializer-app.service.dart'; -import 'package:calendaroo/services/shared-preferences.service.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -import 'environment.dart'; void main() async { - await setUp(); + await InitializerAppService().setUp(INTEGRATION, VERSION); runApp(MyApp()); } - -Future setUp() async { - WidgetsFlutterBinding.ensureInitialized(); - await SharedPreferenceService().getSharedPreferencesInstance(); - Environment().environment = INTEGRATION; - Environment().version = VERSION; - InitializerAppService().preLoadingData(); - await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); -} diff --git a/lib/main.dart b/lib/main.dart index f4ef407..c889e49 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,16 +1,90 @@ +import 'package:calendaroo/pages/show-event/show-event.page.dart'; +import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/routes.dart'; import 'package:calendaroo/services/app-localizations.service.dart'; +import 'package:calendaroo/services/events.repository.dart'; import 'package:calendaroo/services/navigation.service.dart'; +import 'package:calendaroo/services/notification.utils.dart'; import 'package:calendaroo/theme.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_redux/flutter_redux.dart'; -class MyApp extends StatelessWidget { +import 'model/event.model.dart'; +import 'model/received-notification.dart'; + +class MyApp extends StatefulWidget { MyApp({Key key}) : super(key: key); + @override + _MyAppState createState() => _MyAppState(); +} + +class _MyAppState extends State { + @override + void initState() { + super.initState(); + _requestIOSPermissions(); + _configureDidReceiveLocalNotificationSubject(); + _configureSelectNotificationSubject(); + } + + void _requestIOSPermissions() { + flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + IOSFlutterLocalNotificationsPlugin>() + ?.requestPermissions( + alert: true, + badge: true, + sound: true, + ); + } + + void _configureDidReceiveLocalNotificationSubject() { + didReceiveLocalNotificationSubject.stream + .listen((ReceivedNotification receivedNotification) async { + await showDialog( + context: context, + builder: (BuildContext context) => CupertinoAlertDialog( + title: receivedNotification.title != null + ? Text(receivedNotification.title) + : null, + content: receivedNotification.body != null + ? Text(receivedNotification.body) + : null, + actions: [ + CupertinoDialogAction( + isDefaultAction: true, + child: Text('Ok'), + onPressed: () async { + Event event = await EventsRepository().event(int.parse(receivedNotification.payload)); + calendarooState.dispatch(OpenEvent(event)); + await NavigationService().navigateTo(SHOW_EVENT, arguments: event); + }, + ) + ], + ), + ); + }); + } + + void _configureSelectNotificationSubject() { + selectNotificationSubject.stream.listen((String payload) async { + Event event = await EventsRepository().event(int.parse(payload)); + calendarooState.dispatch(OpenEvent(event)); + }); + } + + @override + void dispose() { + didReceiveLocalNotificationSubject.close(); + selectNotificationSubject.close(); + super.dispose(); + } + @override Widget build(BuildContext context) { return StoreProvider( @@ -26,7 +100,7 @@ class MyApp extends StatelessWidget { GlobalMaterialLocalizations.delegate, GlobalWidgetsLocalizations.delegate, DefaultCupertinoLocalizations.delegate, - GlobalCupertinoLocalizations.delegate, // Add global cupertino localiztions. + GlobalCupertinoLocalizations.delegate, ], localeResolutionCallback: (locale, supportedLocales) { for (var supportedLocale in supportedLocales) { @@ -41,7 +115,7 @@ class MyApp extends StatelessWidget { theme: AppTheme.primaryTheme, navigatorKey: NavigationService.navigatorKey, initialRoute: HOMEPAGE, - routes: routes, + onGenerateRoute: routes, ), ); } diff --git a/lib/model/received-notification.dart b/lib/model/received-notification.dart new file mode 100644 index 0000000..9fa5359 --- /dev/null +++ b/lib/model/received-notification.dart @@ -0,0 +1,15 @@ +import 'package:flutter/cupertino.dart'; + +class ReceivedNotification { + final int id; + final String title; + final String body; + final String payload; + + ReceivedNotification({ + @required this.id, + @required this.title, + @required this.body, + @required this.payload, + }); +} \ No newline at end of file diff --git a/lib/pages/show-event/show-event.page.dart b/lib/pages/show-event/show-event.page.dart index 921f2f6..78bba74 100644 --- a/lib/pages/show-event/show-event.page.dart +++ b/lib/pages/show-event/show-event.page.dart @@ -11,6 +11,10 @@ import 'package:flutter_rounded_date_picker/rounded_picker.dart'; import 'package:intl/intl.dart'; class ShowEventPage extends StatefulWidget { + Event event; + + ShowEventPage(this.event); + @override _ShowEventPageState createState() => _ShowEventPageState(); } @@ -45,7 +49,7 @@ class _ShowEventPageState extends State { @override Widget build(BuildContext context) { - Event event = ModalRoute.of(context).settings.arguments; + Event event = widget.event; var _formatterDate = new DateFormat.yMMMMd(Localizations.localeOf(context).toString()); var _formatterTime = diff --git a/lib/redux/middlewares/calendar.middlewares.dart b/lib/redux/middlewares/calendar.middlewares.dart index b62e841..648fbf6 100644 --- a/lib/redux/middlewares/calendar.middlewares.dart +++ b/lib/redux/middlewares/calendar.middlewares.dart @@ -1,6 +1,7 @@ import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/routes.dart'; +import 'package:calendaroo/services/notification.utils.dart'; import 'package:calendaroo/services/events.repository.dart'; import 'package:calendaroo/services/navigation.service.dart'; import 'package:redux/redux.dart'; @@ -8,20 +9,20 @@ import 'package:redux/redux.dart'; class CalendarMiddleware extends MiddlewareClass { @override void call(Store store, dynamic action, NextDispatcher next) async { - if (action is AddEvent) { var id = await EventsRepository().insertEvent(action.event); action.event.setId(id); + scheduleNotification(action.event); } if (action is RemoveEvent) { EventsRepository().deleteEvent(action.event.id); + cancelNotification(action.event.id); } if (action is OpenEvent) { NavigationService().navigateTo(SHOW_EVENT, arguments: action.event); } - next(action); } } diff --git a/lib/routes.dart b/lib/routes.dart index bcd4b19..dfdfbd3 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -1,13 +1,22 @@ import 'package:calendaroo/pages/add-event/add-event.page.dart'; import 'package:calendaroo/pages/home.page.dart'; import 'package:calendaroo/pages/show-event/show-event.page.dart'; +import 'package:flutter/material.dart'; const HOMEPAGE = '/home'; const ADD_EVENT = '/add_event'; const SHOW_EVENT = '/show_event'; -final routes = { - HOMEPAGE: (context) => HomePage(), - ADD_EVENT: (context) => AddEventPage(), - SHOW_EVENT: (context) => ShowEventPage(), +MaterialPageRoute Function(RouteSettings) routes = + (RouteSettings settings) { + switch (settings.name) { + case HOMEPAGE: + return MaterialPageRoute(builder: (context) => HomePage(), settings: settings); + case ADD_EVENT: + return MaterialPageRoute(builder: (context) => AddEventPage(), settings: settings); + case SHOW_EVENT: + return MaterialPageRoute(builder: (context) => ShowEventPage(settings.arguments), settings: settings); + default: + return MaterialPageRoute(builder: (context) => HomePage(), settings: settings); + } }; diff --git a/lib/services/calendar.service.dart b/lib/services/calendar.service.dart index f068206..112b34b 100644 --- a/lib/services/calendar.service.dart +++ b/lib/services/calendar.service.dart @@ -36,7 +36,7 @@ class CalendarService { return result; } - _insertIntoStore(map, date, event) { + _insertIntoStore(SplayTreeMap> map, date, event) { if (map.containsKey(date)) { var list = map[date]; list.add(event); diff --git a/lib/services/events.repository.dart b/lib/services/events.repository.dart index 07205c8..89d191d 100644 --- a/lib/services/events.repository.dart +++ b/lib/services/events.repository.dart @@ -29,6 +29,19 @@ class EventsRepository{ return client.delete('events', where: 'id = ?', whereArgs: [id]); } + Future event(int id) async { + var client = await LocalStorageService().db; + final List> maps = await client.query('events', where: 'id = ?', whereArgs: [id]); + return Event( + id: maps[0]['id'], + title: maps[0]['title'], + uuid: maps[0]['uuid'], + description: maps[0]['description'], + start: DateTime.parse(maps[0]['start']), + end: DateTime.parse(maps[0]['end']), + ); + } + Future> events() async { final Database client = await LocalStorageService().db; diff --git a/lib/services/initializer-app.service.dart b/lib/services/initializer-app.service.dart index 0e4ad50..6c7f5c4 100644 --- a/lib/services/initializer-app.service.dart +++ b/lib/services/initializer-app.service.dart @@ -1,17 +1,42 @@ +import 'package:calendaroo/environments/environment.dart'; import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/services/events.repository.dart'; +import 'package:calendaroo/services/shared-preferences.service.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/services.dart'; +import 'notification.utils.dart'; class InitializerAppService { static final InitializerAppService _instance = InitializerAppService._(); + InitializerAppService._(); factory InitializerAppService() { return _instance; } - preLoadingData() async { + Future setUp(environment, version) async { + WidgetsFlutterBinding.ensureInitialized(); + // sharedPref init + SharedPreferenceService().getSharedPreferencesInstance(); + + // Environment init + Environment().environment = environment; + Environment().version = version; + + // loadData init + await _preLoadingDataFromDB(); + + // setup orientation + SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); + + // init Notification + initNotification(); + } + + _preLoadingDataFromDB() async { var eventsList = await EventsRepository().events(); calendarooState.dispatch(LoadedEventsList(eventsList)); } diff --git a/lib/services/notification.utils.dart b/lib/services/notification.utils.dart new file mode 100644 index 0000000..3328275 --- /dev/null +++ b/lib/services/notification.utils.dart @@ -0,0 +1,74 @@ +import 'package:calendaroo/constants.dart'; +import 'package:calendaroo/environments/environment.dart'; +import 'package:calendaroo/model/event.model.dart'; +import 'package:calendaroo/model/received-notification.dart'; +import 'package:calendaroo/redux/actions/calendar.actions.dart'; +import 'package:calendaroo/redux/states/app.state.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; +import 'package:rxdart/rxdart.dart'; + +import '../routes.dart'; +import 'events.repository.dart'; +import 'navigation.service.dart'; + +final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = + FlutterLocalNotificationsPlugin(); + +// Streams are created so that app can respond to notification-related events since the plugin is initialised in the `main` function +final BehaviorSubject didReceiveLocalNotificationSubject = + BehaviorSubject(); + +final BehaviorSubject selectNotificationSubject = + BehaviorSubject(); + +NotificationAppLaunchDetails notificationAppLaunchDetails; + +Future scheduleNotification(Event event) async { + var date; + date = DateTime.now().add(Duration(seconds: 15)); + + + var androidPlatformChannelSpecifics = AndroidNotificationDetails( + 'event_notification', 'Notifiche evento', 'Mostra le notifiche evento', + importance: Importance.Max, priority: Priority.High, ticker: 'ticker'); + var iOSPlatformChannelSpecifics = IOSNotificationDetails(); + var platformChannelSpecifics = NotificationDetails( + androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); + + await flutterLocalNotificationsPlugin.schedule( + event.id, event.title, event.description, date, platformChannelSpecifics, + androidAllowWhileIdle: true, payload: event.id.toString()); +} + +Future cancelNotification(int id) async { + await flutterLocalNotificationsPlugin.cancel(id); +} + +Future initNotification() async { + notificationAppLaunchDetails = + await flutterLocalNotificationsPlugin.getNotificationAppLaunchDetails(); + + var initializationSettingsAndroid = AndroidInitializationSettings( + 'notification_icon'); // android/app/src/main/res/drawable/notification_icon.png + var initializationSettingsIOS = IOSInitializationSettings( + requestAlertPermission: false, + requestBadgePermission: false, + requestSoundPermission: false, + onDidReceiveLocalNotification: + (int id, String title, String body, String payload) async { + didReceiveLocalNotificationSubject.add(ReceivedNotification( + id: id, title: title, body: body, payload: payload)); + }); + var initializationSettings = InitializationSettings( + initializationSettingsAndroid, initializationSettingsIOS); + await flutterLocalNotificationsPlugin.initialize(initializationSettings, + onSelectNotification: _onSelectNotification); +} + +Future _onSelectNotification(String payload) async { + if (payload != null) { + debugPrint('notification payload: ' + payload); + } + selectNotificationSubject.add(payload); +} diff --git a/pubspec.lock b/pubspec.lock index 2ec1471..c8af3e3 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -76,6 +76,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.7.5" + flutter_local_notifications: + dependency: "direct main" + description: + name: flutter_local_notifications + url: "https://pub.dartlang.org" + source: hosted + version: "1.4.3" + flutter_local_notifications_platform_interface: + dependency: transitive + description: + name: flutter_local_notifications_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" flutter_localizations: dependency: "direct main" description: flutter @@ -154,6 +168,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.0" + platform: + dependency: transitive + description: + name: platform + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" quiver: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index 4b8eb3c..0d13c84 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,6 +32,7 @@ dependencies: sqflite: ^1.3.0 path_provider: ^0.5.0+1 scroll_to_index: ^1.0.6 + flutter_local_notifications: ^1.4.3 # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. From 864516038f4b628536a5f237cc11ee8d4e34597d Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Thu, 28 May 2020 10:40:43 +0200 Subject: [PATCH 025/127] checkpoint --- lib/pages/add-event/add-event.page.dart | 75 +++++++++++++++-------- lib/pages/show-event/show-event.page.dart | 2 +- lib/redux/states/calendar.state.dart | 4 +- 3 files changed, 53 insertions(+), 28 deletions(-) diff --git a/lib/pages/add-event/add-event.page.dart b/lib/pages/add-event/add-event.page.dart index 28e9b5a..27e8bc6 100644 --- a/lib/pages/add-event/add-event.page.dart +++ b/lib/pages/add-event/add-event.page.dart @@ -32,17 +32,17 @@ class _AddEventPageState extends State { DateTime _startTime; DateTime _endTime; - @override void initState() { super.initState(); - _title = widget.event.title ?? ""; - _description = widget.event.description ??""; + _title = widget.event?.title ?? ""; + _description = widget.event?.description ?? ""; final now = DateTime.now(); - _startDate = widget.event.start ?? calendarooState.state.calendarState.selectedDay; - _startTime = widget.event.start ?? now; - _endDate = widget.event.end ?? _startDate; - _endTime = widget.event.end ?? now.add(Duration(hours: 1)); + _startDate = + widget.event?.start ?? calendarooState.state.calendarState.selectedDay; + _startTime = widget.event?.start ?? now; + _endDate = widget.event?.end ?? _startDate; + _endTime = widget.event?.end ?? now.add(Duration(hours: 1)); } @override @@ -69,9 +69,16 @@ class _AddEventPageState extends State { children: [ Row( children: [ - Text('Nuovo Evento', - textAlign: TextAlign.left, - style: Theme.of(context).textTheme.headline4), + !_isEdit() + ? Text('Nuovo Evento', + textAlign: TextAlign.left, + style: + Theme.of(context).textTheme.headline4) + : Text('Modifica Evento', + textAlign: TextAlign.left, + style: Theme.of(context) + .textTheme + .headline4), IconButton( onPressed: () { NavigationService().pop(); @@ -84,10 +91,10 @@ class _AddEventPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, ), _buildTitle(), - _buildTime(store, true, context, _formatterDate, - _formatterTime), - _buildTime(store, false, context, _formatterDate, - _formatterTime), + _buildTime( + true, context, _formatterDate, _formatterTime), + _buildTime( + false, context, _formatterDate, _formatterTime), ], ), ), @@ -115,6 +122,7 @@ class _AddEventPageState extends State { color: secondaryDarkBlue, ), title: TextFormField( + initialValue: _title, decoration: new InputDecoration( focusedBorder: UnderlineInputBorder( borderSide: BorderSide(color: secondaryDarkBlue), @@ -136,6 +144,8 @@ class _AddEventPageState extends State { .bodyText2 .copyWith(color: primaryBlack), ), + style: + Theme.of(context).textTheme.bodyText2.copyWith(fontSize: 20), validator: (value) { if (value != null && value.length > 0) { return null; @@ -165,6 +175,7 @@ class _AddEventPageState extends State { color: accentYellowText, ), title: TextFormField( + initialValue: _description, decoration: new InputDecoration( focusedBorder: UnderlineInputBorder( borderSide: BorderSide(color: secondaryDarkBlue), @@ -186,6 +197,10 @@ class _AddEventPageState extends State { .bodyText2 .copyWith(color: primaryBlack), ), + style: Theme.of(context) + .textTheme + .bodyText2 + .copyWith(fontSize: 20), onSaved: (value) { setState(() { _description = value; @@ -199,8 +214,8 @@ class _AddEventPageState extends State { ); } - Column _buildTime(AddEventViewModel store, bool start, BuildContext context, - DateFormat _formatterDate, DateFormat _formatterTime) { + Column _buildTime(bool start, BuildContext context, DateFormat _formatterDate, + DateFormat _formatterTime) { return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only( @@ -375,9 +390,10 @@ class _AddEventPageState extends State { // Validate returns true if the form is valid, otherwise false. if (_formKey.currentState.validate()) { _formKey.currentState.save(); - // If the form is valid, display a snackbar. In the real world, - // you'd often call a server or save the information in a database. - store.createEvent(_createNewEvent()); + _isEdit() + ? store.editEvent( + widget.event, _createNewEvent(widget.event.id)) + : store.createEvent(_createNewEvent(null)); NavigationService().pop(); } }, @@ -385,20 +401,25 @@ class _AddEventPageState extends State { height: 50, width: 300, child: Center( - child: Text( - 'Crea Evento', - style: Theme.of(context).textTheme.button, - ), + child: !_isEdit() + ? Text( + 'Crea Evento', + style: Theme.of(context).textTheme.button, + ) + : Text( + 'Modifica Evento', + style: Theme.of(context).textTheme.button, + ), ), ), ), ); } - Event _createNewEvent() { + Event _createNewEvent(id) { var uuid = Uuid(); return Event( - id: null, + id: id, title: _title, uuid: uuid.v4(), description: _description, @@ -407,4 +428,8 @@ class _AddEventPageState extends State { end: DateTime(_endDate.year, _endDate.month, _endDate.day, _endTime.hour, _endTime.minute)); } + + bool _isEdit() { + return widget.event != null; + } } diff --git a/lib/pages/show-event/show-event.page.dart b/lib/pages/show-event/show-event.page.dart index 61de7b8..f4dde6b 100644 --- a/lib/pages/show-event/show-event.page.dart +++ b/lib/pages/show-event/show-event.page.dart @@ -50,7 +50,7 @@ class _ShowEventPageState extends State { Icons.edit, color: primaryWhite, ), - onPressed: () => NavigationService().navigateTo(ADD_EVENT)) + onPressed: () => NavigationService().navigateTo(ADD_EVENT, arguments: event)) ], flexibleSpace: FlexibleSpaceBar( title: Text( diff --git a/lib/redux/states/calendar.state.dart b/lib/redux/states/calendar.state.dart index 09cac32..3dd2030 100644 --- a/lib/redux/states/calendar.state.dart +++ b/lib/redux/states/calendar.state.dart @@ -5,9 +5,9 @@ import 'package:flutter/cupertino.dart'; @immutable class CalendarState { - final List events; + final List events; //TODO: remove this duplicated info final SplayTreeMap> eventMapped; - final Event showEvent; + final Event showEvent; //TODO: remove this unused info final DateTime selectedDay; CalendarState( From bbb00d61a35100730790f296691bcdc350cd61f5 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Thu, 28 May 2020 11:52:28 +0200 Subject: [PATCH 026/127] bug fix and add event page --- lib/pages/add-event/add-event.page.dart | 26 ++++++-------- lib/pages/add-event/add-event.viewmodel.dart | 8 +++-- lib/pages/show-event/show-event.page.dart | 35 +++++++++++-------- .../show-event/show-event.viewmodel.dart | 2 -- .../middlewares/calendar.middlewares.dart | 4 ++- lib/redux/reducers/calendar.reducer.dart | 5 ++- lib/redux/states/calendar.state.dart | 21 ++++++++--- lib/routes.dart | 4 +-- lib/services/shared-preferences.service.dart | 7 ++-- lib/widgets/calendar/calendar.widget.dart | 16 +++------ 10 files changed, 69 insertions(+), 59 deletions(-) diff --git a/lib/pages/add-event/add-event.page.dart b/lib/pages/add-event/add-event.page.dart index 27e8bc6..f0acd8f 100644 --- a/lib/pages/add-event/add-event.page.dart +++ b/lib/pages/add-event/add-event.page.dart @@ -14,10 +14,6 @@ import 'package:uuid/uuid.dart'; import 'add-event.viewmodel.dart'; class AddEventPage extends StatefulWidget { - final Event event; - - AddEventPage(this.event); - @override _AddEventPageState createState() => _AddEventPageState(); } @@ -32,17 +28,20 @@ class _AddEventPageState extends State { DateTime _startTime; DateTime _endTime; + Event showEvent; + @override void initState() { super.initState(); - _title = widget.event?.title ?? ""; - _description = widget.event?.description ?? ""; + showEvent = calendarooState.state.calendarState.showEvent; + _title = showEvent?.title ?? ""; + _description = showEvent?.description ?? ""; final now = DateTime.now(); _startDate = - widget.event?.start ?? calendarooState.state.calendarState.selectedDay; - _startTime = widget.event?.start ?? now; - _endDate = widget.event?.end ?? _startDate; - _endTime = widget.event?.end ?? now.add(Duration(hours: 1)); + showEvent?.start ?? calendarooState.state.calendarState.selectedDay; + _startTime = showEvent?.start ?? now; + _endDate = showEvent?.end ?? _startDate; + _endTime = showEvent?.end ?? now.add(Duration(hours: 1)); } @override @@ -306,8 +305,6 @@ class _AddEventPageState extends State { children: [ Container( height: 250, -// child: CupertinoTheme( -// data: cupertinoTheme.copyWith(textTheme: textTheme), child: CupertinoDatePicker( initialDateTime: start ? _startDate : _endDate, minimumDate: start ? null : _startDate, @@ -316,7 +313,6 @@ class _AddEventPageState extends State { _current = value; }, ), -// ), ), Row( mainAxisAlignment: MainAxisAlignment.center, @@ -392,7 +388,7 @@ class _AddEventPageState extends State { _formKey.currentState.save(); _isEdit() ? store.editEvent( - widget.event, _createNewEvent(widget.event.id)) + showEvent, _createNewEvent(showEvent.id)) : store.createEvent(_createNewEvent(null)); NavigationService().pop(); } @@ -430,6 +426,6 @@ class _AddEventPageState extends State { } bool _isEdit() { - return widget.event != null; + return showEvent != null; } } diff --git a/lib/pages/add-event/add-event.viewmodel.dart b/lib/pages/add-event/add-event.viewmodel.dart index 5be81fa..da44443 100644 --- a/lib/pages/add-event/add-event.viewmodel.dart +++ b/lib/pages/add-event/add-event.viewmodel.dart @@ -5,17 +5,21 @@ import 'package:redux/redux.dart'; class AddEventViewModel { final DateTime selectedDay; + final Event showEvent; final Function(Event) createEvent; final Function(Event, Event) editEvent; - AddEventViewModel({this.selectedDay, this.createEvent, this.editEvent}); + AddEventViewModel( + {this.selectedDay, this.showEvent, this.createEvent, this.editEvent}); static AddEventViewModel fromStore(Store store) { return AddEventViewModel( selectedDay: store.state.calendarState.selectedDay, + showEvent: store.state.calendarState.showEvent, createEvent: (newEvent) => store.dispatch(new AddEvent(newEvent)), - editEvent: (oldEvent, newEvent) => store.dispatch(new EditEvent(oldEvent, newEvent)), + editEvent: (oldEvent, newEvent) => + store.dispatch(new EditEvent(oldEvent, newEvent)), ); } } diff --git a/lib/pages/show-event/show-event.page.dart b/lib/pages/show-event/show-event.page.dart index f4dde6b..03b93ad 100644 --- a/lib/pages/show-event/show-event.page.dart +++ b/lib/pages/show-event/show-event.page.dart @@ -1,6 +1,7 @@ import 'package:calendaroo/colors.dart'; import 'package:calendaroo/model/event.model.dart'; import 'package:calendaroo/pages/show-event/show-event.viewmodel.dart'; +import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/routes.dart'; import 'package:calendaroo/services/navigation.service.dart'; @@ -12,28 +13,30 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:intl/intl.dart'; class ShowEventPage extends StatefulWidget { - final Event event; - - ShowEventPage(this.event); - @override _ShowEventPageState createState() => _ShowEventPageState(); } class _ShowEventPageState extends State { + + @override + void dispose(){ + calendarooState.dispatch(OpenEvent(null)); + super.dispose(); + } + @override Widget build(BuildContext context) { - Event event = widget.event; return Scaffold( body: StoreConnector( converter: (store) => ShowEventViewModel.fromStore(store), builder: (context, store) { - return _buildPage(store, event); + return _buildPage(store); }), ); } - Widget _buildPage(ShowEventViewModel store, Event event) { + Widget _buildPage(ShowEventViewModel store) { return CustomScrollView(slivers: [ SliverAppBar( expandedHeight: 200, @@ -50,11 +53,12 @@ class _ShowEventPageState extends State { Icons.edit, color: primaryWhite, ), - onPressed: () => NavigationService().navigateTo(ADD_EVENT, arguments: event)) + onPressed: () => NavigationService() + .navigateTo(ADD_EVENT, arguments: store.showEvent)) ], flexibleSpace: FlexibleSpaceBar( title: Text( - event.title, + store.showEvent.title, style: Theme.of(context) .textTheme .headline6 @@ -64,24 +68,25 @@ class _ShowEventPageState extends State { backgroundColor: secondaryBlue, ), SliverFillRemaining( - child: _buildInfoEvent(store, event), + child: _buildInfoEvent(store), ) ]); } - Widget _buildInfoEvent(ShowEventViewModel store, Event event) { + Widget _buildInfoEvent(ShowEventViewModel store) { return Padding( padding: const EdgeInsets.all(16.0), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - event.description != null && event.description.length > 0 - ? _buildDescription(event) + store.showEvent.description != null && + store.showEvent.description.length > 0 + ? _buildDescription(store.showEvent) : SizedBox( height: 0, ), - _buildTime(event, start: true), - _buildTime(event, start: false), + _buildTime(store.showEvent, start: true), + _buildTime(store.showEvent, start: false), ], ), ); diff --git a/lib/pages/show-event/show-event.viewmodel.dart b/lib/pages/show-event/show-event.viewmodel.dart index 0fa2fc5..74519ac 100644 --- a/lib/pages/show-event/show-event.viewmodel.dart +++ b/lib/pages/show-event/show-event.viewmodel.dart @@ -1,12 +1,10 @@ import 'package:calendaroo/model/event.model.dart'; -import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:redux/redux.dart'; class ShowEventViewModel { final Event showEvent; - ShowEventViewModel({this.showEvent}); static ShowEventViewModel fromStore(Store store) { diff --git a/lib/redux/middlewares/calendar.middlewares.dart b/lib/redux/middlewares/calendar.middlewares.dart index ef5c50a..9e66cfb 100644 --- a/lib/redux/middlewares/calendar.middlewares.dart +++ b/lib/redux/middlewares/calendar.middlewares.dart @@ -20,7 +20,9 @@ class CalendarMiddleware extends MiddlewareClass { } if (action is OpenEvent) { - NavigationService().navigateTo(SHOW_EVENT, arguments: action.event); + if (action.event != null) { + NavigationService().navigateTo(SHOW_EVENT, arguments: action.event); + } } next(action); diff --git a/lib/redux/reducers/calendar.reducer.dart b/lib/redux/reducers/calendar.reducer.dart index 3376cba..88b2c75 100644 --- a/lib/redux/reducers/calendar.reducer.dart +++ b/lib/redux/reducers/calendar.reducer.dart @@ -25,16 +25,15 @@ CalendarState _editEvent(CalendarState state, EditEvent action) { final indexList = state.events.indexWhere((element) => element.id == action.oldEvent.id); state.events[indexList] = action.newEvent; - return state; + return state.copyWith(showEvent: action.newEvent); } CalendarState _openEvent(CalendarState state, OpenEvent action) { - return state.copyWith(showEvent: action.event); + return state.copyWithAdmitNull(action.event); } CalendarState _selectDay(CalendarState state, SelectDay action) { return state.copyWith(selectedDay: CalendarService().removeTime(action.day)); - } CalendarState _removeEvent(CalendarState state, RemoveEvent action) { diff --git a/lib/redux/states/calendar.state.dart b/lib/redux/states/calendar.state.dart index 3dd2030..e6de55d 100644 --- a/lib/redux/states/calendar.state.dart +++ b/lib/redux/states/calendar.state.dart @@ -7,7 +7,7 @@ import 'package:flutter/cupertino.dart'; class CalendarState { final List events; //TODO: remove this duplicated info final SplayTreeMap> eventMapped; - final Event showEvent; //TODO: remove this unused info + final Event showEvent; final DateTime selectedDay; CalendarState( @@ -17,10 +17,11 @@ class CalendarState { return CalendarState(events: List(), eventMapped: SplayTreeMap()); } - CalendarState copyWith({List events, - SplayTreeMap> eventMapped, - DateTime selectedDay, - Event showEvent}) { + CalendarState copyWith( + {List events, + SplayTreeMap> eventMapped, + DateTime selectedDay, + Event showEvent}) { return CalendarState( events: events ?? this.events, eventMapped: eventMapped ?? this.eventMapped, @@ -28,4 +29,14 @@ class CalendarState { selectedDay: selectedDay ?? this.selectedDay, ); } + + // TODO: there is a better solution? + CalendarState copyWithAdmitNull(Event showEvent) { + return CalendarState( + events: this.events, + eventMapped: this.eventMapped, + showEvent: showEvent, + selectedDay: this.selectedDay, + ); + } } diff --git a/lib/routes.dart b/lib/routes.dart index 6850d4e..b362f7d 100644 --- a/lib/routes.dart +++ b/lib/routes.dart @@ -13,9 +13,9 @@ MaterialPageRoute Function(RouteSettings) routes = case HOMEPAGE: return MaterialPageRoute(builder: (context) => HomePage(), settings: settings); case ADD_EVENT: - return MaterialPageRoute(builder: (context) => AddEventPage(settings.arguments), settings: settings); + return MaterialPageRoute(builder: (context) => AddEventPage(), settings: settings); case SHOW_EVENT: - return MaterialPageRoute(builder: (context) => ShowEventPage(settings.arguments), settings: settings); + return MaterialPageRoute(builder: (context) => ShowEventPage(), settings: settings); default: return MaterialPageRoute(builder: (context) => HomePage(), settings: settings); } diff --git a/lib/services/shared-preferences.service.dart b/lib/services/shared-preferences.service.dart index 70ac33d..06ac4a5 100644 --- a/lib/services/shared-preferences.service.dart +++ b/lib/services/shared-preferences.service.dart @@ -32,16 +32,19 @@ class SharedPreferenceService { await _prefs.clear(); } - CalendarFormat get calendarFormat { var format = _prefs.getString('calendarFormat'); if (format == null || format == 'month') { return CalendarFormat.month; } else { - return CalendarFormat.week; + return CalendarFormat.twoWeeks; } } + void setCalendarFormat(String value) { + _prefs.setString('calendarFormat', value); + } + factory SharedPreferenceService() { return _instance; } diff --git a/lib/widgets/calendar/calendar.widget.dart b/lib/widgets/calendar/calendar.widget.dart index 038b147..9149704 100644 --- a/lib/widgets/calendar/calendar.widget.dart +++ b/lib/widgets/calendar/calendar.widget.dart @@ -15,13 +15,11 @@ class CalendarWidget extends StatefulWidget { _CalendarWidgetState createState() => _CalendarWidgetState(); } - class _CalendarWidgetState extends State with TickerProviderStateMixin { AnimationController _animationController; CalendarController _calendarController; - @override void initState() { super.initState(); @@ -52,26 +50,20 @@ class _CalendarWidgetState extends State } void _onDaySelected(CalendarViewModel store, DateTime day, List events) { - print('CALLBACK: _onDaySelected'); store.selectDay(day); } void _onVisibleDaysChanged( DateTime first, DateTime last, CalendarFormat format) { - print('CALLBACK: _onVisibleDaysChanged'); - if (last.difference(first) == Duration(days: 6)) { - SharedPreferenceService().setString( - 'calendarFormat', 'week'); - } - else{ - SharedPreferenceService().setString( - 'calendarFormat', 'month'); + if (format == CalendarFormat.month) { + SharedPreferenceService().setCalendarFormat('month'); + } else { + SharedPreferenceService().setCalendarFormat('week'); } } void _onCalendarCreated(CalendarViewModel store, DateTime first, DateTime last, CalendarFormat format) { - print('CALLBACK: _onCalendarCreated'); store.selectDay(DateTime.now()); } From 3d31f4cf378717226d8050224c4567574de60a41 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Thu, 28 May 2020 11:58:17 +0200 Subject: [PATCH 027/127] fix notification --- lib/services/notification.utils.dart | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/services/notification.utils.dart b/lib/services/notification.utils.dart index f85b219..090d9df 100644 --- a/lib/services/notification.utils.dart +++ b/lib/services/notification.utils.dart @@ -17,9 +17,6 @@ final BehaviorSubject selectNotificationSubject = NotificationAppLaunchDetails notificationAppLaunchDetails; Future scheduleNotification(Event event) async { - var date; - date = DateTime.now().add(Duration(seconds: 15)); - var androidPlatformChannelSpecifics = AndroidNotificationDetails( 'event_notification', 'Notifiche evento', 'Mostra le notifiche evento', importance: Importance.Max, priority: Priority.High, ticker: 'ticker'); @@ -28,7 +25,7 @@ Future scheduleNotification(Event event) async { androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); await flutterLocalNotificationsPlugin.schedule( - event.id, event.title, event.description, date, platformChannelSpecifics, + event.id, event.title, event.description, event.start, platformChannelSpecifics, androidAllowWhileIdle: true, payload: event.id.toString()); } From 611deb283d85296f040e7a66932d98d83b4ab984 Mon Sep 17 00:00:00 2001 From: JavannaF Date: Thu, 28 May 2020 22:09:48 +0200 Subject: [PATCH 028/127] #4 translate labels --- assets/langs/en.json | 22 ++++++++++---- assets/langs/it.json | 20 +++++++++---- lib/constants.dart | 1 + lib/pages/add-event/add-event.page.dart | 12 ++++---- lib/pages/home.page.dart | 6 ++-- lib/pages/show-event/show-event.page.dart | 7 +++-- lib/services/app-localizations.service.dart | 30 +++++++++++++++++++ lib/services/shared-preferences.service.dart | 2 +- lib/widgets/calendar/calendar.widget.dart | 17 ++++++++--- .../upcoming-events.widget.dart | 8 +++-- 10 files changed, 96 insertions(+), 29 deletions(-) diff --git a/assets/langs/en.json b/assets/langs/en.json index cea37fa..770400b 100644 --- a/assets/langs/en.json +++ b/assets/langs/en.json @@ -1,11 +1,21 @@ { + "add_event": "Add Event", "appName": "Calendaroo", + "compact" : "Compact", + "description": "Description", + "event_end": "End", + "event_start": "Start", + "event" : "Event", + "expanded" : "Expanded", "home": "Home", - "todo": "Todo", - "today": "Today", - "profile": "Profile", - "upcoming-events": "Upcoming", - "new-event": "New Event", "new-event-title": "Create New Event", - "start": "start" + "new-event": "New Event", + "no_events": "No planned events", + "profile": "Profile", + "start": "start", + "title": "Title", + "today": "Today", + "todo": "Todo" + + } \ No newline at end of file diff --git a/assets/langs/it.json b/assets/langs/it.json index 270462b..086c847 100644 --- a/assets/langs/it.json +++ b/assets/langs/it.json @@ -1,10 +1,20 @@ { + "add_event": "Nuovo Evento", "appName": "Calendaroo", + "compact" : "Compatto", + "description": "Descrizione", + "expanded" : "Espanso", + "event" : "Evento", + "event_end": "Fine Evento", + "event_start": "Inizio Evento", "home": "Home", - "todo": "Todo", - "today": "Oggi", - "profile": "Profilo", "new-event": "Nuovo Evento", - "new-event-title": "Crea Nuovo Evento", - "start": "start" + "new-event-title": "Crea Evento", + "no_events": "Non ci sono eventi in programma", + "profile": "Profilo", + "start": "start", + "title": "Titolo", + "today": "Oggi", + "todo": "Todo" + } \ No newline at end of file diff --git a/lib/constants.dart b/lib/constants.dart index 2acd113..753a802 100644 --- a/lib/constants.dart +++ b/lib/constants.dart @@ -11,6 +11,7 @@ class Texts { static const String PROFILE = "profile"; static const String UPCOMING_EVENTS = "upcoming-events"; static const String START = "start"; + } // Example holidays diff --git a/lib/pages/add-event/add-event.page.dart b/lib/pages/add-event/add-event.page.dart index 7db2732..8bae90a 100644 --- a/lib/pages/add-event/add-event.page.dart +++ b/lib/pages/add-event/add-event.page.dart @@ -1,6 +1,7 @@ import 'package:calendaroo/colors.dart'; import 'package:calendaroo/model/event.model.dart'; import 'package:calendaroo/redux/states/app.state.dart'; +import 'package:calendaroo/services/app-localizations.service.dart'; import 'package:calendaroo/services/navigation.service.dart'; import 'package:calendaroo/theme.dart'; import 'package:flutter/cupertino.dart'; @@ -65,7 +66,8 @@ class _AddEventPageState extends State { children: [ Row( children: [ - Text('Nuovo Evento', + Text(AppLocalizations.of(context).newEvent, + textAlign: TextAlign.left, style: Theme.of(context).textTheme.headline4), IconButton( @@ -126,7 +128,7 @@ class _AddEventPageState extends State { ), contentPadding: EdgeInsets.only(left: 15, bottom: 11, top: 11, right: 15), - labelText: 'Titolo', + labelText: AppLocalizations.of(context).title, labelStyle: Theme.of(context) .textTheme .bodyText2 @@ -176,7 +178,7 @@ class _AddEventPageState extends State { ), contentPadding: EdgeInsets.only(left: 15, bottom: 11, top: 11, right: 15), - labelText: 'Descrizione', + labelText: AppLocalizations.of(context).description, labelStyle: Theme.of(context) .textTheme .bodyText2 @@ -203,7 +205,7 @@ class _AddEventPageState extends State { top: 8.0, ), child: Text( - start ? 'Inizio Evento' : 'Fine Evento', + start ? AppLocalizations.of(context).eventStart : AppLocalizations.of(context).eventEnd, style: Theme.of(context).textTheme.subtitle2, ), ), @@ -382,7 +384,7 @@ class _AddEventPageState extends State { width: 300, child: Center( child: Text( - 'Crea Evento', + AppLocalizations.of(context).newEventTitle, style: Theme.of(context).textTheme.button, ), ), diff --git a/lib/pages/home.page.dart b/lib/pages/home.page.dart index 105ed2a..3cc362b 100644 --- a/lib/pages/home.page.dart +++ b/lib/pages/home.page.dart @@ -34,13 +34,13 @@ class _HomePageState extends State with TickerProviderStateMixin { child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ - _buildBottomIcon(Icons.add, "Add Event", + _buildBottomIcon(Icons.add, AppLocalizations.of(context).addEvent, () => NavigationService().navigateTo(ADD_EVENT)), _buildBottomIcon( Icons.today, - AppLocalizations.of(context).translate('today'), + AppLocalizations.of(context).today, () => calendarooState.dispatch(SelectDay(DateTime.now()))), - _buildBottomIcon(Icons.account_circle, "Account", () {}), + _buildBottomIcon(Icons.account_circle, AppLocalizations.of(context).profile, () {}), ]), ), ); diff --git a/lib/pages/show-event/show-event.page.dart b/lib/pages/show-event/show-event.page.dart index 921f2f6..701ebd5 100644 --- a/lib/pages/show-event/show-event.page.dart +++ b/lib/pages/show-event/show-event.page.dart @@ -2,6 +2,7 @@ import 'package:calendaroo/colors.dart'; import 'package:calendaroo/model/event.model.dart'; import 'package:calendaroo/pages/show-event/show-event.viewmodel.dart'; import 'package:calendaroo/redux/states/app.state.dart'; +import 'package:calendaroo/services/app-localizations.service.dart'; import 'package:calendaroo/services/navigation.service.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -68,7 +69,7 @@ class _ShowEventPageState extends State { children: [ Row( children: [ - Text('Evento', + Text(AppLocalizations.of(context).event, textAlign: TextAlign.left, style: Theme.of(context).textTheme.headline4), Row( @@ -103,7 +104,7 @@ class _ShowEventPageState extends State { top: 8.0, ), child: Text( - 'Inizio Evento', + AppLocalizations.of(context).eventStart, style: Theme.of(context).textTheme.subtitle2, ), ), @@ -114,7 +115,7 @@ class _ShowEventPageState extends State { top: 8.0, ), child: Text( - 'Fine Evento', + AppLocalizations.of(context).eventEnd, style: Theme.of(context).textTheme.subtitle2, ), ), diff --git a/lib/services/app-localizations.service.dart b/lib/services/app-localizations.service.dart index 90c4c81..11615a8 100644 --- a/lib/services/app-localizations.service.dart +++ b/lib/services/app-localizations.service.dart @@ -41,6 +41,36 @@ class AppLocalizations { String get newEventTitle => _localizedStrings['new-event-title']; String get newEvent => _localizedStrings['new-event']; + String get addEvent=> _localizedStrings['add_event']; + + String get appName=> _localizedStrings['appName']; + + String get compact=> _localizedStrings['compact']; + + String get description=> _localizedStrings['description']; + + String get expanded=> _localizedStrings['expanded']; + + String get event=> _localizedStrings['event']; + + String get eventEnd=> _localizedStrings['event_end']; + + String get eventStart=> _localizedStrings['event_start']; + + String get home=> _localizedStrings['home']; + + String get noEvents=> _localizedStrings['no_events']; + + String get profile=> _localizedStrings['profile']; + + String get start=> _localizedStrings['start']; + + String get title=> _localizedStrings['title']; + + String get today=> _localizedStrings['today']; + + String get todo=> _localizedStrings['todo']; + } diff --git a/lib/services/shared-preferences.service.dart b/lib/services/shared-preferences.service.dart index 70ac33d..72ae5ae 100644 --- a/lib/services/shared-preferences.service.dart +++ b/lib/services/shared-preferences.service.dart @@ -38,7 +38,7 @@ class SharedPreferenceService { if (format == null || format == 'month') { return CalendarFormat.month; } else { - return CalendarFormat.week; + return CalendarFormat.twoWeeks; } } diff --git a/lib/widgets/calendar/calendar.widget.dart b/lib/widgets/calendar/calendar.widget.dart index 038b147..b0bbcc3 100644 --- a/lib/widgets/calendar/calendar.widget.dart +++ b/lib/widgets/calendar/calendar.widget.dart @@ -1,5 +1,6 @@ import 'package:calendaroo/colors.dart'; import 'package:calendaroo/redux/states/app.state.dart'; +import 'package:calendaroo/services/app-localizations.service.dart'; import 'package:calendaroo/services/shared-preferences.service.dart'; import 'package:calendaroo/widgets/calendar/calendar.viewmodel.dart'; import 'package:calendaroo/widgets/upcoming-events/upcoming-events.widget.dart'; @@ -59,6 +60,7 @@ class _CalendarWidgetState extends State void _onVisibleDaysChanged( DateTime first, DateTime last, CalendarFormat format) { print('CALLBACK: _onVisibleDaysChanged'); + if (last.difference(first) == Duration(days: 6)) { SharedPreferenceService().setString( 'calendarFormat', 'week'); @@ -99,7 +101,12 @@ class _CalendarWidgetState extends State // More advanced TableCalendar configuration (using Builders & Styles) Widget _buildTableCalendarWithBuilders(CalendarViewModel store) { + var locale = Localizations.localeOf(context); + + + + return TableCalendar( calendarController: _calendarController, events: store.eventMapped, @@ -109,10 +116,12 @@ class _CalendarWidgetState extends State formatAnimation: FormatAnimation.scale, // startingDayOfWeek: StartingDayOfWeek.monday, availableGestures: AvailableGestures.all, - availableCalendarFormats: const { - CalendarFormat.month: 'Compatto', - CalendarFormat.twoWeeks: 'Espanso', - }, + + availableCalendarFormats: { + CalendarFormat.month: AppLocalizations.of(context).compact, + CalendarFormat.twoWeeks: AppLocalizations.of(context).expanded + } + , locale: locale.toString(), calendarStyle: CalendarStyle( outsideDaysVisible: true, diff --git a/lib/widgets/upcoming-events/upcoming-events.widget.dart b/lib/widgets/upcoming-events/upcoming-events.widget.dart index b6f3828..43ba58b 100644 --- a/lib/widgets/upcoming-events/upcoming-events.widget.dart +++ b/lib/widgets/upcoming-events/upcoming-events.widget.dart @@ -1,5 +1,6 @@ import 'package:calendaroo/colors.dart'; import 'package:calendaroo/redux/actions/calendar.actions.dart'; +import 'package:calendaroo/services/app-localizations.service.dart'; import 'package:calendaroo/redux/states/app.state.dart'; import 'package:calendaroo/services/calendar.service.dart'; import 'package:calendaroo/widgets/upcoming-events/upcoming-events.viewmodel.dart'; @@ -20,6 +21,7 @@ class _UpcomingEventsWidgetState extends State AutoScrollController _listController; AnimationController _animationController; + @override void initState() { super.initState(); @@ -194,8 +196,10 @@ class _UpcomingEventsWidgetState extends State child: Center( child: Column( children: [ - Text('Non ci sono eventi in programma', - style: Theme.of(context).textTheme.subtitle2), + Text( + "No planned events", + style: Theme.of(context).textTheme.subtitle2, + ), Container( margin: EdgeInsets.only(top: 32), child: Icon( From 2cfa09238897d31393c7f9a5b70f07dd96770b78 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Fri, 29 May 2020 10:31:14 +0200 Subject: [PATCH 029/127] close #4 --- assets/langs/en.json | 5 ++++ assets/langs/it.json | 5 ++++ lib/pages/add-event/add-event.page.dart | 19 ++++++------- lib/pages/show-event/show-event.page.dart | 1 - lib/services/app-localizations.service.dart | 27 +++++++------------ .../upcoming-events.widget.dart | 2 +- 6 files changed, 31 insertions(+), 28 deletions(-) diff --git a/assets/langs/en.json b/assets/langs/en.json index 770400b..325da28 100644 --- a/assets/langs/en.json +++ b/assets/langs/en.json @@ -2,16 +2,21 @@ "add_event": "Add Event", "appName": "Calendaroo", "compact" : "Compact", + "cancel" : "Cancel", "description": "Description", + "edit_event": "Edit Event", "event_end": "End", "event_start": "Start", "event" : "Event", "expanded" : "Expanded", "home": "Home", + "insert_a_title": "Insert a tile", "new-event-title": "Create New Event", "new-event": "New Event", "no_events": "No planned events", + "ok": "Ok", "profile": "Profile", + "save": "Save", "start": "start", "title": "Title", "today": "Today", diff --git a/assets/langs/it.json b/assets/langs/it.json index 086c847..b05616a 100644 --- a/assets/langs/it.json +++ b/assets/langs/it.json @@ -2,16 +2,21 @@ "add_event": "Nuovo Evento", "appName": "Calendaroo", "compact" : "Compatto", + "cancel": "Cancella", "description": "Descrizione", + "edit_event": "Modifica Evento", "expanded" : "Espanso", "event" : "Evento", "event_end": "Fine Evento", "event_start": "Inizio Evento", "home": "Home", + "insert_a_title": "Inserisci un titolo", "new-event": "Nuovo Evento", "new-event-title": "Crea Evento", "no_events": "Non ci sono eventi in programma", + "ok": "Ok", "profile": "Profilo", + "save": "Salva", "start": "start", "title": "Titolo", "today": "Oggi", diff --git a/lib/pages/add-event/add-event.page.dart b/lib/pages/add-event/add-event.page.dart index 6bb6357..401b083 100644 --- a/lib/pages/add-event/add-event.page.dart +++ b/lib/pages/add-event/add-event.page.dart @@ -74,7 +74,7 @@ class _AddEventPageState extends State { textAlign: TextAlign.left, style: Theme.of(context).textTheme.headline4) - : Text('Modifica Evento', // TODO translate + : Text(AppLocalizations.of(context).editEvent, textAlign: TextAlign.left, style: Theme.of(context) .textTheme @@ -150,7 +150,7 @@ class _AddEventPageState extends State { if (value != null && value.length > 0) { return null; } - return 'Inserisci un titolo'; + return AppLocalizations.of(context).insertATitle; }, onSaved: (value) { setState(() { @@ -222,7 +222,9 @@ class _AddEventPageState extends State { top: 8.0, ), child: Text( - start ? AppLocalizations.of(context).eventStart : AppLocalizations.of(context).eventEnd, + start + ? AppLocalizations.of(context).eventStart + : AppLocalizations.of(context).eventEnd, style: Theme.of(context).textTheme.subtitle2, ), ), @@ -328,7 +330,7 @@ class _AddEventPageState extends State { ), child: Padding( padding: const EdgeInsets.all(16.0), - child: Text('Cancel'), + child: Text(AppLocalizations.of(context).cancel), ), onPressed: () { Navigator.pop(context); @@ -345,7 +347,7 @@ class _AddEventPageState extends State { ), child: Padding( padding: const EdgeInsets.all(16.0), - child: Text('Save'), + child: Text(AppLocalizations.of(context).save), ), color: AppTheme.primaryTheme.buttonColor, textColor: AppTheme.primaryTheme.textTheme.button.color, @@ -388,8 +390,7 @@ class _AddEventPageState extends State { if (_formKey.currentState.validate()) { _formKey.currentState.save(); _isEdit() - ? store.editEvent( - showEvent, _createNewEvent(showEvent.id)) + ? store.editEvent(showEvent, _createNewEvent(showEvent.id)) : store.createEvent(_createNewEvent(null)); NavigationService().pop(); } @@ -400,11 +401,11 @@ class _AddEventPageState extends State { child: Center( child: !_isEdit() ? Text( - AppLocalizations.of(context).newEventTitle, + AppLocalizations.of(context).newEventTitle, style: Theme.of(context).textTheme.button, ) : Text( - 'Modifica Evento', + AppLocalizations.of(context).editEvent, style: Theme.of(context).textTheme.button, ), ), diff --git a/lib/pages/show-event/show-event.page.dart b/lib/pages/show-event/show-event.page.dart index 1378ca5..03b93ad 100644 --- a/lib/pages/show-event/show-event.page.dart +++ b/lib/pages/show-event/show-event.page.dart @@ -3,7 +3,6 @@ import 'package:calendaroo/model/event.model.dart'; import 'package:calendaroo/pages/show-event/show-event.viewmodel.dart'; import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; -import 'package:calendaroo/services/app-localizations.service.dart'; import 'package:calendaroo/routes.dart'; import 'package:calendaroo/services/navigation.service.dart'; import 'package:flutter/cupertino.dart'; diff --git a/lib/services/app-localizations.service.dart b/lib/services/app-localizations.service.dart index 11615a8..3dd7c2f 100644 --- a/lib/services/app-localizations.service.dart +++ b/lib/services/app-localizations.service.dart @@ -10,6 +10,8 @@ class AppLocalizations { AppLocalizations(this.locale); + + // Helper method to keep the code in the widgets concise // Localizations are accessed using an InheritedWidget "of" syntax static AppLocalizations of(BuildContext context) { @@ -39,36 +41,27 @@ class AppLocalizations { return _localizedStrings[key]; } - String get newEventTitle => _localizedStrings['new-event-title']; - String get newEvent => _localizedStrings['new-event']; String get addEvent=> _localizedStrings['add_event']; - String get appName=> _localizedStrings['appName']; - + String get cancel => _localizedStrings['cancel']; String get compact=> _localizedStrings['compact']; - String get description=> _localizedStrings['description']; - - String get expanded=> _localizedStrings['expanded']; - + String get editEvent => _localizedStrings['editEvent']; String get event=> _localizedStrings['event']; - String get eventEnd=> _localizedStrings['event_end']; - String get eventStart=> _localizedStrings['event_start']; - + String get expanded=> _localizedStrings['expanded']; String get home=> _localizedStrings['home']; - + String get insertATitle=> _localizedStrings['insert_a_title']; + String get newEvent => _localizedStrings['new-event']; + String get newEventTitle => _localizedStrings['new-event-title']; String get noEvents=> _localizedStrings['no_events']; - + String get ok=> _localizedStrings['Ok']; String get profile=> _localizedStrings['profile']; - + String get save=> _localizedStrings['save']; String get start=> _localizedStrings['start']; - String get title=> _localizedStrings['title']; - String get today=> _localizedStrings['today']; - String get todo=> _localizedStrings['todo']; diff --git a/lib/widgets/upcoming-events/upcoming-events.widget.dart b/lib/widgets/upcoming-events/upcoming-events.widget.dart index 43ba58b..22f5838 100644 --- a/lib/widgets/upcoming-events/upcoming-events.widget.dart +++ b/lib/widgets/upcoming-events/upcoming-events.widget.dart @@ -197,7 +197,7 @@ class _UpcomingEventsWidgetState extends State child: Column( children: [ Text( - "No planned events", + AppLocalizations.of(context).noEvents, style: Theme.of(context).textTheme.subtitle2, ), Container( From 822dcd5f7f9dd6be4586a31b6f70ab21a38f94ca Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Fri, 29 May 2020 10:38:54 +0200 Subject: [PATCH 030/127] gitignore --- android/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/android/.gitignore b/android/.gitignore index bc2100d..5a104bd 100644 --- a/android/.gitignore +++ b/android/.gitignore @@ -5,3 +5,4 @@ gradle-wrapper.jar /gradlew.bat /local.properties GeneratedPluginRegistrant.java +secret/ \ No newline at end of file From 6f9497a13fe285970362ce6deda59bfbba009e18 Mon Sep 17 00:00:00 2001 From: Jacopo Carlini Date: Fri, 29 May 2020 16:19:13 +0200 Subject: [PATCH 031/127] time picker --- assets/langs/en.json | 3 +- assets/langs/it.json | 5 +- lib/pages/add-event/add-event.page.dart | 122 ++++-- lib/services/app-localizations.service.dart | 2 + lib/widgets/options.widget.dart | 3 +- .../upcoming-events.widget.dart | 2 +- pubspec.lock | 374 ------------------ 7 files changed, 108 insertions(+), 403 deletions(-) delete mode 100644 pubspec.lock diff --git a/assets/langs/en.json b/assets/langs/en.json index 325da28..eb59454 100644 --- a/assets/langs/en.json +++ b/assets/langs/en.json @@ -3,6 +3,7 @@ "appName": "Calendaroo", "compact" : "Compact", "cancel" : "Cancel", + "delete": "Delete", "description": "Description", "edit_event": "Edit Event", "event_end": "End", @@ -17,7 +18,7 @@ "ok": "Ok", "profile": "Profile", "save": "Save", - "start": "start", + "start": "Start", "title": "Title", "today": "Today", "todo": "Todo" diff --git a/assets/langs/it.json b/assets/langs/it.json index b05616a..9e2a245 100644 --- a/assets/langs/it.json +++ b/assets/langs/it.json @@ -1,8 +1,9 @@ { - "add_event": "Nuovo Evento", + "add_event": "Aggiungi", "appName": "Calendaroo", "compact" : "Compatto", "cancel": "Cancella", + "delete": "Elimina", "description": "Descrizione", "edit_event": "Modifica Evento", "expanded" : "Espanso", @@ -17,7 +18,7 @@ "ok": "Ok", "profile": "Profilo", "save": "Salva", - "start": "start", + "start": "Inizio", "title": "Titolo", "today": "Oggi", "todo": "Todo" diff --git a/lib/pages/add-event/add-event.page.dart b/lib/pages/add-event/add-event.page.dart index 401b083..6218df3 100644 --- a/lib/pages/add-event/add-event.page.dart +++ b/lib/pages/add-event/add-event.page.dart @@ -8,7 +8,6 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_redux/flutter_redux.dart'; -import 'package:flutter_rounded_date_picker/rounded_picker.dart'; import 'package:intl/intl.dart'; import 'package:uuid/uuid.dart'; @@ -38,11 +37,15 @@ class _AddEventPageState extends State { _title = showEvent?.title ?? ""; _description = showEvent?.description ?? ""; final now = DateTime.now(); + var defaultTime = now; + if (calendarooState.state.calendarState.selectedDay.isAfter(now)) { + defaultTime = DateTime(now.year, now.month, now.day, 8, 0, 0); + } _startDate = showEvent?.start ?? calendarooState.state.calendarState.selectedDay; - _startTime = showEvent?.start ?? now; + _startTime = showEvent?.start ?? defaultTime; _endDate = showEvent?.end ?? _startDate; - _endTime = showEvent?.end ?? now.add(Duration(hours: 1)); + _endTime = showEvent?.end ?? defaultTime.add(Duration(hours: 1)); } @override @@ -252,27 +255,10 @@ class _AddEventPageState extends State { width: 8, ), GestureDetector( - onTap: () => CupertinoRoundedDatePicker.show( - context, - locale: Localizations.localeOf(context), - initialDate: start ? _startTime : _endTime, - minimumYear: 1700, - maximumYear: 3000, - minimumDate: start - ? DateTime.now().subtract(Duration(days: 7)) - : DateTime.now().subtract(Duration(days: 7)), - textColor: primaryWhite, - background: secondaryBlue, - borderRadius: 16, - initialDatePickerMode: CupertinoDatePickerMode.time, - onDateTimeChanged: (newDate) { - setState(() { - if (start) { - _startTime = newDate; - } else { - _endTime = newDate; - } - }); + onTap: () => showModalBottomSheet( + context: context, + builder: (context) { + return _buildTimePicker(context, start); }, ), child: Chip( @@ -377,6 +363,94 @@ class _AddEventPageState extends State { ); } + Widget _buildTimePicker(BuildContext context, bool start) { + DateTime _current = start ? _startTime : _endTime; + + return Container( + decoration: BoxDecoration( + color: AppTheme.primaryTheme.backgroundColor, + borderRadius: BorderRadius.only( + topLeft: Radius.circular(16.0), + topRight: Radius.circular(16.0), + ), + ), + child: Padding( + padding: const EdgeInsets.all(8.0), + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + mainAxisSize: MainAxisSize.min, + children: [ + Container( + height: 250, + child: CupertinoDatePicker( + initialDateTime: start ? _startTime : _endTime, + minimumDate: start ? null : _startTime, + mode: CupertinoDatePickerMode.time, + onDateTimeChanged: (value) { + _current = value; + }, + ), + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: FlatButton( + textColor: secondaryBlue, + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text(AppLocalizations.of(context).cancel), + ), + onPressed: () { + Navigator.pop(context); + }, + ), + ), + ), + Expanded( + child: Padding( + padding: const EdgeInsets.all(8.0), + child: RaisedButton( + shape: RoundedRectangleBorder( + borderRadius: BorderRadius.circular(8.0), + ), + child: Padding( + padding: const EdgeInsets.all(16.0), + child: Text(AppLocalizations.of(context).save), + ), + color: AppTheme.primaryTheme.buttonColor, + textColor: AppTheme.primaryTheme.textTheme.button.color, + onPressed: () { + setState(() { + if (start) { + _startTime = _current; + + if (_endTime.isBefore(_startTime)) { + _endTime = _startTime; + } + } else { + _endTime = _current; + } + }); + + Navigator.pop(context); + }, + ), + ), + ) + ], + ) + ], + ), + ), + ); + } + Padding _buildButton(AddEventViewModel store, BuildContext context) { return Padding( padding: const EdgeInsets.only(top: 8, bottom: 8, left: 32, right: 32), diff --git a/lib/services/app-localizations.service.dart b/lib/services/app-localizations.service.dart index 3dd7c2f..17a7639 100644 --- a/lib/services/app-localizations.service.dart +++ b/lib/services/app-localizations.service.dart @@ -41,10 +41,12 @@ class AppLocalizations { return _localizedStrings[key]; } + static const String DELETE = 'delete'; String get addEvent=> _localizedStrings['add_event']; String get appName=> _localizedStrings['appName']; String get cancel => _localizedStrings['cancel']; String get compact=> _localizedStrings['compact']; + String get delete=> _localizedStrings[DELETE]; String get description=> _localizedStrings['description']; String get editEvent => _localizedStrings['editEvent']; String get event=> _localizedStrings['event']; diff --git a/lib/widgets/options.widget.dart b/lib/widgets/options.widget.dart index 82edfd2..b4d793a 100644 --- a/lib/widgets/options.widget.dart +++ b/lib/widgets/options.widget.dart @@ -1,6 +1,7 @@ import 'package:calendaroo/model/event.model.dart'; import 'package:calendaroo/redux/actions/calendar.actions.dart'; import 'package:calendaroo/redux/states/app.state.dart'; +import 'package:calendaroo/services/app-localizations.service.dart'; class Option { Option({this.title, this.type, this.event}); @@ -16,7 +17,7 @@ class Option { } List

8>s6 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