From d027415302805011e99f5ec69177dabfa080e76d Mon Sep 17 00:00:00 2001 From: "Fatimah.Alshammari" Date: Tue, 20 Jan 2026 12:36:10 +0300 Subject: [PATCH 01/27] fixed errors --- assets/langs/ar-SA.json | 3 ++- lib/generated/locale_keys.g.dart | 1 + .../active_medication/active_medication_page.dart | 12 ++++++------ lib/presentation/medical_file/medical_file_page.dart | 6 +++++- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 9c1c962f..b6fe4bf9 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -1499,5 +1499,6 @@ "selectTime": "حدد الوقت", "pleaseWaitYouWillBeCalledForVitalSigns": "يرجى الانتظار! سيتم استدعاؤك لقياس العلامات الحيوية", "pleaseVisitRoomForVitalSigns": "يرجى زيارة الغرفة {roomNumber} لقياس العلامات الحيوية", - "pleaseVisitRoomToTheDoctor": "يرجى زيارة الغرفة {roomNumber} لمقابلة الطبيب" + "pleaseVisitRoomToTheDoctor": "يرجى زيارة الغرفة {roomNumber} لمقابلة الطبيب", + "timeFor": "الوقت" } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index b3b2edf3..b1fd6cff 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1488,5 +1488,6 @@ abstract class LocaleKeys { static const pleaseWaitYouWillBeCalledForVitalSigns = 'pleaseWaitYouWillBeCalledForVitalSigns'; static const pleaseVisitRoomForVitalSigns = 'pleaseVisitRoomForVitalSigns'; static const pleaseVisitRoomToTheDoctor = 'pleaseVisitRoomToTheDoctor'; + static const timeFor = 'Time for'; } diff --git a/lib/presentation/active_medication/active_medication_page.dart b/lib/presentation/active_medication/active_medication_page.dart index 14da5b01..be6b82a6 100644 --- a/lib/presentation/active_medication/active_medication_page.dart +++ b/lib/presentation/active_medication/active_medication_page.dart @@ -393,16 +393,16 @@ class _ActiveMedicationPageState extends State { children: [ AppCustomChipWidget( labelText: - LocaleKeys.route.tr(namedArgs: {'route': med.route ?? ''})), + LocaleKeys.route.tr(namedArgs: {LocaleKeys.route.tr(): med.route ?? ''})), AppCustomChipWidget( labelText: - LocaleKeys.frequency.tr(namedArgs: {'frequency': med.frequency ?? ''})), + LocaleKeys.frequency.tr(namedArgs: {LocaleKeys.frequency.tr(): med.frequency ?? ''})), AppCustomChipWidget( labelText: - LocaleKeys.instruction.tr(namedArgs: {'instruction': med.doseDailyQuantity?.toString() ?? ''})), + LocaleKeys.instruction.tr(namedArgs: {LocaleKeys.instruction.tr(): med.doseDailyQuantity?.toString() ?? ''})), AppCustomChipWidget( labelText: - LocaleKeys.duration.tr(namedArgs: {'days': med.days.toString() ?? ''})), + LocaleKeys.duration.tr(namedArgs: {LocaleKeys.days.tr(): med.days.toString() ?? ''})), ], ), ], @@ -813,7 +813,7 @@ class _ReminderTimerDialogState extends State { text: TextSpan( children: [ TextSpan( - text: "Time for ", + text: LocaleKeys.timeFor.tr(), style: TextStyle( fontSize: 18.f, fontWeight: FontWeight.bold, @@ -842,7 +842,7 @@ class _ReminderTimerDialogState extends State { ), ), TextSpan( - text: " reminder", + text: LocaleKeys.reminder.tr(), style: TextStyle( fontSize: 18.f, fontWeight: FontWeight.bold, diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart index ad2461f1..cff41696 100644 --- a/lib/presentation/medical_file/medical_file_page.dart +++ b/lib/presentation/medical_file/medical_file_page.dart @@ -859,7 +859,11 @@ class _MedicalFilePageState extends State { Expanded( child: CustomButton( text: LocaleKeys.allMedications.tr(context: context), - onPressed: () {}, + onPressed: () { Navigator.of(context).push( + CustomPageRoute( + page: ActiveMedicationPage(), + ), + );}, backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, textColor: AppColors.primaryRedColor, From dc0e4e5eb65d964bfcd3abce735a6186e6fe75d7 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 17 Feb 2026 16:42:30 +0300 Subject: [PATCH 02/27] Updates & fixes, Filter issues fixed for lab & rad --- .../AppIcon.appiconset/100.png | Bin 0 -> 4929 bytes .../AppIcon.appiconset/1024.png | Bin 0 -> 38555 bytes .../AppIcon.appiconset/114.png | Bin 0 -> 5470 bytes .../AppIcon.appiconset/120.png | Bin 0 -> 5888 bytes .../AppIcon.appiconset/144.png | Bin 0 -> 7006 bytes .../AppIcon.appiconset/152.png | Bin 0 -> 7443 bytes .../AppIcon.appiconset/167.png | Bin 0 -> 7958 bytes .../AppIcon.appiconset/180.png | Bin 0 -> 8685 bytes .../Assets.xcassets/AppIcon.appiconset/20.png | Bin 0 -> 949 bytes .../Assets.xcassets/AppIcon.appiconset/29.png | Bin 0 -> 1431 bytes .../Assets.xcassets/AppIcon.appiconset/40.png | Bin 0 -> 2052 bytes .../Assets.xcassets/AppIcon.appiconset/50.png | Bin 0 -> 2527 bytes .../Assets.xcassets/AppIcon.appiconset/57.png | Bin 0 -> 2880 bytes .../Assets.xcassets/AppIcon.appiconset/58.png | Bin 0 -> 2995 bytes .../Assets.xcassets/AppIcon.appiconset/60.png | Bin 0 -> 3119 bytes .../Assets.xcassets/AppIcon.appiconset/72.png | Bin 0 -> 3529 bytes .../Assets.xcassets/AppIcon.appiconset/76.png | Bin 0 -> 3849 bytes .../Assets.xcassets/AppIcon.appiconset/80.png | Bin 0 -> 3839 bytes .../Assets.xcassets/AppIcon.appiconset/87.png | Bin 0 -> 4232 bytes .../AppIcon.appiconset/Contents.json | 1 + AppIcons_NewApp/appstore.png | Bin 0 -> 38555 bytes AppIcons_NewApp/playstore.png | Bin 0 -> 41044 bytes .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 544 -> 0 bytes .../res/mipmap-hdpi/ic_launcher_local.png | Bin 2350 -> 4895 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 442 -> 0 bytes .../res/mipmap-mdpi/ic_launcher_local.png | Bin 1742 -> 3233 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 721 -> 0 bytes .../res/mipmap-xhdpi/ic_launcher_local.png | Bin 3028 -> 6692 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 1031 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_local.png | Bin 4339 -> 10212 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 1443 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_local.png | Bin 5703 -> 13821 bytes lib/core/api/api_client.dart | 2 + lib/core/api_consts.dart | 4 +- lib/extensions/widget_extensions.dart | 20 +-- lib/features/lab/lab_view_model.dart | 26 +++- .../get_invoices_list_response_model.dart | 6 +- .../radiology/radiology_view_model.dart | 39 +++++- .../er_online_checkin_home.dart | 6 + lib/presentation/lab/lab_orders_page.dart | 2 +- .../prescriptions/prescription_item_view.dart | 125 +++++++++--------- .../radiology/radiology_orders_page.dart | 16 +-- 42 files changed, 151 insertions(+), 96 deletions(-) create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/100.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/1024.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/114.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/120.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/144.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/152.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/167.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/180.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/20.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/29.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/40.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/50.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/57.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/58.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/60.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/72.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/76.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/80.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/87.png create mode 100644 AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 AppIcons_NewApp/appstore.png create mode 100644 AppIcons_NewApp/playstore.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png diff --git a/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/100.png b/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/100.png new file mode 100644 index 0000000000000000000000000000000000000000..c58db45d5599612fbac3c8f2216a4e18c0a6e092 GIT binary patch literal 4929 zcmV-H6Ta+;P)@~Zqote(}{WHBg8qLgh&rWMc zVz&D4_xfG`@x80xd(#_n8-I0Wfe0FZb!CADAaw-?&;XP(zQ3wcifQfEr;PvSIMNS&b-9w4p@WV1jflcO}H7`*#F z46RvDS~tnG-efVEBpYQ+-Lw(|*WZNxE3ZS}=e~&E^DaTp8H>>^-4-oF>eg=~^TKao zJ%Ip{EhdObWJ3AXuM&vNE3cvN;>*x8_dE>Vau-Ja>lbi$C4qPxPG>uugQmineo%Ru z#`tNBpH!j@m1L9-?QLd!cgIeQ{PgEYEx!%PIg8MD*;UB?-`f_449Cq07&TILUeyNn zt0PbR2YSw2jNu0#0}@R%`ZPFgtw1~ms2NK@0jK`994WpYsGNKXmweJ$22({NIL`EG z(D*pKc`K4^Iq7Gf<#Pl!nNhkbh`FoCCBfJ-(!YEby~{3zJCGs}2f+YHr(psKj4F!W zFS1BC*+9C|?;JcG*|*<8@6x|P=GE6=U6|slP$oDa6hH%-J2Zs;FI@w7co=AD0Y(T! z6#^U(Sw=?Su*GEGc^Ca0E3HCSsaSA8ggghZ;q4D2{midyjDTuNl>!9FRv$^Jdr3i9 zA)SM|Fv6MG?tgzW*GkmQl}ubdFgPIWs?;?NZ+U=YMuIPW6C1?Ji&kebc_6Gu$ouz_ z&}9hYhVI`^4=?(84|D|sB;PtRufK`(b1%SYY0ixofmrT`iB$3lhc5{}geCpzh(^Ys521vf}^s~Roy&T126^dpQ70@iCHbhZX9*Yfp z$uOJ|RwV~@RIAAD+=bR}UWdf_i;(T<1)`LvSPLS&OkI0Cnb)##(-<3uO(+gEZy>c(xlm;HQV*#$@}JC8F#F8zy_S5~3l3oGSn+A304%`!{!DiuiEsC%@i&;ap_ zPr=7Eh)KemgrRU|ykb{_q95||$spw2G}qXc>SqMy7TlI^!^mR)*qqVLnTSA+BIl!6N`5xzb%Kt7Q_$adH9s z`YyhaD9R0ACXOnK_9{dcP~jFv6f2KA!WOKuC9hnc6c`X&UQX-ne3Ah1so3Nuqiwvg zC!ip~0bxJxW;sZbXFy)>t>oT>Mq1~4dwIvB;DA_(0XSIt_t=e!($OWl-?JAIDQm5MJ8Q~FABDNbuO zTn5p>4m33(H}x+rXyVTy0YbrO5bZ1LsHiRQ@!4FqoU*Pd&b;NWe0=OLj?At0dTUiQ z)aXJZS9M+Pmqh>U18_Rpp#vGCaiz*tnaW>DF2zy)-H$(ok*A-5(>4WAzEb5)Ff1HE zBoxy{sp*{M{?_Y-jrMzXyv6$wI zmjX1<=n}V#BT_8)P2B!|XuDO96%D7BL1Slk>_X_sql&LZ^8S%RK3NOR9a@)L70 zaP4wfjV||w%i1pkYon_D?%NQVJ`Dl}-1{(>#+5te`mb=ybrGO)w4dS0Q|Jmnwv54h zH=+B~*_3G!lAk^o$jdi2TXH0OLw!D-IjlycIUS zG;5L|K~Vb7VX(G+B`3XMUi$_RKN`@84qHj)jW^-;a=I*|S26$rG~k%e0PtMpQCuaS zYN3qRED&nBGB%&<;i?}%WDV6sZq2$n;i2d8NTA91g`}|Y@+n@xkryDQsGGm~0z_t! zK}GV1N#bE+Oogs0O#Wrcu1`SBP-P^pWw2USec^$MfYefV-({)h`c8b{C9E$%I50b{ zQxMTl;>NSJ#sE!?HG?Z8g|VE9+4X+H1Wvo&oMc@5loJ7+pW^J!-b0kH9El(Egnfk%h{gl< z)2>dS_w~aqCN6Wh0|Rj1-N^;XX0%-Xx3KAKIn8Bg8b^zk12^7kKdbA%;u`dS@vG?j z!qw=%`g)|fL<6QNTaJv*a&(wFa@hOfzV$ZT!9n}2q?<}%j2OmBqBxscD<8uB3l|W9 zk)OiGPdy3oSszDyW)XejV~Bt36g%DCv2`6{A3dIcQ0Y=HhBP8$klopho+TF{^{qQF zwDEont@{@YZPZ$Sby6hUcIrvF zwJ8~=9H}OYWT;}}dC&P)v-@X12d1=e34R22vc7OoSBvDNApJkjHWKxcrKv4rY9=EJu$%67Bch1)B(H;-Gk?t1*QGh=k=}89jUkn&!=h^}jNv!po7T zd?f{ym+{(XfzJ2RU+QvLmW@?ff+>}tFpOy-Dh%`dY^>UsvX;gTw#bab&@}s#a5?Uk z&Ew^*(hUs|9X6H%n#P(!d1F>7=U6t?_EI%^EJe=e88i1(-CeUok>#d`yko~4ovUDc zwBQ=w!U04=${?J|%6q_&DwVp*5ETj!5D6_%DvUCjSq@-8Xx5NsLM%D7D>xvUv)h}rj}hC?^fWZpLMnLNF+{b1 zw$Xc%*(sPD!2z-I#ne3G+$h*MDFR2!AR!d%TMqH}li06`ipmNO2wRBWgp0}v|Issq zTv3$@hc75Ou);W6nV_xs#LK_1!2uDYO6x;pANp1IgEbL}#$YQH;GcgyPz4}l6pwMM zflSG3Utg|{it1pSKv7F6C4k~|qJ*o>rJ_R*lU&;Ls)A7fKyolU1j9)*aXp8CNb&KQ zO1N5(mfkr@$iDt2vVZs^9GyT{xq1Ghj>5P)o9#{_^V%DflUuY}omF@($j_TPw}^H6 z-((U`^Z2{@2PB6Fw94tUOaWXfIvx)JCQ@H2cOsPEnjO4n18k#6-DWxd;zIz3Hf}L_ z?FgvCCPJ);)&)tIa(opo9<+@us_Hp3KvXzus2n@zN`>L*sSHUlb{jfbuCH}w-`#;d zX(xC7cERFzbtAhgX`jW@4`PgZdZ81H9%bKp2dP``!qBGgL8t0%AEXRx#pzh;@DCp0 zuHp)7DcZCu$$#fAWJNpZN)EOx$znvm$&&1W%Xn8ZagPVmtsHNK(@u`gGs_<;Ao;@W z1HxnqltF}X`W|EYxfhX~brzDJJe%(Py=kVx7(XlLcF#P^KI3h!{CTqcpE}zf3 zvvsnjMH)oE!#>bCD7dHMn*nO~njA0zS=e~%<5`6Wg2i|995C|~z!=Rp3Ub(F)4 zES~G9g-{~15#69yFhKGxB6`$^ps~bu(<*TkC>&sQK%gS2e;%bcpczUbXWqPCXfk1#@BDbftHtGR6uHh?*b=E=~Q~ZeI>JJp!;+pbF+?WU8ZJpP~>9a5=|G zB+#~EIqY}rth7FJ?~yDxAj+;*!mca+=~-xByV4G<*;g9`ib$X--GNLTFRT($UpJWq zVsW%@T!Yw&AA!9RR5`XrsPu3~{l%`6TVMQL_8%xetM^4qwTA2N7qx2q3g#Fp<~+ywDEb$4cDOM%D+SN zrI$coVbCljv1B0<=gx8vqRHjphQNRbKVAImPG)LKLW zM>R$QYcIkhJ&#g0H~1-Cy%8rYW@t}VPky-ylf2SVx{AiEFkxTq04Wqj;Hbt(SZ_d- ztLIT7Yo)12Qr9yoXB74yJteWN_1sZ_V$dI)vrU6K;EE%Aj zN=X}lRI<(_#5Dk!1fy4C*#M-HbtWOM0mvj6y%Ng?AeF2$32_ZTCc)^HST+EuWSvQf zYXC9{Mz6&3{{a91|Np5@3q1e;00v1!K~w_(Wf*(yy5FF000000NkvXXu0mjfaS>+T literal 0 HcmV?d00001 diff --git a/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/1024.png b/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/1024.png new file mode 100644 index 0000000000000000000000000000000000000000..4598286bf414af33fc743238513559cd7516fa5d GIT binary patch literal 38555 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 A#Q*>R literal 0 HcmV?d00001 diff --git a/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/114.png b/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/114.png new file mode 100644 index 0000000000000000000000000000000000000000..c32a2d52943bfa4ffa43c1a8a0a563ded12eb442 GIT binary patch literal 5470 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 U@8L?rwEzGB07*qoM6N<$g6t)U4FCWD literal 0 HcmV?d00001 diff --git a/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/120.png b/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/120.png new file mode 100644 index 0000000000000000000000000000000000000000..96ebea5efe5c4eb8512a0e90146598b870a1be85 GIT binary patch literal 5888 zcmV+b7ysyqP)%4jcw!vOxkwlmTO8Bt+1m0|Vl0IL-&04FHX%P>aMQ(>;3<$ z)Kxvb0o(r@(;f)G{~OaD@ChE%^a4J?KEY$$17qAgzXkgQk8ux-ar68Z>=QgDJ@C0P z%5TAAoNAw7pWrd>fiZ5L--3OD$G8W^xOsjH_6aVN2W%TirGS9}N0JPaNkE|+XF{e? zy3r^D#BOY$Z3<=EdN%U9?2<3a11_p0j<`^6oIKe!Bu=U+nV-S^pRC1EPLd?O#pSMphz+&@%J z`3V+SfhPFWdmkWn+dM>1nSrja9fGcX4@2aL;}Jb|26|>)jNZ$xLfz(CvYY@u+^xXP1u>Nm%N>19gagcP5f= z|BfV+8u`|v1E|G=27%+`!0zegtZ|M5ie#JnT@PwMms!=K8yjGE_n>F?r7-ISWpIQy zg4KWLu<#^XZt|_)!D?!P-!*6P zKWENnPC|cylPZYBEJ@W!G#)2kdIQTz7YvIR*=mh%c__{mlp>`Q zEGMwUf&cw8z#5mc+hIEM5dnz=H0!q6>NgP1#?7@7L(>iBbDjZ``{qZNTtU#8+heWdxs}dyt@QxE15aZ5avEK!h zmO-Vu43cHY_~>I;!4UEiER39xS(|Qx;KT_C?z|Ia{Q9!%&Is;SqU<^WR!6&88A6(< z49K%bF^}v~g5dZs6UQzH4#lJ6ormGgc)k-td+&k9(@sSD{9DnnY`)QB<|lPQsn0L+ zFT3{C2OrX}Oipb4F6mPm!ReyZ{iN1KfkMV#wk(?~T#ZvEA^g~b2tV=w!Ydc9FOM>A zg$H?JF&a-j5h|xBlIcLZrw74Z#-n4&-44DL_ai(MkB*1q&3L{D9ZT;)>rbyh{Wte> zJjL6eqVSMli`%I7nl9L}K1T=RoP*-NOCva4m?1Y7g8`q8E3Wu5re=>4*lZkHe{wnM z57-ZOp%st$z+odWZd0`1bqmzH7<;@xlP|PzA(0+dAO%GU^Jvk-j`kFlZFu6+2u^FU zqusFS9LP!OxDgH1Qs~^KbEm=dDjLi30b=hXJJj-3LA2ZB*&g|WJr*SS%FlLP1jpmB zImVkLw9AA=e&r@On=-dB70z+hvqQ3#Q*68(O6LZ5nSi=&wg%{+yx6oF*W85qZ+wm8 z9czSi6kBe&)62iKLzT_$V-M*;e`y4#3p9muI-l2x>GTy38PhNxvM5;(G zBFpfkr4h`zh!oizzZCjXArH{cUVU5|!LB{3VeYXXR>lJ!ee8{3bsqvyBNNZcczA@g z%BS+JeCz>&H-bGBT+>;{5ICRUYLb~6;7tby)+(0i6I?}Sk3>;E!6V`IDwgRJTt#P( zL{UD$BjNQbmRWUzQ(Y0RUsv8jTelZl?yG!J`Ag944pXHfQ6QOs+0;OF{;Ef?eveaM zkAXMd26T^Cv0WQymTGD9AnjP>`_sk*_l5H%EBSgF$G{tJ0sTp!VzzIHu!;nyV6`+O z`SPnszV=%h$)dGWqUBDlY3CB9Njqsn6NbfTf0t2#EjNex`A4o+Y_T)pmZE+r7wBkb zt|C6_A%t1jatZY#jX^&GM^gi!%3efKUXs$wg=hDil7`wOpnLYEu-B~v*rLr-55YR< z5!0-q?L6k?O(Y8atKWZLnB6YrRVI?DU_H^pg1vnRePwSL93o2Ptd}Umi7J~~y>Lr^ zE>Tay>%CWBkK`+_n@SEco2C#yr>S4;0Viz~@Jh*IbUyVELjSavqfaeg*s_VbZ>EXeb|?C-y$M!l2Qh~k zQiQXUm^*o#Nx~f%336r1$PlcONiuRxQrv3_6A1*yZOSfh3CzRbYKbIJYO;!H$!zXS zC!*`N`vU5=`y%SL-xhU$yB*Ye%`Y;9Llq*cB3_^lkX()FeYf68Qc0L9nXrlYLWF8Y z;xlpt7h|m)%!!J|OiffwRuN+ka(szoiO5j;;Uc{vE{6(pN$IFZFOo_9?)as9P#xBnZ3i?(H6_LY*q!pB31T$gk<4<9`5Bl?bG<-%6!LB#c z&UR0$6RLKxBvl9r4@b*q^btG)4jv?PB+DKIQQX1kBUlrx;%xMuI^BTHL`x)(NH0>F z8KaM2Ik+@iz2_RqvP(oidI;tn59Hv+#u82Sp3SNc!O}#{yQ->b7)1n=;f8v1A8Wj$ znXx&@@ujX*_o%w1F+v@Rb4Ay5oI{1VWI26w;BU6zaw9h-lrJ4;uGjF_$Pz3k6(U-& z?~9>syKNDiIG(piBue@6IaX|dG<_LdZ{U$ZMy4hjuBxJ>hHVmW~@8r zRLUucOrDC!q?66Mwq9%8bMe1B>)Rqp>9grmJnNL!xSMCq0JsZg>%j%JWR?LV=@+XG zU)>T`*{U+6r^+&71j|8sr$%7wEfLsq3#j}1Oww^%Y>vQY;}G0od$itiEgB{r2DlE( zvy-kXX42iN~Kp;>l-_c;*G@h2-mw`z~y585(uUXAUxa zY4&cX5Zq%|w9mT*!SOr7yqA;v$l4{c+FE!{;YNx!7942?LLsLTsS*%V2F(?X3RF~k zCgmK?Y_{5#OJ^heRy13~-4Mw*+U zH@rF01QVy$(AEm$6m^FMwE*>{Kz!jcm_N2UEph4%a)TlwC2}~+=wH0Nu*xHa!l1l7 zHcx_Z*DE05zOw8wvc+Zy7}*?k+=^^G@fft-dOgcvCiU|QswCATSdNMHn^w~_{dAbF zR;`UK!nDkMp~kU7oT667bOV3<6VyFI8x1_q_+gn=D2Rb~--oT2wg@BRGNv6GsWOzV z5K(35Pnf4h^bmrr2k#2CWoVft9tTRyS9~@)#qRAzXwScgx=EuzgWh?oood`TCR zsVvj-d7SfO(FGhb>|$S)pmGWk+6@USL;XSf=Y&#;i?ps1YBT8M*bCO?z!$cLX|cIl zR)*|FN7120=c!bN^zB*Qw%b4tI>--|Dr&gi>JgkS*$UO8pq7QP_h)gT#ys3t#mZN8 zg2x_hMOaitVqH`|!LBE&5ZW4+s!Xy^a21Fh$s&A$i}(Jh%Hb2Ng$K=Ybt^Nfs4EPt zPjF#=8nvms5v*FTn|)_>urMd^UbwJ?V=z@Q6D;{uzLk$XxWXI30#Iz>#TZ$v?pjZ; z$}Rhg@mn!zGuU4m!CIA~vYLH-MYUhfOyeZf(fJ{MuRbn~VAow-sCN%*E)>Z%2dYRw zYP}veCcF`>M`;A2NZeIPUaPo@F zY67&UYt9P%BJjZ{EA*5`MoHnbH0fhGKA$9#02eL#mp%gf*7U=P000K5NklYxDb;uQYjK9-32`1H>>~6rVwaOAjv$6~zq~>6ZQZTxBtV(uG2>MucDiAO`c$ z89_jX@I3EFpzFC^s7lcg0#rjYN`TjfiF%5B!tJ<$KfHs!Yi@+FnM#rm6iLwo2>N07 zz?=UAPzQvsP+UqYTndMZ;#^@bp`K2UBjtnRT(?YbqU}Yir6nE3IOnLSZ+fw)^iE=p zTRhS~v(P_Xgu20W9HTRTL@p~s>aXu1@xseUJoP*h&;EKtdG1B$y3$beE{s8W^*2bm z^7zy8vNmG$p+Xb+!f`$&^3f4jYU^8;eDd@XtE)uJrC9W4J z!|*--(t6m89lw4VgZN&0^|RwwUjGd1%dbIi781sS_rg;H5V=-sb7p@Q7#k=sUB+Zq zxFg+C1~Oh>FH$X~tp)K1mmqTJ6hw|Z5s|}>-%t)a&bh8Ml&*u1#h`p^GP=HXG-Wa( z2Tnrdn@1sXAjO1}(LG}}?Em`&X6PuiR}n~6(8fmS{|)w>KZn>(BCZoC!|)wO+{9$? zyWt^IFoe?4s+ga17EoWTc@1rrTl&b@i^OwQ@pbb%p_k zD27}YoAOYPc~=PSvRX3Wqq7Zm7n>Un#poUrql2~HU^ZR9u({>s3gutU>;vw<`VqEV z>2q8wjbJI%5w!K7iR^o5ErDXs98BFZZrS#fcK<>DF| zDqo>e2rdn`oRHORzpay6WjRMhf0s@$eXr7j6L#W+fQAc{B7E`g0r{4VC%6lJ>rq?j z1g8lN?!5=V?g$=gnMWH&IC}+(XD?!LeiPhdH%GZ{<(#9Uze^`rw*V|Ixa-cS+hJR- z9L1n}P)7M5FCL&@^-Ong;so=n2y-XExKdS?PB6O={Uk(_pN7eY13kTf?j1`-;^%Wb zATr|#G#oz}W?sX)4|w=1onRFzFq~X8o^pcuNecR6&<(vV`BH)h*g*6%+2C$Fqv6Oy zU|O#hPfAebX7NU_S~17oz{VS)0b$KUo7?6EIc)Gd?SwNSEl? z2w}+Ju_PkM*j9(Z7oF=|w>(_Lu)BNcn@^#Zt2Y;fAAJA~#~ukyTt&8AS`G=6L&=~H z5kw+`yH7;>y>k&>b`P3nO-FFIT>x$^ifGkVL%N7xyVktkz>Y-C_-%~tq2a6$CauEW zUf8{TH7dj=jDte#B93zrV^deetZxt6yN34m#-P_dgt>e9Xviu=*IY6&_P%|qMG*P!`_7oh2^)6sCkF{nTMAk*4I zU)>v_y>>@%_g$fT>)^!k=8Zaf7e;XW-yt~u%QYs#w4;MjSUK|*b`cl)>OQDHU|%$R z`(QMlJOxc>pMjRkE<)Qce};}FcO$%N89J8UgXRm)L2$y3fczzq@8rWWO8E&EIJIPs zEe1GSw29hs3r-&PM8lM$(0tx>v|KRtcQNg^9%t8CV>CSSTfG*1POt4FXGBP?dFMIo$O|BMcTYu$@AjL#>yhRG=h zG@sydc(I0c_ym`moEp>T6I^42lpBsuaJfBNWBPo8YmAU`!|@3&w?}JCpHFa&5mIhA zKEdVoXpQOf39d0h$_>XSxZEDCF@04dxW?@M+`##N00030|C^N3r~m)}21!IgR09Bl WvJ&HVAN;WZ0000ThP)lBH_jW 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 literal 0 HcmV?d00001 diff --git a/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/152.png b/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/152.png new file mode 100644 index 0000000000000000000000000000000000000000..8412a8202de2c26941f3f6c044dbe583b60380da GIT binary patch literal 7443 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 literal 0 HcmV?d00001 diff --git a/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/57.png b/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/57.png new file mode 100644 index 0000000000000000000000000000000000000000..744aa3ba2b7d55ff5e31cc59e9943206b84ed5b0 GIT binary patch literal 2880 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 LNkvXXu0mjfmiK^B literal 0 HcmV?d00001 diff --git a/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/80.png b/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/80.png new file mode 100644 index 0000000000000000000000000000000000000000..340d82bca86544a881b6c8d25cd01b4e623b13d8 GIT binary patch literal 3839 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 literal 0 HcmV?d00001 diff --git a/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/87.png b/AppIcons_NewApp/Assets.xcassets/AppIcon.appiconset/87.png new file mode 100644 index 0000000000000000000000000000000000000000..4e751666636eb7af65cbaeaff7eeca1b582697f7 GIT binary patch literal 4232 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 A#Q*>R literal 0 HcmV?d00001 diff --git a/AppIcons_NewApp/playstore.png b/AppIcons_NewApp/playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..a1da25a37ae295e03854b5786202ae3d2b6e32e3 GIT binary patch literal 41044 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 m4k9Q5MC{wh&kF)`zgQ|IHJ$kn72$zHsSjGqK9 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 V(C^Sr8Uy|TT{>rN`Pv*F_g@E;1tb6f literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4b7b0906d62b1847e87f15cdcacf6a4f29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_local.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_local.png index 348b511670c0e98f244aa2c8337fa3cf0b0ce167..06095ae42ce39d1fcd9ba811f1fc6e195869c51c 100644 GIT binary patch literal 4895 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 KMNUMnLSTZ?!$!~m diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b79bb8a35cc66c3c1fd44f5a5526c1b78be..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 442 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 Q1poj507*qoM6N<$f^+FhD*ylh delta 1727 zcmV;w20;0t8O{xmBYyx1a7bBm000XT000XT0n*)m`~Uz3fJsC_RA}DST5D_+RTSRD zgde^l1)JQU@`UB+$CWrw| z)I>DV7&Pf0gF)mCLc6oGJKMExcjs|D=iWQdo!On)7T8X5a(}neJLjJ7+;h)k&ctHk zO4i4pK{_GTwH0s#Btwihn+#JHsV=VKIEd66b6&~1_D{s_0bu@i z%B9QPq%ybzwtvlwNl-PyH!#J5RJ+i=XUd3{LLg!ub1_`V8#|&=Lwk|td^H+|*WAS* z%~$}*rY?{dueLyVEX0Tf3D1z%G=ns?3CAWr29f#y8S^cz1!{CwtNlz(054oOaYqA4 z(_3Kd@KG4qwHFe%*K=S_Sp|T=#gz5iK-u&hC>wi0d4IYDZQKFM=ADpQ`7kazuLy)C z{N3|GZtb>tmf)M+yB`X_4FX-69WO!R&PFEyi~Ir1S_H}FC7?@5#=tNP2y+?vJY;%y zF-_89Y!^-8XD$G_b2X@^PDkR&0ql+npcRtymf8Sxoh=wdY>uk3vGD8f+;+uzFm0X$ z7=8C6*MHnnJPl1_3K<80WuPa*0pJVjY_4|h0wfo9a~=&g0O_u|Fm~i?0YEFyj|k_D z4}fC_N}3KWrkemR1_Su&8$MstLYa^S0L}8c0&vdJ&W8gK>P-0o@OZe%2Vm0dfb$GY zMgXou-1Fl20hBv*P5>0FZmtQQ&6%?3= zQ9f=F-b+lG0l7~PTDgrEM5%-BOg+>;PJc2XDN|*~ zzPjIK(@qf1dvsQu2iHv2=*k`Zf}04P7wAwT=x||>N=%svxz7&y9AYu%#+YlQnnF)2#co%CRR8>o z^GA=z>Sd?1pvth4Lu|(abfYaxA=SMWQW#9+r4O*6LT+wk_iI=&6@1Mi|Krb)y7wVS zEnkE5Ae;Z+z$eA$#dM?Zf6QDacYmQPL2eW78mmHST5~i2Y+@si#OX&jgLd&U)1WS= zI3-#})L={4&iaqDcZ(U}XG5X4tIdpGJI0M@HTHGkx*MRlA266N1cdl#cLf}*(Z%iRwLBAAdd0Xtv@GSZl) zyLQ6w(nqqagyf;$^LiZcOZF_q&fi1-TOMU&4~cAec~3TX1RM{e?!Dn2-f z3Yv%hEmz*;6YYD$^N%VfTXReF z8al~h_L<*H4A8d+ayWH;r4j@LNO&9%xW8DbkM|>Gy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_local.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_local.png index bb9943afca7ae877ef9598bcad6e039d5d154378..b5d6eb9ad2d8ed447a9b78035a8f9d86220d1f99 100644 GIT binary patch literal 6692 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 Rvwr{p002ovPDHLkV1lRs%8dX3 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d34e7a88e3f88bea192c3a370d44689c3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_local.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_local.png index 0b9d9359e3dbcedc1337fce588f4c35b2ea84b33..3774c262317e5d546e6b695fca8c646805efbf24 100644 GIT binary patch literal 10212 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 Z091+02zk3etIsC@83{%4DpBKr{{t0&xI+K{ literal 4339 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 KG-}lBqyGn)&?Wo; diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372eebdb28e45604e46eeda8dd24651419bc0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_local.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_local.png index aaa9808d6995beb1a391a35dd8ba72fc5a922ef9..a211290c5d41c4533fa78ae0927249e21902d2a4 100644 GIT binary patch literal 13821 zcmXxLWl$Sj*EJj<5Hz?Hhu}^N#oeLBN^z%Hi+j=F?(SZs6mM~NcXtTx?(lNm-}n4T zGLy-i?ChMqwyhPatSEzlN{k8s05IfaB~{;E+y8qYBfUMVE?a>B04#usur z9&cvhW%OuOpV63w6W%zKk^pb$H9v=%$rxR}8%GU~LsOZW@&;TbHjUg%K!Q3iRz~!h zg)$8FNlYptaMflziS@GWG&Oapp73NPbD_y2)oW*o&v9qiwe>RVR>0cK97FCX_#QFF z6suFn<+IJcUX#o5be-+m^TX|_&lPR5?t8oCdiyRq#SFKZh<6`svV=Tt5(xF(HqL)u z?uwcX#-bdS0k#TGX`4)s)>rn9Pr~v)w9|< z4-Il~Qj+5tOGJds@Eg{liayD*gfa%qdxr^CWuYCJSAjJN%W!8g4nv%K_yu0>wr)+y z@`9$QmX`VvgK=T~H6Od@ZiwD?1e0K9zl)#C=<57(*v7p;o zqC^mSgIzlm&fNKM_8701ZcmY5^BvQ;h0kcZjAlyh{^8U`q%sXCT(n>OAh@7wB_p8Nw{$VSsZNzp-A` z=&IN4N`+={nZhjN;mrVjcE)g{@L^faL)A%c_NW*eZw94|Ca8?i0VLPF)I11v*8*sd z!dKbtct0N3J)UiJDP?}NUStg?WcN0i`t^B;kVW(CxJ;{NwdMHV(k~1${;M?a=Z8$^ zbzcy9%Me?W)6mGsF*0JRMIi7`?7L9Oycl< ztp~>Fdvzt?S&XgJw1W>?|DTaA^OZ(hnsXn_M?Eo}UorU3_KUJdGljh#{=jl~vzN;-B+3$_JLrD4~X%&)K zf}2H52NObJQIV_-l8Ui9uoN<~*HKo}X^Ab1Z$Q|p$H8>TmU_8v1G3&mo=U#-O4RJD zW={N=U+_5`bsDUFRFl5SbyN=9x|+Z-E{ehEB}2ms7Xq z{b-MF+uFJr#!TmWvV6~hrPuCS^tFOY0BeFK`2LTi9qh>VPb8ovzxRWvw}giz7jYFI z1U7zmzD4hI-b1LM?{z)XhXf{dV~8j}MCOg~3h#q+V;vyjJ1EY-fjiHJ`i3hCo_C`e zDQ4+G8A8~cJdWhte)U=UTw+_0!X0A=VOR1&EJUx*h)OQU+x4#=4lCGc=KA@%C$Re& z9k7F0*Nj`nEw8s<9#1K5&-*BRz?%jDld18@35F>)(Xs~}eVo^@kD*Xs%!YtYdu$r` zD8znlhm%#0Q?h6`et--mj0UXpuSZ;Yv>)R2aJ3&)_~*9o4N2au5cJ&`%@0z6F>+N{ zYr2(=A(dW0ydYUPyHDf&K?4oHD_Y%gczLsRy9=${20jDR+x||&rHB#5FZya`zXBC> z`W%Y=ZNj^E`Lgdu`c{?RLE!BIDEVYgV*O#%d??Pktkjs;R;#l(pq$M!J=Ya()S!awBCSBq1kzNz~@Go{4q6JWYv~bLF8W|HYFb)Ka~cB`(CcO z`}M&LBAvZ+h_1BV(w`Ds8a~>yqna_{NcA?X!TgwCleWJXqR+7{5P|(FvUnNRJSM#n zMTYPm0Ebj+-tszbDT`j2U!PJPu7w|u9MJ`t&;!-fPK{sNWhmcaQ)&!oIV6(?MSi}4 zr{N!+TOuOd?vnZMa(}Mh&*^)tc$zK;dt^_x{c1*lwMU0w{aw+(WQ00Ia(z(r3ZGL+j`l&<$( z>FeBcx*x!^wo_=+&VV4uTb5cz5Ng+=6v;ldl)yE>TU&GC2f7ud=$=d!jirLfoW`>N zIjaFF1u_|{PIsi9b}HcPs>(i4q*egYY>JxrKt)ZoLGVnWp?4imccX(aHRA{#Z1#-r)~gtV+9lK*MIpm2G=NdPs(67X|z%s-aX6 znQGU!Ugn5tQch)38F*ySc<4Pf4i8fMWXDXgKaXE0zuiGk2}y6PtQ<{{SeH~KO(`FE zN|bU!2)ZeDd$QuX;`929*%OfphT=f}ar5}e8Zy${oI4|z0lC4@)vDq4OPFr-GLv>+vB8TlI zghe()GAB7UPN!XsFneZHQmAc4%xI9uTS^q})lU@^kCmuiwb3g~R3Q}Z1+2-P zLq8PWP1h8%}7VLq=iXj@-`WzXgO1Lq0I6v~vaBl#-Xg||Ez$$lm#thv{zy_f{qIOYAA z)#^4{QPE6xLYmHZ&imSmUr+W~L1Bn?&KeEg3GmrPlH5|}-)Mi-y0Vjkt*q0E`^x)d zJx;N(2XI{8782@!uJ??yDyK8C_SxJxKWoex&zhXmh_(?sWo`^|hoS;*Vj?3GkBpjr zdGV8=3Svwryh>CpGv2lWD-xJ(8JF2u`Y6Q6?3XOD4+*PhDh=$|59}7z5m|@Jxi}nQ;Gpx#OsSMDcFgolyPq zWlvC_rt9A4;lGE4n;kL*cin3W@7&KAf@Nj%cR{OKrQCDR z@UQsMO-}pOA~zP?wBjHvw{G&lz`!O)_#+x|cv~L$eo|4Ze|V%O>TNG{L2U0DbqExT zky!#M1@?bNvJXT84#S*#8%@U2qo^!{Z#t#Ra2)INyo(Oy>c|N=_59=|Y~r^N5fMGE z4rYERnf)dMkWV0jEH#<8D_Ze7S8aeHe1M$Ep$+56YZYgr@KKLYY(gdzwTkI}t4*O*De+!Afyu?n``5?-@B@PWz+a*y0$a92O;L9E-T=gc?8o zR}QwPboaXpx_-&wpWM3`J9B@3%(XPg5O!p`cIINxiF~cmj~xuAAcW6JW@{Omn9C?b zZifT@5hmonLY>&8RaX+-JsUR*-tsuA3f^gUfhuP5A9o1atJihd0;Frsb9&sn`+$8i0hew{T@G}O zRX#uwq4L;v&d!a?N+${dqGcz+IH|sls(;fTF+^re?SW0L>=!FYB?0hLm4!O(2h9VSa zu%P&~sENNmsEJB$Jc$b4RU%N%b=*H0ygtkwV@Nu2p!>V_q-5TJk#rLQ(%M8PYHcqB zLBjp0MjF?TgW7~}rc*&eUS&zjprnr92AL$kgLd?bBDv8a5{xsx5;-^ZsvXSD`;O}? zS9|@pBC>7^K6XVsXeK@_c;QyhBe+1E5;b3?GLxMF(2lV)d<4#&mCD{4TA9or&Tlv0 z6V~m>x?XRj`=aW(L0g%!z?GGwS>dYz^9M%pmeoTWaO=NWaVSh?)$HrvZ+g%4KTI*> zwLiLr*epo*bzoHYkG19G>e}cX@+LXM7VEm49Vmo+H$FjI_Tk1w$1l!y!y9lYdT;hjVT^JUFn@IDb0HN4cB7CNzhGDi8PMD#eFx=v1t^kY?B` z3#-ePC0YIJ=ab89Zq#KB>mM`=iE(>7tet;-wkuxd+Y8pg*9sJ?Lsy@T_He6LW{8D%{bK}V8Kd|(Wt<8L=%NT zT}bmx*1j_#094GYWshjTFC-p)#Z{uw`M+7f{n4kq!OzY1b+gN=0Y-|c1r$DIc+GqY z?}M}HANbg^%uzP~=;&5VPSP~Gw4~6QQXj!#(X-yw(l9pI;^E=J{=)JI3jan%muo}J zOau1_3ZzhpE)gt*&o zi5O5zEImcsa+_jO1XUa1YBMJ@vy`EEnbh)$^Z1ZDZ@mG}Kc5m=)GE6=BMUA6LZV+5iIC1;2vU{51)Tg2mPYI# zSgF;L+-N_+rpdy*&QX|Msi@gqbo`;f%VH^W6W6@^!q%J%;hi;&Dk>ZOYlR;kMtd1| zNxOS3}7Z=s7Yn_9AVj8QIYb2>7B#mCIf$PaY%?KI^i zgT?-hqNpo~^g~&;h3%4@ZtdQ2LOZITHY@2)q?tpj9fm2|E9rNWLaAvWf%mkfM=YQt z%Bw82MY)cVDF(j$50|3|394GUh=b$zAsj#Kuk%?F&EA<^0Vk%K49m62)2l_5>+w?T zU$8iDmh}RJ5+cQ{Q0?*UyPAWU**xd42R0tgP#0)skQP&DY5&RbR!Xp))T)-jn-Vph zwtDd6GZ$_VIVo9XK5)AuU3u&dpDd6@(uq)7O}lSZB#zs&P#>Z%t`7Dxbf zMP~k8FjA+>!Ys9chHr7?ONFKLCBdkR`8_= z?k>$qaUQl#zwRz1xsvEjCE=C5>-iYi!Y$J~MMgYho>|yaXmb3= zWe>{rR{bedx11(*T3hG@9G-mjjIJ$c*Ee6seX1xqe!I@@_S9jwU2*BNQ790a@RbuW9~8XR+QyOrM9 zB&<6!Zx>Mh`xgJ798gs1V;W034+j1F90!!@Yge#S#GwI=NY9e4F3*z2d>AtHiY|C` zH66MT4Vb` z-U}WIUouGhM)e2Ky!}DFsvQ_B*^f+rcmvZk808r#4DXD!-t_H|)E)n76|T8@dF~Lh z4*ymao4=bzbZ!mHB!IiQNSKDFgd57qg4<+PWCGfC#Vd87?z)#;_J`{u$}^FAnRo(m zLIJ^|p~GWiZ(Uaj))^UPNof}k-30O-IL4y;`6&(+ZVfK3lt0ZfB72w{=n1mJkT+0a zqK-)e$K))*?7uQlz=bM^h3O6V>8Vx@GwuL14L_oD-v8pefP`w;Uq?e#PkXUctW$I3 z-Nc*}V$ZUTf!AGIYO&J}P=;|urTG465d^Ep&$t8f?^m(p@d>(3=+A@CMAi#Xo#TwR z6OUb{@+URDjZ;NSWK;LqNe1%+a55ET4&llyOfU)jIDzMvwz*uVo zHTJ`pB=^)y2e+@ZO!PVd_5&sxU{*OH5TKn&M5#0@l@a?2*qPiN)G5GX(TOt;HgtN4 z^cE@hZi^(FGbZ7MNkkJ0))qN4_M0Kbt&>DCZiH0MRHVEVNNW7SACM({7F5PbnbXBp z9fL#m(iWwRnBzXw4*UOzc&sfbLS}=>X!!)db0Jj322B@c(ZWZ8k_a-cGiyIzwkzN z4qBgZe=an6q5QgYb}1GCAFC`|m++a^mMcq9UzJXaPy)2}UZ$zIZlZf6!pTXLN5@7e zpkTDom|;^VC0AXMoVte|qnsUKG$9XnEGBQuM}wK3!;_!Mp*BGH4jCUTD~p#Y7hymd zlCzEOw4&o+lS=u7`QbTF7d$sl5(C8xB0=4n$d{Tci;wv7sIWs395$Zi_R6Vp$Pw^5 zTjP9z$4KswYa=TQ;P9fQc#Kgt2ypHwbz>HQ5DS<7_Q02;b#Hc^^!KaQ*LO8&)K zwP@$=@kV`vlzZhC`@u7|ZLpQ3U597T5LTwI=T>>TFkTG4N(pp<47JLx)~|)cW7Db39D3Rm*|i$Y;zt&f_&R&av-0 zZnceqrK7ibi%LXo+-DDrplFy)6Lb+l>AsfNI;lK#oCF*0@q7@nP*AH>E{JrLmDM8>NuDH@_@rHBb z9Mkv4LqVa8eU1D{%#{3CyM&og+~r0;&w|`D!L7|i&45PxBip~o zM1RFZ3a|}-ho&pV+NvX;@;1FkpA6f&3%gb|)gyXwFWFli#(SLtykROapi?3+NmXPe zLbhMk+S@;6=nvxfcp)0g;uSUVYCon`OA9sK# zhON8$-|^$Jl4|-{*Xx=lyI*KW$>B>}jwO%!s8xHeBo|VxIRX@=CUAk?+qoL~$a zUVzitZko<%y~bd9gUVp<3XQ48=h|<>l8h}@8MOJYET+8W?i;4DcA9SN;+P#YQJ9&S z@%KknJ~+>xu(BQfgzPP>z9j!@MTn`l+OKz|bJsnyP<6|THun+#V?HZBqj;7J(CiY(x?-svJ(a^m1MU~#xyVPKB!(_p(P1^Q21})ARlBv z*Ml&Yw0H0~FB9rc(~DWvalK!ZMWZ#R%l7nDb3{OJAGr$ISvBNmgcAec82J~|48kyZ? zWq7S$O0p7?LKl?fz ztPo)jyfjGcyk)2`Z1ZAt+ohej_;|~%&=kEo+1B@!Mr42h^M2w0?FiN9rBLnZn3L0G zZRS8_d}wbj-!Q9c#fyRF`qUzm5x+<@2 z5?=F7241r;LZ=Wc(Y#>2u&8j|R7c-k{=!^X#X#Tf(?yoMW_3jq@%G~9;Z2;0%e2Oy zg~~+zzheGImC(?ue@8Ey*&TCNb+Boco{ZvEgVz&KFkCAqYC9FZS&{K;TT$`@iC%dd zsCd@A3w_6aPexL;%R#?W<;lRpBw|pSmC0!Kvq9?pB2o*dZ8wG~jD+*9v8UF=U14!T zMzlWoicfnoO5p9}zuWb%u~)d!zuBK3<$81CX+1iL7(H)I z#L?O+*-RJy3lSEG^B2Mlqb8w=o6&rpEjzZ?DiFx)%aHc=;Itz^jk0Ow z%JKJiyO*5)bIbo{s zRxG}&zc4&%;4Wjh{Z(>Z9MGJ4!Izh@H{Q({UM3w`N8>tJHH^!bAdNC z5y3wHITJhP)vpW$JB)N&ttnexgflr1ua3348dvA(KlX1}8C>IAb<|p^ao@Wr)3W&! zfjJAM#G2I8(vH+c2rn9kRECj5n)FQcGHz{D`^1IE(0Fa|Ivx$A3+4WCRvH?KW3}#6 z$H*pKpqZbL1_rc0vkqWYl2HwmE#~sc!2klaGfL}_b$<9(gnID4;;-@4tF2$Dp|lff z#IH5KJVBJGt=-W84cO*foE=6h0u8ByNY^*xa)gnZ`vmyG6IsV@L32SV<1D)CX-#FCxd&BOsg&G`cN0a=!}_>agm0`Mqy z09wD#Ptnn$3Rtq^nWm>?(6L}g^urx~dxmKohUeNWYQxV|pM?>=N$X^M$tP4crJUbm ztb^i%oPG&q|_X!lFkV5g?>qosJ9$dRDe(vNVn-$8asVnVsa)c1@};aR|h z{;|AB${arb>h^bM$2U86dhGs#I|3=Zd~Dap@23&_8J<@l^dJnPgTJ={rEK4M$U)oP}fj2mv~PH{*W6uq-UefT}F zw;T2EvF&=%chdHzJikXH3C8UaJzCQ_L4&M>ShfdR_0>e$pIkM|G5r^|QlhK%J1@FA zGF#a9KNC}^%DxgY{j`Tw_WaR?BFL&I{Tcb(^H1KRC;^p(mX=m@Hpf9P_;`N0l_EbX~CZnrr+)qW}gHsY29$(9lKR7y_ z*8D_$8#(h^L*oOk6KMG-H518dS+HnUu@ZS9jjyUI_pNoP_p3qdFnV|`2CLNoCjs`I z&C7wtZm4LT_i0q^1|~mW6v10TX&&fQuXsYzVOTjh%BWcP_wV#d61TS^5lKOC&;0VFku*1rq>Zi9ccIZ5o$ts z8O&;CnwSt(uS(6VzSu<(SrgCnPY5L@i){jfq|j-4CT|Tl?5FPuMvCnZG)0J2FTV{;nKLKtvRTnu6d*fg*;C;Ocfw~(5kUHT|#BBZdWIC&9 z{V(ak02Ak$Jn;jC!jzdA4B#PoD0Ww*;3Vsbg~`kL?K9*;YopJ z#i2vd6;)RT&B;L%OaF#~vE}T2<}JZ|TmHq5jF|Fb{RJ}gdYOfX98wnc+s|_O_3MqT z{sqW$Nf|t|+{bFnps(*gXK8_=dl zbqz~DrD?X}gOON=4-OFYBzO50b4}s;+Pnn6d+kf{$uhTDZ0@>{nJbrRm=m4-$f#=; z`J_o0EZr&cG|#|BpeTau%vCfj@TrSW$?R9L9>1oX%9?t6%c;fmCVzd~3C5 z!smbIy(e~n)^UQsA2HPbB+4sHbjxg$FN5S9r3~WPRLv{wqVrn689uG1e4}dh{pNqA zyOAfH6p5n~n&yLlx$XezTODEKp%17Gq>K;|E zYCHcsN7@1O+B6v(hYsMNYNfYh-Xl+oL6_TcY;!Jc18|Lmim<-Y`!RY~?*+kiLw)Xh3f|Gv~`#82ZTEB}alL^=tw z7S~u`xfDeOV?~8@zSnhsZKbZiET!kIY+v&Pe#ZiQ=G`CR^@8H}Y{cL@Jd$j&JZRLW zE%SK4-0zMgCMFijGcM1}?JkchXAp>7VwxjU964Nb!rlJ4=B6WtbHL=`LD1t@c#!MU zX#m|NMBzJKk`xdYCd6EdJYP)_nDm6<_iS%(k4nyyV2a*KpMsCtDhjea^HO>WsXL(Q z+ZWD-@8O$EG}PJN?P8W#Q;MlZhZXQCj+!8=eWQ#&_|IqUSwc|ZfyzVi5l!sDhf52U zdVeM&f=~ycWSH8X&I}j41?fFUp6|WU?AawE4IX=N{~lbwWEG#mXHd)=(ocUm8BSv| zK9IK?WW^xFMI6~Y8?_Pr-vV)aDA}jNq~#^g{L7?Y+-*PJe>)EEUwVLmIjzTscyzew zh6bCKZyB7*4yX0xu)fc#A7fD7<2o9Q{Pe%~dSmB3h%y#NzuQf%9O_aIQF`1S^H%i> zzKYp%|0KrCs7MLON*vQ@_5#j#=4bu49eh|9i@Uu;pw0ls6Utk^Y7>q!rEk6Q<+@Ny zrveN@F~OZk!h6(LG;n>Z)&S8xVAHcas=k-v`(QA^D9Y96YD49K-Ik%1xeQU@_iE$J zyx6I>&aN<}n}FXmuM|GGJ$)yvzaOa^#zAm1%v_I=RAaR zXY2k2>pecQqmgr(#deB=vupepSLxuKgt)xCycsk?Hr<}#cD4;aPi{eDK1fQ)V*qj{ z6wr?S-Y&k(?&U|^WpX;LTYKy5sWXqQ?+2^D>PUO&z<3Y+U_UI)^GpcU*BJ{sMY2j^ zhBA^_?5^05ufZfdXg(&HF5lQ!`te)2bta=8DJF3BcORq^n<)0}NE}yRMLoC!lC<&s zWITgHx~~Dl5#m@DNPw;AftnXCUDVw+CPa1-R;^?`zt9WcPR=|nH5R&#Wz}zRI$vo! zHDY;(%%(d~b1HGtm_N1E$UAZxHxfsTo8kPJB_U>O%?mud^W=oS#0no4*P`FLSJV8t zHHs5D|IX-X@(XX+OYD8nlj0n$2E0~L*^6Y@7T}F_sP%1kC{D9u?2T9Tg_(vSmrNcO z1*qYHLe5rrEWM(VG6Za6I&bx3J8uo*pUf#@kJ9O7dmGH<7gd7Me7MAdCqyq;!KS8p znE~KV`FUtk@FN+Dk496?U{qy^M-~yb&T`MLowPWWkxCjaf z%M^`(#m*h@{0g9Hs&d+&bk-!+E=%Zy$6$?`tK}^Z#t;{wF|3W+!IBjg?ht~0eYbDy zbVTV}?vWqJCp&L4E;m171}0(Bg0RJu4ap$eHuB*QhH8wm&dHA+&&iEiC&BW11~WZt zV2Xr*RpbXQwujm%=W<7&d*lF*AM=-Q+{?BR zgaX=QA}cSWAu+%{`lu!z;smq{d;JYFqc)J4a~n2wYidr?!*Qo(dO{*`0-Z&TGP%m~ zXU&x&5y3^fW7!paQMgWk@H^giHwjn|p+Sa!r6m#4GC}UQRb<}4Q8B8!sBx7v=232e z!`22~PCdPd5Wcrl zU+NmL#%VJP*t!C!jo@DV#|{pWq~1PDf!5dz#<$i2;6yAZDMi8YLw0@_yJuAxQ@ZB$ zxd_14mxn_G;WwmQK&8-yVfu%}u``APh%b?g%T_%vN3;yQuJI{+3=h|e5h`OyZ;Ibm zijVB|AwHRsAS2ST`%Os9cjT1yD!5R=vv!2rF1M)X!}C<2jOU2-7{|^?`mK*9P9`=o z5ZzsQL`!5H5+jZr)8s4K4oJ?Hz-%92zgLW!OYp&B#LgPB10dC_101%`8 z(+C)8YTIsxZ>9ZV1g&#~;Jo8^+M~#|Lu6@lFwFo(+P26QWAlvEtZiq2JS=O8$mV{z$a%Dmk(p& zL-X*%av*BztvkL3jN&&_U}f;yZ#prMqn)Bo4#iM;Ak#;--C|pC1N)^M;+AP-2EGzW zT*Nmae{A7?V=!~$PoSJgARVE&k-h5XN4avQvJ1n9O0|1ycZd$zeoEuoSB-fU)*NTK zfUJOnML%tYYyqd(TdpRjV$SJ=P2k2%Jo9nUcg1~9A?tAPbPY1#xNsQk@0`8>#ywa1 zlk5^T$k07bh}U|tmhbuDTHyOawJAmAk{DqD$IB+)uk#+6b_L+4H^MgLwqML4Hbe3k zE49dE-8`HdMkx8+Sr=y8;T!F+?eV0^)=#yR1`8Ru5emP>%W~lXq}~osM~=C}w)+(O z1Gb#N_@&q1-)lhXTlWmP18&ETE$I-Ch_khPT*h2l{fOZG+m#nSdJCtYI4df^-U%$W z)F7iW5tZ_uVay&VfUi3j%tm{Tu&x=R3)wAiJSc6W%pz%!ReZlpy%EUTn4@SMm(J?7 z9UEr6oUmEZx&TgdOC5%E5aOJE*z{=9&l|5uvq zGC(T<^Pq8S`*JMP4PG^IBTHVi^}UN*fj6EO;GR5kJ|iR!^51u8H8^Y&V!j1ffCQKi zMv3)G%~k1H8sAO7+uu@;l^<7+H%}Pf&lU6l?|Em@8Gz!mKUt_y5wFN!GWQlI6*`Sh z`yfi8T~s8rzFZvCp+4sC8J$SJ67)9&&4r(LbLJQBn(!o`z@i+L=)4E+F|83J(n@bJ zIK);GxO804fLvI*ZRzxFWaAzqr=dHg`^y3NxRG5WJ=SS6GDa(BFHYCg};_P7b`2qCpt)xzf;=MZ%s;Vdn zSp?+$Oe+QcPe0)MeOAz%8)V=9fDw;Cc`LZw(2}@JDRZ;t^SV`8_7l`#vLwqE`x{2U zXC~9vmOpv-*Xp;gH2(*Ooep>gx0{1Lau2JM{#b~u;6*<~>3BT1>!roxcGb2&hN^GP zt_veS%l)9F=?(ow&=hniZ09RCnyRa-BbD_~kogGIfEcQ_2-W{H*DiE&)c=rV39`6G zESAGrrj{A)U$Kh&=$>dqMwwPrBG2@HN|4@&cdj+%WBi9@xXQPWaR@}K8SlSO7pM1Q zH~?MFjU9rPJ97Vj8A!bEZ+Q}i{0$aBI&i1YCL(aFH4T$xB#ryW%bTx-z5WxGM2WoI zQE4vn|N2s-xPmEsw~nC1yAhDJhZ_Bk)41Dmt1r53z45TT>EV7iyKVcwyv6^fUZVdG z;}_Q6WHcl(KH>zTt$r-*jEo!E-cJF)esCXYVJ-j}{Srj~Evklk75lDNj@Xp>H*TA@ zVELmaq@-Yx7)zGTA~bP_yoPGxd_k^y#`7?KMyky2;WyN)RMg}tgUsR|q90xsclu*~ z)2mk0s@u(Q9Oa$8K3b?*Gg*-kS)2UyKb4LJy*0!&rn~9*6%GJ+eO5DIcJ`G?&ppyXLCAS?iM74(LgXf?08e;-DWu&w=wUeA! zP1W7Z)Mafes%`UH{wwqF?aMe$oN3lST2K>BVcNHsR$R-Wk9wlsc!B?^h&5j$rMPow zS{^#-|1M>Wlf`Sx5x-Z+f%w--Ds|2^Q+)i#g392x_kSxLFx*%an&ELV(J?|4qDk|( zMkt9{Eu&AsQ3|(EF~wwZyla9-ZH9;N(jEWYCG!nnvl~U#SM-S59Fw=ddVJCfz5gsQ zDp&97Mb@O^5gYVrg$0@~%wq6E+{yD3?^Vq_QI4z_s!W$37Ijo)tdm)RoT2o`TYK!cPtTjW?Qf0@P&u3Au?) zQ8$Vk-#y-X#7)3-q(;nyZ^^slQfLLORLJMc;}{JgnB_=9Zl3!jF*zT6DtK)!`BvUK z)tcOAyGgk@p(60nOK(<4>i0KX8KUIpY$-=tVJ;ESS@7p!0!Cu@odp=C{0RxIuwg`v zIaFC!Xr6yiD7aH9c`*%ZgtbAHgo)Rd#clmUM|O1v6CxQG#LAjvBLkpHy^lf)T@hQt zQ$<91G;O)3_Ng>x`w#*EdqV{A56K-R>z@_hgorZMTv1gjvPmgBkUbgty|TF*;oR0R z@U0Dkn{}4dWQ3<>wBWWd81b_hPGqo*LLK8{+9c!~5+EiSV)_NXCc$cI-xV+w)0kh1 zWL*^boXfW!GZKH20k4P+mJN$uo>;A(Y$m@=CF{FRng~}=KhBIZ(RO1yB_a8v_g8^H zxFhMDMEeCDTqdARPie&`g;cL}_<)U|VO(|MEXfa#73$ovnvUKpY2wsIpX}_V%+vwc~;8QaaZo;!d^E$e!7ETjk@YKT!sg73|Aq~N;xEf2l zubIcoHh3V*dY0Ced-f9gecB~L zua~Hk{ev3Iu+44T5CD|SZOUcapLxV3#;gtVhQC|;Qi*lCtiRD!Jx%Yn?a7%t^ikaE z$9X9{BP)M=R{2x#YA5NA;b_iqwIG;&G(Hs18f)KAKWO3E&Xb2F)B8z3Y`a)DSBGJT z+Ba-@V9FLtN|s48*)%V->L{K-D zFG8WehW(3k`RN_jM(<#2h^trnj@odBNlcJ{gk52s?4>1&eJt#9&KA6Og9W`SA> z>kx~N$RTL@U`39cM8Eyk4x1YxI)k=bVczdt$s1iA0y$Mjs?kR;Cak_s8Eo0KohEGM zw)WMH2l-6O2xi>Kgpm6y{Dn|B{DD|t90}#obdIB^{LIo5HqX3{`t(+E4N+%`MC+8v zL{awZklh4*8#M%ZW2XM4Fuh+x!u#HW>6y8ficVZDC~N?kOMHQdOEbeC-V()RfshlRN(#d`QK{4 z?$Y8??^2Kh0ILQyYr*J;(f|;%fZ5rl=Eai0z53s?l)!)-_Cl1GTEjSV-Lf7}&eIZ= zk+_g&OaQovyR_N?&&}2!cyrYIlB;kf?1^tSq$^@k%RZ&vY2AC)-qGbY;6DW1)|ZtB zJ*P!>dv*mUlir}op=k>LjqYOKH>o=GLJzm=L7Ykz|R-hb&D(2@Mj9p zQB*4UMkYp$o5m^!w1^2$&+F;Q(bAkBPSR*VVjp{im&sBjWJj1Q_3XU%XXv~z* zcE*Q^_Oki5R>(VCSC*fv5yCeZMS=z8A^1Ytx@1nd` z{)BOcr^TYiq7`pdP_cGWa8VNwngyo+j9>W2^I0ifdhrOuOeJ(!&xF zkD$GGAhU>V216O}Y$TT2E)~lAOCVPfe+d z-?mP8%`A?p9}p#?Fk)_(%0Vv<_aQ!t7uz_gGt zfN4J_*9#fY1(CaM+$VXCWwE4meVV$}eswp*%FuL7IRICz&N^suj(h~{;0l8PFn0#A zdZI>BKuii8J8yzqU=hsm542YAbn#T0BUj{^agc@w>6&|s2kzkG##HHi6D`#ca2pVZ zDB!^`9(3ky$o^M{IDAzC|B>M`1Y8>7{CY^`t}DGEAY6{^#&Wt8L@pC-bz&&MGJ*B# zBFc;v6kfb&I*NZ`J@tz3y*uA~4MeLUR4l&VmCcvu{>7QT7vq!v;P_wKfe;~ zisJQa6HM|CVDs)Cf4QE1D4>2i4CmzPA7Dl|9KHYZn_@2Prh)j)=?F-u8qbFUxHCM;VEoVL$4o<1#gqbo>3Ksy3bX<8lAU`hm}sb!$b1>Oxz_ z!IbP_7)wrTPkk;!OynAeXHns-==&M^aYy%e&1j$2ZYQqwgU-E$jiur?lHER2H;!L1 z3c(!S!|9*Kx#8c$68ElW7xNXD+r0kP&JCiz&ySan>d17_l|@b{?UTaqe%8ts`A$}% zl=gDc$$itF@eFmf6JJ6h=<`OMd|(o9>7LoMjy$2ZHh)o2a^7ELstYZ4ysLYbtpH;-_B4R6M-DLPUTamc~YHU7aDKs+2clsxTUM zEabfIP*ybUJ>9d5!|}N%%c5d<6u(hhuT*~UVS3|pI$X+ymi!j#%aKX<(#FV{m5ivF zog^jQC*&r3sY21yjl-OVl?r6f1)GsEG3avozA8M1gof2_33$$-Maa>`HHU{)=irYes$`;UBS9b=yf^Y z%CP&;WmhWuHaZyoy2?$ykRLRN6hUlo+~QN__=gI=kFI(&Dk24%-@S}YE@u8#f34dP zI#X{Dd@eg!Wry`meC-lT8BrfHZbzu&Fvk?o9Tju_PJUo6@Fub4a@%==>v})luMY1>gG)= z3#(t=qy3De-`lJ}dd8xnsx@v^v}4F!hSO#P)Q_t34`)M+EEFD(ox8!zb9vuXnS>!8ahsJGhhfHQ^Dz{VEV z-0X0}9+ED4AJ|{u$_0q;g9RW*2h^(0o91mUa5;ejahIy#zo(G@ui5M1)W3C`SnaU= zUnIDx?|J4Dc75jW@PVCZGuOx@iryu|hp|S=eQoL;^ET*|%P;?d=Mp!=d1L>oW2XZb zJS~8IN9(N?h+<5H=qRgHwRYbCILMw>E`4XS-}jwVL!{@c#nOPOP|gmo)Iqg!)&oH0 zv{T@J#C0Cz9{Ae?#;fbL?uB_|5cqEm0S7{_nZ|9R>8^at{(F{|{S4vVxpNg#T}J{! z?J#)=`B|d;=FAHB9JD{Lh$&-D+emyE?ZQk_CfRVj0Pme}{HA?154(E)an5AG$3+@8^t(@T;0xLf}Ghp;+6rkR| z4$#>;d0N$`04ZFUjndzY4moh9{#}}%HifY`!oK9Zh#gQuedAU}{rvMXV-R|I7e{z~ zll@=a@kJ3bIMn`_D}3?xW!hHfsucTi7hHMcqgBTR zD&QlIjUyQX^iAC;d$X_an) z*U-`*wrw^!&^LKhafr^8R@G7&qR^usc3BsUl%t3ndV$=? z>9CU=ehr_bW0@DxE2l^u)+hh76R+|WgYo^GQRxy-+c}vj*FYF7KwrJ!W>SVkPg1}b zdE>?riW#UGdO%#fL;&OfAizB#PyrBvE9p3$)do`dC5Y#fJS*ER^G%MtpLYN({5H&o zmKjjL0*tl;si>Ssa)5*okU&)y{3QtHXIup6g(rlPl1#1@zUuzP+AtHi42liewflz4 zCnW*v;+!>_fL3t=v+YBmEC+tdpt$?tyhXt@kO^qA*2*F__J;}XKt3UodoS1iiufd% zxRW?^tXc04r_i1EZyxAIB2^cxxZAJsX<%=5dpB|#aA$<-xqg8}?-SHc8nQ9*QM=sk z5!p4ngD(V^p7(@J(MoMtr?WkFoZIvd+=Q^}aT??Ib~z?0xs&LNv{S1=P+^-_T5y+r zoF?Y-;Ng>zcK+H~S$w=G=3$nRk}=}f+Dh$e@ELVmr#L(trlF2F299+AQKA`f`7%Sn zkRn>LWBY7}#W_(NQMgK`6^qJp$8WxQJ527cC1$lmIbY@Wy^GPqp!)CFRj0*LF=t~r zmnUCB-o=f#PJZSdl)O#ZpUfUXz_X#9{^45RVbn3=BH(Sm!X7mNFPYwl(a*<U zvQ)yuZvhqSX~~JM|K~=zO$oa$;g@yBiKeShSS)>G;ka>0r#)SEJ*8|GP**k^&2w~kSCx8IV1*a`|)30@+N#k-i%WC zt>*wBM`nNcW37^IWO*c4LbW%LoVPbI+n1gRPH^$k1j>sQS=Vqy+pU$^w>ESNf9@-*BxTj0f>dj4GUJ7^QQ_AhjIp6mgpHkH+0+}8Au^bOOpT+gkxK=1_ zlG`QaDvOz_4n(S1a;SeLdEx`2te6Wk$o6d{_g4(_+G;AN%og+?{|bxq!|Yr`T6&HQ UZ+=VB!XXY&SJqOhQm_vFKNIGqH~;_u diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 970b1e42..b17db626 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -200,6 +200,8 @@ class ApiClientImp implements ApiClient { // body['PatientOutSA'] = 0; // body['SessionID'] = "45786230487560q"; + //VIP Patient: 1181868 + // body['IdentificationNo'] = "2235558844"; // body['MobileNo'] = "966533147722"; // body['PatientID'] = 809289; diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index a57169d2..de9f28f0 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -4,7 +4,7 @@ import 'package:hmg_patient_app_new/core/enums.dart'; class ApiConsts { static const maxSmallScreen = 660; - static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT @@ -229,7 +229,7 @@ class ApiConsts { static String getAiOverViewLabOrder = "Services/Patients.svc/REST/HMGAI_Lab_Analyzer_API"; // ************ static values for Api **************** - static final double appVersionID = 19.7; + static final double appVersionID = 19.8; // static final double appVersionID = 50.7; static final int appChannelId = 3; static final String appIpAddress = "10.20.10.20"; diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index 70f10bbf..58754dc9 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -161,15 +161,17 @@ extension SmoothContainerExtension on ShapeBorder { smoothness: 1, side: side ?? BorderSide.none, ), - shadows: hasShadow - ? [ - BoxShadow( - color: const Color(0xff000000).withOpacity(.05), - blurRadius: 32, - offset: const Offset(0, 0), - ) - ] - : [], + shadows: + // hasShadow + // ? [ + // BoxShadow( + // color: const Color(0xff000000).withOpacity(.05), + // blurRadius: 32, + // offset: const Offset(0, 0), + // ) + // ] + // : + [], ); } } diff --git a/lib/features/lab/lab_view_model.dart b/lib/features/lab/lab_view_model.dart index efb1c06c..cd062b9e 100644 --- a/lib/features/lab/lab_view_model.dart +++ b/lib/features/lab/lab_view_model.dart @@ -205,14 +205,36 @@ class LabViewModel extends ChangeNotifier { } filterLabReports(String query) { + final clinicMap = >{}; + final hospitalMap = >{}; if (query.isEmpty) { - filteredLabOrders = List.from(patientLabOrders); // reset + // filteredLabOrders = List.from(patientLabOrders); // reset + for (var order in patientLabOrders) { + final clinicKey = (order.clinicDescription ?? 'Unknown').trim(); + clinicMap.putIfAbsent(clinicKey, () => []).add(order); + + final hospitalKey = (order.projectName ?? order.projectID ?? 'Unknown').toString().trim(); + hospitalMap.putIfAbsent(hospitalKey, () => []).add(order); + } + patientLabOrdersByClinic = clinicMap.values.toList(); + patientLabOrdersByHospital = hospitalMap.values.toList(); + patientLabOrdersViewList = isSortByClinic ? patientLabOrdersByClinic : patientLabOrdersByHospital; } else { filteredLabOrders = patientLabOrders.where((order) { final descriptions = order.testDetails?.map((d) => d.description?.toLowerCase()).toList() ?? []; return descriptions.any((desc) => desc != null && desc.contains(query.toLowerCase())); }).toList(); - patientLabOrders = filteredLabOrders; + // patientLabOrders = filteredLabOrders; + for (var order in filteredLabOrders) { + final clinicKey = (order.clinicDescription ?? 'Unknown').trim(); + clinicMap.putIfAbsent(clinicKey, () => []).add(order); + + final hospitalKey = (order.projectName ?? order.projectID ?? 'Unknown').toString().trim(); + hospitalMap.putIfAbsent(hospitalKey, () => []).add(order); + } + patientLabOrdersByClinic = clinicMap.values.toList(); + patientLabOrdersByHospital = hospitalMap.values.toList(); + patientLabOrdersViewList = isSortByClinic ? patientLabOrdersByClinic : patientLabOrdersByHospital; } notifyListeners(); } diff --git a/lib/features/my_invoices/models/get_invoices_list_response_model.dart b/lib/features/my_invoices/models/get_invoices_list_response_model.dart index e8056d91..fe59c045 100644 --- a/lib/features/my_invoices/models/get_invoices_list_response_model.dart +++ b/lib/features/my_invoices/models/get_invoices_list_response_model.dart @@ -13,10 +13,10 @@ class GetInvoicesListResponseModel { String? doctorName; String? doctorNameN; String? clinicName; - double? decimalDoctorRate; + num? decimalDoctorRate; String? doctorImageURL; - int? doctorRate; - int? patientNumber; + num? doctorRate; + num? patientNumber; String? projectName; GetInvoicesListResponseModel( diff --git a/lib/features/radiology/radiology_view_model.dart b/lib/features/radiology/radiology_view_model.dart index c8150c12..ee5c970f 100644 --- a/lib/features/radiology/radiology_view_model.dart +++ b/lib/features/radiology/radiology_view_model.dart @@ -67,6 +67,19 @@ class RadiologyViewModel extends ChangeNotifier { patientRadiologyOrders = apiResponse.data!; filteredRadiologyOrders = List.from(patientRadiologyOrders); tempRadiologyOrders = [...patientRadiologyOrders]; + + final clinicMap = >{}; + final hospitalMap = >{}; + for (var order in patientRadiologyOrders) { + final clinicKey = (order.clinicDescription ?? 'Unknown').trim(); + clinicMap.putIfAbsent(clinicKey, () => []).add(order); + final hospitalKey = (order.projectName ?? order.projectID ?? 'Unknown').toString().trim(); + hospitalMap.putIfAbsent(hospitalKey, () => []).add(order); + } + patientRadiologyOrdersByClinic = clinicMap.values.toList(); + patientRadiologyOrdersByHospital = hospitalMap.values.toList(); + patientRadiologyOrdersViewList = isSortByClinic ? patientRadiologyOrdersByClinic : patientRadiologyOrdersByHospital; + isRadiologyOrdersLoading = false; filterSuggestions(); notifyListeners(); @@ -168,9 +181,31 @@ class RadiologyViewModel extends ChangeNotifier { filterRadiologyReports(String query) { if (query.isEmpty) { patientRadiologyOrders = tempRadiologyOrders; // reset + final clinicMap = >{}; + final hospitalMap = >{}; + for (var order in patientRadiologyOrders) { + final clinicKey = (order.clinicDescription ?? 'Unknown').trim(); + clinicMap.putIfAbsent(clinicKey, () => []).add(order); + final hospitalKey = (order.projectName ?? order.projectID ?? 'Unknown').toString().trim(); + hospitalMap.putIfAbsent(hospitalKey, () => []).add(order); + } + patientRadiologyOrdersByClinic = clinicMap.values.toList(); + patientRadiologyOrdersByHospital = hospitalMap.values.toList(); + patientRadiologyOrdersViewList = isSortByClinic ? patientRadiologyOrdersByClinic : patientRadiologyOrdersByHospital; } else { - filteredRadiologyOrders = filteredRadiologyOrders.where((desc) => desc.description!.toLowerCase().contains(query.toLowerCase())).toList(); - patientRadiologyOrders = filteredRadiologyOrders; + filteredRadiologyOrders = filteredRadiologyOrders.where((desc) => (desc.description ?? "").toLowerCase().contains(query.toLowerCase())).toList(); + + final clinicMap = >{}; + final hospitalMap = >{}; + for (var order in filteredRadiologyOrders) { + final clinicKey = (order.clinicDescription ?? 'Unknown').trim(); + clinicMap.putIfAbsent(clinicKey, () => []).add(order); + final hospitalKey = (order.projectName ?? order.projectID ?? 'Unknown').toString().trim(); + hospitalMap.putIfAbsent(hospitalKey, () => []).add(order); + } + patientRadiologyOrdersByClinic = clinicMap.values.toList(); + patientRadiologyOrdersByHospital = hospitalMap.values.toList(); + patientRadiologyOrdersViewList = isSortByClinic ? patientRadiologyOrdersByClinic : patientRadiologyOrdersByHospital; } notifyListeners(); } diff --git a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart index bbaa5f5c..7f206c17 100644 --- a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart +++ b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_home.dart @@ -7,6 +7,7 @@ import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; @@ -24,11 +25,13 @@ class ErOnlineCheckinHome extends StatelessWidget { ErOnlineCheckinHome({super.key}); late EmergencyServicesViewModel emergencyServicesViewModel; + late MyAppointmentsViewModel myAppointmentsViewModel; bool _supportsNFC = false; @override Widget build(BuildContext context) { emergencyServicesViewModel = Provider.of(context, listen: false); + myAppointmentsViewModel = Provider.of(context, listen: false); FlutterNfcKit.nfcAvailability.then((value) { _supportsNFC = (value == NFCAvailability.available); }); @@ -81,6 +84,9 @@ class ErOnlineCheckinHome extends StatelessWidget { await emergencyServicesViewModel.autoGenerateInvoiceERClinic( projectID: value, onSuccess: (value) { + myAppointmentsViewModel.setIsAppointmentDataToBeLoaded(true); + myAppointmentsViewModel.initAppointmentsViewModel(); + myAppointmentsViewModel.getPatientAppointments(true, false); LoaderBottomSheet.hideLoader(); showCommonBottomSheetWithoutHeight(context, title: LocaleKeys.onlineCheckIn.tr(), diff --git a/lib/presentation/lab/lab_orders_page.dart b/lib/presentation/lab/lab_orders_page.dart index 4016aff9..0bcbc364 100644 --- a/lib/presentation/lab/lab_orders_page.dart +++ b/lib/presentation/lab/lab_orders_page.dart @@ -1 +1 @@ -import 'dart:async'; import 'dart:convert'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_toolbar.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import 'alphabeticScroll.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; @override void initState() { scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return CollapsingListView( title: LocaleKeys.labResults.tr(context: context), search: () async { final lavVM = Provider.of(context, listen: false); if (lavVM.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: lavVM.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; lavVM.filterLabReports(value); } } }, child: Consumer( builder: (context, model, child) { return SingleChildScrollView( physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.all(24.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, LocaleKeys.byVisit.tr()), CustomTabBarModel(null, LocaleKeys.byTest.tr()), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), ), ], ), if (activeIndex == 0) Padding( padding: EdgeInsets.symmetric(vertical: 10.h), child: Row( children: [ CustomButton( text: LocaleKeys.byClinic.tr(context: context), onPressed: () { model.setIsSortByClinic(true); }, backgroundColor: model.isSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, borderColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withValues(alpha: 0.2), textColor: model.isSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), SizedBox(width: 8.h), CustomButton( text: LocaleKeys.byHospital.tr(context: context), onPressed: () { model.setIsSortByClinic(false); }, backgroundColor: model.isSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, borderColor: model.isSortByClinic ? AppColors.textColor.withValues(alpha: 0.2) : AppColors.primaryRedColor, textColor: model.isSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ], ), ), SizedBox(height: 8.h), selectedFilterText!.isNotEmpty ? CustomChipWidget( chipText: selectedFilterText!, chipType: ChipTypeEnum.alert, isSelected: true, ) : SizedBox(), activeIndex == 0 ? // By Visit - show grouped view when available model.isLabOrdersLoading ? ListView.builder( shrinkWrap: true, physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: 5, itemBuilder: (context, index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ), ) : (model.patientLabOrdersViewList.isNotEmpty ? ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.patientLabOrdersViewList.length, itemBuilder: (context, index) { final group = model.patientLabOrdersViewList[index]; final isExpanded = expandedIndex == index; return AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: AnimatedContainer( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, margin: EdgeInsets.symmetric(vertical: 8.h), decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), child: InkWell( onTap: () { setState(() { expandedIndex = isExpanded ? null : index; }); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.all(16.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ AppCustomChipWidget(labelText: "${group.length} ${LocaleKeys.results.tr(context: context)}"), Icon(isExpanded ? Icons.expand_less : Icons.expand_more), ], ), SizedBox(height: 8.h), Text( model.isSortByClinic ? (group.first.clinicDescription ?? 'Unknown') : (group.first.projectName ?? 'Unknown'), style: TextStyle(fontSize: 16.h, fontWeight: FontWeight.w600), overflow: TextOverflow.ellipsis, ), ], ), ), AnimatedSwitcher( duration: Duration(milliseconds: 500), switchInCurve: Curves.easeIn, switchOutCurve: Curves.easeOut, transitionBuilder: (Widget child, Animation animation) { return FadeTransition( opacity: animation, child: SizeTransition( sizeFactor: animation, axisAlignment: 0.0, child: child, ), ); }, child: isExpanded ? Container( key: ValueKey(index), padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 0.h), child: ListView.separated( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (cxt, index) { PatientLabOrdersResponseModel order = group[index]; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisSize: MainAxisSize.min, children: [ Image.network( order.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", width: 24.w, height: 24.h, fit: BoxFit.cover, ).circle(100), SizedBox(width: 8.h), Expanded(child: (order.doctorName ?? order.doctorNameEnglish ?? "").toString().toText14(weight: FontWeight.w500)), ], ), SizedBox(height: 8.h), Wrap( direction: Axis.horizontal, spacing: 4.h, runSpacing: 4.h, children: [ AppCustomChipWidget( labelText: ("${LocaleKeys.orderNo.tr(context: context)}: ${order.orderNo!}"), ), AppCustomChipWidget( labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), ), AppCustomChipWidget( labelText: model.isSortByClinic ? (order.projectName ?? "") : (order.clinicDescription ?? ""), ), ], ), // Row( // children: [ // CustomButton( // text: ("Order No: ".needTranslation + order.orderNo!), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // SizedBox(width: 8.h), // CustomButton( // text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // ], // ), // SizedBox(height: 8.h), // Row( // children: [ // CustomButton( // text: model.isSortByClinic ? (order.clinicDescription ?? "") : (order.projectName ?? ""), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // ], // ), SizedBox(height: 12.h), Row( children: [ Expanded(flex: 2, child: SizedBox()), // Expanded( // flex: 1, // child: Container( // height: 40.h, // width: 40.w, // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( // color: AppColors.textColor, // borderRadius: 12, // ), // child: Padding( // padding: EdgeInsets.all(12.h), // child: Transform.flip( // flipX: _appState.isArabic(), // child: Utils.buildSvgWithAssets( // icon: AppAssets.forward_arrow_icon_small, // iconColor: AppColors.whiteColor, // fit: BoxFit.contain, // ), // ), // ), // ).onPress(() { // model.currentlySelectedPatientOrder = order; // labProvider.getPatientLabResultByHospital(order); // labProvider.getPatientSpecialResult(order); // Navigator.of(context).push( // CustomPageRoute(page: LabResultByClinic(labOrder: order)), // ); // }), // ) Expanded( flex: 2, child: CustomButton( icon: AppAssets.view_report_icon, iconColor: AppColors.primaryRedColor, iconSize: 16.h, text: LocaleKeys.viewResults.tr(context: context), onPressed: () { model.currentlySelectedPatientOrder = order; labProvider.getPatientLabResultByHospital(order); labProvider.getPatientSpecialResult(order); Navigator.of(context).push( CustomPageRoute(page: LabResultByClinic(labOrder: order)), ); }, backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, textColor: AppColors.primaryRedColor, fontSize: 14, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ) ], ), // SizedBox(height: 12.h), // Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), // SizedBox(height: 12.h), ], ).paddingOnly(top: 16, bottom: 16); }, separatorBuilder: (cxt, index) => Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), itemCount: group.length)) : SizedBox.shrink(), ), ], ), ), ), ), )); }, ) : Utils.getNoDataWidget(context, noDataText: LocaleKeys.noLabResults.tr(context: context))) : // By Test or other tabs keep existing behavior (model.isLabOrdersLoading) ? Column( children: List.generate( 5, (index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, )), ) : AlphabeticScroll( alpahbetsAvailable: model.indexedCharacterForUniqueTest, details: model.uniqueTestsList, labViewModel: model, rangeViewModel: rangeViewModel, appState: _appState, ) ], )); }, ), ); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file +import 'dart:async'; import 'dart:convert'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_toolbar.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import 'alphabeticScroll.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; @override void initState() { scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return CollapsingListView( title: LocaleKeys.labResults.tr(context: context), search: () async { if (labProvider.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: labProvider.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; labProvider.filterLabReports(value); } } }, child: Consumer( builder: (context, labViewModel, child) { return SingleChildScrollView( physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.all(24.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, LocaleKeys.byVisit.tr()), CustomTabBarModel(null, LocaleKeys.byTest.tr()), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), ), ], ), if (activeIndex == 0) Padding( padding: EdgeInsets.symmetric(vertical: 10.h), child: Row( children: [ CustomButton( text: LocaleKeys.byClinic.tr(context: context), onPressed: () { labViewModel.setIsSortByClinic(true); }, backgroundColor: labViewModel.isSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, borderColor: labViewModel.isSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withValues(alpha: 0.2), textColor: labViewModel.isSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), SizedBox(width: 8.h), CustomButton( text: LocaleKeys.byHospital.tr(context: context), onPressed: () { labViewModel.setIsSortByClinic(false); }, backgroundColor: labViewModel.isSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, borderColor: labViewModel.isSortByClinic ? AppColors.textColor.withValues(alpha: 0.2) : AppColors.primaryRedColor, textColor: labViewModel.isSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ], ), ), SizedBox(height: 8.h), selectedFilterText!.isNotEmpty ? Column( children: [ AppCustomChipWidget( labelText: selectedFilterText!, backgroundColor: AppColors.alertColor, textColor: AppColors.whiteColor, deleteIcon: AppAssets.close_bottom_sheet_icon, deleteIconColor: AppColors.whiteColor, deleteIconHasColor: true, onDeleteTap: () { selectedFilterText = ""; labProvider.filterLabReports(""); }, ), SizedBox(height: 8.h), ], ) : SizedBox(), activeIndex == 0 ? // By Visit - show grouped view when available labViewModel.isLabOrdersLoading ? ListView.builder( shrinkWrap: true, physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: 5, itemBuilder: (context, index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ), ) : (labViewModel.patientLabOrdersViewList.isNotEmpty ? ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: labViewModel.patientLabOrdersViewList.length, itemBuilder: (context, index) { final group = labViewModel.patientLabOrdersViewList[index]; final isExpanded = expandedIndex == index; return AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: AnimatedContainer( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, margin: EdgeInsets.symmetric(vertical: 8.h), decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), child: InkWell( onTap: () { setState(() { expandedIndex = isExpanded ? null : index; }); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.all(16.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ AppCustomChipWidget(labelText: "${group.length} ${LocaleKeys.results.tr(context: context)}"), Icon(isExpanded ? Icons.expand_less : Icons.expand_more), ], ), SizedBox(height: 8.h), Text( labViewModel.isSortByClinic ? (group.first.clinicDescription ?? 'Unknown') : (group.first.projectName ?? 'Unknown'), style: TextStyle(fontSize: 16.h, fontWeight: FontWeight.w600), overflow: TextOverflow.ellipsis, ), ], ), ), AnimatedSwitcher( duration: Duration(milliseconds: 500), switchInCurve: Curves.easeIn, switchOutCurve: Curves.easeOut, transitionBuilder: (Widget child, Animation animation) { return FadeTransition( opacity: animation, child: SizeTransition( sizeFactor: animation, axisAlignment: 0.0, child: child, ), ); }, child: isExpanded ? Container( key: ValueKey(index), padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 0.h), child: ListView.separated( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (cxt, index) { PatientLabOrdersResponseModel order = group[index]; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisSize: MainAxisSize.min, children: [ Image.network( order.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", width: 24.w, height: 24.h, fit: BoxFit.cover, ).circle(100), SizedBox(width: 8.h), Expanded(child: (order.doctorName ?? order.doctorNameEnglish ?? "").toString().toText14(weight: FontWeight.w500)), ], ), SizedBox(height: 8.h), Wrap( direction: Axis.horizontal, spacing: 4.h, runSpacing: 4.h, children: [ AppCustomChipWidget( labelText: ("${LocaleKeys.orderNo.tr(context: context)}: ${order.orderNo!}"), ), AppCustomChipWidget( labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), ), AppCustomChipWidget( labelText: labViewModel.isSortByClinic ? (order.projectName ?? "") : (order.clinicDescription ?? ""), ), ], ), // Row( // children: [ // CustomButton( // text: ("Order No: ".needTranslation + order.orderNo!), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // SizedBox(width: 8.h), // CustomButton( // text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // ], // ), // SizedBox(height: 8.h), // Row( // children: [ // CustomButton( // text: model.isSortByClinic ? (order.clinicDescription ?? "") : (order.projectName ?? ""), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // ], // ), SizedBox(height: 12.h), Row( children: [ Expanded(flex: 2, child: SizedBox()), // Expanded( // flex: 1, // child: Container( // height: 40.h, // width: 40.w, // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( // color: AppColors.textColor, // borderRadius: 12, // ), // child: Padding( // padding: EdgeInsets.all(12.h), // child: Transform.flip( // flipX: _appState.isArabic(), // child: Utils.buildSvgWithAssets( // icon: AppAssets.forward_arrow_icon_small, // iconColor: AppColors.whiteColor, // fit: BoxFit.contain, // ), // ), // ), // ).onPress(() { // model.currentlySelectedPatientOrder = order; // labProvider.getPatientLabResultByHospital(order); // labProvider.getPatientSpecialResult(order); // Navigator.of(context).push( // CustomPageRoute(page: LabResultByClinic(labOrder: order)), // ); // }), // ) Expanded( flex: 2, child: CustomButton( icon: AppAssets.view_report_icon, iconColor: AppColors.primaryRedColor, iconSize: 16.h, text: LocaleKeys.viewResults.tr(context: context), onPressed: () { labViewModel.currentlySelectedPatientOrder = order; labProvider.getPatientLabResultByHospital(order); labProvider.getPatientSpecialResult(order); Navigator.of(context).push( CustomPageRoute(page: LabResultByClinic(labOrder: order)), ); }, backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, textColor: AppColors.primaryRedColor, fontSize: 14, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ) ], ), // SizedBox(height: 12.h), // Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), // SizedBox(height: 12.h), ], ).paddingOnly(top: 16, bottom: 16); }, separatorBuilder: (cxt, index) => Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), itemCount: group.length)) : SizedBox.shrink(), ), ], ), ), ), ), )); }, ) : Utils.getNoDataWidget(context, noDataText: LocaleKeys.noLabResults.tr(context: context))) : // By Test or other tabs keep existing behavior (labViewModel.isLabOrdersLoading) ? Column( children: List.generate( 5, (index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, )), ) : AlphabeticScroll( alpahbetsAvailable: labViewModel.indexedCharacterForUniqueTest, details: labViewModel.uniqueTestsList, labViewModel: labViewModel, rangeViewModel: rangeViewModel, appState: _appState, ) ], )); }, ), ); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file diff --git a/lib/presentation/prescriptions/prescription_item_view.dart b/lib/presentation/prescriptions/prescription_item_view.dart index 03a343f7..1369d4ac 100644 --- a/lib/presentation/prescriptions/prescription_item_view.dart +++ b/lib/presentation/prescriptions/prescription_item_view.dart @@ -84,76 +84,77 @@ class PrescriptionItemView extends StatelessWidget { SizedBox(height: 14.h), Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), SizedBox(height: 14.h), - Row( - mainAxisSize: MainAxisSize.max, - children: [ - Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 35.h, height: 35.h).toShimmer2(isShow: isLoading), - SizedBox(width: 8.h), - Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - LocaleKeys.setReminder.tr(context: context).toText13(isBold: true), - "Notify me before the consumption time".toText10(color: AppColors.textColorLight), - ], - ).toShimmer2(isShow: isLoading).expanded, - Switch( - activeColor: AppColors.successColor, - activeTrackColor: AppColors.successColor.withValues(alpha: .15), - value: isLoading ? false : prescriptionVM.prescriptionDetailsList[index].hasReminder!, - onChanged: (newValue) async { - CalenderUtilsNew calender = CalenderUtilsNew.instance; - - if (prescriptionVM.prescriptionDetailsList[index].hasReminder ?? false) { - LoaderBottomSheet.showLoader(loadingText: "Removing Reminders"); - bool resultValue = await calender.checkAndRemoveMultipleItems(id:prescriptionVM.prescriptionDetailsList[index].itemID.toString()); + Visibility( + visible: (!isLoading && prescriptionVM.prescriptionDetailsList[index].frequencyNumber != 0), + child: Row( + mainAxisSize: MainAxisSize.max, + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 35.h, height: 35.h).toShimmer2(isShow: isLoading), + SizedBox(width: 8.h), + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + LocaleKeys.setReminder.tr(context: context).toText13(isBold: true), + "Notify me before the consumption time".toText10(color: AppColors.textColorLight), + ], + ).toShimmer2(isShow: isLoading).expanded, + Switch( + activeColor: AppColors.successColor, + activeTrackColor: AppColors.successColor.withValues(alpha: .15), + value: isLoading ? false : prescriptionVM.prescriptionDetailsList[index].hasReminder!, + onChanged: (newValue) async { + CalenderUtilsNew calender = CalenderUtilsNew.instance; - prescriptionVM.setPrescriptionItemReminder(newValue, prescriptionVM.prescriptionDetailsList[index]); - LoaderBottomSheet.hideLoader(); - return; - } + if (prescriptionVM.prescriptionDetailsList[index].hasReminder ?? false) { + LoaderBottomSheet.showLoader(loadingText: "Removing Reminders"); + bool resultValue = await calender.checkAndRemoveMultipleItems(id: prescriptionVM.prescriptionDetailsList[index].itemID.toString()); - DateTime startDate = DateTime.now(); - DateTime endDate = DateTime(startDate.year, startDate.month, startDate.day + prescriptionVM.prescriptionDetailsList[index].days!.toInt()); - BottomSheetUtils().showReminderBottomSheet( - context, - endDate, - "", - prescriptionVM.prescriptionDetailsList[index].itemID.toString(), - "", - "", - title: "${prescriptionVM.prescriptionDetailsList[index].itemDescription} Prescription Reminder", - description: - "${prescriptionVM.prescriptionDetailsList[index].itemDescription} ${prescriptionVM.prescriptionDetailsList[index].frequency} ${prescriptionVM.prescriptionDetailsList[index].route} ", - onSuccess: () { + prescriptionVM.setPrescriptionItemReminder(newValue, prescriptionVM.prescriptionDetailsList[index]); + LoaderBottomSheet.hideLoader(); + return; + } - }, - isMultiAllowed: true, - onMultiDateSuccess: (int selectedIndex) async{ - bool isEventAdded = await calender.createMultipleEvents( + DateTime startDate = DateTime.now(); + DateTime endDate = DateTime(startDate.year, startDate.month, startDate.day + prescriptionVM.prescriptionDetailsList[index].days!.toInt()); + BottomSheetUtils().showReminderBottomSheet( + context, + endDate, + "", + prescriptionVM.prescriptionDetailsList[index].itemID.toString(), + "", + "", + title: "${prescriptionVM.prescriptionDetailsList[index].itemDescription} Prescription Reminder", + description: + "${prescriptionVM.prescriptionDetailsList[index].itemDescription} ${prescriptionVM.prescriptionDetailsList[index].frequency} ${prescriptionVM.prescriptionDetailsList[index].route} ", + onSuccess: () {}, + isMultiAllowed: true, + onMultiDateSuccess: (int selectedIndex) async { + bool isEventAdded = await calender.createMultipleEvents( reminderMinutes: selectedIndex, frequencyNumber: prescriptionVM.prescriptionDetailsList[index].frequencyNumber?.toInt(), - days: prescriptionVM.prescriptionDetailsList[index].days!.toInt(), + days: prescriptionVM.prescriptionDetailsList[index].days!.toInt(), orderDate: prescriptionVM.prescriptionDetailsList[index].orderDate!, itemDescriptionN: prescriptionVM.prescriptionDetailsList[index].itemDescription!, route: prescriptionVM.prescriptionDetailsList[index].route!, - onFailure: (errorMessage)=> prescriptionVM.showError(errorMessage), - prescriptionNumber: prescriptionVM.prescriptionDetailsList[index].itemID.toString(), - ); - prescriptionVM.setPrescriptionItemReminder(isEventAdded, prescriptionVM.prescriptionDetailsList[index]); - // setCalender(context, - // eventId: prescriptionVM.prescriptionDetailsList[index].itemID.toString(), - // selectedMinutes: selectedIndex, - // frequencyNumber: prescriptionVM.prescriptionDetailsList[index].frequencyNumber?.toInt(), - // days: prescriptionVM.prescriptionDetailsList[index].days!.toInt(), - // orderDate: prescriptionVM.prescriptionDetailsList[index].orderDate!, - // itemDescriptionN: prescriptionVM.prescriptionDetailsList[index].itemDescription!, - // route: prescriptionVM.prescriptionDetailsList[index].route!); - }, - ); - }, - ).toShimmer2(isShow: isLoading), - ], - ).paddingSymmetrical(16.h, 0.h), + onFailure: (errorMessage) => prescriptionVM.showError(errorMessage), + prescriptionNumber: prescriptionVM.prescriptionDetailsList[index].itemID.toString(), + ); + prescriptionVM.setPrescriptionItemReminder(isEventAdded, prescriptionVM.prescriptionDetailsList[index]); + // setCalender(context, + // eventId: prescriptionVM.prescriptionDetailsList[index].itemID.toString(), + // selectedMinutes: selectedIndex, + // frequencyNumber: prescriptionVM.prescriptionDetailsList[index].frequencyNumber?.toInt(), + // days: prescriptionVM.prescriptionDetailsList[index].days!.toInt(), + // orderDate: prescriptionVM.prescriptionDetailsList[index].orderDate!, + // itemDescriptionN: prescriptionVM.prescriptionDetailsList[index].itemDescription!, + // route: prescriptionVM.prescriptionDetailsList[index].route!); + }, + ); + }, + ).toShimmer2(isShow: isLoading), + ], + ).paddingSymmetrical(16.h, 0.h), + ), SizedBox(height: 14.h), // Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), // Row( diff --git a/lib/presentation/radiology/radiology_orders_page.dart b/lib/presentation/radiology/radiology_orders_page.dart index 2f424361..a07face1 100644 --- a/lib/presentation/radiology/radiology_orders_page.dart +++ b/lib/presentation/radiology/radiology_orders_page.dart @@ -86,19 +86,6 @@ class _RadiologyOrdersPageState extends State { child: Consumer( builder: (context, model, child) { // Build grouping lists if we have data and none constructed yet - if (!model.isRadiologyOrdersLoading && model.patientRadiologyOrders.isNotEmpty && model.patientRadiologyOrdersViewList.isEmpty) { - final clinicMap = >{}; - final hospitalMap = >{}; - for (var order in model.patientRadiologyOrders) { - final clinicKey = (order.clinicDescription ?? 'Unknown').trim(); - clinicMap.putIfAbsent(clinicKey, () => []).add(order); - final hospitalKey = (order.projectName ?? order.projectID ?? 'Unknown').toString().trim(); - hospitalMap.putIfAbsent(hospitalKey, () => []).add(order); - } - model.patientRadiologyOrdersByClinic = clinicMap.values.toList(); - model.patientRadiologyOrdersByHospital = hospitalMap.values.toList(); - model.patientRadiologyOrdersViewList = model.isSortByClinic ? model.patientRadiologyOrdersByClinic : model.patientRadiologyOrdersByHospital; - } return Padding( padding: EdgeInsets.symmetric(horizontal: 24.h), @@ -140,13 +127,12 @@ class _RadiologyOrdersPageState extends State { ), ], ), - SizedBox(height: 8.h), selectedFilterText.isNotEmpty ? AppCustomChipWidget( padding: EdgeInsets.symmetric(horizontal: 5.h), labelText: selectedFilterText, - deleteIcon: 'assets/images/svg/cross_circle.svg', + deleteIcon: AppAssets.close_bottom_sheet_icon, backgroundColor: AppColors.alertColor, textColor: AppColors.whiteColor, deleteIconColor: AppColors.whiteColor, From c2028841c5c2b08c7e19e203711d5f7c26da8923 Mon Sep 17 00:00:00 2001 From: Haroon Amjad <> Date: Tue, 17 Feb 2026 19:11:02 +0300 Subject: [PATCH 03/27] test description issue in lab results fixed --- .../lab/models/resp_models/lab_result.dart | 4 ++ .../lab_order_result_item.dart | 49 +++++++++---------- 2 files changed, 28 insertions(+), 25 deletions(-) diff --git a/lib/features/lab/models/resp_models/lab_result.dart b/lib/features/lab/models/resp_models/lab_result.dart index 23146849..2808dce9 100644 --- a/lib/features/lab/models/resp_models/lab_result.dart +++ b/lib/features/lab/models/resp_models/lab_result.dart @@ -27,6 +27,7 @@ class LabResult { num? resultTypeID; String? packageShortDescription; int? testId; + String? testShortDescription; LabResult( {this.description, @@ -54,6 +55,7 @@ class LabResult { this.criticalLow, this.referenceLow, this.testId, + this.testShortDescription, }); LabResult.fromJson(Map json) { @@ -85,6 +87,7 @@ class LabResult { packageShortDescription = json['PackageShortDescription']; resultTypeID = json['ResultTypeID']; testId = json['TestID']; + testShortDescription = json['TestShortDescription']; } Map toJson() { @@ -114,6 +117,7 @@ class LabResult { data['CriticalLow'] = this.criticalLow; data['ReferenceLow'] = this.referenceLow; data['TestID'] = this.testId; + data['TestShortDescription'] = this.testShortDescription; return data; } diff --git a/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart b/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart index ba97731f..cf6ce97b 100644 --- a/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart +++ b/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart @@ -22,7 +22,7 @@ class LabOrderResultItem extends StatelessWidget { final bool isExpanded; final Color iconColor; - const LabOrderResultItem({super.key, required this.onTap, this.tests, required this.index, this.isLoading = false, this.isExpanded = false,required this.iconColor, required this.severityText}); + const LabOrderResultItem({super.key, required this.onTap, this.tests, required this.index, this.isLoading = false, this.isExpanded = false, required this.iconColor, required this.severityText}); @override build(BuildContext context) { @@ -42,7 +42,10 @@ class LabOrderResultItem extends StatelessWidget { padding: EdgeInsets.only(bottom: 8.h), child: '${tests!.description}'.toText14(weight: FontWeight.w500), ), - (tests!.packageShortDescription ?? "").toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + // (tests!.packageShortDescription ?? "").toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), + + ((tests!.testShortDescription != null && tests!.testShortDescription!.isNotEmpty) ? tests!.testShortDescription : tests!.packageShortDescription)! + .toText12(fontWeight: FontWeight.w500, color: AppColors.textColorLight), SizedBox(height: 12.h), Directionality( textDirection: ui.TextDirection.ltr, @@ -65,28 +68,30 @@ class LabOrderResultItem extends StatelessWidget { ), ), ), - SizedBox(width: 4.h,), + SizedBox( + width: 4.h, + ), Visibility( // visible: tests?.checkIfGraphShouldBeDisplayed() == true, visible: true, child: Expanded( flex: 2, - child: Visibility( - visible: tests?.referanceRange != null, - child: Text( - "(${LocaleKeys.referenceRange.tr(context: context)}: ${tests?.referanceRange})", - style: TextStyle( - fontSize: 12.f, - fontWeight: FontWeight.w500, - fontFamily: 'Poppins', - color: AppColors.greyTextColor, + child: Visibility( + visible: tests?.referanceRange != null, + child: Text( + "(${LocaleKeys.referenceRange.tr(context: context)}: ${tests?.referanceRange})", + style: TextStyle( + fontSize: 12.f, + fontWeight: FontWeight.w500, + fontFamily: 'Poppins', + color: AppColors.greyTextColor, + ), + // overflow: TextOverflow.ellipsis, + // maxLines: 2, + softWrap: true, ), - // overflow: TextOverflow.ellipsis, - // maxLines: 2, - softWrap: true, ), ), - ), ) ], ), @@ -102,14 +107,8 @@ class LabOrderResultItem extends StatelessWidget { spacing: 6.h, crossAxisAlignment: CrossAxisAlignment.start, children: [ - severityText.tr().toText10( - weight: FontWeight.w500, - color: AppColors.greyTextColor), - Utils.buildSvgWithAssets( - icon: AppAssets.lab_result_indicator, - width: 21, - height: 23, - iconColor: iconColor), + severityText.tr().toText10(weight: FontWeight.w500, color: AppColors.greyTextColor), + Utils.buildSvgWithAssets(icon: AppAssets.lab_result_indicator, width: 21, height: 23, iconColor: iconColor), ], ), ), @@ -119,7 +118,7 @@ class LabOrderResultItem extends StatelessWidget { iconSize: 16.h, text: LocaleKeys.viewReport.tr(context: context), onPressed: () { - onTap(); + onTap(); }, backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, From 84224ae61b79a45fc05e47508bfbcb8459a1f732 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 18 Feb 2026 13:04:55 +0300 Subject: [PATCH 04/27] sickleave & medical report fixes --- lib/core/api/api_client.dart | 2 +- .../emergency_services_repo.dart | 2 +- .../medical_file/medical_file_view_model.dart | 21 +++++--- .../medical_report/medical_reports_page.dart | 50 +++++-------------- 4 files changed, 29 insertions(+), 46 deletions(-) diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index b17db626..00362bdb 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -195,7 +195,7 @@ class ApiClientImp implements ApiClient { } // body['TokenID'] = "@dm!n"; - // body['PatientID'] = 4773715; + // body['PatientID'] = 4774018; // body['PatientTypeID'] = 1; // body['PatientOutSA'] = 0; // body['SessionID'] = "45786230487560q"; diff --git a/lib/features/emergency_services/emergency_services_repo.dart b/lib/features/emergency_services/emergency_services_repo.dart index c63f0ee6..f8eb896f 100644 --- a/lib/features/emergency_services/emergency_services_repo.dart +++ b/lib/features/emergency_services/emergency_services_repo.dart @@ -183,7 +183,7 @@ class EmergencyServicesRepoImp implements EmergencyServicesRepo { @override Future>>> getProjectList() async { - Map request = {}; + Map request = {'IsOnlineCheckIn': false, 'IsAdvancePayment': false, 'IsForER': true}; try { GenericApiModel>? apiResponse; diff --git a/lib/features/medical_file/medical_file_view_model.dart b/lib/features/medical_file/medical_file_view_model.dart index 9e50075f..b93bb62d 100644 --- a/lib/features/medical_file/medical_file_view_model.dart +++ b/lib/features/medical_file/medical_file_view_model.dart @@ -41,7 +41,7 @@ class MedicalFileViewModel extends ChangeNotifier { List patientSickLeavesViewList = []; bool isSickLeavesSortByClinic = true; - bool isSickLeavesDataNeedsReloading = true; + // bool isSickLeavesDataNeedsReloading = true; List patientAllergiesList = []; @@ -164,7 +164,7 @@ class MedicalFileViewModel extends ChangeNotifier { } setIsPatientSickLeaveListLoading(bool val) { - if (val && isSickLeavesDataNeedsReloading) { + // if (val && isSickLeavesDataNeedsReloading) { patientSickLeaveList.clear(); patientSickLeavesByClinic.clear(); patientSickLeavesByHospital.clear(); @@ -172,7 +172,7 @@ class MedicalFileViewModel extends ChangeNotifier { patientSickLeavePDFBase64 = ""; isSickLeavesSortByClinic = true; isPatientSickLeaveListLoading = val; - } + // } notifyListeners(); } @@ -268,11 +268,13 @@ class MedicalFileViewModel extends ChangeNotifier { } Future getPatientSickLeaveList({Function(dynamic)? onSuccess, Function(String)? onError}) async { - if (!isSickLeavesDataNeedsReloading) { - return; - } + // if (!isSickLeavesDataNeedsReloading) { + // return; + // } patientSickLeaveList.clear(); + notifyListeners(); + final result = await medicalFileRepo.getPatientSickLeavesList(); result.fold( @@ -314,7 +316,7 @@ class MedicalFileViewModel extends ChangeNotifier { } } patientSickLeavesViewList = patientSickLeavesByClinic; - isSickLeavesDataNeedsReloading = false; + // isSickLeavesDataNeedsReloading = false; notifyListeners(); if (onSuccess != null) { @@ -353,6 +355,11 @@ class MedicalFileViewModel extends ChangeNotifier { Future getPatientMedicalReportList({Function(dynamic)? onSuccess, Function(String)? onError}) async { patientMedicalReportList.clear(); + patientMedicalReportRequestedList.clear(); + patientMedicalReportReadyList.clear(); + patientMedicalReportCancelledList.clear(); + notifyListeners(); + final result = await medicalFileRepo.getPatientMedicalReportsList(); result.fold( diff --git a/lib/presentation/medical_report/medical_reports_page.dart b/lib/presentation/medical_report/medical_reports_page.dart index 87420fd5..02a9bdec 100644 --- a/lib/presentation/medical_report/medical_reports_page.dart +++ b/lib/presentation/medical_report/medical_reports_page.dart @@ -17,6 +17,7 @@ import 'package:hmg_patient_app_new/presentation/medical_report/widgets/patient_ import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; @@ -251,46 +252,21 @@ class _MedicalReportsPageState extends State { ], ), SizedBox(height: 8.h), - Row( + Wrap( + alignment: WrapAlignment.start, + direction: Axis.horizontal, + spacing: 6.h, + runSpacing: 6.h, children: [ - CustomButton( - text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(report.appointmentDate), false), - onPressed: () {}, - backgroundColor: AppColors.greyColor, - borderColor: AppColors.greyColor, - textColor: AppColors.blackColor, - fontSize: 10, - fontWeight: FontWeight.w500, - borderRadius: 8, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 24.h, + AppCustomChipWidget( + labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(report.appointmentDate), false), ), - SizedBox(width: 8.h), - CustomButton( - text: medicalFileVM.isMedicalReportsSortByClinic ? report.projectName! : report.clinicDescription!, - onPressed: () {}, - backgroundColor: AppColors.greyColor, - borderColor: AppColors.greyColor, - textColor: AppColors.blackColor, - fontSize: 10, - fontWeight: FontWeight.w500, - borderRadius: 8, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 24.h, - ), - SizedBox(width: 8.h), - CustomButton( - text: report.statusDesc!, - onPressed: () {}, - backgroundColor: AppColors.greyColor, - borderColor: AppColors.greyColor, - textColor: AppColors.blackColor, - fontSize: 10, - fontWeight: FontWeight.w500, - borderRadius: 8, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 24.h, + AppCustomChipWidget( + labelText: medicalFileVM.isMedicalReportsSortByClinic ? report.projectName! : report.clinicDescription!, ), + report.statusDesc != null ? AppCustomChipWidget( + labelText: report.statusDesc ?? "test", + ) : SizedBox.shrink(), ], ), SizedBox(height: 8.h), From 6cc058e86db6e8e9d310ba78ae58560b29d50215 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 18 Feb 2026 14:53:14 +0300 Subject: [PATCH 05/27] updates --- lib/core/api_consts.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index de9f28f0..f3b946e8 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -4,7 +4,7 @@ import 'package:hmg_patient_app_new/core/enums.dart'; class ApiConsts { static const maxSmallScreen = 660; - static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT @@ -110,6 +110,8 @@ class ApiConsts { } } + static final String sendPatientUpdateRequest = 'Services/OUTPs.svc/REST/PatientCompanyUpdate'; + static final String selectDeviceImei = 'Services/Patients.svc/REST/Patient_SELECTDeviceIMEIbyIMEI'; static final String checkPatientAuth = 'Services/Authentication.svc/REST/CheckPatientAuthentication'; From d9013a1dc2665f85e2ff833406fe15279bb16a2b Mon Sep 17 00:00:00 2001 From: Haroon Amjad <> Date: Thu, 19 Feb 2026 02:41:26 +0300 Subject: [PATCH 06/27] Added immediate patient insurance update API --- lib/core/api/api_client.dart | 2 +- lib/core/api_consts.dart | 4 +- .../book_appointments_view_model.dart | 6 +- .../immediate_livecare_repo.dart | 4 +- .../immediate_livecare_view_model.dart | 22 +++-- .../my_appointments/my_appointments_repo.dart | 54 ++++++++--- .../my_appointments_view_model.dart | 93 ++++++++++--------- ...select_immediate_livecare_clinic_page.dart | 27 ++++-- .../book_appointment/select_clinic_page.dart | 27 ++++-- 9 files changed, 152 insertions(+), 87 deletions(-) diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 00362bdb..2c41b86f 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -195,7 +195,7 @@ class ApiClientImp implements ApiClient { } // body['TokenID'] = "@dm!n"; - // body['PatientID'] = 4774018; + // body['PatientID'] = 4773989; // body['PatientTypeID'] = 1; // body['PatientOutSA'] = 0; // body['SessionID'] = "45786230487560q"; diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index f3b946e8..708324eb 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -110,8 +110,6 @@ class ApiConsts { } } - static final String sendPatientUpdateRequest = 'Services/OUTPs.svc/REST/PatientCompanyUpdate'; - static final String selectDeviceImei = 'Services/Patients.svc/REST/Patient_SELECTDeviceIMEIbyIMEI'; static final String checkPatientAuth = 'Services/Authentication.svc/REST/CheckPatientAuthentication'; @@ -918,6 +916,8 @@ var GET_PRESCRIPTION_INSTRUCTIONS_PDF = 'Services/ChatBot_Service.svc/REST/Chatb const DASHBOARD = 'Services/Patients.svc/REST/PatientDashboard'; +const SEND_PATIENT_IMMEDIATE_UPDATE_INSURANCE_REQUEST = 'Services/OUTPs.svc/REST/PatientCompanyUpdate'; + class ApiKeyConstants { static final String googleMapsApiKey = 'AIzaSyB6TERnxIr0yJ3qG4ULBZbu0sAD4tGqtng'; } diff --git a/lib/features/book_appointments/book_appointments_view_model.dart b/lib/features/book_appointments/book_appointments_view_model.dart index c6c5faf8..3132dc8c 100644 --- a/lib/features/book_appointments/book_appointments_view_model.dart +++ b/lib/features/book_appointments/book_appointments_view_model.dart @@ -464,7 +464,11 @@ class BookAppointmentsViewModel extends ChangeNotifier { final result = await bookAppointmentsRepo.getLiveCareScheduleClinics(_appState.getAuthenticatedUser()!.age!, _appState.getAuthenticatedUser()!.gender!); result.fold( - (failure) async => await errorHandlerService.handleError(failure: failure), + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) async { + isClinicsListLoading = false; + notifyListeners(); + }, (apiResponse) { if (apiResponse.messageStatus == 2) { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); diff --git a/lib/features/immediate_livecare/immediate_livecare_repo.dart b/lib/features/immediate_livecare/immediate_livecare_repo.dart index eee4adba..cbce4ea2 100644 --- a/lib/features/immediate_livecare/immediate_livecare_repo.dart +++ b/lib/features/immediate_livecare/immediate_livecare_repo.dart @@ -89,7 +89,7 @@ class ImmediateLiveCareRepoImp implements ImmediateLiveCareRepo { body: mapDevice, onFailure: (error, statusCode, {messageStatus, failureType}) { failure = failureType; - onError!(error); + // onError!(error); }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { try { @@ -142,7 +142,7 @@ class ImmediateLiveCareRepoImp implements ImmediateLiveCareRepo { body: mapDevice, onFailure: (error, statusCode, {messageStatus, failureType}) { failure = failureType; - onError!(error); + // onError!(error); }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { try { diff --git a/lib/features/immediate_livecare/immediate_livecare_view_model.dart b/lib/features/immediate_livecare/immediate_livecare_view_model.dart index 90bf9a08..46f5a652 100644 --- a/lib/features/immediate_livecare/immediate_livecare_view_model.dart +++ b/lib/features/immediate_livecare/immediate_livecare_view_model.dart @@ -174,13 +174,21 @@ class ImmediateLiveCareViewModel extends ChangeNotifier { }, onConfirmTap: () async { Navigator.pop(GetIt.instance().navigatorKey.currentContext!); - Navigator.pop(GetIt.instance().navigatorKey.currentContext!); - Navigator.push( - GetIt.instance().navigatorKey.currentContext!, - CustomPageRoute( - page: InsuranceHomePage(), - ), - ); + + //Call the API to attempt updating patient insurance + LoaderBottomSheet.showLoader(); + myAppointmentsViewModel.sendPatientUpdateRequest(onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + getLiveCareImmediateAppointmentFees(); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + Navigator.push( + GetIt.instance().navigatorKey.currentContext!, + CustomPageRoute( + page: InsuranceHomePage(), + ), + ); + }); }), ), callBackFunc: () { // Navigator.pop(GetIt.instance().navigatorKey.currentContext!); diff --git a/lib/features/my_appointments/my_appointments_repo.dart b/lib/features/my_appointments/my_appointments_repo.dart index 0c76c9fa..567714c6 100644 --- a/lib/features/my_appointments/my_appointments_repo.dart +++ b/lib/features/my_appointments/my_appointments_repo.dart @@ -20,7 +20,8 @@ import 'models/req_model/appointment_rate_req_model.dart'; import 'models/resp_models/appointment_details_resp_model.dart'; abstract class MyAppointmentsRepo { - Future>>> getPatientAppointments({required bool isActiveAppointment, required bool isArrivedAppointments, bool isForEyeMeasurement = false}); + Future>>> getPatientAppointments( + {required bool isActiveAppointment, required bool isArrivedAppointments, bool isForEyeMeasurement = false}); Future>> getPatientShareAppointment( {required int projectID, required int clinicID, required String appointmentNo, required bool isLiveCareAppointment}); @@ -67,14 +68,16 @@ abstract class MyAppointmentsRepo { Future>> getAppointmentDetails(int appointmentID, int projectID); - Future>> sendAppointmentRate(int rate, int appointmentNo, int projectID, int doctorID, int clinicID, String note); - Future>> sendDoctorRate(int rate, int appointmentNo, int projectID, int doctorID, int clinicID, String note, String appoDate, String docName, String projectName, String clinicName); + Future>> sendDoctorRate( + int rate, int appointmentNo, int projectID, int doctorID, int clinicID, String note, String appoDate, String docName, String projectName, String clinicName); Future>>> getPatientAppointmentQueueDetails({required int appointmentNo, required int patientID}); Future>> convertPatientToCash({required int projectID}); + + Future>> sendPatientUpdateRequest(); } class MyAppointmentsRepoImp implements MyAppointmentsRepo { @@ -194,9 +197,7 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo { "AppointmentNo": appointmentNo, "PaymentMethodName": paymentMethodName, "PaymentAmount": payedAmount == 0 ? "0" : payedAmount.toString(), - "PaymentDate": payedAmount == 0 ? "" : "/Date(${DateTime - .now() - .millisecondsSinceEpoch})/", + "PaymentDate": payedAmount == 0 ? "" : "/Date(${DateTime.now().millisecondsSinceEpoch})/", "PaymentReferenceNumber": payedAmount == 0 ? "" : paymentReference, "ProjectID": projectID, "PatientID": patientID, @@ -865,10 +866,8 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo { } } - @override - Future>> sendAppointmentRate(int rate, int appointmentNo, int projectID, int doctorID, int clinicID, String note) async { - + Future>> sendAppointmentRate(int rate, int appointmentNo, int projectID, int doctorID, int clinicID, String note) async { AppointmentRate appointmentRate = AppointmentRate(); appointmentRate.rate = rate; appointmentRate.appointmentNo = appointmentNo; @@ -879,7 +878,6 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo { appointmentRate.createdBy = 2; appointmentRate.editedBy = 2; - try { GenericApiModel? apiResponse; Failure? failure; @@ -908,7 +906,8 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo { } @override - Future>> sendDoctorRate(int rate, int appointmentNo, int projectID, int doctorID, int clinicID, String note, String appoDate, String docName, String projectName, String clinicName) async { + Future>> sendDoctorRate( + int rate, int appointmentNo, int projectID, int doctorID, int clinicID, String note, String appoDate, String docName, String projectName, String clinicName) async { Map request; request = { @@ -991,4 +990,35 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo { return Left(UnknownFailure(e.toString())); } } -} \ No newline at end of file + + @override + Future> sendPatientUpdateRequest() async { + Map request = {}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post(SEND_PATIENT_IMMEDIATE_UPDATE_INSURANCE_REQUEST, onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = (response['MessageStatus'] == 1); + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: list, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, body: request); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/my_appointments/my_appointments_view_model.dart b/lib/features/my_appointments/my_appointments_view_model.dart index 35bf29bf..f8876803 100644 --- a/lib/features/my_appointments/my_appointments_view_model.dart +++ b/lib/features/my_appointments/my_appointments_view_model.dart @@ -54,9 +54,6 @@ class MyAppointmentsViewModel extends ChangeNotifier { List patientQueueDetailsList = []; late PatientQueueDetails currentPatientQueueDetails; - - - List patientAppointmentsHistoryList = []; List filteredAppointmentList = []; @@ -344,10 +341,8 @@ class MyAppointmentsViewModel extends ChangeNotifier { notifyListeners(); } - Future getPatientShareAppointment(int projectID, int clinicID, String appointmentNo, bool isLiveCareAppointment, - {Function(dynamic)? onSuccess, Function(String)? onError}) async { - final result = await myAppointmentsRepo.getPatientShareAppointment( - projectID: projectID, clinicID: clinicID, appointmentNo: appointmentNo, isLiveCareAppointment: isLiveCareAppointment); + Future getPatientShareAppointment(int projectID, int clinicID, String appointmentNo, bool isLiveCareAppointment, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.getPatientShareAppointment(projectID: projectID, clinicID: clinicID, appointmentNo: appointmentNo, isLiveCareAppointment: isLiveCareAppointment); result.fold( (failure) async { @@ -421,13 +416,23 @@ class MyAppointmentsViewModel extends ChangeNotifier { }, onConfirmTap: () async { Navigator.pop(GetIt.instance().navigatorKey.currentContext!); - Navigator.pop(GetIt.instance().navigatorKey.currentContext!); - Navigator.push( - GetIt.instance().navigatorKey.currentContext!, - CustomPageRoute( - page: InsuranceHomePage(), - ), - ); + + //Call the API to attempt updating patient insurance + LoaderBottomSheet.showLoader(); + sendPatientUpdateRequest(onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + setIsPatientAppointmentShareLoading(true); + getPatientShareAppointment(projectID, clinicID, appointmentNo, isLiveCareAppointment); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + Navigator.pop(GetIt.instance().navigatorKey.currentContext!); + Navigator.push( + GetIt.instance().navigatorKey.currentContext!, + CustomPageRoute( + page: InsuranceHomePage(), + ), + ); + }); }), ), callBackFunc: () { // Navigator.pop(GetIt.instance().navigatorKey.currentContext!); @@ -443,6 +448,27 @@ class MyAppointmentsViewModel extends ChangeNotifier { ); } + Future sendPatientUpdateRequest({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.sendPatientUpdateRequest(); + + result.fold( + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + Future convertPatientToCash({required int projectID, Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await myAppointmentsRepo.convertPatientToCash(projectID: projectID); @@ -465,13 +491,8 @@ class MyAppointmentsViewModel extends ChangeNotifier { } Future addAdvanceNumberRequest( - {required String advanceNumber, - required String paymentReference, - required String appointmentNo, - Function(dynamic)? onSuccess, - Function(String)? onError}) async { - final result = - await myAppointmentsRepo.addAdvanceNumberRequest(advanceNumber: advanceNumber, paymentReference: paymentReference, appointmentNo: appointmentNo); + {required String advanceNumber, required String paymentReference, required String appointmentNo, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.addAdvanceNumberRequest(advanceNumber: advanceNumber, paymentReference: paymentReference, appointmentNo: appointmentNo); result.fold( (failure) async => await errorHandlerService.handleError(failure: failure), @@ -489,14 +510,8 @@ class MyAppointmentsViewModel extends ChangeNotifier { } Future generateAppointmentQR( - {required int clinicID, - required int projectID, - required String appointmentNo, - required int isFollowUp, - Function(dynamic)? onSuccess, - Function(String)? onError}) async { - final result = - await myAppointmentsRepo.generateAppointmentQR(clinicID: clinicID, projectID: projectID, appointmentNo: appointmentNo, isFollowUp: isFollowUp); + {required int clinicID, required int projectID, required String appointmentNo, required int isFollowUp, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.generateAppointmentQR(clinicID: clinicID, projectID: projectID, appointmentNo: appointmentNo, isFollowUp: isFollowUp); result.fold( (failure) async => await errorHandlerService.handleError(failure: failure), @@ -513,14 +528,13 @@ class MyAppointmentsViewModel extends ChangeNotifier { ); } - Future cancelAppointment( - {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { + Future cancelAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await myAppointmentsRepo.cancelAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); result.fold( // (failure) async => await errorHandlerService.handleError(failure: failure), (failure) async { - if(onError != null) { + if (onError != null) { onError(failure.message); } }, @@ -538,8 +552,7 @@ class MyAppointmentsViewModel extends ChangeNotifier { ); } - Future confirmAppointment( - {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { + Future confirmAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await myAppointmentsRepo.confirmAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); result.fold( @@ -600,8 +613,7 @@ class MyAppointmentsViewModel extends ChangeNotifier { required int checkInType, Function(dynamic)? onSuccess, Function(String)? onError}) async { - final result = await myAppointmentsRepo.sendCheckInNfcRequest( - patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, scannedCode: scannedCode, checkInType: checkInType); + final result = await myAppointmentsRepo.sendCheckInNfcRequest(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, scannedCode: scannedCode, checkInType: checkInType); result.fold( (failure) async => await errorHandlerService.handleError(failure: failure), @@ -647,12 +659,8 @@ class MyAppointmentsViewModel extends ChangeNotifier { } Future insertLiveCareVIDARequest( - {required clientRequestID, - required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, - Function(dynamic)? onSuccess, - Function(String)? onError}) async { - final result = await myAppointmentsRepo.insertLiveCareVIDARequest( - clientRequestID: clientRequestID, patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); + {required clientRequestID, required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.insertLiveCareVIDARequest(clientRequestID: clientRequestID, patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); result.fold( (failure) async => await errorHandlerService.handleError(failure: failure), @@ -928,5 +936,4 @@ class MyAppointmentsViewModel extends ChangeNotifier { }, ); } - } diff --git a/lib/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart b/lib/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart index 594bff0d..a83dfa05 100644 --- a/lib/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart +++ b/lib/presentation/book_appointment/livecare/select_immediate_livecare_clinic_page.dart @@ -116,7 +116,7 @@ class _SelectImmediateLiveCareClinicPageState extends State { padding: EdgeInsets.only(top: 24.h), shrinkWrap: true, physics: NeverScrollableScrollPhysics(), - itemCount: bookAppointmentsVM.isClinicsListLoading ? 5 : bookAppointmentsVM.liveCareClinicsList.length, + itemCount: bookAppointmentsVM.isClinicsListLoading + ? 5 + : bookAppointmentsVM.liveCareClinicsList.isNotEmpty + ? bookAppointmentsVM.liveCareClinicsList.length + : 1, + + // bookAppointmentsVM.isClinicsListLoading ? 5 : bookAppointmentsVM.liveCareClinicsList.length, + itemBuilder: (context, index) { return bookAppointmentsVM.isClinicsListLoading ? ClinicCard( @@ -163,14 +170,16 @@ class _SelectClinicPageState extends State { duration: Duration(milliseconds: 300), curve: Curves.easeInOut, decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), - child: ClinicCard( - bookAppointmentsVM: bookAppointmentsVM, - liveCareClinicsResponseModel: bookAppointmentsVM.liveCareClinicsList[index], - clinicsListResponseModel: GetClinicsListResponseModel(), - isLoading: bookAppointmentsVM.isClinicsListLoading, - ).onPress(() { - onLiveCareClinicSelected(bookAppointmentsVM.liveCareClinicsList[index]); - }), + child: bookAppointmentsVM.liveCareClinicsList.isNotEmpty + ? ClinicCard( + bookAppointmentsVM: bookAppointmentsVM, + liveCareClinicsResponseModel: bookAppointmentsVM.liveCareClinicsList[index], + clinicsListResponseModel: GetClinicsListResponseModel(), + isLoading: bookAppointmentsVM.isClinicsListLoading, + ).onPress(() { + onLiveCareClinicSelected(bookAppointmentsVM.liveCareClinicsList[index]); + }) + : Utils.getNoDataWidget(context), ), ), ), From cf3c14281c1e362b1d705c5ad7add73b441e1f46 Mon Sep 17 00:00:00 2001 From: "Fatimah.Alshammari" Date: Thu, 19 Feb 2026 11:13:15 +0300 Subject: [PATCH 07/27] fixed Ar En files --- assets/langs/ar-SA.json | 26 +++++++++++++------------- assets/langs/en-US.json | 3 ++- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 3ec0a8a8..8e7fb9e8 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -1545,19 +1545,19 @@ "bmrNormalDescription": "معدل الأيض الأساسي لديك ضمن النطاق المتوقع لحالتك. معدل الأيض الأساسي هو الطاقة التي يحتاجها جسمك في حالة الراحة للحفاظ على وظائفه الحيوية (التنفس، الدورة الدموية، درجة الحرارة). استخدم هذه القيمة كأساس لتقدير إجمالي احتياجاتك اليومية من الطاقة من خلال تطبيق مُعامل النشاط. حافظ على نظام غذائي متوازن وممارسة النشاط البدني بانتظام لدعم صحة التمثيل الغذائي.", "bmrLowDescription": "معدل الأيض الأساسي لديك أقل من المعدل الطبيعي لحالتك. تشمل الأسباب المحتملة انخفاض كتلة العضلات، أو تراجع التمثيل الغذائي المرتبط بالتقدم في السن، أو التكيف الأيضي الناتج عن تقييد السعرات الحرارية لفترة طويلة. يُنصح بالتركيز على تمارين المقاومة لبناء العضلات والحفاظ عليها، والتأكد من تناول كميات كافية من البروتين والمغذيات الدقيقة، واستشارة أخصائي رعاية صحية إذا كان هذا الأمر غير متوقع.", "bmrHighDescription": "معدل الأيض الأساسي لديك أعلى من المتوسط \u200B\u200Bبالنسبة لحالتك. قد يعكس هذا زيادة في كتلة العضلات، أو صغر السن، أو ارتفاع معدل الأيض لديك بشكل طبيعي، مما يعني أنك تحرق طاقة أكبر أثناء الراحة. استخدم هذه المعلومات لتحديد احتياجاتك من السعرات الحرارية: احتياجات أعلى للحفاظ على الوزن أو بناء العضلات، ونقص معتدل في السعرات الحرارية لإنقاص الوزن. استشر طبيبك إذا لاحظت أي تغيرات سريعة غير مبررة.", - "ibwAtTargetDescription": "Your weight is at the ideal target. Maintain your current habits — balanced diet and regular activity — to keep this.", - "ibwBelowTargetDescription": "You are below the ideal weight by {kg} kg. Aim to gradually increase weight with a modest calorie surplus, nutrient-dense foods, and resistance training.", - "ibwAboveTargetDescription": "You are above the ideal weight by {kg} kg. Aim for a gradual, sustainable weight reduction through a moderate calorie deficit, increased activity, and balanced nutrition.", - "ibwCloseToRangeDescription": "Your weight is close to the ideal range. Maintain a balanced diet and regular activity; follow personalized advice from a healthcare professional if needed.", - "ibwUnderweightDescription": "You are below the ideal weight by {kg} kg. Focus on increasing calorie intake with nutrient-dense foods, prioritize protein and resistance training to build healthy mass, and consider consulting a healthcare professional.", - "ibwUnderweightGenericDescription": "You appear underweight compared to the ideal. Consider increasing calorie intake with nutrient-dense foods and resistance training; seek professional guidance if needed.", - "ibwOverweightDescription": "You are above the ideal weight by {kg} kg. Aim for a gradual, sustainable weight loss strategy — moderate calorie deficit, regular physical activity, and balanced nutrition. Consult a professional before major changes.", - "ibwOverweightGenericDescription": "You appear above the ideal weight. Consider a gradual, sustainable calorie deficit combined with activity and balanced nutrition; consult a professional if needed.", - "dietVeryLowCarbsDescription": "Very low‑carb (ketogenic) approach: minimal carbohydrates, higher fat and moderate protein. May support rapid weight loss and improved blood sugar control for some, but can be hard to sustain and may cause nutrient gaps. Monitor hydration/electrolytes and consult a professional for long‑term use.", - "dietLowCarbsDescription": "Low‑carb, higher‑protein plan: reduced carbohydrates with increased protein to support satiety and muscle maintenance. Helpful for weight management and glycemic control when balanced with vegetables and healthy fats. Ensure adequate fiber and micronutrients.", - "dietModerateCarbsDescription": "Moderate carbohydrate intake with balanced protein and fats: provides steady energy for daily activity and exercise while allowing flexibility. Suitable for many people aiming for sustainable weight management and performance.", - "dietUSDAGuidelinesDescription": "USDA‑based balanced pattern: emphasizes fruits, vegetables, whole grains, lean proteins, and limited added sugars and saturated fats. Evidence‑based framework for general health, nutrient adequacy, and chronic disease prevention.", - "dietZoneDietDescription": "Zone Diet (~40% carbs / 30% protein / 30% fat): emphasizes hormonal balance and portion control. May improve body composition and energy for some, but requires planning; personalize with a nutrition professional.", + "ibwAtTargetDescription": "وزنك في النطاق المثالي. حافظ على عاداتك الحالية — نظام غذائي متوازن ونشاط بدني منتظم — للاستمرار على هذا المستوى.", + "ibwBelowTargetDescription": "أنتِ أقل من الوزن المثالي بمقدار {kg} كجم. يُنصح بزيادة الوزن تدريجيًا من خلال فائضٍ بسيط في السعرات الحرارية، وتناول أطعمة غنية بالعناصر الغذائية، مع ممارسة تمارين المقاومة.", + "ibwAboveTargetDescription": "أنتِ أعلى من الوزن المثالي بمقدار {kg} كجم. يُنصح باتباع خفضٍ تدريجي ومستدام للوزن من خلال عجزٍ معتدل في السعرات الحرارية، وزيادة مستوى النشاط البدني، واتباع تغذية متوازنة.", + "ibwCloseToRangeDescription": "وزنك قريب من النطاق المثالي. حافظ على نظام غذائي متوازن ونشاط بدني منتظم، مع اتباع إرشادات شخصية من مختص صحي عند الحاجة.", + "ibwUnderweightDescription": "أنت أقل من الوزن المثالي بمقدار {kg} كجم. ركّز على زيادة السعرات الحرارية من خلال أطعمة غنية بالعناصر الغذائية، وأعط الأولوية للبروتين وتمارين المقاومة لبناء كتلة صحية، مع اتباع إرشادات شخصية من مختص صحي.", + "ibwUnderweightGenericDescription": "يبدو أنكِ أقل من الوزن المثالي. يُنصح بزيادة السعرات الحرارية من خلال أطعمة غنية بالعناصر الغذائية وممارسة تمارين المقاومة؛ مع الحصول على استشارة مختص صحي عند الحاجة.", + "ibwOverweightDescription": "أنت أعلى من الوزن المثالي بمقدار {kg} كجم. يُنصح باتباع استراتيجية تدريجية ومستدامة لفقدان الوزن — من خلال عجزٍ معتدل في السعرات الحرارية، وممارسة نشاط بدني منتظم، وتغذية متوازنة. يُفضّل استشارة مختص صحي قبل إجراء تغييرات كبيرة.", + "ibwOverweightGenericDescription": "يبدو أنك أعلى من الوزن المثالي. يُنصح باتباع عجزٍ تدريجي ومستدام في السعرات الحرارية مع ممارسة النشاط البدني واتباع تغذية متوازنة؛ مع الحصول على استشارة مختص صحي عند الحاجة.", + "dietVeryLowCarbsDescription": "نهج منخفض الكربوهيدرات جدًا (الكيتوني): تقليل الكربوهيدرات إلى الحد الأدنى مع زيادة الدهون وبروتين معتدل. قد يساعد على فقدان الوزن بسرعة وتحسين التحكم في سكر الدم لدى بعض الأشخاص، لكنه قد يكون صعب الاستمرار عليه وقد يسبب نقصًا في بعض العناصر الغذائية. يجب مراقبة الترطيب ، والحصول على استشارة مختص صحي عند استخدامه لفترة طويلة.", + "dietLowCarbsDescription": "خطة منخفضة الكربوهيدرات وعالية البروتين: تقليل الكربوهيدرات مع زيادة البروتين لدعم الشعور بالشبع والحفاظ على الكتلة العضلية. مفيدة لإدارة الوزن وضبط سكر الدم عند موازنتها مع الخضروات والدهون الصحية. احرص على الحصول على كمية كافية من الألياف والعناصر الدقيقة (الفيتامينات والمعادن).", + "dietModerateCarbsDescription": "تناول معتدل للكربوهيدرات مع توازن في البروتين والدهون: يوفر طاقة مستقرة للأنشطة اليومية والتمارين مع قدر من المرونة. مناسب لكثير من الأشخاص الذين يسعون لإدارة وزن مستدامة وتحسين الأداء.", + "dietUSDAGuidelinesDescription": "نمط متوازن مستند إلى (USDA): يركز على الفواكه والخضروات والحبوب الكاملة والبروتينات قليلة الدهن، مع الحد من السكريات المضافة والدهون المشبعة. يُعد إطارًا قائمًا على الأدلة لدعم الصحة العامة، وكفاية العناصر الغذائية، والوقاية من الأمراض المزمنة.", + "dietZoneDietDescription": "حمية الزون (~40٪ كربوهيدرات / 30٪ بروتين / 30٪ دهون): تركز على التوازن الهرموني وضبط الحصص الغذائية. قد تُحسّن تركيب الجسم ومستوى الطاقة لدى بعض الأشخاص، لكنها تتطلب تخطيطًا جيدًا؛ ويُفضّل تخصيصها بالتعاون مع مختص تغذية.", "contextDependent": "يعتمد السياق", "calculatedValue": "القيمة المحسوبة", "calculationFormula": "صيغة الحساب", diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index bf73d6da..7617a089 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1572,5 +1572,6 @@ "reschedulingAppo": "Rescheduling Appointment, Please wait...", "invalidEligibility": "You cannot make online payment because you are not eligible to use the provided service.", "invalidInsurance": "You cannot make online payment because you do not have a valid insurance.", - "continueCash": "Continue as cash" + "continueCash": "Continue as cash", + "timeFor": "Time For" } From dffed5df6bb436538010eef683b03fcf10c9380e Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 19 Feb 2026 14:06:27 +0300 Subject: [PATCH 08/27] Insurance approvals page fixes --- assets/langs/ar-SA.json | 17 ++-- assets/langs/en-US.json | 3 +- lib/core/api/api_client.dart | 4 +- ...ent_insurance_approval_response_model.dart | 12 ++- lib/features/lab/lab_repo.dart | 2 +- lib/generated/locale_keys.g.dart | 1 + .../hmg_services/services_page.dart | 2 + .../insurance_approval_details_page.dart | 93 +++++++++++++------ 8 files changed, 88 insertions(+), 46 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 76e10ea3..69a33578 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -488,7 +488,7 @@ "services2": "الخدمات", "cantSeeProfile": "لرؤية ملفك الطبي، يرجى تسجيل الدخول أو التسجيل الآن", "loginRegisterNow": "تسجيل الدخول أو التسجيل الآن", - "hmgPharmacy": "صيدلية HMG", + "hmgPharmacy": "صيدلية مجموعة الحبيب الطبية", "ecommerceSolution": "حلول التجارة الإلكترونية", "comprehensive": "شامل", "onlineConsulting": "استشارات عبر الإنترنت", @@ -666,7 +666,7 @@ "findUs": "اعثر علينا", "liveChat": "دردشة مباشرة", "service": "خدمة", - "hmgServiceLabel": "خدمة HMG", + "hmgServiceLabel": "خدمة مجموعة الحبيب الطبية", "healthWeatherIndicators": "مؤشرات الطقس الصحية", "healthTipsBasedOnCurrentWeather": "نصائح صحية بناءً على الطقس الحالي", "moreDetails": "المزيد من التفاصيل", @@ -717,10 +717,10 @@ "bloodDonationInfo": "من خلال هذه الخدمة، يمكنك تسجيل اسمك كمتبرع بالدم ��يث سيتواصل معك بنك الدم في مجموعة الحبيب الطبية في حالة الحاجة إلى فصيلة الدم.", "bloodInstruction": "أدخل المعلومات المطلوبة، من أجل التسجيل في خدمة التبرع بالدم", "viewTerms": "لعرض الشروط والأحكام", - "wantConnectHmgNetwork": "عزيزي العميل، لا يوجد وصول إلى الإنترنت، هل ترغب في الاتصال بشبكة HMG لاستخدام تطبيقنا، تأكد من أنك في نطاق شبكة HMG", - "failedToAccessHmgServices": "متصل بشبكة HMG،\n\nلكن فشل في الوصول إلى خدمات HMG", + "wantConnectHmgNetwork": "عزيزي العميل، لا يوجد وصول إلى الإنترنت، هل ترغب في الاتصال بشبكة مجموعة الحبيب الطبية لاستخدام تطبيقنا، تأكد من أنك في نطاق شبكة مجموعة الحبيب الطبية", + "failedToAccessHmgServices": "متصل بشبكة مجموعة الحبيب الطبية،\n\nلكن فشل في الوصول إلى خدمات مجموعة الحبيب الطبية", "offerAndPackages": "عروض وباقات", - "offerAndPackagesDetails": "تتيح لك هذه الخدمة عرض جميع عروض HMG:", + "offerAndPackagesDetails": "تتيح لك هذه الخدمة عرض جميع عروض مجموعة الحبيب الطبية:", "invoiceNo": "رقم الفاتورة", "invoiceDate": "تاريخ الفاتورة", "specialResult": "نتيجة خاصة", @@ -853,8 +853,8 @@ "onboardingBody1": "ببضع نقرات فقط يمكنك استشارة الطبيب الذي تختاره.", "onboardingHeading2": "الوصول إلى السجل الطبي بين يديك", "onboardingBody2": "تتبع تاريخك الطبي بما في ذلك الفحوصات المخبرية، الوصفات الطبية، التأمين، وغيرها.", - "hmgHospitals": "مستشفيات HMG", - "hmcMedicalClinic": "مراكز HMC الطبية", + "hmgHospitals": "مستشفيات مجموعة الحبيب الطبية", + "hmcMedicalClinic": "مراكز مجموعة الحبيب الطبية", "applyFilter": "تطبيق الفلتر", "facilityAndLocation": "المرفق والموقع", "regionAndLocation": "المنطقة والمواقع", @@ -1581,5 +1581,6 @@ "reschedulingAppo": "إعادة جدولة الموعد، يرجى الانتظار...", "invalidEligibility": "لا يمكنك إجراء الدفع عبر الإنترنت لأنك غير مؤهل لاستخدام الخدمة المقدمة.", "invalidInsurance": "لا يمكنك إجراء الدفع عبر الإنترنت لأنه ليس لديك تأمين صالح.", - "continueCash": "تواصل نقدا" + "continueCash": "تواصل نقدا", + "hmgPolicies": "سياسات مجموعة الحبيب الطبية" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index bf73d6da..89108838 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1572,5 +1572,6 @@ "reschedulingAppo": "Rescheduling Appointment, Please wait...", "invalidEligibility": "You cannot make online payment because you are not eligible to use the provided service.", "invalidInsurance": "You cannot make online payment because you do not have a valid insurance.", - "continueCash": "Continue as cash" + "continueCash": "Continue as cash", + "hmgPolicies": "HMG Policies" } diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 2c41b86f..e706a9d6 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -194,8 +194,8 @@ class ApiClientImp implements ApiClient { body['TokenID'] = "@dm!n"; } - // body['TokenID'] = "@dm!n"; - // body['PatientID'] = 4773989; + body['TokenID'] = "@dm!n"; + body['PatientID'] = 4773781; // body['PatientTypeID'] = 1; // body['PatientOutSA'] = 0; // body['SessionID'] = "45786230487560q"; diff --git a/lib/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart b/lib/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart index f272f2dc..303b6edd 100644 --- a/lib/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart +++ b/lib/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart @@ -52,7 +52,7 @@ class InsuranceApprovalResponseModel { String? eApprovalRemarks; bool? isEmailSentOnDelayApproval; int? eAuthorizationID; - InsuranceApprovalDetails? apporvalDetails; + List? apporvalDetails = []; String? approvalStatusDescption; String? clinicName; String? clinicNameN; @@ -217,7 +217,9 @@ class InsuranceApprovalResponseModel { isEmailSentOnDelayApproval = json['IsEmailSentOnDelayApproval']; eAuthorizationID = json['EAuthorizationID']; if (json['ApporvalDetails'] != null && json['ApporvalDetails'].length != 0) { - apporvalDetails = InsuranceApprovalDetails.fromJson(json['ApporvalDetails'][0]); + json['ApporvalDetails'].forEach((v) { + apporvalDetails!.add(InsuranceApprovalDetails.fromJson(v)); + }); } approvalStatusDescption = json['ApprovalStatusDescption']; clinicName = json['ClinicName']; @@ -302,9 +304,9 @@ class InsuranceApprovalResponseModel { data['EApprovalRemarks'] = this.eApprovalRemarks; data['IsEmailSentOnDelayApproval'] = this.isEmailSentOnDelayApproval; data['EAuthorizationID'] = this.eAuthorizationID; - if (this.apporvalDetails != null) { - data['ApporvalDetails'] = this.apporvalDetails!.toJson; - } + // if (this.apporvalDetails != null) { + // data['ApporvalDetails'] = this.apporvalDetails!.toJson; + // } data['ApprovalStatusDescption'] = this.approvalStatusDescption; data['ClinicName'] = this.clinicName; data['ClinicNameN'] = this.clinicNameN; diff --git a/lib/features/lab/lab_repo.dart b/lib/features/lab/lab_repo.dart index a4cdcf1c..285c7322 100644 --- a/lib/features/lab/lab_repo.dart +++ b/lib/features/lab/lab_repo.dart @@ -232,7 +232,7 @@ class LabRepoImp implements LabRepo { "DoctorID": labOrder.doctorID!, "OrderNo": labOrder.orderNo!, "InvoiceType": labOrder.invoiceType!, - "SetupID": labOrder.setupID!, + "SetupID": labOrder.setupID ?? "", "IsDownload": true, 'ClinicName': labOrder.clinicDescription, 'DateofBirth': Utils.appState.getAuthenticatedUser()!.dateofBirth, diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 3940f9ed..f546be43 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1573,5 +1573,6 @@ abstract class LocaleKeys { static const invalidEligibility = 'invalidEligibility'; static const invalidInsurance = 'invalidInsurance'; static const continueCash = 'continueCash'; + static const hmgPolicies = 'hmgPolicies'; } diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index f0bf08f1..4458b75a 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -692,6 +692,8 @@ class ServicesPage extends StatelessWidget { ) ], ), + SizedBox(height: 24.h), + LocaleKeys.hmgPolicies.tr().toText18(weight: FontWeight.bold), SizedBox(height: 16.h), Row( children: [ diff --git a/lib/presentation/insurance/insurance_approval_details_page.dart b/lib/presentation/insurance/insurance_approval_details_page.dart index a6d81575..a074a8d8 100644 --- a/lib/presentation/insurance/insurance_approval_details_page.dart +++ b/lib/presentation/insurance/insurance_approval_details_page.dart @@ -1,5 +1,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; @@ -122,35 +123,69 @@ class InsuranceApprovalDetailsPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ "Approval Details".toText16(isBold: true), - SizedBox(height: 16.h), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - LocaleKeys.procedureName.tr(context: context).toText14(isBold: true), - Expanded( - child: (insuranceApprovalResponseModel.apporvalDetails!.procedureName ?? "") - .toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor, textAlignment: TextAlign.end, maxLine: 2), - ), - ], - ), - SizedBox(height: 8.h), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - "${LocaleKeys.status.tr(context: context)}: ".toText14(isBold: true), - insuranceApprovalResponseModel.apporvalDetails!.status!.toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), - ], - ), - SizedBox(height: 8.h), - Row( - mainAxisAlignment: MainAxisAlignment.spaceBetween, - children: [ - "${LocaleKeys.usageStatus.tr(context: context)}: ".toText14(isBold: true), - (insuranceApprovalResponseModel.apporvalDetails!.isInvoicedDesc ?? "").toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), - ], - ), - ], - ) : SizedBox.shrink(), + ListView.separated( + padding: EdgeInsets.only(top: 16.h), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemCount: insuranceApprovalResponseModel.apporvalDetails!.length, + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocaleKeys.procedureName.tr(context: context).toText14(isBold: true), + Expanded( + child: (insuranceApprovalResponseModel.apporvalDetails![index]!.procedureName ?? "") + .toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor, textAlignment: TextAlign.end, maxLine: 2), + ), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "${LocaleKeys.status.tr(context: context)}: ".toText14(isBold: true), + insuranceApprovalResponseModel.apporvalDetails![index]!.status!.toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "${LocaleKeys.usageStatus.tr(context: context)}: ".toText14(isBold: true), + (insuranceApprovalResponseModel.apporvalDetails![index]!.isInvoicedDesc ?? "").toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + ], + ), + ], + ), + ), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => Column( + children: [ + SizedBox(height: 16.h), + Divider(height: 1, color: AppColors.greyColor), + SizedBox(height: 16.h), + ], + ), + ), + ], + ) + : SizedBox.shrink(), ), ) ], From 8368dbd4d9b33ddcb1c0721766f7d78fbae42628 Mon Sep 17 00:00:00 2001 From: "Fatimah.Alshammari" Date: Tue, 24 Feb 2026 10:15:44 +0300 Subject: [PATCH 09/27] fixed Ar and En files --- assets/langs/ar-SA.json | 98 ++++++++++++++++++++--------------------- assets/langs/en-US.json | 22 ++++----- 2 files changed, 59 insertions(+), 61 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 8e7fb9e8..645d630b 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -46,7 +46,7 @@ "nationality": "الجنسية", "neverWait": "لا تنتظر في الطابور أبدًا", "reminderTitle": "لديك موعد مع الدكتور.", - "appointmentCalendar": "هل ترغب في ضبط تذكير لهذا الموعد في تقويمك؟", + "appointmentCalendar": "هل ترغب في تعيين تذكير لهذا الموعد في التقويم الخاص بك؟", "appointmentSuccess": "تم حجز الموعد بنجاح", "docQualifications": "مؤهلات الطبيب", "pressAgain": "اضغط مرة أخرى للخروج من التطبيق", @@ -58,7 +58,7 @@ "patientShare": "نسبة المريض", "patientShareWithTax": "نسبة المريض مع الضريبة", "confirmAppo": "تأكيد الموعد", - "confirmLiveCare": "تأكيد الرعاية الحية", + "confirmLiveCare": "تأكيد ال لايف كير", "waitingForDoctor": "في انتظار الطبيب", "appointment": "موعد", "confirmLater": "تأكيد لاحقًا", @@ -70,20 +70,20 @@ "payNow": "ادفع الآن", "viewQR": "عرض رمز الاستجابة السريعة", "instruction": "تعليمات", - "livecare": "الرعاية الحية", - "livecareAppo": "موعد الرعاية الحية", + "livecare": "لايف كير", + "livecareAppo": "موعد لايف كير", "agreeTo": "أوافق على", "termsConditoins": "الشروط والأحكام", "cancelAppoMsg": "هل أنت متأكد أنك تريد إلغاء هذا الموعد؟", "changePayment": "تغيير طريقة الدفع", - "upcomingNoAction": "لا حاجة لإجراء أي إجراء", + "upcomingNoAction": "لا يتطلب أي إجراء", "upcomingConfirm": "يرجى تأكيد الموعد لتجنب الإلغاء", "bookSuccessConfirmMore2412": "ستكون عملية الدفع عبر الإنترنت متاحة قبل 24 ساعة ��ن الموعد.", "upcomingPaymentPending": "سيتم تفعيل الدفع عبر الإنترنت قبل 24 ساعة من موعد الموعد", "upcomingPaymentNow": "ادفع عبر الإنترنت الآن لتجنب الانتظار الطويل", "upcomingQR": "استخدم رمز الاستجابة السريعة لتسجيل الوصول في المستشفى", "upcomingVirtual": "هذا موعد افتراضي، يرجى الالتزام بالتعليمات لتجربة سلسة.", - "upcomingLivecare": "هذا موعد رعاية حية", + "upcomingLivecare": "هذا موعد لايف كير", "upcomingDetails": "المزيد من التفاصيل", "reschedule": "إعادة جدولة", "raise": "رفع", @@ -92,7 +92,7 @@ "reminder": "تذكير", "location": "المواقع", "online": "عبر الإنترنت", - "payment": "الالكتروني", + "payment": "الدفع", "onlinePayment": "عبر الإنترنت", "onlinePaymentSubtitle": "الدفع", "cancelNocaps": "إلغاء", @@ -161,7 +161,7 @@ "passQRAppoAttend": "مرر رمز الاستجابة السريعة عبر أجهزة الحضور المتاحة في المستشفى.", "sitWaitingQR": "اجلس في غرف الانتظار حتى يتم استدعاؤك من قبل الممرضة.", "attendRegisterCode": "رمز تسجيل الحضور", - "scanQRHospital": "اقترب من لوحة التسجيل عبر الإنترنت في المستشفى وامسح عبر NFC أو رمز الاستجابة السريعة لتسجيل الوصول", + "scanQRHospital": "توجّه إلى لوحة تسجيل الوصول الإلكتروني في المستشفى، وقم بالمسح عبر تقنية NFC أو رمز الاستجابة السريعة (QR) لإتمام تسجيل الوصول.", "scanNFC": "امسح NFC لتسجيل الوصول", "sendEmail": "إرسال بريد إلكتروني", "success": "تم بنجاح", @@ -174,7 +174,7 @@ "arrived": "وصل", "payNowBookSuccess": "ادفع الآن عبر تطبيق الحبيب", "payNowBookSuccesstext1": "ادفع الآن باستخدام خدمة الدفع عبر الإنترنت من بوابات الدفع الآمنة", - "payNowBookSuccesstext2": "يمكنك أيضًا الدفع لاحقًا عبر الدفع عبر الإنترنت أو في المستشفى", + "payNowBookSuccesstext2": "يمكنك أيضًا الدفع لاحقًا عبر الدفع الإلكتروني أو في المستشفى.", "payLater": "ادفع لاحقًا", "askDocNotAllowed": "هذه الخدمة ستكون متاحة فقط لزيارة الطبيب قبل 15 يومًا", "moreVerify": "خيارات تحقق إضافية", @@ -246,13 +246,13 @@ "myMedicalFileSubTitle": "جميع سجلاتك الطبية", "viewMore": "عرض المزيد", "homeHealthCareService": "خدمة الرعاية الصحية المنزلية", - "onlinePharmacy": "صيدلية عبر الإنترنت", + "onlinePharmacy": "الصيدلية الإلكترونية", "emergencyService": "خدمة الطوارئ", "onlinePaymentService": "خدمة الدفع عبر الإنترنت", "offersAndPackages": "طلب تحويل عبر الإنترنت", "comprehensiveMedicalCheckup": "فحص طبي شامل", "hmgService": "خدمة HMG", - "viewAllHabibMedicalService": "عرض جميع خدمات حبيب الطبية", + "viewAllHabibMedicalService": "عرض جميع خدمات الحبيب الطبية", "viewAll": "عرض الكل", "view": "عرض", "contactUs": "اتصل بنا", @@ -263,7 +263,7 @@ "consultation": "استشارة", "logs": "السجلات", "textToSpeech": "كيف يمكنني مساعدتك؟", - "locationDialogMessage": "سيساعدك السماح لتطبيق HMG بالوصول إلى موقعك في عرض المستشفيات الأقرب إليك.", + "locationDialogMessage": "السماح لتطبيق HMG بالوصول إلى موقعك سيساعدك في عرض المستشفيات الأقرب إليك.", "userViewRequester": "يريد المستخدم عرض ملفك الطبي", "userView": "يمكن للمستخدم عرض ملفك الطبي", "parking": "موقف السيارات", @@ -288,7 +288,7 @@ "requestA": "طلب", "noBookedAppointments": "لا توجد مواعيد محجوزة", "noConfirmedAppointments": "لا توجد مواعيد مؤكدة", - "noArrivedAppointments": "لا توجد مواعيد وصلت", + "noArrivedAppointments": "لا توجد مواعيد تم تسجيل الوصول إليها", "myAppointmentsList": "المواعيد", "myAppointments": "مواعيدي", "radiology": "الأشعة", @@ -358,11 +358,11 @@ "userAgreement": "اتفاقية المستخدم", "updateSuccessfully": "تم التحديث بنجاح", "checkVaccineAvailability": "تحقق من توفر اللقاح", - "myVaccinesAvailability": "توفر لقاحاتي", + "myVaccinesAvailability": "توفر اللقاحات الخاصة بي", "paymentService": "خدمة الدفع", "paymentOnline": "الخدمة", "onlineCheckIn": "تسجيل الوصول عبر الإنترنت", - "myBalances": "أرصدةي", + "myBalances": "رصيدي", "myWallet": "محف��تي", "balanceAmount": "مبلغ المحفظة", "totalBalance": "إجمالي الرصيد", @@ -383,7 +383,7 @@ "otherAccount": "حساب آخر", "selectBeneficiary": "اختر المستفيد", "confirmThePayment": "تأكيد الدفع", - "depositorName": "اسم الوديع", + "depositorName": "اسم مُقدِّم الإيداع", "mobileNumber": "رقم الجوال", "phoneNumber": "رقم الهاتف", "country": "البلد", @@ -410,7 +410,7 @@ "diameter": "القطر", "remarks": "ملاحظات: ", "activeMedications": "الأدوية النشطة", - "expDate": "تاريخ انتهاء الصلاحية النشط:", + "expDate": "تاريخ انتهاء الصلاحية:", "route": "الطريق", "frequency": "التكرار", "dailyQuantity": "��لكمية اليومية:", @@ -427,7 +427,7 @@ "doctorResponses": "ردود الطبيب", "ne_w": "جديد", "all": "الكل", - "dailyWater": "فحص الماء اليومي", + "dailyWater": "متابعة الماء اليومية", "questionHere": "أدخل السؤال هنا...", "viewDoctorResponses": "عرض ردود الطبيب", "serviceInformationButton": "تسجيل الدخول / التسجيل", @@ -452,7 +452,7 @@ "brands": "العلامات التجارية", "productDetails": "تفاصيل المنتج", "medicationRefill": "إعادة تعبئة الدواء", - "pillReminder": "تذكير بالحبوب", + "pillReminder": "تذكير الأدوية", "shippingAddresses": "عناوين الشحن", "reachUs": "تواصل معنا", "ourLocations": "مواقعنا", @@ -472,7 +472,7 @@ "cancelled": "ملغى", "writeReview": "اكتب تقييمًا", "shareReview": "شارك التقييم", - "review": " تقييمات", + "review": " التقييمات", "viewMedicalFile": "عرض التفاصيل", "viewAllServices": "عرض جميع الخدمات", "medicalFile": "الملف الطبي", @@ -525,7 +525,7 @@ "payOnline": "الدفع عبر الإنترنت", "cancelOrder": "إلغاء الطلب", "confirmAddress": "تأكيد العنوان ", - "confirmLocation": "أكيد الموقع ", + "confirmLocation": "أكد الموقع ", "conditionsHMG": "الشروط والأحكام ", "conditions": "الشروط والأحكام لكوم", "confirmDeleteMsg": "هل أنت متأكد! تريد الحذف ", @@ -635,12 +635,12 @@ "infoInsuranceCards": "تتيح لك هذه الخدمة عرض جميع بطاقات التأمين التي تم تسجيلها خلال زياراتك لمجموعة الحبيب الطبية بالإضافة إلى:", "infoInsuranceCardsPoints": "", "infoAllergies": "تتيح لك هذه الخدمة عرض جميع أنواع الحساسية المسجلة خلال زياراتك لمجموعة الحبيب الطبية.", - "infoSickLeaves": "تتيح لك هذه الخدمة عرض جميع إجازات المرضى التي تم أخذها في مجموعة الحبيب الطبية بالإضافة إلى:", + "infoSickLeaves": "تتيح لك هذه الخدمة عرض جميع الاجازات المرضيه التي تم أخذها في مجموعة الحبيب الطبية بالإضافة إلى:", "infoSickLeavePoints": "", "infoApprovals": "تتيح لك هذه الخدمة عرض جميع طلبات الموافقة التي تم إرسالها إلى شركات التأمين بالإضافة إلى:", "infoApprovalPoints": "", "infoMonthReport": "عند تفعيل هذه الخدمة، سيقوم النظام بإرسال تقرير شهري تلقائيًا إلى البريد الإلكتروني المسجل يتضمن العلامات الحيوية والنتائج لآخر الزيارات التي تمت في مجموعة الحبيب الطبية.", - "languageSetting": "لغة الرسائل القصيرة، واتساب، ومكالمات التأكيد", + "languageSetting": "الرسائل القصيرة، واتساب، لغة مكالمات التأكيد", "alert": "تنبيهات", "emailAlert": "تنبيه عبر البريد الإلكتروني", "smsAlert": "تنبيه عبر الرسائل القصيرة", @@ -648,7 +648,7 @@ "emrgName": "اسم جهة الاتصال في حالات الطوارئ", "emrgNo": "رقم جهة الاتصال في حالات الطوارئ", "modes": "الأوضاع", - "vibration": "اهتزاز ردود الفعل اللمسية", + "vibration": "اهتزاز عند اللمس", "blindModes": "أوضاع للمكفوفين جزئيًا", "invertTheme": "عكس", "offTheme": "إيقاف", @@ -705,7 +705,7 @@ "compliment": "تقدير", "suggestion": "اقتراح", "yourFeedback": "تم إرسال ملاحظاتك", - "selectPart": "يرجى اختيار الجزء الذي تشتك�� منه", + "selectPart": "يرجى اختيار الجزء الذي تشتكي منه", "number": "رقم", "notClassified": "غير مصنف", "selectClinic": "اختر العيادة", @@ -714,7 +714,7 @@ "youCanFind": "يمكنك العثور على ", "itemInSearch": " عنصر في البحث", "bloodDonation": "التبرع بالدم", - "bloodDonationInfo": "من خلال هذه الخدمة، يمكنك تسجيل اسمك كمتبرع بالدم ��يث سيتواصل معك بنك الدم في مجموعة الحبيب الطبية في حالة الحاجة إلى فصيلة الدم.", + "bloodDonationInfo": "من خلال هذه الخدمة، يمكنك تسجيل اسمك كمتبرع بالدم حيث سيتواصل معك بنك الدم في مجموعة الحبيب الطبية في حالة الحاجة إلى فصيلة الدم.", "bloodInstruction": "أدخل المعلومات المطلوبة، من أجل التسجيل في خدمة التبرع بالدم", "viewTerms": "لعرض الشروط والأحكام", "wantConnectHmgNetwork": "عزيزي العميل، لا يوجد وصول إلى الإنترنت، هل ترغب في الاتصال بشبكة HMG لاستخدام تطبيقنا، تأكد من أنك في نطاق شبكة HMG", @@ -739,25 +739,25 @@ "excellent": "ممتاز", "average": "متوسط", "infoSigns": "تتيح لك هذه الخدمة عرض جميع العلامات الحيوية التي تم قياسها في مجموعة الحبيب الطبية، مثل (الطول، الوزن، مؤشر كتلة الجسم، معدل ضربات القلب، إلخ.) بالإضافة إلى عرض بعض الرسوم البيانية الإحصائية.", - "infoAdvancePayment": "تم تصميم هذه الخدمة بحيث يمكنك إيداع مبلغ مقدم إما في حسابك أو في حساب شخص آخر في مجموعة الحبيب الطبية.", + "infoAdvancePayment": "تم تصميم هذه الخدمة بحيث يمكنك إيداع مبلغ مقدم إما في حسابك أو في حساب شخص آخر، في مجموعة الحبيب الطبية.", "infoMyBalance": "تتيح لك هذه الخدمة التحقق من رصيدك في جميع الفروع", "erContant": "تظهر هذه الخدمة أقرب فرع من بين جميع فروع مجموعة الحبيب الطبية بناءً على موقعك الحالي.", "infoAmbulance": "من خلال هذه الخدمة، يمكنك طلب الإخلاء بواسطة سيارة إسعاف، سواء من المنزل أو إلى المنزل، بالإضافة إلى مجموعة من الخدمات الأخرى", "infoMyAppointments": "تتيح لك هذه الخدمة رؤية جميع المواعيد التي زرتها في مجموعة الحبيب الطبية، ومن خلال هذه الخدمة:", - "infoTodo": "تم تصميم هذه الخدمة لتمكينك من الحصول على رابط سريع لقائمة المهام التي تحتاج إلى القيام بها", + "infoTodo": "تم تصميم هذه الخدمة لتمكينك من الحصول على رابط سريع لقائمة المهام التي تحتاج القيام بها", "familyInfo": "من خلال هذه الخدمة، ستتمكن من ربط ملفات عائلتك الطبية بملفك الطبي حتى تتمكن من إدارة سجلاتهم عن طريق تسجيل الدخول إلى ملفك الطبي.", "rrtdDetails": "تقدم فريق الاستجابة السريعة خدمة طبية شاملة لجميع أنواع الحالات العاجلة والمستقرة من جميع الأعمار، بما في ذلك البالغين والمرضى الأطفال، وتغطي الخدمة فريق طبي مدرب تدريبًا عاليًا ومجهز تجهيزًا كاملاً قادرًا على تقديم أفضل رعاية طبية في منزل المريض.", "homeHealthCareText": "تقدم هذه الخدمة مجموعة من خدمات الرعاية الصحية المنزلية، والمتابعة المستمرة والشاملة في أماكن إقامتهم لأولئك الذين لا يمكنهم الوصول إلى المرافق الصحية، مثل (تحليلات المختبر - الأشعة - التطعيمات - العلاج الطبيعي)، إلخ.", - "onlineCheckInAgreement": "تسجيل الوصول عبر الإنترنت مخصص للحال��ت التي لا تهدد الحياة. اتصل بالهلال الأحمر (997) أو اذهب إلى أقرب قسم طوارئ إذا كان هناك: \n\nعلامات السكتة الدماغية أو النوبة القلبية \nhالة من النوبات أو الإغماء \nهناك إصابة تهدد الطرف أو الحياة \nصورة لإصابات خطيرة", + "onlineCheckInAgreement": "تسجيل الوصول عبر الإنترنت مخصص للحالات التي لا تهدد الحياة. اتصل بالهلال الأحمر (997) أو اذهب إلى أقرب قسم طوارئ إذا كان هناك: \n\nعلامات السكتة الدماغية أو النوبة القلبية \nhالة من النوبات أو الإغماء \nهناك إصابة تهدد الطرف أو الحياة \nصورة لإصابات خطيرة", "infoEreferral": "تتيح لك هذه الخدمة تقديم طلب إحالة من أي مقدم رعاية صحية سواء داخل أو خارج المملكة العربية السعودية إلى أي من مستشفيات HMG، عن طريق ملء بعض بيانات المريض وإرفاق التقارير الطبية، علاوة على ذلك يمكنك تتبع حالة الطلب (قيد المعالجة، مقبول أو مرفوض)", "erConsultation": "تتيح لك هذه الخدمة إجراء استشارة افتراضية عبر الإنترنت عبر مكالمة فيديو مباشرة مع الطبيب من أي مكان وفي أي وقت.", "myInvoice": "القائمة", "invoiceList": "فواتيري", "thisItemIsNotAvailable": "هذا العنصر غير متوفر", "beforeAfterImages": "صور قبل وبعد", - "clinicAcceptLivecare": "لا حاجة للانتظار أو الزيارة يمكنك الآن الحصول على استشارة طبية عبر مكالمة فيديو (خدمة الرعاية الحية) في اسم العيادة وسيتصل بك الطبيب على الور", - "livecareModalTop": "تقبل هذه العيادة خدمات الرعاية الحية", - "livecarePoint2": "��يتصل بك طبيب متخصص", + "clinicAcceptLivecare": "لا حاجة للانتظار أو الزيارة يمكنك الآن الحصول على استشارة طبية عبر مكالمة فيديو (لايف كير) في اسم العيادة وسيتصل بك الطبيب على الفور", + "livecareModalTop": "تقبل هذه العيادة خدمات ال لايف كير", + "livecarePoint2": "سوف يتصل بك طبيب متخصص", "livecarePoint3": "سيكون لدى الطبيب القدرة على رؤية تاريخ ملفك الطبي الكامل", "livecarePoint4": "تتوفر خدمة توصيل الأدوية المجانية", "livecarePoint5": "لا حاجة للزيارة، الخدمة في مكانك", @@ -787,7 +787,7 @@ "enterEmailDesc": "أدخل عنوان بريدك الإلكتروني لإكمال عملية إنشاء ملف طبي", "enterPhoneDesc": "أدخل رقم هاتفك لتلقي رمز التحقق ", "pleaseChooseOption": "الرجاء اختيار من الخيارات أدناه لتلقي رمز التحقق OTP", - "prepareToElevate": "هل أنت مستعد لتحسين صحتك ورفاهتك؟", + "prepareToElevate": "هل أنت مستعد لتحسين صحتك ورفاهيتك؟", "iAcceptTermsConditions": "أوافق على الشروط والأحكام", "alreadyHaveAccount": "هل لديك حساب بالفعل؟", "loginNow": "تسجيل الدخول الآن", @@ -804,7 +804,7 @@ "guest": "زائر", "switchAccount": "تبديل الحساب", "lastLoginBy": "آخر تسجيل دخول بواسطة", - "allSet": "جاهز! الآن يمكنك تسجيل الدخول باستخدام Face ID / Biometric أو البصمة", + "allSet": "جاهز! الآن يمكنك تسجيل الدخول باستخدام Face ID أو البصمة", "enableQuickLogin": "تمكين تسجيل الدخول السريع", "enableMsg": "تمكين تسجيل الدخول السريع سيسمح بالتحقق من خلال Face ID / Biometric الخاص بجهازك الحالي", "notNow": "ليس الآن", @@ -849,7 +849,7 @@ "searchHospital": "بحث في المستشفى", "skip": "تخطي", "getStarted": "ابدأ الآن", - "onboardingHeading1": "حجز المواعيد لم يكن أسهل من قبل", + "onboardingHeading1": "حجز المواعيد لم يكن أسهل من الآن.", "onboardingBody1": "ببضع نقرات فقط يمكنك استشارة الطبيب الذي تختاره.", "onboardingHeading2": "الوصول إلى السجل الطبي بين يديك", "onboardingBody2": "تتبع تاريخك الطبي بما في ذلك الفحوصات المخبرية، الوصفات الطبية، التأمين، وغيرها.", @@ -874,7 +874,6 @@ "laserClinic": "عيادة الليزر", "continueString": "يكمل", "covid_info": "تجري مستشفيات د. سليمان الحبيب فحص فيروس كورونا المستجد وتصدر شهادات السفر على مدار الساعة، طوال أيام الأسبوع، وبسرعة ودقة عالية. يمكن للراغبين في الاستفادة من هذه الخدمة زيارة أحد فروع مستشفيات د. سليمان الحبيب وإجراء فحص كورونا خلال بضع دقائق والحصول على النتائج خلال عدة ساعات خدمة فحص فيروس كورونا Covid 19 بتقنية PCR للكشف عن الفيروس وفقاً لأعلى المعايير العالمية وبأحدث أجهزة RT-PCR عالية الدقة (GeneXpert الأمريكي وغيره)، وهي طرق معتمدة من قبل هيئة الغذاء والدواء وكذلك من قبل المركز السعودي للوقاية من الأمراض المُعدية", - "appointmentDetails": "تفاصيل الموعد", "checkingDoctorAvailability": "جاري التحقق من توفر الطبيب...", "cancellingAppointmentPleaseWait": "جاري إلغاء الموعد، يرجى الانتظار...", @@ -924,7 +923,7 @@ "offersFreeMedicineDelivery": "يوفر توصيل مجاني للأدوية لموعد لايف كير", "dentalChiefComplaints": "الشكاوى الرئيسة للأسنان", "viewAvailableAppointments": "عرض المواعيد المتاحة", - "doctorProfile": "الملف للطبيب", + "doctorProfile": " ملف الطبيب", "waitingAppointment": "موعد الانتظار", "hospitalInformation": "معلومات المستشفى", "fetchingAppointmentShare": "جاري جلب تفاصيل الموعد...", @@ -960,10 +959,10 @@ "visaOrMastercard": "فيزا أو ماستركارد", "tamara": "تمارا", "fetchingApplePayDetails": "جاري جلب تفاصيل Apple Pay، يرجى الانتظار...", - "liveCarePendingRequest": "لايف كير حية معلق", + "liveCarePendingRequest": "طلب لايف كير قيد الانتظار", "callLiveCareSupport": "اتصل بدعم لايف كير", "whatIsWaitingAppointment": "ما هو موعد الانتظار؟", - "waitingAppointmentsFeature": "تتيح لك ميزة مواعيد الانتظار حجز موعد أثناء تواجدك داخل مبنى المستشفى، وفي حال عدم توفر فتحة متاحة في جدول الطبيب.", + "waitingAppointmentsFeature": "تتيح لك ميزة مواعيد الانتظار حجز موعد أثناء تواجدك داخل مبنى المستشفى، وفي حال عدم توفر مواعيد متاحة في جدول الطبيب.", "appointmentWithDoctorConfirmed": "الموعد مع الطبيب مؤكد، ولكن وقت الدخول غير محدد.", "paymentWithinTenMinutes": "ملاحظة: يجب عليك الدفع خلال 10 دقائق من الحجز، وإلا سيتم إلغاء موعدك تلقائياً", "liveLocation": "الموقع المباشر", @@ -1233,7 +1232,7 @@ "invalidWeight": "الوزن غير صالح", "timeToDrinkWater": "حان وقت شرب الماء! 💧", "stayHydratedDrinkWater": "ابق رطبًا! اشرب {amount} مل من الماء.", - "visitPharmacyOnline": "زيارة الصيدلة على الانترنت", + "visitPharmacyOnline": "زيارة الصيدلية على الانترنت", "howAreYouFeelingToday": "كيف حالك اليوم؟", "checkYourSymptomsWithScale": "تحقق من أعراضك باستخدام ذا المقياس", "checkYourSymptoms": "تحقق من أعراضك", @@ -1241,7 +1240,7 @@ "youHaveEROnlineCheckInRequest": "لديك طلب تسجيل وصول عبر الإنترنت للطوارئ", "quickLinks": "روابط سريعة", "viewMedicalFileLandingPage": "عرض الملف الطبي", - "immediateLiveCareRequest": "طلب LiveCare الفوري", + "immediateLiveCareRequest": "طلب لايف كير فوري", "yourTurnIsAfterPatients": "دورك بعد {count} مريض.", "dontHaveHHCOrders": "ليس لديك أي أوامر رعاية صحية منزلية حتى الآن.", "hhcOrders": "أوامر الرعاية الصحية المنزلية", @@ -1257,7 +1256,7 @@ "insuranceActive": "التأمين نشط", "patientCardID": "رقم بطاقة المريض: {id}", "noInsuranceApprovals": "لم تحصل على أي موافقات تأمينية حتى الآن.", - "noInsuranceWithHMG": "ليس لديك تأمين مسجل لدى مجموعة حبيب الطبية.", + "noInsuranceWithHMG": "ليس لديك تأمين مسجل لدى مجموعة الحبيب الطبية.", "referenceRange": "النطاق المرجعي", "downloadReport": "تنزيل التقرير", "generatingReport": "جارٍ إنشاء التقرير، يرجى الانتظار...", @@ -1302,12 +1301,12 @@ "updatingMonthlyReportStatus": "جاري تحديث حالة التقرير الشهري...", "monthlyReportStatusUpdatedSuccessfully": "تم تحديث حالة التقرير الشهري بنجاح", "whoCanViewMyMedicalFile": "من يمكنه عرض ملفي الطبي؟", - "acceptedYourRequestToBeYourFamilyMember": "{status} طلبك لتكون فردًا من عائلتك", + "acceptedYourRequestToBeYourFamilyMember": "{status} طلب الانضمام الى أفراد عائلتك", "canViewYourFile": "يمكنه عرض ملفك", "hasARequestPendingToBeYourFamilyMember": "لديه طلب {status} ليكون فردًا من عائلتك", - "wantsToAddYouAsTheirFamilyMember": "يريد إضافتك كفرد من عائلته", - "rejectedYourRequestToBeYourFamilyMember": "{status} طلبك لتكون فردًا من عائلتك", - "rejectedYourFamilyMemberRequest": "{status} طلب فرد عائلتك", + "wantsToAddYouAsTheirFamilyMember": "يرغب في إضافتك كفرد من أفراد العائلة", + "rejectedYourRequestToBeYourFamilyMember": "{status} طلب الانضمام إلى عائلتك", + "rejectedYourFamilyMemberRequest": "{status} طلب أحد أفراد عائلتك", "notAvailable": "غير متاح", "selectAProfile": "الرجاء تحديد ملف تعريف", "switchFamilyFile": "قم بالتبديل من قائمة الملفات الطبية أدناه", @@ -1386,7 +1385,7 @@ "seekMedicalAdviceDescription": "ليست حالة طوارئ ولكن من الأفضل مراقبة الأعراض.", "emergencyDescription": "تحتاج إلى استشارة الطبيب في أقرب وقت ممكن قبل فوات الأوان.", "colorScience": "دلالات الألوان", - "noNeedToVisitDoctor": "لا حاجة لزيرة الطبيب", + "noNeedToVisitDoctor": "لا حاجة لزيارة الطبيب", "commonSymptom": "الأعراض الشائعة", "bookAppointment": "احجز موعد", "notApplicable": "لا ينطبق", @@ -1423,7 +1422,7 @@ "approved": "موافق عليه", "approvalRejectedPleaseVisitReceptionist": "تم رفض الموافقة - يرجى زيارة موظف الاستقبال", "sentForApproval": "تم إرساله للموافقة", - "ancillaryOrderDetails": "تفاصيل الطلب المساعد", + "ancillaryOrderDetails": "تفاصيل الطلبات المساندة", "noProceduresAvailableForSelectedOrder": "لا توجد إجراءات متاحة للطلب المحدد.", "procedures": "الإجراءات", "totalAmount": "المبلغ الإجمالي", @@ -1492,7 +1491,6 @@ "yourName": "اسمك", "ageYears": "العمر (11-120) سنة", "numberOfRemindersInADay": "عدد التذكيرات في اليوم", - "medications": "الأدوية", "someRemarksAboutPrescription": "ستجدون هنا بعض الملاحظات حول الوصفة الطبية", "notifyMeBeforeConsumptionTime": "أبلغني قبل وقت الاستهلاك", @@ -1581,6 +1579,6 @@ "reschedulingAppo": "إعادة جدولة الموعد، يرجى الانتظار...", "invalidEligibility": "لا يمكنك إجراء الدفع عبر الإنترنت لأنك غير مؤهل لاستخدام الخدمة المقدمة.", "invalidInsurance": "لا يمكنك إجراء الدفع عبر الإنترنت لأنه ليس لديك تأمين صالح.", - "continueCash": "تواصل نقدا", + "continueCash": "متابعة الدفع نقدًا", "timeFor": "الوقت" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 7617a089..0e48e79b 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -92,7 +92,7 @@ "reminder": "Reminder", "location": "Locations", "online": "Online", - "payment": "الالكتروني", + "payment": "Payment", "onlinePayment": "Online", "onlinePaymentSubtitle": "Payment", "cancelNocaps": "Cancel", @@ -272,9 +272,9 @@ "appointments": "Appointments", "all2": "All", "checkinOption": "Check-In", - "readBarcode": "قراءة الكود", - "showMyPark": "عرض الموقف", - "clearMyData": "امسح البيانات", + "readBarcode": "Read Barcode", + "showMyPark": "Show My Park", + "clearMyData": "Clear My Data", "floor": "Floor:", "gate": "Gate:", "building": "Building:", @@ -357,7 +357,7 @@ "userAgreement": "User Agreement", "updateSuccessfully": "Update Successfully", "checkVaccineAvailability": "CHECK VACCINE AVAILABILITY", - "myVaccinesAvailability": "MyVaccinesAvailability", + "myVaccinesAvailability": "My Vaccines Availability", "paymentService": "Payment Service", "paymentOnline": "Service", "onlineCheckIn": "Online Check-In", @@ -393,7 +393,7 @@ "theVerificationCodeExpiresIn": "The Verification Code Expires in", "pleaseEnterTheVerificationCode": "Please enter the verification code send to", "eyeMeasurements": "Eye Measurements", - "measurements": "قياسات", + "measurements": "Measurements", "classes": "Glasses", "contactLens": "Contact Lens", "rightEye": "Right Eye", @@ -566,8 +566,8 @@ "transferred": "Transferred", "riyal": "RIYAL", "membersince": "MEMBER SINCE", - "identification": "رقم الهوية", - "lakumMobile": "رقم الجوال", + "identification": "Identification Number", + "lakumMobile": "Mobile Number", "waitinggained": "Waiting gained", "expired": "Expired", "willBeExpired": "Will Be Expired", @@ -616,10 +616,10 @@ "bloodType": "Blood Type", "maritalStatus": "Marital status", "general": "General", - "profile": "ملفي", - "notifications": "إشعارات", + "profile": "My Profile", + "notifications": "Notifications", "notificationDetails": "Notification Details", - "notificationDetailsa": "تفاصيل الاشعار", + "notificationDetailsa": "Notification Details", "infoMyDoctorPoints": "", "infoMyDoctor": "This service allows you to see all the doctors you have visited in Al Habib Medical Group, and through this service:", "infoPrescriptions": "This service allows you to view all the medical prescriptions issued by Al Habib Medical Group, and through this service, you can:", From 5e161698672768e87ad5d8695346429eca8d4ea9 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 24 Feb 2026 14:14:56 +0300 Subject: [PATCH 10/27] updates --- .../appointments/widgets/appointment_doctor_card.dart | 2 +- .../prescription_delivery_order_summary_page.dart | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/presentation/appointments/widgets/appointment_doctor_card.dart b/lib/presentation/appointments/widgets/appointment_doctor_card.dart index 9e56053a..467ba640 100644 --- a/lib/presentation/appointments/widgets/appointment_doctor_card.dart +++ b/lib/presentation/appointments/widgets/appointment_doctor_card.dart @@ -70,7 +70,7 @@ class AppointmentDoctorCard extends StatelessWidget { children: [ Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h), SizedBox(height: 2.h), - "${patientAppointmentHistoryResponseModel.decimalDoctorRate}".toText11(isBold: true, color: AppColors.textColor), + "${patientAppointmentHistoryResponseModel.decimalDoctorRate ?? 0.0}".toText11(isBold: true, color: AppColors.textColor), ], ), ).circle(100), diff --git a/lib/presentation/prescriptions/prescription_delivery_order_summary_page.dart b/lib/presentation/prescriptions/prescription_delivery_order_summary_page.dart index 5a340346..d6a616ee 100644 --- a/lib/presentation/prescriptions/prescription_delivery_order_summary_page.dart +++ b/lib/presentation/prescriptions/prescription_delivery_order_summary_page.dart @@ -66,9 +66,7 @@ class PrescriptionDeliveryOrderSummaryPage extends StatelessWidget { Expanded( child: Padding( padding: EdgeInsets.all(8.h), - child: Center( - child: prescriptionsViewModel.prescriptionDetailsList[index].itemDescription!.trim().toText12(), - ), + child: prescriptionsViewModel.prescriptionDetailsList[index].itemDescription!.trim().toText14(weight: FontWeight.w500), ), ), ], From 1286455f8cc759f4c96e23efd28f91a93b0d7c70 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 24 Feb 2026 16:31:19 +0300 Subject: [PATCH 11/27] wallet page fix --- .../habib_wallet/recharge_wallet_page.dart | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/presentation/habib_wallet/recharge_wallet_page.dart b/lib/presentation/habib_wallet/recharge_wallet_page.dart index 78608e8b..c4587bf9 100644 --- a/lib/presentation/habib_wallet/recharge_wallet_page.dart +++ b/lib/presentation/habib_wallet/recharge_wallet_page.dart @@ -185,13 +185,13 @@ class _RechargeWalletPageState extends State { ], ), ], - ).onPress(() { - showCommonBottomSheetWithoutHeight(context, - title: LocaleKeys.selectHospital.tr(context: context), isDismissible: false, child: SelectHospitalBottomSheet(), callBackFunc: () {}); - }), + ), Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, width: 25.h, height: 25.h), ], - ), + ).onPress(() { + showCommonBottomSheetWithoutHeight(context, + title: LocaleKeys.selectHospital.tr(context: context), isDismissible: false, child: SelectHospitalBottomSheet(), callBackFunc: () {}); + }), SizedBox(height: 16.h), Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h), SizedBox(height: 16.h), From 79b23584db6cb5585c942986e789d82328ee8253 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 26 Feb 2026 14:04:39 +0300 Subject: [PATCH 12/27] updates --- lib/core/api/api_client.dart | 4 ++-- lib/core/api_consts.dart | 14 ++++++-------- lib/core/utils/utils.dart | 2 +- .../ask_doctor/ask_doctor_view_model.dart | 2 +- .../my_appointments_view_model.dart | 6 +++++- .../waiting_appointment_payment_page.dart | 1 + .../widget/e_referral_other_details.dart | 18 +++++++++++++----- .../widget/e_referral_patient_info.dart | 12 +++++++++--- .../widget/e_referral_requester_form.dart | 5 ++++- 9 files changed, 42 insertions(+), 22 deletions(-) diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index e706a9d6..f9c44e76 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -194,8 +194,8 @@ class ApiClientImp implements ApiClient { body['TokenID'] = "@dm!n"; } - body['TokenID'] = "@dm!n"; - body['PatientID'] = 4773781; + // body['TokenID'] = "@dm!n"; + // body['PatientID'] = 4773922; // body['PatientTypeID'] = 1; // body['PatientOutSA'] = 0; // body['SessionID'] = "45786230487560q"; diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 708324eb..39132004 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -57,7 +57,7 @@ class ApiConsts { GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; rcBaseUrl = 'https://rc.hmg.com/uat/'; QLINE_URL = "https://ms.hmg.com/nscapi/api/PatientCall/PatientInQueue_Detail"; - CHAT_URL = "https://chat.hmg.com/geneysChat/Index.aspx?RequestedId"; + CHAT_URL = "https://chat.hmg.com/geneysChat/Index.aspx?RequestedId="; break; case AppEnvironmentTypeEnum.uat: baseUrl = "https://uat.hmgwebservices.com/"; @@ -69,7 +69,7 @@ class ApiConsts { GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; rcBaseUrl = 'https://rc.hmg.com/uat/'; QLINE_URL = "https://ms.hmg.com/nscapi/api/PatientCall/PatientInQueue_Detail"; - CHAT_URL = "https://chat.hmg.com/geneysChat/Index.aspx?RequestedId"; + CHAT_URL = "https://chat.hmg.com/geneysChat/Index.aspx?RequestedId="; break; case AppEnvironmentTypeEnum.preProd: baseUrl = "https://webservices.hmg.com/"; @@ -81,7 +81,7 @@ class ApiConsts { GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; rcBaseUrl = 'https://rc.hmg.com/'; QLINE_URL = "https://ms.hmg.com/nscapi/api/PatientCall/PatientInQueue_Detail"; - CHAT_URL = "https://chat.hmg.com/geneysChat/Index.aspx?RequestedId"; + CHAT_URL = "https://chat.hmg.com/geneysChat/Index.aspx?RequestedId="; break; case AppEnvironmentTypeEnum.qa: baseUrl = "https://uat.hmgwebservices.com/"; @@ -93,7 +93,7 @@ class ApiConsts { GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; rcBaseUrl = 'https://rc.hmg.com/uat/'; QLINE_URL = "https://ms.hmg.com/nscapi/api/PatientCall/PatientInQueue_Detail"; - CHAT_URL = "https://chat.hmg.com/geneysChat/Index.aspx?RequestedId"; + CHAT_URL = "https://chat.hmg.com/geneysChat/Index.aspx?RequestedId="; break; case AppEnvironmentTypeEnum.staging: baseUrl = "https://uat.hmgwebservices.com/"; @@ -105,7 +105,7 @@ class ApiConsts { GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; rcBaseUrl = 'https://rc.hmg.com/uat/'; QLINE_URL = "https://ms.hmg.com/nscapi/api/PatientCall/PatientInQueue_Detail"; - CHAT_URL = "https://chat.hmg.com/geneysChat/Index.aspx?RequestedId"; + CHAT_URL = "https://chat.hmg.com/geneysChat/Index.aspx?RequestedId="; break; } } @@ -229,7 +229,7 @@ class ApiConsts { static String getAiOverViewLabOrder = "Services/Patients.svc/REST/HMGAI_Lab_Analyzer_API"; // ************ static values for Api **************** - static final double appVersionID = 19.8; + static final double appVersionID = 20.1; // static final double appVersionID = 50.7; static final int appChannelId = 3; static final String appIpAddress = "10.20.10.20"; @@ -517,8 +517,6 @@ var IS_ALLOW_ASK_DOCTOR = 'Services/Doctors.svc/REST/GetPatientDoctorAppointment var GET_CALL_REQUEST_TYPE = 'Services/Doctors.svc/REST/GetCallRequestType_LOV'; var ADD_VIDA_REQUEST = 'Services/ER_VirtualCall.svc/REST/PatientER_VidaRequestInseart'; -var SEND_CALL_REQUEST = 'Services/Doctors.svc/REST/InsertCallInfo'; - var GET_LIVECARE_CLINICS = 'Services/ER_VirtualCall.svc/REST/PatientER_GetClinics'; var GET_LIVECARE_SCHEDULE_CLINICS = 'Services/Doctors.svc/REST/PatientER_GetClinicsHaveSchedule'; diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart index 671312d1..8b5b2849 100644 --- a/lib/core/utils/utils.dart +++ b/lib/core/utils/utils.dart @@ -860,7 +860,7 @@ class Utils { static String getAppointmentTransID(int projectID, int clinicID, int appoNo, {bool isAddMilliseconds = true}) { String currentMillis = DateTime.now().millisecondsSinceEpoch.toString(); - return '$projectID-$clinicID-$appoNo${isAddMilliseconds ? '-${currentMillis.substring(currentMillis.length - 5, currentMillis.length)}' : ""}'; + return '$projectID-$clinicID-$appoNo${isAddMilliseconds ? '-${currentMillis.substring(currentMillis.length - 5, currentMillis.length)}${currentMillis.substring(currentMillis.length - 5, currentMillis.length)}' : ""}'; } static String getAdvancePaymentTransID(int projectID, int fileNumber) { diff --git a/lib/features/ask_doctor/ask_doctor_view_model.dart b/lib/features/ask_doctor/ask_doctor_view_model.dart index 2b9600e1..b28ead16 100644 --- a/lib/features/ask_doctor/ask_doctor_view_model.dart +++ b/lib/features/ask_doctor/ask_doctor_view_model.dart @@ -67,7 +67,7 @@ class AskDoctorViewModel extends ChangeNotifier { (failure) async { isDoctorResponsesLoading = false; notifyListeners(); - await errorHandlerService.handleError(failure: failure); + // await errorHandlerService.handleError(failure: failure); if (onError != null) { onError(failure.toString()); } diff --git a/lib/features/my_appointments/my_appointments_view_model.dart b/lib/features/my_appointments/my_appointments_view_model.dart index f8876803..d2296a66 100644 --- a/lib/features/my_appointments/my_appointments_view_model.dart +++ b/lib/features/my_appointments/my_appointments_view_model.dart @@ -791,7 +791,11 @@ class MyAppointmentsViewModel extends ChangeNotifier { final result = await myAppointmentsRepo.getTamaraInstallmentsDetails(); result.fold( - (failure) async => await errorHandlerService.handleError(failure: failure), + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) async { + isTamaraDetailsLoading = false; + notifyListeners(); + }, (apiResponse) { getTamaraInstallmentsDetailsResponseModel = apiResponse.data!; isTamaraDetailsLoading = false; diff --git a/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_payment_page.dart b/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_payment_page.dart index bb347e5b..abd8d102 100644 --- a/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_payment_page.dart +++ b/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_payment_page.dart @@ -484,6 +484,7 @@ class _WaitingAppointmentPaymentPageState extends State { return Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: ListView( + padding: EdgeInsets.zero, physics: const BouncingScrollPhysics(), children: [ const SizedBox(height: 12), @@ -97,7 +98,10 @@ class _OtherDetailsStepState extends State { InkWell( child: TextInputWidget( controller: _medicalReportController, - padding: const EdgeInsets.symmetric(horizontal: 16.0), + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(12).h, + horizontal: ResponsiveExtension(16).h, + ), hintText: LocaleKeys.medicalReport.tr(context: context), labelText: LocaleKeys.selectAttachment.tr(context: context), suffix: const Icon(Icons.attachment), @@ -169,6 +173,7 @@ class _OtherDetailsStepState extends State { if (!value) { _updateInsuranceText(); } + setState(() {}); }, ), Padding( @@ -194,7 +199,10 @@ class _OtherDetailsStepState extends State { InkWell( child: TextInputWidget( controller: _insuranceController, - padding: const EdgeInsets.symmetric(horizontal: 16.0), + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(12).h, + horizontal: ResponsiveExtension(16).h, + ), hintText: LocaleKeys.insuranceDocument.tr(context: context), labelText: LocaleKeys.selectAttachment.tr(context: context), suffix: const Icon(Icons.attachment), @@ -234,7 +242,6 @@ class _OtherDetailsStepState extends State { } void _showBranchBottomSheet(BuildContext context, ReferralFormManager formManager) { - showCommonBottomSheetWithoutHeight( context, title: LocaleKeys.selectBranch.tr(context: context), @@ -266,8 +273,9 @@ class _OtherDetailsStepState extends State { onTap: () { formManager.updateBranch(branch); Navigator.pop(context); - }, - ); + setState(() {}); + }, + ); }, // separatorBuilder: (context, index) => const Divider(), itemCount: hospitals.length, diff --git a/lib/presentation/e_referral/widget/e_referral_patient_info.dart b/lib/presentation/e_referral/widget/e_referral_patient_info.dart index 61b92c76..cbce6919 100644 --- a/lib/presentation/e_referral/widget/e_referral_patient_info.dart +++ b/lib/presentation/e_referral/widget/e_referral_patient_info.dart @@ -64,6 +64,7 @@ class PatientInformationStepState extends State { return Padding( padding: const EdgeInsets.symmetric(horizontal: 16.0), child: ListView( + padding: EdgeInsets.zero, physics: const BouncingScrollPhysics(), children: [ const SizedBox(height: 12), @@ -71,7 +72,6 @@ class PatientInformationStepState extends State { const SizedBox(height: 12), _buildIdentificationField(formManager), _buildPatientNameField(formManager), - // _buildPatientCountryField(context, formManager), _buildPatientPhoneField(formManager), const SizedBox(height: 20), _buildSectionTitle(LocaleKeys.patientLocation.tr(context: context)), @@ -95,7 +95,10 @@ class PatientInformationStepState extends State { focusNode: _identificationFocusNode, child: TextInputWidget( controller: _identificationController, - padding: const EdgeInsets.symmetric(horizontal: 16.0), + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(12).h, + horizontal: ResponsiveExtension(16).h, + ), hintText: LocaleKeys.enterIdentificationNumber.tr(context: context), labelText: LocaleKeys.identificationNumber.tr(context: context), errorMessage: formManager.errors.patientIdentification, @@ -115,7 +118,10 @@ class PatientInformationStepState extends State { focusNode: _nameFocusNode, child: TextInputWidget( controller: _nameController, - padding: const EdgeInsets.symmetric(horizontal: 16.0), + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(12).h, + horizontal: ResponsiveExtension(16).h, + ), hintText: LocaleKeys.patientName.tr(context: context), labelText: LocaleKeys.name.tr(context: context), keyboardType: TextInputType.text, diff --git a/lib/presentation/e_referral/widget/e_referral_requester_form.dart b/lib/presentation/e_referral/widget/e_referral_requester_form.dart index d2b75ccb..b49846f4 100644 --- a/lib/presentation/e_referral/widget/e_referral_requester_form.dart +++ b/lib/presentation/e_referral/widget/e_referral_requester_form.dart @@ -94,7 +94,6 @@ class RequesterFormStepState extends State { focusNode: _nameFocusNode, child: TextInputWidget( controller: _nameController, - padding: const EdgeInsets.symmetric(horizontal: 16.0), hintText: LocaleKeys.enterReferralRequesterName.tr(context: context), labelText: LocaleKeys.requesterName.tr(context: context), keyboardType: TextInputType.text, @@ -102,6 +101,10 @@ class RequesterFormStepState extends State { isAllowLeadingIcon: true, leadingIcon: AppAssets.user_circle, hasError: !ValidationUtils.isNullOrEmpty(formManager.errors.requesterName), + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(12).h, + horizontal: ResponsiveExtension(16).h, + ), onChange: (value) { formManager.updateRequesterName(value ?? ''); }, From b75f0c7ee45d80bf528c3151674a5e0c9c6006ec Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 1 Mar 2026 13:55:31 +0300 Subject: [PATCH 13/27] updates --- lib/features/contact_us/contact_us_view_model.dart | 2 +- pubspec.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/features/contact_us/contact_us_view_model.dart b/lib/features/contact_us/contact_us_view_model.dart index 72bcff76..d627c55e 100644 --- a/lib/features/contact_us/contact_us_view_model.dart +++ b/lib/features/contact_us/contact_us_view_model.dart @@ -153,7 +153,7 @@ class ContactUsViewModel extends ChangeNotifier { // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); } else if (apiResponse.messageStatus == 1) { liveChatProjectsList = apiResponse.data!; - liveChatProjectsList.sort((a, b) => b.distanceInKilometers.compareTo(a.distanceInKilometers)); + liveChatProjectsList.sort((a, b) => a.distanceInKilometers.compareTo(b.distanceInKilometers)); isLiveChatProjectsListLoading = false; notifyListeners(); if (onSuccess != null) { diff --git a/pubspec.yaml b/pubspec.yaml index 01c155b1..e1e4b3d3 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: hmg_patient_app_new description: "New HMG Patient App" publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.0.1+3 +version: 0.0.1+4 environment: sdk: ">=3.6.0 <4.0.0" From f5aa12a04b54db1005848b8c83019029e2ea2add Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 1 Mar 2026 21:56:32 +0300 Subject: [PATCH 14/27] Android zoom fixes --- android/app/build.gradle.kts | 74 +- android/app/proguard-rules.pro | 5 + android/app/src/main/AndroidManifest.xml | 1 + .../main/jniLibs/arm64-v8a/libc++_shared.so | Bin 0 -> 1794776 bytes .../main/jniLibs/armeabi-v7a/libc++_shared.so | Bin 0 -> 1301936 bytes .../reports/problems/problems-report.html | 663 ------------------ pubspec.yaml | 7 +- 7 files changed, 73 insertions(+), 677 deletions(-) create mode 100755 android/app/src/main/jniLibs/arm64-v8a/libc++_shared.so create mode 100755 android/app/src/main/jniLibs/armeabi-v7a/libc++_shared.so delete mode 100644 android/build/reports/problems/problems-report.html diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index d9d2f0be..1d0e8453 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -18,22 +18,33 @@ if (keystorePropertiesFile.exists()) { } android { -// namespace = "com.ejada.hmg" namespace = "com.cloudsolutions.HMGPatientApp" compileSdk = 36 - ndkVersion = "28.2.13676358" + // Using NDK 26 for better compatibility with Zoom SDK native libraries + ndkVersion = "27.0.12077973" +// ndkVersion = "25.1.8937393" + + sourceSets { + getByName("main") { + jniLibs.srcDirs("src/main/jniLibs") + } + } defaultConfig { -// applicationId = "com.ejada.hmg" applicationId = "com.cloudsolutions.HMGPatientApp" // minSdk = 24 minSdk = 26 - targetSdk = 36 + targetSdk = 35 compileSdk = 36 // targetSdk = flutter.targetSdkVersion versionCode = flutter.versionCode versionName = flutter.versionName multiDexEnabled = true + + // Filter to arm64-v8a for better native library compatibility + ndk { + abiFilters += listOf("arm64-v8a", "armeabi-v7a") + } } buildFeatures { @@ -84,7 +95,7 @@ android { } } - packagingOptions { + packaging { jniLibs { pickFirsts += listOf( "lib/x86/libc++_shared.so", @@ -94,9 +105,16 @@ android { "**/*.so" ) useLegacyPackaging = true + // Keep Zoom SDK libraries unstripped to preserve symbols + keepDebugSymbols += listOf( + "*/libzoom_util.so", + "*/libzoom_check.so", + "*/libc++_shared.so" + ) } resources { excludes += listOf("META-INF/proguard/androidx-annotations.pro") + excludes.add("lib/*/libc++_shared.so") } } @@ -129,9 +147,13 @@ dependencies { implementation("com.google.code.gson:gson:2.12.0") // Zoom SDKs - implementation("us.zoom.videosdk:zoomvideosdk-core:1.12.10") - implementation("us.zoom.videosdk:zoomvideosdk-annotation:1.12.10") - implementation("us.zoom.videosdk:zoomvideosdk-videoeffects:1.12.10") +// implementation("us.zoom.videosdk:zoomvideosdk-core:1.12.10") +// implementation("us.zoom.videosdk:zoomvideosdk-annotation:1.12.10") +// implementation("us.zoom.videosdk:zoomvideosdk-videoeffects:1.12.10") + + implementation("us.zoom.videosdk:zoomvideosdk-core:2.1.10") + implementation("us.zoom.videosdk:zoomvideosdk-videoeffects:2.1.10") + implementation("us.zoom.videosdk:zoomvideosdk-annotation:2.1.10") // Networking implementation("com.squareup.okhttp3:logging-interceptor:5.0.0-alpha.11") @@ -189,5 +211,39 @@ dependencies { implementation("com.whatsapp.otp:whatsapp-otp-android-sdk:0.1.0") coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.5") // implementation(project(":vitalSignEngine")) +} -} \ No newline at end of file +tasks.whenTaskAdded { + if (name.contains("merge") && name.contains("NativeLibs")) { + doLast { + val outputDir = File(project.buildDir, "intermediates/merged_native_libs/release/out/lib") + + // Handle both architectures + val abis = listOf("arm64-v8a", "armeabi-v7a") + abis.forEach { abi -> + val targetFile = File(outputDir, "$abi/libc++_shared.so") + val sourceFile = file("src/main/jniLibs/$abi/libc++_shared.so") + + if (sourceFile.exists() && targetFile.exists()) { + println("FORCING: Overwriting $abi version with known-good 1.2MB library") + sourceFile.copyTo(targetFile, overwrite = true) + } + } + } + } +} + +//tasks.whenTaskAdded { +// if (name.contains("merge") && name.contains("NativeLibs")) { +// doLast { +// val outputDir = File(project.buildDir, "intermediates/merged_native_libs/release/out/lib") +// val targetFile = File(outputDir, "arm64-v8a/libc++_shared.so") +// val sourceFile = file("src/main/jniLibs/arm64-v8a/libc++_shared.so") +// +// if (sourceFile.exists()) { +// println("FORCE REPLACING: Injecting 1.2MB libc++ into APK...") +// sourceFile.copyTo(targetFile, overwrite = true) +// } +// } +// } +//} \ No newline at end of file diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro index 9c1827a0..94ad242d 100644 --- a/android/app/proguard-rules.pro +++ b/android/app/proguard-rules.pro @@ -52,6 +52,11 @@ *; } +# Prevent stripping of standard C++ symbols +-keepclassmembers class * { + native ; +} + -dontwarn com.opentok.android.** -dontwarn com.opentok.otc.** diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 54e1a5ee..7267f0ac 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -133,6 +133,7 @@ android:screenOrientation="sensorPortrait" android:showOnLockScreen="true" android:usesCleartextTraffic="true" + android:extractNativeLibs="true" tools:replace="android:label"> diff --git a/android/app/src/main/jniLibs/arm64-v8a/libc++_shared.so b/android/app/src/main/jniLibs/arm64-v8a/libc++_shared.so new file mode 100755 index 0000000000000000000000000000000000000000..a80c8b38ce8b67c3c964c8285762171abee8b0bd GIT binary patch literal 1794776 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Μ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
Il)*=raOi5vw9+2j-0~Ch(3Y4lc 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 Ko%CMmfBQ{*0r3v~x%iCw;#KC=<^G?|3 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�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ȁ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

^)B(LoZ^c>AgcJ|UE4=gVqYb+av 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 z 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

U3~G712ThHE#5l@9RX&5iqJ!-uBv?yQWIrLf*g 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

gvDVE>)n@kSy?bGRC&?93<^x8;MRca(ns?9m0VA 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 VPi_MB|E0eq>i^#Zv&Y-@|9`WU_vZir literal 0 HcmV?d00001 diff --git a/android/app/src/main/jniLibs/armeabi-v7a/libc++_shared.so b/android/app/src/main/jniLibs/armeabi-v7a/libc++_shared.so new file mode 100755 index 0000000000000000000000000000000000000000..cbff8a9043d32daf4172ca5ae3fb2f3291894756 GIT binary patch literal 1301936 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%0Dixx`m+=-gv zchq4>-+CSAD25!WRIhW#Uq4;VIU^s{(QWXI>K%6N>eya$RjuCoyyG9gS06j(M$_n^ zk9GP#sM9lgWkCE*N&M94s-154Y_B*N-M!zu7o7&bi_Y93)GWHvHYV)l{@b@7q{P(N z__9IY+p}Zp&dpku-QZ-*RC($cmCnA?t9OA9?Bjeo>E2Gcbud}eslx}~O1nQT?o?-B z!ReO2TXjZ}*zjFkjX70T9Iv-Mu2&^4}p~m08#wUjf-~L$R-}r%D%WW6*YSmfY^+1&ydHp&c zY30$a&aCO3^F4oCb8XM>oz=f39jjQAOE~hvb?@YQ9tpndcV+4ts}hd%Xj$Rwj0Fkx zFYQ!5SbR32Nv!j}B@-OFtd;+>e&YJ}T`CUl{-l7FO-S#M=(=Fc;`Jee69*lb-fUge=EUBw-f3!IxtpjTuw(o;Kh*Df zFJep0mw$Ecx~O))E6)-}cRl(|-q|(xc6V)Gt+nD<){Cx{E_nugKHjWbmDmx-1A=;W zJ68G3g60n2cl$K`a0j=Jhq?v$?dY**?)z@3O{?wrcadB7p-*Zx*B@1MzjlA#v#&qR z={{l8{(oDxKh^zdA9wxMPQs-Ap4`+%a^IvwA>1p~PHocemcx8*o?VjE%46Z-%LSK` zJc1+hs(h%_<5y>wM-O|4_IROtyR4Zj~CbK z8COu}-xU)&^^`Pldl#8IyyuXngS_k2__^mimtN(PFF)=%{9{t+V28%Nmb7a-eeU>f zy(T!e+ZpOIvDd7-2fK8f`&+L7@%H<@?O*qbS$V6m$H>;b+eV$3u}~`S{q0}DyCa9r z=-o4+>chI%j`q&eN1w?$#`WnI|F@{qXOBMW+cP4s2lVfAV0|B#wW$mH80v2G=|1dS zpQ`ekqRfRA`mPz&scD!nsPBcp`nhy1XXtyZ>dw5?qE&r|biY@#Yvi@Q8)nA4dQPe) z>$&H4{_w0w*?>oVYA=~MMAl-9-?KZlw#c5#Dr8){dQbNF=VRgB&o}7zDq+EdZp#w- zZE7*bb#3ez%noP2?u~!xXE&?I$Q;jq`tARyZFX*dbNR~;$6Uwhd&~0%2maz&@V)#( z?@G z(0iq{T*`^Xcfu2f`lb9fYD2~kQ?gPdX+K5eZCRS~DJUeV+x0(F=BKxOimuo9r1qG(LE-7-b^XmRw-ljMLN8^ntF5f2PmDc#DOUOT$g9dD zJB(1?dnc)(tg}NY&l}QnZ^Nfb|B6%IUO3x0)#=3M?Z?M~>-QNvZEP?tXeL zd4H<+y#5boeR!QZDy-a{!Moa|o$c6U!{k@;w6P5y_uM>SX4=E1D_(q4>3CYzT!-#w z#|qLfPCwel;gM(hSAL(ok18|LBf~x?&u_RWz32H~K8#8`pT4opsns~M9LfFFe35nNLPTdMZ)~l-bpOP`~Y@Lx&{dJ-qk>Wc; z`;`7VUNTkv%0K4P@{Rvomuy% zd;Fx;Kg+6emHVyP$|eK4Ru7i6ot88pqsRB3c5R4zoi zgunc#)}JyQX}taVBE2vnf6c9=3;I#ZyU(outfHY>!RxC7vV#q^2O7GbIFoIdKl}8< z?>ek8q!jL#ZgRR|Xtz&4^lDs>p-d_#CrtNQgLRLi>eD-*idLag8l_dM9mM&Mx`D{?~rnms5T4#Ko=ue3{c@Zrcet zC!KS%MtpEdw3p>Jm;N%hdh!ps8-_eSFvqVTx7Yl89zju`bKmW++^FD*H1Fq^i7owB zrR6PiTfJrM5A*WU`gY9n9CRj6@VfW$kb33wzjHSXt#;Et-)-T_wlQDn@&gK{wOcTC zd49~mT*o6GSMs%M$ESW=SY_aZ?k>aHRfrg&e6Wc;_M1IF3iwIB6u_@ve&u7&OTHrnUIrivNQzwIj;IRC_` zrh{IOsT~orqQ{_ji6=A0IZPeo)9S$CHI4@d9e$i(KB zEoE?pfJPfdxw8kyOl;Y^VET!{8{W+E{Z!w6$WPhaSpVDJL+pOwR!3jW9CD*qP{+8{ zi--KFJ5~Qy;>96TrwDJ?YxUL8U4IVOboL7w>O8f{(K`h>L){H){TqI}cIbkFN26XI zzcCbk6h6;}asni}u(?sA$dE`p_?>;0ZB5~n74yROEad8}HVac~%yfkZ_LJga8+22b zag(6LtLV3JQ*Jodwy3_un{sT(qw$Y&Ku6g5VoV^>vkZ|s;>zJDkE0?E%Fk87Q4L2e z91U>p?%)_w+#|j+laBRV`4aYtlzu`E9;|PwkIOy@3|6kEd`{Y=fr=ZLh-K$V; zP5W;A&C-7wWmfXxbD-wCn~*QJNLm6>>#_e2NZ{|)Ep`rjl1=CMOG{L6&&t$EJ+ZMK z%L909@w>vEq1txD}@$FE&WhciKp@DOkb=Z^}%+$d`$|Lel=KUR$yy2o{ILR z=A>R_uZz3j`6qZ8A81SiUv)NMA@o<|hZEV*x@Oi;s>3%e+tv)5&S9{aO z;wHPF+U()IKGJ3n?wvQ-?4e})cRRL1`xTxyW_mch5RY%?dfk0zvxhZlQky*-+r6yW zy))9N$i(7375|F{d_qMz_KW8on4Y^_#^cvH)#sizdk*|@wauQF);eml=aT)3)MB(h zFYW@!?uwHDEgG7XV?O= z2hqNB8H(oRkX;Z@p2kq*-o_o}H{Le2Nzpm|BAXQLyJByXqM5%hnVeX$?kGH#zu2cF zo$r5lL5;=_Ix>`2O2jj~xtWa`GL)WrhUdO<-#cGtDE;9ao{-FaI)BzCr4QQfwMprx zgc&v|ElKBcdQ%-&)2$IhX=D)fJK?(-45h2IcmgnYTQQZPwA*>!23GrMlhSIc`!*>Z z+w!ALN+Zil!;U2V6Q@F7)}NB}51c`KlY7=+MlkMgqJP-E@yrN*K21-C{&4aZGlHzs z3)g-(B)MTBKLCIf6?g$JiV}P)-M%BPdC~t}*fRdEjM{u_CMVlj-G&<1c2x1gVcLiUn8ISj$ z6#FoL;@rYY~3jBLw}7AW5}VGT2~rC+s0`P@Y=%*Yn~Kyp01 zb_FxCUX?{CAARbK&5?a`YNE}NZJQKrb7UpQ_4JMe?GFsD$&74nchU)QCnho@yRekj zm=7G^$&74dJ(5?zk3TUZn_ORv@}PQ$n2~WCN$<7ZIm+h9e(Ki1=E%k#*=loSmul6h z)N_>onwjO%sMV+Bcvs7s;{31M^O+I%ZP*y)-j1=%h_~a-Gk8b&5Br%B$Il}DJbaBm zGh)xXDCT;f4P-_)Ieg@cgbGNh;O=ipnO|SJ7&bG351jG4ZdSWTpl$9*OykXL>;JDAX z+Ay35I!Sacb05ZVV#@qRC=YqRmEpvRjikrsz3;|w;+OjLZjZx%wr4ouxSi^!m#e~X z;>j}7dux`DVK}j(GkFXVyW800#K})pY;vM5x6LLeO7cPcoE+?5M}A^B(Y?DE<@YNt zWjL|Uk?cs*pkRg*)6SAUTs{g(+G3n&97XM48g_``#NV>py? zl=SWFV=EaBjffz9($vS7;ZT=aRR7}otu{I2?r3k5Lsw!S+2l}3{k05I~fi+ z?4Z3!^TRtZ9D4Gc?BMr@9x)ucuz>vkDgCZ79CCN0`gaS*FdQ0PgY?gLIg=R<)%#tH z^1*dyF&yeXi}c>(3QZUeZGMBdKXBpuE-)PW*qLzkt3+y(L*4xUvdN)U4-)6xkC4{% z>p`=j=u?t!6J2RuFB*4;;oOD-G0L9>&to_@Hl#Jm=gyhRaBh(w*{`WjCNrGNzD@e` z=c9KR&W&kI^Dc48FotuR@uE(=Q_E)%!?}*N2)Au(Jz_W)_<-hhRGTn{bM>3j$Tv>i zXOnZiws*D3x!Vm_+T`4%{vk{3-UikrY*>Fv@^gDPyl;rR{dgh6(ebUxKNNp_%5Zdg zC*n`2$4?ALJ;gL%8c&|WaJ17ED)-vCo#E)Qzbl|T{Q3ax^UQmQ9WhUO3SvM@#ZkF_7$d z+|^qQM`x^}dA)u`Lx!XAm%c*z-T5I5N6&pt@t62zBZi}UY;qikN}$; z{q;tuO^zOS8Dx{A$t!NJjXt<8f#$6BrzD>@;yn?_x2R$nPG|f{e7JaL9mDCmO=v#W z@V~=wxE0XVHaT6A z&o@PsL$@2?z;ODhgzVh1W5x>a|fP3uod{$H9z`egTH0V9F9 z^W;wsjQWR>KvQq>i+2BYl951MF3D^Dl*_CHnvnjS^h;Yt0#D{p{in+|G7|U@L;P>M zs}&=Gu?d93B^~}?Bru^0;rad9s*D8OwxO6CduRtE0sZgf|95G(laavt7F1q)#Vkew z7jDx$-SP84n-b`{*~6v;VqZ?PDS?vwmxhrp>LJ<1NTA7V!dvJ4`HTc=-61;5ecZ)J zptBvtgCjc4V-zG8=(6?@c^7><+FcQdhCHpw)FIPqadCnyF#<7bT2|Otz zf3N1qcZ>v1Z6G|)aTvo$Ah#mrMYW3(7zs!YQJ!Jbidu{WeCDB;3w!vpO$m&9k!Vu_ z$;q8;O5lByim@+tK4{gDl&saKq+Es%ApEC(m&8b>!#vV6TUN$1k~zPc_?h)W$VjGj z2P!|dbT}iKRl}(LnY(^qB$M%y?8~2z>M@dWd`y0n{K`m1GK2RJ9uE06VkDD!jr8O$ zO$|meZGNQr{#W8`MlzRQ5&v7|X&A`}n$djhG#P27&SBbjao$u9pm_#h)0_aii~1DEY&B(wAl z@vU>?%Zy~2RIh>Zano8dlDYPT=KI|%F^pt{d&MZPvO1HI%#ZUa&hpOmu_>9x)o$CA z%<|pSZA#|5Ha(lQ*i|Pros_cGr=+|Jz9O7AuhN{6SV7fk=T+4G_Q3{D>D*1=TCfV+RlrS zSgmgeZ*>+nvMI5k^~-EZ%xBp!n-VK2uld0gmsJ_vjFDJ_!GzDXfBeEoOfMrkZ*N$` zNNl7($!pyCx{SmQ;8nYb3t|HqiJintiZSo1ea%R0XKQL_v+FiSVvDZ0p?v7v&y2+S zN05Ffh>|iA+vG`hC+DA)jKo$fZh`W|R2?I+E%Qn4+f)-6iTxJQ7Ud^54qzm0KLJUV8A-OuAp6^BU0a)yeEjU0O-ZU+ zy4aLtNjYBVjpn(a_%)0qH7cUN=IfP=BomZ0FZxI?Gm;FtMSgg2nE=zvONOFys z%KLc^WhChlM}FzU3N0B)j-N*QbNziKBgxlcWEVPAtied~i5KM`q-XsZN#1fLeooC2 zGm=~pOE_F%oWi zl=SMW*o};Y<7!jBt9t9%jD#0vQQVQHS;|PbRRH->Ussng5`Os|#mj>A4;Tqc&d_}K zP_1JmEILB%^d1nwNH|AG`u49#2_s?AY|1aq>pq2%aP}wa*D%!2ri8<%ceE+to=;ob zlyFJ;cKeC)Kc7#j83`{xLUbnkwr3=~s5!Oq-OU6>!f*SN9&T1+CnMo5O2TuHwmc(Y z|6$}Ov>B&jB;4>BwbMqim67n`J)|ce{QZ)V@W4+re;;0~#z=ToF3rcGhEztvgLl+H zxqVzEM#2;8kv`0?1>i;*z5f$T_>{4yiq4fP0ztHb9q z67JA|^i^)Io{@0FXT-OsE5mF`c*@-#HYJ=E_vbsw%+JdsniE%wJ|*SuHMJH_pU?fo zNWNeY@xgC{oRNIM5MhSK14PAlR-q-YZP|H?f+DR9{AY$4eifdjhKFc8D&R^7TeC4(bB9?EV`FnZz4F(b44qoQhxrsF%=m^ zsJ2x^dBTEh zh`IJ(+eCzR$_1N<*nRWep_#+SPKZI9)}N9%3FG79)2^Esq@;WxK1csDi$ThY`yMD? zcI5{KDRYj{e5?{EWRNoXG{p;@q8>9y3HG3Qee{=k3{nonll^MuJ&!@kykyE-c5Oe5 zL5f1SN7EelwEa5zN$HD1}U@@A0o=LqtX^;_;RNb$Hxe17tK z4F)M5`pPKpwC*RHNa-7|v5AytlXlreN=cklzeRXBm3oRn%5{D|y68JHNE!DB+3_RQ zmoiAnb))&U|9)i#DW@KhUHB-7VUV)BJL%i_rN1*s>G>_SKcP!g1}WFJlOJLil*k}u z@l4`>@NFrBlxxF?|6Lns8Kij6C%jdc6fj7sGnxF5w}m|zq_p2f{@B*wCk#>&?vf{` z9iPP@Mc7PCsXq zS6j1%LD0{sG_Uv6(l7{`l}~v7_U>{9L04prP_FuXhe6QZ`Q-QBa(=`hD6|jxmajte z41$LEk^XUf?7|@E_+sjJUhSg{f;xthJuT-o)+U0cET3r;K|{7Ivx%UR_<7xx{OZ;Z zPB94jllL3veSe!lQ0ExZ^F#ap%pjljdxR@8{FqG2vSd@`E}qyD1#tp zj{F(b4}UTUI(LNfJaPF320{DhlOAX)b7c^8{4(i{E90XW1YJoaJM#M5Qw)Nt5!|@L zgQqhH`nn?d8%uww${=V&51L1BEA3_wlyiyn=bN4b83av8Zi@24mFWzEdfX)W&bWJ% zL6Ghv&99JKFBt?4c}j6X^*t3B1Z|p4{m#|TWf0_hwJORF$b~i$)VbMYn+Up5aj;DU zJyAYe+9>sR!ANr2tUe`ib={uyVXH^27-Z@AeEYyra~Whkyh3(i)2AT}vVNUJcI{S& zhYYfsTqC{rw)T1kSx=-izfO1G&mil&wp3oDFr7ix*e0YmgzsY+WOeFHp6$lCXw^g#PLZy02qK1}-R z;rFi@WTofv{^an_46?Q_BR|b!_H+hWw?fD+R}%*_$SQ~={T2{jjX{?EbDBq|Zv4a` z>s|%Y!>vZ{XOOj|fX3Tpd%R6#{qf+sO=KO*cx)3{C2>`^KdpmYd)bmf*1a6k!+qc7 zGsx=HnfUYfxs436oKKK^d%V5LAj@?e(ch`!8wOc}C(-FE=KJN`a#~^F?cjONTHt)qCE3dI1${%F+VUTq-gY=cB z?;i}Z?)^jgmaCHj7-Y4`5TSfU{Ra%PCJLy$k)|VqtY12aQJ$c7XOJZdB0JJ9t}25p zWp$b_^KbYw$nptphVnxvPcq0_*pl*QyT5M9AnRyd@)Kf4BrwR@`<&**`YOk5B5S+) zs7++mX%+EQxTx0XjRbD1Pf5J#D!StQz{Y-6nnYi|8tYxbbhv z?mT;$#31fXB$e-L5yK#^$~_ua#chun#BEzleEzU}0)sgB4R$C$F|aO!I8}ABo8A)| zF^F>?OLpP# z$tS;P=g-R-#66ioc7Mb(F@v~Gd4wOip)-THnX^eQ;UoPR#OZZw0q;q)3D&gIxTn}{3IZJSNRJ-=4lCgMus?QszK z$r%~>4B}*og#Y|MdohR$&ZK!Ad1eoTxVoQE%pLG~${_B5J?a1P1$!C9eY1=FlMexo z4B`&{NaZ!Yf6pN9{$C`Q{Dyxph|@cff7mU?i$NTxB)hi!%rypa71z0;+&+0agSels zh*7?3wTMC7#LXnH0or~H;`#*>&Zqah!XQq%hT^{C-F7gDD;Guc$hG%y260bslKyO3 zzaN9R_TN(ev*uS}4C1y|C0FRLqs|QCsss|>PWBZri1Xb*{jNH?g+bhKEzPfixs;=cO~f5b^f>KxTJvM zPU%YXcU(apgG4+~4doRUcVLis^%>2(23PhoNbJ9v+L?5H9D~H8|IoaCwD&!OMDJ|U ztCI#+XOOsQ9^vi4y*vhq{r)7pB~0kbAo0cD#Q&bBmoZ4}IhXpqHQtUvqUsgtdCylX z86?gLpm}s;cNT-hm+qv0{_Xw)gT!7kcWP(TF$RgLok@RoYVN`y@nbac|EugK3=-ch zr}lez)?knrEh2h02VG{6_`_r3bL_bj3=+S+MDfe$jFk)$+l;4n7EH-!kf^RmcHtl2 zehd=hZxi3z&ULfas~@ zZ9{qQH28j`CNzd==HIYH$?NMYOE3bUWATheR80E_|CNfA|>W^aXob!GL ziR!17P_ACwnL%PazfR#^u?K_1LqmnApLp~pgT!geeNn#qkOzarug{ac_+#{828k7T zKf$HpD+Y-US7@GwNjw-NZk|Z`ZSaN|28nZjB|rJm4JQVP4KEN54+@hQB(~Z_a`|(@ zCI*Rr^Y>-fn%0Ry;)(6#Z||Ewia}z2HL`dAhR3__jOQM{kpts{fb32TTCQ>W}@5c=#S)pywXHG|MGD`}oewk%^1n*0sL zgZ}-_G6;QhjN~<7d-kmk%%q zZ5Kv<^4(jP7=#97lD)p2R+B-fYdMnnz;E|52%T8F5z41LeZ?R&sR8*#D5M?yE6z?4kQ1;v2U79gpT^W*Cs+AMe1!Lv{zq4!=2S`B+^{4{*=UR^UoBw<~-TM zAUBo2A7{YzaSU>UzNc}G?pA?8uJ1%XPx6zJL2kKmlz08+#1sa(`vPg-g0y{k2D#xn zl5a>mHwL+~6w<@j7qnxLJEQ~o1DEe-G05#$lkBW+^hgG|?P`$ztTC|$gIw3wM9J#8YlByOi2B-}0> zoXsHDCzbR@g-Tfra^JTm{lDzRC&6l8jpzi<%xlj0gt=^xiGsxYrpZvFO zUrk|<8(u*9lR5Lk800=kBtPVQjfo6$Cq>ZwUE3{)L2hy)>3>!F_Y86?y(7Q+$AWeY zauY*|4^l-P2DvBOP`_1vkTb{~mrQn~YQJF&a`jV)KU)r`Gstc3MSgx~pHU2Qb4Jj3 zo1U%1AXnFj%5??@2D##Hl~L|HJ%mB7&mVPA{?AGmo5*cn?YvFo#;kj86S*Cm{=2L3 zh{l7-x3T_|#B<0F(pNXTEnpD6;U>v9>Wu?~Xh{y$pZLvE2GQJhic?~zwr3FSv76*r z;qVCt(SO#bd42l+8V1piM~G3rshbyr==fF?ht72tF^KMSl59=DD% z*P9tcAN!Hya=v;zgXsG?WH+-Sn=pu;?n8cKm5u`#L@z%|{)5{p9|qCA4-nt!5=8{qMD*7uqHQ8NXh@VzM3=;Kn{d*@k5=4Z5WO;)@O(Zhl0o#M*TkR5g%cP= zH_Rn`?yc8}LG-i?vM+BRJ1~eIm`r|M-!rEeL_hCF@!j>R8yQ4**iZW5$F4syh*mEp zzR9Kj45Dw;Cwnowp@>0r>_oET%gbpPME9OVyjl5wX#4WGn!fPs+bAib$yf=ELXoLb zh78F(C1p%PnTN=bkRij@RAvbolbKM)GH0GLRYEEuL#BAoI{Th`_TJs!?~nKMzWWbl zpL5SWXYaMvvz}+~?oIE&A^PuRGofGaXBvm-+TDTYV}`yQqNf#N-b1^2aELbYNBzgQ zy(x$2_2T-wLF{Y}(e_WO2Y^BnQC^_m0@ z(FrS{b-7O;aEPwc9{EN1_wgK}?|Q;drr$H-5PdEY^WI`ZV-C@c8e?8w*-YXPeJ2gN zvB6$PEuwS!S5}MYoG+eg5j`lRyLIl=9&Hv0*Q8r{oUgtQzuHKvfJ3^cCGbDf;sJ;B z-ARZ$eGNNtNMAM>y3x!!l|#BkO)H^)luIdx^v%P7=X}#Z4(aii5q~HBdBq`pfer3w zXVncH(jOKW3;i$4hH^-c+64VT z4(S2i!Iyzej&ev>gn^Hvg2!@5w-Wbj**xpYA$?3+`2QtEl{lnZi2Gi?&VIomJ^K#w z;>M+oIHdovg%8>2;l?3-OLJSHKQ^fqhx85IFrHyIayXOF%)`p#Fl#)<)bIHV_wpSx0}eNztUng^|f^HYBZb4cGJ z?yp|d{vC((6NhnrNXA4C>6y*IqY05aIHX_K0M5VfdBGul>>2o_8x`AfNWX9kWfV}MZ$tas!;Sk5uvd3VfjkwayU0o?~T6#9K;p5++uXE&~6T@cMNV3t__Y+5pk zW5A#0&cgXNE5~yTD6WXSW@?9T90PXjLmqeQ_jQf|-v)v&jcubj222=<@xPeu%`qVS z2z2{Ll_ZVH^+A27~qo(AEI%8FvkE3@$adMM%?@tna(kwR&~^GEB5!~7+_uzaj>^R zWwi|0p`EXm0d>8WsbxTU{D1$0d2hX5mt%mr=uZMJRp1y9+Yowns_{FH0nU5Og?`T) zg&YH>M1b$z_I2SHa3UG^GQWRajsbUD1GgTvTsQ{2$uSiA>&$4tG2mktjAw3}DI5dp zJcEBu*1gFwprmM z7l$|o6vxBQpI!KuV?ZYb^2hN%^*9EYnF0Uq!M)Tn;MS@HwG7C&u~N%`k5dL5Xm0oR zW*U+rs^OX0_SYYLtTL<>$BaK_z*}g`K^!xZ8Y9kL7;=(h#u>35c>h})ju}rsquw%g zpfAUa9m|0K)@P$QX3VgKuBM)F=a_L?1AZpNw>HNN#}w#fr#(3wGmZs_`jd2!V}`+N z)JUBju|E5=Q(ul8^SSTOeDr9WAJf~88O=tH!VFQIc9X&jQGCm zzcU;&rd5O=yH#Tx$BbBG#IHdHZX7e3N5TgdyWUjGjJbO6)G{Nod9hk%l;_3Z8V!W& zFP&AHW5#GR=)lfuV>xDYY>s^M{^#=?GfY1r)+M; zG2>w({C3-mXE|n=j>o+}?>CBL#{693gYL^ zJ(+ivW5%kX(3w41oj7KAIfK_ntEO|zIARB!&rY`Bn9;ZcaMILsC&!FFiSXOz5jQzz zEUu0IA8-6QX6#7Byx)2Cfn&xQJ=AT+N6%5q4Cl3T)iUG8*u`DkGWE=!iGw9vK-tRk zrT$X9Z^r>kIL4%i-{bIL_709Q0Z~@M`3_U>ag5Raisv%e?#eMn(*(S`?Ru4COxjlP z$Sm&^$C%rH!6WlKUL0c*9gq(;^LWNFMpGN(-_^^EW6bYRJnN!4=QzgP--3L^Nv{US z7;7zz^E~bA9AjQggHLV}mCP}w{&75SiHAAIn0#;CPxsgVv{}XkenI>?^Jgl@m<1lt z|MjM+9Ag&sMSKr%d(1Ir{wcig_W1c6Vic{Isx(%_l;A_n9B#7sAWv@+3RWOvVtLKYU9x#~71ch>uSF8gh*J zQx$Px^UO$&G1sqP%v_TjbBvjF3iGn7?q`lMOEtj9B~Q9>j2W^QIGCI6cfnweF(Iol&i$MlbBsB4 z9z1Q{_ZP>QGY6f7{vSQ3bByVK81dTXuqDTsrf0Q(gSLlw8vkjxqMFaXJ` z7{{bOmvQ|=>l$)Qs&N?iZ+dYP$E2wdh<8^EnsH3BJ#HfOuX(+bV^WJRc;4U-i#aB3 zIfnf7jn5>GNye{{M?45y&oOEAHuxORw|*RxO3z}xT0URSG0ETnbi+u0JIADybJjxt zm6l~3lPYxu-*X%F<(L$9%1Y?pTh9LX`MvmeH}#5<2;(iY8%LjS|X_cflT3`<(UA7DJQHsCN&e+JE~W4<(Oo0 z+CezqxbjSnNjBo=qEETomt&IUIry~PxEmak`gsFaDa{{qOd6yEA7x=^$1!Q`ZY!Z* z|L8Z4Ng1aRH?{giaZFmKiE$gcVU1cQg|Aod8gHtvpYnhG6-p29$3 zB-HzADy$T?ibjg&iZ;TxwDwf^D}of`6*Cpliq(p3!grOPQCwF%RlHaHROoBe(s0u7 z)ab1-Qe%e3a*YIyQyQ5XZ#4dBm}oZC^wu1#8LqinGfDHRW}c>omW7tPmcP~vt@T=` zw4P}F)T*iNu02?Lp7u_p2tw1)(A3h>*4EL{)vZuLPp@J{{YsS#3=9n`SFTdU$f#=7 zYR1MUCZ?ulX6EMAtJkPmvsSIzwd>Teu&}hWvZ@Q&RcI=7g=a7kzJu0I(M-`!xc4E7 z35qC1tYV+yyyCIqlcJ(VeGM;-!5XtQwrHejWNT<^+G%#zoT|B1xW_M=mRjAkW@#PJ zdZA^c-9dYXcCz+cZA+bjI%{?A=v3D2rn^G-wr;fw{VQy$kW;}J100+EQ&pr_cU(L73w@!v4p!frdk++~TQu}{>_Z6;vxCFmJ zH{5+lY3IapF;KYs?;{%oAnvd&^6l-^Un3A-_?FY`!6^8La&2j)5%ABX{l9;zh|IY2 z($&dN@>IF*PWRw@sU|*ErHXCEeZo|~0#9|IUeNCH^Oe)=d$4m$#5=AnHU4DSN8LE& zjoZ3RDLU*+@}HR^UWhH|e`Z_co&Onu6|ViyPn!}w)UTd&ef(5D?S>i^>mokNjXdp~ zdt0_M=L;v`X>Z?}J($L!_&VWfm-MstDL=n?9@<5T#)P!S7r?hSA@7QY`#dVw@L&VM&g zf-j|-I68UnV%8(?pc_W#)|d=?)x1jwh0*EoZe4zPeKs<*acuesewb_V#jCW%&n@Ko z6<$m2R<__f@&CvpZ{Z(=oeS>&_n7*hM=eO-z#cw|Gr6 zK3Ub2qgEOcwFo{_Ze-L9&h|gW@k<=FR^gU;JWnxdGiLROC>OtkQ7h@^+MLq?;jO%u zu5R3IW=r`^rQafBW2RfE)#nRy^+mpjvEYAa;{P^kmoH6F$uK=?rY^-hQQsg<9<_c; zI-BcA-NG^qn3(sjG$bJ6xZp}5^>3I<{OmWoyef)d} z^%km$qh=WFFpK9eMr}ylS2dM9m0u!^+VZ&z?BVmdcEQQ-!dEM<6aV#T)?l}4An4;k zX|0h*AmaZ280DKqzHL!AK%+G$9ma@|v+IgBgd7%ElVP$T_qkpBOS z@tZ|Wx{XuPmmU4qb?kza`pJyGen|LgiP!Y#H_|E@tkMB$^rz_7p?r=!`q_03*iblE zjsCjYvj)@pFO9y>j}@<(@llTcoh5_10-sb9NB>XIX7TSvseS?D>n?U!9sjH~-HG3Y z(f2ztR+H5|9LPUnJwGmn<~4eSW^^XJxe4k{e2Z^=L;Sl-zF(pA!|G>CsH>=*En!_r za6*WFD_@wp{BN^WkQQ;U2HupLE&p>qQ3U7gY-xJ$G*IG}nXL%hFVm%ar)MkV;j5i0 z-KJ)1aOop)os_&ro~^{P+3zV{sAj8@Tcd0ye^JiX3A`GPvm;av5zD9pRy@DPprEjjDcx=uk_mAwDNOUrTPb|d`||8vb-FWd*6 z=V#HsL9=sW63Wfu$Y!&&$@sIgxT~<;a%J3MW--6jl+Dt-(6czA_bU&TPExaYr?j9G z6~9!o*mc(Y2ug=lvuN?~{#=Hq%2_lWn$(omXTrHk2_xE1uRz6FjEOjln&)F(sP`4e z3bQz8PSzpuKlDGsEPnVgO#D1Cx*N0Dc366c7Hp^ZzwKjAx~TDcLcwO>Ea0lVqLPcK z<0y`(pIxCYr*sX{?1tGmo<+QXLp3-X>|)ufk(Q>ne}fg4kyv1~-|r+U^0lzPj|?pCv)4JtoL z&F<((H!Yc85=Si_?(Y+}l8T$E**#aNrAg;&grg(cx48Cf1rtw|vpc0$$qNzB!n2V^ zX4k*xlSWj$z#(yVZ>7DgO6iRF63p(@U-@5E{()Rb_;>r5wvHpjb!Sx<`9;6%g_WDS zdCyDgR!}Zp;5EwpvAi;q3##KZju5ZN&$_U`h@16^{Yxsrj}fmZ&$@rX#7OuhIP8BP zM;B$+33<4y(8ovku+5){Q*hXZ!RMc>t39|hzg4ce;=qqP;0w#?r+S^&t|av0X8oAw z`gCO+WM)0iuV%4SS7BzoX48(M4;S8p#L;aVOoyH;oY!>36fqv5UyP&Rbc<_UCcO5f z^iwtK%M@i!v_43)Zu3ijo0WJCkry#^yGaqW_@@1+*oJ&I{00f z^~xFsMUw8xhx3w>V{N9D^VPzG1ZMcYqwy@g#%QnS3m%8!F=Zaj$8YI%<&~ctK}Jy? zCBps_MjIyf_qli}3;KzSf<{TVyqDsBcpfD?TUge|J|Z3^>)-rx!8jnJkhP)n+D_lT z#9)4rQLHGuv!s&Sozksl$2^C2p0ZEG35Sw9>DeJ9?_g1~V^dI+GA>ZsFt6#m>&Jge zdLnB>mkD(P_C0VF-dAiCN&-Jszb3~E3MCo=yQ%S4q2$YtE-UD`FQKH>pzcX*zDZEB zCS13lkg?FQPp8%A6nl-L}x%!NNl083NwAt(9YDRk_8eHybtGqDvBVM=k z%yo5s!)s>F(sK1cyii$B;C+L1P4(yz)=#O(BBMw69uN*aB{S-;MgGfb%+3}SzRp~Z z=VCQx{hOh`8Xv@c^61%hF>)pFz@sPQ->V(K8#1LoK_~3G&KeyV=XWRlkke`h2kg)qv!9|$%%AbQ9{pyjJquv{ZXPPu1&jeR(}Y3zMib)pwdrrzao0{qqi0D_yKy_ zq%~ylEWSiQ&j-^M;g!kjseip@UU_q8lp3EC`Tfwfi5TZ{ZC*?ed_S~#;e25YLUg14J%z}nadzj?hL*0%ai%oMcwTR(*!vRRXjFOl zC%9r=l{6VuvtPgUqvltIsyX*wb*A-4LRD$Ci$QchBG;au`q4TwoRTn}awDk9U+C6_ z(-{#}^~S7jqVoUB7XeknPjzr)t6Xd&6 zDA&tK?jyNl`MBhcS+ohCC$DtJEZT&>vrzdYg0_~11!cgS?2`!E*2N5~3H_JcF(M$) z_Oi>|7tnt?0s?K3mLpGMeU{a*tL9@*YJA4{BZH;UcJi~^$Lc~qkG6^qgA##fWU$01 z)eWfJzh+SI5dyOS5U;E}`xCpZkZ2 zPayBDP@-)?*w*%JzE9AWKPLJCrK zX(Yn-cIrN%@uqY2fj1tVW}2%ikvb%c&Lqbtek6e*E`CmhxHfa{l{pP}dC*Jp=QKL! zBz%9S!W)gw_db+=lhJwMYvu~X5oJ@Mb6U}22dZBop>y$*C#z|kOXz$WYk7&QQ;F!D z{O{mKRer5}6QHwUk1r39-!V-zBi@lp1L1huvAub2xRV>NYqg#Wlfr@>#6dy)ta)E+c%Ce{a7P5rs8L*tlD zzzM6VDNl1>1^hxCfJg0{_yKoOC*e^$c1Y)G$Wu^pc+jrZpubx^{OgyRX})rPV2HTJ zqc(Iw?;^wt9<>*jgf}K}kVWknN4*wGyfLV?C@vB|9|M=7QM;%1Di>9LM4{HG{VMTu zByhe^4G<%E{+Pv2jNY97B>7?CfKpSR#;zI6w!crX___LYKT!K7piTAi_4fGQt`kE>tMWnlMP8G3cOJvm zi^##q#0MM7@kl&G>a^-nE_}{_T9gZZK&Y^kN4c;cOsKHXDF3hSFmW2op}dO4B8(f! zon@4tiF_ySZwADlD=#UtALZxakeV1s>(r-R=$*>i`_evv%+MO7P60JkX-; zPo<7ADBqj-E=kfo8s+P6-3(FX-4x2N_V(C7VT>U@E&KzV}CQt^A@sD1@du6VijmN*Xd0RiQcQU|Gl zb7bPiMFoe|98e59l%s+D)#cjKMDgz<)M+`+RgZGvfLfFbpDU&E$4-j`Ew5syGkpu< zEGk4a%2TiA^nnhL9G^mYb1zHOfq9g>`>qkcXN^a>X0I>C$b)#4SFvljTj*BE{+OVA zr0eXv<5@(3v#6a4Xei{h-^p`+htz(4RPui!Y`R}>Tu zU0ZK|v%E8l~l{Kt;&v7Fx)QNBoL=jT?^?I?c& zywc8n4-_u#Te^uET14 z6+5#kU#}srk+MSx{ax+0+u?>tEkZ_r!d~mez$YqP#D5d?uiq2)2>L@i8KA$_tUb%2 zldQ&fJveo$doSoAtMO~hF1Ypy2A+BJPtyAO6?`YP2pRpRtBT^GW2kWDFFgL|!q+{u z11%~zx({me2e?9otKOIeVbh9?+V4$VGr&#Zs|g)oHU4UPza>U@MSbSb-{#ZAAIiE4 zgMPz*^%mkfXf*mC-~D8d@fVv)H^K40;+~6MK3o3UsTmHRk@(SaC${q3jicGMj z)%q6^&^J;`A&v-adE`6J7dRoc6qzm4&GH|CkEqQfzszy+()Bsqh{$TW)Psbcenv zn~E)dooauC&y?_~1`!j^mIFV%38P9{G^w*21H;*D~BN_7-$`8;m_7Wh@B z32bpoYvWkHzGUP*X<2%as6WgL6!8|pnw!-5G_Ns1bt|yvlK&~!chs{;_+9{^B3YhA zf}RT%Nt#8Ou0usRVPj76j;XI2D-`L*}c{CeyuFTMIPW1Ij>ijF~4#nEOJ}_ z_aeD})e(_J`tI`{@q7V`4j<_sSuTDFESgz(O8opi)m6k_yvAf#jhU-veIc@cnv)lM zKgw6Oy;To5Q5U0dhI)1hBcqmG!u$#q)!O%kti8EW4A}J`cXcr06dR+8-vlb|PXWK! z7*+4I?lmyTUFmsRiD#G3xM*D@DUMB40p7RdRG-SE0rE1;7=l zP08%q794pIx+-Pu61$qsY;B2oM@5xpm-FlXF7W?yK10|wYtGrF@TF{w`q}T=)vFrd z7wzc4uAf%RvvEJPqXWB24!kl3@7Nf1V&I(zy3x>EHb$MwG7j1;?knKgrFm}jHpEj@ zRPFQYy>IsX@m;X1dO_hLp7Tj3chUZ~iWd)#_F9j7FAovy8&#^7AZu8C3k z6H!N!8)4VM&)ov4>*KJUJ9FTNFdJWk1v->#l^9H3p@u$G9IE_S7xDdDaDJ^hURW)XI=Y{d))2*&dw`4}PH{ zEIC7wbqV`SpnGggvpzPpEG`W`fsJWl7gx1U9t9sLRS^>Q9@zrcP3!gfBkBM=>wff} zc?jpDB22TcVXRF$#*Ng_zvim^h+^HLr&FnQ z8JTsDDqpS--=b_P)+yXgv!L@*lUSEiI+$I?RI=_@anDT*e-(svzV5d=w3aSHeu}K? zU^(D2{07qm)`i5)ddTOAU|o^3QClWnlNSbE9@oK@yJ!hiBDZlqxR%QfY?C#m&G z)eiYAIe(L!CppH(Mv0|D{aL7J(=2WM@r^lf!m~8r`076R1XQ$1{xcD0*smi-+p?REQjeZ)ah>yue}JK%UB@^m&f{^%W~sOt?~{iN0>vvfnnr`h16RPB&hs%i9gKjMW{ z?T}b{dAG%0p~N(1VBne5 z`iS!cOB2(+ir;6%v$S49@j>LLsA$tH?bYD)Aovqhw14c-&c3zL?pdtg1fPzGGXQ?fKUeOZze z_m#&)mX_=_&*0-MSlT>lO$5e)X#z{Xd3M~&TwgpP-y+6*e_b{4*XYYbk02}NBIG~u zV|K@tyFLyn*MFtz3(H>N`@1P;E3;RK3u@UbTu)hjAu%@Jc@q2_(si)cdBSE*sN;n^tdYZlWLyg~K{7J1+X0Kw?9c$=6sa4AC zP3w0W;Y-2BSU=~eQ=dm5o=VjhiM_Lm%zGkW$ay1S@0#10+TbtkY{A}B-+TC>UWZCO z&EAmPXB8L+HpbRV$cpzKfw;i4cSWE7-a+4Z_SPOpzL!nT8wq<0y;p2U9SN0sk~dEJ z`mDmB;V+$Z3ZTzCdmC-5dqw0a$KKG92QS0_@a)xH+oS{ZTxbk?J6bGRDb-79_Ez=^ z2sa|0Kitkzq7;fv@7_73wnCVp=M-LDYXJK|B@O=e6d{u4hYW$uACh(}!W z8s0nEk@flHj7VL(?DE&aF|rO$YOOrmh5S*K$I@&UJ_nd`)KaX*)kv*XW_yqEhLezg zv9a3W{y5`|^@zW0tiHC+wqKI?{ZKsHhh$A@0UhAk?l;z@6P^nz6D{p3PuLdRFcxh8 z9JFy8=8=unRWtxy7oBzke2h{i=--% z#CCtZ9z? zbY%VLt<`a#Y^>H@o0~dp2K)oh_FhBlTp&J~WxHOq?rY#mXjH8ByYzGL`9et_XtwWG z=-aA%HO2NJ*AluUSaEl85DqSK6 zMYgwhdis|=pRj%Lys#VP{Jg;SH{L(4lwZe;)O~KVD+oB`TV35HttDT?9Mk`L5I#q$ zTCr>w@>x~>OtW41{wZN)r99h(JXcs*k(@c$9`GZ>3VKUBbFh7XuFV9D8ynk)WJND+ znFpW7#&*B4&F{Y$iRb0nu2;NsKYS5ZR{VxHn|WgXGXt=FLuvo7n0KtK&}{$yanU~b zF*ddv%pI1$sUPAv8{6OY9qsLQ6!Xrr-6y(jG~y=D_9YXnMj|i6$_mYPZ{HpHxPPpy z&}^R@7GnlHkeaZ}_BGQZuOYrmRV#_@=Fjp*BEGY+{mG{R2ilEB{fg9tWwv){b8rUq zP|lxwH2~YS+80;B`_j%FZ2x|9ZK2SuAT?o`?dQgp4#xPfv3+`?=BjZs;ahmNZ#h!B z1=r!(UJ`%gB6J2TD{kvg*M3y_?@_S5&g2!-MSZ56c}I(0Lp=-9ir_1FwrA{Ia6!!X zIkwMo`p^=-PB64$)ymg>!_|VWyA{nJntfB&hgr6-ytNwm5gWz!8;9FIlyyL6`{lyp zW2p5e72E44tQGSw=~5EgtDcxYTGTP=fRgPCmks$N`w$#NY+pR@W64)>Kdp4S@Ka>_ z#lZcSc>e&ln>(*@E1##=)m`ZSbp-IhHT^?vpZs785af)!!n8kpJ|Z4b?u#HbZC)LO z_@%6_vFaf3RING)>$aRaoNoS84?LCgcA^fCY<(8P&q&p^+X0o5p$^M}9rX~uXy*@g zxX}IGDJ!9$^#Xdu)=OVmVSIRXus-ywF6M<-hp@-Z#C^zEF`6|et4E8J9|=$g=d6tN z@Sjq3Z9~QTp-_jeJI`#bB=oahz$f}>XjC+Gfb{}PCOqFW_a^ddULCYrwdwj%_a~l4oee8SlJkc;JioX;4Y*~!z?LJ! zaGW@U5t{W&^oX{0-``wf`zJ=sD8_b$DK7^GoP6+wuzaa(i}G z;~(<7%)V$0AILYO99!3N^+}wh+&4mM^1NyY`7Bn#5>PLYG6-^I)>BBTA^csBvf3x9 z#@jui)lb2QFb9F!Qb4sxiM(PDbHAbvl-wbhw&LE%~V?$glfq&LhSRZ<+crJe5 z6YD9$9-Ex;c#84iRU>q$SC+QWPipeAYMe`~>4*8kN?70{;iE@3>79UT6pT#Wig=2Z zFw5JQcc=B!Gk|KGOuezTxzNvg3awVxx|NFSs;sA&AF}LW=2OH$UNtU%`F+Sr=*LPJ zts0$bS|&m#dDXC6(e)gB0RpagQ*B>zcQngP~jnnn&u7oe;Rbyjl z?a|PAUNxe3H_!qO=?ns@@q9$kQ1~c1gMe!MS9UrKcPWyYJfr#*J= zbZDmG#38^BR{m&}$@-{ai1^5>Op3;ie8h2HWoF06I)IN@`6G1-Z(pcPjRWU9BA#O9 zZ&t#rqD~*@hCyZivu>S-`C`4vDoPxV7^#y(mk|pd&5`I zTh^Q8_gK2n@hb9hUS%r2snpC$=;u{to6qzHh`(6*E7`jwB5?PO!{+V0-q(23(-?7| zSDBBiLiLbO@hX#}SoU1hD`DjiRmpIRswW0~K7KMTzI1`o=P)W$!QQx!(if>Rm(UYs zXKtO1$pUW0MyZU(+f#34{>m!TAh}~3>2&;*RHoaF)7O~1NvSf)n`6JTzJjRCr}fXX zxco&_nK?6Nz9!ElzYA2x^w`=+;F)QH%G52HQ-pZUHZT7dE|%%kdXRKD^2E^{OVs!x z;UkWp&V~-F^D=lbRxZn{j6#8x%knBC?6=`mCL!uh0Q8^rGK;U+XDqscd6%l8lFIA| z_dE^U%JmVVG6_5D*n=-*?L$_XDU;u&<2rN(1eJN#$W|A6&Z|uOliL*-2iD7^Xte4w z=x!CEpY<}c0751rvv#(HRf;WMU%&mk99 zE@_o2Ox8X~1_YIful=Mt_%2mLC6&>(ndOaf zma3tW%9I^xT@yT#>mx*E600oN5aYG5a!IR?+kEWXbgP5+#4zCJ9=pw1T_1YTy&j4^%ce*q5VMpUM9 z_hHwo%boa5RGH|^piudK$O%vx;|C+h!VfS_P#N<}eZ$M^l0w7$)j2ueq+WFWe7!+B z)c;k#DnD1De1=8NP_Ifty-}?y37>DKs>^(?p5HDZs-#VzXk)P=D`i+vrCR+{r(t}^ z8jY+<5$C5(M?8|MwvsB{N}qZT{u3**v?}#D+&KqvM6SyaReF=RYcBjb>wVgv{17!H z0C=D?EU40j89)3G7w8NNsx=2dC-zfQ;D zld&SZ%ftNH^$(qDLX}2XOtXWY@T!zKKdKh|30b3&RjK%96D#15^*+`^-ww52h5P4K zY3=mMJMg@`Dou6B+=99>R%B^a+WBG806Z62qmfl?pMsM3K^TH^PfU`3YHWr!+y*Z1~>&`VWYWLQw8F)k72 zMnXTGVL_E-Ic^vS ztjM-^TDa_YlHKbYQ>jw(#!K2^+@vO{(yMjV5}CY7sY;(> zH2<=GhN#l#flaHj`lb+7Y4hFc-MN0j`VA}OfBk$7<5w5T_bY;SJXQQt zr&swVkM%MB<(hIInmP}KbJck$^h;G_R;>j8%&FDhey@+43g=@*nO3XbciqA;{$!0w zR;zDIM|MCw;??SOPv=&MUs4rWQmY!D`cHrZ_nn1))HsPDrVM`@xDbtyVibYn{dYlQkw; ztqSeO4+pMT4;2~X=&&eV^oPnSvZPjrAI+?X=i=2Wrip!b+z(k}lGW<0-Kq#* z!K+mb*CyS8L$bz1GPO6>JC=99efTGMhZW_Ef!n&zsHE}M$lGh*r>pgRfI~V{yZCXx zZK2f#J;Ha|L+!gwfd`ZaF;62RlOqLr0M~${?hZRx`pMQD$xyo$= z*Xf?73d@D)Cu?D{ioFV%^Ico$Cu?D{itRo6?hoRKRMnPLZ0hqKGohbSRa;WA8S9=* zhY#UZY{vHDUhsi(y@{yU@&0;ZeUi=up<+`Cbi9#wu%7F{=yv@YRl@bjS{TU$p<+cl zqNX7~5!-l;M4G zKI^&mU#`4#@;l(4SFvHSZ6{#DcoiG*w=mgE=*LPqtzw=PGwR^_SSg>Sp{t#)ZQ33x zmgAju3`U%+g~=+mwc3kN;GgweF->%aEc}i8$4WV^Vu68uT!C|`sx7Hlb&LL25Fh1w z6H&2M-?}D1Psmyr$poQd6)bGhq5o1iLRcyfY?ay$1)^pWxt^LSo zoQcqnm2z6e=GW=E3UP#2u^D$~9D)zWO8K{<`Dw@mp<=5hl=uTzyo#-z-~T%9lUK3b z?<<89Jz-VMfA|_Rr5~d_m$M?;>Pkc0KN_QAjjJ|Q<#&{dB{Zr14dYLmtYYmO&3g&` zS2mT3`o%n^QSo@>l{P$~!D)!cO`W@yv!YiO+`eBQgv)2(0 z2rBmCMXgzyxGdA+qZYk?w1)MK;t5{8hv_d@Jumf|$lwSYUT?`^vM*7+>IwVDgdG6o zRZsBw!VZA)swd!IT+7pYyCXc}eDAy6LKfH_6 z+zIoD9RQ5#Wslg4ybL=4Xw@tA**Fe)2U*LLRd4wwrvr$;WGzoty$R>mRRG>t?>1w5 zs`VQ09y6J zGZ&u0ypy#&S@pE{E-OVmQdQZNs;A{?rwu)%Gfk-8_j4OEg>D6}dbZWphvWLJcbjo{ z(7(yG;EQeC6E)q${U_J~5FVbq`SOEJg9>tXzaQP@ z;2b;`uXbdwBy~FsU(W*DhZ$+}o z?@_8(!#*?~aZuS*s&^vp%nQUFsY$A5wc+h@+`p@=o%n^Qp8wdgCd~Ot z)vFVdX^3&78&t2Qne$iWbIFGU)yv!J=7s!=ZIQt`#}_m#r>nwAIb&b9#k`km%I|Aa zuX@6M8?~w@tYZp07--e2=yyfDH0$*Sor?KVrz7;7tS!o_ceDAAMOH#TuX#+k3+!N^Rd3a}S2`Fs>|mf(@3np2Tj(BHTO=7PRL|}1eO-(XSzDAP26AyBBdBI~W|!YTK;c^l$=H z?_x^a5X499V0aQ%cBJ|9ot>e2k)}ekgU7=LqdZBbS||A~*{z$0Gu9_J=I zVcxNWfmXfh4Xb&&2>r^nMV0DB)q9Z&{>t?=qIx}Mb`-yFh4p&2)w*|`whFpIXRJ`Y z-AhI|p`Z17&lhR*A6ExHjaR)3sqTY>ZUwJ;F7pb$p-zGw44>A2edyi6sKkGG*uB|a zeZO~o^>56$_y@?=8p3AAEAEXJWs+J>nOydL^!dQxM06#;D%&Yi~nI z-Yp!VRL|5auAS_=WYseW)1kjVMWuRo;_{1W|0b!Pv3;psjQT5^;&#>kFBvh}-v##C1Q?})dJ-*s;fJ*1(gG*<;Tj9a!uy{1D zz{i)}m!f=;a-XU?Z-_J0c|-K8S4pAnB<#RQ*m*1c+tMB*p_0qz-5cFVIA7T3Rh3rB z6DPkJK*v~b*tPn&r?*0J|ExFkH(c@4Ap!A`SIN4?rPXj9UL_ArJ|gZ1zzz&rC7ljC zYNPIi9T>Dq&bwK(5A#LVMrD;;6YW+Bd62XUA*rPE$c!N91M3YvzB>GFG8^+k)<$KO ze4^1_f$Ph4z0D?2Nt2rQ`-9hXMhunoZTa*O@J!Z5WtD7vbM{fh3)UM(UuqrP*aq** ztK`&5>kmSIc$IWm@izoM3Og_ot7x<-wD+tCm7JXsd=vhM&WNFsC(@^j>jJDdTol{j z!0`!~FV-7wUeZ5etmr?bRfyM10t2Cv;YRv4$Rl`_EY>XjhWo(|3|b}E57@T>^#s-% zKF)nQ!FLXL!K-AjrS2Jwr?>-yQpt4>K3zk;FRemIDw$U~AO-V?9T=ppH@^;4^0Y^P z7sOM!u18dImCwH+jzT}35kn;x2d3l#hpacekXn6z+cd-r)*HIaGjKY55xUK*WF4pe z@1ZkfZB$lCx8;qW2oejrxhjwC)j}zo%tzd?XH9-E&OBc_JMyuq)5zD3nZ(^fVvfyf_k({^6 zD!FvR!>y{irOF$+AGE$+rHhsFGWa2>ih(O{tRUIrWY)daEER`8lnJ5p;%b zP|2T#=XUr*bJuTF+v9sh&UXLz9Juw^V+4New9f-fus>t4>r9M#4 zAk%5pux`bA%(}%Bm#m5cFIbOxX!4w_%hAZAdG&n%!(t+ymsii&rPiY{zt~wqt7p^m zJ!*reWDQqV&!|0)|9~ItEFty8wJV{Xxz-K=&|B;*q1Cfj^}0`yk4vi}l6r1=HtIQi zi(F46>KQmuu@-&|J4mPna3)YDd@!E~&HupV=2C6l_t8$u6RkLj@D zz~hViz&l<&Ck?IPgzL!lM53NYAJ$L7cw%SCfl-GaZLQWL3F>Kkv;8yh6gx}2>yykH z>RB&(uRGqCtl`S)S-oCPJMe<_n8liLtNk`YPk8lg^X<1C#veONNIfw;6Y5!_ojV^s zg!P!gmcgSoOafno{cDVR25bMx08YpnuB@IrgB(AjpI6V}Rkw@ZizKazNa|TPHvSdz zP`RE+)U(e1p6B6*>C77Hx#L-nN6ephob^aMLgJ`c>vYu{*?AJj9upRqZ76n2(uzT10Go^uWR z=hsf{S$ZMN3HapI^Uj=<&Q|E>)N|t?uRTf~W7M-~LYETB@6qbH>++1cEyU{x|EN5s z_4V;he=NW_kS43=f}2hifH!4RsppHI_bz~6Qj^s4>1^k{vLD7#qMirF?mL2UqnfCm z^$S0>1J3CN_1qe0x&`=TnxLMo_fNeEKC;bdcDpP0m%*QKEx!A3-3Z8=gT*(8V9wl_i%Tbme7wKGc6NltebG|wLR4K1To#xA|rWWMENo_NCo}B_;$E$7RnlDDcIj^=o8t>Bq4(W^@YTK|*#gUj_ zI-`f$-t6DKBgUWgs*{GEtN-6&)K#R_8%b^RW_}jGCy`g%e#^IXg0JJ%cKhxRKT+Sn zju~2QxAb1S33`GZGh1D%Tb$Z#bqi|yeOHZG;FL_9_J9!>etx)CCTRci1sw zm=hSNy|;QpsO^O}akVioyxO+&ORoU@V8;xtwtXfP4+bw-uR6Ty65Fj~aQ|ctT2@>A zwz==&$E4L8No^1GS4@Y`l+yI@sahaS3Z309rX=5$$HiByV`+obTMwc+Lmo;B7SZ^ueNiW{rC<4h8;6|SC?Eq z5ohY<{QJ%vE$6H>_!HKvZX9&Lb-*2=TiCyiHR!jl$GhH%E4W%T!TeC4x_pBlMZSjDtw);2rYzN#*O;TH5*CQXm zM^#g*?cfhOH<0(qji~MX>~%G$x-JfjYWsMkMl7xKH~_W15ci_FbpPlRo1nG^)y*x+ z`(7`fv=Lb=KSxq`H6bhG)1ld{?hIA^@= z#Q?ok6}}^`VaE@xwy8ejOEiRjUTsqkRdm38@@nhm^3DbQ*zrTF?cj~3rHDt^@pHU? zwYa#7^KL?I7q;~L1K-Gc+oo+T%C2gHU%c98>-4S!Kf`+4(=YSq*}4J$thfE05EE~{;Dn+xJTDAwCXt{HTq(p&g3*4y@IyytjeZ`{9JKP75w zIdr`p@Fv$!iP|>tUeX5lPge$@wxO%s+Jf(7tz1^yficgVfOFQ{_FJCg9rh4$f%UfA zcQ;P|G9Tl>tF8b3N!4+EUTtqR+Fb$nj~zd&zLkFSpSXSi)VAu!IB{Pq>usB*{%Kuk z3jN{LHpMOU33LNHeg;g}@{Fpt?m@72JHP4S{+%6#eqL<{&y2i=x&(IoNRuw50JHTS#5p#rZmJjORGkb+8&83>JDB@t45OAUb@es>(~6nU6YThDf7EJ&LD<3(P+N`kD*G_MyxKM>tRNGFzd~67*Ey(=FXPquQqwCHt%QE;WXcI|d1_5`)ALa0 zA7_oGKtEY8oUQZqSndz_4eVr+Di2WS8rR<5LH;YPZavZHRUPVF^f}-Y;u^2cYcd8^ zM_z`VOtd=Nw;taP&x@T*iI=wLHolqk8R}emw%11F^<+(-R34ztKig-D`y8azElHin z7-!XkUP-H4k~()O4!>Mo=$GrZM4gk?cvgX)U?&r;&fWpjM#JaOl?SMEtv(LUMnXSb zd4M{PT)KWB@^01(`|rfCnw{4O}3SLeR*hnvAaV z&Vipp(?$O;uIbC_+$`eRX~Z3}rZ1~=$iItiAP~~(mZZ)(G4UfYFJw(W%Gfx&@>Hnv z$xB9)p@(wamZ)>3lzV$nca`h5M4fx@w@U?&=*k1s`P%B2mbg#4@&I*y@}T!!@PhTi zxlIc*miGd`cy;bp?05;|#(Lofr7^Z)wW4Td}cLLO*sgVRZ|YhxoS5 z%=euCU;_NGURX2XWx{W3#5-P{UvK&HuqpaEbw0HC)mw}Y8m-PYWe4Q%7pBxXug0Rv z;1OxEI$N#D5%W9c0hKyedf90j{EXBjb++nRZ6n56)s*V2_#VEFK3`Jj^ynsl58Xs{ z*8TBcSvmhKsB^7R#-Z?~Z1c%Vt$tuE_{FuLiw$cwgD>S<{?c{r%3U8PDfjcUt8MbD zu@kGjY70I=RWGJhTfmR1UTl<{>hpB-3Cr9kxKFx*0o6Vh{oexMmabqxwR5eqJ|P~l zo_a~kh$l}kVSZUpeW_{bm&J!rPvcd)dy`=Cix06AtGA!?$f!O0`$Dx_JKOgIK6%wH z9@BKcq0mqEB*?1$y~FAC&}Y_DugO?gRCO-&pI7buMTrgI=XupO-S|=bUMK9tqE*|b z@NgBx1+phWR_#*>xANg<$esjQwWm$Yc!qJ4R@)@iu4Mc`{Jd*kwWs{lI|6*l^-OFT zAC3XHylP+7U1SBm(-jP;_JESHXP`fSs(9e46zVT;b!iFG@@Tz^FYOwfyf7ppdtG14#O9#X|?8Kr~`_9Va z9r0XbPlBx4kB+&C`x3Dei&pJ4|Lq#`|KX?;AhZi)!uaO?kbg@Q>yKq__HPOK$@)D zZ90wZ030ftO10N#*N>_!^$I_Ur%sRdO>MM=@#jj__Wj-WF8mVJMAg1D;AkP&uYhWo z{P%v2^10-f2&%2W-*hm1Bir(qcDpcrFcV+M2}X`B-Wo#3_!hr0MHh9>a!vU;!}OjC z`W*EtFRX(oR|Q#>7wV15RY6JR^*w&9!}a7kHBot8+i`<%|8kw0sC?{^vIXD~cAk+s z_27+A`5H6)zk;W9^!4YesHzu<^R`EwWXS6UU6RK95cXz_cL zq*Xyl<-b=RQUN|hu2U10Z{`%|1N_sK6R7+o(@plkm0YJLDz6igwIB6Q)|&@3=onPZ z4dcdo^W^v~&2{@hCwY}Gj2UngoESRrd0V0H=Z5EJj#uz{K^q^wK<&^RsOhl z^RT+|$>MKN`H}0|`zoJHJ}RhulS#&6zASg*xA={gb}w5YKjoTNy9a55*t~H7Ybsitb$(|5i{RRApdqQ~i7yOlSl~Pjw|328?1U{uzN=f}MrP%(5ap2WI zbJDE;Fm7_)oT&f5l=Ib^2>oR(-_US;SocGLw<%-k8=#=bSwKh@SV9r{UEW}yC_A@#*|0oLQY ze!02v?IZXKUj3I${&^DqjaUEn->;fk3H{hnN2`B9iUsQ;2s zn@xCLvL{4Vf2~Qy6>%Nb<7ZzT5WV}F(5=9ZI$HhjzZx>ZMCg}RDJAtEXZdV^v(PWs z&58P(Z|bjP_9x+>VG%eHy%18*UgFgyUq!|f%#=Uey`_) zs=l2H9m9?~TK!!f_8Nh>%&UJ==#@0^0z2yJ>_5=or*GhAsK4o>>l2^@tjFKn=iif( z*U)X&a{k**TH!r)FgmGX!{@Lh zlKO{wElP)vqAN2{f9rk=Jur`SWd`bByzQL^d=%^P3uC@C*ftG%$a?%Su~BR09m8|+ z>VMcKeiY(3cGMjh>+7m`Yf}dG&;9t>-CpRI>*hrL5Bl1kf)8Om{;CI~wzl0T>N%(W ztAf%S50w{j8QS8SB}?`*U-72~XI zD)qlq>K_C@AT>$-d&K+2GWxGn|GwKwB3R!})c?4z&NlcNs)_2qYh$ZUd|ZI~-y7(^ zkbYnBb%OeL_v}>+9!$NJj>Q#Wm1vHYZpzdG_b4V-PploS^;p z=(Z8A*q^{hg)#O4p~(07sNizqzr)}Kb_&u_!RAI}D((k61*OUlqQa)53%`Kxd{n4) z`JXHN9@)DhM}@l)6J|qCq}5a@DxB?h=n!y-oq}{!7(V^#d(1D{yCO#g-RZes&4hkw zHC2iVHa~uB!1&XZA4G-T+XKGiKKZC{X7D!g?~K@-ASv{z+3_=YUp^{m{)pPO@YC;! z2j+#Y{2(frn%uB}uF{nsM1`Zf7K@+n$L0iwZMH62a~t~4M}-f$OYZ@1(rT&{6;j=8 zgAsSIQ*eHEoPpJvP3I65TAiy8;m7>B8ospHnJG$~y?ChIlnHMqvK22y$R4~glAFA@(R8&a(&)z}SRXHlODXg4L z>9#5=xY*oTOV^#Gs1VV-?=|pL)s#`exr^Iz_U~~>RCwu|u#7ohco0N|n1cH0zysY7 z6}nno8*4>(iob8qG1-4`E*0;jGxT5gh<^^h#J4>AbtSB_Xb}}yOI#k8R(HR57+ej}V#OH6032X*h~zb^EUj~3Pilf9r1*y(6Fbd2$-1h;#L7DHb(RiGa`9h-P} zDV{cQV<4i%t|af(xDJ~`jImEF)R_q!vN?pyiGt}`htSVQi`rrNyD-jtv^aXL^)cuh zn?uyP?2&Bn7`(<#M><+mw~iTx@g#e1FDZ##@Ul+7WM&o*}Z_zOmgj}}SC2G)TN@X=y$jp)vJU+i>bqQ$013gCq7 zy^*6u--x*Cs9#~HBONVPFAY3nEcBDTH*&Pl)BkIW`;k_6rD);qTdf%JLS82z(ZcP( zUjyJlUMC>YqUY*?7x27f?+vLSAzGv#{gMHmvN^(HZPl|)r%@??48M)JpE!9kd;)eldbE|JMa7*Ft&k70 zIfP}N|9{tO09Smp_~*IU9(kP5m}qgl*kL8c8I6t>2QOK4RQZ1@TD1A`D+TjNnj9^9 zCJzh8cq*GJT0D-ZoP=?cniMVE`|Dfbxl~OVEoxVF(xMV@x3-yZkL<{Z`qwboaQ#k})T^5f?@)0)Ys2!Ghsm)mUE;i>ldd=PLdlmRnX|*}z!~Iu?B8ewG zY=J{QifngkcpGsFJ2>em;^5n50rFNh=U5u#obX9gU+CwfNd3VTBcYSn!AVDv&0&*P zA)ZRB%~BKz@@NzSUy2=^WF5lgA)-h_n+@H}g?@P*f<%$2PmhV;-%VGd5Jhg>-8%(& zE1PqqUNxOKb_jeXn{yoK8F_4cHN;0gidG%Rsq@JDWW84p$b0i&mH|ld!j02l<46d;vD76H5 z=A+1e4wp^AYwX~pqsW^HBle@8k0N7lI*r41u!ED1BDuQX#qawddxYdD^1a)ic;Fm6 zII-F+MUn5d=lH?5ORLRN6sh{+@i_Ej2PYjxY{UJ`;bZAa6rxD+-|=k_f3bs;jv~#R zJ+>k5U~`TcA#N!f+N18r<{VFc|GN6`0eHbjk$Dj}$0I-Dqsa8(j~ioNu!9q;%_QgW z|Ifv~!86Q@ybiImky++HPrKyD>A)=?MY5Zl4Z;2MQKaC5_7IGl(3mLl#M@vmd>tAc zMXEjzUZ9E#R1~TIuKNFB>&yeG_}Vyb=0?^^QbZwHQ?eyXwkT^!l1j9oji^v4OUarn z(IQ#el(MFjQrSwhh!#tTQe;aBWqa>)$C%~!o?$Zz$<#T(_Nf-03%>h}Q>Qk%`2g5$V*dl9&X?-x z?l4b4nM$V4(iKOCVZMPf70+}5bqdb#t$=w;ja@!gJX_Rq060aBU9_e-U;bshgxOE0 zj&$uvF+3My{{y3rRs37l_f>&1wRn^84#q+0N}vu~W}+PUtDsDseF@8S0d?LDVrg1T z<3v#BRZ^rA_;u9SC3SJE`n@)=&vfckc7NjpzZaCL*#5_k!$6((g+3eLd}{2n(7y2m zw>+#nI(3p>M1(^efoYrw>MR}M`vUWmPMwF-*J;6c;=A8Cb+SkMV_`gr{SS;fU&447 zLtIAAbOCiXd=lmXJ50`W0d+1Me()8>jT*a@o>p@YdjUEGP^OZp!{Kgn1neQ5I@^zL zKZ7v)>C_Qc3MvPG29&8UZM$x5Y52_m>IBa7Y5=yTmwhiIZ+C=(e?q5D&(%5xtQSzGlBsi_@Ay8j|8(l; z&Dq@nb_UZp5!C7Za5hc z>Im^EInxEy`Fr|G>2zj4HFgQ~P5ih?7Pv!=T@LSPyFSYe<`tbf-miD=hWUW+e&f_p z;x1AH`vc0|H zRuHc-8-+UAXFeXoc|@j8Gq?6qn9r<6qRuDts}d8uW4?sPF8!i8joOD`ec=tK&VyYg ztbHiFpKXFV*WEst!gC=S#4h>9aR(Mvfd5HqEb2U%wJ#X#0J#BmRz`jhp+DFGPo9Fp)NBFKgPMxg7QLOI)q*G@p&yQYM?{w-YjvKP?wN&X@spKI=>!fcv4wI?}aOUV0WVukc-WoI3gs=CHoUgif6$5&TB*eCgC_ z&0OCE>jIRuWa=E6xw#gu56aqWQv1c;`U))o>g-TB-UB zDA*rNb45_6V(d^9_@DT$J5HU;N87V;#LY>3cH$;JJXZmQ0fj(Qy^}159|Xq*71Jr5MkvBNz`j8vQ%5yl{1NyYSR<$-)i!M{%=3vh zNgdJBlXp4sUgrNeb&AHjk{~}b*(RtHFS(E#<}=YS>Liu@xJ%;^i#ojtE$6S>MBD1*>DPf*D$eM{lP@v(^ThYy{C`R@{ks24DP}!5 zQyKhUN-_1QOl9!+gFI2o5e;piRHK~La`0QIv5}Me>Auc%u;+A2O+7kQ9_A-CHfnfy zwOaT-fRGv+aXaZ=|F#*p56WONrD{czioxH*v|$9LQd`g4gWp1pjh6CMbuT*){tq=a zQXKz(cn0EPVqXWNRLhdpesG`Uj2uu(!8+>za0Jta5tLHNG29H? zp~gl_B6u8zxM3brW24qgX@~CFZjvS*yw1&s9B*S*fBb#1k?I>z@C6ISj|s*sA+4WD^RNO_cwm9&vZ)h^9Cic z{0F8o7|+N7r6hIz*{3ki2W2psQYspe+OWPbZ5TnR6hS!=7zbPhfKy7?CW5Z+ObK-1IB?G8{K@y&|5JCc8r{n14;#i@wYI$*~l3=ppj;>=mv8;N))Q07|{p?txC#KL)C$=%Z4fUI`#Kn<4CKu0U_3ExSS35xRg6+52}RN1zmYR?K&jZ>#T>vF zPzIAJrF6PrKG<7oY-H|`I|GRWp3*7h^P(yQ?uSmPD8afD;HQBy_^!F{GRrLfPe7^Y zH<4?=UV$?BT7r_vN8g3tv(Kcp?%Xpy1^TJ6k!Ednd8$5emQE?Iv0?=*ZlY4k^mK+L ztaoT+N_lK@c7pfIY9vaj=N(grxC3hhrQ$+<48yvZXp@xMjBw?Ud4y9c^vj(QjI$HJ zF+r)OjXJdiH{msmQVGKr?_j-?8jDhTVWN|te>M3UlTtD1t<(M+XH}f}={YtC<3?+a z5~jfnS{{;hN_&9zGw=id(eRa8-ZR% zkr}69y-;JUsYjKp2aLgQ0cA6u*#mm@Z3#RH^9@%e?1($S2J}ksE3tt0MW?ddT zfL>Gn%z6!Wn;K(X|7hUxh96<}Q)8@qFDxI=W36{Oy@qGnyn(m_l+Ac%59oC={IVz9 z4>iUTOcUEE$_4L>POsa6*X&{bP-859UIWADta?K_y#_buZ-aSDr`JkN-Wb@|0A(|o zUXt$buEY75hK-9snnsSxZTreV_@2`uGs2YMZT zU6=^-jo44Z=oRDLPy%*<*iXXfHCr{C^|_|x%pTB7NKW4pI8M&&0ljW67-&KILoYVtJ+OYMG1h+eKg)O-z+X@{vzrq1;!@bf3*!dL=D)Vu<^vY@`G8*R z7kF8AkJwMb=wnZ8e{QYOeqqM7hv|&>9tCumi2icpll}7tFPZS2*!<0FX{VH zi(oxs8a9Gn>sx{v;CW#hHiBN>j~Y(F-^Eo4IK3L!Ls@w_P&Sk4B_hW$73?IjpM=qC z)j?fXuqSkSRcPOKg!?3C_JCe|?{wr8nf=rl%jbo=*As5wH8sYH5I=zI2T{SSi zQ0aAWSm!s)D`un6D}T5s8SV!fnO?ut6U)GFVKoxHqKv*CCb&S*>zM0vGZIH8>1Fru z^jh%W@P^atH^=M%LA(?GpP-k#$MM(1^;svd=rzK*`8(uQ$PMVVAVKgQ*dIz`(yKOp z3J1&|YHJTj>Ho9^&!duFo3Z+4kv-T+dP~Voi-7s?pEglX`rnKqcIN+!)!-FstcKH$ zso$f~ZqbQmLwGKr*kGCeJqT2b`b~4;r)VQ8{5aiXy=&f9s%B>|4JB_(IMo0`1sr zuCeOesj=GaK(oKbEVm96+q|Gf07!j4Q_U5kFJL2LXFi{YR>qT zqyqi}op$GKS3C#%1Bz`j?P6;ftk3rb#WtCCJ7iN?`ZP>~N6^k$&8iEo4~lIv?LPKg zZiaEg)e|`Fb`9~fzE1&HPvEqZw~C)5#5|wa$HHi5(sr^2)-SP-h0)GZ9fWyBjn$;@ z&)J=5$>JANu}!93o@|3mC!VYEA&-L?kSBRQi8w3~XCe?FW~&L{%y3MJk= z0zZKotBE}+(+rsl@hLS{bJ8uhxx@|6i%z?BLD|XB4~lIv?YuqY2Vg#cV%wDs_OVp+ zO-~C8kG5W9ai31Rq1?CKEH2P!_eQ{<^|@7a+NC#_x-4a0pV=t1Gi|I&1^Wh#OgoL; zKTRj&K@#nvmHya+UBVhcyQ@k$xgZWEnqxz)2vAT~&U6N>Uuw)(8MCR$+5`HjF<;tn-m>C) zFz9p&deyl~!a4;dI+=nTXA}}4E&wGunSzD!9}{7{U>ZV#f)47hxnR9eV?M3W64^FI zu+O-f1E*k7OL8#erRfx$-?DH9^kW)Af`XC3`4V84haKZS165X>dd$eLqMFS|9dHF{l?7vWBzVo(9&M^;Vnf-JM9@?sZ4CW`Df?__E zgK(dqL?=_QHAYGw#)nQp4_(1qFyAl@Awj{$%qJS~d@&6nK|v!|uS|$La5V=`L5=!4 zN$@9eH3v??UEXy*U^j?;HH?B;r5aO#r<9B(lY(MF9nazY68mZx1uZiwSlITLo8X^=5*^Q20tGkJ3(GBI_ETd% zt2e9CTSkF*t`7 z`QpreIt3;9?kK}Jvy|vRAMBE9^VoE7cqms&nXv`d7bww-E?jpLEmhCUAATe7yMp^U z^iyNL^ycEU@bhs0bP7I;*yaH9gib*#866AYHM3DD$o{8R5$*>XnSxu4qFLYT%6frB z!2`*0TBLYzl7dU}+yh~q;ti)@UAkE>jOS#Vpx`zy_ac}lM8hb!bYn>bj3=qFD7fKL z@Mb!{fP$5WB>VCEpZpyr1y>G*ZiM+mZ2{6V2JDM~JM^}F*Og-M&;QfHugAmv{C_&K zu@U=uWI8hI(@7aof{x4!QDQ`cwVbz$=0Sb~(>h`qQJ|yNY13Y?t8_YQChq9~`vVGl zG9Bx8FTVl(ps@c^opm_1^_v>dG1I`Q62_UF5d}K-Z2xx;>=HFb^s3`JdzDo$Pp6}E z=S(xmx6|qP{@?c&Sa+bXC)078N?L&uvmX@pR`L1|RB}!!10BtjemcW=Vp>Onj*4GD zuEdcfEU@;_slVAIk;cKB+Nc`!|W!d27I*r_(XsF#jv~6`-&ei%}kY ztlQTQbZm3z{sQ?rVm}X~*>_&{8Kpv;#N8}m)zoGeU33y2#~26 z;9^ zso7kUEd$RN(`pjbypphB3S1vo!Qj-aD|8Y7drQu&0yW+9Mp@r8LZ{{`37xs%Pf}yb zf9a|^yt`n2(y6(4u^y|w2`U6s7OPq(Pho&zw}jOi)vE??ylHuQ079LCq(h8(DuBSHW;8 zVAPb{TyP22DY1`;QPc2^pDNfra%L5%xxDXr2l!Fs%qmc`z~xDKY(B&b<&XE+GX$F!ORHAmtY%OLK+RWLX;n-6Pc!E?t|FgP_m>;)IXdcm}s z1U1<|=V*bQA@&iyJ%F0S?i;s*-6m&Nftm-6Kb(W>)2X=-U2$qIv!5DM`gwexFB%Td z9V!IK)Ew%m`~p0pQ?u~BE-Nn$6#_|Rp>%OuM@UQ69>=)tLF_Gt_P&4|X#b;KW%ls8GHOqFSUV`<)Y9wmv zYp(Bxd5ATFn$qT>3rTU`BsJ@YH4w-j;ti)}x?ju?B|e>?rhoAD`!e{+tp71;zPtOR z82k-#18R2qu8o6rN@+}La$NiL5%Vj^uYA2Rb@qo4I+vMewC`Jby8Qq2v(31BPwc<> zVdig4)SF{kQ#xgtpMN`{)}d0C`Mf6gFUgc;#yd31UbZ{U`n-2strOENeFG?K@kOHy z{32>>YH4BHzXJuHQe#ukSK;|;QNTM~t%FmRLu&Opab`cAvin~>y#(U`6%icjA@>({ zbDROn3cCqkhjD<4h?XT8Mkxym==Ma@@%-%h9OV}CJ8u!q#x)Wj>%#cBoETd0U2Q`YxXqbqO+)0z^L)!Y?zl~wOR zqim1#KssC>Dk8{~O>xw|2>ivgrUYd>+@G*?9mM`6Mp?1|j181qR>Egu-qAwQ1c+x4mGeyhM&=u))=7d zGarAJz6Dq7;FL|A<)903F*P>TJo!d+_&AIkH8vfth}^zp9oS(yWpB5hVAaRbDSJb7 z$^x+eP!U0sNr^g{yUN z${zpn^e8-EV*e7O?7Xy39&kRfe~D36>qG7k_+6OR6wBNKWtTqguY>tOjZNdTj*R#i zL7oKDni7-^Tq+tsE8m_Hp6PeG3bYi z2r^~$e|sH(=ZI-d3Cc3OMh)S4VOmpyvcsMaUNgJdpdx}y*+#MAV0d4+S_h}>9Mu;$ zAYVc3Ut*M9=CzFVeR<@}tx?88lrJaf3NQ0~a^@B&n~m5_g}8uD*~8xx5%BA%v1#FZ zp7?WJz5k!E>QgHv49guNJc(Dk2hwe{)<_+F}HhJ?5Ch`u=yQh|mj@_t5!x zAeqCsU&Q;~ITaSCXq3H}aZ4HI37xXNSAJ^3x??s9Wz$LnAK~#GnX=|1VZGqzvl@xA zO5K?y@Z7ORP&V1w@CwY^i8e{unf9p*CgN+>OE_hHN0cpL-4P9=tc1YbSJ?eezQUsH z553owEPrFNo0&^zQkL^)d+LAq%cSfNr@t{nAgWmMy z-F@l)0PCEIdVEYPOQ$bW7c`+BqSBYS55>~TVwqu71E()jB*xOp67+q0z*S0u`G<&o z)B4>&-+;wtO<*Uf}Nqp zxR3qS<=R-Ehk&bxB7^n4fxe-xGT!kIavbx>`>`Jrtj3oT~mN-)EKu%TKkCM z1DFqV`Y!L@h=88}l^$gJrtz3cfPKc*LpXgsf2aX~3!+NB~xPPkOs9g9B<3Ojcirwm+Fds0j zEJ5EZ`Yt1|9--1B#(URLW2R>a(6?mymLXV=Q0XySRo=?TwO9@4yK3GgS9mVe825H7 z-#4zE;6G4f+#8~{+*h=~9@6RCme_Iv{6JQv2Z_E}^Kb2ic!W;h>!r{Cz&wOX4>Eo8 z2lMk`oH4B|LEojv_+CRi0+k-tzB%?degDOeZHM=ZtA}v<9$7Zi4!8i79%TAf^|&nn zJ44P41AU!W^CrM}LZt_pzQ+9?|G@vD#<*O++rKP%2jfGHasQRCmTlCA`A?^>pW=gi za6X;BS(+x{U}vDxW7WY6-*Ni7NgDix@geq2`2v8xS}BQ~5D!vgTn=T0n9YMQZ|U@X z;jU*2ejS~@@+sxb;HN>Q2bsPPZ8+KBe5mvw)A#+|h--_O{dD@y+GubG<~gR7CFrZG zcp?kzJgy$X>8q2tJRjB_v2TjeH>DkofPP}%6r(SP#o!*8x6~N-@ONihc4t`E>Ug+oCUC%vkNQ>JdCgYK+@^VzMGz8*RoHi3PhG$wsL zWCWDJeo~vByaJbp#DDwQ0zNPf7{mPhPt#ZKgLw!QEdQl4vwo1J>7`SdsncUtu>6$0qh`F)CL^+8D$ALj?<&%5nxqCNOSL!GdR= zfy%$1m$JTBh#C_&M4s_Hngd*>#>6jQhud^)hWs0y%CkkztrKVV6Z^Fom5<%xSqglF z3KqMFq87!k0WLu0HeX#un72^D;+TqMo`K4dkt_VcZeyBWg36nQ>KetF{nVIPkSC=jLcrU9>xtbPl;;fg>j%$`I_sUQD!$AoyxC#hY!OzKn06Q zn?`+uShPJ*xih1*2>vcquvn_>@@^E$J`GeBdzjV*+@Z$AZHZ;Cf44-N9}2Y-N0Wrv}4{a~-4f`v@w-=gzv!EVs0oRTNNnzxvym!R_1J2!WN zJ*QKdN2yi|-Y>CVi&42&QU5vETRN3}Y&BW+1?0>#Q2AcU)fC`6Ir9uu9u^jj2mgT@ z6ZC`3z^DtGwmM%moZH*LFF|^E6&38aWxZ8<+*#qEgZ5c{c1Ha*QdtBJgq$c z3Z}vPqQ=Djw%dkRm%==uQ~6%b_5JX?pn}C|tS)`Me%TJ7a*Nx1UziV2!4mp@n^zo{ zzGhmfnC|y$l4n(!{d6j?D6#(t_K;5H{k*^SfZxKjC@eJ-dqTQjvh%9j>QNFeC-S-! zD*t@3bpZT%Xk;qSZ@lvbkH^VW?oFOO2IDZ%CaElSRlI;WACHN5n{QUiF66||hW{t1 zT9jW6HtifdFQ~vF(^|x0%{j1RP=WJ3 zu1sEp-S-sGnr)W!37A*Z7+O&2`*(NNG^f+LdQ|uwyZ{wA0##2#uOy^60<9|}KZ=0g zMUA1&`+IKNIs&Jl0*6d%Wv&;OVct?>Xk>QH*EQu3$6?xIg4PBL^Q7SVxVj3bwa!=m z!0F6>VxJhJ^?R2%FIbPnJ~2jX;a9iM!*$3RY@oHf)TzJVhtO%g`^FJL7=LOEea$s2 zXo)S@A8HK!%6HUz>p08@I<2dVUrvGbLZ`Ky))79qAE>~|D!mi??zf%`(E9GREv)Y! zq0{Y7D*0bJbmy!KKW8TwTTfxls&g-79vJrHi1`8r`e* z7}g6^;E-uO#_R6O>}JEX#{{i++&QTS^9|D;6SNM_`qKd%#MMMESp z3LJmR!7n2Ai7{G>UtqBE3B*1zMr+BDh$!$g$r)^*wSgMH1I$Bm1{-J{fry`n^-GPR z@8#rujy)&N?5ESZJapMinE!NIKREF(9sCNYz#(Gj6(!N}M>XKNLj}%;OA4L!!%E%3 zFZc6S^#$hvcj&afu=pnH^Kfu=m4EO|`*}P+U#Q45JjL?ER9ai4*H6PaPQ=i?$w#(v zOTcqyH4?4QMpg=fUy3y>gAKG6TKQupc74_>leBI=%XS&;65eoHZ%8X*fPXUCCTRWA zab+i2Z^rbHShT*){K6Sn*QCaxwM+N7fh?($^&^wkvGSn?|J{!^?SAoHPYB{oT626V zQO=-UpLI(6fI}tCufTqF;`1y1Ki!$1ljaZFX>x`f`?dcUi^D5WSwyD$L9G(jFksqg zg6+IaK5Em2s(-__Dm+1_F{Ur9MF}fem8W;t; zM9z={-L1!aU4Z+TcAB93s~=UxaHG^%eDUk4KjkZ6JgKp`*|vmR+Hb+Hrqg|zOjsYx zA3ELJ=k2p*F#DmhDDg|z9nD=+8-ec2xAt;^9j3E11gKI zl-3n?xTo;|-4nzXTfls#(>+jnI|KYEs4T)Wa%?Ine#&!@?~vpQ*8Ub@3|kY5}mH)L2|j>(tpSZ-~q2bnj?zxh~G^ zhsvUuP|dx9U0L%>6wlTFEAeuM=R&8u+v;h%!4BgpFrV7|L7@ANjvxW>PpGl@>l`u5 z(OP(3vR ziyjT}9}Qe>+z)gYe*D9BF|!|6f#Gy#`)t+(b_`d6;dD=qFoQqKM(j^xbRX6{&I8xS zw9{F^?86w{m3DOa!u^ml8||p(rg${s4R->Yd*~IdT0Z5A2ITK0Dl)Mi&O?Z?1w$y-vzoK6U}`H_laqz z3A+3Gyf6fNLXE}Iy|=<&r^CFZ(|uN;KnKi2s4ODWebi+BE%1w=vWQG~mFI>0zOYoDSk?F30GW^6@z07||bZ`2ku?9aM&yX*Q+>kb}bxRHGQ%tl; zx^q4E`%cOOOw#>~YKJ1^Jto@(-Fr(?bZNY1(LG$M;uAS<0KW%xcig^tk@)0ACVpVj zecJi`e&F9yTl>JCN-I;~3$4xAnfUh>*mHVIsfeHP-|H~Xn)rN=|4)6U?rTDo_Vxgt zfyb`=|EbUXoOWi#6q)+h<(_!3>=LtLYFZzMREDse0Z@NN$lOQL%u8X~Z!7~3)Guf~ zQ3&q~SEb?9PuPEe^||r5Dh;Q8tn9PzlFajoeQ}KX><1RIKK}tKrpVOi_=jf@ z;Td?KzP6LV6SzJ#ruXLAD{3nNaWtL!4d+U-;rUWy`atQAQO~BpyrolL{MNu6SdVn- zha6q#0r3J5b)aI( z@XhfrOOO2)1?qoHdcIMd*-z|?W7IcvPLqJ~r^fUn#=aq|`yl?JQ{TmWYaZ|jDyGQP ze{-qN8sY*v^>Y`!w1)YEX}<~TtE+yw1o;6>`%O@vXT}~B_=2m_aOy8Dlg$P@1{G6e z>SwqXX~MiE_Qf&k+u0trhv!bGe&}r7>+oF28F-++$=KCWm{-)8-u~6u(0i;rKQ*RT ze(B(RLKN0Do%&v!BNp&{>C|5seKic$9aKz_so#>|yc^D1q76etLsg^DRM^$U;@H;8MXVv0=t&;$P47BTxV z?KeUFBPI%2Fg}>}o1i|A>{}_A54b7~r~ZoXs~^Mj!c}QF_3i7pbir;A`{Ee&*9pt9 zzW0rsfd}gMoM`_FemFS;57ZawT;dM%oEp>DSC4*bFaZuyV|t+~n*e@c@PFvk|GEFr zG8hM_m?Beu!L+t-aDAwldUw}%#GZ40qeXfO``5JV?C`v(G5wN78*LWNQDgSgsjqtQ zh8bL+PJQQx0|sYj{k5Mzwd@ zIsx!oCfX$RZ>)Nn1Mh3HO;G=awTc<|lSIR)e`>CkG_{|NMg5_~^;zP?$*iA%`Ub6= zTUd@e`86i>W&8{y!JbfCN=1g;*mBrcqBXq*-=2HH`lYvkV9&q6h5t6}b51agI^7#! zet*Y=O3rg16<$YSvmwvqfU4OWlCBW zF#j=)I^hk(erg;9e*;&^;od-A_=Bn7kI}t>%TJ{l^2~n4$^CfD8&Eap=>|U&D#5V* zc+4AMcM%eWd4;RwHVuhbfHx4aGZu_>P|;DJFU7}*<;RJ_a@PpAYVdjm&nZ0unDVj6YA z8(^Q#F$i`HD#6I!fFzQn3*&~X_Xgz8x|#!Di2ZoX8&G|<@deCt zVm}`91_ZeWG~s!XGyLEUl%%$^vorgtIRL}d?y!I)m_OtUKX?P>TkF=txY4}jKvC@B)4*A%1e=%kFCO;>*7s-3g6l&inAV3Q%dXzZkpXX@L}Yv~E3{f?8nFOexVY~w8~8q_XfO!9R7lzK+OS!&d%EKNDrPnu^*3l18lO> zOW}UV8Gi5v79^_zM%c(1e((lr7TIybyrSj+yf}{>*~`*-QgZ+cqx+|a`~rV~?hSCD zLVaM*p%RSj4G3(?4ug3Jm0-)fbQ0Gb9peRW;98^4b(sIu96)>Y4T0(ih+n8VfQ?2H z`RjDSp3}X7{mQ~mz^>B00h8w)iQv~kB^cQout|&+hWHvP!N}ggJ}Hqoz&lK%PIv#vF#jipV*Jbyn)N&MKk9x`-%N{%o{l6ed`0* zA6z8|8Gi5vOzL*N5oh+3GyLEU+`NBI8SbB&17Lase`Xwp@u7PIIWk*6!+fKA1G&}cms1b=f%U{g+}%U{9~hBz@D%g$s4dc9hU@or-?S{ z4Y)0vbrkFv-f(XqA-JX!=EG#0@CH71nzevGOf<|JI9MN{0?(J!Sl+;SnZzeBp5zAJ zz+T(cfz<0T&tQ535^a_FFn_2mAh>T<80+&KsQpa)HOi?C zLTQYWKeBdF#gqS_iKXJ%2Y1JGAJtW}FEHUn&uAhRL40eo;+#TvZvC{1;Z^?1ouQ+9 zYQ}t5(VW@IXc-5O%$~9HAFk&V&hBp#Lib!%zml0wxa_G-*{_5Pnt{-EaYMK^~1ck8(8E1HIH#VRO{ zWIaKJ9?WQ*KlW8o(x6ak>2GE9NzvT$b7xb{msc&}vbZ0_P~ z3wuyL(kbfUX{=dbwg!Eftsj;4{B~UMhWY_H?`+1$-w6l1swLC+85+k*#QjFS<+8T? zY*_oScTbIepqCvQ>1n1g_l$X2?x#)^UHF{AW3T;l)~64bWKC_*-S^lTAHKfWlx{N9 ztot3m+WMirXxO{y176dA7z#dI`*8l|CdSls-l0Wx)_V`{sEZde7GhLeuQ(It(5^9LAwforzKJd_&h+Wp~Ov)LjBkLtB=d}o86{ak;f z(Vr^})h?N5rE`l>{d@Z2oR^wYQ3dw1_jVph?y&kc>#k3!4r8PGtwr~q<%W26t{hx) z={#zr@Tj+R-=AvvussgHvIWq~0*i&Uyf@5m(w{zlFVBk6Zm@B+V%%Xfv)9+0Vxw=M z1-qNsH?92p{{4Y<>uwwpN9FXDKlCSUu?Z7hd-ssoE{24v?2)axSxv6l*W?G3fuILlWgCnK`yzM)_0)T4}}j*aE5Pd6SAdd_glOMZb?+%wfY z{;D}rz-7-5xo?`NL0{v*o>t}AUAJ${Sm_?aQ0t%L&=dH_P;z7Ub+xDUXsMilx$SFt zbuHaM{lm#yhD=|UI9e6wInJe)SZ&nxH@MqhMhMre< z522Sfl$1nldH7Iu?vUwhn=Xba|DHWuvtKC68=ra4e?*d@?NLymdCPUvLyb@A9?y=W zOQVOE?C1?&J@W79hONs{^qa7PS(RB+?X%Lj4e?KxG49X$$;o%cFJt-M#`JWRSoF+{ zrztDeIxYNX{q^C)sA*_tfV1jIj+SP$gyyqYe^W--tNB}Zo*s$2{yi?~#&|0Fj@#c< z^xDq!POEgYZe@$1Vkf)G~I=V(L_SM{f zdxQ2!Yl);Rs@Zx+uq^tEK-jizNiHsj7&}Bt4)5i=_bKJhw;ajBV)Sn7?!OWT?2lQ< zS)CSjR6|45r$y}%IahA%c_MppN+`ocp|-Z5^+-yJ{GO*9@6@0R3%xVSMV^2A)+7F^ z`HumrQC@89p-{`sWA?g5*(Qnc&qYl$TJp1&+hv_K#r$n(e4%`K-SKaVr$m%%kp@e& zr#$_7)Re2{pNB*v6JzoiQd4{9UuRgZ2v|Jl>X-TfbX~HP|NLc#&N(l<-Emyd0c{`S zbgBsJjNqP{VUV<;k`e5rnZG}^*NxL9e76}t7h_-0@X+JA(!Vt%-v_&;xuQmz4yTo3 zKCByfE1~0mt(Bo(-gcm0&uChiN8s4`d=bXBn*4sbUFx+}B?*Vab?MRs#8T_==T{PE zmils`$#X5D(SV^B2}cv>=h+)DzGbe^Q&U;2)q3`e-+E=ob1mb0?>Q+iI6J@BcLOR4qXB z=4jO4_PZu9XMv5g_qV-_=-Z2p!_VhWza7}LF0S(-T5r?mqLtxL_h^?;!_8hr)UIz$ z=1_~%pMTe$#(Zk?XJl_a7_n{5{FwN4uhPEczeFRAWx3{F^Q%u!<6ht4umTnI(7PeW zsWg~=@bG*C=Xgew9b0#ShKxe*X$PU*osFoODceHDC0&oCbcHh>EHFd)(^YD6W@p5? zRi4f)-g}GDU@iAaX6C~5Czopxc}=e*mzv)PJ&U1qbLNtDOExg_8?N#u?e{|Srmg!DnB9}qS2nd}B>N|$ zgvVp;Yw2HRMN?`5Mt@5)617VX@`%Y^NvOKPHWqafH67jk=e>})XzO+H1f@e$(3`_) zp<(?m|0Z5d7-(Oo$&fhvphj~m_wbi{zC-J$#iQR1x8E#3rlokIOmXqb+8HRXmYRXb z$fCBloZnjBO0QwK?-*2#-f5HX;W}TWq4O##eK&UNAyFd*`Mw;%qha&VD?Rf@=08sr zXbkMwaK>{7!&1s@XD+*lm+9*Q!%y;e(d$1rJBrk^Vzg?9mt}{_qwa_G8{YiNIUf5v zwoh39FynVwLaT0Z|LbW34VyDxm7&pZecQ)X<#i9*&(3=MQ60^_>rg))vhw_iQ5!SI zQ>PePV$6-5IhK7!$8KG|_u&I-;^AJiZuz1BwaP~#u}6$hPx0@a$DcM`*l;Ay;l$?4 zjF>wo!_;1xWgb4WQh1MXJL+NgRx^hC%43I5Xp6Y(di24zyMux0Z%3ULCm|Oz?=!Yr zlsdfbsXw=Fq0nn%sefqT$34Q=Y+IY_J8mCv&EJlyKA9f1UuN%x(&@fyTO-~ul7lJprqi=+xerOC1c15PT%3l5RjiHx$?O|N( zUrC-deGfY1#TXYJ=PRZ+{9Eg$)BikVgFjk4Dka=lHs~*OZvA!L-Z92S$N96qsy}x9|L6Mv_C+~=>h?Lx+B^i-nT8@26wXG&feG@tdD2b~p{D`c~~@kG+; zU#q)Ej2MldPJcEO&q*}9wuPf_XA*ks*tI)V!u_*9%$v>Lzg7qx9@grzkQ0xvc@efh zSa>tz?2C~{R||x-jowZD_0}g7ZPu(<`eRAvi%VV_Tc#;Wp`-GRa~tOzn|?O@PfT{s zeum?MufC?M>ILiqVhke~enTi|*uP_kOwI1>frxTa{4@zTqipsYRa`7?^z7QGSA< zb2a|b$-G?_$6vdyJznz$t?WpjlT;#h;37|i?(R>zsL@TsQ)jD{+ZWyDe|de|1x8W< zV}+6DpRV3VXi*JYC?dx&PNjBO6@3){XNea_13LFSg9{c&sdBHPAq2JG1ZBWGc z`5}2my8a%GfP1Zv*%ZFGB-@3e8xV=@DrF+$&Ngeq{j)jHhZhkwE6!(1JR94*l)tZF z>@-12^;6!;XgAMuknK8$9-oR-?YfiJH6mo@zg|)Ry>tx;;1#ROh%4e(7OP&z@C#B^ zS>f-~=cPJL*1RDNJ*^IB zZgeHLl%o%MD!SkPTle?fE%9*SHJa!mZ?B^r@+V{;Hov<0=V&y;=DGb+iQe7fBe_?t zV@B)HBgsOMb5C^(FO9NnHniC&ducgJt;4wIeN87Gx@1@cu(nc6uSi=-a! zMAiS?Px$DuPAmI|#?iT`4caHMrBtd%B=%0a-8T8EM~u^ft$Wr*m^2hW{35*J&?tIP z^{%yt+dIKGiuYz2+Bu^4#5Y)Xn-%na&9$+vc~-+%G}mxOpWE=S6Mvd+8dOhb^v1{gDLhkRgDNL8Y~=OOuxKiVRJS%Y#)X=qIscr^S~ApC z*K7)kL47{$@?Ijw71$R$aMgz~4IMbc8+EKw|Ki=C@KpI^6UNYVZr-u?yRrtCy`Q_l zJQaP;%jrIL_`$E(vPR!ESLUKTnRVtBr~b_Au z#e1)rBAcsDxGrqFl^ZRCPPgehVPA45S#aw6=6Qh!8M?PNFKbg9$UR&=}j6=1*+Hq2d#-RM9I!W{y&+YkTv{#MCviLKtf^-gnH)(>?WfudqVguWGce@UVng z$+-6R1uc(mZZSY*&pz3GYv0Sbi&e<5r^6-21Agc34PjSi%&yv{8$R1r=Vc+Fi_;*HD`^o8TRuv51_hvsgI&QDG?N+a|G~i^cILsC4ed2qIK%c|v zdc+l7A~oGOik+9SUPR?!bYcrbD(E0b-QEwo4UQHUUH>wdk-tZleO51j$i=f4RjoRF z(O;f?@4LRPzBjsg?SwsT+EO^qoklzzwYkT*mw4J3K8gn zPn#wCXEkiqXz*$?`N@gyIa9iCeNU-kv3;MGSAaf4;wD4#=Hsd-h`-FvMXwUjxz>A* z7gQd)pgMl?c(1!4DlcxZSKhm8OGu@*x_{sXMz8tB9*H=~FYF(7I*h+cM>lbsNQun2 zcX!H>jy5Nq1*lBA{`;73j~1kEGWg&&x`**V;&o$M=gzwpEr^k{(nB;Z??6u1f)j(> zfyk7Tn-$UZA#0DXPD+xxg(PZd4f-)|Rv)~W>?bt;(XQD`MusX;34`L++{#sEJ0CPH zT>4xaMJ_Rtf||K!R&Q}k{dORZk#H%D?r@C;V3&uj&4$J*eZ`M+!FVitkT1et6e+!4^$v z|CeF&{;P!Fj=qAm15X(i-NPG=41augY>$lREn{PF_bCdz-Se>P#Cjcm?kT&_^g!X0 zYi=-6|` zu&eeP9WAf+GQ!>`yckP9r8zHm<~+W6(hM#Btf}Mv?&Zf$-#EtoH3(Jo_*H%W!f%bS z1L9+;9Sqb=JU^&kwkvAqJ+{#|o*InH--ecLEeNYSz9?Z-*FFvvwfeW{>-N;usEx0q zv)K&vuc*9$>mD`Uy*6bj?nV}j#dAUpHd>c*h2Gk05vhI^jhLBoac1M5RE@CEk1PI) zqPOO;{k0r6K;=B^ZC{+;&UiG3EspQS?u*^gz8RVa^U$-mFWmf?B5u-mXryqsUk=^4 z+HU$L1o3Padp=TT?Zs$jKc>4{b(eg%fA!9!8D*$>(x_AN!2O<|R=)-vl}*SPM?dCV`%@aOz4Ev|QJ$i~^ZA-mBK9Xq6>!}e;G zOoaQ2*t{L74CRtBN0pEJ#Iz&NO_M+V9o_P#($cQEw{67zHc#klD|AtA^W1-9x!Oxa zR^P76&S%(c5zgAK9JSOoi@k95=D+Bz)(ojNvb>uGHoaZSA-Ekin)2nn315bs)t0;8 zxk6tvE-hQzH1$BZb%S6`*VGgqM$RJMw&X~yM!{Qr;Tm_`(7Q7;QeO%x#6RLUSsB&Y z#)!F5`2E9So5M?|y;I}0na@aDuM}+btf@@8_S2yDEkD@OAU9e%Nso3MO*`(V9tSL^ z9;XCTkB!@@$BUIH$9hLtAE7dNKb9XpQC|PWKDng`=LGBz@gTo0ZhDg?9mRj&`Zbp% z`SlL{m-|S^dONM2JR==*`khf1B^`%vJz}(zI1cFY_%Qnsaa<+9wd%AWaa?K}@v(0+ zar|e=ev8bU$z$2=$biw{>q7CSnzjFm~kr zf?5xSInt`EV{x5x&WonS4kjuFvW{=?tCH}W+@`&<%zp1vgl+eEqjrn%@JH;XTD}HC2;1>7n;k6*8H++hx#zC8M*{(l~bR;-$kO|57f+>VJ4Pf@@->RHb2rI-p@Jr-MlomPtC3}^K6iu45bKhleQ|h znvEt0uHHgU^N!o(SwtQG{N=-|XRCOS+&7P1BqUU>)Fzq-9uZoDB%SDazNcfna$0F} z>e-}JWaZ31qOE=Yx?%MUsrd|c^t|oWlrak43E6zFWC)>$f{!+^^MnjYGYDEL@!nQBIiCmx7@Jy z!kU4wn>!7k*CS0GN3G)DiuGv>m^==DB#YQA6ixeAw#&8r&?nc7&Vz`{;xCro`9+}x z(d%EFzy1cR+hvvIuV&xLZQD3F!HXA<{@SB)ymC@XbY^fhTqOdqp&gSAp z)tvHD#QR24rIz+kouGcp)BU4!k#knTk4??IEVsl6AE$jIbUy)v{B&EzgHI#o_jm8 z(c~LHi)Wv@`)C`2oZjhcSMsd-_94;U*3SF-$N}vH6^|oR&qserZ;+OWMNU@+=*8G@ zJ@!b9kNufFfGqd7ET8+KY@j^w(w4JJG?A&vjy|bohgG#&gMMihgd*k7Mr*_7$0HSU zrF$#de;_LolVoPAjOsnEI{e=6tukW1GB~HfU;Ax$>HF}elm3YKyYH8(lOv4emPIVK z+0~51ea*i7W#!?@I^^)D_>@J+gLzvcKF!*oV_6)x{$Z#WBIBf*DX{s6#n)fnvOnbC zA_XT`j}KURoiKm za^My*ZbY8fEs`UjD`M=U-*)9Rb42w`#nSSHFBgwRHvJu|N=5>T{N|6IP5$&)XpvoV zD+6gcFyHyn(dTD+n$%QQHy9$Drd{{%-11;~x($O(c;;E8HzvyATkiK~)(TVflFtq! zY7ZX_zj0IrY!b`SoX`4x$DQSfvN z{OR;8F*V^s#1bSY}Ew!&Lv}5+CH!9zhwMiq+$Pf)dyH7t|u?4%b@erc+OZ zYmhTh9x}*@g3!}!v)vUxuP#1(XWaorvO_*MK*U_Dwk~&r`1M!Fy|(NCqoK9Q9n^v$Wv1!Hb)_k=x%#Ga9VgQ4+Yp`pj*uUpy9&yKG?y5xypN0H&1^5^A6^lwB?9x33wwmyR6wv<$AW?u%fKEgw4^{hET5$gF1`SN)Y+03^+ zwsoRT``O!EtG=#9a)pECv!*+ay;x-*Hl^tbGQH}I&#SO89i6WF_r-fT5P{O=b$SYq zUt6TDi#Wt?j0pV+p1v;M)j)z@dVdv10;0Gn?`CXl(2Kl^kA?<@Y>1DWgtdBp+wk^6 zz7JL#^pH)Ja&qia%{~PRF%fBdqY*_Nk3*|^&I)%N_T0bjWIxh)U6!-UdMvANFISsY z&2l8ZN|{^c$EZkVnOTwyX9!Xd^yFo>QSY813FDi9Ai%@nPv; zrnTbBaT|lhE{MDSFwbaSy`0vQCtb12pCjKmkIBr>k^L9+aj<5~2~kAM%r3{NF?YH1 zt3Tz+S9c=cx89leB(C|{6Fn7Q-N;8s_T1=$gOAKU9p+@qSY0cK*h#3aRl99p6VI)8 ze$$#QNS+*W#bDzyV=X?*v0jN>WJbZ~YheQtd`6tV#?&@UN8;LTrz?2uwX_M(^gAKH z9(k}pQ9zylZ9^EzvQ+yOVLkWs3`BrV6TULJGNkMz9y2nc7LGsie z^9TP)`>XRv8m)^%ZiIwg{g(IOr#<`YeP^BiA}{*iOV8lML~S1byja%0WWS^Vtu33za%s>RDb<27DLuA3VFadXaJ)D|Yt~ou9tX>vTg)PZ)kx{Pve0vFO^YQMESx?$!UX_vHamR^9*i&c-l+ z42Xt^I)KuEOMts=;|LGnip%Sk$pB)5xgai~Sq_N4xQ0unW`>rAW(v|GDnaFzX3eM> zW!7jVo6CcOjwa6UbDx=kLGjhT@B8O(>N0md=iGDeJ@=e*?;Zbj;b46FXsY|DAo}nh zK7V+8e0JAst#{MS@*j4OZ*ldLimJmW6sz3mHz!16YliE8-qvaE8!KlHrL*4<@0m9F z>$lwYp81vc*hcl;zFr|Q{M`4IA(CaE$4II8z>U39^Dy~Wy2V}o+{DpE`s;07%8~}w z?BCJ*z5W~MhuZ2(^6&3$?)pm3V#$d6^dr|ZE02)&nF}=Y&uDMHK$YJ`*W5B}-}bI? zY5#$&4w!6K>FHPZ_S14)%KIPU2$iTl0F;n0C2O*S!DZy)O<1 zx4b!KG2PTLd*)Raw|m>C@IPJu6o$0cdtL#>W8P^SnxRyv@&g;EwXIv-ea@ogo_zz2G|I=&F}&}ynvjSub|$q7q@&y9PJ6>;U{2xvj_VF> znnHJXkbgU2>4e$37rGU_+W!bW*>ZdR&p#H$+`D{e6c?$yb(93V*EkXZnb~g zM0)Mo@XZ}3ZVRtc{}l1Z)&q1@&%%r6=1b$(%sXoBy4{EF5~((=`1$CqTTks@IPd#$ zbd)%+^!i)rpVqe9@%vNSeCi`gDXSZIlHY&&SoP457Ic$#(a>38_q)7utZ2u!!r@fY zvSVP*q311{zWTW3svT6mVsxut-VT2Ecu;@uF=t(<;+fr>;-2NdIxy9AZtAzO^i;nw zUv(TfHLdd4V)x_EZlDfbL3-9#0P2Dei6*~L{|3R%x9?A)s{phe!X> z^2dAQqr7}>1}>#ZmEWJ97%(BKV128f_r6+9e;fYQfb;9do$U7JC*?zey3>E{DDd&V z`^=jME^J5$xU!H|d;Yd@z2#uLkXF{Bkn-Q@&2K|h6JLLOU*Bmj`poA$(-{kT=Joug zUx)0NVH-DGnM;?S*Lr`GIz<~l{+1es{^j}Z`jO*hLtg8W=+>U9w*7Xd|AGoW zTJ`o9{Z=K@yn*LpM!Xw%b)0^F^0zf#(w)~9PiwigXOBJ^Q-5za<|#UIN_os!*8%;P zY>giCSC^M*MP$HBdrq!3l`n1cN&ECqsn^L`%i#EXm%?s6)1~D}CH=8JytnGLgKdj% zK70G8`cZV?8}}nCM(s-6%`57LJim($ZPB5#*PLC&ubvAoikqyUmrR%E{L8!5C$bf( z<$qcS)0dX$&Qy&aKUThXaKLXb=2FW@|HC8Z_UWB`^@p=nPfO@+ebAipwX(%uR*0AV z6&^)<4469NVxO4cYnQUFOnh@a6^(NFs7>@Qdv~_o@zJez_h`ntN%GXG6&?dk$J7Vb zJWsb4y`fm~@5I%ckKEa(zrBJg)a^WGgdF@#+^^MT~b!Xl1#K1ErV*`58 z=wmN@J+aT-zwTBYdtvj=MfAacCqCcpD;LFrkHzbraresnwHw_$v|y?GOY0@`o*nk~ zwzc!=fNkw||4?%O;c0OAKG^O!`D7a9sCXbCi?iToYtQw*B{-bKkDg6KOHx}N6*bcC5O^~6zyND zqXGPe4DF&T*Q(Dg6Yto+pSD_W&2c?Fa?Z%3y}o{BR!h3+^%v`wAI%$4@!H{i{o}^c zjPY;X=w=!5%B8pGbQm#d56#)IaZJ1OYYm^gv2$eMeRull{e_?WY1(i0y|7lTdm)Y{ z-v7PqWm&mz{Mr2xmLVU~`uod2x|@_U<6u@{hlBYtdg%W2;dd6y9#oZ_TV6RKhQ9jc ziS4~N5C3h_!t8{Ovo}%k7h8^Pqc;`r534)0KAX_Pla|bL`+D!GB_BjgJ+w*~wL ztlHN$LqGV%f4}-;4o$1Scs2a}#I2bfJX4M;>gX#ke9~j#2Nympn6;B03hoPosEo$D zw`#G)*i!Ur>c445!O*Yg4%@W)$l(oNFCJV;Yr4(syK5$S{qOnjZ#?ruIQ?Y)sbfB? zO2-`-=VCZM;7vOA=h8bH3&MDHm}~BVvlr-3|Mq>3%xJ&9&6m;-Yd;L7r*^gP3-f7KYjYd2PZacA9wl9-LKA-i6_y5Lxbz@ zx8UF3@{Y{sxVV^JuNyWo-t|_{H|?|BUk+?dr`-Ib=NHRwUYQlVeOT?TmuM6}LA-r> zScNimRZ_v*`)KFZet}O%wO_4}_5E$td!F?3cXO*!&n5R<8GY>S8(Aai2Vci@@)%r_ zncAlBv(HS7D)77sD^_6)(QU8<{cOx&KeQOZ)X_0a+(zxgM zpT7RF!--j2=y!Qk)>(V1`sl{LMoyHAsnt94*k@}>cl05@SIjvvfR?aWj^y>f@Hl>L|$^V5B_6+g`|*S&k;)Pl^VZn^%+34aDYaH#f35Kb{L<{r02Y?qVb5m>Uvi&4FC*-(9s72DCzXAXceB`QAN>B9L3lPm-o7j( zNjr848K1tcw(l|dcA8!ak!-Q>CSt1-1|(H-XcgKz3cYRT<>NMlI)p&ea@}k zzstsU8aL4rzfc;THGh!qaD7@pbS`DtIUNV6%cbTsI~Iwq?w3q1`bjE@S>-Zf z-EN6-s+;Wm&Y&qf_#Y*m=e|Gp`A-kITtB?8b9hde?56mwLo0XOlnj^ouG{$0Ne25KNkKnpjarN6^?mdtFbaigo z;xRpte|+dG)4syh?B`eO{v7K?G%G$!Z@0GlG@$A+{Ul>-Iu*T z)8(2Er`NUqBmKDVt#kYQR}OmPhjB-*d(GT3VF3TdtF1kbb{}hlVMYp>+I9&gSuO5vF9=Kz7dO=0)m+5EMwJ*#yj;t2?|5!h!a z!VHADEP)S)kc^PX68MZln1jIbW+6;MVD0B2uup#kR{o0po7Hi^?u7Vc1omO^ScHD| z_zVV#qt>L=?JWh#nTWRj%TZ zXk_te2&}Ix&g!yHBmzq(*}t2s!{}#xW3;f3a~qb9Ltu5-hw+HvbkM^3#6F!6Vh|q1 z6IO@O%=*gkJji?Ju|Y9WBZROBKF;I%sD3*0=Rw$vHpX8S0*f;qIpVCYBmST0chnh& z`s~B#)g!R}FkY~^@*rN;Uxt^BkE7m$br{{OPmCr8r@6V{%r{hNf}5p>A+Ygfc-S~T zI0u}^_d)z)P@myv`Rv2$GMXLp$9e9ua!1-RR~SF1Av}Y?;tY->?wHFCn2xmb+(-2$ zbBd*%X<~R7eUIWVD|4(f2OdT{;|Cib_Hm|})n^}Pp0RX)1lFE?Se%UmlLHTa6!r`U zzbfn-tCBtDz{hchV#1{Oxd~}03DalCCnO~S3#b+Ph;L^qCeN8YCoQ=d`g+I5 zC(N2PBPo8?oW%H9vq8dx=$)H7p||Y|43`8!j-W(PA!rZ`2!tX$qC!53*c_3dj&n6+ zHAy?eZR}5spze9N5cEY$D`5gwB&?oPMv53*%#n25~vfK zG<0NqczBXNAuWD(T0+Wf-+BSHJb0$AYo9=cDwnqP;g`MmtY0;yh7eY^; zpovqzUwf$EuRXTkPtfLpem{8&N57w-MdNs+On>E(3tBFkk zj1PePr%`$g96L)H`Tr9@DgQMf$F!LIpL*4FhTEIW_yq+uG^Agrk*ZF%U9A)Hn9k9al_5-XinBe4<;5U8O7C*CaqP*gjU&$X zV^;o8blK+cK}a&O*`S{@+3OIsD#TwzaF(mia#Vvd1A?Q14pB1#OH1(exF7{0De5_g z$F+IVaxq|M0`~tkXwio!3I7Q`yHV9_09~Q~!|*5?B7ncy0NfG(!|)(}Hb(#d^Zz-( zY#N7MlDu zhl76tO-+ZTq3^Ffs_Wqo0*IW|ba);rPib1-vk3v=y<%S*oEY{%hnuSt{l`zag=>yphwQ5RvL#w9Q_VwKqLwJOJeK&{xfx@QX`b?iQEp^WH zB#3|}G&klqtsmag(V+RhK3v|keQz{}F%ERh1nSEaZrF*?JmXVlC#Tu0g@=qI!6bDTnxJsP-Avz7=Q#RiH>&=xeG>pRLG0)oN}BH* zYhvqLbGZLO-vmHSaQB&=GA;RkF>nGLn19L6D}=2-2ZDHJ7tTn759h%t>8N4vV{>!o zN&5H*WKG91yr%q%`flZM20MDD=9y z>GTNSO_N#E&?SI!?ouQC|8Bb4Sp(=zN9q4euWi(w;Qg2Mg-x3=J$as8z&^aq*@_=p z%;66-dtl>hQrygb?%W#154P^zNK*sX9wx2%T2BD08G@RD^)Ow11+xAJA|@Q32`5-h zCZrRR|8fyELDF>f*pd7XmQMo`0akN8VFmx?9BqQ6X;1ptz3GBq)=8rY@9rpgXzn&P zX$mU5XJeCQwUmd-A7~F9OR!ZM=Io<&<_Bv22krWSnvXVRn6lOcedHs}m4~Z7+WL98 z?td_GprZePDkKf2jNc4u+>CzmlBZ%*jLqw6F$6%vnx{hp|n@R@5|~N!W+; z`!<`)Hr!e8@h4A;Po13>56Y*)YK_It0%dLTtne`A$Fv>2g!gKU+X(FwKhmZRM4`Tu zPkCgIc$g?rL?)GsOT%XEZd?2eEXwVfjBnj_8w?oHQqG zR?6IDh9Nl#9hujl=Y|8Xoh!_oXufwM5qyp8KT1S0DZV9$iHVDIui+n%koW(>uNIn* zuclR>&X$q()@Lr##k2~i+kYTVl}Hn1?nQUhb645wid1izOHtp93kO+fWB6fT_y+bULm6`dI_^fK8_Aim@NmsF{S4?^&;cwJSYt#}I=gph%R}`}EpYKQBicTa! zhi?py7_QOYq7jF0bdHGA$OjDL33V^g>!mdY@`;}2kihBsFm4jBtCn#7G5)cnOM0aL zpm~u*|9Yfvi5s_plb7`1MEaH~bXN$sAv(8!ZfF%N($9OD|G_3rq~O5d+{FA|yE3shWb^dvs4n(+NBe|{k&ec@kZq5WwY zS!1fVT1+ys`kQ)dep$U$g1lFc*IOAs#W9lD^vHRUR5yta1aI5stm=Xe*@-8E_PIi``<}1kMru!aYTd!XE$Wp7r)TE6pSP2FoN~U$q-tSZ6|u(0zKhYQsM(TUIgy9N`M>uxq7hP z`Yz%dPS;x(u{_&aD3)-ofx||_K!FAV4lo)Kdai zh47s$*4tYFGYxIo+%iP7nMC-Tf0GhF@XNMF8u3_fU$KUw?t{4f8rsW*_GkWvJgc

g|BuO|Vr)ihwG#YcInQXD7CJ5@<@xPrl)iYtqjZRiq7!(=)6 z+S_MhIG6lltYE&F@T$9PhTgQWnZ2WO67N&V#=j~4odW)d(|7dma@o;+3Y({(^&==4 zUGS4dnfsrpfXsAtrs>=rM$=BvWP~L9uEKiz$9l&qS(1OSK+5gcx8O*C6umuFDN;%E za=4WiC3;QbxB`Dp&E-Z*H$v*)el&Wj6M72%yDZ87$s*4w0!BZhjI-#o8+#lk&D+Gaa`ag@ zqJVS^Ya_3g(BtU$D52kZ+PX6`Hp(u1G3&Po{SJ2Y+s(j{1#D%MS=ZNjr{omYHHO zmo*ha@6n?;i=+z;lCBx5rTy$QwxWNFB+^}=Q#6V10XkKnlZ4nP{T;aSfUBr;`$XF70WjN&lr@*Ln-IPgnNaoq7}2k-wg_9VXcdQ=1R5Vzd z#P7dOa>jBpVRU3`LJFj9@`cgC9F@mm-#Z@dkP+6~t?!Wy@`5D3^>vzOy?x=ntvrdp zf6aPZevipTi7JWDyM__G=B%?N@q4aeU*01l_Yhb;DoDhEcYfPrlc%<{_RfCD!qjM+ z)KB8)Usqu^8Z}A$fa0@fSsk|b*Y9)e3(hqniXG*Bi|ef-=nk%Wc{tUjMsER52gE52 z5d9kJ4=8F{f38#g`PUp2h#Kn8E41PF67-Y)dU=FMr|7_T9Ox=9(r2Nq^dMa&FT z8t|-dz#{==-VOQ74mo(HY{)Y-=h^647gz}ABzh6Iqn^vEQ>?3z4Qq@tVVA^r>2iW%WD*2g~3XMoO=b)w$7 z<$!IDW#&UyRnZ)pN4sn&p&gY0fq;JwFm0L;ljov*W3fYC_8BbY7DTF0XZF=3eXpT! zMg|qg>PYG$t&6Fn*`VsqmEL#*|1yTVXOgbMp9bvUNJmhocpLp=+QqgT#4L!{BR>kX-X3F>XOk}8B`O2jlJ70JZ=jMJm`<6*M_g5NHc9Rt z;~wi_Z?y)kp0iRjWXv6A+a&SruO{)|UBUi;hm>47E+ginGO~Mjy>%7z)I`XGONbw4 zx+~(5DECKT_CvO|PYGHdq;+H_ixXb5AM5Ynr6Y~@K*zxbJI{W(a@Ha#&8v|RRqPJ# z5cZ{ck^UuUo3<{>-L$)!Qbzq!IW@Eqs5*VcMmy=4#7)c=S1%D|YCVj7ETS%?I#c?d z*4^lr?avuP!68|9?yBiRIm+C_BF7qjE02g&qn>|(#?K&E8P1ir$)*Md-BfP9op@*e zG1#}DaS6ULhYsBTEj2ndnn}(iKK*KOg+Y_V7ag#rQ|;*jds=T#@3g0N_ViYJdaOOY z(VmX8r&rt4G4}LQds<^pXV}wy?CE*-beKIo^FXX#qu2Q5-!Ge30!nw5z)RUY6cUCGK zp`8x9x!!&4Fy7i-jQ#CuifDZvG%nhQQ8273u9c)jvO%R&b1j(O2fKuJYK)VT!8>JS zC_>jte%R`K7yXz@5jRFZM^CCHZpGTkM$$R_>|wtNQQgin3Os7$?(Q{8DfYz{D=jaW znS~a0=agb8m%y#zKCwJ!W~tu#Be2&_RZ4=!b8n<{;GkKoGH_wsONfakS^o>KV$7IR=Bo&C=Ks`V`a{caN) za^)MS+STa3fpjG5&rPmKNlFy>n{SeBcC>uoA8jNb8J)TCl%58I3!v|mf(7(n(@nQ9 z1wC(>!1}6Ea^rt$A@5cLRS zT-10*e?S)K*G<_9`gMtvY2VDo3M{iI$slg2%ZSJTPNpAQA_}^dk{>PVdiA`#`UsKN z_{vC)(v4y8H>T+aabDg=JBI#a*SL(f$lVmxR20BTg|=5y@}k!P4^f{oO^mvH=0v%? z*Tkq}r_Vv_W>~N*>3>YY*ohb>N8KyN&&#Rmu*Ek=mv|WVn1i}pa8_Qz@*O$(u)Rg| zy?I|xS7Wv|$jH`l5}#jfTi^M`7Yig@ix|&=9^8Ygc71hf0hu4dDbZHNnN7|TARnWd zUrZ3zZvFrRY4k zPSg{Pu=UMEbrLD6^0f0=7ej({f+V5vxOs!-q19oahf#Chq}S(ae>aXpopFM11oI^) z46~8s#$r__@qMbZ3jke7Li|eH^?Wxx~JhW*$Jyr4QjN&fZ3o(;*TPCi?E*Q zPDMMKqlHv;gs;H~8YtF#tbtsOkgN&hE~L;PF(j)?qhwVstc}@g;}Sfi8^I-|gI4IX z7*i2~9O1VQW#kIN7KF(NgAv>j>|^dCztpPq z!UBD!{^S5ZZJ_ChzE-c-Ct}Y~8;`sA8C4DSCRE8dqP}Qq8Pnh1Q^rrG3k|JGEeK(D zt&5HGzWW)rI3b5GZW^Zz`J+CNk%#|Qi@>T4_8XKJ~2b}Z0;}7Dvf6` z_dSHUA7I>#xv$fQqbD~ibqA@+rgfP0ME!!XORNvq1%Bk$Vehon`w1L7R~g7<7d{Og zMX7Vt4#tcRwyz4cuqqB$I#$K^CY?TCd)n9mbviVuv#&CypkelxIA*^Bv)@L8XA>Na zJ-+rpk2S8g`lHcbAB0eZ(XjRI9^CoUcGpu3bad%ww%Pu{32CKOq73#4u4-Z?XRJp5_o7;iDJ8Smqzy}P738c~|6a-f?i5ypO@bb*5qbV{URHgQ$ZCA0 zOjhUXGh9Sx6QSklPM;Tb$tKN535P=b3%wI(M$KXDmLY=uaSM5<@=;4Zu1x+jo+2=tWOR*7L@7mLB*v8FN9` z3}e`QgUi$(DKJuC{I0yzMP={r!rBpgbyKMN#oD2J|4Gk(Khv|^#<7L9;Q|Cn3B&bb zZRkIO^XnO}^7yKgsl(u@_bm~t%!#56r7jC=UG`G51gW#oj%fH{i%$+!Z%tfS`}ZEU z)3G_h_GkyMSv%*r4aQ%4elK@Os!ZE#%*od0U@kImTma@`cjGyWB)1*cUmu6n8CcPo ziz{UFQHuG2jA1jUddM!uwt5O2kyvu=h zV6UgsYoh+N&yqh99J%HxL5ULeQ)op3@e_&qZA-M=&=lqkC2az@e2i*O5>~**QXFtG zk*L2hJ-`*i)dFB zPVuIkDDTr)RjT<#t}+*4?JA6$EOKISIdWENCbF-ERH@6CCO{&LAAo}I9>l?sfE1Pr zFOcBJRy>VZ+0bC0G8gG}iKue?uc3bLYn zjIdiu-C-BB;@X4iM84y-?p!E5L468rwkFDT8qDk4PPEsU+)}Wkl``5!f;L|}Z8mJS zb}@;E98{Jn63Rg3IXgAB@&2=7V?J)dPdl= z8!jT6^TRD`+Bp5zTV<&^TCcKUwT3u?(P<5Agm0YzkKv}$N)qrbN^FTMxDT%)D4N=Ml&_^xYLk#WDj?g%vF=Cn{ElV1Lfq%T}-t z&WwnP1YW3|(u;N?0iJJTw0ah5TfBX$(!JBEO2t+UztceViWJ38DVG!d8Ka0VrJ4|l zF+@KQxoYGpK6X1f(0`M*#n1G{#qfga0iJzI#u4|`iTq|@SL6_WwZU!UK!3M2Bv3nw zor3t6xNSHNekk4p_Ab69Djn0>bO%YmlntjU=Xyytf?N67@N^`?`bpX#+h~h_S2cEn z)E+-t)pLW3JziSny+Lk|AE-j#v3eX9FbR=!r;SuUHVQD6w~g5Gs(?*-qg-0!L6xfu zv|Wwz^mu3!(wY`XuhP0073ux@dDkdBrKf3-g7Y%dpa`yoS;4hT@Aqs=n@9#6Y}`=fh_{L$(}esC3=dH$9}zLyYt3b6!f$!U&eP9zPsSuyx)6`=lxhwUJ_0-HrZEF_ubs=gG42%J23Nb2*X>lS^&o?p4^AYkce}S(S?Uec_X1JU#^; z=W9cB7I4^78KSQhv@Rxbjg@3T+qRpu(lRN0R;?jt4b{H5wP9!6n_1U;`HdwgkND8)%jVID72I(8QS#z{Q^VDjlT`QS9tS5KgHpK$zB83K&ftcl-LQKG*sv|ovd|A} zu7%axJSUw#Upey9dgw2qi+*EkFBEqb7R6bD;!al*t#{i!`p;3zz_(pQsu#JB_a9{m zR<4e!)D1DV=<3nfet*Y1D3Lhic4x;LePKB@~a?{!Cq466m4! zSmS!e+#r_>RV0wX9hdo@)8X!7e6z-%M~_L;|pb^jGRWxG3V~_Y{|CU^e(6%B1P>7~A_9Hq3V~I`_fd-iKQm zHVP*FeXX&a{{b9fJuJ7EF1qu(Q)wwmncObR@MLQ+knjWUDsfr`JsSLAxKC!-a38bd zX5+Tq4zn0A6}uSUtL}d41odru`6qUq(mUH5OED`8?d9)fjEVI`dnPk`-d)>Rho5b) zvBC~v>YXg7(qwz-8}`zzcjh#dium8|usJa!gV9wc#8VKr-acAy<3ysp)!@71FP^Uy zQLGK`@sZLsaz8idSHr4uU4M`10k5V!Op+rqvpK%fzlj)RK&I(Jh9$#Yoe%M$cwk;@1=pFyR@eN4JsQMKvnfP+iNw1@NLtpiwby zwF&^Ql#FM`!5i>QbG%X%(Z;OeUKvQLsr;2e(86S#?x}#+*_jovp_OMV6u5G9SG)yE2Dlm##*}C+YI{w9A(^#H_lXM3H;MA{`C)F{8OrQ z;DIDpD>BmbsF3bP)(5Y9>caD=u|j*rWZ>Ay1^dNBv2pteHzgBrqoks6Fs$HM`}j!g zWSfy#jKN@|t=` z<(wD)dOGImShZaj$qu}KJJFKB%daKyZ(dK}7a+_>NWact4!NJeU%ARghov~A{=CX! z{Sh+@vF8x`MTqrA?3@sbK+Gt_x+3T-uh8)z4a(?^&sKhJk*bbX ziZrcMVKYVc8MOm5Dm)>~eqSqrAAFUR^cvRSKXu8{&#Dey{N2`;m{u9YkM){`ZCy5KFi4*`f{&`*+D_Shpi)KJTS;WK0TO`h(1T5Av z9bUYe@LU#6@7LE0nz4ajvzS1e*6`0|<@ggmzZl$X73V+JBGoWnGEOGwS-Y*bDqt^> z8_#92{SNc(8k0uXm&mK}8x{8b4mUdwJ+6Hhd;5t(`yU=?-~O@fmG<^82<`VaX@70t zeC$C79t-2fB3mE)1sE%vz##me2OrmmOZN8n1en%d-7EM}j5jgnrV>!6o4r74;L|#I> zZ_rA9Hcj|;-ynO+7byVY$wi-3igpNQH!W#!(y_oLQa4q;FmduNd zrJvhN+t^F*T4p(weq=9IET*cD9!pVKrft1s2^7_3Igj>gYla3|;mfek3HqOxwZW3*MM7|+wvu=+ z107a_YkDj+?Y|9QUlgfJ`FFBLrW4f%HCjopF62f)#_ttA{0HI=l>PUI{ksEw(;n+h zY$YA&`(j5eM~>rLCh0&`k~`vaxU$uO-V)!$Ut9YiNpEsYfYeg*zW8(TH{#x;H^$3@ zA7j~Te%#oPvvb;rcQAz4G~x6hJEz&$A4A{S*oS7ZvG?Ggw`Q3e$9})P^js#ZTY!`p zb$`gDJH@*+oG0JfGUc(9bhJ~lOrYfNMb2Yhg*DRp(&PHl(hgyY0O6M=5PkuKkjFx} zCD>L8e2f60s0oA$VPx|Sap|+Md+iohmln1n;d2+2RR%*tQ=7^x>vWl%ye5}yZ@UEA zbrf~M9f1U1U40yWlI$XAL{&^{^A+GPU-T(7>u`9KGmzJFnpczW+Cq#`rXEr(;k%UFKI|x3D@v6mxFTB6M{Be9*YwzVb!E)!C^m6fI*JhTz z_2)wCr<=6S1efPN7D9#{!g>LMtOztr;@B z)8B)(92=_P7i0t!U@Zoa&=+f`?+qxD*MNVpxjwYA)*^m_#l|Dd#9b-4ktO1vy{j(Q zz>fGEC3qi@!B#MXIuE{sctD&3-vN^#;+#nrRopOmVU@C>gE;tM?G}LGiIoR<2em+X zEc$!j95YbG&5!&XRztK!IOIqLKi>hyiMPJkllEXsSZ zwP5Zp;4DQtLZ~0!OnsN2L*_0*y)Lk0l(1u1FJQ&k``{L|8|{MuPh{>S)a%r2J&&Lb zsMkTj)4mxz?m^ioZv!}y=2xJH4_#7kUAMH}IxVx_dOr&9eW0@kudKHgL)LzebX``x zbq~JZTU2jdhVN_d)?4SSt+(#WsJD(s`ffIKd3Y)6gtw{z9ad|S znc3_oAq#8kKKc5uR$Pc5ZuwItl|_8V`{EqTXn0_hup#3^JWMpqv3p;>Lvz#xHi_JV zUwCipUj*+m)m#Xth9>~Ns*G%363S`=o;N%z8F|`vfD#+x=LF@OJCN+`Es5RF69_*~ z6n4J$@bfU(Hf$dJyLV>)#b~1Zi250SZHW;@Y>9ofGfGv%cuNO_4A_oPK@pzCmS zHCwHO{{~(cwr^Mr;++)xh6ms8u7h8!ch)=6f8_|;$YRLNMvEd7vRK4>LsCEn@@ot~ znHR>|>S^F3vO!>Xf?W8rA_jH%-5@(0wp)z{RwhS_4UAqXA9wGmzosy z@J~Mt+bbZ;JQ26TT!g>v%@YuBVIG6O4mujC@Zg8+AKPq+h%YT3)@+FfKWqPBlu+}K zX3O39d0#ru7+I4UL(ENQiC4X2mS}}p@}lX}yID1knKIB-ywij4d&j|fXSkkC;JTVg z$x5uzNm!S?H{(t=zMEqD^_~M0ZhT@sDln78I~{Z6q{V>)rw@)B5bzJ^__*sD$c|qJ z$jFC~C2tz)t?dCj6Z+bH&{k=YMG&v)O|Yh8{J{c;DE!HQC>>(Sxa2NGOgS=!Y>my@pL?Q{cPpP zfH;oeTxh9ZNMr`;#s%Q)WERd)ydv})aWbxr3dg@fj=K*5XDuDQv{U*g9=3EuTGlsHOI=1RJtxjJ78@ItWxZ6I^G>vV*=EioB3>I zY_Ozm$4o#EUy`Uz1f+1OKuiBf8y5Cik(lM@8mD#;9UsF z{z$1jpe< zBKC3}%d2>+}ThNpl*!@JvfSI;=Lu=drx z;){%z?W|&fbM*$_d2MliK6>x7&>!Ard%U>mDSlU+*xOF>MaeSG;iqS3`8J*}tkv%w zP_E+sEwo)Scz|wz?}A8i0DRVX(WMDJD zJ$LCcxKcw2;~;)h0J)uT6AJHb4U#@=Od3}Y^B2EZyK0X(eROBXsAzeSh~+Lq?jWaJ zDw=2$!T>f4nJop(&T}O8uDsALy88!$_&D}jE?VfCAE-p z3j2AdhMjkgkb$~Jxcuf_HZAPqLm1Yort0AY}n)$4ZM8-Dwf;|`E9U0^`&Le$F zAQb|))eID$cF|Ui6uWeuP^N%%5c876@#DuwjZZ(zbkZ=K)w`;6o7m~ITxr(vXJMD- z>Ii?^kfP)SD|9RukPzPPqAm=(9+RZDvxynFk!`*G4YSSo6Na;u;)GS&YSSXz%Ihhd zPDIf%oKEQY4+T5-v|*@lLJ^9)dpdq!bsU$g`@TE_cmHYns1Q$_)psfBpH2c2he!k8 zh-7o)8X#l&O9UveHwCNd`L%=C`_eOarL)r1xgl!5}P$= zFeo4^TNqzAQ=x{47h^}5ZM2oA;{HZd=rj`z570U8gF537^Uob(?b!Q1+^6U7SnM-G zw0)ez)6aa=S*5hgD!xiyC~=%MBq(*b1*mdB z4C6eSkwSruQfTafavi?`vu!rgtfYzSwVh3wIQMXWX(>0m z?PBcDk<<-0;dT7}Dg#y&ySalkYfzeWd@B4L82_r{1qN;p?z?DUX9ObWP*ogOCNU%` z@q%3@hnFrE+80f9)kn0`>cVw44FnosRl^&ymFT}OJ8zNe7#E~XIN%rq;473?%WWqE z-~cf8k?&TjGqRzig(%GQ({X{JMvZ-&8S$Yv{M<;(Sx3NH59B ztCmUkRd4symw_6ktUA-peQaK}8*$^rIi6uE-qUprm!Q|&vZT>!SCXS`b4GLPPHILJ zY^jm0&cyO^qT}1c-!Z~S0s{5WHv?2UQX`jOo{TJu@-yWr#qR}S$M7&S&nIxS(($sY zvO>|jw*75<8~PsZ`D2W=m`|)_S=66K@p~$69PTEDg0n5Ex^w3$MLI)UgHp0-r!p?; zYupJ4D3Mh!BV{_emoueGvYrY-ga?=9_^Wt4?6u?U}O|=tA&#=34Tq%u|keJt&rTxSFFEAt|MwU9V@I9oZm-=f6W=?s>R zDpKPs%B%r}>Og6wBu2OuXV(bh`A@Ht5*7Rhj!>A;Zq=C)ABFfRs?%T81)KAr-N*BruA}a7S>30p z3HqazqvCRL0~(sVA6o~5E6>6f_kiv#q6~(lMn%xx>##*)I9w?*NX>H26}AA%ymEEH zxGUAgHDHRYZawHw(by;(B`Q#&O4Lm`2bVNUG*Ti5C31lhS5VRslne$XYEYueIb7+Qa9Kg5gqaTrRz^VE*?)nhXQom20wO({S$t~^IQG_9o|ns$5EVx|1h`S+7WcH z-!Z`2_Sve{V0YJthL{HWi*(zxeR0x1y>m;P{V(?y>o(&Jvcs#^<%}bS)Bf&a-3Pd> z8N}g^vin+XnDGN`H`I&|5tWSdr#jeS?mEs`%nyQS&jug8~z$m$83dFr*2H&@2o0ggwJTG9lYZBGa7Nr(q-Vs%6+yWUli<=%I zDOoGfTirnK92(#_nA$rHo-5S~p+r1qU!}dxfo{-L^M@Dh5Z$A!pESnaN&Fg0$(;-<=-K1Diq z{|fIy3I8;_&g1YNi3qn|Y&VD;cRU>{Lk0>4LtkWeFf_*gY-My}_tM-j9`Gv6kHp#_ z>~+8(Xh#RZ_mh<(8M7;wTa-D>w)_~jWm^^et@+C>67pkZux^QVtLaDd%EXb)JF1By z7h3#4y0G@&d*xg_UIUaC?0|2bY#ae!PCWnX6&1&L@FrdcIPS~ShFCl=sgCF8Uy0|_ zuY3sJ68mpKuxz1f6{QSc6ZhnnX*-|3=v#z4TU%?wDAl>1iHK!3sRHjt;$fjvc)7nSWO^a2GBK<( z!B@g=!BwPf!aEm<;46vex4}A&GD;k_8SG;TtW%rBR&y#RN$+^)B5$-!Q=I){wl=`% z!!QzNi_hwB$LDGH&BXIl@Vf+xp`ozGhw-gk-;Bge$WZD|luL%%(nreU`Mk=C1@%_X z+4a^A2wT*TmrsrMemvi=`blj~`G2%Ej)Pk%sa8@Oq4j{XcEl?a zW@G1YOToWUu*tPXX|;liF`r2%Hy!&8g>NcJl$ULm;yi??m}di0u`B$dxcf_pul-jA zg1DB0eTFWGd^7SxPFkasw2PdelhxpNm4c&SGM)I-uK3aa~^0cI2@> zZq}|hksxQP?;VQgCsYiE?r^D-ZBDRvev55BJ$TItzc53T&Tc)tp20l2D&6ox_B!XR zWfV@J;_w3xz9tXO_EtxZT_c{qRvE(Ke2T^uu^CTPkmtgE@;wBh`61kE+-A` z!$mswwg=}=bX`Rh-t_pmf{QKbdJ=M39~4Q}i`EjJH{kp#JqKqI?9`We$5l9ODZ$+? zf>#$Z4xYfc#W*#{)o-sRZtR}&AS!{)oL8BvOD{^snE~u)frcp=Lj<4Tc=!ZaIr9k) zt9q4^YBwp{V-Mq2dDy%Vcpd}Q-E{4YA?kT1k>IU|k7GRZG2mAu^3Pi&N}Jcdh2RN` z=cfwLduE7i=K=*voydGk|B`tu_ufFx*XE6%AE~)zoe60};FI-KtJq7oFy@yf@XL-@ zRZ(~MI8e7pHjOXeSdJ8^%+15;F)VG4cHU3fS`0P;>~Ed_2z!clC=6QNl@#jjQ)7 z;xPUy+LW)cxUJ7dxtk6?G0dwMYoEed%y8T%Xt}qKImhnd9Rd&U{oAK;lWPFHrsCl% zwJP}ja`oNpx6j$Aep!*LOD#$l@aF^n>qgs{MsNmD^kszxW9oP(07?Lbji=g<_gl=N z;UPy&>nuwW1aB)|ZZDxKtnIE=DTjDMSOF+(@Hu1sscc>>tjJCm;6Y=paQ@)8Oc?-L zgYVns2b&wV(;ViTP}t{%t|G3`J}2xp#)V2TJhUpAuiZoI@XvM*fOpN^c1E+Jq6>Q! z&|qgc@W=C{Vj_S4`b7R7LguxJyanI45NZ)_TxZlzI!K$`G19D)bH0bbpy{m3E#nB7JaZ3)3#x zva7Xe4f@0I)1;${bG(secJL}~lCgVweCHr&w?v*}S>lz3HY8-C5q)#$0>W!C!P0{+ zFsm#>khl~1&DWWv@XBy?Xag9FWOH}>tI6JHX8V&MiB4R-NbF;wU4pq4T2b`?c7sza zHTK|;*Ey`8Yv|RVS7`%`;jo?Co5VF#eyE%TwdRp?>gjoUq@_z(Qo$L#XF2V+AFusn$Wdz=>n>H2jw_;Gyw!cL(UKjI z7`3pr+ujvXIN1##bvx4NYPwT`y8?uN>7I%U$9)mo=rO&K@NXRo;5rXl;VZ(-AF6vj z5_e`{KY+##T>=6ajmp5;Y{p;0D{gfHXjB?2UmAWGy8B9a|BV*?>P(K*9Z20??JCcJ zEQ-PVp%`u=zyBJ}lHu9cCoCzN$fsVDBX7sGiUJuo1g|Z^aN?##&Y^3zI`eqpHsK@12dw0-1!x06}IF zh?9VrM4?C#!Z5jnfD*EYbrQ85TBQN04Y*AJX+-oNa4Dklf!hbj7O_@T45Fg7YA0a* zz^}D~TFJt4lE%yk3G;v6bMKv*BohdJZGT55GxwZ(miL_VuFs3ourLt2`WPs9;4|<@ zh^(}y4&r*AE%0|5Sh)gm@NuB&$a)PhL3Nk`BW|XII-DX&TWs2T70+g1W!4xUt?`ij zgqKT2@U%%}S>RDvWa~RovDp^Q&y8yI*>-N?f$c+uMDSF3M#nT*A+1s@Y$ZmWm(G5ut`L9`Tk1dCDOP!^{|)w>%<#~pw+X(Q}{z>*LAmXEZ#gcCGCWe+~4yX zc7xu~eAFOjY_VxzZCEFY&3Xg&x%ed{+O!lSo}CTOu_dBKj|$xkH(_$Xf1+AXQAEpT7tclcr^{@)oypb z2r1$7un06GI5aWY4s zEtn~pM;w8^z~WHr<929X1o?V-N?`rL>kW{!J2y#HKxoirT=MSpn`?u2-bwKEGUu?- zHWCqXlC>W!m{^-Aid)}k)72M1yC6nwwB_R0*@S+RPQT<1i*rX+rjLm^e)AZ^iEP*u z8-3IHlaoD#V|2hzPM37-(MvabG*&(EKkcn{L>~yO!37BrElr;&TCY1Ha4zXhxAs|K z%pdEwK%0;TFX)^qtQ|>Xno^&RRv$17_(t?m<8&4EG@5=gZKfD2(zCVSb4x zA7V48-3D72P$V=z>?nsW&itNY`(uZy6F?6_wsf*llXc1aJ#6Mv+oXNKjT;`(GDzn# z2{rvZ+2Ev3!Y@cL3*)A?y|?!y=jg8knuSpS|7j$BQ8xI`MeN9eWXNa(c z`Y7(0iGJMjV{g>8K%oL;{{R(ic7@W`98aM%3}^JLoU8!9PrN=PvY4+Bc}v=roesK% zbx)Cw3=)|@d+P?Xb=gL6!-w`pRZbrh4J|)TF;M+5v`}UA5LNZADGU^*7ktEeSgWt?%q4Ja(hda{4_R47UDapy{MT+Xv>W0puLfxI}@}4-0vrKnM!#o zGV&s}sNv{f*^Z^TpU~xT5FI+=1S;c-{FPdESmzoWSr5Jr$WbO_jv=l^NYtz_O725~ zC3DO~tbE{avw6iL;Qy0Ntb1Eepe?OdGe&M}dXKgaTv!7Pg03xT!nOp-HSPU>S0$-! zt?5Hs3)$b#Q?J0ALCciDvwV0k#-tS*=P_pu^tP527!UftkR1(qGQQ4zNPRAD37*3f z>T|F4@?2iG=eC|-$l~5r^rSHxNe~=Mwb?FBFT)Jh{wLbCZZsNT?OA}s)4r~0-yN$8F z@#ZIN?I&XD#pVw+u=ELe(50YNp&Dm|2{=R1bz`Na3E!U{D}8r57T8p4Y(K-ZM|F7C z?5JD~PUSP-p#A7Uq+#=&&L@Eij`weax9?Mn*w+mP>1}9hqiZTo7{?uExBdPg&@_nt z79qZ$unn?){|0y?@JHI{O;OP145^B*Gy@mzm6ixi^d@~vgf{Al=u^KKGtgZyCc-^? z%*h5dX9;YNOOtY#?Q$(2lga+uMe{>GtIN>y7hIul(69#&jsd6j zhKE+JA9|{zb6VniNwg?F+7L0f(}O$2Yp%;Gh3gEGr|Jg8{4G>NXk>WE#zIcx~M*Ld*K=_l` zUsx&pNm%s#lRjHM{6- z$EfgmF7@e8d!B5F5w;Ag2DkPC^05f)*qR!g6mPXGj)8CRninN8ZI*9PRN<*3*muuX zZNdJanEa=!omW>_uh`)4nWK6_r&ZRfRVyqlHKVG^b)l~ zYxuphl;@Z8vD)z$uq4`ky(ePF0L)bXS80wkZ2u*-1$B;Yz>`zkiuVxBJOyeZnjtx0 zbr-Kcp>-3F^<2nSoYOx~JmA^2p_H@s8@0WDXpiQ69PfvKzi580Q|3IX+nQAd=3V!s z;W_f+qJ3+`uH6<9>siR`h(n-VyL+vw*W|l4sMp+a1lkUHHnIPq9S434_SV$4bGv0N zY9rsbI%V~8SFQOG1$0xh_`r|Je$NT)R zr|=i8%{#k8DXD)=e}xjK1!nn0PRV}n{Yw28(JMa2NIphm48{n1Cm-YFwd%=~-SuPw zzpkE4E3lvZ-a@oCwe0~KA^d=w>Z|z4lpAs~Z9|)gTv%I#5zbXkroCt7lS!z1U{0rh zA$wYR@8;E4e(!w#-l6=x)4IJk^hCUazxUfUp(o;U<-PLRO#Z`uZyU}Fn%&{MHRhO| zQM;l*og(WDP(#miLBmXMs%!H%rFO@w^8CwGMLS1e?*-15bAi)o4Q&5FR&w>6`$5Va ztX*^EIk*OM(CGzC8Row3)!yg+8!l-sUK2X^?2J73bedfBp6t{kc42DUbFYS;)FgG2 zpRs&SA9l@w&1@k&Y^d)O)`af1*C3IKtb(H}O>JBGYRt|rPepPIRm={;9q#m&T%h;7 zjNM0c>U{N2fw}1PVHVaOep}Y`Pi>p`Dp{5uYAbqmSF=%!;3xlj6J=lN^p3xv+dM|n zZ>hm)GtDG`U+TZH|IW`~*&47*vytvAft?D>_d>Q5eWl&{uhr^q<&+%UtpVG@$8Ms6 z7K~tO+fbTIXvmv69jiN)&~_HG$$a#6t3!8c&KcUNpPgP47}FCxws-<||3&W@j5!Kp zKDR4birE8n|CnXK2giA0lt--Yr04Lo$gWi=>3?>m;g0L{X8tHYb*BFO=``urh%_ZM zB8uXj(^RTaBY7uVxF6**0bUQfxmBt^mR0Q>(=2F1E8972 z_mIw4e-G&mh9bH+P0H)#UACYu~)rz%GYm>1k)w7&9Aj1~od`ylV%>pM{5<>FZ5Ks2bLZ~x7|9llEh4^7ck(y6t#`zTF zL2OtT=6jaz$({VZ$6c5T%DZ$y9shrqbo#5xI{nKB7=%&%4Z@dE2H59?32 zv@1HjpZn-GPN*{>Zw9auTz>E04-ysbPyzu8o$P~Qb_fuGeL!Cx!wa({?-*RZ5FyN=-h`D8BY5B{i{DC``O%?|J@djf5Z z^H(5)iQjt%`b6jBqdR4;aB|@0m+A8X=x=_TvI^s)^R(0ZCOAK$`g?Z5KH^-xq~DGj z;>D&g*f7E1iX& zrsMC|{qj?^FS?E^$w#9}#dw^7@zBn7@V9;KQZ1CL@!eAB1%ejJ5^kZ?Zy_5cculNQ zhquE|tMgD>%+Aexy<1o^$IaHauVG09^K znF+mlpdQj#1a@Pjk#h`YXlx;g;hTs^j?+c&5)RJVoq&KhP`-IiqX9S=d^j>v;<`1aa{DiaY5&iKOU*=43fLyeBWc+^jSH^)yzaaR_1#ax#X@9HPV={OFx<0lT$vACT@eqBjnTZjpOq=(RV= z=U)li7ui==Cp{C0gH zo_$_@?i+pI)-<%w@eMzP#-?78#wNq(;I*sn5ACp@(jWU3`_l%$@OeL>Kh@`Rd#q_! zI!i|^3DFkTaq7)Uan|teQRz(PPQp>yF7!$0)~74e*#b7@{FP{*`hT(1_LeMuLfqbQE+H~S7q=MI;payIP2t6b%<2fx#-!9xpR z5hg3_#OsCDB9~zKXTxB2vyhMfj~D5`z5o9<;b532=Ha{T;t8=$oTweI`7hMpBR(QN zhkpf4v?fb;vrcaDG2tm*d#>&o;Q>)6UGTo`N5t*{Z~;KkvGTae(LAnF#4W60-}xc+ zy+d|ij_-hYBC509uLUAG>I^gkxjj~;Y041j^7O|->#E<% z5fxhyQ87#^BJ`6X;26dDx-GU(V2RF3`L2F0Vm1gvM9V(A@a4B3&U^vw>T&bRy^uMg zFW)^3{p_++^xyJRFDK|7yPNf5M9PQ9w_|Q6Y2sRH7w*uM=~F2<)(A3+yX@V zleG8SH31yUDwAXUx0-SOwjujstEF~(`9|>H*YEoV^IML$Soe{afUYiag#5P|f0Hzq zu1Z;A31aj|DN#jL+R&@ zL)80Cd$(8Kg%Q5GSFq?n@u$J5ir{=+gr1i6#MHK}dnwxZp|&l1Dc+d&g_cP_KKhMz zT-0$ZJgQ9+^?U)m3&^8dfLG=3RwvEWChEY!U+~_|rGfkR!s~vg2#vzs-;ChB(RJ(1 zZw|$Sj)~62#L!;eerTZby{60e#fOBt>#{rjzn74Uy|mN+6!@ho@JsDek#BP%N?xbG zbY`dj=ESWZ zf7``9z3rNFdwSb7r}p%|YmV>fZPy&#v#po?ba0QSmtS`8G2a({cmCHNM=!r@+Ow^f zUmo7$>E)NoJ?8tvzvtI`9KHOqXpgQXPB{fi_QgPxee1bxteVDcXs=IHo~QaGTkfXj}%5Y=Jx_-fM(UCHy$H#qw*Jc9NZSQ;BnG{z6AaTdCzKXe}O+%1?)5zT-ga`$9~lR!KJBO zo~o;>R{lQg5-W>v1Cu6(e*YK#o~8V~4uAgxf2&B$e{?}R1FPP99({|(_<>Jw?FYa4 zscSQ=LCbl*6K&wz_xQI(_|^!ITlLvD__wn{zLn6ztNdGeR8x;-BB}!YH|CI6RD1(6 zR>&3|GkN-P4Rg@1YXRH9{rCT$D^$NsSPogVW`?XVXn88q9(d~{;;mJgQeBa0g!`!E zYXL4=nwY-dW_J95c}hBXp>kMkpJkb?Mqa*&lQPn~eTVMKqIw z>s=-zO@xbLnjX}YKK$Bg!D3rLIb)(?j3;gJV!D`-=&;4VX8Sk#A$UZ4G|~Dlfxbw`zQ3rBBuHiRSvGVDF}EW2Ik(flqD?Q<1nHCfNP$W_0hnN#)EkdS zR^E}CR-aQ@lDfcMnVRlig4k&Ck2OHI^BpWG54v@j3BT6^`(Y*da1V76cbJ>TWo}xd zC5jc`e&sB9i^m$gf;@#mbo1YM;5)%HZ+3cbt&`jD^k$>Y+m!bA<8$_9+rLF=e?8j2 zH+a?{Vl3UGwm8zCc7XcZ=^f^W*Aege8o!4yQif5#BWr^FJ_+7dwqM++w7dW<&qT`# z62(T7<2ra%QO^-$$79jDYtQCl6-7&bk5!5X1%~?-C)WyDuc66~gZ~_9X1YI@M==E& zSqrziAx#XWQ~B-l*`jj=7xlt&lsizAxUD|mF3d-~K~Fy<9xZO7Az4G{ zQ-ps~Mmh~`nYv$O&*b@R*tsFf`w=gII9WZoaYT>;`%MS_w9~r?9PSJ^^sm5!Nr&u~ zUb!>{9;9{45>gQPItjj}atp2+R>vDkeE{A%G++Z_h1Fha>ki~C)V&7g89fdPy*~FL~QX~GbQAEzlrc})cDkyQVe-# z>u+_$Dt?o=Gj7OAjHDaGjN2m9h&nnajb3cE%?-s1na`f1IQ9#{v!3=t_!#z}HfKId zJMZif!#;@Uz%X#u92OBR+iXZPCu_!1oC0}kX0AeXqGl}V=%6JSs6&rp?UP5-is+ZE z;r`;F4%{m9SuXl@j~%%Wu-8=|rr+`58PslaBFbm&?h_YrGAP} z6Rd1Wnr?Vc^V#1Od-flyRC{AMyr;z}$*_<8==~5o_-_;q1S{{EE@)3DVI7;#_HsM+ zZ>xf6PxHCQ|2D^8PixX}(>iXq10K;sMNhTuDV)_MDMJF5hHGG7gI!{u9iZWc5YSLAszE7d!YsSXMuJs$DYgI6ep6L|_-%F;%7928|Q zukO^gOM3|g@u9X0dx0bhTN+W(MX&WD<~)o?GyW`EFEq(|jhJozK=a&u1NH=CcbZKE!iu@al#8 zQMRE(qXhS<9=j(Q=cd4#T)G-MMc?KgO5eJ0j!rmW8;WyuD9+KLI7dryjy?`f?Qg&^ zle5ghzc5Kiti?I{i6`(KKSyQ$@DuP30`P0WKOp*HP~_ieuh(oDR%60WB2 zeD*!8*E?Vj|I%d`TE^!$1@qg$=NJ7LLal7UTNkI^UOziwtm74E;w%ccs6`wYo#xTV zs1vRa+hN%uZLGQmDngmeH_d0;xaIs0pjPsVMl4Mkador0P?WI?MFGnoTcs+MqW;Dy z^riY8&YOmje~Dduf}cDUX#Fm??BS3Izqk2708Ep1IM$!8#d#Q6S&?esu@X@4fv47i z!fBt@+7iKSWm!jp+tO~af|gQ1OPULqH6D9_oX!Cr^<(T|8EtJon{=k83q}UrJ}PCT zNxHp2wbIT0eDJMgeR#kQe@l-0_H*z6gQ8bEG>SFuh(p{$G^XJFf6t<>4gU6{J$K&37ulHEo(meuGv@H9TzQ{cxi<<03s7dMI)Y| z%8?4{=l3G0p8BEk1g56E)+_TQq3_*sRqvhB%X`0QjO@dBLvP}{nkRNy8=^AKkr_<0 zA`z`cz7vy^mO92vWDTP&tqR zjY7-SjsKO)`p4t^ybAyL`RwzCSH8cx_y3~lYG^;Z+ql)W-_+2qjGOr3HRLyb#~P`> zv<=d~2GYOL9qsvkW*V3J=d)3e`itCY;K1&&RNEqv!%NSmfqMp4@%7{CRZPbHJgeDS zLRwMeeHUAYY;ig^1H6d_$i-eD*2=lm1SVAp6oJBQ$VVqwE_z$=3?Y{Pt4aeKM+xLO z_m6rhgYqtLe*xqS%+&>~x3nwm3eO%hTX~SLn-=5A&Kjfqn!|t15BYT@IEG!k z&t0`i*Cdh->M=)uiSDUL9@9ZuD6u74Fi)LZvE zE~%dl@`#-KsSGp!*!{4~Yl`&THt+K3wyAQVJdPvvAAoC@GoR|%3C_#BOsGlxrksx` zyWQJfs72Y!zCV7DtOB;uPmu#zx+xCT2=?MF4T8_wiWZhb@0RVYMvOE%3Ir;CUo zz^AXf1^yut?mNuB(GHvJe<^QJu$Oy|R7SWR#^=~{sRkGuf{VBsSxO*#nT$AbT%nhY z1`oJPGj0%}>XVQ;k}hql9qpu=vhOl!QD|mlq>A~#*A&!xb3^f3t%2TNW1;>A=HyqQ zS_AbYnTPmf4esW=b9!Mt&Z!)f_Vaon73CFtr|_U5zAu;a@0iCvy`qgf=-)BnD*Zd= zAv<8rx4}NSr0gZp@H|~iku?#Nh4BO;1?MzXrB3^|UNiE-`j*-ss^=K%ViNK1bc+Pf zj3j}5twiBIetsH9wZzkHw!0-6vP}1)0Ytp6k26jE#J< za>X(_d4m37IBh3%_a>Uh7C?@C!4u?j`huP|kNM7;9XmKG6rrclcx3c6nk5V3S{aCPH!Erx*Y1|URtBdXxuWla8>^9>Lj64lET%j}W z44Lt}-kk^edmgJlsA>hO_OAzOfbh^vr>_<`fWo5*h)za)pb4keH|Z)i-Y1Ayp2v*P zlMo7^z-p_$!VNUNeNv(=51)i8WV6tjsQzC<>VMmA>kLMGgV#%aK4^ck{Ng+UKLKU|(>K3dH+u zbbaL;WTu{p8PwV*_>0b~*e(cSa+{k2ZD#Q{bEq$7+V9jF+D6Wy>2A^|i%}L2utZwN zYUFo5Oi$+0y)jpcgN9KUmFr6u{NC3)QOhJwc+94$!xJ?#r3DhT^@#MMw9a;|dvViW zDsGj&L4FGX@lG0%=6<8C{$xatxz7potr;WInGT753R$;P-PSESQ2PL{O}7QzR;VkawxaEWUcDrL9GWrqE@EhFn@_q%kkWl8p^CMKQ;QPRO)AK|4^Z9sQYP}=x zXzN`-hcw!y))jNBT;;n~RU*W~N@=CKW5Eu3rNHxHeZ4KVo6P_0!wU%gxDjuMbRIS0N;o zIUAhX^fE-V_`PE`ay#%Lz%(Vec>DAdck>n z8Od&{R1=h$*74f&a5_%LS!G>P=F~Vvj4qDj@TxLj&w9V&^)gX!3hKdoMT9NM@EXp< zva)61N6H-0Ck_18m(LuU(Ok?(w!(MPNke?6a|!XC)jwWI`pQ6EXNZg;>k&)Y_vcI5 zcPQVWcu>AR{{hBZ%JR;YvZL=Pe0X3kzwR=Z(LLr;;G?=5qmmJm=do**nJiyoc8VD< zI%Szkm4Vf<(fer?W}_y_hw|vgEeU@T5V|s*-j^S9DSPw0*bLMb7_WD{49|nn(jUpAN*iDIGHgMiPiBoVlOIC-T?vR; zs?m`(O9#n(1^f`wUTi;c|4Ugz6hDM$X%qT=)A@=6&}@l9QXb_He8PymX7C6hZ-+m~ z?3bGj(OP&UXn_=$<$$G;=kdDLjQGs~awf0G8zd9y5J?}%GkFDi5BfOU`bAJ4q~2XV z7fvZ_0-}C*n@=dBzH0NCnJA<{>PyosqnMZXmQfxKRqLm&1R|2_Ub)Km?>cuidiR{L zdiPS`{~7*vb>m)ouBRW2tob869#GV|zT@$fvZv2X_&lJiig^~k7L@Uu5O)b}m+aBx zcR|=M!xbM3^1CRUzQtyP2Zq#6pK|F_Yau+?Guei!)$sYFT*JQ)`1~avqdbHU;cr4; zxQ}brbAd@nT0`0YOw}3+t!ub9ZYjIK?f&Phg88QIJ*D~({tt3ZP;SFS__rN6{cyr) z$4<0Ar^*_zGF($-mB@}Oj3z(C#H!3w$Wj?cd9-qeec`K4*FWJhec-DW2f(f_uxBpO z9@cKEvVG&!ZJOi${#IZ=41-UG5j<$r19lD27VY(#6ghvFRnjMxa{K@_ch>~?jg+FD zV_aYCsFHn0MsXzBo$&q`uVfa~xiR1H3#dG}_LLDTRn5m(RV8sWTS79S-zjEY^;5}} zZtaFj5Haje^}uvBWe&4Qgx3(gBL`OZ;TQXFo_G*rG!g2_tSa3^b@hbAC}dSkfWOGx z)L25HolE`~qJlzu(c1(IJ#bv-M#0jeMb8OIgtE@wo1)=XevSdEO3-Ej>W$}E3URNPUM96?9fPN1}%$4I&1BkhJ z`=4Pg%Cde`AAz-@vF*8lUReaQv4*JVHJ7P!u2mjMF1!bWBY9XEi4h~&irxvx7>c#U z^I4#}r(EE{ zwr7{JR~kL;U>{u4VIbt|tOdur>Ldqrkw>>XN|}vI>Cioci&Z%&vK^E;|5Zye6(RSB zQck|2~!MdOD zx_Ryl=aK}IeYgj-X?tcXC}q2$Vc2{CQIW8i7MPNlx;x$H$(Wu-Ayu|sIK8;?2$<*6Hz9h+=P;WlGaqh5(2uK zqbqfzqos`)qc9G6$4Bpse}-q~pbR9zaTeiS)wSi$h*>6k#LQF)*vR8n+T-hnqTdyG zZ!pV3DHEDLj_veM)^z$ySOb^N$scDua>~5tGy=oyS=Soph{^?(FC&g{b7dSN8DDCd zWH?zlu`Xgf#WezF*D$f}H>}8jPnu-Ap;#jT^hRJr3<^2R`OYPD9L)b|Bh8oT3)brO{{J9>p^^3#N#j zkNHLm@PbMQR>s(i7JXuhEdiP2rMBbGpN)vr?4X?4!*aam4yPh+AZeAo-xJe* z{46rc5pVenIZ|-GHB#2f&18LpwO~LOndM{Xj!W4~jpX%MiB;E`jCRdV+5txz@t0t= ze~kY|?pOKFT;!q58%FaxF)+Uy`23nMzs%)wV&f@#H+6kB-M((6 z*sP2F5Nk2kgtbC+W@HTBCF0o$^cj7`XRNcBf_XN?KIR)^LNEDq)Ned@W7p?m?MGIL z&00K}YN}dA>qTpYXKCHi=`-5IXSAsuX4f=}c=CFac%SXQzCAn6RCV8BdKU4mkujhP z4Yf<3d7IG=JA6D%k)VegKo9+Tp$C~3hUSRUKh8#uAu3p9pZ4QlBh3mWcp9!m3ELWa zQo_3pK}v`YP(n^aaum_QO#yvFO@I#m{ePx|iG84ho3DZnCijsJe%@y~nAB%FxaBJ7 zU`n6pU;yY~>J{l=cur&zQNn-#CA=Rw?Z-Khshk>0*jMK-PYoq(^ZD-7P{Q6gAEXA8 zLJcL%j<^@`8ls1>@5pvVIj57XgD2fss1Ck_-33iUCD)B5+H84yc&;T)*j!7Yc4V%( zP;_lw+q0v+Y}`n;R%ny*98PL$|Dh7*J6FQmQBJ)bwC};+Gm_5C`o{bugH#{^;dh_? z$HyYK45R;UGSxR0zAezTP*x7T6d+?5?PmUT%(xSOX8&nVJZAqQpui z%y531^f9DQ*TE8Y_?!vfw4XasDk*5@-iVHu-r~sBE$i-lKcMNF+&$x7uMK>D2M}#_bT% z?+F)Nh}mlQrpXaW>N|5~->9H0|CI91LHwO!@SX6-`#q$Lt}~)R%MlmE8uE2VTttcA z``M)(&F~0mF&aoNg&Z2S$)tfatD+{kT!fS4_YT24>E_kJmaM@gLKy1nq%x+Pb*&P)k@0lR)-4^DV(ZOfd$$nAW zxW}?ObHZqn<~3Wim@}U@{vs%Vd#X|NAvAgcWINeUx&-kx4Zs^QY6wG3P@?+O3^6w- zQ37HhN+3D-_HueVyobk&Kgd0x*n&_AvEMVQjHus55+bk|_Ua%bmau!9&63*R61J$h zgneM4)ZFHs;-kNQiND72@5}MY z+T8YmUikcdz3>gnR+M!=cKFBR9-Zv(2!n^z(Rt?G8@;n}EG6MzMkZqXRugk3U z@BFuSpI@lU^>z6D5uJX+C3)?oHotjAg^h$%yG{7dF>vjYW3(Y!<4YpGqP@6_8Kc;Imm2CUSq0v7~NSx zyZ?4a35!FGT--6&K~9rB)W8)Zds+$m05oz0d@%kYTsM)g0E-nWyZWMBW_H#HR!1KA$_9e)u55{-;i4T1k z+M}Mn6Fog1i<$e~-kxpa&~)pl>u%yC3$s9~*c-^jz;HI^}Gp z4bEvRMP#FMrH-h_cTUQ1O0f(352^Omp1paiQRaw4dy|>+{W0p(U5$!e6Zt3g$lQ2& zD`SIGbmqXCOQ#+ADVk;!vzy-y@}*V#qmdhjJRgLl7o2x4xxGwYJ>e;``gUEv3V0Qm z9lyotorx8k+-(I@>nB>;>mW=+cbc zBnlgESwhQ#XPRX8iTfSSbqT+4oP>8-F0?2X?uXXtz2^eX?(yqv1M284*gKIf3GWpi zw*7^-AH~~`M*GcOC@&84d7}0U)QOv!X?kW{$>-&N6VLC4zV{`_OjolO&Lz1AXwAizNM(OCb?N2d2KiPS zh}pHZ-Xmg%RH-}U?j@AbHZrV~#WVMY%>-J)iW-EvyRe^%*_1=HM_r(0l`^R>;k+M8 z*edjdZcAJHxN`Dc7zdw5hf}NU(XkCK_zC1KAzB(3&>*Opfd3Nk#5&z&bh+HRo`W@( z+OM-6Z7)+ivF^4UZM`G*Fpy^*&iCMrwe(lyCu(-}e*2H5-a-D9t@I^qcEI03_6_g3 zpW;x1yszo@w@C8+FJ}p%Js~jTo5iq~7qfR!-a*+BVjHi*ZhjOV^*m>F(*ODfWj;&u z<{OkoCyDT+>VG4jbBNV76+=1~tQ6NFu>Y>2e46B4fqw^DORCH2fZa7R8MappUl!8KAEM8 zHwCQ;tw*@k7!-KZcP{E9ovPIGG@37rWRRKnHUoX7@r3cHm3zz}S;{?rled#Y^|?pw zNqB^!MHi^#Nt?2&7OacxQ%mns*Jh9)uM7Fqjutw-k+eD{as1=(sYPq9Y0zmQ#WseFm-YuKA@s+he6y#e`ktyOGOvQH6N zc6xF|p&U+EucGdrO2zDP-Y$83sgW#XXCsT(4fPbi63*6D%$D<7)0A4Wt;-}x*QUeL zMG-#zg^fdd+JA~!5#}fNKsmQ^4ThD=xe_3Jx1)Ko| zpqxQzLTNxb9?V7GE3OMgh{-w$toPZz=GB^h+4$jNme!p7dO&W1f1!bMQN7XGF-2kp zZk2{~oaD9qgY&c6H=L?%v%8dA%-%#D;+Ks)FL^OL0Vy|VF)K#C%VPEml({_qfvjb# z!OiJ=P#5g&S>3Il#jKjk;sW!BP*}=?4bIqFMQj=L_PUtFJ_Cn$@M+o zmaNozsmt5U&cAT~ae6+~ud|p9P@Z3h=R>)ha;Npddh}BO?iQk9ti^7#bI6Dnom*kO z)%>t>nJRH^cYyx5-S{r-hS2emcVTdR-MtGTqwreAsHKjM!A^ZStwk|=quK0m<8-3; zq&!I45m9hBhSt&=O!VnJ4Ui_}HTu4z>&{nwHdR|}F{?pa4p5W2?=_14zZmxNVp!m@ z0w_~ZCZkM3nTRq03KMg?wvYm`I4u3?8EXfF>|$;rxIu=HXm4qHx8e* zoO?yiY1@JPxO;pNLaO;O@G0=t)9i3soZ1?3hlq?iqkN;BR~pAyjDvVnbsRbx2e{v2 z=7B8wHT*L&Y6E%&?lZqyx)oe+eWP~s9Oh3?b3)r1OCIzV=`)|;s+mC<0@b*;G$(my zT5v;s;WO#@_+W;m|AnC(ZKHT<>-<;p)yxYHqQ#+YiUPa(a~@5StB;M0+YA~rr?%~x;9oP=@rzv%q>z!uUHgv1OG)mLzz1%Xv#=g{2C zv15CkmzO_#zf-b#d*#ZVLeXSNo}PXdpgzS{LVoKwJZF)v^wx9Ew3TxwYOKSK_dc6O z%qIEQ!b6+KZJ8nCoP#Zkq?|PDtL`xts+2{)5sidO)Gss^vu!9_QJ!loV%4gB9ruE) z6P4pddd})mF8PxG*451_xZM%5M|W3_WGip)*O*mXyE(vFc#r~h zpg`3xx%U;5<^QQ6D+V9uE6#HPWbcXH=6M{X*`G4c=NfSOqBNm2fP%l^(x>dhyw15E z9)Azkra9;KSUVb@8XrUPTEyja<$@_@u9#hdj7s*GijcU8`#^EvTz*1SOow;)e<*IE z7#axbmnkGFM!+a2Qf`Z_XLMFE5I6ZaLZT%ez&L^@L=I*!8%4q_rmHeMr`GPgse0!I zZ<4#XB)?pt1DP|u(vIwUs`qTu7SIl;=ekm(mpJBPW`#_@4Rl4%%Y8T-Ceo^R-ni!t zDWFB-x6~fU_ev2mVid90Q1+wjMS13(;9aQhZ&~x8j!Wf+irANsJ&BKhTj5W@XWTbe z;WMmD1nW@u?G#&Z<12{Kcp~8d&Rq@HjY;qwSte|E(A(t}wxWeu3HK%5?m#R6cI)NO zUF&_s$=xUu_EBBWBDR*lfnw@t^Di)K#te+aLc>s!x12#KJlp6@?Y#8#n~u*cU;;{9~=v7cMJ^s}o5@&De> ziZK05Mn6ZPpQ*f`(IK81bQ*Ih7r9X>5}4~|cxz(P-9Ed(kgQQ9PqKNoh6KUi2fUgqpO@xN{tJe?%t>yY^dFRNj4}n%g zZhb;X3^Z}mJ)Wy)M9 zXg#_qx)z--);$_`cTcUyd0*XFTVy~PjVlSb*fU*r`E6Q^yTTnKmJdIMN=qSLaL>+ZjUD0NvN)>cchk8ok z_EDr)@{^w4KF(&#gSHp4g)CWIiLWCaUKA`3)NZJKq=>Cn+I<@B=HiT#TJM>=%6_DE zg{aye$U;(%DCsCz=TG_uIgTEHe%57nzUbTx9FC>eOZA$TXoD;*-xne+7qJ4~_ENel zuy4wc=SjC_(X}G-tCu@$kg|u`Uv};c_(*5r-dn=&y@|YDk-HprBT+QjlRXrr9c>_) zoT9Y5z9kX55|X#l62)X&!9dUYpb zri;{r6M#$2<<2RVD#dR=_LIi`YsTuMyoB-s$~Kg(D9<&YgHJ>eTgQC~WO-TD4$*z8 z#;J$e){1yO0JEb&xlzY;xlzlPz#mADT+*T(gQ#zb)W|WGdVWs@Z}P3^t;`c8%#yjH zFcP=8UzWEwl792ozOI~E&wF)6H@$%>Zx_KMrU?G`IRD{8;O^+~AKtDPiddxTLjl>F zY$tF-cGvrKuJw|NHKFRoaqb8*)&$usLa`<;dLQhdU&RRz%UBbxOkhor^~43NiN|fj zIl@7ff;B<*61rgsYa-OLDBl5tI8H$t-@!*ts~m6<`?#r)y`_G*d0w| zmnUtx*Sq!|YGH84;aapXEkoL1n_Z9kxm6Nc5P}{gDexeHl&Z8+jaF<;DrUD4zbtQh z^MD*hm55s$=R;E_VoK?aWhVVlLXpjuj`*H4rHnY@+ibEb9wk(>sL2!Jhf;)mfNIUI zz9>}N!fUJkC`E_>D1!YzV4IH8!RzmqOPM?q(t2AaN6x#YUJw5c@<)vKov2lO5VeFa z5C5EdmOEc)Z&>z>E$)PjnTH+UG!e+w@IU0p)*LUdTnBGJc^9Wk{S`d4P+aTlgSghY zMky4#Q{DR+4XrN)bWG@{8}{?aVLG=O)pg4;O==X-qowvc;J;~ei}>`La(GwOss5Dk z^(X`LR? zW^%vj-Bs}LQt=U!j!_=UH!tybarD8LDJx=yarKaw?XHZkx0B7korb~uQ#PG+u<+)jgC;oP5N6MkHz0- zSAW0WlCq4R`LIz#c)>h=m+<`5b_*FSl6ALj(+ewJ4C>$e;tQePtF*(r-m4nuC>SI^ z8B^peG$ruh3A?LREs&M#OSlbL@vFcM(BS&xZ=^rN$72)Fv|NV@*;-XUL3{no?&bj+ zP3rRF>!q#GJMNh&B;SI(9U9M~gx8R}^*}t&-I}{2OUd1;-|7=H@2=cUan(BHZXGp< ziMr^zVbUVxZXL#Rw@xtEWZCP*=A&9XYc8!^Z@Z;_OXUEZhoZxnN*=;BzO_JItnod( zu~2gP*2d0jia=H`(c>aVmifX=fykT^1KV*M5+BQCl{e4!k8{;(Ho04BY z05`bk*pPJ_=sfM_h?JZYav$~B;j@9vZKE6p@j8jnfe}lqc-yIX$1AvhGVUAx);CHRGJ)()ZG1Dp%LsV zYN!#qLc%SB4{7#Crwf5cwhld9M-;?fIs4KRdg0pVvG;29f@Z5;$i-*6Lv=hBtT5qu zuE98!(O-Iv$AQfg);nS`M|tP1us;0CnIb)yw5DL2Gsmd~qC$>i*b*7Fu8;}m3)z`& za<0rR(S8l(mI_%aWPQ4kW5KI-^(2#TWUhhep-1R>BNwuxkX=7*>+lz{z1`j&70?BQ z^2+EVq+m1NEqm!K2d8$VHL(kyEcYQQ?D-L{4{OnfDZCGNb?HNRTVf&GjUKoIr`Mr&RjefjbvG+oN=wA)0xq8~ZRq$8lnH%|awjf|ba-Fkqx7Q~DWb zRL#c$qAzeZYb12U**IwFE?Ry&Ufu0lo? zH9k81xR9KM=z5{j(7aCbm`!N53ENuI3`V!LGHqgn)heAonLT{JO?NE8(_f-b@yGSe z2Epuj1-zZ$f~O+SOp=|oSJ`oe~z90YKV0vZn)`7$>#C_$XQnignxFh zc7%kO)K?J;OEO%w)D;V+kZpst{mt4tozo<%Jp+60a2Naefb7iHUFH2}4p98LTfEm@ z!g$XXGCS}n3cu^{|NB&je=7dnd%DAa|Gzr?3%=>_U;LjAzw46@{|$fd@K10DeZ5EA zs*^@!M<=g$K47o3M_B&ZpkW5>-~mx_!?U9;mG%$75y=|3!M8qO7d=Dp-~Px`9(U`2 z`BPK zw2q-`2+SU*9v&en(&{Bn=o-YWU)TNv^v1af_%U?1^cJ$ebIFzTsj{3|h-?OOjO`Am z#=4N(q{NmHki<#a>J0HHDP-^Rx`bCYHm84*(Z0%F{-ZXs{KuHoO#BPasMK;NT4@;p zIb374!0S=da-%8}w+@^Zv{M&C{~%)+4a*r2($bvkl$Nd|d-4#p)0@|PA-fkXkl!4k z{K#H&s@1rVS53n30kt@GoKwwK4LdknGO@ERNkbeyxjMhp~k|9`Uf z$q@t8-sNrY=p*D_vNMxqQXacZ&p3aZ3)wD|9nIZO(hVW9FX=zSql)#^h!t}ApH8Sy zJT|hh2K9`WM+odHKVR^EP4aUOgg{l#*ms0LaNAsdzIr^iLfHRlM4@}xGBv& zYV3u~PvJa-5Bip;0(Zb6@~S~}_I+={CemLhLIgnnll`TxnxaB@ACPVdCqCzJWQuvj zX>=;5#`B-m3R~&Spg8XCzCKug)UE)v$-X{?>>DLIp6@q!Hx$DDUI=NrfXxe7?T_}s z|GPJPNgtd1igt4FXF7Mz3XzD8O6tL((-})+#g^v{|1OkD~WySU2 z@Xm7SEIfyIx!$@PBO7s-b&=2t*nxnhzOOxgG>pFo*6TkYK^C$H8@u=K_IImo*Mmn| zoI0%DmayJ-ojZ=A^R*PUJ__1|iW!R$SFjqt40CVt35RzpzYPKw%X-@n^)Vh9eP&`^ z#SE&CT!T`@j5we8bIK?d74yT1iW%>;ERHeOYl93#Bc}%QA=4iYeHdG@ydVL@-cLUwJVsYgDJP?-i1L}~IFkm4lH6f(`gVK@VN z>U0W#Mqaroxaa?G)IjKe|5trNA**aCV7DKNT!Jjm?)ROaIJKVlokHS!joPFwwo!G0 zxnhRPnd?gwY%4YFu+}w3Q?GHxIZZPJb7ty9Nb(gku3UFD>T02txVG-K3#(aXM8ynv z_M?p}*QEJ8^6#p|u5~x{TGt8+l>4i39_!OnafmPo-;dC?C=Q{3{WZj6zk5Ur_tWR` zEJ5G)?GD^O&;ytqw}Yo3|9pp2_0Ff*l7l@WSmHw>SSZ3IRD)Ci1VEgo;4iwzugJdm za{S5#@4z2%FZ76CAy52IdFx^zekHW01@Jx~92JURnZmvA!MVZrzAPkGrGPok7qCSr z3wVr50dvDI+EG@(K0RB&GWqO~Eut@UeHOZ{p7yrh&(^M7PyvewS&N@)0l46O!1tfA z02Hu6=ZO#LZUHD@AD_ed&n51@MtBvlXS>MCK^u3pV&jGlkz1yMHtquUg<^%ik6SyZ zl6|dxaqKGl`|ZE5R5?@&8;us+9^ylyBM4nvNVyu0??>;yE^ArtJI7bR?mtKK)mLAm z0(J*~zBfJ(^N)FsLoq?m@i=6*0_J-w)b1inWu)Z^mC6c`55Vm3fkPp?%SWwCGKk|R zPc~WOK_2!!eMNd|JTU**0d;TDc}RucEK41*3@9;rI|4C!`aq1HsrDLAX3AhLtnB6DZKPDZFo2gX~_wrUYsyg^Wzb=(Wwx@G3ht^ zMhO~gf?Kryyq=F+iFOL!Lvk+(4^Zyqqr8{4Rx@JwH0I$Rszsi~*y*t^@L1Qlw+om?8OnIoz+Jn)_so#HhQ+ zJEDzT8au@e(VJHkk_GU{eV1I|+K=Ex0M0#9aJ5d1XU-m_owG-ebt`Hee0R4lk zouIuDs-3|7kFm`|DM7IZ^brrs_%o&|p1X0mlDknCVIhlP{WUyyW0h?n@;Vl!YU(IY z`b?&Ys6w{2$jVuPZ;-Wy-`DJ{b(JFs#p@>5x zA({}js{vNg8SQr9*T}X|LJ+l7X(}aHt437WfaVGr#T{E&iu~%bt+ds9BP>J$8&DV*tnMCARCA1Vnz1c(fB=TRwATwp93d{%m&3jV^*0-F-{euXM zZSci>tk=xE-_=J9)1*Wk7prGx3G8c^SZ!~elSlZnmw^7#>OIFZjQ*L>NRhAil#;KP zvSwz9pCfA~C=TB00&`T!c{2%RwSaxslmve{-oQvt6lGv=P+Np(v4Wz-2#sZw zhqAsCVvSAuxA$E?&D9*(7rCVyD^*aJsMaMG!aI-i0ru3 z*1x^aP)iD$60IfKDubCKapJ&Y?r;Z@lqhFrckCM>fPG^ES3_DU$fq3p2Kh{Xa4kFR zOK`b-@ip2q8^_^MM`)F(m(&`q+wfcEb&Ip`yr|t*Eh*`AiWECbY}Oc6TYN0H#bb3x zQhqQXK+p=C$<`i&T{5|`fK5V~h%%uuAMwzRw>$jKd-cMmhan%MtXdb4(_P&O zrEjwm+|T0vCxq=_czD((W-RknwoSZ?h{PekcPz3&tDf19Pn z=_8E#Hfs>CUu4zP(XaHIooRI6W*PbSv*hp5t{qnJcxeQv<+=;BQe&&W<5u6QUaZHl z%Gw&SA_5y%6>2@!dDJ;glb#B(yB@^6$a(`rSHY^KS#~Ssaw7df7TLCB%a&SKFbkt7 zlcGU_ClY$N*(c`en%71+vh>X}BX=QlZ8Y$FD-y`^-E^|VZcEtRtP!@^4ztf)dQZ8e z{`HY7cBn9RC{Cy&u86Uw8_dLrU-ZmeAcL$T)?(A^l#Bc>z)y;&oxAwa@|iz z8?vIXe`Z>Zz+4wBBVf_raA^!Q&!&U_MQ6G(Ub+^(8CLja2<#7ZQgHmNB40#qFoPb^ zt(;r1fZfY&mB|J ztMx(#^jX!kXXJcfebA}p1EKG7I<it{KN>};* z30HXkkgIzCqO(VT6F955PO%zTN)efZxsOROyJqm@&Sz~vybn;ng5cC!j$b+x#Ik;% z168Al6JmmbycNX`<+E#HTYahO>ek@(tHSyp8S-{|GptmP(wjYJ<|*&(t3EZK-Fq&r z$Ji;;vzpmDMagVU))XPN$}xwTMfv6;YYHqWA=wUOpR;^;L&x{2AE9fIaqg$#QtP|T zh1!RCXFhfX>0mY8Swof+Cky@+d@6kO;1y@q5C?%(dn~~v?X~G0KXa#6rl;O?{N~i? z6Dh#$Q*q80K({WYzh=`QBS5idacWY%HeGbIc>f8k`u`G@VW=xz-xkz_mA#@m5ax`2Cu-}1j1*^lv=!d z@Q$7Ij-m99h%oP1!0)?!R>R-$1m2*Wu1BAoptU zLy1`ir#iJQZ(kI~@le}s`(`C*9Zvw&Vi>Z=53AQ;*2JB_Nb##PZ>wk7WqcP)`J5et1Jq=is=4YmNkMYWB*P%2g5oX@hG?RO#P>qC0M zgreFaX$*NJw;U5JWFI8yveg^^F40W^P&x;=`KNsOlhj&(PmT4dx6NU?hzH@*F&du? z_@woW!Y4gG(WrsPIZ6)>rmb`Hf!An7hU_j)A!_0LJFUnGc(L|Z{4ev_t~2rQV%-t+ zzO>PL#Ln6P|4K9WuO#nDJ2*On#j@;moC4-D;^#hS)a<1ECoh3x=U$=x=w$c;G17@2 zclgU*>+s+5PKW>V2e0mYy5o$wM=lgPAx(xPCuM_QWj_$$pMZQN(kZ#d5uHTzpw(jByG)EBz`v>_3iRU-~CfZ!|;)X8j84 z4V~7({-~#g9sRNPVNODO^HsAo?3|blF-lGai_>@`JoBdNlPEL1cG)UB`jKW#-q0Wk zDsE%w`7Jbku)D)Q=>99OO=v%!{)zpF?6n{7H12$*!@uFaKtBRl7a}6NlxT*KxUTJv zeCQv@vNDsrHQJXh|ET>=4Qbt^*4yWP)LH?YM>V3s7>H( zo!s70rM=&UL_&3qFS{BmfY19)*gSk!@Ar|9{DU;ktM~iJXA5{u7mv8;nHe&lMPu$G zQH&@CtU=4Ws&3vL2B9pR?mZv)gWd7^+&J03=Gb^RLzLAF?|;)XqAj0k0_(aoMDr}K zgc|#O`E03OGa~xDBf_qPnh~+@*;4b_>yTV!n!EO@b?W)-$v|yw$jDTkdQhW2=n5M3 zd{z-?=^L5$!)VmG{h^N<^?W7;T6~+g=m?`xms{+cMjiZipv5P7i?c7QQICg4eK<7g zlL8ub(v5f3s6!%vOic5CSBP%>^7{0AWFVC56ok|Xr%z81tk9Iphy*?34yf!?aO-7BNuO7~mhRgfv<+DW8AYZ+ppQ3!$=OO++k9~o14CRn& z1%K@SGNL?o2G)4e@XK~Tc|>w<>)tR6>HTunZP_CUZtm$YK)S+bfURFgu$uqr-aae`+BDEoAm9 zQ4mvmYlGtd3B4h*$BviLW%nP-L;Qap;{Wpy{~!HfhyTO}h*@;XNS1m3pS^d1kE*)% z$Im%)W^yt!ganX=B;bSq%>!t779o`|$sC?S5*`Hv9T2@kOKU{*hWeU-+NkIaFaH6R zf{*?vT1fD5wSp4`t&d_S6Jm7++R>|qBqUA(BopA8|99Gg? z^_dYXFFb2;C4K{n0=rSxv}pYX5>pgdf)*~uXCXd$(KiZ0e(a+Aa2-mb`xNeouB9MrgQKO3-b%y)9qLEKjS3b5&kK9FZxCY zol=fvr<6YmoxzXvELueV2hb0sZG!&6I4NKyZ8N`pO~Rksem#Xeiz@nN19UR-xTnX; zRlPqO_11Gy;9FSqCq(s*qHT6`jPJViJ=vmwA9*j-HjCi>uPCqypK^SjXfAr2u(d?< z26)gAb^dwW$|F_nj*FcVg^a3oD5pdrO*r8n_6S!5>w8gPhF10!>^Bw#?r;7szPtx@ z+h0-knu=hJe6rg<+vU#g6~WuzcR#yFI|15GTX>fZXxKCl^+%p5;ahu!?(Z~5oUktn zn8Cwp^zk4_+Hdmb4y5xpw{-UY5qTZeXXF1LDd$Ui^?1G{dSog-N4uX4DGGRTZax` z+gHPP2A!A1ij%Y3@9S}ORAE0`7n7a?Shv!- zB9b2Fk(9m3oGKTsB&|j{-w-ox@8Fo}l6p6$rDMwZqJX^#2!PKL+{b_A$@5)FyUut0 z;%Sn#T4Ove3~PHh-BlC_VuiUII6+dNAOe3yi13kGTKI$wX-RlbgN+~MhOv~N8S)?{60X>X+3zyb_W+8`m?|^ulD)*!TT}uBw*-#W{Y$y!Wz2&@w z{u@5auHG?PYsxUxlsb%SCEVft&|%8N-TBb@ztXju6s3eDjP83VV^s5*rFpQT`bp>D z0DYZySyf`fvP!imvU;gnUQ=sXk6LIiLOJOZej~DH34fa9x(zQ=W+G3v zgU`-ZUjcvA;grWtUz;BRre7=T%`#mp&?g=b;8=bkUKEDJ+@=-qC6= zEYZm`lW*X5+>?J_K8-kTWTI;zUep#0l8Ya9XX1tTrHTTXD5C`YS5C}9>%|@cy>`!8 z%HXR}<4_^i|Akop7h?Ub#1sbdTYg!Ad!zVh`au+5ao37ZHAL}sD){=xmw#9;6v7{X z#qNxfAoP&hZ=5B2jdt^^ko;ZXcOg8U7f&q=EDoKnf2?wy3{SwVW)r=Lw@vORFO+-9 zxp)VUJ|DvC^N|MbO`$y9@eX=rI^=<0+bhFb1BofvX+7S+FMHi3!kZ4IOs(N6evdOO z^p4pyysTXqDEWpfFL~orc8-I7c>)9>1 z_sjeb@aYxskzoOC{l2lhQHc8w@m0>L?e*@1qNNZwa0_w%Tt8huV=c7)Slp8-3~dz&eCB4X3k*mT4` z`etF^34Au-L*IAevm>;hu&$Edi+7MS^z4=R3YR#9(K_@7;Y`%}XbWFKRNvj4 z4ys%0H3=r#p9bywo1(W}V$`(|brp6} zKRPEgcWmgQzMZc8wlsHq`E5lNjU!&3(%B1dZC>ot+ekbfjk12J-dUyla^-TIO!QxW zQjh=Foy-pwn+pREpR~4fqvNI@Zp#{-A6z&hzkMoNGi&tP{N;9jaDK3#+2P1j}=rjR@B8SrlfdDGa8h@Kt3~v%&YoE@i$cL~YF-bI&$+{59CzaU`gWn)GboW0QSl zbBBC3_ZR40HkKeiO<4K#L0{ydCv@u@`=rGhr!)%7&?lqOAFB&<2e7^{qc6na#OL)6 z*q?Js?FA|MLD9@x+y~b&{+HV6dtsoWskvhltF;jO1@55ae+wtI(%pB+Bu$0E^uLls z&2+45>^o#mW6EG_qi#7#0QLUj+`)M|8`?V4;l&R^HCEY4kd zkY2)@6L_VCd@}KP&4C})uHRN5tCWK%B` zp5T5mchHm*+*ocndM1;?=+&nN2lY%kdS>Rgf2nWokkA{3AkkZ0wX^kJekV$~RQ`hC z8rHW|Lgu%X2Tyj?cb&xT9|fPto|xj|99()|H*UOMrUylr)8RZwNI^1&wR=oq;8>&H z(F;ga-8fu^^jma)mmpf7eU3@A02(4>03Wbe=WTcvI+FepK!Wt`CB{%Gz*P2AMEFG?mXAwoWKusW^28`k47)1aal?Y zPH=oA(;aB9gG>Jf_7$AKkHa{*^Dk~f5D{~5FXOFt`oHH-Z{rKC_cAHDum$sjCFY&> z!hpRI+@D}s2EI>#2Sfvf422|5U1o zKK$$8T?6xH!%)V1>MaSpkFWV6g7;r6+W_8+_FXFPm6ba081RNjKHYE@sxWY%;bg~a z-!6^7A=n1e2V>k1F~6=!tU==yllXBAiewiUZ1tfSu(c;tGu98A*J8qHl!b|G41BcshnOYXEr<{nJP#^)0cCB?M`v8 zP~o`6V43~#yA7tacN=1tX*6g#@UqoTrQWh;p<lqu9u%oEKqq1p_gZ`86UP80?nJfW=JF}`~LTP2MsI+?*) zbg6g^>7Mr+^!yae(MODuy;sf6jgJ-^>Wl$1XHJi;5iIZH?WEqSKA9AV>m96l%dt(4 z*_4g;KHuc7(&N2nGZ%+G#9EATXLjK5$!t09={cB{t_kwV2D#VPt_-ug*KRH#p6m6D zzC6Y+MU|_666q!l0WW9Bt$AHpy|%_~7HYUO&!;vJ2g`26F+l=A#R5;PH0Ii%4tOzz*wX9*;U9v#+J6?l2E$nE$4>FlF{KcTcajRoZs)Gw0apuaxR{fT)j)z!Hrl(13i>`~+Gz*juPeGlQCESQ5ZsRtpuMY2kQ9Gv8 z7`NTtXyo`NXYBj*nkh#wXfMLwxIMfhZi{JU1}KVc6=S7VQR32@-MH6LN&F?w5|1HG zsbl26o&1e@lBW?QPg5F2UXiD!{pPd68B3;7p5V&No19hQG6MH*a=((eR32Yno<8~X zl6?>Q%hTU!wEqtKjAd9|kzXFHU>c-tlBH~!Hdb=w0(eMY$ohWDf9eoNm|(C} zgi`3xPpjP0HUrLj>T~BbHWt6#!0psml-ad13>EQ#UcFb~B(3z!yNJt`U$S>~eA(G^ zUx}=zOyvfPY1_LE`gpAr38Va@;zXAr)v#T%Y=YgFm!*o*5FJ$W$MsZKZ0`wfX*-u1 zSMg2*x66>a#r_VkK`Vz^bXyDc=L4s=>@9#bv_H6T;Ew(?`iHpi+6hWEucaU`qa_*s zrhYssX-0A=cK3;1$T8^-^Ne1hupK8%NM{&joIxv9g_m2fk8|g?^IgAv82+cQE}eq! zUp{iaYXtm zM`+Q5GDAx`q+RYb$kVV7JGSzL)^y|i21D%0U(9K2DlzyA0t;G7foz5RXsi%Rx`qoi)8vyKbI;2ugf*OnZiisJCi8&@1TI53%e75| zE~g-l@yP;s6N}j*I=JEg;nw3;S2|}X@9N+?pKmhq2HcXUI$PR04EK;MJDtG6n5U=5 zN_p4Te1g4Vag(85 z>D58bxi;VE7zO^tHN#8kw!q36j$CVCSwYG)dqH5{uczM-<(n(?BK zpYwOs7X)$;Kf3v3N6y)iID46m&nFRQAG@Z#Xv(I)L7{25pRoEi!p)gt0LPAp z>(A=WV9l$dH85b@lkzjUmaGY`*^TnfMO%w+-jvQlcQ^YEH^h0x>_abw9i zOdjW0T4i5UgxODY@($C==|DbltT>)aZ*{+V_95&Su#?!(*2=T|?ihwwk#&F3GGS#w z;Qo^Zfi)*T*m}Ne_M(xPwejP6Icu6(E`j7IdklnT&@*u!V%Y5a^Rw5Iep($f z!aa0a30kuHBwwU8)gnNF6 zT<2}S(Q_&PkDi;4N#TpJdM;@T&Yj~!`mbSH3>yVfHd>6c4U)@wPzSnCcFg|P@uZ%+ z9eHj8|FwMqQSQxJC7m=lZi0qW=}5QZ?f7_F{{s)2Mmo5Wr_rC(^7baI&WbInRG#ek z0DBDc;M3EB53NDXEY%lSH!rOc<=qa89qR~`l#Y_#ZyM_0Mx3q@SsJ`&hLS1|axNqC zegfY)#-!`h;6UskMr{-6#AGo!L!{u$0HOk@b9+{ z$6sTRUxgTpu4J<{$Az@nLa_yJNljz<5SzntS{_BLP>lF^x`+6ORzCLT#`o_a{a~{n zp>|y{QLx=AC}rkMm-r@=kQ5YFCCE<&`Rs%szw{aSpWJIrL&>~7-M`nG?ukSF!V-#) z1HDu~Z#NaE_;su%lxQxq>WC5!l%zz~JkR}e)XNu`P_M9R2kK>I=!=qctR$8yr+-PW5?#rQ)>zLDYwuc9 z@m?!0kCFAov9(!ptbd0!#?u#J0#-SO;+s6z6vq{VzIfswPv1g3($yq`_EPIS+=4JQ z@d7_;ZpnIUXDz-P_>B3o=!Qm&>)Yo%2LF8AozZ!e-<{x9yk~gHDC}{Xi~AOXgOk@= z&()%3H#~^c8?C2mXAQ!=zClZDDX!EK>YKe*OL4DS+!B`cfhU8vrWi0sq~m*eu;dMH zx-kL%)S?$+j>(~D{!Q++oq?ifmI(6+q+=EQSlSGwT@Ats>Y2dF;N)IV8 zN2Ve=OBK0|kBr-cTeL*4sZ|h6tvVf7z7Sk!32J#4%8TUqpl~y4BFX&8cI(eQTdl{i z3pq%>vGy732KEi|l})u4)!xBc|6-F-*o8ZpG)`%swkS3?Ha-vIVD$_)m;SpNe%M0U z;D<-l;=&Yue4#B~-s(2Wx{@g++pK3i*;x6TP+yB1_g!`TguX!`XPfnO?ZW)8>uYV3 zPdoShANaMTS-l9f>N_=BAGNwpuigh*sP!}kFamil$G_D&%<~LrHp~5Gp}1GE;7Kdq zfcGSbYx|LB;l31qdeyx8DJifyp!|Y;5=J6tATY#ri@gQbxxy_!ttB>Ozjaqsz(UlHpNFG9H*VD0KO^c z#%~6`al7U9@%pUXw#B7C%E~?UdllhoN*79tv0ExNIr-8oNsg^0|6~TdXF({J;dvh| z8;N}{3RO_f<`L|(fO13ecScZLg&2zt-d}TENSiI#2LR=qfelW|iTE6rSHU?u!s74u z5o*>5{mB++Ndtk-WTYjV`ZW& zAX*_&%b~QCS*SxS=!-fe1$iiU&f=gMHAvZoK{143xM{9pSRB%rQG=8nr`90ZP4-xn zBo&xYl377RN|n>g(GR|&p96-$E?wK#{sO}*(H>iy1`K-!7-m8k4?R+Ezr|y=UtBVcIu2ST&q51c-+m#0+- z5IW?_Q*bL+x*cVZya34-d!Do&27V2cZ>rtFkZhp*KJG;RympPBO4{8cit*b$F>`=o z&((;QJfK*fJiwkXP|Pm0^_8~)#cCV4WmP~ioh)We3+n7GxaFubh?Ah-t*Qcwz;gVJzu62mh4$@*~^r%Jv_``Gwj66@d` zgk@v)fmfFI8+g84p+L|m05$R9e!#m<5qn4ShofM-g%nx59l^t4XsX`M_@^X|0{LD{@L1E`ka zRrNH)Z)9{64N;m}C)3o38bwo!sC%LNM%2tSHPix4O(`uWsS}!7Cp5KArm3OE1mqX& z{ZV6oud1mbep9H%C|wP?sVqfTqcotbfH(w=%?pjq7ooBFRE^CW*4S?LcGK7*D2B$? zNwe5|uconWLd(}%gT4rzt&{0&-jL45es`i3Q94^E)7gAzBk643%js+%N9b(tt2$d< zl+O09sK===7#Z4yoCgLRm}~lfp$Jsb5ryFRMp%t8sgCg=xVO^5sLPP5Yp1h80Yz(wYN~u zT&TTWOn1AwHdXcV(2DQs+VpZb*AjtqC$6qdq0z}9)cBvjHeDK`^?%RWwCJL1(+GUy zUX-WA)9%~tOuMUAwY%ohRP5tV>=cGC%rDI_*1n0kqcTFjdy(mP2#KedkbdV>^*d)K zcCZj*K?>32vgE};}vsTcSvJEjbirxP>onAJ7ZB6R>UaFpy+p$E{D>9 zvI62zNWXKcJ95t0uzrUywj<|+e&>vHz6m~o=4{>>NwKbGQl}81-wC7kqve`@C$K%a zah(FKXG8j(@>|vK%GjQqv#%4}r1h*1Z4Bvm8?Yz$in1qHM*W06Ij6QK*A{#sv?q5` z#l6}n{qE4WFR(qiKS$|zZ$rOBAE^2rXrWas)9-}PDi*Xv>38@|t5`+9E6Xg)avGh; zNvl{d;zIh}AHsWbM6X41KGK7JNBo0)#FKPI>UWd_5)oR_;M6mLcu*`V+u`W<8~n`%|`JAuFWuAHLZ3EHllb7P9YcI8OF zBT1@6dldanNY8?lDEgf+VN9n;J98J&?^cEARrEX1LmZ$nfiWp`*YBLYoPsya`4V>K zh8o z20>-zObi0~umd<6JItC5f{;(OK_Cr~k9G*v`l4_Td8wrSlq#oxS+6o(S;z(vM!c{M zB7}IbK|~{71f@VcNNCswA&i<^rr97=ybChC3)vvXvEQl5k9Xh=sk2pZ|cRUjR96B*JWHQTpSkWS4D8wAFHuqw8UD^qL`4CTOO&;gWV zBeiFg3-!o_DECjYL0}&*!%O?R5jF_y;@P~a4FZ2>MA#q>MA{(QF0?^l50BXky4fI< zQZBSXK$}ZJ?WzsJ8*PK2x_Yod5Vag=>TZKja(A~u(7qOOs5S_1v<-r4=)ne|qzc<0 zu;7atptD8UAiO==AbhF~g6+v&i49^_XQU0n zMriikZ4lm&4FcL*4>pLNE+;f=CEv|qvo z0jeTw5WWGCHi-6aHi-5}8w8`E2O9(%w^99Y)rLyeF<5A>+E8(x;=9^V?~lT-fBk;= zzPK5M;UmyBUl zx7kpy>R&2;UDdyoGay&2e^o}|*B`zge*G`fzhcj7w$~o;>wl2`H8@1)RsHMg88&4P zEPDNz)ARb#!%~IUkN=mSVf!KqzkJ^hzy25LUz0+(&;x$`57NKph3Nd>pnrKTV&{Aa zXK>fc{AS(8<3aPzJxwO=5IcoCb{(Cu8uq4^_^?Z!kaP_DSIEyFaG}&;$f+CUpF$<^&NiX+BPH(= zpl2LfDXhr%7t=4!>irlth#A3nP%Uw| zAq1ZaVlJJ+O#l_x z-^W3AWa$?2HCcSQwOU_Tlg12Ez(Eha64wwV+vC zF;b;@IBB7vIT19+I{6M*a}Z;t-sV)b#}&@ddPZ_))MQ=t#_=Go6cr z{X%pg73eSse}`0{|HtEure#3#-H?g|Z%tA$I6TmokPK?a7bEOzxi7q&g5$P6*bf{j z_w_4jdV3R+Q4&kz$NA)ul*Zz0d(4SY8**D9S3I~g9^pJ+L1&fe4K;*5QXONcxe+~A z*(7nRn_{^;y_^MS?gc5^(;(dX8gAg-g?By9;4~j+meN0wW8LWEUg#f-mZRNk@_!)*_t1o$o-&97^Uod^n4G!$QX^O%h++6w7yD zC%B>Z*;dKO`(MKUUYr_+pL?R7hyS2QmasR;PTP9dT5xVwAGo>G*eaQH+YGputPd>2 z+jYOFq1zjyao)L5J@0J6dFRw`akdUA`SKxO6BqBQr?I(6e!Yp~*5Z|{SnrLveT5NV z(L&n2y>KQ@;?~OrXd8HyM!#Nf5`?u)I^mSJ)>b4-o+26T={47(N2 z1z4u}XK`PI?t9XGk?FWEBIWVhK8X1hP98p1BMn)IQ}_#I@FdMl=ex%i+3euP1N*kf z;MW59no283z7r*XGJX)@lm&cNcsCk272@r1v``Rb?@7i319)&q zei&Y}(5C`M57{~ovZyHdyRHED4m=}w;3#wLk^0wfMf;hlcqcFXwoCa$9q3(;BJY4}h;4-)P4*dd7^ji~m4#rbnGKJ>cMlbEZd~Gx4e-kS;uDdai8F z%(-yR3|#4)nRDfHriW-l&s==Y^r&+tS{X5Cdai8Fq*h$voEi8IbEfAqbEZo3wV*j- z&ZOHrS1@N1%~v>QdM+_%dek|yw#PXW_jn@aOizzA7Ie^jvbz^ju`lti7T+)6;FvM6Mrv&V+9rbZk8@`2<>pL=oR^<7aWnWbbLQzD=giYR&zaG?{E>5J)LnL*B`am; zX=B#WZT8#MRp#^Srb$W7ywTL;#C`Vo+NYYiB)rI%`AW-_%+{9pvx#-Dv{;SwZF=2f z&75(rAF)YD6-qHElwx(A6DjWXYdI#f-^OM>6X}hV@0FI^Bq}T4g|d<;^@vdF<*a;4 zjg&^BBb*v3lc;uDc~Dun2VBerjyXT~BQ%p@sSTi+QL5AG1)aQ+zcwCaCN&FG9&1w! zQOxKVg*y49NkjwtJ)y1?Wf_|VP|O=QM$tei5o;XgM}3(@e{`KhAE-}?rtwkdzkxh&9HcP9c-N zsb#8lsySK9sF#tOxW>5BH`I^U9tE|TmEaa}l$WW;h{t`8Rw8Y`P>=N{N|0^}ODAaQ zjQ21Ksl~KEKt06UBe`OzNd}*^-u+b_yZOb5qrihu=$WIq|HX+Jg|g&MXy!A;>$KkM zs5ANtp}A-lqrtZ>gqV!m&%$HE{kTqe%Eq-@mjjs zKiC0{*ivSF5VULOh&P=bI#9dYzu~Nt-R=K*)VaE;-wqu}ckO3>O+0%rbW<#U?|eUG z1Z`5}GPZ81yp`w~r-gLXnX!5iIrz}A#dx-Y-t>W5-08acwgRjW3uMS|k~l#N?>PF9 zb%2L@kJ3McztlI~%O#noJj&RmJPoz!*AkTr(N3P)8IOF%)~^(w0I4z7(VC5eMi}Iu zOaw+vHq}>>qM`>&12#-ubCtJ`~tOzBn2$r>3jEW20xARX0%S@`8RdE40+Uv86;C*x%*;7l0+)~+In=6I=|f% zwI;kf)Hbah51hGSAE5!^gvMo!!wM!MHpEk{_a>nAR@V9{Mw2$m7^3Lvh#qB}6Sa8^ z{~kD#v@hMCUezD>cNKpGefANa;$~Y!n*wMPTAq{;)s{0f_KjcELy{*d_@~|9${7^;Z+Fb@r%#Y`WQU~9Or>b;gL@5=7G84c3-#>jPzd+ zeMjVNHm4=BIqhC`PTP+;ZE>?;GBs7RInCG1CA*ustkW&avWTw4y3;MoP4sPg-A8y; zWv(Bw$w(DSF({Pc&bn%(xX-WUn9P39Xcn@N-bDFMx7d@F)}pLrN(AtRNg%xQk-SAK+MQ7p9qG&4$dTD_oCFzv+7N&!k;+$>UwtW_~YGoxe_ zY88?v5f$wBgu1s;+KgrqGz+GhC@Lr=Vok&Rs4O$wseIhI2~-MMlvAaF z)uhvELR&=>JYxxNMx~(#DhGf{F*z+nrKRp2Mx_B%iY8AtD#c{Pn&MEam_^?fH?uO; zTGgDaZPe4qO`KzV=^N@x%TeMcXwKs0K#RgP;&Z>F0i?Yq)NAp`vCM=rvjn75NwDdQ9!7s2;>_D7dBd^1rHcn=}f12!$$ho5bd}LhwhrPU}OO4~pb+cH}P9aLo>?52Y1R?%vyv=u!>>(z^O|9RqV`FbI zBs|cvoV6YO#c)PfN3=lhiR&oo7KV!toVj*i26jP{>wz}BGTZgvM@TElgmxOuG=rn% z$%RoZIdhb_@p(Pucv5t!r}vVafbL0zmyn%MNe`U)dN0Z+-Xm-|P(WlT#M*>kLY5{W zS{u7di2y7PxBSA{?ow;GtMi?PZCB?z!`1ojzc}AzN6mK`SLeHyAAY_&9y-(Uziqzj zb#=b`9`jxJy|Z>rxJ-aDl4eAN&uKPeI)C)0M!#@a;R`eRIF{LHRCu zRPA=_^Z1)rY$(pE9pM+`2jxCN;Tv5^3iDyP#Ix7tgpa=zd0Fiao1cBlE7lh;u3ZK% zl=pdLst;Z|ttI56b4syLd?)-y#ln8_pgdH50=BBb@C}$nz5y*_T~!Y*<)?WMkVo{d zA@7m+o(O-MXvwUnVgF5l$HaJ#P_n*wO7TXt%3919OMYvyj=W$pF6S{W^Mk{6(d#Sy zO3G38#voUH+NSfYu=V$d#e@7SY!f`@;&lk6SaZo5+x0H7xD?+vAuOfjZ+K5-g{@C* zmfwlrTKH*ry2SVD(=u}UwNwK<{fgHklRS!H zAFABd#F^mvKK0F3q4$fpPtR?f>*Kb~X)Kfkyt-iUKa95-;7ds$FYWU2O>()d!#AgK zhHhyJ-!wzun)GptZ3*5xWl&^?|HnDM2Zyi0iH0)QSeb)&IM7x;3zQzKCz`_{ah}?G zmaCd_J&(33xmL)tY@_8vwRg+AZT*T}KEBB&{EFkpEw)izU-_sMO3~t}sz2VK%X?aW z&f3dO)c?wBC`l^WZ@u0%2y)wB=Epo|ZLfJ=rnsN`@QRsaAg^V9tn^K9AnbOlIkdwhk13vSyGf2awq}3?YF2V0O1L3qhV6v!Dae-+ z8#pd*=O>DrHrxKg^dRLgrzgFcE3}^QHWyYitKSTvL%@j0|dWe^#|} z&{Oga64z8{ptw`DkO==v^~+`D+yHxJR4$%cnj&oEw&6`vGg=Zii2OHK6U~xe_cVNV zS7RI$@Z*1PoqYP?eL~5&lC9Pb&*)-myR}4LEY|R8pUZo!&9%M!!c(8i12DcPxVFJ# zIj@`G64J{++`xHf~K zAZ(-G=p0L!7tBQ=6ogkp6$O!Y?$2v)0t)`dBU7C@pf2^c2=t@V1%u&9FpE410{zTD zKls=m8ijs#Lcc*kKT#0JDd<<^{yTEg>5=_Fzbv5N*Y>`xlHn`&Z4PnLerr4M&#d4d z%k5|QCte!=hz7zxy4mX|UTOHJd$?p95ai{WZXs5dPU!{IkD

MA>82;Jc#&-|GQXFCYga7wxEu8QV-+_O~>DN*L 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

7Aiw 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%0DA%nh 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

9hr%yFKM{F;9CGtv4};9bNTUh<*C5WB$j>mi zCsW!;HyQ53kg-Gl1K4fwe#9!oXF}SWP_EY@KNLIxd3z4!S@lpTd>`UXLV2D+K7K%b z^g{gaAa3TvI&+7YYcr}|4)piEERXwbZ9E65PmI`AGKV|3A?FTc`rMFpqg^QPUEA8Y zRe8;>l-Y4?bbrj$EKOOi>mA4PhDY4}Ik$6M#D9N&#NEj09_0Ml%!rJk*?r@&s+nJ% z2+vf~>d)yGG|MZ27DPMDAB+z`& zyTk0Kh1F5@&s6U}{&9f+Em3l_zaZ?3`PDm)Z<50_t`vB^z~urj6WAkgiNHky=L_r- zc(lMd0{0i#E^sG-lLWR1%mhCE&zAL5EAU={s|4OA@CJd`2<#PjvB0GQ&lI>o;9P;n z2s~V1hrk&Erwg1SuvK7#z>UXR*5^TieFExKQ9cfyW8# z6gW%ZOo6)#Y!f(9V6(tYXIj>0P~iOn?-6*1z?A~87r0#DWdeHyE)lp$;Cz8y0*@9r zN8tVf+Xe0(OuJYQh9z=Z=Zal;7ozL z3v3fOQDC#cO^q$9c%{H)0?!xNEpVa0c><3U*eP(9z?lMf7uY6n zqQGW>n|^LtpFx553%p0*9RgPhyk6jPftLyF5x7L)B7yS-b_qOM;2eSb3v3s-lfX#= zTLfkTALrHsX}(%3@Lqwd1l}g_27%WI>=k&iz@-Au6u3a(T!F_3JX~Ohz!?Ik3!Eab zRbYd_jof;mJpUKiC-828w+p;U;0l3P3S1`ee1Y8p7Ydvw@Hl~;0%r-FDR6gzZ2~6> zY!^Z31r)c#Xhbffoy0D)3B!3k1#;c#Ocq1$GFWA#l3DDFRys zHVE7(tOp(x*eCFAfwv31N#F{BR|;Gv@O**Y0v8ILC-69dodRbGoGEa3fo%dO3T)=s zi0i$HTMr}-3cO$7Jp%6#xKiNt0+$QCOkj_|B?1=-oG-9T;L!r-2;5&_yTF|UP7>H6 zFcbJVw;o9KTPyHhfvW`GCh!J<*Qo5nZY;m&z-wCPJovD4xzDM59s$24PF}XPsQ;7U z|H-&o%j^00X?f6W()n+=wY*Gw-^3n(c?jlV82+HJN4cKu$X-j<>k5-oFyZ zN1WUM$o+Ghi5=K#VuLocjPGxP+~trvQfXpyA*Z!1Eq$^n4?hSx3qLWj@gL(iOn*hE zfzzqm*fI~NxUi8QwhU{7ylegI$jwSvRaz|Ti)(W|%GH{yK{N6*lGn zrxJr~e*k+s^yn~mJX?RKpuhH{q8~RaqUUHuZ^|hp-H%{Xx}U+Obl<`UAX<7wt>}HO z>S_6%(xmA9ozts;-ovqo6DB?`iro$~3uY~hruQw}l%8p>lHT|mb!oQA1~z__F74X8 zVUO3P`0j2;T(JozZktVdxZyh|bM8M?ToC{I4*u0Z&dA-c2}H|*iMvW$FX-KRy^@}JUgWw9wxV}C|xmwZd2RUBv=^GTiMVww)D|!nd$LmcSq3CVq^r~9XdjN90 zUaC{k3vznq^s~#?8FIYdl#z;Fr>7(J>1ai78svDr1ve>rPEN0=6}`H#E%mmJQ}mwX z^eS4>`wVh?dR^~O^xo(6YFp9k0Xbf8?wyLBpVPB-J-c2OK#td25;%-H6B&X+TMelXU@p@NIQ1s?vnee+TGVu@9+7F z-VshOvlYF4kn1reav!=4Zn_?NE{N1iK`VN9K<<4`&#&s`aeC#g=mj7*B7M=kwMgMek=$&))s) zdbu5PyxvETD0-JJjMPhBD|%BNZK<~qAHY%hMsa%HR`i~O9G_ktHaa4`XE?n*t>_(s z9IrR>2}N%+r)TYPcKL3G9IyAhThTkp>E*Pd_Y&lIy}uSKdTE|Wy|`P^+X*>dZ_!hV zUM{D%p%uL)kmL3Gl_+{;oL;aMy=x%H>-kl^9h_cz&$H_#An1kWDCy}IMat)DMej7^ z`1B6VRrD_B^vYV%I|?~oFECHho5<-^wW3!CIbLtk(~915PS4!y?D8#v9It1bujqZn z={Z`_yLq9aR|A{I|3_g{`)uO$idxb8?%9^W$^} zYFp7;A?T&z!&S=X5>C%%Kf7K!Lypp$3!BRKysGy(rGgX~ zDIcXR!951LbdW91>83%4(yl90;)s3$AI;*}-imB2!btWT*pyE{Y)a!{H9c9e_t|L# zR6VVqzxX9Zubk7%Y(;M!frDoL*ildY=n=(XT7%9pv=9t?0!< zj!*AVRqv9ek$Tw!y(i#L>mg6UruC3HuoK>hoQLJBl=N=n^sE_Ymv05+`1Gc&R`j0X z^m1C!+xlTkz2`ns^giPB+^y(64>>-)KW$d)h11&ry^G;bTS-t*un_ zIzJz&mtZUDt%Dq&-V<9Dy<0fF^uA};%Tti!^+tT6=#_GMF6fPd|5TW{FqF^NVK4bK zlF#LE)AjH%r&rcWdMhBur#EApqF2x9Rkfn`5af8h1FBy8vPiv{uQgPj8~C_c*6l)QaBtzqZti-L9nfXHKu86}<$=@#*bT^%^+6TIh}c9PI<< z8k_?<50l`Y2BWo?hrdwLOMW3zFSaXVS@hqOcBbid26x^O(OUsGoxkfjy)n=e?_IA$ zj?d?aor>NQoSp}Iqu|f4V@?C#@l_eg84>`T<(7Ocwyk0->qFoWa!RQMqpY^I< z=ppQGjddt8d$6vy3~N!IB4zyuV)Ail5otu$&Sl{Ko&Fc$oM;QD5^D=D8P4T@`fanE z_p>!3KIhWaBz|u=#ly#;Jzvq{*X%3zn%UJb!(eWQ;g5U4_rc77d4LP6``*lAe~8HT z<=p)cHW!ADeX#!lqe*HupGIr$*5n2tjfY`2!i3cHc)4@A&o_Qvj*pA{E3x4y9mb+) z_P{jkV$L1KD(_Hb+Ce6IdNjKkMmySZZq1KuJ{@u=KdL+*Aa@4b>k%ip$Et2Pn~&v> zD)IAiP@wB-C9fOjN3-{zjO2mBwhBysbck_~-(cuJ2BRIk47tDK^0Zw|^R^YytoI8M z9n!r?;r;ot^E!jO#IO}GypD8f44Vj}mD7fZ$nbhV`QY_5KRzw|zGL&T6LEG;k74+I ztuPr1SO7i>Bc{dcX%X;xnjfE5uI35*wyrU30n9R_LxzGr1D}Qw)8h5CD0n^1k59{` zdBVP?TMU~9<3&1TC}{fdWn*?*NV=cnogW1T* zP+V8KBhTYUt8p#q6T@DI;g4?x*1`r{9>W&GP+T{0ae39a#%G{DV9s^CkFbwmwsJBQ z*Zo{v2i3S1U4ixq!ymf@*21p2GKM`3LvhXJ;@UAZmJRT>VF8#wj{o~=fX?@S^3dYb zY>K=2-lQg^@o!02i%+xv)A9ZhU*tUfJLl!M=xDP1xzzm5*Zyzl7GFnqoL@iqbhUQO z+k7}5)1u!PH?RBp@6g@&J9Iz)9lGEB4&6h)LsxSAwsXkWbGzT6yYYAEe*Qaj_x(m) zYM(RbM%D$i^7HNXeB6ASr#OhuNAG-Ov^@PM?4##VKVmvs9yOc7wK)>Gd4I7UD4ai} z0sp!^^77>7t=W`6-hEa*aZUdR=pTilqs>4rK=z6JOF&pVn2TUKz;uSW45l}X zmd7jMz8dB_n87f^U`E2+3d84zcmG=67D4Y0812yXG@Ja-(&qxVLieFo^#7F}rTgYN z^t8NC+<*TUG9-JHlhJg~Woud2Y?2epr?D1?G$>L(n%}wX-x6=ae<|M7|3bXI5$CLb zGhVH(_CddQ*1uPmS{!qszwdX((RZ+g&4oGNgFmOdj$epFlhbUH)!LF~^ZMjI`X7ix z%5GT}Eq%?VbhPv}oBa4A;Xe>Zst^aoujN6r$xq9JXj2#+y?-Sh3K#V>rZ74N{0n_W zO8I~DZ;<8n&gJIIc`liA`TxJJyX+QaeR7(!Wqba$`a1PoWKHs*s=x6(^~HFp{x4n} ziBAk)m~UVM;5qL>0~-i?5T2tCg1vl(fn~v7Twq{>Vc!q`Y}l{B|9aS0;9HFx*pK5` z`w-ZLc;~BX#Pj$YVb`nAQ4jdAfn!0((C4dn@crW9wY2{3+- zoDD@e$nK1MUj=*aJqFetb_4Vru!~R*T0lpq%Nj=T9-P+hJdebm+Om zBPh>Zu+vfgDX_1{H$3;lz6bHsN_02)_k(>uxFhVZr{Y^8*b7lFye+m8Avgk6C6=*jdXq>JBj zXK$h%Jq~*o^4ACUHstRC*m*dwR3Bqee-FYQk9Iy2_FTx(iu%t8$8W>4TT#9u*fYQn z!|n(DM_|8%^J9noJo4j$-3RI0V0+FhvZo?n)Q%}XBycs-rvUQPj=E{M_7Hz>#JvS_mm|)15zi)^gPYt2 z_C+4*5cPW_>cRs~K;0+f{OeJN^WgU##rZpr^L>s+*8~}xYUsJ5ca+BYST=2j zg%!grhoR#u*p&bE+`Xv+awng%u;>!Z6Jh9>2%F?CT@ty6?Sb4R_&*G@M3rk$<%&5u z(qFvC!pdNl!Bmj@I}3AvZ()mJmi=I1YxY`L|9$u+beR1x2VpEfA`E6FOvW1~W`h}- z86#g;*;SHkk5lbYu<;vpEEjfr*p$~(;qX+t2J!pWtT0Z`E+Bt&3T?@T`32!aP@F%( zJ$j2?zK*ve5m5CpCWZl6juqoXj(sjMe*csTh>lnkOGL`y}KaM|Y;Q!ScDEiXEc2rr| z9vJ?xAF{AN%pY~|M;rK~4gApt{%8Y#w1NM88`y_&^}aVv>?*7w(A}4xP15+8jCN3% z7M}5sZ;OGpEzUc1Jfr=>^WiTlwO5Xr{+({8$ap(UitYCPU%rFed^?i6AEp)nRff- z<1_kRk=r|C{N=e5@6NRM&6tooeth3P{qDKv?tAQga{Jxg=ZZd9Xo=*zkG;>8eKIot zcjSBcr2FriIQ=Ty@Zni%ZLtBgJT!jd_`4@DsW+U1`t-E-W2Ts>0cI&$7o)dGaV%c4 zN(s6P42e=Z_9uOkbdi*-OOv|r4HBAk@LmRXG#n2&|f( z1lT#IH8GlVQd=i|S}PpKg%1Q5BGEF~G!vyY(bDEjNb=g0n`2r7v@}ohBzaA3J{L}F zTst@}oGmfhKa$dybXN8PI1}m9^{Lavv3J2)V4KPdVQUAK|204^m)~-53CC-}^Et-! zm963U&*1eOZvyY;cq>>tD826i)Q_Ml=WDDd3!Nc~<0UI3;l zqWT^I_B^bXA2amZ!0BJo%$yDjyAMo#7M)j;UkKjI#lILFU+aC4bN5eVb4P5vQ;3=z3@|q~s=LM*0$EryE{0W@T z)qhv;7%sdgcss|JgO_pggTb|2_)ze0q^BG>-=xpUj|b;-;rD~nA_$8EKn780cLcLFct;_C`t!*Ne=1;>|zYdOvYTfRaf@?l{^!3VkU5#T0{ zM}yg0k@DUKPUQGba1zH@250FUAwlSs6y38d#M3`w$>y+yQ22f4vSV&qMmk5yz&1_j2J+fwyttrQqXS z_={lE+Y$X&z=>6n^Sch5%Y}ac?#_j82Ya~io!~4k{2yS;JCXSJgU4~c$Jc?igW?+vc5&gif$!${ zPH+*&6Tohc^S~t>PXU*4JRR)i_#yC0j`4XRtKhg8yq@FP;O!jG2Ul_YEO)^;~MZL zj%&eH93KMj=J*)6mg5k(iR05?>$~`;mPe0=vz<7O24`{{4<62OJFs?8`MZK$TzF6L z-5g&IF5);7T*C1+;8KnUg6DIL?ev(Jpz_WF`?zpy2gJs_7pc#7xWD@mUJ51ZPqAH3^FjKrf%7=|a_|yxBJS(d zf8z6ewwMdYXZFm!J`(@m!5-Y-AdLHe5<3De-xcYvBut3PIe8QKb8tE32l00UZ{xyy zfwyy<0nU9tl3qXXelGrDU=QYMbeo{`CxaJr{KgWAO+x;=Q+g=>3Ggb!Z&P_Ttd@FN_r2hZbpBlty*KL)Sn_*3wQ9B&7I!SPP;_Z)u% zuIKnW@Gl(y102)5r*0ezfRj0H0Hgn_+s#0j#I(4&HLrXu}i@@&3oj=u^wP2$Cra`neSCt) ze!{-QT71`lpTT~@8V>^Z!Jfn#4*?(J_|m14yeBcGNA39rFzv}s!)oFgVA?-eji^&Kxt zY!KR4w#u)7X|LzeDoZa(@;=TM>hF+VE|~Uf&QrsG0Mj1L$JOvlmq~0e+E0ZVUIhLb zJWk~a%OQ{UV^!rhf@!blXK(^2{JmXpibj zHT+R9?QOkM!vZI*Y8n5v0_O_+w7~BQyjNh; z>Xz~M7I>V%PYJwQ;BN$O61dk}Ez=u;>rFf8e&7O^(V$8`;@Cv+if>FT0}DHJ|M~~` z1q`xm=og9a#KZY^2%ismVgn}D-+dn82f-V_T6~X!_hUb+?(mRs6|4b!zmD8LKL+pN zzVt8iT+J%nK-dJ9ynO^e<}sLvSGv{y8Fl1pM6z#HWVO!ix+$ z5niI^|1!J`vH5sJei!(nqY-`(FG+0tTD`uI-aouI2z}J-o+#RZfT4aV^Ts>UgEXjk;t!G4Ik4H^AVa9$wwT!3!I33>$`*L`dtWK z#)U5hOO~kS^F5&x-YLZ%UT(-!{JPHAv+=!1dG>;j{t{^)tGnQOTOSFZdnv}}hA6g2 z)iZ@Or{O%#8R|P)#Zbbh6Zs2thwqU{eB=W1}Zx#4q zPCgq2eI0u$YT^6A4Z|!F9e-0pB>juQJGk`6fDK%K@gmra_O0c21-OLc za&QyJ?|}Pr`uo9*CiU_W#~Q!}^k*6$1E+9&61;UR`lv)NQ>_!aDR?p1#jSZ6?iY#zaIc^;=&J;KJJfNd_RM;IBo)O<5-`8`sO$WoP+z1 zrk?rR@OL%m;p0Jb+q;@b=!&h>XeFzp41%SmpZS$$C-ocu5_ z?c1k?mw_|6@K?aJ_n;Pj1l*qsKLMuw3~_lX@#E!f2NymJOuvPq_20|D1G(_mz_c%+ zrhgc`i3|T3OnW4n)%bf}iM=Yh@V;RBZ51tllfi%C!l!}hw^V$p{toaCF8mvCIqFk6 z;@J0K`mGf$zKb$(eQ@D6a0SPgf_=CjX!T5f~_^%rx&`CPaM zOuyZNVXGXz6Z|0;z8g%x>7wP&*bnWE3%7vjw_H}L`s2Xcx$p^K`fV3Y|9NmeSUKX@ z%isczUk4ZAeyfGA0lPVV51fPhuNM9xxD(gk1;OJu?tB&MXLqFk?FV*p`VR08j;{w- zaeO2AG2H(iL4s6&?|@5jztz(J09?Yg{}6aF7k&nuOZOA`h-1d9F+RZWGidjRtHJqP z_(1R*91j71$gvZ=9D7j9^GW1q4>%9^FD?FmfV*RVXf6JW`y+lXJPjOua}?W;6GG+r zGx%pL0`6DucSEkh_y~JDdk`Uo9|Rw46N&$y;N4vOy|2ajI|S68F3iIG@`6bC zCEyH>JAq3%z6`tx*H=(d#?vo@=X2q&gNu7d#(OsnM)|q$+raBNc7fYn6&Y_vWh34` z$PePD{H+29(l8!W>%a8+|BtIXj?ZfT|37|hO)b_wlVNHySs8|vRV$0dFd9~-&tw>e zm6gRXN=;TO!z3A2O(w(A)Jn2g48v%$vN9QlVKP|^E5FCt&iTHczt8#ObNk#qU+?#M zpL3mau5+DTU2mW7niK5v#Mw#Qk0;vsG5BJxe-o_!5dM*RuYC&#)+Fig@rj&|$Jq8i zjdR4$Vn6n8iM#$QIM6N_!{;4$|9_4@9%Ac%?NY8!5&iz}^X4or^g)BI|2!Nbo`*-A zXzkCsocCAB$Kh_~4T@&{&gYjIxRv>pJeT4Wseb_<7jOGNF$JG(pKm(w!|d-ucYBH_ z@qC2(JlC<4`TRnCf$MMaHW}ZlEBLn#{1IkzK=11lnacYo+uytJ`5Ff>|AjZcs~zv+ z;OtrWodjGj^>^VkUZ372*moZem+gHOr%S#Ww~F7wsZ#$pZj;>aO0GA&9$x=}xKQfP z#&aY;4@a}TUj4NAmgAJ3dDJm*-nk?f5t% zjpsX)sdvxUckwS*S^bSyF}{QbgpmW zD{;Qmr{iw%jks0ni?PqS-t{cOzEw`WcnuC`-V|?q?M^+{Bd`8Hlq9DES9CgzJ~re*+E^e~yd9dvTfc7kVArBl%z)%JtFfZzv8E zpW@VuV{ox}3=VSsXx+2$d=59u`fkG^lHY|teVFshJ)i!?{R{i~hPW=s;CU%|IsG~B zkA1G^{yxF_KOEPKkHi%dEDyt>%*W!rK9}K6@e*7o^^f7S^Q?U_u8{YikFYbh--mv^ z;~9Jd*K4UCicjPH`8{{MbFee_A8#K$YsCBGIsa|LF&?bqQp$v0tV?m(~o&o~M9F2TP2*qJlXyFb5# zfh0>l2|IHLdhH*^&5|#}&fI}_x$AGmEt3C?ow)=9-28-_e7-5zTmNwE%ptg?Pw)P` z9Z!|~9_-91=(T?lhhndNC3fZ#^q!ylZsz!wydQSv7WCSmjbpLb{ygl=DLC1E{U60~ zk}t>39D`o__wf?!wf_V=a|?dswjX*6e{Yri6zt43=(WEd=U}gW7Ix+stl&R5=fhT< zD|sz;<{b3eAH)&ZYafus^GTfKu747alspZ$e$LMAS%Q4o*qMva>u&|l#=T3huM9hL z5PJLbPn;w9A?(aa=(Qg;jq8{5{@Jqx`{Hqt_V{nW1K1Pr+ub#{gwQ19Kh#Qum2-)pg0Vl&GXRB6gaQP8vNxg{r>NH z#PVBte!~5M*M0@A5|`oov$(%@+n<@u^+@v3xJ1S`6DK#>>oXs>OZ{S;G1b;rgwy5y z{vDht`G>ew{3%{0^@q*idO_ag9xqqnHmT3R&fJmS>syR#u(!Rdurp_5rn`OZxK{Gt zal|!N|2KB#l=S*LZ6?n{B_D~Mxg@>6-#vt*C0~jQuC@N2!p>ZiUVpprBFVqR&K#2g z{=Ki?=-W8{Bp>fM!}?3a&K#6pfA`}e$roW~?n&o6?auM=HC`rp8!oxQ`ui0-b5nZ# zMd$E*Sn{*5GbiOzcmFNKWs*OPojEGK_O*C4_V)irc$|0#4&QCZ&-b`f@?Y?Z>2^Q6 zd=~4U*01;b0c_9o+j)ICzPe*WXNBj(eA2-<`NZJO^jr zY54;>3ne%mu+y6~?spQ$%nFH2qUy9ps?-J~L0XuWQX1eXWal7Pw?&o>rJZm41 zQ?S?meC*5td!F0=37jf<33ld$_13=wFUMZ{-PoB6HrlWE_>Jd=<>%~vu25~7)e$?t;a4gR+ zKF7`+xR1EwJ9QD~i`0+6&fK`cZk~(3k$g6G=FIiRzaDo;{yOdy*WlWvHlFu!fsCi` zVxC`$&%te9aB%f3LB7e@nR_?M9nUJkoq3JD^%vtn z$yZ@#ZsYgd{(i+llK+97Igf+geDtH-Z%IBLJ98m>{m;TJlILM(4&>49_I-w1CEtUc zIg!2g#})DSOWeBz`yz0J_+(rmJ_85I-@9+b&fLk%-0^P2l~P}gow<~~_3g)r*jwLU z*qK9_)1c@4oA?;_+mcVlpJ8u*EW^&qs5zWnRqLXSY`dy;z;pFxKz9Yx6A9A zJ=|?SU^(Zb;LOCE@wxvdAe z=hswxt>o9^=4N|;x)VEdUwi$%jPtNJp7q$7^E#dX;OwuUVm`k~eiU}*!uF1rYjBg~ znb?^l+v|Td{$BDIu`@TecYW>i6yI-<{BZ2dmF=}p!b`C?zRR&QM|QM3zE|*a$v0wW z&TOxJ7k*pvf3Y)Hc7nUVCOysbNXgT1!1K1g>##GIw%6YiI8gEu?98D((;d%WI7o8e zGyJx!w4Z?Ql{^VMb8CD3zli5bUWuJKx4nEoiO)A*@=)x|#m#L>&+9cEFO+;1cIN3W zbnkyZz#+JI;eHqwy=eX%J9Bw^>pOA+e{cCmw=3#lxKT;%KM+25Wzo(_TEzsTWVc*)pDcaJS_7IH$_` zdk~jNeKpRN{2kmS{t!1y{XyIGU_S4iH73pZQ+7dV>vsJ-Ejh(sbcevXh{2b3WBtIHEbJu(4$3(mo_b$P{ z$=I2*KHsl*|5f1Sl5fDy9QI!O-|#WmYu|;Px$M3C$};Y!Bu~fA9QR(n5f72P8lQyE zqeJKVAN)MO1upr~_$Hjxr#GL5GbPW#Wi>XQyYX7=t#2)^kh}`Nia&AJ*KZB`U-Do) zZ=1Eh0MEtV_9o*8aJ}39IXqwTm+<9pTl??uW!P)qj<3MsZu`U+c%CNtM0^__W(f;hUuWB%CRE8qN}5hnvMW z<7BxWt;8*oKabPjxA9is>v4rU9zXt1hU9@bu+HlLg9l)5`;u^w~^w*FsnwQOI+TE{)Kq5?obzxoT_RM0!efb)9=CvN2Wh@*P)0lrId9re!nDqFUiN_XUSvS_0Pijl2_nQ$;Y_) z4|ucWgI;HUEV1=piaR8qgU67c=C*$sNAZ1FZ+v_44buL|EnMFupMW1DkM_ogizP3| zTglII^RIA&@vXqe6D`@Ehdb{yF_E2EyO}z4hndU&+sP$F~8;N&Xu?gC8v$=jLbDaD9_J4`-2I z;O5(Kx#a%axZfln@8;*@7ReXjpUBT~^Y?KW-?#9_ci7t;PmkF8&&Mf}&&D^9d)v1G zFOvLwyqw%Se~x>H`+vzV#qW}P=g0lHOY+z70djBu{(@upKCL&t<7@f8<)e0dU5c|L zFT_`npY3knN4Qk-L--MLZ+s)(<@}d?8s19oZQrvvgzpP`>)(ZcBOl@Rf5dy7|B_F_ zLyLOnGIFjjPvU&Zx8qE5um67UbN)+yE-se*ZrmaHtGJ$gw7dSFaTMRb^~M)b$NR)% zHohxyhU5?7v&g;uyA2mheh}Y8?wvnlKj8eA{5HHo+CPs2`FoJJ{#|%G`RVTX`hCdx zFZp=fE$#2Xd6GYe&sb`&?`ODD@_`@m{EysweJ9~I$rs}%$i4l$4M*_z5^sD5@dxDp zw|(`z9+KaQ{rC|;FMkz}#R=~A9KdN(KlWqJe{nXxhkEb$T7`W)&kgEnAL9EGmy>(v z_ux-B|0Pes-;jI9*8-d)`4)T>|Crp%f5qjJM{no-oP4Z1-f6f+@)CR>xi`M;IE;VK z=#9^LuvI~Ry4!vPPLcc;yqnxRepcW`lJCGrJYnPO_bKPUhywB&nKaj_|`PsNZ@*F&* z*v9uf4&?KPxBe!4Ik|Uy9nr-3FL@H4OYUv|0-PuLR{R>dxBdgTQu3(XJU^HIuf}bX z7ve!r+3T|vNAP^h8{c2}BJwzQ`$p~Ie3m>H&m;G)FB@=?JMo+1J-9*Y+i{cRzu{)_ zAGk&Q4{jCvn%UptzPMc+gge9oacW~fcNYZv!f>aI=QNxy`3M}+(#Ne2@+IQCB)m|dBB(4k4fGieVSTqfRuTcrJWSodehUY>uj zf4%V>gR{lqIOuCTe$K?ZQ|!~J^lAC{Cj%bBwmM; zzO#HI_7-RRKf{za|G_z*M&UB~{qk&FB`(1wvVE`M zNa=3_P84s(&*B8P|8H@M<|rcjCDREdLu9iGAPl{?ui8Uz{%v!s&loJ`m@K!|?3~ zEgypO#F6;ge=R>1=Za(S4gP`dE)VvN##!QcoETvFc{oj+gk$|O;IVD*>aZgC1ONVI$kep;N4OT{Q`H|?JCD^wRCncK;am8ikrMOmHj6W2w#0yibz6@thGQWhot}s{PkW}*~ ze2lmnS6^xQ+j#jDa~%%9%KQnA6*uB>;yrlpRI6{no3A#1j}xvnx8pSNetfOC3;SnS z{UO{e4)~7kztQp|@Eq|#JYReq9)6S6M_}L0=9BTFEb|$-R6Gi=5y#_8oFDymU*Gd_ zZu=Y8)1K>**ZyOC64xKE{b?I$j~BY_Kfq6LfAN#s{^BY>-vX{b zP24~^_uCurHC%tV?eFoC8~uD|bN$J2+poiqaev{B|IAH(zO`I$y!AhYZ<}cA{}W%# z^~M|j6R+`m!`xr&bJu_LX4-Ro+2gK%9)6JPi?{wS@l9M`mb&Yo{W`z*&HY7#+x{Q? z7uTDfe?P<-1gVM;pe+5An^b8-`Dtft{>j`CszCUzT*1f zwSN)6&h^9Fe-|;K&~g2({rh+V*9))xh&TOweYie&?H|QoVz2$_Z~6IlbAREzerxef zTpzsl$JY4yPUiaHwZ9YlaeeUGAGOWT_Z0URUi-)KVy*{X`-6BQ*8{Kp)da(Cwf2AE ztGK@y!Y!Ngdf)R7`=9f_!redL;;T6S=eV!O1a|CB&i`;|m|;{2u47e?Xm|Zw%+R z_xs^5<0rVk*yFZ8?E^pGyPVH&y6vC94{$zv?SIExIiJ1ukMTnq3%I}V+8_CmpYKx6 zU$6aad<5sO*M2v?fb-XD{}<=8w>Y04{J!V<_?VsFeQ~q+2;3qL!ENHBal3dB?iQCY z8QCv5gq1q`s|p_!pFq90IOB=>ACJaCOKp5-<5#isywUmm_Y^LXd?haZu8-R#bA;nc z$v5H_@fKVo_4T++K5u=6%f-K8Z*j(Z2)9XpeSYBcmpBl&KVjn^fJ2s>2jZY7&Br>q zI2?C~PsE)v-m|c;*xJY8Ht~2I_PydT#a$zO5mORT;Mmr4D5PQB#yxLdpfC$6;iO}I|l|BO>5{|)Dg z|HRd+to=dUA?-ujc-|rTF}PhEjsu^y_Cs-qI0|R2w)_m7BaX#!WtNY_F+bSrcPUPg z{0iLqywzWY+r`)6xN^&H!dcQ^9!`*aF3x$`>L+gJ{hs4FoFO>p?;N~<=NEMxc7FZ? zd>=J%ezX0N?)7f+r+&U8+1?D-{daJ_^ZKN@F2u9gUYhmv_YX@kKm=@y5C1Icq1^zh?q`k?we=;#?f%dNwY>-L7B9#U%m0O4t2%`S~)Q z3-C4c@77qCCP#W~*}#d)%Smf;5RQ@B+2@5{JR@=Dw;-iUn_f$l1T zeOqv%_$^#5{e9}xyNffPR-7dDKjKvJKAa~09ZwZ^;dJpqe1q8kN1iu}`(bZ!)_*iE zm3$Dc5}$xKiz9KJ_!PWHdN{}BtL8s&xwsowi2Z-!enA|Fb7XykaI54IxJ&%V zmplb!Ja4j-o$Jf{_#oTk-7oat>*xE7@zuF`CjN-}K=*pF2d|(%uRh@`?gw$t{Q>>W z!r$RAxBYO|?=8;jc_!|b@xKl6jh4^Ek>We>OX7QQ@g}REhey9=UV!7p58*=bV@`YVlekm70(Xg@!}*)7{}*wg zcpZ*<-SUk%R{RFeskVF@&K19pOT-^z-;Z|uw%`iMzsCdLwEo)hG2;C=Qrv~3#E0-6 zalp^KUgE>?!ndsd5L_re1}E289*$FFyl3J$l8?gQY_s~a@%Q2h`0%$azX%75FU7^; zD{z(gDjfEXwZ9Gz5#NN%#kb;0@hn_gYwhpG72^AFt@r^af7j|47QDi(ADTaOnHi|LeF~_J2JNmwX3~5jWvj@m^d~XZ^L}z2cwnH{uTb z$_G~e2ljnv?#4l4|90*N#euk6#yhix&zD?Z8tBHk9{!1Uvc2B*?a{Bfo?-9$_B$TM z__N&W;St|*J!E_XUC(LdevI{f;yU^}Ki@jWo8tEWC|*l{QLeXQKkB{p^=aez0{wf} z&%un>Tb%3Xsd(>4w!LTKZ^W_xQ$HSeNq!!Vt+)0U;i|O(z8Y5I{C#W|j+6W@oF$%( zb6>IgRXAJnGF&Wv5toQx!C^aW{Tpz&cr#8GZ^h9++4X2UPL+Ho&Jt(*$o|9L>-9Lk z5_|je3+lba*`Eh+wzU5n&lLZQbHo9^@b@iof9x$zf1x;6^5bxxcnB^OpM;l*qj0hK zbo{he8;Egp#zcG~`k!}G=G;6iaCE)rjY ztHmieewXz(1t*Bp@nrE0xLcfs^O~&vOx!8X#fQZA;!}59eLhYXFT`(%-K*Nb&?vr%L;?aGvC2ai#cNr@hoq#+xNi!-bOHivN&&7A}{(0FQ3A?O%e& ziHq@52Q{TG;`=;Ph@zwuRpM}dM zpMfjHx8oY|-MCIX2iJ@5#|`3z*jt?O7X6Q(!>v+Z?&M$E_}Ai?`@G{P%=a!1l>9>+ zCf<(2#f>;oyc;*j`SLSPmb?SU?X~qEz+DS%{U`j!^?>oz_IHloFyBQuN$Qiaw>aCI zhEpZK2FHA5{ojCN#kb%_aW-xe&%#yTTKl_jjd(T={K4{k94cOb<9@V!3HJSBE^_L{ z%W+$W$pz*CQkO}#qU{yeedANe&#wHE&dpXIFmxV^%wEr z_9)i>wEKDDUdFqY^{))--9Jy`OX%&XZ_n>_Iqo08{<^cT?_~OSoP%p{v}^zUJsZ;VKhFLL!3i?H zqj8CN5YBD4`;ll|D)|W9As&qjr9KIFN`5I0cP0VvS@?Yk93lQM&K0NQ2J!W{O!~hA zH%gv|BagBE=i+LqFTzohFUKk35}YbtjmyR5xJmp9Zj}COu(vq-_aodQ^$qw?n2m2I zZaB`o2TvJf{tB0iTk$92pK!Oh0}pj3Rqt7t-y6>rcjFSV|L=SsO&o|rj<@!~I942r z3&n%*dT|5}I>Fix$Jyd&ToqyYNW57bhs%Dk<82~d?@S8sZqFoKG1UBD+$O#TpL&wz zH#+s=Y4|7cZTP%MtG^RZ7th99#P{Q@VOIYj9yHwiFz$P@`Ei^eehLRfS-uJB zyjPrrlSW#88BP_a;xzG8JXf57o5eTd!_Tt*vT=;~c3dLP!&}62@iDR1z5sWMm*Cn_ zmKWhR@p7Ct+VT>-NW25qqUmT04o@e>lIO=@!dAPa5_Rp2LQ1W#AxA;b!lW6Uy<5KY~Tqe%L zHR5?V^#W_Z5O<0n#$DoN_>v2){ux{&UX8;qviwE7SzL+zlPrG?uMxkA+r;nUn2W8x z-pR$E;ZE@$+$H`R2V7$9+i;-xSA5)z{=MHH;QK&%fAIYBH{1V(_!6mq99KyG0xp#N z6G1ClyVzc- zkH#yd{wy5wyKUb^xJB~IaNrfT{wr~m)K7ETOP+({Q?34PoFVlO;Y7)o;@m5({wZ86 z^=t7Q$*XYT6svy&H%R?%NSd_0a8C*tMeiP(3I)lbHW*P5@wN#YEgd7b6A;4JY> zT##Y;op_OW4z9Yv@&|CWcnO|!qvem`_)K##?!3vo3U`Uu;E-D^UyB0|*z2oGksl72@x^II6$zS~_q(Pahh{^OsZm_x@fKP73w+4d(uHjhnB< z8&B)+OjFiVKjT<`-z4rALtKA`FXn#EbL4UUzIoW|f5BjX-vRE&8r=H9L;QW8bARMK zpK;dz4t}5eA^ur#kMBFl-}gKB2U)Ibhxz-S=lwa{b@0jlzHPj}rn|laPsDe*e&IBp z7qGwLT)!0K@5{Kiudft4pZ{MT>F+y89_Hp>v46b9`Fz@eYi0i(z}d5GfBubg#sA_t z;(&iR{>1%ptvDFhiI2iv;xHU|yRGkd93mcyL&Z@zMSKQM702Qh@i^QmPQa0O*!nKS z(c)wrFP@B(#cB9Eyv*63yni*|7Rh(v5;^{U#I2J5igR;q{ReQ3)CclK!#v4@al)Ne zABvl${$!je`RTYqd=~coY3JjGxKi?DoP3w{KN*Kh{Y^MU@>_A(-Bv#fCrEvP(_Zo= zxIkQlGo}7Hyh!pFaiMq}E){RY)#5jBjd&aG7Qc@RWqo^aK%R}i1&4~i$0_pnnvjDW zU*fU2Tb_sCgnbX%^YIHuaXxZBRXWE9=lk9GPL6jTZ}xZ%z8@#K{tNf#`1JCVNAo-w zC%AbUz7m(ZK71_K1GX>G^&ET{gCCB=7St&v)nA`T}vJI2h-P zLvew45H1u);J|s--*D_L&i)*ULnI%A!@KPIcQMYE{4$&)z5*xQZ~Z4v@b}Fk_r7nQ zM(!=n`tEi5llpl$QP%g^|J0Y`xl+Ftr%U}?xKQ$1oGbY*Tq5}wxK`Zaw3qt*xL)!< zaq4{AzHVGD^})P~>5?CX>m(nBy~Wx77+fXwqj0r&9Ig?ci$4)3;zsesxZ(jD-(^mF z@fEm3oQ4zLx9jf%IPG4~$MU+YP z@5G7XFL2NjtN$8@|81{NCk~VRZ(Jhw`Exu-{ZY75^5bx=_yn9M^&@fQL$>}nyiD?m zI8E|NI9vQ*Tp{(-ajE1v_Mr*89moDCc0FgJzwZM2^FE)H;`?yCo7dvkvG;zv z4|mD^$g#cTmO|fQ+zefm-?{F`TW562f63VOmc5=j`w*uOWGIU+r^7BdMd;|_SWXH$(xKQ#W+#txLw?i zJH)@?pr>uTf8Y>tHx3p1_hb9TfjCVZjMHWRMBp`&564yFXxu0siJQc6IR6oG$gtalGUuxK6wp*Ne+>7VCYHMmah9~bjOEUV}A^_|$05AfZ^`n|7nk5_@w2#D zyau<3U&fu{N*uY`_UA?%Bi@2Xi{HYj;&*YL_#-@5{3$LHe~#x-yj}=v&3U? zj(9xI6Q7Uo6<>_!h%d)W#8={C@zuCQd_67|--1J)xAD%v$B6I1apHUMIpTS^QoI0f z5T!#zApWs??BW{1e#+i-%(*8e3@cK%AG%gbl z##!sE{fRhV+Q;H-$;aUwaRQF5wDuR`&C>oV94Gm8I9_}c_PuKDZ^a$bel8A>yZ{G^ zm*9GF5svb={r4Phko-m5C|-w)*W3Cx;tXkDhf5^?1eb~%apneVzXumf`(JRDn8>IcfAoj21VK}glZQp6QMe>ojOFR~*ZnXXraFVpY0;fqn6=zC51LtnC z_PMxTJR6rv{Uf+R@+WY$R9INUDzM4VP_`D7eg!Q4%%kxi^fC6XW?_i<8Zck0$wRj!o@P4bbLti8?oRopakS)5=5~=SW!slDbLvX=%t3MWZO8sfLQ1X#D`3PJ8g}AA~+Fy#RB)=X{ z|J3p<+%EYX?7zeE2k?2~B{(X`*0&PBC;9U@N%Gh6g`Zh}HMm^-KK3N_TS(@ z$$!L$i#zZj@t-(CdaEJJK+$oO4)0=GjPQy9kk+?`a7B3ek;NacX{vsSIz6_^` zuf)s5>9|YIw;Wt7`Q7+w@m&0pcmdulF2tXRAII(Dr*Y&S8}G9?`3rM74jEwAmuj3M z`8zm9^3QRT+mcFT~N`S^J0aW@-N{ zj*+|^$BNhCF7YPZA?-iJ-I9Nb`3KbQ^N?U)6Rs71g`+}j|NV~ZB>x-Ni~Ww~`1`^7 z3&a`HJ{&KT{3Ki~`51g&o3%d&r-?7XRpMmaB<(ZsX31~Cos!SSjXzrd^KtY~=EXSX zNZZ~OjwLU{$&zozzMrlATR2_(9?p~cJvc-1ukkX;58(24>#rL(Ngi?x+y9H@$Kud| zHr~_llzoBQBJ@4afX$`LDQE@;=A%c|r2SacHO2ABmI2VK^Yv#utrKBtHvJ z7LUU>h$rA2aS~oAz8tR>Pr(i1Yq0+T8($`llJVr>8zi5HGsO#Wp7>#0C|-sa{bBt- zMy|I$JltTa@tFt;k56z`de_W)X&CslFxVAAGG?# zxL)d4IF`K3X@AJ-U&fKg+IZf=4U)fy8~?TXkMSI-{~9+--sZUH*Lj>vc(CtRr@hqo zIgax|^1~hbIlt!PEc|{2jt;Z&48!e`N8>hst3L}DNc}~)L-NaTv*b76gaB(l4JRIF z>$?v(NnU{GNM4L{4zu>FaHV(+-YoT7aBN?z--eqc--)XvZ^qI6to~cvCG~&eSji9J zkU=*7frGfe3AFad;b_TE#}S8H9*dJCPr^3`S$;V#A7Gw>!-CD%;6KEfIPyQ1--;KC zZ^wnQzJ<6t#Ofc$A0BC5hKCF^KZB=>SK~LuFXC}WS$!p5CVmZvgXlI55bEhABls)tpBk%LY#o3 z2U&g*P7q&);|5!PB`y}H<0kQqIO}+;pN=cVvv7kr&uK57hr@?h`-OPQ3Fe1!k$4%t zEW+|<@E-AMoN%J$FXEh`=1LrXlKC|pA$}95iQmN;;(A;n{tTCi_uxA5*El@V*4Kuk z#J}PK@gKNId=R&Z1H!pK6d!@phgtsvahCWvTqlmejpCDW+;D4u22K=@!pp?*xKw;T z?i62weJ5LglW>|i4QGn4!!_cYalLp34v(__a&eS+HqIB%$A#j>xK&()JH$`obRF-u&iCJb!FRsY-}zaU9M2f@ko& zz{}^ZWPAC%?>T%G{~nId@}ThAj``}_R( zeCqjA{IU4vO6vO^?#t#hb6%et*Yo{%-e32+`+w3#f8Xg`&nw)#;B|lBt6XoR+`Qur zf8U8*pAuY;tLFPnIMHv*fb4|hmDA1B7xco*RUsec-$N?wYmh}YmO zaRn|Dug4YQ&3L`|O}trLi*rZVcs|6-Mw%ONnRpj&5I5sS@i#c(ENkC}9}(}v8L^gk z;vDhcxI*k3!u_7OFWw>!!ZqT7IB%5oABKxYn}^_1aU`x6pNbpAF*tsVwI7X_h~x33 zxWjwqyLbNm`DHi-_b$P{RGcfGiW51$oTJ(~z8=OGVCRT&{2abmyait>{uECVx8WkJ{z$dxGQF>pvDhkDdMFtp6sw6MNU^#dre8^JQ+n z9zTkAxZZ=W=Xmt``y0=~-gr;_oPWQCz41=Q_i()OF~4Vh_u@AsUx~Nj&2ImV_%V)8 zum1!1S?rB>coXlh*co*jS z$?xkM+~Wbh2{={q>+xjra5ujnmr7oWXG;6GaJ%GR;lho}w zPU;uonb%l4eKYQq{2LrN+v?kJz&!IlTqf=PPU3ixydRDb55VCMSo@=Jv$P+MBPEZ< zapI9U_CaeOheJ=Y?VpI_C7*;-#Q(*~Qa>GkxWxL)!F$Db;R2~&jME;m`bTlL_z7Gs z_2szjF{^(C=R9Gq!nxutc#*gUcS?Vs;S$Mry>PoFxvy$xmB;3|=Pvoq{tYKNF`uWA&qOz0@b+EXgm!K`X326^DqY;!bgf zlMl1)xdR8TwD$Ml_*Le4I7#Z4;zY@dafWy$&J>s7s#5FkC0ro=ZN=4+zk{2^AK+&3 zb{wNnt+lWlw6!?BWoj58%~!Sf~m0dEoS!-Z1sH=OhH6SJ)Icnr>b)$((2oAfscXG@-j7m2UKh2ooW^Lp!V29Aib{gaPdC4Uh6Hdy^5 zI6(XaPOh@N1gA-V>u{>%n{bYJE6x?y;>{bazmIT{^tTt+Nd6se7PsRT@$Wd`b?fhM zTrd3%IGOF2JQT-^2jc|sP@Gw9{hfm2PO<$LkMkuzAJ=TP`b+RKslNs{N}h@9B)=O+ zy=Cp^;;L=t1-MP>i*c>wt8l`*R=)f>;{W(V;ucxoHXJ5-9nKeT$H_lf`&~HnbQ|waI92lB zaE-VNXSP}Ue{qtuKk8JDU&#mID)EVU^pDm)3b%;Q#N9tzJ{kwKo5$m>U(AVkj;uco z2ko=`Iy_l?GhQy9ft$s-c<8Uzem2e$&&L(w#rUTVt1rU${$_p>zbRgc{r6k`JRU8s z!0EqRz5$mUFmJ(Wf10=9#53&m+lezIZ^o_SZ*g>&wf_mX{AKv8F`~EQx!Zp(V3>+Z&C>$t`$3f!r@iF2{aD;dgK2@BCM~kn+*;#Ry@{4;J7@5lSZf8kECFPeY9Chms=yX|-g#skGi;|Os$jufAS&k&!Asm!Qi#>R zhy!A*eyh`7@>-lJc@vHtXzjmp>W?yik2A!-;Gj^;J8|qW=6~=q>Hj}xaK9n>G5C{X zt^Ro2B#y*$23dX@UL+ogV}@Ej7RQMbaABn77vWAB&(*j{@*8mcaI2q&D@NG3Fo&kH(>A+5Wi%w@5w-2gF%@8V(U( zhp!dij5EbEuD zak+RXE;!%vQ*e>FkK|2~`|c>#{T z)aoC?5mLVj$4b5ihg@d$YjJ|qZ^L1d*Wpg_cAO#g-{Nk`f5J_dTmQe|e5pTdB-<}} z5Ux(K`lE2E)SrxNB|pQ-Ct3X{TqE@t<8sMUaKU7&|1WNl`de|K>F+S z|6!aX`7)fGYW2_H2&rF(QzhSoW3IINtvEsIKgDs9H{sAJR{s^wkow008vFih{e|OZ@kzK;>c`+#$R-kYQvVjtmHa)Nl5X`M;{>Vy8mCF#hGVa>`d@K|)c1+y zenIlXaoDw1esZxJFu8{l^yl9%$Pr|uUe-kc}JR4_E zxB5HqGO2&iX)pOBIOSHWe*#xY{fjtF@=6?=ZS}9=MydY@$4kBght071-MCZgf58!w zcj9jGKR9%p?f?Ib=6IZG{T+i_#K+@UsULycB#*^YF$>-qcSyul5E|mHwajfJkah3RaTp{(ZL16sQvU*umHZVPl4tcB{~uR(1D|8{$8r4H1GWq!k2RS> z($q+q8b%0BMxIS3M4C(?YBHISsmVf`nup56Xr79inygSulZU3JrYJI+sL=fTf6jJY zov+=m*Z=kE{r~>Xxz2UYxv%@WZ`?OdllpzQzU2A%qWD|9RqD^+Qpx|o1=DQ*m+>K~ zuNJ}nmAp1yGu_tTh%?1E@B?GAQ6 zC*akRPr+&PZ2ffHM(P*hbjg?El$UJ%TezRpZ^3Dje~6Rk+xlI2lGGo@DUuiB#1vcq zGftEGzj3nU|HG3O*!oKMGJjIv04GWwisN6l^|#_fQhy(wBzb2%>J?kx17DQ-VK`p$ zQ8+f$)<1!3ceL|A1CNsYMci+ptzUrKNc{>NEBP86{i>~h&$O5N-NurCfx9fS^#|}I zsXvLMB`?O2X}10XPLuj7_tBr^)p48GY<(TPRqAiUk&=hwu*J5%Ej}dm58^hG_r*Ku9Ji7BO*lmI?Ko(et^Wk~llp_W zw&dSo|2J&?aXd-t|HMI(m*P^fUnKJ{_4TlSy6x{Kd{NvKZhX7m4TN6XI8K;tJc}>o`fAf%C-g;x3)+`hA4+CI1vh zt+f5^!?99-40o6O1Rg6sgX6`2;H~1zc)QqX&+GFld%P+*L|h%864$|LGM?LTvE<=+ zujE~D*lOGVgE;tY>%RDe)IWx6OFkag?`-F5CLSXBT--+Tbi7jXRX9()4mWwn9)A;# zk@lbA=91^(w0CX&K^!mjzv6Vs&*5V6pSVO^ibL1f{`@*H9`SWJL0l7064%F(Yi;{R zI7ZwI4-&V;rQ$X?U&h}Z`>(V8^~PPq15CYmn5notMex2xF z^6PM_xF)VI^-b|o$-{8ycH945I9%!;)#W9j^#G}O9@KfS!T>m56-)`JY`~}VvAHWIOw!Q$T$?=Qv zRLL)3|DCq}3eJ}L>YcfsNL~kribHVN$F}_~xZfw%E$|?5D||?%ARdaFceDF#0^Tn96dWV@OStZ*_V^3&RLS4Qv65%v49RnFuH<`gfp|au zMSK`v6c^%B@z2=VZO8K)_7|VW!QxA}w)kJ1BCdQt_e(O~8}L%e8{^1ad%WhjNa`bT z7s>C(gTy^?zyo%^AHf|yxBZPa^^#A+*X^}=5?(EN8h%;wH*lWh@8O&G+4k?_X5yWg zFKGYo-$Ne2nUWXa=8_lV63H)M|1WI+SMdF~m~PF#x9re`*Hg*6;ydzeeKa1APr3D} zI9~E4xZi$T|0a$Vzm4O>nRt|V3!aCccl-YX&z1Z#uAFcCce*m);wtziadjLku7j6} zL-0!RE%+UA3%pL;3hx(3;BUko@h{?T_~?PE=C7rd&F?&1fXg4%omA|9(0U2JA7{Gt z-{H=ZAIIko+4@uXFY)jAiuf=5Kk-$3%i*g0Mn(B}?(4>W!`^s0!Y|DP7&9}%fvV0vB&K3ZpIycu)Ym<6NlrT;ZAaaSDlqwOym=ZPQ2 zD~oJC1g{g1z#GM5@n-P^{OEDpehN+yPse|VlX3h{wthaIBz_f76~B%X#Tob~@w>Q0 zyb&k-Z2RAai^SRZlz2BT7Jq?D#0T)BCv1NOI6?d)?r_rPzu?-xSf9lq;)^&`{10v- z_U+F5A8{c5NgRw<{%ZTLho_#hz6mFZo8n|~7@jM>3rC!`?eE3i#GUX=oaJ7xX5%Eu zQ*ihh+kO##0{`OHe~ZUS{sWFVYwJ(qLE>T@E53l^#8+^l*rx~g*Wv)2E3Se6C$5Vt zpR>nrh_4ej!PUjL;}+u9I6~YGKP8UBnc@fVR`El4ySP8j7RTZO@ksoOcpSbWo`|de zZqH{bzF9m2M~GjH~;+1&2crDHrXW@MD2e?%HF?LGqct69n#d)~C z_#h4ue}_ZG$8i(!Dcn>1J5CV)h3AT|;w-U$Pu5FZ6*oI?$6E_Wi5uW}aVSm@--vWkXS`kf8@`M) zeaqLcay0WTc{O}7ubQ)l0W)%^6}}{S1fF}@_TLewe`UXqX*53BJ;*7bz1bhr@oK40 z#^-U2d;ML3Pf5N8XV9N_{IBpOIsfChMCwl&U$Nu)9e3Yv$5XeLkF&Ff9ZxG9^^dKO zz_W2bwvZWbf1D_JERLqXP{wQK;{}{7`8?d@U)x_Qj{n*oe>)D7{1coj{v5y7Gsv0h z&c|_FAo(fWly4XE_txtn_Dk8f4VfKP-KmBXIG#7YHn@3D`+Vq*n@D|cyw%5iTakHG zcLw0pd^_G5xLULw&l|Y8udQE+$K$26HuLo{9wqr_I9{BGFNzQ1*}a1P`~I)rvA>_~ z|1aDhmwn$K{a@dk`Ir0#JW9^*4%|=jyK$B{5^s~^4Z?dRAC3e3?eQPO#q57GgJ!*7 z$D{bYS5skr@AV7ZMCuRVRB-{GE8{E1t0ljHPl&JJ5;RmDs6l`(KOW#aTFC>T_|Dt#dUFgsc(TxByWYI1MKl4aD>!H;~2>w#{DE8gA*iw5|68D`EiTIb;4TGo4vueaWh3#GrGa2v@_8%Nvu zy^161*!KQ?x!%>cu8LE|wQ%zgn>WCtq`#K9i{x$aq(-*>K72yzd*dX@2jFb+FdW>= zj&~x?m3%6Wyv6oE1BXfdA{;IGG91^;)~~>0rGA^Shyyc?%U{kJ$(@*i;VZMOfD zc&pT3#+M{_9_Ie9g{`lGg_hKgO7+q@FnprxO+=m-vVzHx56bdp00SikEn>gVA!$y4#`;XzIsKiO+uFKYB7$K{XePF)-=?OWib zlDERGTiN;u93k$ApK5LMZg{G=7Y=J<^M1znSP#Wna{LK6T=FUSazv1mrN(@my z@kqQ{{Df&Qej4u;KZgs%vv9F^K6aw)coyN>;x}+}@hY4tUXNpA?EHO#w@bbU?-hTI z3&r2!67i4N>14n56 z;#b8T@nZ1Y!G+?ta99_6{C9D<_&uB~{s7Mve}W6ddvKxnYaHIy_Wvzz zBmNO5i+{y)#lPc1@!z;e{4XvMR~f{7cC*K;frG{MaHzNu4j12wqr`XO7;#(NPuvlY z5g!b!Xz^YYy|S^Oo=5+B4{#oyy1@z3~#_zVu|ZTr7~SBw9_ z34QGAO^v}EPx5*=g7260#@7g^Nc~;7i{$s=c=7!>LHr=j5t~`yc$$P&%R{`4N1TyzKLS`hVdk9AoqU;lo_dy?ouze1Cs`d;Df6_&oxy-zVJuzrmLWU*}9Q z@3-l%;V*oDKiBK+Zk~;24YPTNUpYUn&$(`X3|AXr^Wmp3*He_vL!dxx)C~ z=Jyxe@$~$M@wMd7N8J7*O8NbvH8#KJf9#JeJD%(QWxaPYzi$8M@PbV?KjQc~mA2U9 zeeC1sOy>Jh`D2^1@x0^f=N#wzO{3i7|KjK8blPE^AK>SF{{#KG>+{m}e$Ftyf3Ab; z$UFR;{=rq9{ceA!TKPFWnpJi9S);Q4-*4~dJlCP>fBQYSgP-$Y$EwaF?)g2A*W%Ug zde6bVx>Wsde|~~nb+xY3(a)*V&H6!nSv(UTd%)&r@UHIGcW|O__pp8n&+BRZJ|6#| z^*^{zwDqt~e$L&!the9>4_O!EtKxp0ncva>&zrgzj*}P3RKWD>W>*aXi5bMehuz!YHPr!p? ztqXAbVb(Rf`#FstvF?d4@%tLJS$`jXzvE0V`se)-AKRAgmz{msufwT#_d~tDe$Gy= z7l+*aau&B6W&2z3Fy}kk`u2XD?_<_`@JVr{{+#a^n?H*;jJ5s@FMQm(<^axjob@m~ z_zCNExP83!pn;t4c;(v#Nr4f1oono!kAcF!jhpO*XrzI&q0M-68GCD``s@$#o^ z9x}ww*+KmYx4)6N(j=Q7!i}G{`SU~B@8n*6-&pqhWb56yA@9%9-2S=_l-{yyF$ zdHY8g?=v>vh#O3`{vBTxhY$C2O8I@Bbo%$<_gt2aWd2!S@AqPSM{&Ktt=;1YI+xt~zWCTo>sRsN7p(K~SF^0EKgRPh*?KVEIotYe zyzNEn^LWD?>kebMp3JqLkC)H0K7wC+$@-?TJiq5#KZa+gSZ~DB7g+y=C%IpxmYnpWyZvUEfXguq?*g6%rTw?8v_j8&q zwVsF@zHa>!uCvVg;V1o^YHwKQ;!5e(l_s!X#NF_p%d0xk?s`wgoicd6aMybgK8ekK zGOw@WpQ68YRhoPgt>)k*9 zr@wbM&_ADdM7a5gjegG90oBTWFV0-Q4&XJo3;i1hX7POH^MV%c@t(%lb3fR|^)Wn? z&-1mlxncVKTk z6YxICm*HdL&+vJvuepW(`MlX{KMdCtuf>hUf8th{r*ql)cHYW-Oa2P(DtRI9A^C0F zxc*{q{hr4MxZnKH-5*(a0{IPY|CQe7dWXH=vl@$E!QSz6@gi~K5B!`ZQa>Fp7azu} z#4We;`YoP~-xD9h+pu@M4m+4{aR%Ng^*$f^IlIM=;Cty z65sZTpVJn5$9oCiCoaYvrM_1V`$N1AKPaxUi`OghC_GTS3lGEI`B(qc&v`~X6feZy z{H?+7N`4jZlDy|`Kj&M?-@@my_k7rmefYfI^RKw3xN0uX5AmJ274GNm-ywK59^`s9 zJ|=mVsps>0FaI9T!(RK!pHVM)D||Pfw|jXko`=2mbMSHOjrTA;1?< ztglzT=dOLdii+oj#C@3Ghl|Et9emGS;1n0@;(eXG<@~7|`@l zH%X_DWEi^QF< ze}6l_{Y-nwhv2zS+405UP^o_!r${~x?-kF$@lV_KvvHKPUy2hXe-kH)SK}n{I=obz zh113F;1kP7n8E=*P1~@_T zM!5DA+kaDhNa}n1%jcEs_Y>@Y^M3Cwe2o3=`3l~}e)T^8=*OM$pE#VSjj8_-4`u&F zxa}MJ_&bYmg6qd{Q+$u>FL4jnKic&~Uw@|(?&7+tpTF}O_U;F_;?sDwo44nK_QT9~ zitBH1Am=;Q^|(s@&OY|X8rM}S`#THpy{_YM{4n>=Pq-iZ5>KQ*@BXrF6@Ov`3F3g+!pPsa79+V;=lCIigq&4YQwA(Ah|#p1=d zyVS42&NSQK2AuJ%^=3R)>T~gS$-lrk;(VNzXxksbOQroOoG$q}oF}<6k-u*@-L|ic z*NB7g32`kP{k*NOk4tA*--P`K+WBc^oMiL1_&RZWTuXdE?jr7ilf=DolUcUE{y0L8 zHx`FU{v>`(JPBVCKa2g7ZGTBPK>Q*O6{p}P;#ct~@lrfi{3f0xUX7=U*Wpxg7ETkt zkAD+q<8$Iq@h`LO`1j(aG9TaLxi8uLI9@Z~`d9pUiuFxZdA_n=zF~Kp=kE)6I?sm; z*9UPY>|GBU1^GK^ay{6Oec0dI-RoP^YW~g`=KEE*eXZ*L&aaGjC0oSwKMAj8e?_|a zYCHjZ{a3Hy?_^8=zu-NLcb!|G7VPh|q<^pepIZLTW$ay#hFs6}jrsDfM>}v+9Obre zUfbUpjlJtpI({5`?Hknbccw}E#rQQmz-@m^U4Q3ye983`dTpz+&a(!!E-`~0QwaU&A`ZMo;Q*nXhK@GURl9#Rc!W$Ve`AMb;mLH7AM60ei`vADkE&*H?FZGSWHs8_6$afH+_#$zRa0|%wr`V1T= z^_y|9?r{gTi-@`?cZ^JQ5ZGRu($k(lR;R0!Y z2zQbEJM0Xx=YJOGNPYpwF0=hz#vxK4G>P?+ycT|5TpveE{q6XQed_PW+{s!PnlE>n$>9)T|@fxY0jJHev9FBg|*3ZOyr9KVENWKgQ4Yl*N0Vhhn z1=oJd_O}B!m-;+hU-EBocgauUc*)P;L*nzeK>RmO$*{+}ij$A1V`3l?L-8f8qpJ~6+=ACen^w$q(N z+y3U`CgO!S=xv)X!NKC?I7hq+=Ze?j_;+mk_i%!Y=Tl?J_u}pE+WP%CTYLy-tg-ob zc(u3)J8NzJ3-%WmJwJ~B!QI^YJlu);F0NZQ_IDa^ zed_Bv3HM_DN?b?Z?CW2yV~(g|ngOknq z(cg!zz4}jZ^N;NDbMb2aKBGBnUU{5vO+7X{%=kB)DK5oX;#yO=eu!tjSU&!6b9~mT z5xMs;^BIQ2r zvH3f={$A_#xVbnBx7la&ZMcj0BRqD$&3ECc;ypMScXwaU>P#zl`I=OBZp4}SwtZuq zC%zRIh+EyY->ij4#Y}6gK1YJn=67vi+6p<}YBgzs6Q7AJ0;3*0+u8HQ21DIU_UP zPq0}Z&quIXAJ08GU+-a_Z-a20oc}N!e#BIpM|I~>Ge6=nI8_{vyj#9!eg@j;v>K8jPmx9xw#>Ee^dg*HEfGsWj|ftbG%;`2jZX~ zZ2KBGU0esR7T<`o#EtRxBHR8}d_vq32OPKgT{!imbvqn$+WHFDYqS3f*llM2Rt@9x z6^_@&y?)QdC-^+2JGl>^Cm+PydHplH*oVKr7|_zcY<~`N+tlg3bQ)?nioKvp?Io`ABT`XQ=B0Z1$%)12f)aZ1$(W>r8C+r{_!9?9bY6{@@*) zA3o(e9h?2;`5ZR;$E$zfPWs2*_2f-#_De7mV2=M6Hv1#h?XN4prE2zvnJ<&C!DfHN zxxS3e{s?g0x0Qd{{s?uw37h@l^;f4g$HQKI0ygWN6(dbH`rM9necEANpUzmLPd;wR}}+xMXV@Uz}{YdFz3O57XAi2LGL zaeo{q9)#n?Lve!m5u7LgP8E;C>EiJ?L!5v!#ZTib@f4gbo`!S8i8xO@ z1Luohz=h)3xJWz~7mMfP67kEpRJ;&7=j{Ba;UMu694uajL&VE*s5k?MiC5up@jEzD zycS1^GjX)|Jscz6jAO;yaGZEMju(G~6T~0mMDZ@1B+kVt;ypN3`~^-Ie}yx|`8ZR2 z5NC;x;B4_xoFgv8dEy^&zW66xC_agc#HVnv_zW%)pTni%^Vs>_uKz_GB>o!*i?84i z@l_lub`n{Cu^$c>SH_XzKpZ6w!qMUyI7VCx$BOIVIB|U(FTN2ch;PD);>I{h+ytkH zZ^fzN7C2qp5@(3Rai;h#oF%>oXN%k69C0Mh6L-Y<;?B5G+!YszyW?W z!A^-?|9&_~JP-$qhu{$LFdQn5!(rl)I9&V~jubzRqr~wzT08;Ah@Zl-;>kEpJQc@_ zpTh~_=W(KVCQcG3;}r26oGN|^r;8Wh3~?&X6feSA;>9>y{5sANr{g^FTR3055*Lc! z#zo>axLCX%mxwpwQt>A2oVV-06$gnwz`^1Vafo;)4i)F%F!632F8&-xiud6taUPBq ze~n|r-{4sBVH_te!13bmaf0{{tiC5zk@w+%xybh;}H{c9$7S0rJ!CB(>akh8|&JkzhJn<(uU;HU96n}<`#CvhE z_)Aol$i@(Dm;$t{eT!h2KKjU!mFE~x?*W)a4U7Rg$fOEtl zI8WRN=ZkN~h2o~TNZcG3i*Lsz;yZAuxD|H(wCmpn2Z`I_VDY^;MBE;SilcCt_76V--ENo?Qo7b66c9K;(T#u zTqy2}i^Sb=vG_q;B7O*$iu+*al3o9PI7mDY2aAW`5b-b^DvrZp;*mI9{1}cDKaQis z@isNU%V0*ir>aX;x)KfydIZ`H{w$9ChT0c>%SETi9f)>;tz3%cqa}O z=io5$ZX7QD97l@x;V5w)juwB7W5nO!Sn**TCoaJ8;_q>S_y?RQK8};bCvb}RSDY&T z4X2CG;tX*K&JnHNw)is65trgT@xM4bO)~6FXPz z`q#!m;(9n(d;<;T3oqz25Pr^asXK=9iSsWssjzh&sI7~bXhl^jtk>YtcN}PhD#joHP z@vAsi{2GoEFU9fVH*kXZO`IrRfs@3mafs=!$sn~xLEupE)nm?rQ!qFDYff=2nUJ3#lhn5aESOA4iy*SF!9eg zT>J};6raXX;$j>v{vF4N|G=^0KXIJ+5{?)DgA>I6!--;_nXJFqAE$_`;8gK-I9*%~ zXNZGwrucfCC9aFJ#SL(dI0Wa38{vHM&A3q96c>q`<6`mcxI}yhE)}=J&Q-hqZE%pd zEe;mni$lciai};7hl%gU;o@#MQrrVaiKB6}xHpaw_rk$5gH7SG2e z;+Ju$cp-NFXV*Us2Z@*9VDT~>B3_O|#ThtEyb6bl-@%dMwKz(giKE5u;TZ8|94p?2 zy!a!WApRI9ig)28aV|~~@4>0!FL1i}E1V(D$C=`TI7@s4XN!;G9C0De6aR?w z#XsRf@kv}HK81_LXK;!594-}~$IicY{V(Dm@!vRDdy4lRGfpu#Jh30_;Va7-iM>ac{p19HI5N~gJZ>qah$jS z$BVzm3F04cqWCyY5}&{+;$Ly9_&1y`K8rKNB{)-j0cVN-!r9`>I7eKH^Thw+e6jB= z)?Zu+7l{LKvA8NO5m(2h;+oju-)WaWYB;rVkhmTW7TW;jxO z8;%l(;b`%lI7ZwW$BOU9apDLZFTM{ah&$j!aVMN4?t)Xq58zaBPn<69g)_u4I8*#E z&Jqv6+2X-CM;wdu#KUpE_)%Oa9*v8{V{x(g30xw65|@f6V#m*}|0EnFeg+4NpT!~K z={QuJgu}$MaJcwI94VfMqr@pVTKo!*5x3!^OYgNbzYLB`(I%;@@$M_zxT_{u9TEFX4Fc zKR7}BKb$D`NoM`U{y0Tk1*eLy!|CE`I71waGsV~AEOA|&EpC8w#349O+z983Z^nh< zrnpGl92bjk$0g!BaH+Tzb}HHRZ-axxZE>*pUK}EBk3+>#I81y$4i|UBk>VaWN*s-& z#l3NixG#Yd-_$Hhv zZj6(}O>m0%R-7tsfz!n;afUb?XNvE_S>k(ewzwV65l7-YaYvjl?u-k?U2&1PJ1!PK zh)cu|;ZkuQ>;%~L?}vlL197l;2o4bs!=d6h93~!#!^Mx`Nb%!1N*s@)#S?Ih_$eGK zo{ZzfQ*pfbIh-JV9w&-t;v{i0P7%++sp6M#x_AN35U1iy@gkfhUW~KFuj3qXI?fZn zh4aNLaiREaTqItDi^c14iFhL}6>q{$pk4p1I7s{f4iF zybni-^Ki8IYaAo~2FHpI<2Z2vju(HA6U0B@MDcN)BtC&t#J}QH@ozX?d=_VjOK_(6 z0?rcug|o$%agMkY=ZXKt`C?zb|DsS_2^Wb2aIv^5E)iG9rQ({{xz4VCZ5$-7hl9m8 z;1F>`94ZdQVd7hGxVRaP6yJuU#9=sEd?$_(x5lyJyK$U20>_K*!wKRJI8odQCyBe@ z6!8N%RooM&i+kY=aSYBBKa8`)18}x@FwPOj;ym$ioG*S97mBCz?`b0*ao5lHdgn!a zo_}v^KG8SdACZAe+<$*-{{8MMd{y#KaH-^<;=nVu{TUp9%OBO9bGVM=_3q*OMK|0C#%Kv{xCj&s7l%I zLm8jL(>7Nw`~DAOpE*9x;lov&QEq)ToD)+1ebzOpYKZ4iZ@%Bd)Q95*(tjtsLHZkr z^Q8Sayi?jI;ce1>1wNc*$FmFfyU`y12RwqDuSY36{{QgXYbuw0Ux*pcs<}SS>z`HT zGsNN{Jp_b6LW zyim^XOKiU1&5ZYE`Y*ye$TQsjE>>t?<)v%;Yf!;=;K6Gvmwn%f8E@wb`CxpSJlXC4 z3A~*7G2hQ(>a(!V`pRX$XKVZ^Zh*b~TijoK4nK~Q-1epTqk~n-_LDgu-}yeyNpT=P zP5olGzCNCjS=lkae`=0*EB*?b@2fJt2S2`{GJhsq?ryls#>!>C_i6I}xGC!$;^t4{ z(d1#Slkh^E=z1Zp_MSceRVK%C-FzGFB>QzQ?j!yI>wf(Mk0kfzr*g`*`3?A}oPT3H zje2waFyn8BXG{CO71}?6Uzhs1_-$;y-^a91$0u$m|NTp||2N=m(%&wu<2{V`Nq=Xt zK0m81;QMZ+zZUqU^w$$#miABL?(%$|frGG_4>O)rTyG}V#4=ZNR^aW8tCd~9Ouh#< zm-=HkQu@1qo6z1ocWTm0;LE%plJ>3fJ>=&1noQms_m<F3AI8Me}jQf*&>+kogP$H}>Tm95v^c)axY5S}Fcjlw&nzv&g~7vlrc z-xhpW>c7M~-kQeWv+e$PdYcLTmC^>^X`8GjeNO6mvW+T`BzXFP5r^)vBS z8UJfI7kkf-^*Bn}e~SA_`=j^>_1C-SQ-b59K4201QR+kSY3j?z!|z>S-5)U(9ACl7 z6`YQBe{8AXuPXQy9>M|LLe zvEKhI!)emr2CVl#yYVjR?^#M3nCt7GxPbX6Ki^>IhGo3Ii8sD+?fGuQC6XUZ=k!S_9iyW*FyxgRwBkH;HvQ`d{} zL41eny*QNPnfn*>dUzH`iW{u(aR$kFy5eBQZ|?t1{}b^ja&P}UgYT8|e;&t^d;4v+ zslVACZv$>my?K2y{cXdEQoj?YNdLLGi`3`gG^sy?yOZ;Eo@Mc9#1@|KN=D!$k zmHz+0y~(}xyNt7?y|a?vhm+$6;5^BL@c`++E-sY*L+~K!{}y~g+PA<%rT^CWqU87D z;nIH;_P@!_e>Xfr`tOB<$i4aRhet{Ou{cEXQFyHMKMsdU{|R`U^#2TQBkiBZ zaTm#7#uKIgG~7@6UxuHS{#W2wX}<^I8pk~HJ1Lr#L3eB8$3h$ z{|=`~{u7=h{hz|CrT=qyw)Foe&Xo40c&_yCzl!}Oc@R#K{%hep>AyaHS^95;4@vuG zc%k%v2RHh`XM)H^NyV8Fu?jrp!#%rbjChPvA7^|2O=R^nV_wOZ!XsW9i>n&G|?kfIpS~tK)3x zzc$X5{%If{yXC;(!M7y zl=gjbRdR2AhvH(%N8w=U{|Q_w{Xd1Tm;Rr{{=A>}_RkBrp7cK-*OojDhe-c#;3nkW z^=&0?B>k_$VbXpxzD4@~2uDhui=(l3KlU3Qi@p2N;CFccNqg`9?;bo!>WAZ0aWc-7 z_G@uZ+I#nt`*8sGV_yG%<0r_y`^C_AIe+r<`@LYNCytc*NjR1IX72sgo47lFR9=)75rWWe_X+P@L)bK>(2R@&kw)CEAS1jkK^&* zR^i`Vl)qm%k3W&TQl^h{Og?YB0UsCNj8BW(;Hu(@A0 z<4eKMN&X&wP4dt1>*CXRIj-!scQ){PD|ub~uJ~TOUh3np_b~6L67U>8uQtyg^Zscz zUV#le>?%?`Syd0a~zca^6zz-a) z;)J?hgva2=TyMc&;ft;h;!b>CTi5l#_pUvk5xBumRm{t3S^v-A{wJ&OZ)D0nU+P2o z|5l65d~C1aFY)nTs?b;YdTrXo`|~qZ%0AC9>$hZ!k2ABx=F_)v|M{o&$PZZmE4IGJ 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 z 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�G|xdT3bx}QO^m@5 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 literal 0 HcmV?d00001 diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html deleted file mode 100644 index 9b679bc9..00000000 --- a/android/build/reports/problems/problems-report.html +++ /dev/null @@ -1,663 +0,0 @@ - - - - - - - - - - - - - Gradle Configuration Cache - - - -

- -
- Loading... -
- - - - - - diff --git a/pubspec.yaml b/pubspec.yaml index e1e4b3d3..00d9d42e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -90,13 +90,10 @@ dependencies: location: ^8.0.1 gms_check: ^1.0.4 huawei_location: ^6.14.2+301 - huawei_health: ^6.16.0+300 +# huawei_health: ^6.16.0+300 intl: ^0.20.2 flutter_widget_from_html: ^0.17.1 - huawei_map: - git: - url: https://github.com/fleoparra/hms-flutter-plugin.git - path: flutter-hms-map + huawei_map: ^6.12.0+301 scrollable_positioned_list: ^0.3.8 From 71ac91a07633bad9e9daccbb5ff80a3ad666c246 Mon Sep 17 00:00:00 2001 From: tahaalam Date: Mon, 2 Mar 2026 12:51:52 +0300 Subject: [PATCH 15/27] calender package added --- lib/core/utils/calender_utils_new.dart | 2 +- .../smartwatches/huawei_health_example.dart | 3126 ++++++++--------- package/device_calendar_plus/CHANGELOG.md | 52 + package/device_calendar_plus/LICENSE | 21 + package/device_calendar_plus/README.md | 381 ++ .../analysis_options.yaml | 4 + .../device_calendar_plus/example/README.md | 16 + .../example/README_INTEGRATION_TESTS.md | 43 + .../example/analysis_options.yaml | 28 + .../example/android/app/build.gradle.kts | 44 + .../android/app/src/debug/AndroidManifest.xml | 7 + .../android/app/src/main/AndroidManifest.xml | 47 + .../plugins/GeneratedPluginRegistrant.java | 29 + .../kotlin/to/bullet/example/MainActivity.kt | 5 + .../res/drawable-v21/launch_background.xml | 12 + .../main/res/drawable/launch_background.xml | 12 + .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 544 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 442 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 721 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 1031 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 1443 bytes .../app/src/main/res/values-night/styles.xml | 18 + .../app/src/main/res/values/styles.xml | 18 + .../app/src/profile/AndroidManifest.xml | 7 + .../example/android/build.gradle.kts | 24 + .../example/android/gradle.properties | 3 + .../gradle/wrapper/gradle-wrapper.properties | 5 + .../example/android/local.properties | 2 + .../example/android/settings.gradle.kts | 26 + .../device_calendar_test.dart | 862 +++++ .../integration_test_driver.dart | 51 + .../ios/Flutter/AppFrameworkInfo.plist | 26 + .../example/ios/Flutter/Debug.xcconfig | 2 + .../example/ios/Flutter/Generated.xcconfig | 15 + .../example/ios/Flutter/Release.xcconfig | 2 + .../Flutter/ephemeral/flutter_lldb_helper.py | 32 + .../ios/Flutter/ephemeral/flutter_lldbinit | 5 + .../ios/Flutter/flutter_export_environment.sh | 14 + .../device_calendar_plus/example/ios/Podfile | 43 + .../example/ios/Podfile.lock | 28 + .../ios/Runner.xcodeproj/project.pbxproj | 731 ++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 101 + .../contents.xcworkspacedata | 10 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/WorkspaceSettings.xcsettings | 8 + .../example/ios/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 122 + .../Icon-App-1024x1024@1x.png | Bin 0 -> 10932 bytes .../AppIcon.appiconset/Icon-App-20x20@1x.png | Bin 0 -> 295 bytes .../AppIcon.appiconset/Icon-App-20x20@2x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-20x20@3x.png | Bin 0 -> 450 bytes .../AppIcon.appiconset/Icon-App-29x29@1x.png | Bin 0 -> 282 bytes .../AppIcon.appiconset/Icon-App-29x29@2x.png | Bin 0 -> 462 bytes .../AppIcon.appiconset/Icon-App-29x29@3x.png | Bin 0 -> 704 bytes .../AppIcon.appiconset/Icon-App-40x40@1x.png | Bin 0 -> 406 bytes .../AppIcon.appiconset/Icon-App-40x40@2x.png | Bin 0 -> 586 bytes .../AppIcon.appiconset/Icon-App-40x40@3x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@2x.png | Bin 0 -> 862 bytes .../AppIcon.appiconset/Icon-App-60x60@3x.png | Bin 0 -> 1674 bytes .../AppIcon.appiconset/Icon-App-76x76@1x.png | Bin 0 -> 762 bytes .../AppIcon.appiconset/Icon-App-76x76@2x.png | Bin 0 -> 1226 bytes .../Icon-App-83.5x83.5@2x.png | Bin 0 -> 1418 bytes .../LaunchImage.imageset/Contents.json | 23 + .../LaunchImage.imageset/LaunchImage.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@2x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/LaunchImage@3x.png | Bin 0 -> 68 bytes .../LaunchImage.imageset/README.md | 5 + .../Runner/Base.lproj/LaunchScreen.storyboard | 37 + .../ios/Runner/Base.lproj/Main.storyboard | 26 + .../ios/Runner/GeneratedPluginRegistrant.h | 19 + .../ios/Runner/GeneratedPluginRegistrant.m | 28 + .../example/ios/Runner/Info.plist | 53 + .../ios/Runner/Runner-Bridging-Header.h | 1 + .../example/ios/RunnerTests/RunnerTests.swift | 12 + .../example/lib/main.dart | 912 +++++ .../example/linux/CMakeLists.txt | 128 + .../example/linux/flutter/CMakeLists.txt | 88 + .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../linux/flutter/generated_plugins.cmake | 23 + .../example/linux/runner/CMakeLists.txt | 26 + .../example/linux/runner/main.cc | 6 + .../example/linux/runner/my_application.cc | 144 + .../example/linux/runner/my_application.h | 18 + .../macos/Flutter/Flutter-Debug.xcconfig | 2 + .../macos/Flutter/Flutter-Release.xcconfig | 2 + .../Flutter/GeneratedPluginRegistrant.swift | 10 + .../ephemeral/Flutter-Generated.xcconfig | 12 + .../ephemeral/flutter_export_environment.sh | 13 + .../example/macos/Podfile | 42 + .../macos/Runner.xcodeproj/project.pbxproj | 705 ++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../xcshareddata/xcschemes/Runner.xcscheme | 99 + .../contents.xcworkspacedata | 7 + .../xcshareddata/IDEWorkspaceChecks.plist | 8 + .../example/macos/Runner/AppDelegate.swift | 13 + .../AppIcon.appiconset/Contents.json | 68 + .../AppIcon.appiconset/app_icon_1024.png | Bin 0 -> 102994 bytes .../AppIcon.appiconset/app_icon_128.png | Bin 0 -> 5680 bytes .../AppIcon.appiconset/app_icon_16.png | Bin 0 -> 520 bytes .../AppIcon.appiconset/app_icon_256.png | Bin 0 -> 14142 bytes .../AppIcon.appiconset/app_icon_32.png | Bin 0 -> 1066 bytes .../AppIcon.appiconset/app_icon_512.png | Bin 0 -> 36406 bytes .../AppIcon.appiconset/app_icon_64.png | Bin 0 -> 2218 bytes .../macos/Runner/Base.lproj/MainMenu.xib | 343 ++ .../macos/Runner/Configs/AppInfo.xcconfig | 14 + .../macos/Runner/Configs/Debug.xcconfig | 2 + .../macos/Runner/Configs/Release.xcconfig | 2 + .../macos/Runner/Configs/Warnings.xcconfig | 13 + .../macos/Runner/DebugProfile.entitlements | 12 + .../example/macos/Runner/Info.plist | 32 + .../macos/Runner/MainFlutterWindow.swift | 15 + .../example/macos/Runner/Release.entitlements | 8 + .../macos/RunnerTests/RunnerTests.swift | 12 + .../device_calendar_plus/example/pubspec.lock | 307 ++ .../device_calendar_plus/example/pubspec.yaml | 95 + .../example/run_integration_tests.sh | 122 + .../example/web/favicon.png | Bin 0 -> 917 bytes .../example/web/icons/Icon-192.png | Bin 0 -> 5292 bytes .../example/web/icons/Icon-512.png | Bin 0 -> 8252 bytes .../example/web/icons/Icon-maskable-192.png | Bin 0 -> 5594 bytes .../example/web/icons/Icon-maskable-512.png | Bin 0 -> 20998 bytes .../example/web/index.html | 38 + .../example/web/manifest.json | 35 + .../example/windows/CMakeLists.txt | 108 + .../example/windows/flutter/CMakeLists.txt | 109 + .../flutter/generated_plugin_registrant.cc | 11 + .../flutter/generated_plugin_registrant.h | 15 + .../windows/flutter/generated_plugins.cmake | 23 + .../example/windows/runner/CMakeLists.txt | 40 + .../example/windows/runner/Runner.rc | 121 + .../example/windows/runner/flutter_window.cpp | 71 + .../example/windows/runner/flutter_window.h | 33 + .../example/windows/runner/main.cpp | 43 + .../example/windows/runner/resource.h | 16 + .../windows/runner/resources/app_icon.ico | Bin 0 -> 33772 bytes .../windows/runner/runner.exe.manifest | 14 + .../example/windows/runner/utils.cpp | 65 + .../example/windows/runner/utils.h | 19 + .../example/windows/runner/win32_window.cpp | 288 ++ .../example/windows/runner/win32_window.h | 102 + .../lib/device_calendar_plus.dart | 767 ++++ .../lib/src/calendar.dart | 127 + .../lib/src/calendar_permission_status.dart | 32 + .../lib/src/device_calendar_error.dart | 62 + .../device_calendar_plus/lib/src/event.dart | 182 + .../lib/src/event_availability.dart | 36 + .../lib/src/event_status.dart | 31 + .../lib/src/platform_exception_codes.dart | 65 + .../lib/src/platform_exception_converter.dart | 53 + .../device_calendar_plus_android/CHANGELOG.md | 32 + .../device_calendar_plus_android/LICENSE | 21 + .../device_calendar_plus_android/README.md | 20 + .../analysis_options.yaml | 4 + .../android/build.gradle | 72 + .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43739 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 + .../android/gradlew | 251 ++ .../android/gradlew.bat | 94 + .../android/proguard-rules.pro | 5 + .../android/settings.gradle | 1 + .../android/src/main/AndroidManifest.xml | 3 + .../CalendarService.kt | 281 ++ .../ColorHelper.kt | 23 + .../DeviceCalendarPlusAndroidPlugin.kt | 503 +++ .../EventsService.kt | 764 ++++ .../PermissionService.kt | 121 + .../PlatformExceptionCodes.kt | 82 + .../DeviceCalendarPlusAndroidPluginTest.kt | 27 + .../lib/device_calendar_plus_android.dart | 175 + .../device_calendar_plus_android/pubspec.lock | 220 ++ .../device_calendar_plus_android/pubspec.yaml | 64 + .../device_calendar_plus_android_test.dart | 313 ++ .../device_calendar_plus_ios/CHANGELOG.md | 30 + .../package/device_calendar_plus_ios/LICENSE | 21 + .../device_calendar_plus_ios/README.md | 20 + .../analysis_options.yaml | 4 + .../ios/Classes/CalendarService.swift | 204 ++ .../ios/Classes/ColorHelper.swift | 31 + .../Classes/DeviceCalendarPlusIosPlugin.swift | 542 +++ .../ios/Classes/EventsService.swift | 520 +++ .../ios/Classes/PermissionService.swift | 160 + .../ios/Classes/PlatformExceptionCodes.swift | 62 + .../ios/Resources/PrivacyInfo.xcprivacy | 14 + .../ios/device_calendar_plus_ios.podspec | 29 + .../lib/device_calendar_plus_ios.dart | 177 + .../device_calendar_plus_ios/pubspec.yaml | 63 + .../test/device_calendar_plus_ios_test.dart | 312 ++ .../CHANGELOG.md | 28 + .../LICENSE | 21 + .../README.md | 25 + .../analysis_options.yaml | 4 + ...vice_calendar_plus_platform_interface.dart | 201 ++ .../pubspec.yaml | 56 + ...calendar_plus_platform_interface_test.dart | 225 ++ package/device_calendar_plus/pubspec.lock | 237 ++ package/device_calendar_plus/pubspec.yaml | 77 + .../test/device_calendar_plus_test.dart | 1348 +++++++ pubspec.yaml | 3 +- 202 files changed, 18007 insertions(+), 1565 deletions(-) create mode 100644 package/device_calendar_plus/CHANGELOG.md create mode 100644 package/device_calendar_plus/LICENSE create mode 100644 package/device_calendar_plus/README.md create mode 100644 package/device_calendar_plus/analysis_options.yaml create mode 100644 package/device_calendar_plus/example/README.md create mode 100644 package/device_calendar_plus/example/README_INTEGRATION_TESTS.md create mode 100644 package/device_calendar_plus/example/analysis_options.yaml create mode 100644 package/device_calendar_plus/example/android/app/build.gradle.kts create mode 100644 package/device_calendar_plus/example/android/app/src/debug/AndroidManifest.xml create mode 100644 package/device_calendar_plus/example/android/app/src/main/AndroidManifest.xml create mode 100644 package/device_calendar_plus/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java create mode 100644 package/device_calendar_plus/example/android/app/src/main/kotlin/to/bullet/example/MainActivity.kt create mode 100644 package/device_calendar_plus/example/android/app/src/main/res/drawable-v21/launch_background.xml create mode 100644 package/device_calendar_plus/example/android/app/src/main/res/drawable/launch_background.xml create mode 100644 package/device_calendar_plus/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 package/device_calendar_plus/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 package/device_calendar_plus/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 package/device_calendar_plus/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 package/device_calendar_plus/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png create mode 100644 package/device_calendar_plus/example/android/app/src/main/res/values-night/styles.xml create mode 100644 package/device_calendar_plus/example/android/app/src/main/res/values/styles.xml create mode 100644 package/device_calendar_plus/example/android/app/src/profile/AndroidManifest.xml create mode 100644 package/device_calendar_plus/example/android/build.gradle.kts create mode 100644 package/device_calendar_plus/example/android/gradle.properties create mode 100644 package/device_calendar_plus/example/android/gradle/wrapper/gradle-wrapper.properties create mode 100644 package/device_calendar_plus/example/android/local.properties create mode 100644 package/device_calendar_plus/example/android/settings.gradle.kts create mode 100644 package/device_calendar_plus/example/integration_test/device_calendar_test.dart create mode 100644 package/device_calendar_plus/example/integration_test/integration_test_driver.dart create mode 100644 package/device_calendar_plus/example/ios/Flutter/AppFrameworkInfo.plist create mode 100644 package/device_calendar_plus/example/ios/Flutter/Debug.xcconfig create mode 100644 package/device_calendar_plus/example/ios/Flutter/Generated.xcconfig create mode 100644 package/device_calendar_plus/example/ios/Flutter/Release.xcconfig create mode 100644 package/device_calendar_plus/example/ios/Flutter/ephemeral/flutter_lldb_helper.py create mode 100644 package/device_calendar_plus/example/ios/Flutter/ephemeral/flutter_lldbinit create mode 100755 package/device_calendar_plus/example/ios/Flutter/flutter_export_environment.sh create mode 100644 package/device_calendar_plus/example/ios/Podfile create mode 100644 package/device_calendar_plus/example/ios/Podfile.lock create mode 100644 package/device_calendar_plus/example/ios/Runner.xcodeproj/project.pbxproj create mode 100644 package/device_calendar_plus/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 package/device_calendar_plus/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 package/device_calendar_plus/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 package/device_calendar_plus/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 package/device_calendar_plus/example/ios/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 package/device_calendar_plus/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 package/device_calendar_plus/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings create mode 100644 package/device_calendar_plus/example/ios/Runner/AppDelegate.swift create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png create mode 100644 package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md create mode 100644 package/device_calendar_plus/example/ios/Runner/Base.lproj/LaunchScreen.storyboard create mode 100644 package/device_calendar_plus/example/ios/Runner/Base.lproj/Main.storyboard create mode 100644 package/device_calendar_plus/example/ios/Runner/GeneratedPluginRegistrant.h create mode 100644 package/device_calendar_plus/example/ios/Runner/GeneratedPluginRegistrant.m create mode 100644 package/device_calendar_plus/example/ios/Runner/Info.plist create mode 100644 package/device_calendar_plus/example/ios/Runner/Runner-Bridging-Header.h create mode 100644 package/device_calendar_plus/example/ios/RunnerTests/RunnerTests.swift create mode 100644 package/device_calendar_plus/example/lib/main.dart create mode 100644 package/device_calendar_plus/example/linux/CMakeLists.txt create mode 100644 package/device_calendar_plus/example/linux/flutter/CMakeLists.txt create mode 100644 package/device_calendar_plus/example/linux/flutter/generated_plugin_registrant.cc create mode 100644 package/device_calendar_plus/example/linux/flutter/generated_plugin_registrant.h create mode 100644 package/device_calendar_plus/example/linux/flutter/generated_plugins.cmake create mode 100644 package/device_calendar_plus/example/linux/runner/CMakeLists.txt create mode 100644 package/device_calendar_plus/example/linux/runner/main.cc create mode 100644 package/device_calendar_plus/example/linux/runner/my_application.cc create mode 100644 package/device_calendar_plus/example/linux/runner/my_application.h create mode 100644 package/device_calendar_plus/example/macos/Flutter/Flutter-Debug.xcconfig create mode 100644 package/device_calendar_plus/example/macos/Flutter/Flutter-Release.xcconfig create mode 100644 package/device_calendar_plus/example/macos/Flutter/GeneratedPluginRegistrant.swift create mode 100644 package/device_calendar_plus/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig create mode 100755 package/device_calendar_plus/example/macos/Flutter/ephemeral/flutter_export_environment.sh create mode 100644 package/device_calendar_plus/example/macos/Podfile create mode 100644 package/device_calendar_plus/example/macos/Runner.xcodeproj/project.pbxproj create mode 100644 package/device_calendar_plus/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 package/device_calendar_plus/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme create mode 100644 package/device_calendar_plus/example/macos/Runner.xcworkspace/contents.xcworkspacedata create mode 100644 package/device_calendar_plus/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 package/device_calendar_plus/example/macos/Runner/AppDelegate.swift create mode 100644 package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png create mode 100644 package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png create mode 100644 package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png create mode 100644 package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png create mode 100644 package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png create mode 100644 package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png create mode 100644 package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png create mode 100644 package/device_calendar_plus/example/macos/Runner/Base.lproj/MainMenu.xib create mode 100644 package/device_calendar_plus/example/macos/Runner/Configs/AppInfo.xcconfig create mode 100644 package/device_calendar_plus/example/macos/Runner/Configs/Debug.xcconfig create mode 100644 package/device_calendar_plus/example/macos/Runner/Configs/Release.xcconfig create mode 100644 package/device_calendar_plus/example/macos/Runner/Configs/Warnings.xcconfig create mode 100644 package/device_calendar_plus/example/macos/Runner/DebugProfile.entitlements create mode 100644 package/device_calendar_plus/example/macos/Runner/Info.plist create mode 100644 package/device_calendar_plus/example/macos/Runner/MainFlutterWindow.swift create mode 100644 package/device_calendar_plus/example/macos/Runner/Release.entitlements create mode 100644 package/device_calendar_plus/example/macos/RunnerTests/RunnerTests.swift create mode 100644 package/device_calendar_plus/example/pubspec.lock create mode 100644 package/device_calendar_plus/example/pubspec.yaml create mode 100755 package/device_calendar_plus/example/run_integration_tests.sh create mode 100644 package/device_calendar_plus/example/web/favicon.png create mode 100644 package/device_calendar_plus/example/web/icons/Icon-192.png create mode 100644 package/device_calendar_plus/example/web/icons/Icon-512.png create mode 100644 package/device_calendar_plus/example/web/icons/Icon-maskable-192.png create mode 100644 package/device_calendar_plus/example/web/icons/Icon-maskable-512.png create mode 100644 package/device_calendar_plus/example/web/index.html create mode 100644 package/device_calendar_plus/example/web/manifest.json create mode 100644 package/device_calendar_plus/example/windows/CMakeLists.txt create mode 100644 package/device_calendar_plus/example/windows/flutter/CMakeLists.txt create mode 100644 package/device_calendar_plus/example/windows/flutter/generated_plugin_registrant.cc create mode 100644 package/device_calendar_plus/example/windows/flutter/generated_plugin_registrant.h create mode 100644 package/device_calendar_plus/example/windows/flutter/generated_plugins.cmake create mode 100644 package/device_calendar_plus/example/windows/runner/CMakeLists.txt create mode 100644 package/device_calendar_plus/example/windows/runner/Runner.rc create mode 100644 package/device_calendar_plus/example/windows/runner/flutter_window.cpp create mode 100644 package/device_calendar_plus/example/windows/runner/flutter_window.h create mode 100644 package/device_calendar_plus/example/windows/runner/main.cpp create mode 100644 package/device_calendar_plus/example/windows/runner/resource.h create mode 100644 package/device_calendar_plus/example/windows/runner/resources/app_icon.ico create mode 100644 package/device_calendar_plus/example/windows/runner/runner.exe.manifest create mode 100644 package/device_calendar_plus/example/windows/runner/utils.cpp create mode 100644 package/device_calendar_plus/example/windows/runner/utils.h create mode 100644 package/device_calendar_plus/example/windows/runner/win32_window.cpp create mode 100644 package/device_calendar_plus/example/windows/runner/win32_window.h create mode 100644 package/device_calendar_plus/lib/device_calendar_plus.dart create mode 100644 package/device_calendar_plus/lib/src/calendar.dart create mode 100644 package/device_calendar_plus/lib/src/calendar_permission_status.dart create mode 100644 package/device_calendar_plus/lib/src/device_calendar_error.dart create mode 100644 package/device_calendar_plus/lib/src/event.dart create mode 100644 package/device_calendar_plus/lib/src/event_availability.dart create mode 100644 package/device_calendar_plus/lib/src/event_status.dart create mode 100644 package/device_calendar_plus/lib/src/platform_exception_codes.dart create mode 100644 package/device_calendar_plus/lib/src/platform_exception_converter.dart create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/CHANGELOG.md create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/LICENSE create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/README.md create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/analysis_options.yaml create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/build.gradle create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/gradle/wrapper/gradle-wrapper.jar create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/gradle/wrapper/gradle-wrapper.properties create mode 100755 package/device_calendar_plus/package/device_calendar_plus_android/android/gradlew create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/gradlew.bat create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/proguard-rules.pro create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/settings.gradle create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/AndroidManifest.xml create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/CalendarService.kt create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/ColorHelper.kt create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/DeviceCalendarPlusAndroidPlugin.kt create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/EventsService.kt create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/PermissionService.kt create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/PlatformExceptionCodes.kt create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/android/src/test/kotlin/to/bullet/device_calendar_plus_android/DeviceCalendarPlusAndroidPluginTest.kt create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/lib/device_calendar_plus_android.dart create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/pubspec.lock create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/pubspec.yaml create mode 100644 package/device_calendar_plus/package/device_calendar_plus_android/test/device_calendar_plus_android_test.dart create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/CHANGELOG.md create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/LICENSE create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/README.md create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/analysis_options.yaml create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/CalendarService.swift create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/ColorHelper.swift create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/DeviceCalendarPlusIosPlugin.swift create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/EventsService.swift create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/PermissionService.swift create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/PlatformExceptionCodes.swift create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/ios/Resources/PrivacyInfo.xcprivacy create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/ios/device_calendar_plus_ios.podspec create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/lib/device_calendar_plus_ios.dart create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/pubspec.yaml create mode 100644 package/device_calendar_plus/package/device_calendar_plus_ios/test/device_calendar_plus_ios_test.dart create mode 100644 package/device_calendar_plus/package/device_calendar_plus_platform_interface/CHANGELOG.md create mode 100644 package/device_calendar_plus/package/device_calendar_plus_platform_interface/LICENSE create mode 100644 package/device_calendar_plus/package/device_calendar_plus_platform_interface/README.md create mode 100644 package/device_calendar_plus/package/device_calendar_plus_platform_interface/analysis_options.yaml create mode 100644 package/device_calendar_plus/package/device_calendar_plus_platform_interface/lib/device_calendar_plus_platform_interface.dart create mode 100644 package/device_calendar_plus/package/device_calendar_plus_platform_interface/pubspec.yaml create mode 100644 package/device_calendar_plus/package/device_calendar_plus_platform_interface/test/device_calendar_plus_platform_interface_test.dart create mode 100644 package/device_calendar_plus/pubspec.lock create mode 100644 package/device_calendar_plus/pubspec.yaml create mode 100644 package/device_calendar_plus/test/device_calendar_plus_test.dart diff --git a/lib/core/utils/calender_utils_new.dart b/lib/core/utils/calender_utils_new.dart index 5e9e91b2..9edfdced 100644 --- a/lib/core/utils/calender_utils_new.dart +++ b/lib/core/utils/calender_utils_new.dart @@ -51,7 +51,7 @@ class CalenderUtilsNew { startDate: scheduleDateTime!, endDate: scheduleDateTime!.add(Duration(minutes: 30)), - // reminderMinutes: reminderMinutes, // TODO : NEED TO CONFIRM THIS FROM TAHA + reminderMinutes: reminderMinutes, // TODO : NEED TO CONFIRM THIS FROM TAHA ); return eventResult.isNotEmpty; // } diff --git a/lib/presentation/smartwatches/huawei_health_example.dart b/lib/presentation/smartwatches/huawei_health_example.dart index 4163d8b0..bf569a6a 100644 --- a/lib/presentation/smartwatches/huawei_health_example.dart +++ b/lib/presentation/smartwatches/huawei_health_example.dart @@ -1,1563 +1,1563 @@ -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:huawei_health/huawei_health.dart'; - -const String packageName = 'com.ejada.hmg'; - -class HuaweiHealthExample extends StatefulWidget { - const HuaweiHealthExample({Key? key}) : super(key: key); - - @override - State createState() => _HuaweiHealthExampleState(); -} - -class _HuaweiHealthExampleState extends State { - /// Styles - static const TextStyle cardTitleTextStyle = TextStyle( - fontWeight: FontWeight.w500, - fontSize: 18, - ); - static const EdgeInsets componentPadding = EdgeInsets.all(8.0); - - /// Text Controllers for showing the logs of different modules - final TextEditingController _activityTextController = TextEditingController(); - final TextEditingController _dataTextController = TextEditingController(); - final TextEditingController _settingTextController = TextEditingController(); - final TextEditingController _autoRecorderTextController = TextEditingController(); - final TextEditingController _consentTextController = TextEditingController(); - final TextEditingController _healthTextController = TextEditingController(); - - /// Data controller reference to initialize at startup. - late DataController _dataController; - - String? accessToken = ''; - - @override - void initState() { - super.initState(); - if (!mounted) return; - // Initialize Event Callbacks - AutoRecorderController.autoRecorderStream.listen(_onAutoRecorderEvent); - // Initialize a DataController - initDataController(); - } - - /// Prints the specified text on both the console and the specified text controller. - void log( - String methodName, - TextEditingController controller, - LogOptions logOption, { - String? result = '', - String? error = '', - }) { - String log = ''; - switch (logOption) { - case LogOptions.call: - log = '$methodName called'; - break; - case LogOptions.success: - log = '$methodName [Success: $result] '; - break; - case LogOptions.error: - log = '$methodName [Error: $error] [Error Description: ${HiHealthStatusCodes.getStatusCodeMessage(error ?? '')}]'; - break; - case LogOptions.custom: - log = methodName; // Custom text - break; - } - debugPrint(log); - setState(() { - controller.text = '$log\n${controller.text}'; - }); - } - - /// Authorizes Huawei Health Kit for the user, with defined scopes. - void signIn() async { - // List of scopes to ask for authorization. - // - // Note: These scopes should also be authorized on the Huawei Developer Console. - final List scopes = [ - Scope.HEALTHKIT_ACTIVITY_READ, - Scope.HEALTHKIT_ACTIVITY_WRITE, - Scope.HEALTHKIT_BLOODGLUCOSE_READ, - Scope.HEALTHKIT_BLOODGLUCOSE_WRITE, - Scope.HEALTHKIT_CALORIES_READ, - Scope.HEALTHKIT_CALORIES_WRITE, - Scope.HEALTHKIT_DISTANCE_READ, - Scope.HEALTHKIT_DISTANCE_WRITE, - Scope.HEALTHKIT_HEARTRATE_READ, - Scope.HEALTHKIT_HEARTRATE_WRITE, - Scope.HEALTHKIT_HEIGHTWEIGHT_READ, - Scope.HEALTHKIT_HEIGHTWEIGHT_WRITE, - Scope.HEALTHKIT_LOCATION_READ, - Scope.HEALTHKIT_LOCATION_WRITE, - Scope.HEALTHKIT_PULMONARY_READ, - Scope.HEALTHKIT_PULMONARY_WRITE, - Scope.HEALTHKIT_SLEEP_READ, - Scope.HEALTHKIT_SLEEP_WRITE, - Scope.HEALTHKIT_SPEED_READ, - Scope.HEALTHKIT_SPEED_WRITE, - Scope.HEALTHKIT_STEP_READ, - Scope.HEALTHKIT_STEP_WRITE, - Scope.HEALTHKIT_STRENGTH_READ, - Scope.HEALTHKIT_STRENGTH_WRITE, - Scope.HEALTHKIT_BODYFAT_READ, - Scope.HEALTHKIT_BODYFAT_WRITE, - Scope.HEALTHKIT_NUTRITION_READ, - Scope.HEALTHKIT_NUTRITION_WRITE, - Scope.HEALTHKIT_BLOODPRESSURE_READ, - Scope.HEALTHKIT_BLOODPRESSURE_WRITE, - Scope.HEALTHKIT_BODYTEMPERATURE_READ, - Scope.HEALTHKIT_BODYTEMPERATURE_WRITE, - Scope.HEALTHKIT_OXYGENSTATURATION_READ, - Scope.HEALTHKIT_OXYGENSTATURATION_WRITE, - Scope.HEALTHKIT_REPRODUCTIVE_READ, - Scope.HEALTHKIT_REPRODUCTIVE_WRITE, - Scope.HEALTHKIT_ACTIVITY_RECORD_READ, - Scope.HEALTHKIT_ACTIVITY_RECORD_WRITE, - Scope.HEALTHKIT_HEARTRATE_REALTIME, - Scope.HEALTHKIT_STEP_REALTIME, - Scope.HEALTHKIT_HEARTHEALTH_WRITE, - Scope.HEALTHKIT_HEARTHEALTH_READ, - Scope.HEALTHKIT_STRESS_WRITE, - Scope.HEALTHKIT_STRESS_READ, - Scope.HEALTHKIT_OXYGEN_SATURATION_WRITE, - Scope.HEALTHKIT_OXYGEN_SATURATION_READ, - Scope.HEALTHKIT_HISTORYDATA_OPEN_WEEK, - Scope.HEALTHKIT_HISTORYDATA_OPEN_MONTH, - Scope.HEALTHKIT_HISTORYDATA_OPEN_YEAR, - ]; - try { - AuthHuaweiId? result = await HealthAuth.signIn(scopes); - debugPrint( - 'Granted Scopes for User(${result?.displayName}): ${result?.grantedScopes?.toString()}', - ); - showSnackBar( - 'Authorization Success.', - color: Colors.green, - ); - setState(() => accessToken = result?.accessToken); - } on PlatformException catch (e) { - debugPrint('Error on authorization, Error:${e.toString()}'); - showSnackBar( - 'Error on authorization, Error:${e.toString()}, Error Description: ' - '${HiHealthStatusCodes.getStatusCodeMessage(e.message ?? '')}', - ); - } - } - - // ActivityRecordsController - // - /// Adds an ActivityRecord with an ActivitySummary, time range is 2 hours from now. - Future addActivityRecord() async { - log( - 'addActivityRecord', - _activityTextController, - LogOptions.call, - ); - DateTime startTime = DateTime.now().subtract(const Duration(hours: 2)); - DateTime endTime = DateTime.now(); - // Build an ActivityRecord object - ActivityRecord activityRecord = ActivityRecord( - startTime: startTime, - endTime: endTime, - id: 'ActivityRecordId0', - name: 'AddActivityRecord', - activityTypeId: HiHealthActivities.running, - description: 'This is a test for ActivityRecord', - activitySummary: ActivitySummary( - paceSummary: PaceSummary( - avgPace: 247.27626, - bestPace: 212.0, - britishPaceMap: { - '102802480': 365.0, - }, - britishPartTimeMap: { - '1.0': 263.0, - }, - partTimeMap: { - '1.0': 456.0, - }, - paceMap: { - '1.0': 263.0, - }, - ), - dataSummary: [ - SamplePoint( - dataType: DataType.DT_CONTINUOUS_DISTANCE_TOTAL, - startTime: startTime.add(Duration(seconds: 1)), - endTime: endTime.subtract(Duration(seconds: 1)), - fieldValueOptions: FieldFloat(Field.FIELD_DISTANCE, 400), - timeUnit: TimeUnit.MILLISECONDS, - ), - SamplePoint( - dataType: DataType.POLYMERIZE_CONTINUOUS_SPEED_STATISTICS, - fieldValueOptions: FieldFloat(Field.FIELD_AVG, 60.0), - startTime: startTime.add(Duration(seconds: 1)), - endTime: endTime.subtract(Duration(seconds: 1)), - timeUnit: TimeUnit.MILLISECONDS, - ) - ..setFieldValue(Field.FIELD_MIN, 40.0) - ..setFieldValue(Field.FIELD_MAX, 80.0), - ]), - ); - - // Build the dataCollector object - DataCollector dataCollector = DataCollector( - dataGenerateType: DataGenerateType.DATA_TYPE_RAW, - dataType: DataType.DT_INSTANTANEOUS_STEPS_RATE, - name: 'AddActivityRecord1923', - ); - - // You can use sampleSets to add more sample points to the sampling dataset. - // Build a list of sampling point objects and add it to the sampling dataSet - List samplePoints = [ - SamplePoint( - dataCollector: dataCollector, - startTime: startTime.add(Duration(seconds: 1)), - endTime: endTime.subtract(Duration(seconds: 1)), - fieldValueOptions: FieldFloat(Field.FIELD_STEP_RATE, 10.0), - timeUnit: TimeUnit.MILLISECONDS, - ), - ]; - SampleSet sampleSet = SampleSet( - dataCollector, - samplePoints, - ); - - try { - await ActivityRecordsController.addActivityRecord( - ActivityRecordInsertOptions( - activityRecord: activityRecord, - sampleSets: [ - sampleSet, - ], - ), - ); - log( - 'addActivityRecord', - _activityTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'addActivityRecord', - _activityTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Obtains saved ActivityRecords between yesterday and now, - /// with the DT_CONTINUOUS_STEPS_DELTA data type - void getActivityRecord() async { - log( - 'getActivityRecord', - _activityTextController, - LogOptions.call, - ); - // Create start time that will be used to read activity record. - DateTime startTime = DateTime.now().subtract(const Duration(days: 1)); - - // Create end time that will be used to read activity record. - DateTime endTime = DateTime.now().add(const Duration(hours: 3)); - - ActivityRecordReadOptions activityRecordReadOptions = ActivityRecordReadOptions( - activityRecordId: "ActivityRecordId0", - activityRecordName: null, - startTime: startTime, - endTime: endTime, - timeUnit: TimeUnit.MILLISECONDS, - dataType: DataType.DT_INSTANTANEOUS_STEPS_RATE, - ); - try { - List result = await ActivityRecordsController.getActivityRecord( - activityRecordReadOptions, - ); - log( - 'getActivityRecord', - _activityTextController, - LogOptions.success, - result: '[IDs: ${result.map((ActivityRecord e) => e.id).toList()}]', - ); - } on PlatformException catch (e) { - log( - 'getActivityRecord', - _activityTextController, - LogOptions.error, - result: e.message, - ); - } - } - - /// Starts the ActivityRecord with the id:`ActivityRecordRun1` - void beginActivityRecord() async { - try { - log( - 'beginActivityRecord', - _activityTextController, - LogOptions.call, - ); - // Build an ActivityRecord object - ActivityRecord activityRecord = ActivityRecord( - id: 'ActivityRecordRun0', - name: 'BeginActivityRecord', - description: 'This is ActivityRecord begin test!', - activityTypeId: HiHealthActivities.running, - startTime: DateTime.now().subtract(const Duration(hours: 1)), - ); - await ActivityRecordsController.beginActivityRecord( - activityRecord, - ); - log( - 'beginActivityRecord', - _activityTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'beginActivityRecord', - _activityTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Stops the ActivityRecord with the id:`ActivityRecordRun1` - void endActivityRecord() async { - try { - log( - 'endActivityRecord', - _activityTextController, - LogOptions.call, - ); - final List result = await ActivityRecordsController.endActivityRecord( - 'ActivityRecordRun0', - ); - // Return the list of activity records that have stopped - log( - 'endActivityRecord', - _activityTextController, - LogOptions.success, - result: result.toString(), - ); - } on PlatformException catch (e) { - log( - 'endActivityRecord', - _activityTextController, - LogOptions.error, - result: e.message, - ); - } - } - - /// Ends all the ongoing activity records. - /// - /// Result list will be null if there is no ongoing activity record. - void endAllActivityRecords() async { - try { - log( - 'endAllActivityRecords', - _activityTextController, - LogOptions.call, - ); - // Return the list of activity records that have stopped - List result = await ActivityRecordsController.endAllActivityRecords(); - log( - 'endAllActivityRecords', - _activityTextController, - LogOptions.success, - result: '[IDs: ${result.map((ActivityRecord e) => e.id).toList()}]', - ); - } on PlatformException catch (e) { - log( - 'endAllActivityRecords', - _activityTextController, - LogOptions.error, - result: e.message, - ); - } - } - - // - // - // End of ActivityRecordsController Methods - - // DataController Methods - // - // - /// Initializes a DataController instance with a list of HiHealtOptions. - void initDataController() async { - if (!mounted) return; - log( - 'init', - _dataTextController, - LogOptions.call, - ); - try { - _dataController = await DataController.init(); - log( - 'init', - _dataTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'init', - _dataTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Clears all the data inserted by the app. - void clearAll() async { - log('clearAll', _dataTextController, LogOptions.call); - try { - await _dataController.clearAll(); - log('clearAll', _dataTextController, LogOptions.success); - } on PlatformException catch (e) { - log('clearAll', _dataTextController, LogOptions.error, error: e.message); - } - } - - /// Deletes DT_CONTINUOUS_STEPS_DELTA type data by the specified time range. - void delete() async { - log( - 'delete', - _dataTextController, - LogOptions.call, - ); - // Build the dataCollector object - DataCollector dataCollector = DataCollector( - dataType: DataType.DT_CONTINUOUS_STEPS_DELTA, - dataGenerateType: DataGenerateType.DATA_TYPE_RAW, - dataStreamName: 'STEPS_DELTA', - ); - - // Build the time range for the deletion: start time and end time. - DeleteOptions deleteOptions = DeleteOptions( - dataCollectors: [dataCollector], - startTime: DateTime.parse('2020-10-10 08:00:00'), - endTime: DateTime.parse('2020-10-10 12:30:00'), - ); - - // Call the api with the constructed DeleteOptions instance. - try { - _dataController.delete(deleteOptions); - log( - 'delete', - _dataTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'delete', - _dataTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Inserts a sampling set with the DT_CONTINUOUS_STEPS_DELTA data type at the - /// specified start and end dates. - void insert() async { - log( - 'insert', - _dataTextController, - LogOptions.call, - ); - // Build the dataCollector object - DataCollector dataCollector = DataCollector( - dataType: DataType.DT_CONTINUOUS_STEPS_DELTA, - dataStreamName: 'STEPS_DELTA', - dataGenerateType: DataGenerateType.DATA_TYPE_RAW, - ); - // You can use sampleSets to add more sampling points to the sampling dataset. - SampleSet sampleSet = SampleSet( - dataCollector, - [ - SamplePoint( - dataCollector: dataCollector, - startTime: DateTime.parse('2020-10-10 12:00:00'), - endTime: DateTime.parse('2020-10-10 12:12:00'), - fieldValueOptions: FieldInt( - Field.FIELD_STEPS_DELTA, - 100, - ), - ), - ], - ); - // Call the api with the constructed sample set. - try { - _dataController.insert(sampleSet); - log( - 'insert', - _dataTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'insert', - _dataTextController, - LogOptions.error, - error: e.message, - ); - } - } - - // Reads the user data between the specified start and end dates. - void read() async { - log( - 'read', - _dataTextController, - LogOptions.call, - ); - // Build the dataCollector object - DataCollector dataCollector = DataCollector( - dataType: DataType.DT_CONTINUOUS_STEPS_DELTA, - dataGenerateType: DataGenerateType.DATA_TYPE_RAW, - dataStreamName: 'STEPS_DELTA', - ); - - // Build the time range for the query: start time and end time. - ReadOptions readOptions = ReadOptions( - dataCollectors: [ - dataCollector, - ], - startTime: DateTime.parse('2020-10-10 12:00:00'), - endTime: DateTime.parse('2020-10-10 12:12:00'), - )..groupByTime(10000); - - // Call the api with the constructed ReadOptions instance. - try { - ReadReply? readReply = await _dataController.read(readOptions); - log( - 'read', - _dataTextController, - LogOptions.success, - result: readReply.toString(), - ); - } on PlatformException catch (e) { - log( - 'read', - _dataTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Reads the daily summation between the dates: `2020.10.02` to `2020.12.15` for multiple data types. - /// Note that the time format is different for this method. - void readDailySummationList() async { - log( - 'readDailySummationList', - _dataTextController, - LogOptions.call, - ); - try { - List? sampleSets = await _dataController.readDailySummationList( - [DataType.DT_CONTINUOUS_STEPS_DELTA, DataType.DT_CONTINUOUS_CALORIES_BURNT], - 20201002, - 20201003, - ); - log( - 'readDailySummationList', - _dataTextController, - LogOptions.success, - result: sampleSets.toString(), - ); - } on PlatformException catch (e) { - log( - 'readDailySummationList', - _dataTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Reads the steps summation for today. - void readTodaySummation() async { - log( - 'readTodaySummation', - _dataTextController, - LogOptions.call, - ); - try { - SampleSet? sampleSet = await _dataController.readTodaySummation( - DataType.DT_CONTINUOUS_STEPS_DELTA, - ); - log( - 'readTodaySummation', - _dataTextController, - LogOptions.success, - result: sampleSet.toString(), - ); - } on PlatformException catch (e) { - log( - 'readTodaySummation', - _dataTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Updates DT_CONTINUOUS_STEPS_DELTA for the specified dates. - void update() async { - log( - 'update', - _dataTextController, - LogOptions.call, - ); - - // Build the dataCollector object - DataCollector dataCollector = DataCollector( - dataType: DataType.DT_CONTINUOUS_STEPS_DELTA, - dataStreamName: 'STEPS_DELTA', - dataGenerateType: DataGenerateType.DATA_TYPE_RAW, - ); - - // You can use sampleSets to add more sampling points to the sampling dataset. - SampleSet sampleSet = SampleSet( - dataCollector, - [ - SamplePoint( - dataCollector: dataCollector, - startTime: DateTime.parse('2020-12-12 09:00:00'), - endTime: DateTime.parse('2020-12-12 09:05:00'), - fieldValueOptions: FieldInt( - Field.FIELD_STEPS_DELTA, - 120, - ), - ), - ], - ); - - // Build a parameter object for the update. - // Note: (1) The start time of the modified object updateOptions can not be greater than the minimum - // value of the start time of all sample data points in the modified data sample set - // (2) The end time of the modified object updateOptions can not be less than the maximum value of the - // end time of all sample data points in the modified data sample set - UpdateOptions updateOptions = UpdateOptions( - startTime: DateTime.parse('2020-12-12 08:00:00'), - endTime: DateTime.parse('2020-12-12 09:25:00'), - sampleSet: sampleSet, - ); - try { - await _dataController.update(updateOptions); - log( - 'update', - _dataTextController, - LogOptions.success, - result: sampleSet.toString(), - ); - } on PlatformException catch (e) { - log( - 'update', - _dataTextController, - LogOptions.error, - error: e.message, - ); - } - } - - // - // - // End of DataController Methods - - // SettingController Methods - // - /// Adds a custom DataType with the FIELD_ALTITUDE. - void addDataType() async { - log( - 'addDataType', - _settingTextController, - LogOptions.call, - ); - try { - // The name of the created data type must be prefixed with the package name - // of the app. Otherwise, the creation fails. If the same data type is tried to - // be added again an exception will be thrown. - DataTypeAddOptions options = DataTypeAddOptions( - '$packageName.myCustomDataType', - [ - const Field.newIntField('myIntField'), - Field.FIELD_ALTITUDE, - ], - ); - final DataType dataTypeResult = await SettingController.addDataType( - options, - ); - log( - 'addDataType', - _settingTextController, - LogOptions.success, - result: dataTypeResult.toString(), - ); - } on PlatformException catch (e) { - log( - 'addDataType', - _settingTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Reads the inserted data type on the [addDataType] method. - void readDataType() async { - log( - 'readDataType', - _settingTextController, - LogOptions.call, - ); - try { - final DataType dataTypeResult = await SettingController.readDataType( - '$packageName.myCustomDataType', - ); - log( - 'readDataType', - _settingTextController, - LogOptions.success, - result: dataTypeResult.toString(), - ); - } on PlatformException catch (e) { - log( - 'readDataType', - _settingTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Disables the Health Kit function, cancels user authorization, and cancels - /// all data records. (The task takes effect in 24 hours.) - void disableHiHealth() async { - log( - 'disableHiHealth', - _settingTextController, - LogOptions.call, - ); - try { - await SettingController.disableHiHealth(); - log( - 'disableHiHealth', - _settingTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'disableHiHealth', - _settingTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Checks the user privacy authorization to Health Kit. Redirects the user to - /// the Authorization screen if the permissions are not given. - void checkHealthAppAuthorization() async { - log( - 'checkHealthAppAuthorization', - _settingTextController, - LogOptions.call, - ); - try { - await SettingController.checkHealthAppAuthorization(); - log( - 'checkHealthAppAuthorization', - _settingTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'checkHealthAppAuthorization', - _settingTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Checks the user privacy authorization to Health Kit. If authorized `true` - /// value would be returned. - void getHealthAppAuthorization() async { - log( - 'getHealthAppAuthorization', - _settingTextController, - LogOptions.call, - ); - try { - final bool result = await SettingController.getHealthAppAuthorization(); - log( - 'getHealthAppAuthorization', - _settingTextController, - LogOptions.success, - result: result.toString(), - ); - } on PlatformException catch (e) { - log( - 'getHealthAppAuthorization', - _settingTextController, - LogOptions.error, - error: e.message, - ); - } - } - - void requestAuth() async { - final HealthKitAuthResult res = await SettingController.requestAuthorizationIntent( - [ - Scope.HEALTHKIT_STEP_READ, - Scope.HEALTHKIT_STEP_WRITE, - Scope.HEALTHKIT_HEIGHTWEIGHT_READ, - Scope.HEALTHKIT_HEIGHTWEIGHT_WRITE, - Scope.HEALTHKIT_HEARTRATE_READ, - Scope.HEALTHKIT_HEARTRATE_WRITE, - Scope.HEALTHKIT_ACTIVITY_RECORD_READ, - Scope.HEALTHKIT_ACTIVITY_RECORD_WRITE, - Scope.HEALTHKIT_HEARTHEALTH_READ, - Scope.HEALTHKIT_HEARTHEALTH_WRITE, - ], - true, - ); - debugPrint(res.authAccount?.accessToken); - } - - // - // - // End of SettingController Methods - - // AutoRecorderController Methods - // - // - // Callback function for AutoRecorderStream event. - void _onAutoRecorderEvent(SamplePoint? res) { - log( - '[AutoRecorderEvent] obtained, SamplePoint Field Value is ${res?.fieldValues?.toString()}', - _autoRecorderTextController, - LogOptions.custom, - ); - } - - /// Starts an Android Foreground Service to count the steps of the user. - /// The steps will be emitted to the AutoRecorderStream. - void startRecord() async { - log( - 'startRecord', - _autoRecorderTextController, - LogOptions.call, - ); - try { - await AutoRecorderController.startRecord( - DataType.DT_CONTINUOUS_STEPS_TOTAL, - NotificationProperties( - title: 'HMS Flutter Health Demo', - text: 'Counting steps', - subText: 'this is a subtext', - ticker: 'this is a ticker', - showChronometer: true, - ), - ); - log( - 'startRecord', - _autoRecorderTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'startRecord', - _autoRecorderTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Ends the Foreground service and stops the step count events. - void stopRecord() async { - log( - 'endRecord', - _autoRecorderTextController, - LogOptions.call, - ); - try { - await AutoRecorderController.stopRecord( - DataType.DT_CONTINUOUS_STEPS_TOTAL, - ); - log( - 'endRecord', - _autoRecorderTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'endRecord', - _autoRecorderTextController, - LogOptions.error, - error: e.message, - ); - } - } - - // - // - // End of AutoRecorderController Methods - - // ConsentController Methods - // - /// Obtains the application id from the agconnect-services.json file. - void getAppId() async { - log( - 'getAppId', - _consentTextController, - LogOptions.call, - ); - try { - final String appId = await ConsentsController.getAppId(); - log( - 'getAppId', - _consentTextController, - LogOptions.success, - result: appId, - ); - } on PlatformException catch (e) { - log( - 'getAppId', - _consentTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Gets the granted permission scopes for the app. - void getScopes() async { - log( - 'getScopes', - _consentTextController, - LogOptions.call, - ); - try { - final String appId = await ConsentsController.getAppId(); - final ScopeLangItem scopeLangItem = await ConsentsController.getScopes( - 'en-gb', - appId, - ); - log( - 'getScopes', - _consentTextController, - LogOptions.success, - result: scopeLangItem.toString(), - ); - } on PlatformException catch (e) { - log( - 'getScopes', - _consentTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Revokes all the permissions that authorized for this app. - void revoke() async { - log( - 'revoke', - _consentTextController, - LogOptions.call, - ); - try { - final String appId = await ConsentsController.getAppId(); - await ConsentsController.revoke(appId); - log( - 'revoke', - _consentTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'revoke', - _consentTextController, - LogOptions.error, - error: e.message, - ); - } - } - - /// Revokes the distance read/write permissions for the app. - void revokeWithScopes() async { - log( - 'revokeWithScopes', - _consentTextController, - LogOptions.call, - ); - try { - // Obtain the application id. - final String appId = await ConsentsController.getAppId(); - // Call the revokeWithScopes method with desired scopes. - await ConsentsController.revokeWithScopes( - appId, - [ - Scope.HEALTHKIT_DISTANCE_WRITE, - Scope.HEALTHKIT_DISTANCE_READ, - ], - ); - log( - 'revokeWithScopes', - _consentTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'revokeWithScopes', - _consentTextController, - LogOptions.error, - error: e.message, - ); - } - } - - // - // - // End of ConsentController Methods - - // HealthController Methods - // - void addHealthRecord() async { - log( - 'addHealthRecord', - _healthTextController, - LogOptions.call, - ); - try { - final DateTime startTime = DateTime(2023, 5, 11); - final DateTime endTime = DateTime(2023, 5, 13); - - DataCollector contDataCollector = DataCollector( - dataStreamName: 'contDataCollector', - packageName: packageName, - dataType: DataType.POLYMERIZE_CONTINUOUS_HEART_RATE_STATISTICS, - dataGenerateType: DataGenerateType.DATA_TYPE_RAW, - ); - - DataCollector instDataCollector = DataCollector( - dataStreamName: 'instDataCollector', - packageName: packageName, - dataType: DataType.DT_INSTANTANEOUS_HEART_RATE, - dataGenerateType: DataGenerateType.DATA_TYPE_RAW, - ); - - List subDataDetails = [ - SampleSet(instDataCollector, [ - SamplePoint( - dataCollector: instDataCollector, - ) - ..setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS) - ..setFieldValue(Field.FIELD_BPM, 88.0) - ]) - ]; - - List subDataSummary = [ - SamplePoint( - dataCollector: contDataCollector, - ) - ..setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS) - ..setFieldValue(Field.FIELD_AVG, 90.0) - ..setFieldValue(Field.FIELD_MAX, 100.0) - ..setFieldValue(Field.FIELD_MIN, 80.0) - ..setFieldValue(Field.LAST, 85.0) - ]; - - final HealthRecord healthRecord = HealthRecord( - startTime: startTime, - endTime: endTime, - metadata: 'Data', - dataCollector: DataCollector( - dataStreamName: 'such as step count', - packageName: packageName, - dataType: HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA, - dataGenerateType: DataGenerateType.DATA_TYPE_RAW, - ), - ) - ..setSubDataSummary(subDataSummary) - ..setSubDataDetails(subDataDetails) - ..setFieldValue(HealthFields.FIELD_THRESHOLD, 42.0) - ..setFieldValue(HealthFields.FIELD_MAX_HEART_RATE, 48.0) - ..setFieldValue(HealthFields.FIELD_MIN_HEART_RATE, 42.0) - ..setFieldValue(HealthFields.FIELD_AVG_HEART_RATE, 45.0); - - final String? result = await HealthRecordController.addHealthRecord( - HealthRecordInsertOptions( - healthRecord: healthRecord, - ), - ); - log( - 'addHealthRecord', - _healthTextController, - LogOptions.success, - result: result.toString(), - ); - } on PlatformException catch (e) { - log( - 'addHealthRecord', - _healthTextController, - LogOptions.error, - error: e.message, - ); - } - } - - void getHealthRecord() async { - log( - 'getHealthRecord', - _healthTextController, - LogOptions.call, - ); - try { - final DateTime startTime = DateTime(2023, 5, 11); - final DateTime endTime = DateTime(2023, 5, 13); - - HealthRecordReply result = await HealthRecordController.getHealthRecord( - HealthRecordReadOptions( - packageName: packageName, - ) - ..setSubDataTypeList( - [ - DataType.DT_INSTANTANEOUS_HEART_RATE, - ], - ) - ..setTimeInterval( - startTime, - endTime, - TimeUnit.MILLISECONDS, - ) - ..readByDataType( - HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA, - ) - ..readHealthRecordsFromAllApps(), - ); - log( - 'getHealthRecord', - _healthTextController, - LogOptions.success, - result: result.healthRecords[0].toJson(), - ); - } on PlatformException catch (e) { - log( - 'getHealthRecord', - _healthTextController, - LogOptions.error, - error: e.message, - ); - } - } - - void updateHealthRecord() async { - log( - 'updateHealthRecord', - _healthTextController, - LogOptions.call, - ); - try { - final DateTime startTime = DateTime(2022, 10, 11); - final DateTime endTime = DateTime(2022, 10, 12); - final HealthRecord healthRecord = HealthRecord( - startTime: startTime, - endTime: endTime, - metadata: 'Data', - dataCollector: DataCollector( - dataStreamName: 'such as step count', - packageName: packageName, - dataType: HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA, - dataGenerateType: DataGenerateType.DATA_TYPE_RAW, - ), - ) - ..setFieldValue(HealthFields.FIELD_THRESHOLD, 41.9) - ..setFieldValue(HealthFields.FIELD_MAX_HEART_RATE, 49.1) - ..setFieldValue(HealthFields.FIELD_MIN_HEART_RATE, 41.1) - ..setFieldValue(HealthFields.FIELD_AVG_HEART_RATE, 45.1); - await HealthRecordController.updateHealthRecord( - HealthRecordUpdateOptions( - healthRecord: healthRecord, - healthRecordId: '', - ), - ); - log( - 'updateHealthRecord', - _healthTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'updateHealthRecord', - _healthTextController, - LogOptions.error, - error: e.message, - ); - } - } - - void deleteHealthRecord() async { - log( - 'deleteHealthRecord', - _healthTextController, - LogOptions.call, - ); - try { - await HealthRecordController.deleteHealthRecord( - HealthRecordDeleteOptions( - startTime: DateTime.now().subtract(const Duration(days: 14)), - endTime: DateTime.now(), - )..setHealthRecordIds( - [ - '', - ], - ), - ); - log( - 'deleteHealthRecord', - _healthTextController, - LogOptions.success, - ); - } on PlatformException catch (e) { - log( - 'deleteHealthRecord', - _healthTextController, - LogOptions.error, - error: e.message, - ); - } - } - - // - // - // End of HealthController Methods - - // App's widgets. - // - // - Widget expansionCard({ - required String titleText, - required List children, - }) { - return Card( - margin: componentPadding, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.0), - ), - child: ExpansionTile( - title: Text( - titleText, - style: cardTitleTextStyle, - ), - children: children, - ), - ); - } - - Widget loggingArea( - TextEditingController moduleTextController, - ) { - return Column( - children: [ - Container( - margin: componentPadding, - padding: const EdgeInsets.all(8.0), - height: 200, - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(5.0), - border: Border.all(color: Colors.black12), - ), - child: TextField( - readOnly: true, - maxLines: 15, - controller: moduleTextController, - decoration: const InputDecoration( - enabledBorder: InputBorder.none, - ), - ), - ), - TextButton( - child: const Text('Clear Log'), - onPressed: () => setState(() { - moduleTextController.text = ''; - }), - ) - ], - ); - } - - void showSnackBar( - String text, { - Color color = Colors.blue, - }) { - final SnackBar snackBar = SnackBar( - content: Text(text), - backgroundColor: color, - action: SnackBarAction( - label: 'Close', - textColor: Colors.white, - onPressed: () { - ScaffoldMessenger.of(context).removeCurrentSnackBar(); - }, - ), - ); - ScaffoldMessenger.of(context).showSnackBar(snackBar); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - backgroundColor: Colors.white, - title: const Text( - 'Huawei Health Kit', - style: TextStyle( - color: Colors.blue, - fontWeight: FontWeight.bold, - ), - ), - centerTitle: true, - elevation: 0.0, - actions: [ - IconButton( - onPressed: requestAuth, - icon: const Icon(Icons.ac_unit), - ), - ], - ), - body: Builder( - builder: (BuildContext context) { - return ListView( - physics: const BouncingScrollPhysics( - parent: AlwaysScrollableScrollPhysics(), - ), - children: [ - // Sign In Widgets - Card( - margin: componentPadding, - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(10.0), - ), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Padding( - padding: componentPadding, - child: Text( - 'Tap to SignIn button to obtain the HMS Account to complete ' - 'login and authorization, and then use other buttons ' - 'to try the related API functions.', - textAlign: TextAlign.center, - ), - ), - const Padding( - padding: componentPadding, - child: Text( - 'Note: If the login page is not displayed, change the package ' - 'name, AppID, and configure the signature file by referring ' - 'to the developer guide on the official website.', - textAlign: TextAlign.center, - style: TextStyle( - color: Colors.blue, - ), - ), - ), - Container( - padding: componentPadding, - width: double.infinity, - child: OutlinedButton( - style: ButtonStyle( - backgroundColor: MaterialStateProperty.all( - Colors.blue, - ), - ), - child: const Text( - 'SignIn', - style: TextStyle( - color: Colors.white, - ), - ), - onPressed: () => signIn(), - ), - ), - ], - ), - ), - - // ActivityRecordsController - expansionCard( - titleText: 'ActivityRecords Controller', - children: [ - loggingArea(_activityTextController), - ListTile( - title: const Text('AddActivityRecord'), - onTap: () => addActivityRecord(), - ), - ListTile( - title: const Text('GetActivityRecord'), - onTap: () => getActivityRecord(), - ), - ListTile( - title: const Text('beginActivityRecord'), - onTap: () => beginActivityRecord(), - ), - ListTile( - title: const Text('endActivityRecord'), - onTap: () => endActivityRecord(), - ), - ListTile( - title: const Text('endAllActivityRecords'), - onTap: () => endAllActivityRecords(), - ), - ], - ), - // DataController Widgets - expansionCard( - titleText: 'DataController', - children: [ - loggingArea(_dataTextController), - ListTile( - title: const Text('readTodaySummation'), - onTap: () => readTodaySummation(), - ), - ListTile( - title: const Text('readDailySummationList'), - onTap: () => readDailySummationList(), - ), - ListTile( - title: const Text('insert'), - onTap: () => insert(), - ), - ListTile( - title: const Text('read'), - onTap: () => read(), - ), - ListTile( - title: const Text('update'), - onTap: () => update(), - ), - ListTile( - title: const Text('delete'), - onTap: () => delete(), - ), - ListTile( - title: const Text('clearAll'), - onTap: () => clearAll(), - ), - ], - ), - // SettingController Widgets. - expansionCard( - titleText: 'SettingController', - children: [ - loggingArea(_settingTextController), - ListTile( - title: const Text('addDataType'), - onTap: () => addDataType(), - ), - ListTile( - title: const Text('readDataType'), - onTap: () => readDataType(), - ), - ListTile( - title: const Text('disableHiHealth'), - onTap: () => disableHiHealth(), - ), - ListTile( - title: const Text('checkHealthAppAuthorization'), - onTap: () => checkHealthAppAuthorization(), - ), - ListTile( - title: const Text('getHealthAppAuthorization'), - onTap: () => getHealthAppAuthorization(), - ), - ], - ), - // AutoRecorderController Widgets - expansionCard( - titleText: 'AutoRecorderController', - children: [ - loggingArea(_autoRecorderTextController), - ListTile( - title: const Text('startRecord'), - onTap: () => startRecord(), - ), - ListTile( - title: const Text('stopRecord'), - onTap: () => stopRecord(), - ), - ], - ), - // Consent Controller Widgets - expansionCard( - titleText: 'ConsentController', - children: [ - loggingArea(_consentTextController), - ListTile( - title: const Text('getAppId'), - onTap: () => getAppId(), - ), - ListTile( - title: const Text('getScopes'), - onTap: () => getScopes(), - ), - ListTile( - title: const Text('revoke'), - onTap: () => revoke(), - ), - ListTile( - title: const Text('revokeWithScopes'), - onTap: () => revokeWithScopes(), - ), - ], - ), - - // Health Controller Widgets - expansionCard( - titleText: 'HealthController', - children: [ - loggingArea(_healthTextController), - ListTile( - title: const Text('addHealthRecord'), - onTap: () => addHealthRecord(), - ), - ListTile( - title: const Text('getHealthRecord'), - onTap: () => getHealthRecord(), - ), - ListTile( - title: const Text('updateHealthRecord'), - onTap: () => updateHealthRecord(), - ), - ListTile( - title: const Text('deleteHealthRecord'), - onTap: () => deleteHealthRecord(), - ), - ], - ), - ], - ); - }, - ), - ); - } -} - -/// Options for logging. -enum LogOptions { - call, - success, - error, - custom, -} +// import 'package:flutter/material.dart'; +// import 'package:flutter/services.dart'; +// import 'package:huawei_health/huawei_health.dart'; +// +// const String packageName = 'com.ejada.hmg'; +// +// class HuaweiHealthExample extends StatefulWidget { +// const HuaweiHealthExample({Key? key}) : super(key: key); +// +// @override +// State createState() => _HuaweiHealthExampleState(); +// } +// +// class _HuaweiHealthExampleState extends State { +// /// Styles +// static const TextStyle cardTitleTextStyle = TextStyle( +// fontWeight: FontWeight.w500, +// fontSize: 18, +// ); +// static const EdgeInsets componentPadding = EdgeInsets.all(8.0); +// +// /// Text Controllers for showing the logs of different modules +// final TextEditingController _activityTextController = TextEditingController(); +// final TextEditingController _dataTextController = TextEditingController(); +// final TextEditingController _settingTextController = TextEditingController(); +// final TextEditingController _autoRecorderTextController = TextEditingController(); +// final TextEditingController _consentTextController = TextEditingController(); +// final TextEditingController _healthTextController = TextEditingController(); +// +// /// Data controller reference to initialize at startup. +// late DataController _dataController; +// +// String? accessToken = ''; +// +// @override +// void initState() { +// super.initState(); +// if (!mounted) return; +// // Initialize Event Callbacks +// AutoRecorderController.autoRecorderStream.listen(_onAutoRecorderEvent); +// // Initialize a DataController +// initDataController(); +// } +// +// /// Prints the specified text on both the console and the specified text controller. +// void log( +// String methodName, +// TextEditingController controller, +// LogOptions logOption, { +// String? result = '', +// String? error = '', +// }) { +// String log = ''; +// switch (logOption) { +// case LogOptions.call: +// log = '$methodName called'; +// break; +// case LogOptions.success: +// log = '$methodName [Success: $result] '; +// break; +// case LogOptions.error: +// log = '$methodName [Error: $error] [Error Description: ${HiHealthStatusCodes.getStatusCodeMessage(error ?? '')}]'; +// break; +// case LogOptions.custom: +// log = methodName; // Custom text +// break; +// } +// debugPrint(log); +// setState(() { +// controller.text = '$log\n${controller.text}'; +// }); +// } +// +// /// Authorizes Huawei Health Kit for the user, with defined scopes. +// void signIn() async { +// // List of scopes to ask for authorization. +// // +// // Note: These scopes should also be authorized on the Huawei Developer Console. +// final List scopes = [ +// Scope.HEALTHKIT_ACTIVITY_READ, +// Scope.HEALTHKIT_ACTIVITY_WRITE, +// Scope.HEALTHKIT_BLOODGLUCOSE_READ, +// Scope.HEALTHKIT_BLOODGLUCOSE_WRITE, +// Scope.HEALTHKIT_CALORIES_READ, +// Scope.HEALTHKIT_CALORIES_WRITE, +// Scope.HEALTHKIT_DISTANCE_READ, +// Scope.HEALTHKIT_DISTANCE_WRITE, +// Scope.HEALTHKIT_HEARTRATE_READ, +// Scope.HEALTHKIT_HEARTRATE_WRITE, +// Scope.HEALTHKIT_HEIGHTWEIGHT_READ, +// Scope.HEALTHKIT_HEIGHTWEIGHT_WRITE, +// Scope.HEALTHKIT_LOCATION_READ, +// Scope.HEALTHKIT_LOCATION_WRITE, +// Scope.HEALTHKIT_PULMONARY_READ, +// Scope.HEALTHKIT_PULMONARY_WRITE, +// Scope.HEALTHKIT_SLEEP_READ, +// Scope.HEALTHKIT_SLEEP_WRITE, +// Scope.HEALTHKIT_SPEED_READ, +// Scope.HEALTHKIT_SPEED_WRITE, +// Scope.HEALTHKIT_STEP_READ, +// Scope.HEALTHKIT_STEP_WRITE, +// Scope.HEALTHKIT_STRENGTH_READ, +// Scope.HEALTHKIT_STRENGTH_WRITE, +// Scope.HEALTHKIT_BODYFAT_READ, +// Scope.HEALTHKIT_BODYFAT_WRITE, +// Scope.HEALTHKIT_NUTRITION_READ, +// Scope.HEALTHKIT_NUTRITION_WRITE, +// Scope.HEALTHKIT_BLOODPRESSURE_READ, +// Scope.HEALTHKIT_BLOODPRESSURE_WRITE, +// Scope.HEALTHKIT_BODYTEMPERATURE_READ, +// Scope.HEALTHKIT_BODYTEMPERATURE_WRITE, +// Scope.HEALTHKIT_OXYGENSTATURATION_READ, +// Scope.HEALTHKIT_OXYGENSTATURATION_WRITE, +// Scope.HEALTHKIT_REPRODUCTIVE_READ, +// Scope.HEALTHKIT_REPRODUCTIVE_WRITE, +// Scope.HEALTHKIT_ACTIVITY_RECORD_READ, +// Scope.HEALTHKIT_ACTIVITY_RECORD_WRITE, +// Scope.HEALTHKIT_HEARTRATE_REALTIME, +// Scope.HEALTHKIT_STEP_REALTIME, +// Scope.HEALTHKIT_HEARTHEALTH_WRITE, +// Scope.HEALTHKIT_HEARTHEALTH_READ, +// Scope.HEALTHKIT_STRESS_WRITE, +// Scope.HEALTHKIT_STRESS_READ, +// Scope.HEALTHKIT_OXYGEN_SATURATION_WRITE, +// Scope.HEALTHKIT_OXYGEN_SATURATION_READ, +// Scope.HEALTHKIT_HISTORYDATA_OPEN_WEEK, +// Scope.HEALTHKIT_HISTORYDATA_OPEN_MONTH, +// Scope.HEALTHKIT_HISTORYDATA_OPEN_YEAR, +// ]; +// try { +// AuthHuaweiId? result = await HealthAuth.signIn(scopes); +// debugPrint( +// 'Granted Scopes for User(${result?.displayName}): ${result?.grantedScopes?.toString()}', +// ); +// showSnackBar( +// 'Authorization Success.', +// color: Colors.green, +// ); +// setState(() => accessToken = result?.accessToken); +// } on PlatformException catch (e) { +// debugPrint('Error on authorization, Error:${e.toString()}'); +// showSnackBar( +// 'Error on authorization, Error:${e.toString()}, Error Description: ' +// '${HiHealthStatusCodes.getStatusCodeMessage(e.message ?? '')}', +// ); +// } +// } +// +// // ActivityRecordsController +// // +// /// Adds an ActivityRecord with an ActivitySummary, time range is 2 hours from now. +// Future addActivityRecord() async { +// log( +// 'addActivityRecord', +// _activityTextController, +// LogOptions.call, +// ); +// DateTime startTime = DateTime.now().subtract(const Duration(hours: 2)); +// DateTime endTime = DateTime.now(); +// // Build an ActivityRecord object +// ActivityRecord activityRecord = ActivityRecord( +// startTime: startTime, +// endTime: endTime, +// id: 'ActivityRecordId0', +// name: 'AddActivityRecord', +// activityTypeId: HiHealthActivities.running, +// description: 'This is a test for ActivityRecord', +// activitySummary: ActivitySummary( +// paceSummary: PaceSummary( +// avgPace: 247.27626, +// bestPace: 212.0, +// britishPaceMap: { +// '102802480': 365.0, +// }, +// britishPartTimeMap: { +// '1.0': 263.0, +// }, +// partTimeMap: { +// '1.0': 456.0, +// }, +// paceMap: { +// '1.0': 263.0, +// }, +// ), +// dataSummary: [ +// SamplePoint( +// dataType: DataType.DT_CONTINUOUS_DISTANCE_TOTAL, +// startTime: startTime.add(Duration(seconds: 1)), +// endTime: endTime.subtract(Duration(seconds: 1)), +// fieldValueOptions: FieldFloat(Field.FIELD_DISTANCE, 400), +// timeUnit: TimeUnit.MILLISECONDS, +// ), +// SamplePoint( +// dataType: DataType.POLYMERIZE_CONTINUOUS_SPEED_STATISTICS, +// fieldValueOptions: FieldFloat(Field.FIELD_AVG, 60.0), +// startTime: startTime.add(Duration(seconds: 1)), +// endTime: endTime.subtract(Duration(seconds: 1)), +// timeUnit: TimeUnit.MILLISECONDS, +// ) +// ..setFieldValue(Field.FIELD_MIN, 40.0) +// ..setFieldValue(Field.FIELD_MAX, 80.0), +// ]), +// ); +// +// // Build the dataCollector object +// DataCollector dataCollector = DataCollector( +// dataGenerateType: DataGenerateType.DATA_TYPE_RAW, +// dataType: DataType.DT_INSTANTANEOUS_STEPS_RATE, +// name: 'AddActivityRecord1923', +// ); +// +// // You can use sampleSets to add more sample points to the sampling dataset. +// // Build a list of sampling point objects and add it to the sampling dataSet +// List samplePoints = [ +// SamplePoint( +// dataCollector: dataCollector, +// startTime: startTime.add(Duration(seconds: 1)), +// endTime: endTime.subtract(Duration(seconds: 1)), +// fieldValueOptions: FieldFloat(Field.FIELD_STEP_RATE, 10.0), +// timeUnit: TimeUnit.MILLISECONDS, +// ), +// ]; +// SampleSet sampleSet = SampleSet( +// dataCollector, +// samplePoints, +// ); +// +// try { +// await ActivityRecordsController.addActivityRecord( +// ActivityRecordInsertOptions( +// activityRecord: activityRecord, +// sampleSets: [ +// sampleSet, +// ], +// ), +// ); +// log( +// 'addActivityRecord', +// _activityTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'addActivityRecord', +// _activityTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Obtains saved ActivityRecords between yesterday and now, +// /// with the DT_CONTINUOUS_STEPS_DELTA data type +// void getActivityRecord() async { +// log( +// 'getActivityRecord', +// _activityTextController, +// LogOptions.call, +// ); +// // Create start time that will be used to read activity record. +// DateTime startTime = DateTime.now().subtract(const Duration(days: 1)); +// +// // Create end time that will be used to read activity record. +// DateTime endTime = DateTime.now().add(const Duration(hours: 3)); +// +// ActivityRecordReadOptions activityRecordReadOptions = ActivityRecordReadOptions( +// activityRecordId: "ActivityRecordId0", +// activityRecordName: null, +// startTime: startTime, +// endTime: endTime, +// timeUnit: TimeUnit.MILLISECONDS, +// dataType: DataType.DT_INSTANTANEOUS_STEPS_RATE, +// ); +// try { +// List result = await ActivityRecordsController.getActivityRecord( +// activityRecordReadOptions, +// ); +// log( +// 'getActivityRecord', +// _activityTextController, +// LogOptions.success, +// result: '[IDs: ${result.map((ActivityRecord e) => e.id).toList()}]', +// ); +// } on PlatformException catch (e) { +// log( +// 'getActivityRecord', +// _activityTextController, +// LogOptions.error, +// result: e.message, +// ); +// } +// } +// +// /// Starts the ActivityRecord with the id:`ActivityRecordRun1` +// void beginActivityRecord() async { +// try { +// log( +// 'beginActivityRecord', +// _activityTextController, +// LogOptions.call, +// ); +// // Build an ActivityRecord object +// ActivityRecord activityRecord = ActivityRecord( +// id: 'ActivityRecordRun0', +// name: 'BeginActivityRecord', +// description: 'This is ActivityRecord begin test!', +// activityTypeId: HiHealthActivities.running, +// startTime: DateTime.now().subtract(const Duration(hours: 1)), +// ); +// await ActivityRecordsController.beginActivityRecord( +// activityRecord, +// ); +// log( +// 'beginActivityRecord', +// _activityTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'beginActivityRecord', +// _activityTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Stops the ActivityRecord with the id:`ActivityRecordRun1` +// void endActivityRecord() async { +// try { +// log( +// 'endActivityRecord', +// _activityTextController, +// LogOptions.call, +// ); +// final List result = await ActivityRecordsController.endActivityRecord( +// 'ActivityRecordRun0', +// ); +// // Return the list of activity records that have stopped +// log( +// 'endActivityRecord', +// _activityTextController, +// LogOptions.success, +// result: result.toString(), +// ); +// } on PlatformException catch (e) { +// log( +// 'endActivityRecord', +// _activityTextController, +// LogOptions.error, +// result: e.message, +// ); +// } +// } +// +// /// Ends all the ongoing activity records. +// /// +// /// Result list will be null if there is no ongoing activity record. +// void endAllActivityRecords() async { +// try { +// log( +// 'endAllActivityRecords', +// _activityTextController, +// LogOptions.call, +// ); +// // Return the list of activity records that have stopped +// List result = await ActivityRecordsController.endAllActivityRecords(); +// log( +// 'endAllActivityRecords', +// _activityTextController, +// LogOptions.success, +// result: '[IDs: ${result.map((ActivityRecord e) => e.id).toList()}]', +// ); +// } on PlatformException catch (e) { +// log( +// 'endAllActivityRecords', +// _activityTextController, +// LogOptions.error, +// result: e.message, +// ); +// } +// } +// +// // +// // +// // End of ActivityRecordsController Methods +// +// // DataController Methods +// // +// // +// /// Initializes a DataController instance with a list of HiHealtOptions. +// void initDataController() async { +// if (!mounted) return; +// log( +// 'init', +// _dataTextController, +// LogOptions.call, +// ); +// try { +// _dataController = await DataController.init(); +// log( +// 'init', +// _dataTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'init', +// _dataTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Clears all the data inserted by the app. +// void clearAll() async { +// log('clearAll', _dataTextController, LogOptions.call); +// try { +// await _dataController.clearAll(); +// log('clearAll', _dataTextController, LogOptions.success); +// } on PlatformException catch (e) { +// log('clearAll', _dataTextController, LogOptions.error, error: e.message); +// } +// } +// +// /// Deletes DT_CONTINUOUS_STEPS_DELTA type data by the specified time range. +// void delete() async { +// log( +// 'delete', +// _dataTextController, +// LogOptions.call, +// ); +// // Build the dataCollector object +// DataCollector dataCollector = DataCollector( +// dataType: DataType.DT_CONTINUOUS_STEPS_DELTA, +// dataGenerateType: DataGenerateType.DATA_TYPE_RAW, +// dataStreamName: 'STEPS_DELTA', +// ); +// +// // Build the time range for the deletion: start time and end time. +// DeleteOptions deleteOptions = DeleteOptions( +// dataCollectors: [dataCollector], +// startTime: DateTime.parse('2020-10-10 08:00:00'), +// endTime: DateTime.parse('2020-10-10 12:30:00'), +// ); +// +// // Call the api with the constructed DeleteOptions instance. +// try { +// _dataController.delete(deleteOptions); +// log( +// 'delete', +// _dataTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'delete', +// _dataTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Inserts a sampling set with the DT_CONTINUOUS_STEPS_DELTA data type at the +// /// specified start and end dates. +// void insert() async { +// log( +// 'insert', +// _dataTextController, +// LogOptions.call, +// ); +// // Build the dataCollector object +// DataCollector dataCollector = DataCollector( +// dataType: DataType.DT_CONTINUOUS_STEPS_DELTA, +// dataStreamName: 'STEPS_DELTA', +// dataGenerateType: DataGenerateType.DATA_TYPE_RAW, +// ); +// // You can use sampleSets to add more sampling points to the sampling dataset. +// SampleSet sampleSet = SampleSet( +// dataCollector, +// [ +// SamplePoint( +// dataCollector: dataCollector, +// startTime: DateTime.parse('2020-10-10 12:00:00'), +// endTime: DateTime.parse('2020-10-10 12:12:00'), +// fieldValueOptions: FieldInt( +// Field.FIELD_STEPS_DELTA, +// 100, +// ), +// ), +// ], +// ); +// // Call the api with the constructed sample set. +// try { +// _dataController.insert(sampleSet); +// log( +// 'insert', +// _dataTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'insert', +// _dataTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// // Reads the user data between the specified start and end dates. +// void read() async { +// log( +// 'read', +// _dataTextController, +// LogOptions.call, +// ); +// // Build the dataCollector object +// DataCollector dataCollector = DataCollector( +// dataType: DataType.DT_CONTINUOUS_STEPS_DELTA, +// dataGenerateType: DataGenerateType.DATA_TYPE_RAW, +// dataStreamName: 'STEPS_DELTA', +// ); +// +// // Build the time range for the query: start time and end time. +// ReadOptions readOptions = ReadOptions( +// dataCollectors: [ +// dataCollector, +// ], +// startTime: DateTime.parse('2020-10-10 12:00:00'), +// endTime: DateTime.parse('2020-10-10 12:12:00'), +// )..groupByTime(10000); +// +// // Call the api with the constructed ReadOptions instance. +// try { +// ReadReply? readReply = await _dataController.read(readOptions); +// log( +// 'read', +// _dataTextController, +// LogOptions.success, +// result: readReply.toString(), +// ); +// } on PlatformException catch (e) { +// log( +// 'read', +// _dataTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Reads the daily summation between the dates: `2020.10.02` to `2020.12.15` for multiple data types. +// /// Note that the time format is different for this method. +// void readDailySummationList() async { +// log( +// 'readDailySummationList', +// _dataTextController, +// LogOptions.call, +// ); +// try { +// List? sampleSets = await _dataController.readDailySummationList( +// [DataType.DT_CONTINUOUS_STEPS_DELTA, DataType.DT_CONTINUOUS_CALORIES_BURNT], +// 20201002, +// 20201003, +// ); +// log( +// 'readDailySummationList', +// _dataTextController, +// LogOptions.success, +// result: sampleSets.toString(), +// ); +// } on PlatformException catch (e) { +// log( +// 'readDailySummationList', +// _dataTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Reads the steps summation for today. +// void readTodaySummation() async { +// log( +// 'readTodaySummation', +// _dataTextController, +// LogOptions.call, +// ); +// try { +// SampleSet? sampleSet = await _dataController.readTodaySummation( +// DataType.DT_CONTINUOUS_STEPS_DELTA, +// ); +// log( +// 'readTodaySummation', +// _dataTextController, +// LogOptions.success, +// result: sampleSet.toString(), +// ); +// } on PlatformException catch (e) { +// log( +// 'readTodaySummation', +// _dataTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Updates DT_CONTINUOUS_STEPS_DELTA for the specified dates. +// void update() async { +// log( +// 'update', +// _dataTextController, +// LogOptions.call, +// ); +// +// // Build the dataCollector object +// DataCollector dataCollector = DataCollector( +// dataType: DataType.DT_CONTINUOUS_STEPS_DELTA, +// dataStreamName: 'STEPS_DELTA', +// dataGenerateType: DataGenerateType.DATA_TYPE_RAW, +// ); +// +// // You can use sampleSets to add more sampling points to the sampling dataset. +// SampleSet sampleSet = SampleSet( +// dataCollector, +// [ +// SamplePoint( +// dataCollector: dataCollector, +// startTime: DateTime.parse('2020-12-12 09:00:00'), +// endTime: DateTime.parse('2020-12-12 09:05:00'), +// fieldValueOptions: FieldInt( +// Field.FIELD_STEPS_DELTA, +// 120, +// ), +// ), +// ], +// ); +// +// // Build a parameter object for the update. +// // Note: (1) The start time of the modified object updateOptions can not be greater than the minimum +// // value of the start time of all sample data points in the modified data sample set +// // (2) The end time of the modified object updateOptions can not be less than the maximum value of the +// // end time of all sample data points in the modified data sample set +// UpdateOptions updateOptions = UpdateOptions( +// startTime: DateTime.parse('2020-12-12 08:00:00'), +// endTime: DateTime.parse('2020-12-12 09:25:00'), +// sampleSet: sampleSet, +// ); +// try { +// await _dataController.update(updateOptions); +// log( +// 'update', +// _dataTextController, +// LogOptions.success, +// result: sampleSet.toString(), +// ); +// } on PlatformException catch (e) { +// log( +// 'update', +// _dataTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// // +// // +// // End of DataController Methods +// +// // SettingController Methods +// // +// /// Adds a custom DataType with the FIELD_ALTITUDE. +// void addDataType() async { +// log( +// 'addDataType', +// _settingTextController, +// LogOptions.call, +// ); +// try { +// // The name of the created data type must be prefixed with the package name +// // of the app. Otherwise, the creation fails. If the same data type is tried to +// // be added again an exception will be thrown. +// DataTypeAddOptions options = DataTypeAddOptions( +// '$packageName.myCustomDataType', +// [ +// const Field.newIntField('myIntField'), +// Field.FIELD_ALTITUDE, +// ], +// ); +// final DataType dataTypeResult = await SettingController.addDataType( +// options, +// ); +// log( +// 'addDataType', +// _settingTextController, +// LogOptions.success, +// result: dataTypeResult.toString(), +// ); +// } on PlatformException catch (e) { +// log( +// 'addDataType', +// _settingTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Reads the inserted data type on the [addDataType] method. +// void readDataType() async { +// log( +// 'readDataType', +// _settingTextController, +// LogOptions.call, +// ); +// try { +// final DataType dataTypeResult = await SettingController.readDataType( +// '$packageName.myCustomDataType', +// ); +// log( +// 'readDataType', +// _settingTextController, +// LogOptions.success, +// result: dataTypeResult.toString(), +// ); +// } on PlatformException catch (e) { +// log( +// 'readDataType', +// _settingTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Disables the Health Kit function, cancels user authorization, and cancels +// /// all data records. (The task takes effect in 24 hours.) +// void disableHiHealth() async { +// log( +// 'disableHiHealth', +// _settingTextController, +// LogOptions.call, +// ); +// try { +// await SettingController.disableHiHealth(); +// log( +// 'disableHiHealth', +// _settingTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'disableHiHealth', +// _settingTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Checks the user privacy authorization to Health Kit. Redirects the user to +// /// the Authorization screen if the permissions are not given. +// void checkHealthAppAuthorization() async { +// log( +// 'checkHealthAppAuthorization', +// _settingTextController, +// LogOptions.call, +// ); +// try { +// await SettingController.checkHealthAppAuthorization(); +// log( +// 'checkHealthAppAuthorization', +// _settingTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'checkHealthAppAuthorization', +// _settingTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Checks the user privacy authorization to Health Kit. If authorized `true` +// /// value would be returned. +// void getHealthAppAuthorization() async { +// log( +// 'getHealthAppAuthorization', +// _settingTextController, +// LogOptions.call, +// ); +// try { +// final bool result = await SettingController.getHealthAppAuthorization(); +// log( +// 'getHealthAppAuthorization', +// _settingTextController, +// LogOptions.success, +// result: result.toString(), +// ); +// } on PlatformException catch (e) { +// log( +// 'getHealthAppAuthorization', +// _settingTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// void requestAuth() async { +// final HealthKitAuthResult res = await SettingController.requestAuthorizationIntent( +// [ +// Scope.HEALTHKIT_STEP_READ, +// Scope.HEALTHKIT_STEP_WRITE, +// Scope.HEALTHKIT_HEIGHTWEIGHT_READ, +// Scope.HEALTHKIT_HEIGHTWEIGHT_WRITE, +// Scope.HEALTHKIT_HEARTRATE_READ, +// Scope.HEALTHKIT_HEARTRATE_WRITE, +// Scope.HEALTHKIT_ACTIVITY_RECORD_READ, +// Scope.HEALTHKIT_ACTIVITY_RECORD_WRITE, +// Scope.HEALTHKIT_HEARTHEALTH_READ, +// Scope.HEALTHKIT_HEARTHEALTH_WRITE, +// ], +// true, +// ); +// debugPrint(res.authAccount?.accessToken); +// } +// +// // +// // +// // End of SettingController Methods +// +// // AutoRecorderController Methods +// // +// // +// // Callback function for AutoRecorderStream event. +// void _onAutoRecorderEvent(SamplePoint? res) { +// log( +// '[AutoRecorderEvent] obtained, SamplePoint Field Value is ${res?.fieldValues?.toString()}', +// _autoRecorderTextController, +// LogOptions.custom, +// ); +// } +// +// /// Starts an Android Foreground Service to count the steps of the user. +// /// The steps will be emitted to the AutoRecorderStream. +// void startRecord() async { +// log( +// 'startRecord', +// _autoRecorderTextController, +// LogOptions.call, +// ); +// try { +// await AutoRecorderController.startRecord( +// DataType.DT_CONTINUOUS_STEPS_TOTAL, +// NotificationProperties( +// title: 'HMS Flutter Health Demo', +// text: 'Counting steps', +// subText: 'this is a subtext', +// ticker: 'this is a ticker', +// showChronometer: true, +// ), +// ); +// log( +// 'startRecord', +// _autoRecorderTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'startRecord', +// _autoRecorderTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Ends the Foreground service and stops the step count events. +// void stopRecord() async { +// log( +// 'endRecord', +// _autoRecorderTextController, +// LogOptions.call, +// ); +// try { +// await AutoRecorderController.stopRecord( +// DataType.DT_CONTINUOUS_STEPS_TOTAL, +// ); +// log( +// 'endRecord', +// _autoRecorderTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'endRecord', +// _autoRecorderTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// // +// // +// // End of AutoRecorderController Methods +// +// // ConsentController Methods +// // +// /// Obtains the application id from the agconnect-services.json file. +// void getAppId() async { +// log( +// 'getAppId', +// _consentTextController, +// LogOptions.call, +// ); +// try { +// final String appId = await ConsentsController.getAppId(); +// log( +// 'getAppId', +// _consentTextController, +// LogOptions.success, +// result: appId, +// ); +// } on PlatformException catch (e) { +// log( +// 'getAppId', +// _consentTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Gets the granted permission scopes for the app. +// void getScopes() async { +// log( +// 'getScopes', +// _consentTextController, +// LogOptions.call, +// ); +// try { +// final String appId = await ConsentsController.getAppId(); +// final ScopeLangItem scopeLangItem = await ConsentsController.getScopes( +// 'en-gb', +// appId, +// ); +// log( +// 'getScopes', +// _consentTextController, +// LogOptions.success, +// result: scopeLangItem.toString(), +// ); +// } on PlatformException catch (e) { +// log( +// 'getScopes', +// _consentTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Revokes all the permissions that authorized for this app. +// void revoke() async { +// log( +// 'revoke', +// _consentTextController, +// LogOptions.call, +// ); +// try { +// final String appId = await ConsentsController.getAppId(); +// await ConsentsController.revoke(appId); +// log( +// 'revoke', +// _consentTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'revoke', +// _consentTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// /// Revokes the distance read/write permissions for the app. +// void revokeWithScopes() async { +// log( +// 'revokeWithScopes', +// _consentTextController, +// LogOptions.call, +// ); +// try { +// // Obtain the application id. +// final String appId = await ConsentsController.getAppId(); +// // Call the revokeWithScopes method with desired scopes. +// await ConsentsController.revokeWithScopes( +// appId, +// [ +// Scope.HEALTHKIT_DISTANCE_WRITE, +// Scope.HEALTHKIT_DISTANCE_READ, +// ], +// ); +// log( +// 'revokeWithScopes', +// _consentTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'revokeWithScopes', +// _consentTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// // +// // +// // End of ConsentController Methods +// +// // HealthController Methods +// // +// void addHealthRecord() async { +// log( +// 'addHealthRecord', +// _healthTextController, +// LogOptions.call, +// ); +// try { +// final DateTime startTime = DateTime(2023, 5, 11); +// final DateTime endTime = DateTime(2023, 5, 13); +// +// DataCollector contDataCollector = DataCollector( +// dataStreamName: 'contDataCollector', +// packageName: packageName, +// dataType: DataType.POLYMERIZE_CONTINUOUS_HEART_RATE_STATISTICS, +// dataGenerateType: DataGenerateType.DATA_TYPE_RAW, +// ); +// +// DataCollector instDataCollector = DataCollector( +// dataStreamName: 'instDataCollector', +// packageName: packageName, +// dataType: DataType.DT_INSTANTANEOUS_HEART_RATE, +// dataGenerateType: DataGenerateType.DATA_TYPE_RAW, +// ); +// +// List subDataDetails = [ +// SampleSet(instDataCollector, [ +// SamplePoint( +// dataCollector: instDataCollector, +// ) +// ..setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS) +// ..setFieldValue(Field.FIELD_BPM, 88.0) +// ]) +// ]; +// +// List subDataSummary = [ +// SamplePoint( +// dataCollector: contDataCollector, +// ) +// ..setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS) +// ..setFieldValue(Field.FIELD_AVG, 90.0) +// ..setFieldValue(Field.FIELD_MAX, 100.0) +// ..setFieldValue(Field.FIELD_MIN, 80.0) +// ..setFieldValue(Field.LAST, 85.0) +// ]; +// +// final HealthRecord healthRecord = HealthRecord( +// startTime: startTime, +// endTime: endTime, +// metadata: 'Data', +// dataCollector: DataCollector( +// dataStreamName: 'such as step count', +// packageName: packageName, +// dataType: HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA, +// dataGenerateType: DataGenerateType.DATA_TYPE_RAW, +// ), +// ) +// ..setSubDataSummary(subDataSummary) +// ..setSubDataDetails(subDataDetails) +// ..setFieldValue(HealthFields.FIELD_THRESHOLD, 42.0) +// ..setFieldValue(HealthFields.FIELD_MAX_HEART_RATE, 48.0) +// ..setFieldValue(HealthFields.FIELD_MIN_HEART_RATE, 42.0) +// ..setFieldValue(HealthFields.FIELD_AVG_HEART_RATE, 45.0); +// +// final String? result = await HealthRecordController.addHealthRecord( +// HealthRecordInsertOptions( +// healthRecord: healthRecord, +// ), +// ); +// log( +// 'addHealthRecord', +// _healthTextController, +// LogOptions.success, +// result: result.toString(), +// ); +// } on PlatformException catch (e) { +// log( +// 'addHealthRecord', +// _healthTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// void getHealthRecord() async { +// log( +// 'getHealthRecord', +// _healthTextController, +// LogOptions.call, +// ); +// try { +// final DateTime startTime = DateTime(2023, 5, 11); +// final DateTime endTime = DateTime(2023, 5, 13); +// +// HealthRecordReply result = await HealthRecordController.getHealthRecord( +// HealthRecordReadOptions( +// packageName: packageName, +// ) +// ..setSubDataTypeList( +// [ +// DataType.DT_INSTANTANEOUS_HEART_RATE, +// ], +// ) +// ..setTimeInterval( +// startTime, +// endTime, +// TimeUnit.MILLISECONDS, +// ) +// ..readByDataType( +// HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA, +// ) +// ..readHealthRecordsFromAllApps(), +// ); +// log( +// 'getHealthRecord', +// _healthTextController, +// LogOptions.success, +// result: result.healthRecords[0].toJson(), +// ); +// } on PlatformException catch (e) { +// log( +// 'getHealthRecord', +// _healthTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// void updateHealthRecord() async { +// log( +// 'updateHealthRecord', +// _healthTextController, +// LogOptions.call, +// ); +// try { +// final DateTime startTime = DateTime(2022, 10, 11); +// final DateTime endTime = DateTime(2022, 10, 12); +// final HealthRecord healthRecord = HealthRecord( +// startTime: startTime, +// endTime: endTime, +// metadata: 'Data', +// dataCollector: DataCollector( +// dataStreamName: 'such as step count', +// packageName: packageName, +// dataType: HealthDataTypes.DT_HEALTH_RECORD_BRADYCARDIA, +// dataGenerateType: DataGenerateType.DATA_TYPE_RAW, +// ), +// ) +// ..setFieldValue(HealthFields.FIELD_THRESHOLD, 41.9) +// ..setFieldValue(HealthFields.FIELD_MAX_HEART_RATE, 49.1) +// ..setFieldValue(HealthFields.FIELD_MIN_HEART_RATE, 41.1) +// ..setFieldValue(HealthFields.FIELD_AVG_HEART_RATE, 45.1); +// await HealthRecordController.updateHealthRecord( +// HealthRecordUpdateOptions( +// healthRecord: healthRecord, +// healthRecordId: '', +// ), +// ); +// log( +// 'updateHealthRecord', +// _healthTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'updateHealthRecord', +// _healthTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// void deleteHealthRecord() async { +// log( +// 'deleteHealthRecord', +// _healthTextController, +// LogOptions.call, +// ); +// try { +// await HealthRecordController.deleteHealthRecord( +// HealthRecordDeleteOptions( +// startTime: DateTime.now().subtract(const Duration(days: 14)), +// endTime: DateTime.now(), +// )..setHealthRecordIds( +// [ +// '', +// ], +// ), +// ); +// log( +// 'deleteHealthRecord', +// _healthTextController, +// LogOptions.success, +// ); +// } on PlatformException catch (e) { +// log( +// 'deleteHealthRecord', +// _healthTextController, +// LogOptions.error, +// error: e.message, +// ); +// } +// } +// +// // +// // +// // End of HealthController Methods +// +// // App's widgets. +// // +// // +// Widget expansionCard({ +// required String titleText, +// required List children, +// }) { +// return Card( +// margin: componentPadding, +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(10.0), +// ), +// child: ExpansionTile( +// title: Text( +// titleText, +// style: cardTitleTextStyle, +// ), +// children: children, +// ), +// ); +// } +// +// Widget loggingArea( +// TextEditingController moduleTextController, +// ) { +// return Column( +// children: [ +// Container( +// margin: componentPadding, +// padding: const EdgeInsets.all(8.0), +// height: 200, +// decoration: BoxDecoration( +// borderRadius: BorderRadius.circular(5.0), +// border: Border.all(color: Colors.black12), +// ), +// child: TextField( +// readOnly: true, +// maxLines: 15, +// controller: moduleTextController, +// decoration: const InputDecoration( +// enabledBorder: InputBorder.none, +// ), +// ), +// ), +// TextButton( +// child: const Text('Clear Log'), +// onPressed: () => setState(() { +// moduleTextController.text = ''; +// }), +// ) +// ], +// ); +// } +// +// void showSnackBar( +// String text, { +// Color color = Colors.blue, +// }) { +// final SnackBar snackBar = SnackBar( +// content: Text(text), +// backgroundColor: color, +// action: SnackBarAction( +// label: 'Close', +// textColor: Colors.white, +// onPressed: () { +// ScaffoldMessenger.of(context).removeCurrentSnackBar(); +// }, +// ), +// ); +// ScaffoldMessenger.of(context).showSnackBar(snackBar); +// } +// +// @override +// Widget build(BuildContext context) { +// return Scaffold( +// appBar: AppBar( +// backgroundColor: Colors.white, +// title: const Text( +// 'Huawei Health Kit', +// style: TextStyle( +// color: Colors.blue, +// fontWeight: FontWeight.bold, +// ), +// ), +// centerTitle: true, +// elevation: 0.0, +// actions: [ +// IconButton( +// onPressed: requestAuth, +// icon: const Icon(Icons.ac_unit), +// ), +// ], +// ), +// body: Builder( +// builder: (BuildContext context) { +// return ListView( +// physics: const BouncingScrollPhysics( +// parent: AlwaysScrollableScrollPhysics(), +// ), +// children: [ +// // Sign In Widgets +// Card( +// margin: componentPadding, +// shape: RoundedRectangleBorder( +// borderRadius: BorderRadius.circular(10.0), +// ), +// child: Column( +// mainAxisAlignment: MainAxisAlignment.center, +// children: [ +// const Padding( +// padding: componentPadding, +// child: Text( +// 'Tap to SignIn button to obtain the HMS Account to complete ' +// 'login and authorization, and then use other buttons ' +// 'to try the related API functions.', +// textAlign: TextAlign.center, +// ), +// ), +// const Padding( +// padding: componentPadding, +// child: Text( +// 'Note: If the login page is not displayed, change the package ' +// 'name, AppID, and configure the signature file by referring ' +// 'to the developer guide on the official website.', +// textAlign: TextAlign.center, +// style: TextStyle( +// color: Colors.blue, +// ), +// ), +// ), +// Container( +// padding: componentPadding, +// width: double.infinity, +// child: OutlinedButton( +// style: ButtonStyle( +// backgroundColor: MaterialStateProperty.all( +// Colors.blue, +// ), +// ), +// child: const Text( +// 'SignIn', +// style: TextStyle( +// color: Colors.white, +// ), +// ), +// onPressed: () => signIn(), +// ), +// ), +// ], +// ), +// ), +// +// // ActivityRecordsController +// expansionCard( +// titleText: 'ActivityRecords Controller', +// children: [ +// loggingArea(_activityTextController), +// ListTile( +// title: const Text('AddActivityRecord'), +// onTap: () => addActivityRecord(), +// ), +// ListTile( +// title: const Text('GetActivityRecord'), +// onTap: () => getActivityRecord(), +// ), +// ListTile( +// title: const Text('beginActivityRecord'), +// onTap: () => beginActivityRecord(), +// ), +// ListTile( +// title: const Text('endActivityRecord'), +// onTap: () => endActivityRecord(), +// ), +// ListTile( +// title: const Text('endAllActivityRecords'), +// onTap: () => endAllActivityRecords(), +// ), +// ], +// ), +// // DataController Widgets +// expansionCard( +// titleText: 'DataController', +// children: [ +// loggingArea(_dataTextController), +// ListTile( +// title: const Text('readTodaySummation'), +// onTap: () => readTodaySummation(), +// ), +// ListTile( +// title: const Text('readDailySummationList'), +// onTap: () => readDailySummationList(), +// ), +// ListTile( +// title: const Text('insert'), +// onTap: () => insert(), +// ), +// ListTile( +// title: const Text('read'), +// onTap: () => read(), +// ), +// ListTile( +// title: const Text('update'), +// onTap: () => update(), +// ), +// ListTile( +// title: const Text('delete'), +// onTap: () => delete(), +// ), +// ListTile( +// title: const Text('clearAll'), +// onTap: () => clearAll(), +// ), +// ], +// ), +// // SettingController Widgets. +// expansionCard( +// titleText: 'SettingController', +// children: [ +// loggingArea(_settingTextController), +// ListTile( +// title: const Text('addDataType'), +// onTap: () => addDataType(), +// ), +// ListTile( +// title: const Text('readDataType'), +// onTap: () => readDataType(), +// ), +// ListTile( +// title: const Text('disableHiHealth'), +// onTap: () => disableHiHealth(), +// ), +// ListTile( +// title: const Text('checkHealthAppAuthorization'), +// onTap: () => checkHealthAppAuthorization(), +// ), +// ListTile( +// title: const Text('getHealthAppAuthorization'), +// onTap: () => getHealthAppAuthorization(), +// ), +// ], +// ), +// // AutoRecorderController Widgets +// expansionCard( +// titleText: 'AutoRecorderController', +// children: [ +// loggingArea(_autoRecorderTextController), +// ListTile( +// title: const Text('startRecord'), +// onTap: () => startRecord(), +// ), +// ListTile( +// title: const Text('stopRecord'), +// onTap: () => stopRecord(), +// ), +// ], +// ), +// // Consent Controller Widgets +// expansionCard( +// titleText: 'ConsentController', +// children: [ +// loggingArea(_consentTextController), +// ListTile( +// title: const Text('getAppId'), +// onTap: () => getAppId(), +// ), +// ListTile( +// title: const Text('getScopes'), +// onTap: () => getScopes(), +// ), +// ListTile( +// title: const Text('revoke'), +// onTap: () => revoke(), +// ), +// ListTile( +// title: const Text('revokeWithScopes'), +// onTap: () => revokeWithScopes(), +// ), +// ], +// ), +// +// // Health Controller Widgets +// expansionCard( +// titleText: 'HealthController', +// children: [ +// loggingArea(_healthTextController), +// ListTile( +// title: const Text('addHealthRecord'), +// onTap: () => addHealthRecord(), +// ), +// ListTile( +// title: const Text('getHealthRecord'), +// onTap: () => getHealthRecord(), +// ), +// ListTile( +// title: const Text('updateHealthRecord'), +// onTap: () => updateHealthRecord(), +// ), +// ListTile( +// title: const Text('deleteHealthRecord'), +// onTap: () => deleteHealthRecord(), +// ), +// ], +// ), +// ], +// ); +// }, +// ), +// ); +// } +// } +// +// /// Options for logging. +// enum LogOptions { +// call, +// success, +// error, +// custom, +// } diff --git a/package/device_calendar_plus/CHANGELOG.md b/package/device_calendar_plus/CHANGELOG.md new file mode 100644 index 00000000..466b9b0c --- /dev/null +++ b/package/device_calendar_plus/CHANGELOG.md @@ -0,0 +1,52 @@ +## 0.3.1 - 2025-11-07 + +### Fixed +- `showEventModal()` now properly awaits until the modal is dismissed (iOS and Android) + +## 0.3.0 - 2024-11-05 + +### Changed +- **BREAKING**: `deleteEvent()` now requires named parameter `eventId` and always deletes entire series for recurring events +- **BREAKING**: `updateEvent()` now uses named parameter `eventId` (renamed from `instanceId`) and always updates entire series for recurring events +- **BREAKING**: Removed `deleteAllInstances` and `updateAllInstances` parameters - operations on recurring events now always affect the entire series +- Renamed `getEvent()` and `showEventModal()` parameter from `instanceId` to `id` to clarify that both event IDs and instance IDs are accepted + +### Removed +- **BREAKING**: `NOT_SUPPORTED` error code (no longer needed) + +## 0.2.0 - 2024-11-05 + +### Added +- `openAppSettings()` method to guide users to system settings when permissions are denied +- Testing status documentation in README + +### Removed +- **BREAKING**: `getPlatformVersion()` method (unused boilerplate) + +### Changed +- Updated all platform packages to 0.2.0 + +## 0.1.1 - 2024-11-04 + +### Added +- Android: ProGuard/R8 rules for release build compatibility + +## 0.1.0 - 2024-11-04 + +Initial release. + +### Added +- Calendar permissions management (request/check) +- List device calendars with metadata (name, color, read-only status, primary flag) +- Query events by date range with optional calendar filtering +- Get single event by ID with support for recurring event instances +- Create events with full metadata support +- Update events including single-instance and all-instance updates for recurring events +- Delete events (single or all instances) +- Show native event modal +- All-day event support with floating date behavior +- Timezone handling for timed events +- Typed exception model with `DeviceCalendarException` and `DeviceCalendarError` enum +- Federated plugin architecture (Android + iOS) +- Support for Android API 24+ (target/compile 35) +- Support for iOS 13+ \ No newline at end of file diff --git a/package/device_calendar_plus/LICENSE b/package/device_calendar_plus/LICENSE new file mode 100644 index 00000000..0152eb2c --- /dev/null +++ b/package/device_calendar_plus/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 bullet.to + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/package/device_calendar_plus/README.md b/package/device_calendar_plus/README.md new file mode 100644 index 00000000..73c0751c --- /dev/null +++ b/package/device_calendar_plus/README.md @@ -0,0 +1,381 @@ +# device_calendar_plus + +A modern, maintained Flutter plugin for reading and writing device calendar events on **Android** and **iOS**. +Modern replacement for the unmaintained [`device_calendar`](https://pub.dev/packages/device_calendar) plugin — rebuilt for 2025 Flutter standards, working towards feature parity with a cleaner API, and no timezone package dependency. + +[![pub package](https://img.shields.io/pub/v/device_calendar_plus.svg)](https://pub.dev/packages/device_calendar_plus) +[![pub points](https://img.shields.io/pub/points/device_calendar_plus)](https://pub.dev/packages/device_calendar_plus/score) +[![platforms](https://img.shields.io/badge/platforms-android%20%7C%20ios-blue.svg)](#) +[![MIT license](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) + +## ✨ Overview + +`device_calendar_plus` lets Flutter apps read and write native calendar data using: + +- **Android** Calendar Provider +- **iOS** EventKit + +It provides a **clean Dart API**, proper **time-zone handling**, and an **actively maintained** federated structure. + +Created by [Bullet](https://bullet.to) — a personal task + notes + calendar app using this plugin in production. + +## ✅ Supported versions + +| Platform | Min OS / SDK | Target / Compile | +| ----------- | -------------- | ---------------------- | +| **Android** | **minSdk 24+** | **target/compile 35** | +| **iOS** | **iOS 13+** | Latest Xcode / iOS SDK | + +## 🚀 Features + +- **Permissions**: Request and check calendar permissions +- **Calendars**: Create, read, update, and delete calendars +- **Events**: Create, read, update, and delete events +- **Query**: Retrieve events by date range or specific event IDs +- **Native UI**: Open native event modal for viewing/editing in both android and iOS +- **All-Day Events**: Proper handling of floating calendar dates +- **Timezones**: Correct timezone behavior for timed events +- **Recurring Events**: Read recurring event instances; update/delete entire series + +## 🧩 Installation + +Add the dependency to your project: + +```yaml +dependencies: + device_calendar_plus: +``` + + + +### iOS + +Add usage descriptions to your app’s **Info.plist**: + +```xml + +NSCalendarsUsageDescription +Access your calendar to view and manage events. + + +NSCalendarsFullAccessUsageDescription +Full access to view and edit your calendar events. +NSCalendarsWriteOnlyAccessUsageDescription +Add events without reading existing events. +``` + +### Android + +Add calendar permissions to `android/app/src/main/AndroidManifest.xml`: + +```xml + + +``` + +**ProGuard / R8**: ProGuard rules are automatically applied by the plugin. No manual configuration needed. + +## ⏰ DateTime and Timezone Behavior + +**All DateTimes returned by this plugin are in local time.** + +### All-Day Events (Floating Dates) + +All-day events are treated as **floating calendar dates**, not specific instants in time. This means: + +- An all-day event for "January 15, 2024" will always display as January 15, regardless of what timezone your device is in +- The date components (year, month, day) are preserved across timezone changes +- **Do NOT convert all-day event DateTimes to UTC** — they represent calendar dates, not moments in time +- Example: A birthday on "January 15" should always show as January 15, whether you're in New York or Tokyo + +### Non-All-Day Events (Instants in Time) + +Regular timed events represent specific moments in time and can be converted to UTC as needed: + +- These events have specific start/end times in a timezone (e.g., "3:00 PM New York time") +- They represent absolute instants that correspond to different local times across timezones +- **You can freely convert these DateTimes to UTC** for storage, comparison, or API calls +- Example: A meeting at "3:00 PM EST" is the same instant as "12:00 PM PST" + +### Summary + +```dart +// All-day event - treat as a calendar date, NOT a UTC instant +final birthdayEvent = await plugin.getEvent(birthdayId); +if (birthdayEvent.isAllDay) { + // ✅ Use the date components directly + print('Birthday: ${birthdayEvent.startDate.year}-${birthdayEvent.startDate.month}-${birthdayEvent.startDate.day}'); + + // ❌ Don't convert to UTC - it's a calendar date, not a moment in time + // final utcDate = birthdayEvent.startDate.toUtc(); // DON'T DO THIS +} + +// Regular timed event - this IS an instant in time +final meetingEvent = await plugin.getEvent(meetingId); +if (!meetingEvent.isAllDay) { + // ✅ Convert to UTC for storage/comparison + final utcTime = meetingEvent.startDate.toUtc(); + + // ✅ Format in local time for display + print('Meeting at: ${meetingEvent.startDate}'); +} +``` + +## 🧱 Exception model + +Each `DeviceCalendarException` uses an enum code to describe the error type: + +```dart +enum DeviceCalendarError { + permissionDenied, + ... +} +``` + +This enum provides stable, descriptive error codes for all exceptions thrown by the plugin. + +> **Note on error codes:** +> `DeviceCalendarError` exists for developer ergonomics and clearer `switch` handling. +> We may introduce new enum values in future minor versions as new error cases appear. +We do not consider this a breaking change. + + +## 🛠️ Usage Examples + +### Request Permissions + +```dart +import 'package:device_calendar_plus/device_calendar_plus.dart'; + +// Get the singleton instance +final plugin = DeviceCalendar.instance; + +// Request calendar permissions +final status = await plugin.requestPermissions(); +if (status != CalendarPermissionStatus.granted) { + // Handle permission denied + return; +} +``` + +### Check Permissions + +Use `hasPermissions()` to check the current permission status without prompting the user: + +```dart +final plugin = DeviceCalendar.instance; + +// Check current permission status (doesn't prompt) +final status = await plugin.hasPermissions(); + +if (status == CalendarPermissionStatus.granted) { + // Permissions already granted + final calendars = await plugin.listCalendars(); +} else if (status == CalendarPermissionStatus.notDetermined) { + // User hasn't been asked yet - now we can prompt + final newStatus = await plugin.requestPermissions(); +} else { + // Denied or restricted - show appropriate UI + print('Permissions: $status'); +} +``` + +### List Calendars + +```dart +final plugin = DeviceCalendar.instance; + +// List all calendars +final calendars = await plugin.listCalendars(); +for (final calendar in calendars) { + print('${calendar.name} (${calendar.readOnly ? "read-only" : "writable"})'); + if (calendar.isPrimary) { + print(' ⭐ Primary calendar'); + } + if (calendar.colorHex != null) { + print(' Color: ${calendar.colorHex}'); + } +} + +// Find a writable calendar +final writableCalendar = calendars.firstWhere( + (cal) => !cal.readOnly, + orElse: () => calendars.first, +); +``` + +### Retrieve Events + +```dart +final plugin = DeviceCalendar.instance; + +// Get events for the next 30 days +final now = DateTime.now(); +final startDate = now; +final endDate = now.add(const Duration(days: 30)); + +// Get events from all calendars +final allEvents = await plugin.listEvents( + startDate, + endDate, +); +print('Found ${allEvents.length} events'); + +// Get events from specific calendars only +final calendarIds = ['calendar-id-1', 'calendar-id-2']; +final filteredEvents = await plugin.listEvents( + startDate, + endDate, + calendarIds: calendarIds, +); + +``` + +### Get Single Event + +```dart +final plugin = DeviceCalendar.instance; + +// Get a specific event by instanceId +final event = await plugin.getEvent(event.instanceId); +if (event != null) { + print('Event: ${event.title}'); +} + +// For recurring events, get a specific occurrence +final instance = await plugin.getEvent(event.instanceId); + +// For recurring events, get the master event definition +final masterEvent = await plugin.getEvent(event.eventId); +``` + +### Show Event in Modal + +```dart +final plugin = DeviceCalendar.instance; + +// Show a specific event in a modal dialog +await plugin.showEventModal(event.instanceId); + +// For recurring events, show a specific occurrence +await plugin.showEventModal(event.instanceId); + +// For recurring events, show the master event +await plugin.showEventModal(event.eventId); +``` + +### Create Event + +```dart +final plugin = DeviceCalendar.instance; + +// Create a basic event +final eventId = await plugin.createEvent( + calendarId: 'your-calendar-id', + title: 'Team Meeting', + startDate: DateTime(2024, 3, 20, 14, 0), + endDate: DateTime(2024, 3, 20, 15, 0), +); + +// Create an all-day event +final allDayEventId = await plugin.createEvent( + calendarId: 'your-calendar-id', + title: 'Conference', + startDate: DateTime(2024, 3, 20), + endDate: DateTime(2024, 3, 21), + isAllDay: true, +); + +// Create event with all optional parameters +final detailedEventId = await plugin.createEvent( + calendarId: 'your-calendar-id', + title: 'Project Kickoff', + startDate: DateTime(2024, 3, 20, 10, 0), + endDate: DateTime(2024, 3, 20, 12, 0), + description: 'Quarterly project kickoff meeting', + location: 'Conference Room A', + timeZone: 'America/New_York', + availability: EventAvailability.busy, +); +``` + +### Update Event + +```dart +final plugin = DeviceCalendar.instance; + +// Update event title +await plugin.updateEvent( + instanceId: event.instanceId, + title: 'Updated Meeting Title', +); + +// Update multiple fields +await plugin.updateEvent( + instanceId: event.instanceId, + title: 'Team Sync', + startDate: DateTime(2024, 3, 21, 15, 0), + endDate: DateTime(2024, 3, 21, 16, 0), + location: 'Conference Room B', + description: 'Updated description', +); + +// Change a timed event to all-day +await plugin.updateEvent( + instanceId: event.instanceId, + isAllDay: true, +); + +// Change an all-day event to timed +await plugin.updateEvent( + instanceId: event.instanceId, + isAllDay: false, + startDate: DateTime(2024, 3, 21, 10, 0), + endDate: DateTime(2024, 3, 21, 11, 0), +); + +// Update timezone (reinterprets local time) +// Note: "3 PM EST" becomes "3 PM PST" (different instant in time) +await plugin.updateEvent( + instanceId: event.instanceId, + timeZone: 'America/Los_Angeles', +); +``` + +**Note on Recurring Events**: For recurring events, `updateEvent` will always update the ENTIRE series (all past and future occurrences). Single-instance updates are not supported to maintain consistent behavior across platforms. + +### Delete Event + +```dart +final plugin = DeviceCalendar.instance; + +// Delete a single event +await plugin.deleteEvent(event.instanceId); + +// For recurring events, this deletes the ENTIRE series (all occurrences) +await plugin.deleteEvent(event.instanceId); +``` + +## 🤝 Contributing + +Contributions, PRs and issue reports welcome. +Open an issue first for larger features or breaking changes. + +- Code style: `dart format .` +- Run tests: `flutter test` +- Federated layout: platform code lives in + `/packages/device_calendar_plus_android` and `/packages/device_calendar_plus_ios`; + shared contracts in `/packages/device_calendar_plus_platform_interface`. + +## 🧪 Testing Status + +This plugin includes both **unit tests** and **integration tests** to ensure reliability. + +## 📄 License + +MIT © 2025 Bullet +See [LICENSE](LICENSE) for details. + +--- + +**Maintained by [Bullet](https://bullet.to)** — a cross-platform task + notes + calendar app built with Flutter. \ No newline at end of file diff --git a/package/device_calendar_plus/analysis_options.yaml b/package/device_calendar_plus/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/package/device_calendar_plus/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/package/device_calendar_plus/example/README.md b/package/device_calendar_plus/example/README.md new file mode 100644 index 00000000..2b3fce4c --- /dev/null +++ b/package/device_calendar_plus/example/README.md @@ -0,0 +1,16 @@ +# example + +A new Flutter project. + +## Getting Started + +This project is a starting point for a Flutter application. + +A few resources to get you started if this is your first Flutter project: + +- [Lab: Write your first Flutter app](https://docs.flutter.dev/get-started/codelab) +- [Cookbook: Useful Flutter samples](https://docs.flutter.dev/cookbook) + +For help getting started with Flutter development, view the +[online documentation](https://docs.flutter.dev/), which offers tutorials, +samples, guidance on mobile development, and a full API reference. diff --git a/package/device_calendar_plus/example/README_INTEGRATION_TESTS.md b/package/device_calendar_plus/example/README_INTEGRATION_TESTS.md new file mode 100644 index 00000000..be9af8ad --- /dev/null +++ b/package/device_calendar_plus/example/README_INTEGRATION_TESTS.md @@ -0,0 +1,43 @@ +# Integration Tests + +This directory contains integration tests for the Device Calendar Plus plugin. + +## Running Integration Tests + +### Quick Start + +Use the provided script to automatically handle permissions and run tests: + +```bash +./run_integration_tests.sh +``` + +**Note:** The script handles everything automatically - no manual permission granting needed! + +### Find Device IDs + +List available devices: +```bash +flutter devices +``` + +Example output: +``` +iPhone 16 (mobile) • F0A86A59-EB1B-4AA2-B487-8D3AA46664D8 • ios +sdk gphone64 arm64 (mobile) • emulator-5554 • android +``` + +### Examples + +```bash +# Run on iOS simulator +./run_integration_tests.sh F0A86A59-EB1B-4AA2-B487-8D3AA46664D8 + +# Run on Android emulator +./run_integration_tests.sh emulator-5554 + +# Run on booted iOS simulator +./run_integration_tests.sh booted +``` + +**Note:** The script is recommended as it handles platform detection and permission granting automatically. \ No newline at end of file diff --git a/package/device_calendar_plus/example/analysis_options.yaml b/package/device_calendar_plus/example/analysis_options.yaml new file mode 100644 index 00000000..0d290213 --- /dev/null +++ b/package/device_calendar_plus/example/analysis_options.yaml @@ -0,0 +1,28 @@ +# This file configures the analyzer, which statically analyzes Dart code to +# check for errors, warnings, and lints. +# +# The issues identified by the analyzer are surfaced in the UI of Dart-enabled +# IDEs (https://dart.dev/tools#ides-and-editors). The analyzer can also be +# invoked from the command line by running `flutter analyze`. + +# The following line activates a set of recommended lints for Flutter apps, +# packages, and plugins designed to encourage good coding practices. +include: package:flutter_lints/flutter.yaml + +linter: + # The lint rules applied to this project can be customized in the + # section below to disable rules from the `package:flutter_lints/flutter.yaml` + # included above or to enable additional rules. A list of all available lints + # and their documentation is published at https://dart.dev/lints. + # + # Instead of disabling a lint rule for the entire project in the + # section below, it can also be suppressed for a single line of code + # or a specific dart file by using the `// ignore: name_of_lint` and + # `// ignore_for_file: name_of_lint` syntax on the line or in the file + # producing the lint. + rules: + # avoid_print: false # Uncomment to disable the `avoid_print` rule + # prefer_single_quotes: true # Uncomment to enable the `prefer_single_quotes` rule + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/package/device_calendar_plus/example/android/app/build.gradle.kts b/package/device_calendar_plus/example/android/app/build.gradle.kts new file mode 100644 index 00000000..83e256df --- /dev/null +++ b/package/device_calendar_plus/example/android/app/build.gradle.kts @@ -0,0 +1,44 @@ +plugins { + id("com.android.application") + id("kotlin-android") + // The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins. + id("dev.flutter.flutter-gradle-plugin") +} + +android { + namespace = "to.bullet.example" + compileSdk = flutter.compileSdkVersion + ndkVersion = flutter.ndkVersion + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11.toString() + } + + defaultConfig { + // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). + applicationId = "to.bullet.example" + // You can update the following values to match your application needs. + // For more information, see: https://flutter.dev/to/review-gradle-config. + minSdk = flutter.minSdkVersion + targetSdk = flutter.targetSdkVersion + versionCode = flutter.versionCode + versionName = flutter.versionName + } + + buildTypes { + release { + // TODO: Add your own signing config for the release build. + // Signing with the debug keys for now, so `flutter run --release` works. + signingConfig = signingConfigs.getByName("debug") + } + } +} + +flutter { + source = "../.." +} diff --git a/package/device_calendar_plus/example/android/app/src/debug/AndroidManifest.xml b/package/device_calendar_plus/example/android/app/src/debug/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/package/device_calendar_plus/example/android/app/src/debug/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/package/device_calendar_plus/example/android/app/src/main/AndroidManifest.xml b/package/device_calendar_plus/example/android/app/src/main/AndroidManifest.xml new file mode 100644 index 00000000..73ac6cb3 --- /dev/null +++ b/package/device_calendar_plus/example/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package/device_calendar_plus/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java b/package/device_calendar_plus/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java new file mode 100644 index 00000000..59288ff6 --- /dev/null +++ b/package/device_calendar_plus/example/android/app/src/main/java/io/flutter/plugins/GeneratedPluginRegistrant.java @@ -0,0 +1,29 @@ +package io.flutter.plugins; + +import androidx.annotation.Keep; +import androidx.annotation.NonNull; +import io.flutter.Log; + +import io.flutter.embedding.engine.FlutterEngine; + +/** + * Generated file. Do not edit. + * This file is generated by the Flutter tool based on the + * plugins that support the Android platform. + */ +@Keep +public final class GeneratedPluginRegistrant { + private static final String TAG = "GeneratedPluginRegistrant"; + public static void registerWith(@NonNull FlutterEngine flutterEngine) { + try { + flutterEngine.getPlugins().add(new to.bullet.device_calendar_plus_android.DeviceCalendarPlusAndroidPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin device_calendar_plus_android, to.bullet.device_calendar_plus_android.DeviceCalendarPlusAndroidPlugin", e); + } + try { + flutterEngine.getPlugins().add(new dev.flutter.plugins.integration_test.IntegrationTestPlugin()); + } catch (Exception e) { + Log.e(TAG, "Error registering plugin integration_test, dev.flutter.plugins.integration_test.IntegrationTestPlugin", e); + } + } +} diff --git a/package/device_calendar_plus/example/android/app/src/main/kotlin/to/bullet/example/MainActivity.kt b/package/device_calendar_plus/example/android/app/src/main/kotlin/to/bullet/example/MainActivity.kt new file mode 100644 index 00000000..49bba550 --- /dev/null +++ b/package/device_calendar_plus/example/android/app/src/main/kotlin/to/bullet/example/MainActivity.kt @@ -0,0 +1,5 @@ +package to.bullet.example + +import io.flutter.embedding.android.FlutterActivity + +class MainActivity : FlutterActivity() diff --git a/package/device_calendar_plus/example/android/app/src/main/res/drawable-v21/launch_background.xml b/package/device_calendar_plus/example/android/app/src/main/res/drawable-v21/launch_background.xml new file mode 100644 index 00000000..f74085f3 --- /dev/null +++ b/package/device_calendar_plus/example/android/app/src/main/res/drawable-v21/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/package/device_calendar_plus/example/android/app/src/main/res/drawable/launch_background.xml b/package/device_calendar_plus/example/android/app/src/main/res/drawable/launch_background.xml new file mode 100644 index 00000000..304732f8 --- /dev/null +++ b/package/device_calendar_plus/example/android/app/src/main/res/drawable/launch_background.xml @@ -0,0 +1,12 @@ + + + + + + + + diff --git a/package/device_calendar_plus/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/package/device_calendar_plus/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..db77bb4b7b0906d62b1847e87f15cdcacf6a4f29 GIT binary patch literal 544 zcmeAS@N?(olHy`uVBq!ia0vp^9w5xY3?!3`olAj~WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8bpbvhu0Wd6uZuB!w&u2PAxD2eNXD>P5D~Wn-+_Wa#27Xc zC?Zj|6r#X(-D3u$NCt}(Ms06KgJ4FxJVv{GM)!I~&n8Bnc94O7-Hd)cjDZswgC;Qs zO=b+9!WcT8F?0rF7!Uys2bs@gozCP?z~o%U|N3vA*22NaGQG zlg@K`O_XuxvZ&Ks^m&R!`&1=spLvfx7oGDKDwpwW`#iqdw@AL`7MR}m`rwr|mZgU`8P7SBkL78fFf!WnuYWm$5Z0 zNXhDbCv&49sM544K|?c)WrFfiZvCi9h0O)B3Pgg&ebxsLQ05GG~ AQ2+n{ literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/package/device_calendar_plus/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..17987b79bb8a35cc66c3c1fd44f5a5526c1b78be GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA3?vioaBc-sk|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*D5Xx&nMcT!A!W`0S9QKQy;}1Cl^CgaH=;G9cpY;r$Q>i*pfB zP2drbID<_#qf;rPZx^FqH)F_D#*k@@q03KywUtLX8Ua?`H+NMzkczFPK3lFz@i_kW%1NOn0|D2I9n9wzH8m|-tHjsw|9>@K=iMBhxvkv6m8Y-l zytQ?X=U+MF$@3 zt`~i=@j|6y)RWMK--}M|=T`o&^Ni>IoWKHEbBXz7?A@mgWoL>!*SXo`SZH-*HSdS+ yn*9;$7;m`l>wYBC5bq;=U}IMqLzqbYCidGC!)_gkIk_C@Uy!y&wkt5C($~2D>~)O*cj@FGjOCM)M>_ixfudOh)?xMu#Fs z#}Y=@YDTwOM)x{K_j*Q;dPdJ?Mz0n|pLRx{4n|)f>SXlmV)XB04CrSJn#dS5nK2lM zrZ9#~WelCp7&e13Y$jvaEXHskn$2V!!DN-nWS__6T*l;H&Fopn?A6HZ-6WRLFP=R` zqG+CE#d4|IbyAI+rJJ`&x9*T`+a=p|0O(+s{UBcyZdkhj=yS1>AirP+0R;mf2uMgM zC}@~JfByORAh4SyRgi&!(cja>F(l*O+nd+@4m$|6K6KDn_&uvCpV23&>G9HJp{xgg zoq1^2_p9@|WEo z*X_Uko@K)qYYv~>43eQGMdbiGbo>E~Q& zrYBH{QP^@Sti!`2)uG{irBBq@y*$B zi#&(U-*=fp74j)RyIw49+0MRPMRU)+a2r*PJ$L5roHt2$UjExCTZSbq%V!HeS7J$N zdG@vOZB4v_lF7Plrx+hxo7(fCV&}fHq)$ literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/package/device_calendar_plus/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1c8d34e7a88e3f88bea192c3a370d44689c3c GIT binary patch literal 1031 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q8Ax83A=Cw=BuiW)N`mv#O3D+9QW+dm@{>{( zJaZG%Q-e|yQz{EjrrIztFa`(sgt!6~Yi|1%a`XoT0ojZ}lNrNjb9xjc(B0U1_% zz5^97Xt*%oq$rQy4?0GKNfJ44uvxI)gC`h-NZ|&0-7(qS@?b!5r36oQ}zyZrNO3 zMO=Or+<~>+A&uN&E!^Sl+>xE!QC-|oJv`ApDhqC^EWD|@=#J`=d#Xzxs4ah}w&Jnc z$|q_opQ^2TrnVZ0o~wh<3t%W&flvYGe#$xqda2bR_R zvPYgMcHgjZ5nSA^lJr%;<&0do;O^tDDh~=pIxA#coaCY>&N%M2^tq^U%3DB@ynvKo}b?yu-bFc-u0JHzced$sg7S3zqI(2 z#Km{dPr7I=pQ5>FuK#)QwK?Y`E`B?nP+}U)I#c1+FM*1kNvWG|a(TpksZQ3B@sD~b zpQ2)*V*TdwjFOtHvV|;OsiDqHi=6%)o4b!)x$)%9pGTsE z-JL={-Ffv+T87W(Xpooq<`r*VzWQcgBN$$`u}f>-ZQI1BB8ykN*=e4rIsJx9>z}*o zo~|9I;xof literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/package/device_calendar_plus/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6372eebdb28e45604e46eeda8dd24651419bc0 GIT binary patch literal 1443 zcmb`G{WsKk6vsdJTdFg%tJav9_E4vzrOaqkWF|A724Nly!y+?N9`YV6wZ}5(X(D_N(?!*n3`|_r0Hc?=PQw&*vnU?QTFY zB_MsH|!j$PP;I}?dppoE_gA(4uc!jV&0!l7_;&p2^pxNo>PEcNJv za5_RT$o2Mf!<+r?&EbHH6nMoTsDOa;mN(wv8RNsHpG)`^ymG-S5By8=l9iVXzN_eG%Xg2@Xeq76tTZ*dGh~Lo9vl;Zfs+W#BydUw zCkZ$o1LqWQO$FC9aKlLl*7x9^0q%0}$OMlp@Kk_jHXOjofdePND+j!A{q!8~Jn+s3 z?~~w@4?egS02}8NuulUA=L~QQfm;MzCGd)XhiftT;+zFO&JVyp2mBww?;QByS_1w! zrQlx%{^cMj0|Bo1FjwY@Q8?Hx0cIPF*@-ZRFpPc#bBw{5@tD(5%sClzIfl8WU~V#u zm5Q;_F!wa$BSpqhN>W@2De?TKWR*!ujY;Yylk_X5#~V!L*Gw~;$%4Q8~Mad z@`-kG?yb$a9cHIApZDVZ^U6Xkp<*4rU82O7%}0jjHlK{id@?-wpN*fCHXyXh(bLt* zPc}H-x0e4E&nQ>y%B-(EL=9}RyC%MyX=upHuFhAk&MLbsF0LP-q`XnH78@fT+pKPW zu72MW`|?8ht^tz$iC}ZwLp4tB;Q49K!QCF3@!iB1qOI=?w z7In!}F~ij(18UYUjnbmC!qKhPo%24?8U1x{7o(+?^Zu0Hx81|FuS?bJ0jgBhEMzf< zCgUq7r2OCB(`XkKcN-TL>u5y#dD6D!)5W?`O5)V^>jb)P)GBdy%t$uUMpf$SNV31$ zb||OojAbvMP?T@$h_ZiFLFVHDmbyMhJF|-_)HX3%m=CDI+ID$0^C>kzxprBW)hw(v zr!Gmda);ICoQyhV_oP5+C%?jcG8v+D@9f?Dk*!BxY}dazmrT@64UrP3hlslANK)bq z$67n83eh}OeW&SV@HG95P|bjfqJ7gw$e+`Hxo!4cx`jdK1bJ>YDSpGKLPZ^1cv$ek zIB?0S<#tX?SJCLWdMd{-ME?$hc7A$zBOdIJ)4!KcAwb=VMov)nK;9z>x~rfT1>dS+ zZ6#`2v@`jgbqq)P22H)Tx2CpmM^o1$B+xT6`(v%5xJ(?j#>Q$+rx_R|7TzDZe{J6q zG1*EcU%tE?!kO%^M;3aM6JN*LAKUVb^xz8-Pxo#jR5(-KBeLJvA@-gxNHx0M-ZJLl z;#JwQoh~9V?`UVo#}{6ka@II>++D@%KqGpMdlQ}?9E*wFcf5(#XQnP$Dk5~%iX^>f z%$y;?M0BLp{O3a(-4A?ewryHrrD%cx#Q^%KY1H zNre$ve+vceSLZcNY4U(RBX&)oZn*Py()h)XkE?PL$!bNb{N5FVI2Y%LKEm%yvpyTP z(1P?z~7YxD~Rf<(a@_y` literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/android/app/src/main/res/values-night/styles.xml b/package/device_calendar_plus/example/android/app/src/main/res/values-night/styles.xml new file mode 100644 index 00000000..06952be7 --- /dev/null +++ b/package/device_calendar_plus/example/android/app/src/main/res/values-night/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/package/device_calendar_plus/example/android/app/src/main/res/values/styles.xml b/package/device_calendar_plus/example/android/app/src/main/res/values/styles.xml new file mode 100644 index 00000000..cb1ef880 --- /dev/null +++ b/package/device_calendar_plus/example/android/app/src/main/res/values/styles.xml @@ -0,0 +1,18 @@ + + + + + + + diff --git a/package/device_calendar_plus/example/android/app/src/profile/AndroidManifest.xml b/package/device_calendar_plus/example/android/app/src/profile/AndroidManifest.xml new file mode 100644 index 00000000..399f6981 --- /dev/null +++ b/package/device_calendar_plus/example/android/app/src/profile/AndroidManifest.xml @@ -0,0 +1,7 @@ + + + + diff --git a/package/device_calendar_plus/example/android/build.gradle.kts b/package/device_calendar_plus/example/android/build.gradle.kts new file mode 100644 index 00000000..dbee657b --- /dev/null +++ b/package/device_calendar_plus/example/android/build.gradle.kts @@ -0,0 +1,24 @@ +allprojects { + repositories { + google() + mavenCentral() + } +} + +val newBuildDir: Directory = + rootProject.layout.buildDirectory + .dir("../../build") + .get() +rootProject.layout.buildDirectory.value(newBuildDir) + +subprojects { + val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name) + project.layout.buildDirectory.value(newSubprojectBuildDir) +} +subprojects { + project.evaluationDependsOn(":app") +} + +tasks.register("clean") { + delete(rootProject.layout.buildDirectory) +} diff --git a/package/device_calendar_plus/example/android/gradle.properties b/package/device_calendar_plus/example/android/gradle.properties new file mode 100644 index 00000000..f018a618 --- /dev/null +++ b/package/device_calendar_plus/example/android/gradle.properties @@ -0,0 +1,3 @@ +org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError +android.useAndroidX=true +android.enableJetifier=true diff --git a/package/device_calendar_plus/example/android/gradle/wrapper/gradle-wrapper.properties b/package/device_calendar_plus/example/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..ac3b4792 --- /dev/null +++ b/package/device_calendar_plus/example/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip diff --git a/package/device_calendar_plus/example/android/local.properties b/package/device_calendar_plus/example/android/local.properties new file mode 100644 index 00000000..a4725303 --- /dev/null +++ b/package/device_calendar_plus/example/android/local.properties @@ -0,0 +1,2 @@ +sdk.dir=/Users/cloud/Library/Android/sdk +flutter.sdk=/Users/cloud/sdk/flutter \ No newline at end of file diff --git a/package/device_calendar_plus/example/android/settings.gradle.kts b/package/device_calendar_plus/example/android/settings.gradle.kts new file mode 100644 index 00000000..fb605bc8 --- /dev/null +++ b/package/device_calendar_plus/example/android/settings.gradle.kts @@ -0,0 +1,26 @@ +pluginManagement { + val flutterSdkPath = + run { + val properties = java.util.Properties() + file("local.properties").inputStream().use { properties.load(it) } + val flutterSdkPath = properties.getProperty("flutter.sdk") + require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" } + flutterSdkPath + } + + includeBuild("$flutterSdkPath/packages/flutter_tools/gradle") + + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} + +plugins { + id("dev.flutter.flutter-plugin-loader") version "1.0.0" + id("com.android.application") version "8.9.1" apply false + id("org.jetbrains.kotlin.android") version "2.1.0" apply false +} + +include(":app") diff --git a/package/device_calendar_plus/example/integration_test/device_calendar_test.dart b/package/device_calendar_plus/example/integration_test/device_calendar_test.dart new file mode 100644 index 00000000..6da9f023 --- /dev/null +++ b/package/device_calendar_plus/example/integration_test/device_calendar_test.dart @@ -0,0 +1,862 @@ +// import 'package:device_calendar_plus/device_calendar_plus.dart'; +// import 'package:flutter_test/flutter_test.dart'; +// import 'package:integration_test/integration_test.dart'; +// +// void main() { +// IntegrationTestWidgetsFlutterBinding.ensureInitialized(); +// +// group('Device Calendar Integration Tests', () { +// late DeviceCalendar plugin; +// final List createdCalendarIds = []; +// +// setUpAll(() { +// plugin = DeviceCalendar.instance; +// }); +// +// tearDownAll(() async { +// // Clean up all created calendars +// if (createdCalendarIds.isNotEmpty) { +// for (final id in createdCalendarIds) { +// await plugin.deleteCalendar(id); +// } +// } +// }); +// +// test('1. Request Permissions', () async { +// final status = await plugin.requestPermissions(); +// +// // The test will continue regardless of permission status, but warn if denied +// if (status != CalendarPermissionStatus.granted) {} +// +// expect( +// status, +// isIn([ +// CalendarPermissionStatus.granted, +// CalendarPermissionStatus.denied, +// CalendarPermissionStatus.restricted, +// ])); +// }); +// +// test('1b. Check Permissions Status', () async { +// final status = await plugin.hasPermissions(); +// +// // After auto-granting permissions via run_integration_tests.sh, +// // the status should be granted +// expect(status, CalendarPermissionStatus.granted); +// }); +// +// test('2. Create and Delete Calendar', () async { +// // This test creates and immediately deletes a calendar to verify delete works +// // If delete fails, only one calendar needs manual cleanup +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarName = 'Create-Delete Test $timestamp'; +// +// // Create calendar +// final calendarId = await plugin.createCalendar(name: calendarName); +// expect(calendarId, isNotEmpty); +// expect(calendarId, isA()); +// +// // Delete calendar +// await plugin.deleteCalendar(calendarId); +// +// // Verify it's gone by listing calendars +// final calendars = await plugin.listCalendars(); +// final deletedCalendar = +// calendars.where((cal) => cal.id == calendarId).toList(); +// expect(deletedCalendar, isEmpty, +// reason: 'Calendar should be deleted and not in list'); +// }); +// +// test('3. Verify Calendar in List', () async { +// // Create a new calendar for this test +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarName = 'Verify Test Calendar $timestamp'; +// +// final calendarId = await plugin.createCalendar(name: calendarName); +// createdCalendarIds.add(calendarId); +// +// // List all calendars +// final calendars = await plugin.listCalendars(); +// +// expect(calendars, isNotEmpty); +// +// // Find our newly created calendar +// final createdCalendar = calendars.firstWhere( +// (cal) => cal.id == calendarId, +// orElse: () => throw Exception('Created calendar not found in list'), +// ); +// +// expect(createdCalendar.name, equals(calendarName)); +// expect(createdCalendar.id, equals(calendarId)); +// }); +// +// test('4. Create Calendar with Color', () async { +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarName = 'Colored Calendar $timestamp'; +// final colorHex = '#FF5733'; +// +// final calendarId = await plugin.createCalendar( +// name: calendarName, +// colorHex: colorHex, +// ); +// +// expect(calendarId, isNotEmpty); +// createdCalendarIds.add(calendarId); +// +// // List calendars and find the one we just created +// final calendars = await plugin.listCalendars(); +// final coloredCalendar = +// calendars.firstWhere((cal) => cal.id == calendarId); +// +// expect(coloredCalendar.colorHex, isNotNull); +// +// // Note: iOS may convert the color to a different color space, +// // so we can't do an exact match. Just verify it has a color. +// +// // On Android, the color should match exactly +// // On iOS, color may be slightly different due to color space conversion +// if (coloredCalendar.colorHex != null) { +// expect(coloredCalendar.colorHex!.length, equals(7)); // #RRGGBB format +// expect(coloredCalendar.colorHex!.startsWith('#'), isTrue); +// } +// }); +// +// test('5. Create Multiple Calendars', () async { +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarNames = [ +// 'Multi Test Calendar 1 $timestamp', +// 'Multi Test Calendar 2 $timestamp', +// 'Multi Test Calendar 3 $timestamp', +// ]; +// +// final createdIds = []; +// +// // Create 3 calendars +// for (final name in calendarNames) { +// final calendarId = await plugin.createCalendar(name: name); +// expect(calendarId, isNotEmpty); +// createdIds.add(calendarId); +// createdCalendarIds.add(calendarId); +// } +// +// expect(createdIds.length, equals(3)); +// expect(createdIds.toSet().length, equals(3)); // All unique IDs +// +// // Verify all 3 appear in the list +// final calendars = await plugin.listCalendars(); +// +// for (var i = 0; i < calendarNames.length; i++) { +// final calendar = calendars.firstWhere( +// (cal) => cal.id == createdIds[i], +// orElse: () => +// throw Exception('Calendar ${calendarNames[i]} not found'), +// ); +// +// expect(calendar.name, equals(calendarNames[i])); +// } +// }); +// +// test('6. Cross-Platform Consistency', () async { +// // Create a calendar and verify the data structure is consistent +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarName = 'Consistency Test $timestamp'; +// final colorHex = '#3498DB'; +// +// final calendarId = await plugin.createCalendar( +// name: calendarName, +// colorHex: colorHex, +// ); +// createdCalendarIds.add(calendarId); +// +// final calendars = await plugin.listCalendars(); +// final calendar = calendars.firstWhere((cal) => cal.id == calendarId); +// +// // Verify all expected fields are present and of correct types +// expect(calendar.id, isA()); +// expect(calendar.id, isNotEmpty); +// expect(calendar.name, isA()); +// expect(calendar.name, equals(calendarName)); +// expect(calendar.readOnly, isA()); +// expect(calendar.isPrimary, isA()); +// expect(calendar.hidden, isA()); +// +// // Optional fields +// if (calendar.colorHex != null) { +// expect(calendar.colorHex, isA()); +// } +// if (calendar.accountName != null) { +// expect(calendar.accountName, isA()); +// } +// if (calendar.accountType != null) { +// expect(calendar.accountType, isA()); +// } +// }); +// +// test('7. Update Calendar - Name Only', () async { +// // Create a calendar and update just its name +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final originalName = 'Update Name Test $timestamp'; +// final newName = 'Updated Name $timestamp'; +// +// final calendarId = await plugin.createCalendar(name: originalName); +// createdCalendarIds.add(calendarId); +// +// // Update just the name +// await plugin.updateCalendar(calendarId, name: newName); +// +// // Verify the update +// final calendars = await plugin.listCalendars(); +// final updatedCalendar = +// calendars.firstWhere((cal) => cal.id == calendarId); +// expect(updatedCalendar.name, equals(newName)); +// }); +// +// test('8. Update Calendar - Color Only', () async { +// // Create a calendar and update just its color +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarName = 'Update Color Test $timestamp'; +// final newColor = '#00FF00'; // Green +// +// final calendarId = await plugin.createCalendar( +// name: calendarName, +// colorHex: '#FF0000', // Red +// ); +// createdCalendarIds.add(calendarId); +// +// // Update just the color +// await plugin.updateCalendar(calendarId, colorHex: newColor); +// +// // Verify the update +// final calendars = await plugin.listCalendars(); +// final updatedCalendar = +// calendars.firstWhere((cal) => cal.id == calendarId); +// expect(updatedCalendar.colorHex?.toUpperCase(), +// equals(newColor.toUpperCase())); +// }); +// +// test('9. Update Calendar - Name and Color', () async { +// // Create a calendar and update both name and color +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final originalName = 'Update Both Test $timestamp'; +// final newName = 'Updated Both $timestamp'; +// final newColor = '#0000FF'; // Blue +// +// final calendarId = await plugin.createCalendar( +// name: originalName, +// colorHex: '#FF0000', // Red +// ); +// createdCalendarIds.add(calendarId); +// +// // Update both name and color +// await plugin.updateCalendar(calendarId, +// name: newName, colorHex: newColor); +// +// // Verify the updates +// final calendars = await plugin.listCalendars(); +// final updatedCalendar = +// calendars.firstWhere((cal) => cal.id == calendarId); +// expect(updatedCalendar.name, equals(newName)); +// expect(updatedCalendar.colorHex?.toUpperCase(), +// equals(newColor.toUpperCase())); +// }); +// +// test('10. Error Handling - Update with No Parameters', () async { +// // Create a calendar first +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = +// await plugin.createCalendar(name: 'Error Test $timestamp'); +// createdCalendarIds.add(calendarId); +// +// // Try to update without providing any parameters +// try { +// await plugin.updateCalendar(calendarId); +// fail('Should have thrown an error when no parameters provided'); +// } on ArgumentError catch (e) { +// expect(e.message, contains('At least one')); +// } +// }); +// +// test('11. Error Handling - Update with Empty Name', () async { +// // Create a calendar first +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = +// await plugin.createCalendar(name: 'Empty Name Test $timestamp'); +// createdCalendarIds.add(calendarId); +// +// // Try to update with an empty name +// try { +// await plugin.updateCalendar(calendarId, name: ''); +// fail('Should have thrown an error for empty name'); +// } on ArgumentError catch (e) { +// expect(e.message, contains('cannot be empty')); +// } +// }); +// +// test('12. Error Handling - Create with Empty Name', () async { +// // Attempting to create a calendar with an empty name should fail +// try { +// await plugin.createCalendar(name: ''); +// fail('Should have thrown an error for empty calendar name'); +// } on ArgumentError catch (e) { +// // Expected - test passes +// expect(e.message, contains('cannot be empty')); +// } +// }); +// +// test('13. Error Handling - Create with Whitespace-only Name', () async { +// // Whitespace-only names should also fail +// try { +// await plugin.createCalendar(name: ' '); +// fail('Should have thrown an error for whitespace-only calendar name'); +// } on ArgumentError catch (e) { +// expect(e.message, contains('cannot be empty')); +// } +// }); +// +// test('14. Color Format Variations', () async { +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// +// // Test different valid color formats +// final colorVariations = [ +// '#FF0000', // Red +// '#00FF00', // Green +// '#0000FF', // Blue +// '#FFFFFF', // White +// '#000000', // Black +// ]; +// +// for (var i = 0; i < colorVariations.length; i++) { +// final color = colorVariations[i]; +// final calendarId = await plugin.createCalendar( +// name: 'Color Test $i $timestamp', +// colorHex: color, +// ); +// +// expect(calendarId, isNotEmpty); +// createdCalendarIds.add(calendarId); +// } +// }); +// +// test('11. Create Event', () async { +// // Create a test calendar first +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = await plugin.createCalendar( +// name: 'Event Test Calendar $timestamp', +// ); +// createdCalendarIds.add(calendarId); +// +// final now = DateTime.now(); +// final startDate = DateTime(now.year, now.month, now.day, 14, 0); +// final endDate = DateTime(now.year, now.month, now.day, 15, 0); +// +// final eventId = await plugin.createEvent( +// calendarId: calendarId, +// title: 'Test Event', +// startDate: startDate, +// endDate: endDate, +// description: 'This is a test event', +// location: 'Test Location', +// availability: EventAvailability.busy, +// ); +// +// expect(eventId, isNotEmpty); +// +// // Verify event was created by retrieving it +// final events = await plugin.listEvents( +// startDate.subtract(Duration(hours: 1)), +// endDate.add(Duration(hours: 1)), +// calendarIds: [calendarId], +// ); +// +// expect(events, isNotEmpty); +// final createdEvent = events.firstWhere((e) => e.eventId == eventId); +// expect(createdEvent.title, 'Test Event'); +// expect(createdEvent.description, 'This is a test event'); +// expect(createdEvent.location, 'Test Location'); +// }); +// +// test('12. Create All-Day Event', () async { +// // Create a test calendar +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = await plugin.createCalendar( +// name: 'All-Day Event Test $timestamp', +// ); +// createdCalendarIds.add(calendarId); +// +// final today = DateTime.now(); +// final tomorrow = today.add(Duration(days: 1)); +// +// final eventId = await plugin.createEvent( +// calendarId: calendarId, +// title: 'All-Day Test Event', +// startDate: DateTime(today.year, today.month, today.day), +// endDate: DateTime(tomorrow.year, tomorrow.month, tomorrow.day), +// isAllDay: true, +// availability: EventAvailability.free, +// ); +// +// expect(eventId, isNotEmpty); +// +// // Verify the event is all-day +// final events = await plugin.listEvents( +// DateTime(today.year, today.month, today.day), +// DateTime(tomorrow.year, tomorrow.month, tomorrow.day) +// .add(Duration(days: 1)), +// calendarIds: [calendarId], +// ); +// +// expect(events, isNotEmpty); +// final allDayEvent = events.firstWhere((e) => e.eventId == eventId); +// expect(allDayEvent.isAllDay, true); +// }); +// +// test('12b. All-Day Event Date Normalization', () async { +// // Test that all-day events strip time components +// // Pass DateTime with time components, verify event is still all-day +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = await plugin.createCalendar( +// name: 'Date Normalization Test $timestamp', +// ); +// createdCalendarIds.add(calendarId); +// +// final today = DateTime.now(); +// final tomorrow = today.add(Duration(days: 1)); +// +// // Pass dates WITH time components +// final startWithTime = +// DateTime(today.year, today.month, today.day, 14, 30, 45); +// final endWithTime = +// DateTime(tomorrow.year, tomorrow.month, tomorrow.day, 18, 15, 30); +// +// final eventId = await plugin.createEvent( +// calendarId: calendarId, +// title: 'All-Day with Time Components', +// startDate: startWithTime, +// endDate: endWithTime, +// isAllDay: true, +// ); +// +// expect(eventId, isNotEmpty); +// +// // Retrieve and verify the event is still all-day +// final events = await plugin.listEvents( +// DateTime(today.year, today.month, today.day), +// DateTime(tomorrow.year, tomorrow.month, tomorrow.day) +// .add(Duration(days: 1)), +// calendarIds: [calendarId], +// ); +// +// expect(events, isNotEmpty); +// final normalizedEvent = events.firstWhere((e) => e.eventId == eventId); +// expect(normalizedEvent.isAllDay, true); +// +// // Verify the date is preserved correctly (floating date behavior) +// // All-day events should maintain the same calendar date regardless of timezone +// // The date components (year/month/day) must match what we passed in +// expect(normalizedEvent.startDate.year, today.year, +// reason: 'Year should be preserved for all-day events'); +// expect(normalizedEvent.startDate.month, today.month, +// reason: 'Month should be preserved for all-day events'); +// expect(normalizedEvent.startDate.day, today.day, +// reason: 'Day should be preserved for all-day events'); +// +// // Time should be midnight (00:00:00) +// expect(normalizedEvent.startDate.hour, 0); +// expect(normalizedEvent.startDate.minute, 0); +// expect(normalizedEvent.startDate.second, 0); +// }); +// +// test('13. Delete Event', () async { +// // Create a test calendar and event +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = await plugin.createCalendar( +// name: 'Delete Event Test $timestamp', +// ); +// createdCalendarIds.add(calendarId); +// +// final now = DateTime.now(); +// final startDate = DateTime(now.year, now.month, now.day, 16, 0); +// final endDate = DateTime(now.year, now.month, now.day, 17, 0); +// +// final eventId = await plugin.createEvent( +// calendarId: calendarId, +// title: 'Event To Delete', +// startDate: startDate, +// endDate: endDate, +// ); +// +// // Verify event exists +// final eventsBefore = await plugin.listEvents( +// startDate.subtract(Duration(hours: 1)), +// endDate.add(Duration(hours: 1)), +// calendarIds: [calendarId], +// ); +// expect(eventsBefore, isNotEmpty); +// +// // Delete the event +// await plugin.deleteEvent(eventId: eventId); +// +// // Verify event no longer exists +// final eventsAfter = await plugin.listEvents( +// startDate.subtract(Duration(hours: 1)), +// endDate.add(Duration(hours: 1)), +// calendarIds: [calendarId], +// ); +// +// final deletedEvent = +// eventsAfter.where((e) => e.eventId == eventId).toList(); +// expect(deletedEvent, isEmpty); +// }); +// +// test('14. Create Event with Different Availabilities', () async { +// // Create a test calendar +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = await plugin.createCalendar( +// name: 'Availability Test $timestamp', +// ); +// createdCalendarIds.add(calendarId); +// +// final now = DateTime.now(); +// final availabilities = [ +// EventAvailability.busy, +// EventAvailability.free, +// EventAvailability.tentative, +// ]; +// +// for (var i = 0; i < availabilities.length; i++) { +// final availability = availabilities[i]; +// final startDate = DateTime(now.year, now.month, now.day, 9 + i, 0); +// final endDate = DateTime(now.year, now.month, now.day, 10 + i, 0); +// +// final eventId = await plugin.createEvent( +// calendarId: calendarId, +// title: 'Event ${availability.name}', +// startDate: startDate, +// endDate: endDate, +// availability: availability, +// ); +// +// expect(eventId, isNotEmpty); +// } +// }); +// +// test( +// '15. Delete All Instances of Recurring Event', +// () async { +// // This test requires a recurring event to exist, which must be created +// // manually in the iOS Calendar or Android Calendar app since we don't +// // support creating recurring events yet. +// // +// // To test manually: +// // 1. Create a recurring event in your device's calendar app +// // 2. Get the instanceId (format: "eventId@timestamp") +// // 3. Uncomment and update the code below with the actual instanceId +// // 4. Run this test +// // +// // Example: +// // const recurringInstanceId = 'YOUR-EVENT-ID@1234567890000'; +// // await plugin.deleteEvent(recurringInstanceId); +// // +// // Expected: Entire series (all instances) of the recurring event should be deleted +// +// fail( +// 'This test requires manual setup. Create a recurring event in your ' +// 'device calendar app, then update this test with the instanceId.'); +// }, +// skip: 'Requires manual creation of recurring event. ' +// 'Will be automated when recurrence rule support is added.', +// ); +// +// test('16. Update Event Title', () async { +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = await plugin.createCalendar( +// name: 'Update Title Test $timestamp', +// ); +// createdCalendarIds.add(calendarId); +// +// // Create event +// final eventId = await plugin.createEvent( +// calendarId: calendarId, +// title: 'Original Title', +// startDate: DateTime.now().add(Duration(hours: 1)), +// endDate: DateTime.now().add(Duration(hours: 2)), +// ); +// +// // Update title +// await plugin.updateEvent( +// eventId: eventId, +// title: 'Updated Title', +// ); +// +// // Verify update +// final event = await plugin.getEvent(eventId); +// expect(event, isNotNull); +// expect(event!.title, 'Updated Title'); +// }); +// +// test('17. Update Event Dates', () async { +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = await plugin.createCalendar( +// name: 'Update Dates Test $timestamp', +// ); +// createdCalendarIds.add(calendarId); +// +// final originalStart = DateTime.now().add(Duration(hours: 1)); +// final originalEnd = DateTime.now().add(Duration(hours: 2)); +// +// // Create event +// final eventId = await plugin.createEvent( +// calendarId: calendarId, +// title: 'Date Update Test', +// startDate: originalStart, +// endDate: originalEnd, +// ); +// +// // Update dates +// final newStart = DateTime.now().add(Duration(days: 1, hours: 3)); +// final newEnd = DateTime.now().add(Duration(days: 1, hours: 4)); +// +// await plugin.updateEvent( +// eventId: eventId, +// startDate: newStart, +// endDate: newEnd, +// ); +// +// // Verify update +// final event = await plugin.getEvent(eventId); +// expect(event, isNotNull); +// // Allow small time differences (within 1 minute) +// expect(event!.startDate.difference(newStart).abs(), +// lessThan(Duration(minutes: 1))); +// expect(event.endDate.difference(newEnd).abs(), +// lessThan(Duration(minutes: 1))); +// }); +// +// test('18. Update Event Description and Location', () async { +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = await plugin.createCalendar( +// name: 'Update Multi-field Test $timestamp', +// ); +// createdCalendarIds.add(calendarId); +// +// // Create event +// final eventId = await plugin.createEvent( +// calendarId: calendarId, +// title: 'Multi-field Update Test', +// startDate: DateTime.now().add(Duration(hours: 1)), +// endDate: DateTime.now().add(Duration(hours: 2)), +// description: 'Original description', +// location: 'Original location', +// ); +// +// // Update multiple fields +// await plugin.updateEvent( +// eventId: eventId, +// description: 'Updated description', +// location: 'Updated location', +// ); +// +// // Verify update +// final event = await plugin.getEvent(eventId); +// expect(event, isNotNull); +// expect(event!.description, 'Updated description'); +// expect(event.location, 'Updated location'); +// }); +// +// test('19. Change Timed Event to All-Day', () async { +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = await plugin.createCalendar( +// name: 'Timed to All-Day Test $timestamp', +// ); +// createdCalendarIds.add(calendarId); +// +// final today = DateTime.now(); +// +// // Create timed event +// final eventId = await plugin.createEvent( +// calendarId: calendarId, +// title: 'Timed to All-Day', +// startDate: DateTime(today.year, today.month, today.day, 14, 0), +// endDate: DateTime(today.year, today.month, today.day, 15, 0), +// isAllDay: false, +// ); +// +// // Update to all-day +// await plugin.updateEvent( +// eventId: eventId, +// isAllDay: true, +// ); +// +// // Verify update +// final event = await plugin.getEvent(eventId); +// expect(event, isNotNull); +// expect(event!.isAllDay, true); +// // Time should be stripped to midnight +// expect(event.startDate.hour, 0); +// expect(event.startDate.minute, 0); +// expect(event.startDate.second, 0); +// }); +// +// test('20. Change All-Day Event to Timed', () async { +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = await plugin.createCalendar( +// name: 'All-Day to Timed Test $timestamp', +// ); +// createdCalendarIds.add(calendarId); +// +// final today = DateTime.now(); +// +// // Create all-day event +// final eventId = await plugin.createEvent( +// calendarId: calendarId, +// title: 'All-Day to Timed', +// startDate: DateTime(today.year, today.month, today.day), +// endDate: DateTime(today.year, today.month, today.day + 1), +// isAllDay: true, +// ); +// +// // Update to timed with specific hours +// final newStart = DateTime(today.year, today.month, today.day, 10, 0); +// final newEnd = DateTime(today.year, today.month, today.day, 11, 0); +// +// await plugin.updateEvent( +// eventId: eventId, +// isAllDay: false, +// startDate: newStart, +// endDate: newEnd, +// ); +// +// // Verify update +// final event = await plugin.getEvent(eventId); +// expect(event, isNotNull); +// expect(event!.isAllDay, false); +// // Should have specific time now (allowing small differences) +// expect(event.startDate.difference(newStart).abs(), +// lessThan(Duration(minutes: 1))); +// }); +// +// test('21. Update Event TimeZone', () async { +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = await plugin.createCalendar( +// name: 'Update Timezone Test $timestamp', +// ); +// createdCalendarIds.add(calendarId); +// +// final startDate = DateTime.now().add(Duration(hours: 1)); +// final endDate = DateTime.now().add(Duration(hours: 2)); +// +// // Create event with New York timezone +// final eventId = await plugin.createEvent( +// calendarId: calendarId, +// title: 'Timezone Update Test', +// startDate: startDate, +// endDate: endDate, +// timeZone: 'America/New_York', +// ); +// +// // Update to Los Angeles timezone +// // Note: This reinterprets the local time, not preserving the instant +// await plugin.updateEvent( +// eventId: eventId, +// timeZone: 'America/Los_Angeles', +// ); +// +// // Verify event is updated (note: the exact behavior may vary by platform) +// final event = await plugin.getEvent(eventId); +// expect(event, isNotNull); +// }); +// +// test('22. Update Event with No Fields Throws Error', () async { +// final timestamp = DateTime.now().millisecondsSinceEpoch; +// final calendarId = await plugin.createCalendar( +// name: 'No Fields Test $timestamp', +// ); +// createdCalendarIds.add(calendarId); +// +// // Create event +// final eventId = await plugin.createEvent( +// calendarId: calendarId, +// title: 'No Fields Test', +// startDate: DateTime.now().add(Duration(hours: 1)), +// endDate: DateTime.now().add(Duration(hours: 2)), +// ); +// +// // Attempt to update with no fields - should throw +// expect( +// () async => await plugin.updateEvent(eventId: eventId), +// throwsA(isA()), +// ); +// }); +// +// test( +// '24. Update All Instances of Recurring Event', +// () async { +// // This test requires a recurring event to exist, which must be created +// // manually in the iOS Calendar or Android Calendar app since we don't +// // support creating recurring events yet. +// // +// // To test manually: +// // 1. Create a recurring event in your device's calendar app +// // 2. Get the instanceId (format: "eventId" for series update) +// // 3. Uncomment and update the code below with the actual instanceId +// // 4. Run this test +// // +// // Example: +// // const recurringEventId = 'YOUR-EVENT-ID'; +// // await plugin.updateEvent( +// // instanceId: recurringEventId, +// // updateAllInstances: true, +// // title: 'Updated Recurring Event', +// // ); +// // +// // Expected: All instances of the recurring event should be updated +// +// fail( +// 'This test requires manual setup. Create a recurring event in your ' +// 'device calendar app, then update this test with the eventId.'); +// }, +// skip: 'Requires manual creation of recurring event. ' +// 'Will be automated when recurrence rule support is added.', +// ); +// +// test( +// '25. Show Event Modal Awaits Until Closed', +// () async { +// // This test requires manual verification because it involves system UI: +// // - iOS: EKEventViewController (requires XCUITest for automation) +// // - Android: External calendar app (requires Espresso inter-app testing) +// // +// // To test manually: +// // 1. Create an event in a test calendar +// // 2. Call showEventModal with the event's instanceId +// // 3. Verify the modal opens +// // 4. Add logging or UI updates after the await +// // 5. Dismiss the modal (tap Done/Back) +// // 6. Verify the Future completes ONLY after modal is dismissed +// // +// // Example: +// // final timestamp = DateTime.now().millisecondsSinceEpoch; +// // final calendarId = await plugin.createCalendar( +// // name: 'Modal Test $timestamp', +// // ); +// // final eventId = await plugin.createEvent( +// // calendarId: calendarId, +// // title: 'Modal Test Event', +// // startDate: DateTime.now().add(Duration(hours: 1)), +// // endDate: DateTime.now().add(Duration(hours: 2)), +// // ); +// // print('Opening modal...'); +// // await plugin.showEventModal(eventId); +// // print('Modal closed - Future completed!'); +// // +// // Expected: Second print statement appears ONLY after modal is dismissed +// +// fail( +// 'This test requires manual verification. Automated testing of system ' +// 'modal UI requires XCUITest (iOS) or Espresso (Android) setup.'); +// }, +// skip: 'Requires manual verification. System modal UI cannot be easily ' +// 'automated with integration_test package.', +// ); +// }); +// } diff --git a/package/device_calendar_plus/example/integration_test/integration_test_driver.dart b/package/device_calendar_plus/example/integration_test/integration_test_driver.dart new file mode 100644 index 00000000..d1ba1697 --- /dev/null +++ b/package/device_calendar_plus/example/integration_test/integration_test_driver.dart @@ -0,0 +1,51 @@ +// // ignore_for_file: avoid_print +// +// import 'dart:io'; +// +// import 'package:integration_test/integration_test_driver.dart'; +// +// Future main() async { +// const packageName = 'to.bullet.example'; +// +// // Grant Android permissions before tests run (via adb on host machine) +// print('📱 Granting calendar permissions via adb...'); +// for (final permission in [ +// 'android.permission.READ_CALENDAR', +// 'android.permission.WRITE_CALENDAR', +// ]) { +// try { +// final result = Process.runSync( +// 'adb', +// ['shell', 'pm', 'grant', packageName, permission], +// ); +// if (result.exitCode == 0) { +// print(' ✓ Granted $permission'); +// } else { +// print(' ⚠ Failed to grant $permission: ${result.stderr}'); +// } +// } catch (e) { +// print(' ⚠ Error granting $permission: $e'); +// } +// } +// print(''); +// +// // Run the integration tests +// await integrationDriver(); +// +// // Revoke permissions after tests (cleanup) +// print(''); +// print('🧹 Revoking calendar permissions...'); +// for (final permission in [ +// 'android.permission.READ_CALENDAR', +// 'android.permission.WRITE_CALENDAR', +// ]) { +// try { +// Process.runSync( +// 'adb', +// ['shell', 'pm', 'revoke', packageName, permission], +// ); +// } catch (e) { +// // Ignore errors during cleanup +// } +// } +// } diff --git a/package/device_calendar_plus/example/ios/Flutter/AppFrameworkInfo.plist b/package/device_calendar_plus/example/ios/Flutter/AppFrameworkInfo.plist new file mode 100644 index 00000000..1dc6cf76 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Flutter/AppFrameworkInfo.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + App + CFBundleIdentifier + io.flutter.flutter.app + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + App + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1.0 + MinimumOSVersion + 13.0 + + diff --git a/package/device_calendar_plus/example/ios/Flutter/Debug.xcconfig b/package/device_calendar_plus/example/ios/Flutter/Debug.xcconfig new file mode 100644 index 00000000..ec97fc6f --- /dev/null +++ b/package/device_calendar_plus/example/ios/Flutter/Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "Generated.xcconfig" diff --git a/package/device_calendar_plus/example/ios/Flutter/Generated.xcconfig b/package/device_calendar_plus/example/ios/Flutter/Generated.xcconfig new file mode 100644 index 00000000..c29f15c0 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Flutter/Generated.xcconfig @@ -0,0 +1,15 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/cloud/sdk/flutter +FLUTTER_APPLICATION_PATH=/Users/cloud/Downloads/device_calender_plus/device_calendar_plus-0.3.1/example +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_TARGET=lib/main.dart +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +FLUTTER_CLI_BUILD_MODE=debug +EXCLUDED_ARCHS[sdk=iphonesimulator*]=i386 +EXCLUDED_ARCHS[sdk=iphoneos*]=armv7 +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/package/device_calendar_plus/example/ios/Flutter/Release.xcconfig b/package/device_calendar_plus/example/ios/Flutter/Release.xcconfig new file mode 100644 index 00000000..c4855bfe --- /dev/null +++ b/package/device_calendar_plus/example/ios/Flutter/Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "Generated.xcconfig" diff --git a/package/device_calendar_plus/example/ios/Flutter/ephemeral/flutter_lldb_helper.py b/package/device_calendar_plus/example/ios/Flutter/ephemeral/flutter_lldb_helper.py new file mode 100644 index 00000000..a88caf99 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Flutter/ephemeral/flutter_lldb_helper.py @@ -0,0 +1,32 @@ +# +# Generated file, do not edit. +# + +import lldb + +def handle_new_rx_page(frame: lldb.SBFrame, bp_loc, extra_args, intern_dict): + """Intercept NOTIFY_DEBUGGER_ABOUT_RX_PAGES and touch the pages.""" + base = frame.register["x0"].GetValueAsAddress() + page_len = frame.register["x1"].GetValueAsUnsigned() + + # Note: NOTIFY_DEBUGGER_ABOUT_RX_PAGES will check contents of the + # first page to see if handled it correctly. This makes diagnosing + # misconfiguration (e.g. missing breakpoint) easier. + data = bytearray(page_len) + data[0:8] = b'IHELPED!' + + error = lldb.SBError() + frame.GetThread().GetProcess().WriteMemory(base, data, error) + if not error.Success(): + print(f'Failed to write into {base}[+{page_len}]', error) + return + +def __lldb_init_module(debugger: lldb.SBDebugger, _): + target = debugger.GetDummyTarget() + # Caveat: must use BreakpointCreateByRegEx here and not + # BreakpointCreateByName. For some reasons callback function does not + # get carried over from dummy target for the later. + bp = target.BreakpointCreateByRegex("^NOTIFY_DEBUGGER_ABOUT_RX_PAGES$") + bp.SetScriptCallbackFunction('{}.handle_new_rx_page'.format(__name__)) + bp.SetAutoContinue(True) + print("-- LLDB integration loaded --") diff --git a/package/device_calendar_plus/example/ios/Flutter/ephemeral/flutter_lldbinit b/package/device_calendar_plus/example/ios/Flutter/ephemeral/flutter_lldbinit new file mode 100644 index 00000000..e3ba6fbe --- /dev/null +++ b/package/device_calendar_plus/example/ios/Flutter/ephemeral/flutter_lldbinit @@ -0,0 +1,5 @@ +# +# Generated file, do not edit. +# + +command script import --relative-to-command-file flutter_lldb_helper.py diff --git a/package/device_calendar_plus/example/ios/Flutter/flutter_export_environment.sh b/package/device_calendar_plus/example/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 00000000..100ac08d --- /dev/null +++ b/package/device_calendar_plus/example/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,14 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/cloud/sdk/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/cloud/Downloads/device_calender_plus/device_calendar_plus-0.3.1/example" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "FLUTTER_CLI_BUILD_MODE=debug" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/package/device_calendar_plus/example/ios/Podfile b/package/device_calendar_plus/example/ios/Podfile new file mode 100644 index 00000000..620e46eb --- /dev/null +++ b/package/device_calendar_plus/example/ios/Podfile @@ -0,0 +1,43 @@ +# Uncomment this line to define a global platform for your project +# platform :ios, '13.0' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure flutter pub get is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Generated.xcconfig, then run flutter pub get" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_ios_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_ios_build_settings(target) + end +end diff --git a/package/device_calendar_plus/example/ios/Podfile.lock b/package/device_calendar_plus/example/ios/Podfile.lock new file mode 100644 index 00000000..c0bba85f --- /dev/null +++ b/package/device_calendar_plus/example/ios/Podfile.lock @@ -0,0 +1,28 @@ +PODS: + - device_calendar_plus_ios (0.0.1): + - Flutter + - Flutter (1.0.0) + - integration_test (0.0.1): + - Flutter + +DEPENDENCIES: + - device_calendar_plus_ios (from `.symlinks/plugins/device_calendar_plus_ios/ios`) + - Flutter (from `Flutter`) + - integration_test (from `.symlinks/plugins/integration_test/ios`) + +EXTERNAL SOURCES: + device_calendar_plus_ios: + :path: ".symlinks/plugins/device_calendar_plus_ios/ios" + Flutter: + :path: Flutter + integration_test: + :path: ".symlinks/plugins/integration_test/ios" + +SPEC CHECKSUMS: + device_calendar_plus_ios: 34dca387f44fad29b840096a840f94edc55af858 + Flutter: cabc95a1d2626b1b06e7179b784ebcf0c0cde467 + integration_test: 252f60fa39af5e17c3aa9899d35d908a0721b573 + +PODFILE CHECKSUM: 3c63482e143d1b91d2d2560aee9fb04ecc74ac7e + +COCOAPODS: 1.16.2 diff --git a/package/device_calendar_plus/example/ios/Runner.xcodeproj/project.pbxproj b/package/device_calendar_plus/example/ios/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..42bed359 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,731 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXBuildFile section */ + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 90635437DFB068E040820C11 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EF31540B1A7F63F9CCFABD70 /* Pods_Runner.framework */; }; + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + C31B88CF42DB7DF2C6CFC737 /* Pods_RunnerTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2117130F85BBAB2E93535752 /* Pods_RunnerTests.framework */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C8085294A63A400263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 97C146E61CF9000F007C117D /* Project object */; + proxyType = 1; + remoteGlobalIDString = 97C146ED1CF9000F007C117D; + remoteInfo = Runner; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 9705A1C41CF9048500538489 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 03BADFE508B8EA0BB14DC18C /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 1D3752562D0E8854792A7D51 /* Pods-RunnerTests.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.profile.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.profile.xcconfig"; sourceTree = ""; }; + 2117130F85BBAB2E93535752 /* Pods_RunnerTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_RunnerTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 23F7FA9D412243D6B596B9BB /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; + 331C807B294A618700263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 331C8081294A63A400263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 75AD1B0E07FDA4B644D3FE93 /* Pods-RunnerTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.release.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.release.xcconfig"; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; + 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; + 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C842EA1CFFB3E90B842E497B /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; + E823B4929251B419D87BC8C3 /* Pods-RunnerTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-RunnerTests.debug.xcconfig"; path = "Target Support Files/Pods-RunnerTests/Pods-RunnerTests.debug.xcconfig"; sourceTree = ""; }; + EF31540B1A7F63F9CCFABD70 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 97C146EB1CF9000F007C117D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 90635437DFB068E040820C11 /* Pods_Runner.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + DD86C1416E89EFA0F12646D2 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C31B88CF42DB7DF2C6CFC737 /* Pods_RunnerTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C8082294A63A400263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C807B294A618700263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 345967FC13CFEA0EADC4DDFB /* Frameworks */ = { + isa = PBXGroup; + children = ( + EF31540B1A7F63F9CCFABD70 /* Pods_Runner.framework */, + 2117130F85BBAB2E93535752 /* Pods_RunnerTests.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 4A9096EFAB9F6C52EC683391 /* Pods */ = { + isa = PBXGroup; + children = ( + C842EA1CFFB3E90B842E497B /* Pods-Runner.debug.xcconfig */, + 23F7FA9D412243D6B596B9BB /* Pods-Runner.release.xcconfig */, + 03BADFE508B8EA0BB14DC18C /* Pods-Runner.profile.xcconfig */, + E823B4929251B419D87BC8C3 /* Pods-RunnerTests.debug.xcconfig */, + 75AD1B0E07FDA4B644D3FE93 /* Pods-RunnerTests.release.xcconfig */, + 1D3752562D0E8854792A7D51 /* Pods-RunnerTests.profile.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; + 9740EEB11CF90186004384FC /* Flutter */ = { + isa = PBXGroup; + children = ( + 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 9740EEB31CF90195004384FC /* Generated.xcconfig */, + ); + name = Flutter; + sourceTree = ""; + }; + 97C146E51CF9000F007C117D = { + isa = PBXGroup; + children = ( + 9740EEB11CF90186004384FC /* Flutter */, + 97C146F01CF9000F007C117D /* Runner */, + 97C146EF1CF9000F007C117D /* Products */, + 331C8082294A63A400263BE5 /* RunnerTests */, + 4A9096EFAB9F6C52EC683391 /* Pods */, + 345967FC13CFEA0EADC4DDFB /* Frameworks */, + ); + sourceTree = ""; + }; + 97C146EF1CF9000F007C117D /* Products */ = { + isa = PBXGroup; + children = ( + 97C146EE1CF9000F007C117D /* Runner.app */, + 331C8081294A63A400263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 97C146F01CF9000F007C117D /* Runner */ = { + isa = PBXGroup; + children = ( + 97C146FA1CF9000F007C117D /* Main.storyboard */, + 97C146FD1CF9000F007C117D /* Assets.xcassets */, + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, + 97C147021CF9000F007C117D /* Info.plist */, + 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, + 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, + 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, + 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, + ); + path = Runner; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C8080294A63A400263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 959C422494847625B2E119C8 /* [CP] Check Pods Manifest.lock */, + 331C807D294A63A400263BE5 /* Sources */, + 331C807F294A63A400263BE5 /* Resources */, + DD86C1416E89EFA0F12646D2 /* Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 331C8086294A63A400263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C8081294A63A400263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 97C146ED1CF9000F007C117D /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + A6A9218B978606CCE099305F /* [CP] Check Pods Manifest.lock */, + 9740EEB61CF901F6004384FC /* Run Script */, + 97C146EA1CF9000F007C117D /* Sources */, + 97C146EB1CF9000F007C117D /* Frameworks */, + 97C146EC1CF9000F007C117D /* Resources */, + 9705A1C41CF9048500538489 /* Embed Frameworks */, + 3B06AD1E1E4923F5004D2608 /* Thin Binary */, + E356C884A5DAF4676B7F4EF3 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Runner; + productName = Runner; + productReference = 97C146EE1CF9000F007C117D /* Runner.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 97C146E61CF9000F007C117D /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C8080294A63A400263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 97C146ED1CF9000F007C117D; + }; + 97C146ED1CF9000F007C117D = { + CreatedOnToolsVersion = 7.3.1; + LastSwiftMigration = 1100; + }; + }; + }; + buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 97C146E51CF9000F007C117D; + productRefGroup = 97C146EF1CF9000F007C117D /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 97C146ED1CF9000F007C117D /* Runner */, + 331C8080294A63A400263BE5 /* RunnerTests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C807F294A63A400263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EC1CF9000F007C117D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, + 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, + 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, + 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", + ); + name = "Thin Binary"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; + }; + 959C422494847625B2E119C8 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-RunnerTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; + }; + A6A9218B978606CCE099305F /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + E356C884A5DAF4676B7F4EF3 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C807D294A63A400263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 97C146EA1CF9000F007C117D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, + 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C8086294A63A400263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 97C146ED1CF9000F007C117D /* Runner */; + targetProxy = 331C8085294A63A400263BE5 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 97C146FA1CF9000F007C117D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C146FB1CF9000F007C117D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 97C147001CF9000F007C117D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 249021D3217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Profile; + }; + 249021D4217E4FDB00AE95B9 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = UDCW28VB9U; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = to.bullet.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Profile; + }; + 331C8088294A63A400263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = E823B4929251B419D87BC8C3 /* Pods-RunnerTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = to.bullet.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Debug; + }; + 331C8089294A63A400263BE5 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 75AD1B0E07FDA4B644D3FE93 /* Pods-RunnerTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = to.bullet.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Release; + }; + 331C808A294A63A400263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 1D3752562D0E8854792A7D51 /* Pods-RunnerTests.profile.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = to.bullet.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Runner.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Runner"; + }; + name = Profile; + }; + 97C147031CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 97C147041CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SUPPORTED_PLATFORMS = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 97C147061CF9000F007C117D /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = UDCW28VB9U; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = to.bullet.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Debug; + }; + 97C147071CF9000F007C117D /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; + DEVELOPMENT_TEAM = UDCW28VB9U; + ENABLE_BITCODE = NO; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = to.bullet.example; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + VERSIONING_SYSTEM = "apple-generic"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C8087294A63A400263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C8088294A63A400263BE5 /* Debug */, + 331C8089294A63A400263BE5 /* Release */, + 331C808A294A63A400263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147031CF9000F007C117D /* Debug */, + 97C147041CF9000F007C117D /* Release */, + 249021D3217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 97C147061CF9000F007C117D /* Debug */, + 97C147071CF9000F007C117D /* Release */, + 249021D4217E4FDB00AE95B9 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 97C146E61CF9000F007C117D /* Project object */; +} diff --git a/package/device_calendar_plus/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/package/device_calendar_plus/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..919434a6 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/package/device_calendar_plus/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/package/device_calendar_plus/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/package/device_calendar_plus/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/package/device_calendar_plus/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/package/device_calendar_plus/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/package/device_calendar_plus/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..e3773d42 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package/device_calendar_plus/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/package/device_calendar_plus/example/ios/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..21a3cc14 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/package/device_calendar_plus/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/package/device_calendar_plus/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/package/device_calendar_plus/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/package/device_calendar_plus/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings new file mode 100644 index 00000000..f9b0d7c5 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings @@ -0,0 +1,8 @@ + + + + + PreviewsEnabled + + + diff --git a/package/device_calendar_plus/example/ios/Runner/AppDelegate.swift b/package/device_calendar_plus/example/ios/Runner/AppDelegate.swift new file mode 100644 index 00000000..62666446 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Flutter +import UIKit + +@main +@objc class AppDelegate: FlutterAppDelegate { + override func application( + _ application: UIApplication, + didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? + ) -> Bool { + GeneratedPluginRegistrant.register(with: self) + return super.application(application, didFinishLaunchingWithOptions: launchOptions) + } +} diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..d36b1fab --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,122 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "Icon-App-20x20@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon-App-29x29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon-App-40x40@3x.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon-App-60x60@3x.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@1x.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "Icon-App-20x20@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@1x.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon-App-29x29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@1x.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon-App-40x40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@1x.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon-App-76x76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "Icon-App-83.5x83.5@2x.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "Icon-App-1024x1024@1x.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..dc9ada4725e9b0ddb1deab583e5b5102493aa332 GIT binary patch literal 10932 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 literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..797d452e458972bab9d994556c8305db4c827017 GIT binary patch literal 406 zcmV;H0crk;P))>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..6ed2d933e1120817fe9182483a228007b18ab6ae GIT binary patch literal 450 zcmV;z0X_bSP)iGWQ_5NJQ_~rNh*z)}eT%KUb z`7gNk0#AwF^#0T0?hIa^`~Ck;!}#m+_uT050aTR(J!bU#|IzRL%^UsMS#KsYnTF*!YeDOytlP4VhV?b} z%rz_<=#CPc)tU1MZTq~*2=8~iZ!lSa<{9b@2Jl;?IEV8)=fG217*|@)CCYgFze-x? zIFODUIA>nWKpE+bn~n7;-89sa>#DR>TSlqWk*!2hSN6D~Qb#VqbP~4Fk&m`@1$JGr zXPIdeRE&b2Thd#{MtDK$px*d3-Wx``>!oimf%|A-&-q*6KAH)e$3|6JV%HX{Hig)k suLT-RhftRq8b9;(V=235Wa|I=027H2wCDra;{X5v07*qoM6N<$f;9x^2LJ#7 literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png new file mode 100644 index 0000000000000000000000000000000000000000..4cd7b0099ca80c806f8fe495613e8d6c69460d76 GIT binary patch literal 282 zcmV+#0p(^bcu7P-R4C8Q z&e;xxFbF_Vrezo%_kH*OKhshZ6BFpG-Y1e10`QXJKbND7AMQ&cMj60B5TNObaZxYybcN07*qoM6N<$g3m;S%K!iX literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fe730945a01f64a61e2235dbe3f45b08f7729182 GIT binary patch literal 462 zcmV;<0WtoGP)-}iV`2<;=$?g5M=KQbZ{F&YRNy7Nn@%_*5{gvDM0aKI4?ESmw z{NnZg)A0R`+4?NF_RZexyVB&^^ZvN!{I28tr{Vje;QNTz`dG&Jz0~Ek&f2;*Z7>B|cg}xYpxEFY+0YrKLF;^Q+-HreN0P{&i zK~zY`?b7ECf-n?@;d<&orQ*Q7KoR%4|C>{W^h6@&01>0SKS`dn{Q}GT%Qj_{PLZ_& zs`MFI#j-(>?bvdZ!8^xTwlY{qA)T4QLbY@j(!YJ7aXJervHy6HaG_2SB`6CC{He}f zHVw(fJWApwPq!6VY7r1w-Fs)@ox~N+q|w~e;JI~C4Vf^@d>Wvj=fl`^u9x9wd9 zR%3*Q+)t%S!MU_`id^@&Y{y7-r98lZX0?YrHlfmwb?#}^1b{8g&KzmkE(L>Z&)179 zp<)v6Y}pRl100G2FL_t(o!|l{-Q-VMg#&MKg7c{O0 z2wJImOS3Gy*Z2Qifdv~JYOp;v+U)a|nLoc7hNH;I$;lzDt$}rkaFw1mYK5_0Q(Sut zvbEloxON7$+HSOgC9Z8ltuC&0OSF!-mXv5caV>#bc3@hBPX@I$58-z}(ZZE!t-aOG zpjNkbau@>yEzH(5Yj4kZiMH32XI!4~gVXNnjAvRx;Sdg^`>2DpUEwoMhTs_st8pKG z(%SHyHdU&v%f36~uERh!bd`!T2dw;z6PrOTQ7Vt*#9F2uHlUVnb#ev_o^fh}Dzmq} zWtlk35}k=?xj28uO|5>>$yXadTUE@@IPpgH`gJ~Ro4>jd1IF|(+IX>8M4Ps{PNvmI zNj4D+XgN83gPt_Gm}`Ybv{;+&yu-C(Grdiahmo~BjG-l&mWM+{e5M1sm&=xduwgM9 z`8OEh`=F3r`^E{n_;%9weN{cf2%7=VzC@cYj+lg>+3|D|_1C@{hcU(DyQG_BvBWe? zvTv``=%b1zrol#=R`JB)>cdjpWt&rLJgVp-t?DREyuq1A%0Z4)6_WsQ7{nzjN zo!X zGXV)2i3kcZIL~_j>uIKPK_zib+3T+Nt3Mb&Br)s)UIaA}@p{wDda>7=Q|mGRp7pqY zkJ!7E{MNz$9nOwoVqpFb)}$IP24Wn2JJ=Cw(!`OXJBr45rP>>AQr$6c7slJWvbpNW z@KTwna6d?PP>hvXCcp=4F;=GR@R4E7{4VU^0p4F>v^#A|>07*qoM6N<$f*5nx ACIA2c literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..502f463a9bc882b461c96aadf492d1729e49e725 GIT binary patch literal 586 zcmV-Q0=4~#P)+}#`wDE{8-2Mebf5<{{PqV{TgVcv*r8?UZ3{-|G?_}T*&y;@cqf{ z{Q*~+qr%%p!1pS*_Uicl#q9lc(D`!D`LN62sNwq{oYw(Wmhk)k<@f$!$@ng~_5)Ru z0Z)trIA5^j{DIW^c+vT2%lW+2<(RtE2wR;4O@)Tm`Xr*?A(qYoM}7i5Yxw>D(&6ou zxz!_Xr~yNF+waPe00049Nkl*;a!v6h%{rlvIH#gW3s8p;bFr=l}mRqpW2h zw=OA%hdyL~z+UHOzl0eKhEr$YYOL-c-%Y<)=j?(bzDweB7{b+%_ypvm_cG{SvM=DK zhv{K@m>#Bw>2W$eUI#iU)Wdgs8Y3U+A$Gd&{+j)d)BmGKx+43U_!tik_YlN)>$7G! zhkE!s;%oku3;IwG3U^2kw?z+HM)jB{@zFhK8P#KMSytSthr+4!c(5c%+^UBn`0X*2 zy3(k600_CSZj?O$Qu%&$;|TGUJrptR(HzyIx>5E(2r{eA(<6t3e3I0B)7d6s7?Z5J zZ!rtKvA{MiEBm&KFtoifx>5P^Z=vl)95XJn()aS5%ad(s?4-=Tkis9IGu{`Fy8r+H07*qoM6N<$f20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec303439225b78712f49115768196d8d76f6790 GIT binary patch literal 862 zcmV-k1EKthP)20Z)wqMt%V?S?~D#06};F zA3KcL`Wb+>5ObvgQIG&ig8(;V04hz?@cqy3{mSh8o!|U|)cI!1_+!fWH@o*8vh^CU z^ws0;(c$gI+2~q^tO#GDHf@=;DncUw00J^eL_t(&-tE|HQ`%4vfZ;WsBqu-$0nu1R zq^Vj;p$clf^?twn|KHO+IGt^q#a3X?w9dXC@*yxhv&l}F322(8Y1&=P&I}~G@#h6; z1CV9ecD9ZEe87{{NtI*)_aJ<`kJa z?5=RBtFF50s;jQLFil-`)m2wrb=6h(&brpj%nG_U&ut~$?8Rokzxi8zJoWr#2dto5 zOX_URcc<1`Iky+jc;A%Vzx}1QU{2$|cKPom2Vf1{8m`vja4{F>HS?^Nc^rp}xo+Nh zxd}eOm`fm3@MQC1< zIk&aCjb~Yh%5+Yq0`)D;q{#-Uqlv*o+Oor zE!I71Z@ASH3grl8&P^L0WpavHoP|UX4e?!igT`4?AZk$hu*@%6WJ;zDOGlw7kj@ zY5!B-0ft0f?Lgb>C;$Ke07*qoM6N<$f~t1N9smFU literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..e9f5fea27c705180eb716271f41b582e76dcbd90 GIT binary patch literal 1674 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 literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..0467bf12aa4d28f374bb26596605a46dcbb3e7c8 GIT binary patch literal 1418 zcmV;51$Fv~P)q zKfU)WzW*n(@|xWGCA9ScMt*e9`2kdxPQ&&>|-UCa7_51w+ zLUsW@ZzZSW0y$)Hp~e9%PvP|a03ks1`~K?q{u;6NC8*{AOqIUq{CL&;p56Lf$oQGq z^={4hPQv)y=I|4n+?>7Fim=dxt1 z2H+Dm+1+fh+IF>G0SjJMkQQre1x4|G*Z==(Ot&kCnUrL4I(rf(ucITwmuHf^hXiJT zkdTm&kdTm&kdTm&kdP`esgWG0BcWCVkVZ&2dUwN`cgM8QJb`Z7Z~e<&Yj2(}>Tmf` zm1{eLgw!b{bXkjWbF%dTkTZEJWyWOb##Lfw4EK2}<0d6%>AGS{po>WCOy&f$Tay_> z?NBlkpo@s-O;0V%Y_Xa-G#_O08q5LR*~F%&)}{}r&L%Sbs8AS4t7Y0NEx*{soY=0MZExqA5XHQkqi#4gW3 zqODM^iyZl;dvf)-bOXtOru(s)Uc7~BFx{w-FK;2{`VA?(g&@3z&bfLFyctOH!cVsF z7IL=fo-qBndRUm;kAdXR4e6>k-z|21AaN%ubeVrHl*<|s&Ax@W-t?LR(P-24A5=>a z*R9#QvjzF8n%@1Nw@?CG@6(%>+-0ASK~jEmCV|&a*7-GKT72W<(TbSjf)&Eme6nGE z>Gkj4Sq&2e+-G%|+NM8OOm5zVl9{Z8Dd8A5z3y8mZ=4Bv4%>as_{9cN#bm~;h>62( zdqY93Zy}v&c4n($Vv!UybR8ocs7#zbfX1IY-*w~)p}XyZ-SFC~4w>BvMVr`dFbelV{lLL0bx7@*ZZdebr3`sP;? zVImji)kG)(6Juv0lz@q`F!k1FE;CQ(D0iG$wchPbKZQELlsZ#~rt8#90Y_Xh&3U-< z{s<&cCV_1`^TD^ia9!*mQDq& zn2{r`j};V|uV%_wsP!zB?m%;FeaRe+X47K0e+KE!8C{gAWF8)lCd1u1%~|M!XNRvw zvtqy3iz0WSpWdhn6$hP8PaRBmp)q`#PCA`Vd#Tc$@f1tAcM>f_I@bC)hkI9|o(Iqv zo}Piadq!j76}004RBio<`)70k^`K1NK)q>w?p^C6J2ZC!+UppiK6&y3Kmbv&O!oYF z34$0Z;QO!JOY#!`qyGH<3Pd}Pt@q*A0V=3SVtWKRR8d8Z&@)3qLPA19LPA19LPEUC YUoZo%k(ykuW&i*H07*qoM6N<$f+CH{y8r+H literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json new file mode 100644 index 00000000..0bedcf2f --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "LaunchImage.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "LaunchImage@3x.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..9da19eacad3b03bb08bbddbbf4ac48dd78b3d838 GIT binary patch literal 68 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>Zci7-kcv6Uzs@r-FtIZ-&5|)J Q1PU{Fy85}Sb4q9e0B4a5jsO4v literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md new file mode 100644 index 00000000..89c2725b --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md @@ -0,0 +1,5 @@ +# Launch Screen Assets + +You can customize the launch screen with your own desired assets by replacing the image files in this directory. + +You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/package/device_calendar_plus/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/package/device_calendar_plus/example/ios/Runner/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 00000000..f2e259c7 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package/device_calendar_plus/example/ios/Runner/Base.lproj/Main.storyboard b/package/device_calendar_plus/example/ios/Runner/Base.lproj/Main.storyboard new file mode 100644 index 00000000..f3c28516 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner/Base.lproj/Main.storyboard @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package/device_calendar_plus/example/ios/Runner/GeneratedPluginRegistrant.h b/package/device_calendar_plus/example/ios/Runner/GeneratedPluginRegistrant.h new file mode 100644 index 00000000..7a890927 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner/GeneratedPluginRegistrant.h @@ -0,0 +1,19 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GeneratedPluginRegistrant_h +#define GeneratedPluginRegistrant_h + +#import + +NS_ASSUME_NONNULL_BEGIN + +@interface GeneratedPluginRegistrant : NSObject ++ (void)registerWithRegistry:(NSObject*)registry; +@end + +NS_ASSUME_NONNULL_END +#endif /* GeneratedPluginRegistrant_h */ diff --git a/package/device_calendar_plus/example/ios/Runner/GeneratedPluginRegistrant.m b/package/device_calendar_plus/example/ios/Runner/GeneratedPluginRegistrant.m new file mode 100644 index 00000000..5e513dd3 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner/GeneratedPluginRegistrant.m @@ -0,0 +1,28 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#import "GeneratedPluginRegistrant.h" + +#if __has_include() +#import +#else +@import device_calendar_plus_ios; +#endif + +#if __has_include() +#import +#else +@import integration_test; +#endif + +@implementation GeneratedPluginRegistrant + ++ (void)registerWithRegistry:(NSObject*)registry { + [DeviceCalendarPlusIosPlugin registerWithRegistrar:[registry registrarForPlugin:@"DeviceCalendarPlusIosPlugin"]]; + [IntegrationTestPlugin registerWithRegistrar:[registry registrarForPlugin:@"IntegrationTestPlugin"]]; +} + +@end diff --git a/package/device_calendar_plus/example/ios/Runner/Info.plist b/package/device_calendar_plus/example/ios/Runner/Info.plist new file mode 100644 index 00000000..57f088db --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner/Info.plist @@ -0,0 +1,53 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Example + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + example + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleSignature + ???? + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CADisableMinimumFrameDurationOnPhone + + UIApplicationSupportsIndirectInputEvents + + NSCalendarsUsageDescription + This app needs access to your calendar to demonstrate calendar functionality. + NSCalendarsWriteOnlyAccessUsageDescription + This app needs write access to your calendar to add events. + + diff --git a/package/device_calendar_plus/example/ios/Runner/Runner-Bridging-Header.h b/package/device_calendar_plus/example/ios/Runner/Runner-Bridging-Header.h new file mode 100644 index 00000000..308a2a56 --- /dev/null +++ b/package/device_calendar_plus/example/ios/Runner/Runner-Bridging-Header.h @@ -0,0 +1 @@ +#import "GeneratedPluginRegistrant.h" diff --git a/package/device_calendar_plus/example/ios/RunnerTests/RunnerTests.swift b/package/device_calendar_plus/example/ios/RunnerTests/RunnerTests.swift new file mode 100644 index 00000000..86a7c3b1 --- /dev/null +++ b/package/device_calendar_plus/example/ios/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Flutter +import UIKit +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/package/device_calendar_plus/example/lib/main.dart b/package/device_calendar_plus/example/lib/main.dart new file mode 100644 index 00000000..dbe66532 --- /dev/null +++ b/package/device_calendar_plus/example/lib/main.dart @@ -0,0 +1,912 @@ +import 'package:device_calendar_plus/device_calendar_plus.dart'; +import 'package:flutter/material.dart'; + +void main() { + runApp(const MyApp()); +} + +class MyApp extends StatelessWidget { + const MyApp({super.key}); + + // This widget is the root of your application. + @override + Widget build(BuildContext context) { + return MaterialApp( + title: 'Flutter Demo', + theme: ThemeData( + // This is the theme of your application. + // + // TRY THIS: Try running your application with "flutter run". You'll see + // the application has a purple toolbar. Then, without quitting the app, + // try changing the seedColor in the colorScheme below to Colors.green + // and then invoke "hot reload" (save your changes or press the "hot + // reload" button in a Flutter-supported IDE, or press "r" if you used + // the command line to start the app). + // + // Notice that the counter didn't reset back to zero; the application + // state is not lost during the reload. To reset the state, use hot + // restart instead. + // + // This works for code too, not just values: Most code changes can be + // tested with just a hot reload. + colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple), + ), + home: const MyHomePage(title: 'Device Calendar Plus Example'), + ); + } +} + +class MyHomePage extends StatefulWidget { + const MyHomePage({super.key, required this.title}); + + // This widget is the home page of your application. It is stateful, meaning + // that it has a State object (defined below) that contains fields that affect + // how it looks. + + // This class is the configuration for the state. It holds the values (in this + // case the title) provided by the parent (in this case the App widget) and + // used by the build method of the State. Fields in a Widget subclass are + // always marked "final". + + final String title; + + @override + State createState() => _MyHomePageState(); +} + +class _MyHomePageState extends State { + List _calendars = []; + bool _isLoadingCalendars = false; + final Set _selectedCalendarIds = {}; + List _events = []; + bool _isLoadingEvents = false; + + @override + void initState() { + super.initState(); + } + + Future _requestPermissions() async { + try { + final status = await DeviceCalendar.instance.requestPermissions(); + + if (!mounted) return; + + String message; + switch (status) { + case CalendarPermissionStatus.granted: + message = 'Permission granted! Full read/write access to calendars.'; + break; + case CalendarPermissionStatus.writeOnly: + message = + 'Write-only permission granted (iOS 17+). Can add events but not read existing ones.'; + break; + case CalendarPermissionStatus.denied: + message = + 'Permission denied. Please enable calendar access in Settings.'; + break; + case CalendarPermissionStatus.restricted: + message = + 'Calendar access is restricted by device policies (MDM/parental controls).'; + break; + case CalendarPermissionStatus.notDetermined: + message = 'Permission not yet determined.'; + break; + } + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Calendar Permission Status'), + content: Text(message), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('OK'), + ), + ], + ), + ); + } on DeviceCalendarException catch (e) { + // Developer configuration error (missing manifest permissions) + if (!mounted) return; + + final title = e.errorCode == DeviceCalendarError.permissionsNotDeclared + ? 'Configuration Error' + : 'Calendar Error'; + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text(title), + content: SingleChildScrollView( + child: Text( + e.message, + style: const TextStyle(fontFamily: 'monospace', fontSize: 12), + ), + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('OK'), + ), + ], + ), + ); + } catch (e) { + // Other errors + if (!mounted) return; + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Error'), + content: Text('Failed to request permissions: $e'), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('OK'), + ), + ], + ), + ); + } + } + + Future _loadCalendars() async { + setState(() { + _isLoadingCalendars = true; + }); + + try { + final calendars = await DeviceCalendar.instance.listCalendars(); + + setState(() { + _calendars = calendars; + _isLoadingCalendars = false; + }); + } on DeviceCalendarException catch (e) { + setState(() { + _isLoadingCalendars = false; + }); + + if (!mounted) return; + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Calendar Error'), + content: Text(e.message), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('OK'), + ), + ], + ), + ); + } catch (e) { + setState(() { + _isLoadingCalendars = false; + }); + + if (!mounted) return; + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Error'), + content: Text('Failed to load calendars: $e'), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('OK'), + ), + ], + ), + ); + } + } + + Color _parseColor(String? colorHex) { + if (colorHex == null || colorHex.isEmpty) { + return Colors.grey; + } + try { + final hexColor = colorHex.replaceAll('#', ''); + return Color(int.parse('FF$hexColor', radix: 16)); + } catch (e) { + return Colors.grey; + } + } + + Future _loadEvents() async { + setState(() { + _isLoadingEvents = true; + }); + + try { + final now = DateTime.now(); + final startDate = DateTime(now.year, now.month - 3, now.day); + final endDate = DateTime(now.year, now.month + 3, now.day); + + final events = await DeviceCalendar.instance.listEvents( + startDate, + endDate, + calendarIds: + _selectedCalendarIds.isEmpty ? null : _selectedCalendarIds.toList(), + ); + + setState(() { + _events = events; + _isLoadingEvents = false; + }); + } on DeviceCalendarException catch (e) { + setState(() { + _isLoadingEvents = false; + }); + + if (!mounted) return; + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Calendar Error'), + content: Text(e.message), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('OK'), + ), + ], + ), + ); + } catch (e) { + setState(() { + _isLoadingEvents = false; + }); + + if (!mounted) return; + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Error'), + content: Text('Failed to load events: $e'), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('OK'), + ), + ], + ), + ); + } + } + + Future _updateEvent(Event event) async { + try { + // Add an exclamation mark to the title + final newTitle = '${event.title}!'; + + await DeviceCalendar.instance.updateEvent( + eventId: event.instanceId, + title: newTitle, + ); + + if (!mounted) return; + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Updated: $newTitle'), + duration: const Duration(seconds: 2), + ), + ); + + // Reload events to show the change + await _loadEvents(); + } on DeviceCalendarException catch (e) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Error: ${e.message}')), + ); + } catch (e) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Failed to update event: $e')), + ); + } + } + + Future _deleteEvent(Event event) async { + try { + await DeviceCalendar.instance.deleteEvent(eventId: event.instanceId); + + if (!mounted) return; + + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text('Deleted: ${event.title}'), + duration: const Duration(seconds: 2), + ), + ); + + // Reload events to show the change + await _loadEvents(); + } on DeviceCalendarException catch (e) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Error: ${e.message}')), + ); + } catch (e) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Failed to delete event: $e')), + ); + } + } + + Future _showEventDetails(Event event) async { + try { + // Fetch the specific event instance using instanceId + // For recurring events, instanceId includes the timestamp + final fetchedEvent = await DeviceCalendar.instance.getEvent( + event.instanceId, + ); + + if (fetchedEvent == null) { + if (!mounted) return; + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Error'), + content: const Text('Event not found'), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('OK'), + ), + ], + ), + ); + return; + } + + if (!mounted) return; + + final calendar = _calendars.firstWhere( + (c) => c.id == fetchedEvent.calendarId, + orElse: () => _calendars.first, + ); + + showDialog( + context: context, + builder: (context) => AlertDialog( + title: Text(fetchedEvent.title), + content: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.min, + children: [ + _buildDetailRow( + Icons.calendar_today, + 'Calendar', + calendar.name, + ), + const SizedBox(height: 12), + _buildDetailRow( + Icons.access_time, + 'Time', + fetchedEvent.isAllDay + ? 'All Day' + : '${_formatEventDate(fetchedEvent.startDate)} • ${_formatEventTime(fetchedEvent)}', + ), + if (fetchedEvent.location != null) ...[ + const SizedBox(height: 12), + _buildDetailRow( + Icons.location_on, + 'Location', + fetchedEvent.location!, + ), + ], + if (fetchedEvent.description != null) ...[ + const SizedBox(height: 12), + _buildDetailRow( + Icons.notes, + 'Description', + fetchedEvent.description!, + ), + ], + if (fetchedEvent.timeZone != null) ...[ + const SizedBox(height: 12), + _buildDetailRow( + Icons.public, + 'Timezone', + fetchedEvent.timeZone!, + ), + ], + if (fetchedEvent.isRecurring) ...[ + const SizedBox(height: 12), + _buildDetailRow( + Icons.repeat, + 'Recurring', + 'Yes', + ), + ], + const SizedBox(height: 12), + _buildDetailRow( + Icons.info_outline, + 'Status', + '${fetchedEvent.status.name} • ${fetchedEvent.availability.name}', + ), + ], + ), + ), + actions: [ + TextButton( + onPressed: () async { + try { + print('opened'); + await DeviceCalendar.instance + .showEventModal(fetchedEvent.instanceId); + print('closed'); + } on DeviceCalendarException catch (e) { + if (!context.mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Error: ${e.message}')), + ); + } catch (e) { + if (!context.mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text('Failed to show event: $e')), + ); + } + }, + child: const Text('Show in Modal'), + ), + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('Close'), + ), + ], + ), + ); + } on DeviceCalendarException catch (e) { + if (!mounted) return; + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Calendar Error'), + content: Text(e.message), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('OK'), + ), + ], + ), + ); + } catch (e) { + if (!mounted) return; + showDialog( + context: context, + builder: (context) => AlertDialog( + title: const Text('Error'), + content: Text('Failed to load event details: $e'), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(), + child: const Text('OK'), + ), + ], + ), + ); + } + } + + Widget _buildDetailRow(IconData icon, String label, String value) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Icon(icon, size: 20, color: Colors.grey[600]), + const SizedBox(width: 12), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + label, + style: const TextStyle( + fontSize: 12, + color: Colors.grey, + fontWeight: FontWeight.w500, + ), + ), + const SizedBox(height: 2), + Text( + value, + style: const TextStyle(fontSize: 14), + ), + ], + ), + ), + ], + ); + } + + String _formatEventTime(Event event) { + if (event.isAllDay) { + return 'All Day'; + } + final startTime = + '${event.startDate.hour.toString().padLeft(2, '0')}:${event.startDate.minute.toString().padLeft(2, '0')}'; + final endTime = + '${event.endDate.hour.toString().padLeft(2, '0')}:${event.endDate.minute.toString().padLeft(2, '0')}'; + return '$startTime - $endTime'; + } + + String _formatEventDate(DateTime date) { + final now = DateTime.now(); + final today = DateTime(now.year, now.month, now.day); + final eventDay = DateTime(date.year, date.month, date.day); + + if (eventDay == today) { + return 'Today'; + } else if (eventDay == today.add(const Duration(days: 1))) { + return 'Tomorrow'; + } else if (eventDay == today.subtract(const Duration(days: 1))) { + return 'Yesterday'; + } else { + final months = [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec' + ]; + return '${months[date.month - 1]} ${date.day}, ${date.year}'; + } + } + + @override + Widget build(BuildContext context) { + // This method is rerun every time setState is called, for instance as done + // by the _incrementCounter method above. + // + // The Flutter framework has been optimized to make rerunning build methods + // fast, so that you can just rebuild anything that needs updating rather + // than having to individually change instances of widgets. + return Scaffold( + appBar: AppBar( + // TRY THIS: Try changing the color here to a specific color (to + // Colors.amber, perhaps?) and trigger a hot reload to see the AppBar + // change color while the other colors stay the same. + backgroundColor: Theme.of(context).colorScheme.inversePrimary, + // Here we take the value from the MyHomePage object that was created by + // the App.build method, and use it to set our appbar title. + title: Text(widget.title), + ), + body: SingleChildScrollView( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + Card( + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + children: [ + const Text('Permissions'), + const SizedBox(height: 8), + ElevatedButton( + onPressed: _requestPermissions, + child: const Text('Request Calendar Permissions'), + ), + ], + ), + ), + ), + const SizedBox(height: 16), + Card( + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Calendars', + style: Theme.of(context).textTheme.titleLarge, + ), + if (_calendars.isNotEmpty) + Text( + '${_calendars.length} found', + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + const SizedBox(height: 16), + ElevatedButton.icon( + onPressed: _isLoadingCalendars ? null : _loadCalendars, + icon: _isLoadingCalendars + ? const SizedBox( + width: 16, + height: 16, + child: CircularProgressIndicator(strokeWidth: 2), + ) + : const Icon(Icons.refresh), + label: Text(_isLoadingCalendars + ? 'Loading...' + : 'Load Calendars'), + ), + if (_calendars.isNotEmpty) ...[ + const SizedBox(height: 16), + Text( + 'Select calendars to fetch events:', + style: Theme.of(context).textTheme.bodyMedium, + ), + const SizedBox(height: 8), + Wrap( + spacing: 8, + runSpacing: 8, + children: _calendars.map((calendar) { + final color = _parseColor(calendar.colorHex); + final luminance = color.computeLuminance(); + final textColor = + luminance > 0.5 ? Colors.black : Colors.white; + final isSelected = + _selectedCalendarIds.contains(calendar.id); + + return FilterChip( + selected: isSelected, + backgroundColor: color.withValues(alpha: 0.3), + selectedColor: color, + checkmarkColor: textColor, + label: Row( + mainAxisSize: MainAxisSize.min, + children: [ + Text( + calendar.name, + style: TextStyle( + color: isSelected ? textColor : null, + fontWeight: calendar.isPrimary + ? FontWeight.bold + : FontWeight.normal, + ), + ), + if (calendar.isPrimary) ...[ + const SizedBox(width: 4), + Icon( + Icons.star, + size: 14, + color: isSelected ? textColor : null, + ), + ], + if (calendar.readOnly) ...[ + const SizedBox(width: 4), + Icon( + Icons.lock, + size: 14, + color: isSelected ? textColor : null, + ), + ], + ], + ), + avatar: calendar.accountName != null + ? CircleAvatar( + backgroundColor: isSelected + ? color.withValues(alpha: 0.3) + : color.withValues(alpha: 0.2), + child: Text( + calendar.accountName![0].toUpperCase(), + style: TextStyle( + color: isSelected ? textColor : null, + fontSize: 12, + ), + ), + ) + : null, + onSelected: (selected) { + setState(() { + if (selected) { + _selectedCalendarIds.add(calendar.id); + } else { + _selectedCalendarIds.remove(calendar.id); + } + }); + }, + ); + }).toList(), + ), + ], + ], + ), + ), + ), + if (_calendars.isNotEmpty) ...[ + const SizedBox(height: 16), + Card( + child: Padding( + padding: const EdgeInsets.all(16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Text( + 'Events', + style: Theme.of(context).textTheme.titleLarge, + ), + if (_events.isNotEmpty) + Text( + '${_events.length} found', + style: Theme.of(context).textTheme.bodySmall, + ), + ], + ), + const SizedBox(height: 8), + Text( + 'From 3 months ago to 3 months ahead', + style: Theme.of(context).textTheme.bodySmall, + ), + const SizedBox(height: 16), + ElevatedButton.icon( + onPressed: _isLoadingEvents ? null : _loadEvents, + icon: _isLoadingEvents + ? const SizedBox( + width: 16, + height: 16, + child: + CircularProgressIndicator(strokeWidth: 2), + ) + : const Icon(Icons.event), + label: Text(_isLoadingEvents + ? 'Loading...' + : _selectedCalendarIds.isEmpty + ? 'Fetch Events (All calendars)' + : 'Fetch Events (${_selectedCalendarIds.length} selected)'), + ), + if (_events.isNotEmpty) ...[ + const SizedBox(height: 16), + SizedBox( + height: 400, + child: ListView.separated( + itemCount: _events.length, + separatorBuilder: (context, index) => + const Divider(), + itemBuilder: (context, index) { + final event = _events[index]; + final calendar = _calendars.firstWhere( + (c) => c.id == event.calendarId, + orElse: () => _calendars.first, + ); + final color = _parseColor(calendar.colorHex); + + return ListTile( + onTap: () => _showEventDetails(event), + leading: Container( + width: 4, + decoration: BoxDecoration( + color: color, + borderRadius: BorderRadius.circular(2), + ), + ), + title: Text( + event.title, + style: const TextStyle( + fontWeight: FontWeight.w500), + ), + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + const SizedBox(height: 4), + Text( + '${_formatEventDate(event.startDate)} • ${_formatEventTime(event)}', + style: + Theme.of(context).textTheme.bodySmall, + ), + if (event.timeZone != null) ...[ + const SizedBox(height: 2), + Row( + children: [ + const Icon(Icons.access_time, + size: 12), + const SizedBox(width: 4), + Text( + event.timeZone!, + style: Theme.of(context) + .textTheme + .bodySmall + ?.copyWith( + fontStyle: FontStyle.italic, + ), + ), + ], + ), + ], + if (event.location != null) ...[ + const SizedBox(height: 2), + Row( + children: [ + const Icon(Icons.location_on, + size: 12), + const SizedBox(width: 4), + Expanded( + child: Text( + event.location!, + style: Theme.of(context) + .textTheme + .bodySmall, + maxLines: 1, + overflow: TextOverflow.ellipsis, + ), + ), + ], + ), + ], + const SizedBox(height: 2), + Text( + calendar.name, + style: Theme.of(context) + .textTheme + .bodySmall + ?.copyWith( + color: color, + ), + ), + ], + ), + trailing: Row( + mainAxisSize: MainAxisSize.min, + children: [ + if (event.isAllDay) + const Icon(Icons.all_inclusive, size: 16), + if (event.status == EventStatus.tentative) + const Icon(Icons.help_outline, size: 16), + if (event.status == EventStatus.canceled) + const Icon(Icons.cancel_outlined, + size: 16), + const SizedBox(width: 4), + IconButton( + icon: const Icon(Icons.edit, size: 18), + onPressed: () => _updateEvent(event), + tooltip: 'Update', + padding: EdgeInsets.zero, + constraints: const BoxConstraints(), + ), + IconButton( + icon: const Icon(Icons.delete, size: 18), + onPressed: () => _deleteEvent(event), + tooltip: 'Delete', + padding: EdgeInsets.zero, + constraints: const BoxConstraints(), + ), + ], + ), + ); + }, + ), + ), + ], + ], + ), + ), + ), + ], + ], + ), + ), + // This trailing comma makes auto-formatting nicer for build methods. + ); + } +} diff --git a/package/device_calendar_plus/example/linux/CMakeLists.txt b/package/device_calendar_plus/example/linux/CMakeLists.txt new file mode 100644 index 00000000..e337802e --- /dev/null +++ b/package/device_calendar_plus/example/linux/CMakeLists.txt @@ -0,0 +1,128 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "example") +# The unique GTK application identifier for this application. See: +# https://wiki.gnome.org/HowDoI/ChooseApplicationID +set(APPLICATION_ID "to.bullet.example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(SET CMP0063 NEW) + +# Load bundled libraries from the lib/ directory relative to the binary. +set(CMAKE_INSTALL_RPATH "$ORIGIN/lib") + +# Root filesystem for cross-building. +if(FLUTTER_TARGET_PLATFORM_SYSROOT) + set(CMAKE_SYSROOT ${FLUTTER_TARGET_PLATFORM_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT}) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) +endif() + +# Define build configuration options. +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") +endif() + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_14) + target_compile_options(${TARGET} PRIVATE -Wall -Werror) + target_compile_options(${TARGET} PRIVATE "$<$>:-O3>") + target_compile_definitions(${TARGET} PRIVATE "$<$>:NDEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) + +# Only the install-generated bundle's copy of the executable will launch +# correctly, since the resources must in the right relative locations. To avoid +# people trying to run the unbundled copy, put it in a subdirectory instead of +# the default top-level location. +set_target_properties(${BINARY_NAME} + PROPERTIES + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/intermediates_do_not_run" +) + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# By default, "installing" just makes a relocatable bundle in the build +# directory. +set(BUILD_BUNDLE_DIR "${PROJECT_BINARY_DIR}/bundle") +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +# Start with a clean build bundle directory every time. +install(CODE " + file(REMOVE_RECURSE \"${BUILD_BUNDLE_DIR}/\") + " COMPONENT Runtime) + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +foreach(bundled_library ${PLUGIN_BUNDLED_LIBRARIES}) + install(FILES "${bundled_library}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endforeach(bundled_library) + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/linux/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +if(NOT CMAKE_BUILD_TYPE MATCHES "Debug") + install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() diff --git a/package/device_calendar_plus/example/linux/flutter/CMakeLists.txt b/package/device_calendar_plus/example/linux/flutter/CMakeLists.txt new file mode 100644 index 00000000..d5bd0164 --- /dev/null +++ b/package/device_calendar_plus/example/linux/flutter/CMakeLists.txt @@ -0,0 +1,88 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.10) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. + +# Serves the same purpose as list(TRANSFORM ... PREPEND ...), +# which isn't available in 3.10. +function(list_prepend LIST_NAME PREFIX) + set(NEW_LIST "") + foreach(element ${${LIST_NAME}}) + list(APPEND NEW_LIST "${PREFIX}${element}") + endforeach(element) + set(${LIST_NAME} "${NEW_LIST}" PARENT_SCOPE) +endfunction() + +# === Flutter Library === +# System-level dependencies. +find_package(PkgConfig REQUIRED) +pkg_check_modules(GTK REQUIRED IMPORTED_TARGET gtk+-3.0) +pkg_check_modules(GLIB REQUIRED IMPORTED_TARGET glib-2.0) +pkg_check_modules(GIO REQUIRED IMPORTED_TARGET gio-2.0) + +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/libflutter_linux_gtk.so") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/lib/libapp.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "fl_basic_message_channel.h" + "fl_binary_codec.h" + "fl_binary_messenger.h" + "fl_dart_project.h" + "fl_engine.h" + "fl_json_message_codec.h" + "fl_json_method_codec.h" + "fl_message_codec.h" + "fl_method_call.h" + "fl_method_channel.h" + "fl_method_codec.h" + "fl_method_response.h" + "fl_plugin_registrar.h" + "fl_plugin_registry.h" + "fl_standard_message_codec.h" + "fl_standard_method_codec.h" + "fl_string_codec.h" + "fl_value.h" + "fl_view.h" + "flutter_linux.h" +) +list_prepend(FLUTTER_LIBRARY_HEADERS "${EPHEMERAL_DIR}/flutter_linux/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}") +target_link_libraries(flutter INTERFACE + PkgConfig::GTK + PkgConfig::GLIB + PkgConfig::GIO +) +add_dependencies(flutter flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CMAKE_CURRENT_BINARY_DIR}/_phony_ + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.sh" + ${FLUTTER_TARGET_PLATFORM} ${CMAKE_BUILD_TYPE} + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} +) diff --git a/package/device_calendar_plus/example/linux/flutter/generated_plugin_registrant.cc b/package/device_calendar_plus/example/linux/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..e71a16d2 --- /dev/null +++ b/package/device_calendar_plus/example/linux/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void fl_register_plugins(FlPluginRegistry* registry) { +} diff --git a/package/device_calendar_plus/example/linux/flutter/generated_plugin_registrant.h b/package/device_calendar_plus/example/linux/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..e0f0a47b --- /dev/null +++ b/package/device_calendar_plus/example/linux/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void fl_register_plugins(FlPluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/package/device_calendar_plus/example/linux/flutter/generated_plugins.cmake b/package/device_calendar_plus/example/linux/flutter/generated_plugins.cmake new file mode 100644 index 00000000..2e1de87a --- /dev/null +++ b/package/device_calendar_plus/example/linux/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/linux plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/linux plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/package/device_calendar_plus/example/linux/runner/CMakeLists.txt b/package/device_calendar_plus/example/linux/runner/CMakeLists.txt new file mode 100644 index 00000000..e97dabc7 --- /dev/null +++ b/package/device_calendar_plus/example/linux/runner/CMakeLists.txt @@ -0,0 +1,26 @@ +cmake_minimum_required(VERSION 3.13) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} + "main.cc" + "my_application.cc" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the application ID. +add_definitions(-DAPPLICATION_ID="${APPLICATION_ID}") + +# Add dependency libraries. Add any application-specific dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter) +target_link_libraries(${BINARY_NAME} PRIVATE PkgConfig::GTK) + +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") diff --git a/package/device_calendar_plus/example/linux/runner/main.cc b/package/device_calendar_plus/example/linux/runner/main.cc new file mode 100644 index 00000000..e7c5c543 --- /dev/null +++ b/package/device_calendar_plus/example/linux/runner/main.cc @@ -0,0 +1,6 @@ +#include "my_application.h" + +int main(int argc, char** argv) { + g_autoptr(MyApplication) app = my_application_new(); + return g_application_run(G_APPLICATION(app), argc, argv); +} diff --git a/package/device_calendar_plus/example/linux/runner/my_application.cc b/package/device_calendar_plus/example/linux/runner/my_application.cc new file mode 100644 index 00000000..f6904ba3 --- /dev/null +++ b/package/device_calendar_plus/example/linux/runner/my_application.cc @@ -0,0 +1,144 @@ +#include "my_application.h" + +#include +#ifdef GDK_WINDOWING_X11 +#include +#endif + +#include "flutter/generated_plugin_registrant.h" + +struct _MyApplication { + GtkApplication parent_instance; + char** dart_entrypoint_arguments; +}; + +G_DEFINE_TYPE(MyApplication, my_application, GTK_TYPE_APPLICATION) + +// Called when first Flutter frame received. +static void first_frame_cb(MyApplication* self, FlView *view) +{ + gtk_widget_show(gtk_widget_get_toplevel(GTK_WIDGET(view))); +} + +// Implements GApplication::activate. +static void my_application_activate(GApplication* application) { + MyApplication* self = MY_APPLICATION(application); + GtkWindow* window = + GTK_WINDOW(gtk_application_window_new(GTK_APPLICATION(application))); + + // Use a header bar when running in GNOME as this is the common style used + // by applications and is the setup most users will be using (e.g. Ubuntu + // desktop). + // If running on X and not using GNOME then just use a traditional title bar + // in case the window manager does more exotic layout, e.g. tiling. + // If running on Wayland assume the header bar will work (may need changing + // if future cases occur). + gboolean use_header_bar = TRUE; +#ifdef GDK_WINDOWING_X11 + GdkScreen* screen = gtk_window_get_screen(window); + if (GDK_IS_X11_SCREEN(screen)) { + const gchar* wm_name = gdk_x11_screen_get_window_manager_name(screen); + if (g_strcmp0(wm_name, "GNOME Shell") != 0) { + use_header_bar = FALSE; + } + } +#endif + if (use_header_bar) { + GtkHeaderBar* header_bar = GTK_HEADER_BAR(gtk_header_bar_new()); + gtk_widget_show(GTK_WIDGET(header_bar)); + gtk_header_bar_set_title(header_bar, "example"); + gtk_header_bar_set_show_close_button(header_bar, TRUE); + gtk_window_set_titlebar(window, GTK_WIDGET(header_bar)); + } else { + gtk_window_set_title(window, "example"); + } + + gtk_window_set_default_size(window, 1280, 720); + + g_autoptr(FlDartProject) project = fl_dart_project_new(); + fl_dart_project_set_dart_entrypoint_arguments(project, self->dart_entrypoint_arguments); + + FlView* view = fl_view_new(project); + GdkRGBA background_color; + // Background defaults to black, override it here if necessary, e.g. #00000000 for transparent. + gdk_rgba_parse(&background_color, "#000000"); + fl_view_set_background_color(view, &background_color); + gtk_widget_show(GTK_WIDGET(view)); + gtk_container_add(GTK_CONTAINER(window), GTK_WIDGET(view)); + + // Show the window when Flutter renders. + // Requires the view to be realized so we can start rendering. + g_signal_connect_swapped(view, "first-frame", G_CALLBACK(first_frame_cb), self); + gtk_widget_realize(GTK_WIDGET(view)); + + fl_register_plugins(FL_PLUGIN_REGISTRY(view)); + + gtk_widget_grab_focus(GTK_WIDGET(view)); +} + +// Implements GApplication::local_command_line. +static gboolean my_application_local_command_line(GApplication* application, gchar*** arguments, int* exit_status) { + MyApplication* self = MY_APPLICATION(application); + // Strip out the first argument as it is the binary name. + self->dart_entrypoint_arguments = g_strdupv(*arguments + 1); + + g_autoptr(GError) error = nullptr; + if (!g_application_register(application, nullptr, &error)) { + g_warning("Failed to register: %s", error->message); + *exit_status = 1; + return TRUE; + } + + g_application_activate(application); + *exit_status = 0; + + return TRUE; +} + +// Implements GApplication::startup. +static void my_application_startup(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application startup. + + G_APPLICATION_CLASS(my_application_parent_class)->startup(application); +} + +// Implements GApplication::shutdown. +static void my_application_shutdown(GApplication* application) { + //MyApplication* self = MY_APPLICATION(object); + + // Perform any actions required at application shutdown. + + G_APPLICATION_CLASS(my_application_parent_class)->shutdown(application); +} + +// Implements GObject::dispose. +static void my_application_dispose(GObject* object) { + MyApplication* self = MY_APPLICATION(object); + g_clear_pointer(&self->dart_entrypoint_arguments, g_strfreev); + G_OBJECT_CLASS(my_application_parent_class)->dispose(object); +} + +static void my_application_class_init(MyApplicationClass* klass) { + G_APPLICATION_CLASS(klass)->activate = my_application_activate; + G_APPLICATION_CLASS(klass)->local_command_line = my_application_local_command_line; + G_APPLICATION_CLASS(klass)->startup = my_application_startup; + G_APPLICATION_CLASS(klass)->shutdown = my_application_shutdown; + G_OBJECT_CLASS(klass)->dispose = my_application_dispose; +} + +static void my_application_init(MyApplication* self) {} + +MyApplication* my_application_new() { + // Set the program name to the application ID, which helps various systems + // like GTK and desktop environments map this running application to its + // corresponding .desktop file. This ensures better integration by allowing + // the application to be recognized beyond its binary name. + g_set_prgname(APPLICATION_ID); + + return MY_APPLICATION(g_object_new(my_application_get_type(), + "application-id", APPLICATION_ID, + "flags", G_APPLICATION_NON_UNIQUE, + nullptr)); +} diff --git a/package/device_calendar_plus/example/linux/runner/my_application.h b/package/device_calendar_plus/example/linux/runner/my_application.h new file mode 100644 index 00000000..72271d5e --- /dev/null +++ b/package/device_calendar_plus/example/linux/runner/my_application.h @@ -0,0 +1,18 @@ +#ifndef FLUTTER_MY_APPLICATION_H_ +#define FLUTTER_MY_APPLICATION_H_ + +#include + +G_DECLARE_FINAL_TYPE(MyApplication, my_application, MY, APPLICATION, + GtkApplication) + +/** + * my_application_new: + * + * Creates a new Flutter-based application. + * + * Returns: a new #MyApplication. + */ +MyApplication* my_application_new(); + +#endif // FLUTTER_MY_APPLICATION_H_ diff --git a/package/device_calendar_plus/example/macos/Flutter/Flutter-Debug.xcconfig b/package/device_calendar_plus/example/macos/Flutter/Flutter-Debug.xcconfig new file mode 100644 index 00000000..4b81f9b2 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Flutter/Flutter-Debug.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/package/device_calendar_plus/example/macos/Flutter/Flutter-Release.xcconfig b/package/device_calendar_plus/example/macos/Flutter/Flutter-Release.xcconfig new file mode 100644 index 00000000..5caa9d15 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Flutter/Flutter-Release.xcconfig @@ -0,0 +1,2 @@ +#include? "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" +#include "ephemeral/Flutter-Generated.xcconfig" diff --git a/package/device_calendar_plus/example/macos/Flutter/GeneratedPluginRegistrant.swift b/package/device_calendar_plus/example/macos/Flutter/GeneratedPluginRegistrant.swift new file mode 100644 index 00000000..cccf817a --- /dev/null +++ b/package/device_calendar_plus/example/macos/Flutter/GeneratedPluginRegistrant.swift @@ -0,0 +1,10 @@ +// +// Generated file. Do not edit. +// + +import FlutterMacOS +import Foundation + + +func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { +} diff --git a/package/device_calendar_plus/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/package/device_calendar_plus/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig new file mode 100644 index 00000000..295eb2b3 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig @@ -0,0 +1,12 @@ +// This is a generated file; do not edit or check into version control. +FLUTTER_ROOT=/Users/cloud/sdk/flutter +FLUTTER_APPLICATION_PATH=/Users/cloud/Downloads/device_calender_plus/device_calendar_plus-0.3.1/example +COCOAPODS_PARALLEL_CODE_SIGN=true +FLUTTER_BUILD_DIR=build +FLUTTER_BUILD_NAME=1.0.0 +FLUTTER_BUILD_NUMBER=1 +FLUTTER_CLI_BUILD_MODE=debug +DART_OBFUSCATION=false +TRACK_WIDGET_CREATION=true +TREE_SHAKE_ICONS=false +PACKAGE_CONFIG=.dart_tool/package_config.json diff --git a/package/device_calendar_plus/example/macos/Flutter/ephemeral/flutter_export_environment.sh b/package/device_calendar_plus/example/macos/Flutter/ephemeral/flutter_export_environment.sh new file mode 100755 index 00000000..6c9803e6 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Flutter/ephemeral/flutter_export_environment.sh @@ -0,0 +1,13 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/cloud/sdk/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/cloud/Downloads/device_calender_plus/device_calendar_plus-0.3.1/example" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" +export "FLUTTER_BUILD_DIR=build" +export "FLUTTER_BUILD_NAME=1.0.0" +export "FLUTTER_BUILD_NUMBER=1" +export "FLUTTER_CLI_BUILD_MODE=debug" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=true" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.dart_tool/package_config.json" diff --git a/package/device_calendar_plus/example/macos/Podfile b/package/device_calendar_plus/example/macos/Podfile new file mode 100644 index 00000000..ff5ddb3b --- /dev/null +++ b/package/device_calendar_plus/example/macos/Podfile @@ -0,0 +1,42 @@ +platform :osx, '10.15' + +# CocoaPods analytics sends network stats synchronously affecting flutter build latency. +ENV['COCOAPODS_DISABLE_STATS'] = 'true' + +project 'Runner', { + 'Debug' => :debug, + 'Profile' => :release, + 'Release' => :release, +} + +def flutter_root + generated_xcode_build_settings_path = File.expand_path(File.join('..', 'Flutter', 'ephemeral', 'Flutter-Generated.xcconfig'), __FILE__) + unless File.exist?(generated_xcode_build_settings_path) + raise "#{generated_xcode_build_settings_path} must exist. If you're running pod install manually, make sure \"flutter pub get\" is executed first" + end + + File.foreach(generated_xcode_build_settings_path) do |line| + matches = line.match(/FLUTTER_ROOT\=(.*)/) + return matches[1].strip if matches + end + raise "FLUTTER_ROOT not found in #{generated_xcode_build_settings_path}. Try deleting Flutter-Generated.xcconfig, then run \"flutter pub get\"" +end + +require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelper'), flutter_root) + +flutter_macos_podfile_setup + +target 'Runner' do + use_frameworks! + + flutter_install_all_macos_pods File.dirname(File.realpath(__FILE__)) + target 'RunnerTests' do + inherit! :search_paths + end +end + +post_install do |installer| + installer.pods_project.targets.each do |target| + flutter_additional_macos_build_settings(target) + end +end diff --git a/package/device_calendar_plus/example/macos/Runner.xcodeproj/project.pbxproj b/package/device_calendar_plus/example/macos/Runner.xcodeproj/project.pbxproj new file mode 100644 index 00000000..b914e7af --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner.xcodeproj/project.pbxproj @@ -0,0 +1,705 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 54; + objects = { + +/* Begin PBXAggregateTarget section */ + 33CC111A2044C6BA0003C045 /* Flutter Assemble */ = { + isa = PBXAggregateTarget; + buildConfigurationList = 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */; + buildPhases = ( + 33CC111E2044C6BF0003C045 /* ShellScript */, + ); + dependencies = ( + ); + name = "Flutter Assemble"; + productName = FLX; + }; +/* End PBXAggregateTarget section */ + +/* Begin PBXBuildFile section */ + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C80D7294CF71000263BE5 /* RunnerTests.swift */; }; + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */ = {isa = PBXBuildFile; fileRef = 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */; }; + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC10F02044A3C60003C045 /* AppDelegate.swift */; }; + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F22044A3C60003C045 /* Assets.xcassets */; }; + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 33CC10F42044A3C60003C045 /* MainMenu.xib */; }; + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC10EC2044A3C60003C045; + remoteInfo = Runner; + }; + 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 33CC10E52044A3C60003C045 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 33CC111A2044C6BA0003C045; + remoteInfo = FLX; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 33CC110E2044A8840003C045 /* Bundle Framework */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Bundle Framework"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = RunnerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 331C80D7294CF71000263BE5 /* RunnerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RunnerTests.swift; sourceTree = ""; }; + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Warnings.xcconfig; sourceTree = ""; }; + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneratedPluginRegistrant.swift; sourceTree = ""; }; + 33CC10ED2044A3C60003C045 /* example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "example.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 33CC10F02044A3C60003C045 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33CC10F22044A3C60003C045 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Assets.xcassets; path = Runner/Assets.xcassets; sourceTree = ""; }; + 33CC10F52044A3C60003C045 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = ""; }; + 33CC10F72044A3C60003C045 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Runner/Info.plist; sourceTree = ""; }; + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainFlutterWindow.swift; sourceTree = ""; }; + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Debug.xcconfig"; sourceTree = ""; }; + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = "Flutter-Release.xcconfig"; sourceTree = ""; }; + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = "Flutter-Generated.xcconfig"; path = "ephemeral/Flutter-Generated.xcconfig"; sourceTree = ""; }; + 33E51913231747F40026EE4D /* DebugProfile.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DebugProfile.entitlements; sourceTree = ""; }; + 33E51914231749380026EE4D /* Release.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = Release.entitlements; sourceTree = ""; }; + 33E5194F232828860026EE4D /* AppInfo.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = AppInfo.xcconfig; sourceTree = ""; }; + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 331C80D2294CF70F00263BE5 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EA2044A3C60003C045 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 331C80D6294CF71000263BE5 /* RunnerTests */ = { + isa = PBXGroup; + children = ( + 331C80D7294CF71000263BE5 /* RunnerTests.swift */, + ); + path = RunnerTests; + sourceTree = ""; + }; + 33BA886A226E78AF003329D5 /* Configs */ = { + isa = PBXGroup; + children = ( + 33E5194F232828860026EE4D /* AppInfo.xcconfig */, + 9740EEB21CF90195004384FC /* Debug.xcconfig */, + 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, + 333000ED22D3DE5D00554162 /* Warnings.xcconfig */, + ); + path = Configs; + sourceTree = ""; + }; + 33CC10E42044A3C60003C045 = { + isa = PBXGroup; + children = ( + 33FAB671232836740065AC1E /* Runner */, + 33CEB47122A05771004F2AC0 /* Flutter */, + 331C80D6294CF71000263BE5 /* RunnerTests */, + 33CC10EE2044A3C60003C045 /* Products */, + D73912EC22F37F3D000D13A0 /* Frameworks */, + ); + sourceTree = ""; + }; + 33CC10EE2044A3C60003C045 /* Products */ = { + isa = PBXGroup; + children = ( + 33CC10ED2044A3C60003C045 /* example.app */, + 331C80D5294CF71000263BE5 /* RunnerTests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 33CC11242044D66E0003C045 /* Resources */ = { + isa = PBXGroup; + children = ( + 33CC10F22044A3C60003C045 /* Assets.xcassets */, + 33CC10F42044A3C60003C045 /* MainMenu.xib */, + 33CC10F72044A3C60003C045 /* Info.plist */, + ); + name = Resources; + path = ..; + sourceTree = ""; + }; + 33CEB47122A05771004F2AC0 /* Flutter */ = { + isa = PBXGroup; + children = ( + 335BBD1A22A9A15E00E9071D /* GeneratedPluginRegistrant.swift */, + 33CEB47222A05771004F2AC0 /* Flutter-Debug.xcconfig */, + 33CEB47422A05771004F2AC0 /* Flutter-Release.xcconfig */, + 33CEB47722A0578A004F2AC0 /* Flutter-Generated.xcconfig */, + ); + path = Flutter; + sourceTree = ""; + }; + 33FAB671232836740065AC1E /* Runner */ = { + isa = PBXGroup; + children = ( + 33CC10F02044A3C60003C045 /* AppDelegate.swift */, + 33CC11122044BFA00003C045 /* MainFlutterWindow.swift */, + 33E51913231747F40026EE4D /* DebugProfile.entitlements */, + 33E51914231749380026EE4D /* Release.entitlements */, + 33CC11242044D66E0003C045 /* Resources */, + 33BA886A226E78AF003329D5 /* Configs */, + ); + path = Runner; + sourceTree = ""; + }; + D73912EC22F37F3D000D13A0 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 331C80D4294CF70F00263BE5 /* RunnerTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */; + buildPhases = ( + 331C80D1294CF70F00263BE5 /* Sources */, + 331C80D2294CF70F00263BE5 /* Frameworks */, + 331C80D3294CF70F00263BE5 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 331C80DA294CF71000263BE5 /* PBXTargetDependency */, + ); + name = RunnerTests; + productName = RunnerTests; + productReference = 331C80D5294CF71000263BE5 /* RunnerTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 33CC10EC2044A3C60003C045 /* Runner */ = { + isa = PBXNativeTarget; + buildConfigurationList = 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */; + buildPhases = ( + 33CC10E92044A3C60003C045 /* Sources */, + 33CC10EA2044A3C60003C045 /* Frameworks */, + 33CC10EB2044A3C60003C045 /* Resources */, + 33CC110E2044A8840003C045 /* Bundle Framework */, + 3399D490228B24CF009A79C7 /* ShellScript */, + ); + buildRules = ( + ); + dependencies = ( + 33CC11202044C79F0003C045 /* PBXTargetDependency */, + ); + name = Runner; + productName = Runner; + productReference = 33CC10ED2044A3C60003C045 /* example.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 33CC10E52044A3C60003C045 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = YES; + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 1510; + ORGANIZATIONNAME = ""; + TargetAttributes = { + 331C80D4294CF70F00263BE5 = { + CreatedOnToolsVersion = 14.0; + TestTargetID = 33CC10EC2044A3C60003C045; + }; + 33CC10EC2044A3C60003C045 = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.Sandbox = { + enabled = 1; + }; + }; + }; + 33CC111A2044C6BA0003C045 = { + CreatedOnToolsVersion = 9.2; + ProvisioningStyle = Manual; + }; + }; + }; + buildConfigurationList = 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 33CC10E42044A3C60003C045; + productRefGroup = 33CC10EE2044A3C60003C045 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 33CC10EC2044A3C60003C045 /* Runner */, + 331C80D4294CF70F00263BE5 /* RunnerTests */, + 33CC111A2044C6BA0003C045 /* Flutter Assemble */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 331C80D3294CF70F00263BE5 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10EB2044A3C60003C045 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC10F32044A3C60003C045 /* Assets.xcassets in Resources */, + 33CC10F62044A3C60003C045 /* MainMenu.xib in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3399D490228B24CF009A79C7 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "echo \"$PRODUCT_NAME.app\" > \"$PROJECT_DIR\"/Flutter/ephemeral/.app_filename && \"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh embed\n"; + }; + 33CC111E2044C6BF0003C045 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + Flutter/ephemeral/FlutterInputs.xcfilelist, + ); + inputPaths = ( + Flutter/ephemeral/tripwire, + ); + outputFileListPaths = ( + Flutter/ephemeral/FlutterOutputs.xcfilelist, + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"$FLUTTER_ROOT\"/packages/flutter_tools/bin/macos_assemble.sh && touch Flutter/ephemeral/tripwire"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 331C80D1294CF70F00263BE5 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 331C80D8294CF71000263BE5 /* RunnerTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 33CC10E92044A3C60003C045 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 33CC11132044BFA00003C045 /* MainFlutterWindow.swift in Sources */, + 33CC10F12044A3C60003C045 /* AppDelegate.swift in Sources */, + 335BBD1B22A9A15E00E9071D /* GeneratedPluginRegistrant.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 331C80DA294CF71000263BE5 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC10EC2044A3C60003C045 /* Runner */; + targetProxy = 331C80D9294CF71000263BE5 /* PBXContainerItemProxy */; + }; + 33CC11202044C79F0003C045 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 33CC111A2044C6BA0003C045 /* Flutter Assemble */; + targetProxy = 33CC111F2044C79F0003C045 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 33CC10F42044A3C60003C045 /* MainMenu.xib */ = { + isa = PBXVariantGroup; + children = ( + 33CC10F52044A3C60003C045 /* Base */, + ); + name = MainMenu.xib; + path = Runner; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 331C80DB294CF71000263BE5 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = to.bullet.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/example"; + }; + name = Debug; + }; + 331C80DC294CF71000263BE5 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = to.bullet.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/example"; + }; + name = Release; + }; + 331C80DD294CF71000263BE5 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CURRENT_PROJECT_VERSION = 1; + GENERATE_INFOPLIST_FILE = YES; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = to.bullet.example.RunnerTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/example.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/example"; + }; + name = Profile; + }; + 338D0CE9231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Profile; + }; + 338D0CEA231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Profile; + }; + 338D0CEB231458BD00FA5F75 /* Profile */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Profile; + }; + 33CC10F92044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = macosx; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 33CC10FA2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CODE_SIGN_IDENTITY = "-"; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = NO; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.15; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = macosx; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + }; + name = Release; + }; + 33CC10FC2044A3C60003C045 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/DebugProfile.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + 33CC10FD2044A3C60003C045 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 33E5194F232828860026EE4D /* AppInfo.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; + CODE_SIGN_ENTITLEMENTS = Runner/Release.entitlements; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + INFOPLIST_FILE = Runner/Info.plist; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + 33CC111C2044C6BA0003C045 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Manual; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 33CC111D2044C6BA0003C045 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 331C80DE294CF71000263BE5 /* Build configuration list for PBXNativeTarget "RunnerTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 331C80DB294CF71000263BE5 /* Debug */, + 331C80DC294CF71000263BE5 /* Release */, + 331C80DD294CF71000263BE5 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10E82044A3C60003C045 /* Build configuration list for PBXProject "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10F92044A3C60003C045 /* Debug */, + 33CC10FA2044A3C60003C045 /* Release */, + 338D0CE9231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC10FB2044A3C60003C045 /* Build configuration list for PBXNativeTarget "Runner" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC10FC2044A3C60003C045 /* Debug */, + 33CC10FD2044A3C60003C045 /* Release */, + 338D0CEA231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 33CC111B2044C6BA0003C045 /* Build configuration list for PBXAggregateTarget "Flutter Assemble" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 33CC111C2044C6BA0003C045 /* Debug */, + 33CC111D2044C6BA0003C045 /* Release */, + 338D0CEB231458BD00FA5F75 /* Profile */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 33CC10E52044A3C60003C045 /* Project object */; +} diff --git a/package/device_calendar_plus/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/package/device_calendar_plus/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/package/device_calendar_plus/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/package/device_calendar_plus/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme new file mode 100644 index 00000000..ac78810c --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme @@ -0,0 +1,99 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package/device_calendar_plus/example/macos/Runner.xcworkspace/contents.xcworkspacedata b/package/device_calendar_plus/example/macos/Runner.xcworkspace/contents.xcworkspacedata new file mode 100644 index 00000000..1d526a16 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/package/device_calendar_plus/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/package/device_calendar_plus/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 00000000..18d98100 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/package/device_calendar_plus/example/macos/Runner/AppDelegate.swift b/package/device_calendar_plus/example/macos/Runner/AppDelegate.swift new file mode 100644 index 00000000..b3c17614 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner/AppDelegate.swift @@ -0,0 +1,13 @@ +import Cocoa +import FlutterMacOS + +@main +class AppDelegate: FlutterAppDelegate { + override func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool { + return true + } + + override func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } +} diff --git a/package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..a2ec33f1 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_16.png", + "scale" : "1x" + }, + { + "size" : "16x16", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "2x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_32.png", + "scale" : "1x" + }, + { + "size" : "32x32", + "idiom" : "mac", + "filename" : "app_icon_64.png", + "scale" : "2x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_128.png", + "scale" : "1x" + }, + { + "size" : "128x128", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "2x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_256.png", + "scale" : "1x" + }, + { + "size" : "256x256", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "2x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_512.png", + "scale" : "1x" + }, + { + "size" : "512x512", + "idiom" : "mac", + "filename" : "app_icon_1024.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} diff --git a/package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png b/package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..82b6f9d9a33e198f5747104729e1fcef999772a5 GIT binary patch literal 102994 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ⅅ8MglG&ER{i5lN315cO?EdHNLrg? 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 z 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 Pe7HEdAEg|=c=LY&YVNkY literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png b/package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png new file mode 100644 index 0000000000000000000000000000000000000000..13b35eba55c6dabc3aac36f33d859266c18fa0d0 GIT binary patch literal 5680 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 literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png b/package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3f5fa40fb3d1e0710331a48de5d256da3f275d GIT binary patch literal 520 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 literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png b/package/device_calendar_plus/example/macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png new file mode 100644 index 0000000000000000000000000000000000000000..2f1632cfddf3d9dade342351e627a0a75609fb46 GIT binary patch literal 2218 zcmV;b2vzrqP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91KmY&$07g+lumAuE6iGxuRCodHTWf3-RTMruyW6Fu zQYeUM04eX6D5c0FCjKKPrco1(K`<0SL=crI{PC3-^hZU0kQie$gh-5!7z6SH6Q0J% zqot*`H1q{R5fHFYS}dje@;kG=v$L0(yY0?wY2%*c?A&{2?!D*x?m71{of2gv!$5|C z3>qG_BW}7K_yUcT3A5C6QD<+{aq?x;MAUyAiJn#Jv8_zZtQ{P zTRzbL3U9!qVuZzS$xKU10KiW~Bgdcv1-!uAhQxf3a7q+dU6lj?yoO4Lq4TUN4}h{N z*fIM=SS8|C2$(T>w$`t@3Tka!(r!7W`x z-isCVgQD^mG-MJ;XtJuK3V{Vy72GQ83KRWsHU?e*wrhKk=ApIYeDqLi;JI1e zuvv}5^Dc=k7F7?nm3nIw$NVmU-+R>> zyqOR$-2SDpJ}Pt;^RkJytDVXNTsu|mI1`~G7yw`EJR?VkGfNdqK9^^8P`JdtTV&tX4CNcV4 z&N06nZa??Fw1AgQOUSE2AmPE@WO(Fvo`%m`cDgiv(fAeRA%3AGXUbsGw{7Q`cY;1BI#ac3iN$$Hw z0LT0;xc%=q)me?Y*$xI@GRAw?+}>=9D+KTk??-HJ4=A>`V&vKFS75@MKdSF1JTq{S zc1!^8?YA|t+uKigaq!sT;Z!&0F2=k7F0PIU;F$leJLaw2UI6FL^w}OG&!;+b%ya1c z1n+6-inU<0VM-Y_s5iTElq)ThyF?StVcebpGI znw#+zLx2@ah{$_2jn+@}(zJZ{+}_N9BM;z)0yr|gF-4=Iyu@hI*Lk=-A8f#bAzc9f z`Kd6K--x@t04swJVC3JK1cHY-Hq+=|PN-VO;?^_C#;coU6TDP7Bt`;{JTG;!+jj(` zw5cLQ-(Cz-Tlb`A^w7|R56Ce;Wmr0)$KWOUZ6ai0PhzPeHwdl0H(etP zUV`va_i0s-4#DkNM8lUlqI7>YQLf)(lz9Q3Uw`)nc(z3{m5ZE77Ul$V%m)E}3&8L0 z-XaU|eB~Is08eORPk;=<>!1w)Kf}FOVS2l&9~A+@R#koFJ$Czd%Y(ENTV&A~U(IPI z;UY+gf+&6ioZ=roly<0Yst8ck>(M=S?B-ys3mLdM&)ex!hbt+ol|T6CTS+Sc0jv(& z7ijdvFwBq;0a{%3GGwkDKTeG`b+lyj0jjS1OMkYnepCdoosNY`*zmBIo*981BU%%U z@~$z0V`OVtIbEx5pa|Tct|Lg#ZQf5OYMUMRD>Wdxm5SAqV2}3!ceE-M2 z@O~lQ0OiKQp}o9I;?uxCgYVV?FH|?Riri*U$Zi_`V2eiA>l zdSm6;SEm6#T+SpcE8Ro_f2AwxzI z44hfe^WE3!h@W3RDyA_H440cpmYkv*)6m1XazTqw%=E5Xv7^@^^T7Q2wxr+Z2kVYr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/package/device_calendar_plus/example/macos/Runner/Configs/AppInfo.xcconfig b/package/device_calendar_plus/example/macos/Runner/Configs/AppInfo.xcconfig new file mode 100644 index 00000000..a95b9293 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner/Configs/AppInfo.xcconfig @@ -0,0 +1,14 @@ +// Application-level settings for the Runner target. +// +// This may be replaced with something auto-generated from metadata (e.g., pubspec.yaml) in the +// future. If not, the values below would default to using the project name when this becomes a +// 'flutter create' template. + +// The application's name. By default this is also the title of the Flutter window. +PRODUCT_NAME = example + +// The application's bundle identifier +PRODUCT_BUNDLE_IDENTIFIER = to.bullet.example + +// The copyright displayed in application information +PRODUCT_COPYRIGHT = Copyright © 2025 to.bullet. All rights reserved. diff --git a/package/device_calendar_plus/example/macos/Runner/Configs/Debug.xcconfig b/package/device_calendar_plus/example/macos/Runner/Configs/Debug.xcconfig new file mode 100644 index 00000000..36b0fd94 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner/Configs/Debug.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Debug.xcconfig" +#include "Warnings.xcconfig" diff --git a/package/device_calendar_plus/example/macos/Runner/Configs/Release.xcconfig b/package/device_calendar_plus/example/macos/Runner/Configs/Release.xcconfig new file mode 100644 index 00000000..dff4f495 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner/Configs/Release.xcconfig @@ -0,0 +1,2 @@ +#include "../../Flutter/Flutter-Release.xcconfig" +#include "Warnings.xcconfig" diff --git a/package/device_calendar_plus/example/macos/Runner/Configs/Warnings.xcconfig b/package/device_calendar_plus/example/macos/Runner/Configs/Warnings.xcconfig new file mode 100644 index 00000000..42bcbf47 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner/Configs/Warnings.xcconfig @@ -0,0 +1,13 @@ +WARNING_CFLAGS = -Wall -Wconditional-uninitialized -Wnullable-to-nonnull-conversion -Wmissing-method-return-type -Woverlength-strings +GCC_WARN_UNDECLARED_SELECTOR = YES +CLANG_UNDEFINED_BEHAVIOR_SANITIZER_NULLABILITY = YES +CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE +CLANG_WARN__DUPLICATE_METHOD_MATCH = YES +CLANG_WARN_PRAGMA_PACK = YES +CLANG_WARN_STRICT_PROTOTYPES = YES +CLANG_WARN_COMMA = YES +GCC_WARN_STRICT_SELECTOR_MATCH = YES +CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES +CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES +GCC_WARN_SHADOW = YES +CLANG_WARN_UNREACHABLE_CODE = YES diff --git a/package/device_calendar_plus/example/macos/Runner/DebugProfile.entitlements b/package/device_calendar_plus/example/macos/Runner/DebugProfile.entitlements new file mode 100644 index 00000000..dddb8a30 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner/DebugProfile.entitlements @@ -0,0 +1,12 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.cs.allow-jit + + com.apple.security.network.server + + + diff --git a/package/device_calendar_plus/example/macos/Runner/Info.plist b/package/device_calendar_plus/example/macos/Runner/Info.plist new file mode 100644 index 00000000..4789daa6 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner/Info.plist @@ -0,0 +1,32 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIconFile + + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(FLUTTER_BUILD_NAME) + CFBundleVersion + $(FLUTTER_BUILD_NUMBER) + LSMinimumSystemVersion + $(MACOSX_DEPLOYMENT_TARGET) + NSHumanReadableCopyright + $(PRODUCT_COPYRIGHT) + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/package/device_calendar_plus/example/macos/Runner/MainFlutterWindow.swift b/package/device_calendar_plus/example/macos/Runner/MainFlutterWindow.swift new file mode 100644 index 00000000..3cc05eb2 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner/MainFlutterWindow.swift @@ -0,0 +1,15 @@ +import Cocoa +import FlutterMacOS + +class MainFlutterWindow: NSWindow { + override func awakeFromNib() { + let flutterViewController = FlutterViewController() + let windowFrame = self.frame + self.contentViewController = flutterViewController + self.setFrame(windowFrame, display: true) + + RegisterGeneratedPlugins(registry: flutterViewController) + + super.awakeFromNib() + } +} diff --git a/package/device_calendar_plus/example/macos/Runner/Release.entitlements b/package/device_calendar_plus/example/macos/Runner/Release.entitlements new file mode 100644 index 00000000..852fa1a4 --- /dev/null +++ b/package/device_calendar_plus/example/macos/Runner/Release.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/package/device_calendar_plus/example/macos/RunnerTests/RunnerTests.swift b/package/device_calendar_plus/example/macos/RunnerTests/RunnerTests.swift new file mode 100644 index 00000000..61f3bd1f --- /dev/null +++ b/package/device_calendar_plus/example/macos/RunnerTests/RunnerTests.swift @@ -0,0 +1,12 @@ +import Cocoa +import FlutterMacOS +import XCTest + +class RunnerTests: XCTestCase { + + func testExample() { + // If you add code to the Runner application, consider adding tests here. + // See https://developer.apple.com/documentation/xctest for more information about using XCTest. + } + +} diff --git a/package/device_calendar_plus/example/pubspec.lock b/package/device_calendar_plus/example/pubspec.lock new file mode 100644 index 00000000..66c5de7d --- /dev/null +++ b/package/device_calendar_plus/example/pubspec.lock @@ -0,0 +1,307 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + cupertino_icons: + dependency: "direct main" + description: + name: cupertino_icons + sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 + url: "https://pub.dev" + source: hosted + version: "1.0.8" + device_calendar_plus: + dependency: "direct main" + description: + path: ".." + relative: true + source: path + version: "0.3.1" + device_calendar_plus_android: + dependency: transitive + description: + name: device_calendar_plus_android + sha256: f66f363273e0b174fdb3f98030a8c67ae9e9dfcb6122e4ca842881f976313db0 + url: "https://pub.dev" + source: hosted + version: "0.3.1" + device_calendar_plus_ios: + dependency: transitive + description: + name: device_calendar_plus_ios + sha256: c9b234091d3edc78871ed524077c262ce66217b960b7942ef071032e47b60fa8 + url: "https://pub.dev" + source: hosted + version: "0.3.1" + device_calendar_plus_platform_interface: + dependency: transitive + description: + name: device_calendar_plus_platform_interface + sha256: fb4d893d04b10ab00bc175be8a374aad08a7c4ad7d763c7ff48036d76be7604b + url: "https://pub.dev" + source: hosted + version: "0.3.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + file: + dependency: transitive + description: + name: file + sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 + url: "https://pub.dev" + source: hosted + version: "7.0.1" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.dev" + source: hosted + version: "5.1.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + platform: + dependency: transitive + description: + name: platform + sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" + url: "https://pub.dev" + source: hosted + version: "3.1.6" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + process: + dependency: transitive + description: + name: process + sha256: c6248e4526673988586e8c00bb22a49210c258dc91df5227d5da9748ecf79744 + url: "https://pub.dev" + source: hosted + version: "5.0.5" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + sync_http: + dependency: transitive + description: + name: sync_http + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" + source: hosted + version: "0.3.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + url: "https://pub.dev" + source: hosted + version: "0.7.6" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.dev" + source: hosted + version: "15.0.2" + webdriver: + dependency: transitive + description: + name: webdriver + sha256: "2f3a14ca026957870cfd9c635b83507e0e51d8091568e90129fbf805aba7cade" + url: "https://pub.dev" + source: hosted + version: "3.1.0" +sdks: + dart: ">=3.8.0-0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/package/device_calendar_plus/example/pubspec.yaml b/package/device_calendar_plus/example/pubspec.yaml new file mode 100644 index 00000000..1e6e8972 --- /dev/null +++ b/package/device_calendar_plus/example/pubspec.yaml @@ -0,0 +1,95 @@ +name: example +description: "A new Flutter project." +# The following line prevents the package from being accidentally published to +# pub.dev using `flutter pub publish`. This is preferred for private packages. +publish_to: 'none' # Remove this line if you wish to publish to pub.dev + + + +# The following defines the version and build number for your application. +# A version number is three numbers separated by dots, like 1.2.43 +# followed by an optional build number separated by a +. +# Both the version and the builder number may be overridden in flutter +# build by specifying --build-name and --build-number, respectively. +# In Android, build-name is used as versionName while build-number used as versionCode. +# Read more about Android versioning at https://developer.android.com/studio/publish/versioning +# In iOS, build-name is used as CFBundleShortVersionString while build-number is used as CFBundleVersion. +# Read more about iOS versioning at +# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html +# In Windows, build-name is used as the major, minor, and patch parts +# of the product and file versions while build-number is used as the build suffix. +version: 1.0.0+1 + +environment: + sdk: ">=3.5.0 <4.0.0" + +# Dependencies specify other packages that your package needs in order to work. +# To automatically upgrade your package dependencies to the latest versions +# consider running `flutter pub upgrade --major-versions`. Alternatively, +# dependencies can be manually updated by changing the version numbers below to +# the latest version available on pub.dev. To see which dependencies have newer +# versions available, run `flutter pub outdated`. +dependencies: + flutter: + sdk: flutter + device_calendar_plus: + path: ../ + + # The following adds the Cupertino Icons font to your application. + # Use with the CupertinoIcons class for iOS style icons. + cupertino_icons: ^1.0.8 + +dev_dependencies: + flutter_test: + sdk: flutter + integration_test: + sdk: flutter + + # The "flutter_lints" package below contains a set of recommended lints to + # encourage good coding practices. The lint set provided by the package is + # activated in the `analysis_options.yaml` file located at the root of your + # package. See that file for information about deactivating specific lint + # rules and activating additional ones. + flutter_lints: ^5.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # The following line ensures that the Material Icons font is + # included with your application, so that you can use the icons in + # the material Icons class. + uses-material-design: true + + # To add assets to your application, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # For details regarding adding assets from package dependencies, see + # https://flutter.dev/to/asset-from-package + + # To add custom fonts to your application, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts from package dependencies, + # see https://flutter.dev/to/font-from-package diff --git a/package/device_calendar_plus/example/run_integration_tests.sh b/package/device_calendar_plus/example/run_integration_tests.sh new file mode 100755 index 00000000..895f6ee4 --- /dev/null +++ b/package/device_calendar_plus/example/run_integration_tests.sh @@ -0,0 +1,122 @@ +#!/bin/bash + +# Integration Test Runner for Device Calendar Plus +# This script automatically grants calendar permissions and runs integration tests +# on iOS simulators or Android emulators. + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Check if device ID is provided +if [ -z "$1" ]; then + echo -e "${RED}❌ Error: Device ID required${NC}" + echo "" + echo "Usage: $0 " + echo "" + echo "Find device IDs with: flutter devices" + echo "" + echo "Examples:" + echo " $0 F0A86A59-EB1B-4AA2-B487-8D3AA46664D8 # iOS simulator" + echo " $0 emulator-5554 # Android emulator" + echo " $0 booted # Currently booted iOS simulator" + exit 1 +fi + +DEVICE_ID="$1" + +echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" +echo -e "${BLUE} Device Calendar Plus - Integration Tests${NC}" +echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" +echo "" + +# Detect platform +if [[ "$DEVICE_ID" == *"emulator"* ]] || flutter devices | grep "$DEVICE_ID" | grep -q "android"; then + PLATFORM="android" +elif flutter devices | grep "$DEVICE_ID" | grep -q "ios"; then + PLATFORM="ios" +else + echo -e "${RED}❌ Could not detect platform for device: $DEVICE_ID${NC}" + echo "" + echo "Run 'flutter devices' to see available devices" + exit 1 +fi + +echo -e "${GREEN}✓${NC} Device ID: ${YELLOW}$DEVICE_ID${NC}" +echo -e "${GREEN}✓${NC} Platform: ${YELLOW}$PLATFORM${NC}" +echo "" + +# Grant permissions based on platform +if [ "$PLATFORM" == "ios" ]; then + echo "🍎 iOS detected" + echo "📱 Granting calendar permissions via xcrun..." + + xcrun simctl privacy "$DEVICE_ID" grant calendar to.bullet.example + + if [ $? -eq 0 ]; then + echo -e "${GREEN}✓${NC} Calendar permissions granted" + else + echo -e "${YELLOW}⚠️ Warning: Could not grant permissions${NC}" + echo " The simulator may need to be booted first" + echo " Tests may prompt for permissions on first run" + fi + echo "" + +elif [ "$PLATFORM" == "android" ]; then + echo "🤖 Android detected" + echo " (Permissions will be granted automatically by test driver)" + echo "" +fi + +# Run the integration tests +echo "🚀 Running integration tests on $DEVICE_ID..." +echo "" + +cd "$(dirname "$0")" + +# Build test command based on platform +if [ "$PLATFORM" == "android" ]; then + # Use custom driver that grants permissions via adb + if flutter drive \ + --driver=integration_test/integration_test_driver.dart \ + --target=integration_test/device_calendar_test.dart \ + -d "$DEVICE_ID"; then + EXIT_CODE=0 + else + EXIT_CODE=1 + fi +else + # iOS: Use regular flutter test + if flutter test integration_test/device_calendar_test.dart -d "$DEVICE_ID"; then + EXIT_CODE=0 + else + EXIT_CODE=1 + fi +fi + +echo "" +echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + +if [ $EXIT_CODE -eq 0 ]; then + echo -e "${GREEN}✅ All integration tests passed!${NC}" +else + echo -e "${RED}❌ Some tests failed${NC}" + + if [ "$PLATFORM" == "ios" ]; then + echo "" + echo "If tests failed due to permissions:" + echo " 1. Ensure the simulator is booted before running the script" + echo " 2. Try: xcrun simctl privacy $DEVICE_ID reset calendar" + echo " 3. Then run the script again" + fi +fi + +echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" + +exit $EXIT_CODE + diff --git a/package/device_calendar_plus/example/web/favicon.png b/package/device_calendar_plus/example/web/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8aaa46ac1ae21512746f852a42ba87e4165dfdd1 GIT binary patch literal 917 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|I14-?iy0X7 zltGxWVyS%@P(fs7NJL45ua8x7ey(0(N`6wRUPW#JP&EUCO@$SZnVVXYs8ErclUHn2 zVXFjIVFhG^g!Ppaz)DK8ZIvQ?0~DO|i&7O#^-S~(l1AfjnEK zjFOT9D}DX)@^Za$W4-*MbbUihOG|wNBYh(yU7!lx;>x^|#0uTKVr7USFmqf|i<65o z3raHc^AtelCMM;Vme?vOfh>Xph&xL%(-1c06+^uR^q@XSM&D4+Kp$>4P^%3{)XKjo zGZknv$b36P8?Z_gF{nK@`XI}Z90TzwSQO}0J1!f2c(B=V`5aP@1P1a|PZ!4!3&Gl8 zTYqUsf!gYFyJnXpu0!n&N*SYAX-%d(5gVjrHJWqXQshj@!Zm{!01WsQrH~9=kTxW#6SvuapgMqt>$=j#%eyGrQzr zP{L-3gsMA^$I1&gsBAEL+vxi1*Igl=8#8`5?A-T5=z-sk46WA1IUT)AIZHx1rdUrf zVJrJn<74DDw`j)Ki#gt}mIT-Q`XRa2-jQXQoI%w`nb|XblvzK${ZzlV)m-XcwC(od z71_OEC5Bt9GEXosOXaPTYOia#R4ID2TiU~`zVMl08TV_C%DnU4^+HE>9(CE4D6?Fz oujB08i7adh9xk7*FX66dWH6F5TM;?E2b5PlUHx3vIVCg!0Dx9vYXATM literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/web/icons/Icon-192.png b/package/device_calendar_plus/example/web/icons/Icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..b749bfef07473333cf1dd31e9eed89862a5d52aa GIT binary patch literal 5292 zcmZ`-2T+sGz6~)*FVZ`aW+(v>MIm&M-g^@e2u-B-DoB?qO+b1Tq<5uCCv>ESfRum& zp%X;f!~1{tzL__3=gjVJ=j=J>+nMj%ncXj1Q(b|Ckbw{Y0FWpt%4y%$uD=Z*c-x~o zE;IoE;xa#7Ll5nj-e4CuXB&G*IM~D21rCP$*xLXAK8rIMCSHuSu%bL&S3)8YI~vyp@KBu9Ph7R_pvKQ@xv>NQ`dZp(u{Z8K3yOB zn7-AR+d2JkW)KiGx0hosml;+eCXp6+w%@STjFY*CJ?udJ64&{BCbuebcuH;}(($@@ znNlgBA@ZXB)mcl9nbX#F!f_5Z=W>0kh|UVWnf!At4V*LQP%*gPdCXd6P@J4Td;!Ur z<2ZLmwr(NG`u#gDEMP19UcSzRTL@HsK+PnIXbVBT@oHm53DZr?~V(0{rsalAfwgo zEh=GviaqkF;}F_5-yA!1u3!gxaR&Mj)hLuj5Q-N-@Lra{%<4ONja8pycD90&>yMB` zchhd>0CsH`^|&TstH-8+R`CfoWqmTTF_0?zDOY`E`b)cVi!$4xA@oO;SyOjJyP^_j zx^@Gdf+w|FW@DMdOi8=4+LJl$#@R&&=UM`)G!y%6ZzQLoSL%*KE8IO0~&5XYR9 z&N)?goEiWA(YoRfT{06&D6Yuu@Qt&XVbuW@COb;>SP9~aRc+z`m`80pB2o%`#{xD@ zI3RAlukL5L>px6b?QW1Ac_0>ew%NM!XB2(H+1Y3AJC?C?O`GGs`331Nd4ZvG~bMo{lh~GeL zSL|tT*fF-HXxXYtfu5z+T5Mx9OdP7J4g%@oeC2FaWO1D{=NvL|DNZ}GO?O3`+H*SI z=grGv=7dL{+oY0eJFGO!Qe(e2F?CHW(i!!XkGo2tUvsQ)I9ev`H&=;`N%Z{L zO?vV%rDv$y(@1Yj@xfr7Kzr<~0{^T8wM80xf7IGQF_S-2c0)0D6b0~yD7BsCy+(zL z#N~%&e4iAwi4F$&dI7x6cE|B{f@lY5epaDh=2-(4N05VO~A zQT3hanGy_&p+7Fb^I#ewGsjyCEUmSCaP6JDB*=_()FgQ(-pZ28-{qx~2foO4%pM9e z*_63RT8XjgiaWY|*xydf;8MKLd{HnfZ2kM%iq}fstImB-K6A79B~YoPVa@tYN@T_$ zea+9)<%?=Fl!kd(Y!G(-o}ko28hg2!MR-o5BEa_72uj7Mrc&{lRh3u2%Y=Xk9^-qa zBPWaD=2qcuJ&@Tf6ue&)4_V*45=zWk@Z}Q?f5)*z)-+E|-yC4fs5CE6L_PH3=zI8p z*Z3!it{1e5_^(sF*v=0{`U9C741&lub89gdhKp|Y8CeC{_{wYK-LSbp{h)b~9^j!s z7e?Y{Z3pZv0J)(VL=g>l;<}xk=T*O5YR|hg0eg4u98f2IrA-MY+StQIuK-(*J6TRR z|IM(%uI~?`wsfyO6Tgmsy1b3a)j6M&-jgUjVg+mP*oTKdHg?5E`!r`7AE_#?Fc)&a z08KCq>Gc=ne{PCbRvs6gVW|tKdcE1#7C4e`M|j$C5EYZ~Y=jUtc zj`+?p4ba3uy7><7wIokM79jPza``{Lx0)zGWg;FW1^NKY+GpEi=rHJ+fVRGfXO zPHV52k?jxei_!YYAw1HIz}y8ZMwdZqU%ESwMn7~t zdI5%B;U7RF=jzRz^NuY9nM)&<%M>x>0(e$GpU9th%rHiZsIT>_qp%V~ILlyt^V`=d z!1+DX@ah?RnB$X!0xpTA0}lN@9V-ePx>wQ?-xrJr^qDlw?#O(RsXeAvM%}rg0NT#t z!CsT;-vB=B87ShG`GwO;OEbeL;a}LIu=&@9cb~Rsx(ZPNQ!NT7H{@j0e(DiLea>QD zPmpe90gEKHEZ8oQ@6%E7k-Ptn#z)b9NbD@_GTxEhbS+}Bb74WUaRy{w;E|MgDAvHw zL)ycgM7mB?XVh^OzbC?LKFMotw3r@i&VdUV%^Efdib)3@soX%vWCbnOyt@Y4swW925@bt45y0HY3YI~BnnzZYrinFy;L?2D3BAL`UQ zEj))+f>H7~g8*VuWQ83EtGcx`hun$QvuurSMg3l4IP8Fe`#C|N6mbYJ=n;+}EQm;< z!!N=5j1aAr_uEnnzrEV%_E|JpTb#1p1*}5!Ce!R@d$EtMR~%9# zd;h8=QGT)KMW2IKu_fA_>p_und#-;Q)p%%l0XZOXQicfX8M~7?8}@U^ihu;mizj)t zgV7wk%n-UOb z#!P5q?Ex+*Kx@*p`o$q8FWL*E^$&1*!gpv?Za$YO~{BHeGY*5%4HXUKa_A~~^d z=E*gf6&+LFF^`j4$T~dR)%{I)T?>@Ma?D!gi9I^HqvjPc3-v~=qpX1Mne@*rzT&Xw zQ9DXsSV@PqpEJO-g4A&L{F&;K6W60D!_vs?Vx!?w27XbEuJJP&);)^+VF1nHqHBWu z^>kI$M9yfOY8~|hZ9WB!q-9u&mKhEcRjlf2nm_@s;0D#c|@ED7NZE% zzR;>P5B{o4fzlfsn3CkBK&`OSb-YNrqx@N#4CK!>bQ(V(D#9|l!e9(%sz~PYk@8zt zPN9oK78&-IL_F zhsk1$6p;GqFbtB^ZHHP+cjMvA0(LqlskbdYE_rda>gvQLTiqOQ1~*7lg%z*&p`Ry& zRcG^DbbPj_jOKHTr8uk^15Boj6>hA2S-QY(W-6!FIq8h$<>MI>PYYRenQDBamO#Fv zAH5&ImqKBDn0v5kb|8i0wFhUBJTpT!rB-`zK)^SNnRmLraZcPYK7b{I@+}wXVdW-{Ps17qdRA3JatEd?rPV z4@}(DAMf5EqXCr4-B+~H1P#;t@O}B)tIJ(W6$LrK&0plTmnPpb1TKn3?f?Kk``?D+ zQ!MFqOX7JbsXfQrz`-M@hq7xlfNz;_B{^wbpG8des56x(Q)H)5eLeDwCrVR}hzr~= zM{yXR6IM?kXxauLza#@#u?Y|o;904HCqF<8yT~~c-xyRc0-vxofnxG^(x%>bj5r}N zyFT+xnn-?B`ohA>{+ZZQem=*Xpqz{=j8i2TAC#x-m;;mo{{sLB_z(UoAqD=A#*juZ zCv=J~i*O8;F}A^Wf#+zx;~3B{57xtoxC&j^ie^?**T`WT2OPRtC`xj~+3Kprn=rVM zVJ|h5ux%S{dO}!mq93}P+h36mZ5aZg1-?vhL$ke1d52qIiXSE(llCr5i=QUS?LIjc zV$4q=-)aaR4wsrQv}^shL5u%6;`uiSEs<1nG^?$kl$^6DL z43CjY`M*p}ew}}3rXc7Xck@k41jx}c;NgEIhKZ*jsBRZUP-x2cm;F1<5$jefl|ppO zmZd%%?gMJ^g9=RZ^#8Mf5aWNVhjAS^|DQO+q$)oeob_&ZLFL(zur$)); zU19yRm)z<4&4-M}7!9+^Wl}Uk?`S$#V2%pQ*SIH5KI-mn%i;Z7-)m$mN9CnI$G7?# zo`zVrUwoSL&_dJ92YhX5TKqaRkfPgC4=Q&=K+;_aDs&OU0&{WFH}kKX6uNQC6%oUH z2DZa1s3%Vtk|bglbxep-w)PbFG!J17`<$g8lVhqD2w;Z0zGsh-r zxZ13G$G<48leNqR!DCVt9)@}(zMI5w6Wo=N zpP1*3DI;~h2WDWgcKn*f!+ORD)f$DZFwgKBafEZmeXQMAsq9sxP9A)7zOYnkHT9JU zRA`umgmP9d6=PHmFIgx=0$(sjb>+0CHG)K@cPG{IxaJ&Ueo8)0RWgV9+gO7+Bl1(F z7!BslJ2MP*PWJ;x)QXbR$6jEr5q3 z(3}F@YO_P1NyTdEXRLU6fp?9V2-S=E+YaeLL{Y)W%6`k7$(EW8EZSA*(+;e5@jgD^I zaJQ2|oCM1n!A&-8`;#RDcZyk*+RPkn_r8?Ak@agHiSp*qFNX)&i21HE?yuZ;-C<3C zwJGd1lx5UzViP7sZJ&|LqH*mryb}y|%AOw+v)yc`qM)03qyyrqhX?ub`Cjwx2PrR! z)_z>5*!*$x1=Qa-0uE7jy0z`>|Ni#X+uV|%_81F7)b+nf%iz=`fF4g5UfHS_?PHbr zB;0$bK@=di?f`dS(j{l3-tSCfp~zUuva+=EWxJcRfp(<$@vd(GigM&~vaYZ0c#BTs z3ijkxMl=vw5AS&DcXQ%eeKt!uKvh2l3W?&3=dBHU=Gz?O!40S&&~ei2vg**c$o;i89~6DVns zG>9a*`k5)NI9|?W!@9>rzJ;9EJ=YlJTx1r1BA?H`LWijk(rTax9(OAu;q4_wTj-yj z1%W4GW&K4T=uEGb+E!>W0SD_C0RR91 literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/web/icons/Icon-512.png b/package/device_calendar_plus/example/web/icons/Icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..88cfd48dff1169879ba46840804b412fe02fefd6 GIT binary patch literal 8252 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 literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/web/icons/Icon-maskable-192.png b/package/device_calendar_plus/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000000000000000000000000000000000000..eb9b4d76e525556d5d89141648c724331630325d GIT binary patch literal 5594 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 X>c!)3PgKfL&lX^$Z>Cpu&6)6jvi^Z! literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/web/icons/Icon-maskable-512.png b/package/device_calendar_plus/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000000000000000000000000000000000000..d69c56691fbdb0b7efa65097c7cc1edac12a6d3e GIT binary patch literal 20998 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 MPgg&ebxsLQ025IeI{*Lx literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/web/index.html b/package/device_calendar_plus/example/web/index.html new file mode 100644 index 00000000..29b58086 --- /dev/null +++ b/package/device_calendar_plus/example/web/index.html @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + example + + + + + + diff --git a/package/device_calendar_plus/example/web/manifest.json b/package/device_calendar_plus/example/web/manifest.json new file mode 100644 index 00000000..096edf8f --- /dev/null +++ b/package/device_calendar_plus/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/package/device_calendar_plus/example/windows/CMakeLists.txt b/package/device_calendar_plus/example/windows/CMakeLists.txt new file mode 100644 index 00000000..d960948a --- /dev/null +++ b/package/device_calendar_plus/example/windows/CMakeLists.txt @@ -0,0 +1,108 @@ +# Project-level configuration. +cmake_minimum_required(VERSION 3.14) +project(example LANGUAGES CXX) + +# The name of the executable created for the application. Change this to change +# the on-disk name of your application. +set(BINARY_NAME "example") + +# Explicitly opt in to modern CMake behaviors to avoid warnings with recent +# versions of CMake. +cmake_policy(VERSION 3.14...3.25) + +# Define build configuration option. +get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +if(IS_MULTICONFIG) + set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release" + CACHE STRING "" FORCE) +else() + if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE "Debug" CACHE + STRING "Flutter build mode" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS + "Debug" "Profile" "Release") + endif() +endif() +# Define settings for the Profile build mode. +set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}") +set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}") +set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}") +set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}") + +# Use Unicode for all projects. +add_definitions(-DUNICODE -D_UNICODE) + +# Compilation settings that should be applied to most targets. +# +# Be cautious about adding new options here, as plugins use this function by +# default. In most cases, you should add new options to specific targets instead +# of modifying this function. +function(APPLY_STANDARD_SETTINGS TARGET) + target_compile_features(${TARGET} PUBLIC cxx_std_17) + target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100") + target_compile_options(${TARGET} PRIVATE /EHsc) + target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0") + target_compile_definitions(${TARGET} PRIVATE "$<$:_DEBUG>") +endfunction() + +# Flutter library and tool build rules. +set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter") +add_subdirectory(${FLUTTER_MANAGED_DIR}) + +# Application build; see runner/CMakeLists.txt. +add_subdirectory("runner") + + +# Generated plugin build rules, which manage building the plugins and adding +# them to the application. +include(flutter/generated_plugins.cmake) + + +# === Installation === +# Support files are copied into place next to the executable, so that it can +# run in place. This is done instead of making a separate bundle (as on Linux) +# so that building and running from within Visual Studio will work. +set(BUILD_BUNDLE_DIR "$") +# Make the "install" step default, as it's required to run. +set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE) +endif() + +set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data") +set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}") + +install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + COMPONENT Runtime) + +install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +if(PLUGIN_BUNDLED_LIBRARIES) + install(FILES "${PLUGIN_BUNDLED_LIBRARIES}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) +endif() + +# Copy the native assets provided by the build.dart from all packages. +set(NATIVE_ASSETS_DIR "${PROJECT_BUILD_DIR}native_assets/windows/") +install(DIRECTORY "${NATIVE_ASSETS_DIR}" + DESTINATION "${INSTALL_BUNDLE_LIB_DIR}" + COMPONENT Runtime) + +# Fully re-copy the assets directory on each build to avoid having stale files +# from a previous install. +set(FLUTTER_ASSET_DIR_NAME "flutter_assets") +install(CODE " + file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\") + " COMPONENT Runtime) +install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}" + DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime) + +# Install the AOT library on non-Debug builds only. +install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" + CONFIGURATIONS Profile;Release + COMPONENT Runtime) diff --git a/package/device_calendar_plus/example/windows/flutter/CMakeLists.txt b/package/device_calendar_plus/example/windows/flutter/CMakeLists.txt new file mode 100644 index 00000000..903f4899 --- /dev/null +++ b/package/device_calendar_plus/example/windows/flutter/CMakeLists.txt @@ -0,0 +1,109 @@ +# This file controls Flutter-level build steps. It should not be edited. +cmake_minimum_required(VERSION 3.14) + +set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral") + +# Configuration provided via flutter tool. +include(${EPHEMERAL_DIR}/generated_config.cmake) + +# TODO: Move the rest of this into files in ephemeral. See +# https://github.com/flutter/flutter/issues/57146. +set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper") + +# Set fallback configurations for older versions of the flutter tool. +if (NOT DEFINED FLUTTER_TARGET_PLATFORM) + set(FLUTTER_TARGET_PLATFORM "windows-x64") +endif() + +# === Flutter Library === +set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll") + +# Published to parent scope for install step. +set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE) +set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE) +set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE) +set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE) + +list(APPEND FLUTTER_LIBRARY_HEADERS + "flutter_export.h" + "flutter_windows.h" + "flutter_messenger.h" + "flutter_plugin_registrar.h" + "flutter_texture_registrar.h" +) +list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/") +add_library(flutter INTERFACE) +target_include_directories(flutter INTERFACE + "${EPHEMERAL_DIR}" +) +target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib") +add_dependencies(flutter flutter_assemble) + +# === Wrapper === +list(APPEND CPP_WRAPPER_SOURCES_CORE + "core_implementations.cc" + "standard_codec.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_PLUGIN + "plugin_registrar.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/") +list(APPEND CPP_WRAPPER_SOURCES_APP + "flutter_engine.cc" + "flutter_view_controller.cc" +) +list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/") + +# Wrapper sources needed for a plugin. +add_library(flutter_wrapper_plugin STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} +) +apply_standard_settings(flutter_wrapper_plugin) +set_target_properties(flutter_wrapper_plugin PROPERTIES + POSITION_INDEPENDENT_CODE ON) +set_target_properties(flutter_wrapper_plugin PROPERTIES + CXX_VISIBILITY_PRESET hidden) +target_link_libraries(flutter_wrapper_plugin PUBLIC flutter) +target_include_directories(flutter_wrapper_plugin PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_plugin flutter_assemble) + +# Wrapper sources needed for the runner. +add_library(flutter_wrapper_app STATIC + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_APP} +) +apply_standard_settings(flutter_wrapper_app) +target_link_libraries(flutter_wrapper_app PUBLIC flutter) +target_include_directories(flutter_wrapper_app PUBLIC + "${WRAPPER_ROOT}/include" +) +add_dependencies(flutter_wrapper_app flutter_assemble) + +# === Flutter tool backend === +# _phony_ is a non-existent file to force this command to run every time, +# since currently there's no way to get a full input/output list from the +# flutter tool. +set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_") +set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE) +add_custom_command( + OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} + ${PHONY_OUTPUT} + COMMAND ${CMAKE_COMMAND} -E env + ${FLUTTER_TOOL_ENVIRONMENT} + "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat" + ${FLUTTER_TARGET_PLATFORM} $ + VERBATIM +) +add_custom_target(flutter_assemble DEPENDS + "${FLUTTER_LIBRARY}" + ${FLUTTER_LIBRARY_HEADERS} + ${CPP_WRAPPER_SOURCES_CORE} + ${CPP_WRAPPER_SOURCES_PLUGIN} + ${CPP_WRAPPER_SOURCES_APP} +) diff --git a/package/device_calendar_plus/example/windows/flutter/generated_plugin_registrant.cc b/package/device_calendar_plus/example/windows/flutter/generated_plugin_registrant.cc new file mode 100644 index 00000000..8b6d4680 --- /dev/null +++ b/package/device_calendar_plus/example/windows/flutter/generated_plugin_registrant.cc @@ -0,0 +1,11 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#include "generated_plugin_registrant.h" + + +void RegisterPlugins(flutter::PluginRegistry* registry) { +} diff --git a/package/device_calendar_plus/example/windows/flutter/generated_plugin_registrant.h b/package/device_calendar_plus/example/windows/flutter/generated_plugin_registrant.h new file mode 100644 index 00000000..dc139d85 --- /dev/null +++ b/package/device_calendar_plus/example/windows/flutter/generated_plugin_registrant.h @@ -0,0 +1,15 @@ +// +// Generated file. Do not edit. +// + +// clang-format off + +#ifndef GENERATED_PLUGIN_REGISTRANT_ +#define GENERATED_PLUGIN_REGISTRANT_ + +#include + +// Registers Flutter plugins. +void RegisterPlugins(flutter::PluginRegistry* registry); + +#endif // GENERATED_PLUGIN_REGISTRANT_ diff --git a/package/device_calendar_plus/example/windows/flutter/generated_plugins.cmake b/package/device_calendar_plus/example/windows/flutter/generated_plugins.cmake new file mode 100644 index 00000000..b93c4c30 --- /dev/null +++ b/package/device_calendar_plus/example/windows/flutter/generated_plugins.cmake @@ -0,0 +1,23 @@ +# +# Generated file, do not edit. +# + +list(APPEND FLUTTER_PLUGIN_LIST +) + +list(APPEND FLUTTER_FFI_PLUGIN_LIST +) + +set(PLUGIN_BUNDLED_LIBRARIES) + +foreach(plugin ${FLUTTER_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin}) + target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin) + list(APPEND PLUGIN_BUNDLED_LIBRARIES $) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries}) +endforeach(plugin) + +foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST}) + add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin}) + list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries}) +endforeach(ffi_plugin) diff --git a/package/device_calendar_plus/example/windows/runner/CMakeLists.txt b/package/device_calendar_plus/example/windows/runner/CMakeLists.txt new file mode 100644 index 00000000..394917c0 --- /dev/null +++ b/package/device_calendar_plus/example/windows/runner/CMakeLists.txt @@ -0,0 +1,40 @@ +cmake_minimum_required(VERSION 3.14) +project(runner LANGUAGES CXX) + +# Define the application target. To change its name, change BINARY_NAME in the +# top-level CMakeLists.txt, not the value here, or `flutter run` will no longer +# work. +# +# Any new source files that you add to the application should be added here. +add_executable(${BINARY_NAME} WIN32 + "flutter_window.cpp" + "main.cpp" + "utils.cpp" + "win32_window.cpp" + "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc" + "Runner.rc" + "runner.exe.manifest" +) + +# Apply the standard set of build settings. This can be removed for applications +# that need different build settings. +apply_standard_settings(${BINARY_NAME}) + +# Add preprocessor definitions for the build version. +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION=\"${FLUTTER_VERSION}\"") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MAJOR=${FLUTTER_VERSION_MAJOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_MINOR=${FLUTTER_VERSION_MINOR}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_PATCH=${FLUTTER_VERSION_PATCH}") +target_compile_definitions(${BINARY_NAME} PRIVATE "FLUTTER_VERSION_BUILD=${FLUTTER_VERSION_BUILD}") + +# Disable Windows macros that collide with C++ standard library functions. +target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX") + +# Add dependency libraries and include directories. Add any application-specific +# dependencies here. +target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app) +target_link_libraries(${BINARY_NAME} PRIVATE "dwmapi.lib") +target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}") + +# Run the Flutter tool portions of the build. This must not be removed. +add_dependencies(${BINARY_NAME} flutter_assemble) diff --git a/package/device_calendar_plus/example/windows/runner/Runner.rc b/package/device_calendar_plus/example/windows/runner/Runner.rc new file mode 100644 index 00000000..c9b7af44 --- /dev/null +++ b/package/device_calendar_plus/example/windows/runner/Runner.rc @@ -0,0 +1,121 @@ +// Microsoft Visual C++ generated resource script. +// +#pragma code_page(65001) +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (United States) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE +BEGIN + "#include ""winres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_APP_ICON ICON "resources\\app_icon.ico" + + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +#if defined(FLUTTER_VERSION_MAJOR) && defined(FLUTTER_VERSION_MINOR) && defined(FLUTTER_VERSION_PATCH) && defined(FLUTTER_VERSION_BUILD) +#define VERSION_AS_NUMBER FLUTTER_VERSION_MAJOR,FLUTTER_VERSION_MINOR,FLUTTER_VERSION_PATCH,FLUTTER_VERSION_BUILD +#else +#define VERSION_AS_NUMBER 1,0,0,0 +#endif + +#if defined(FLUTTER_VERSION) +#define VERSION_AS_STRING FLUTTER_VERSION +#else +#define VERSION_AS_STRING "1.0.0" +#endif + +VS_VERSION_INFO VERSIONINFO + FILEVERSION VERSION_AS_NUMBER + PRODUCTVERSION VERSION_AS_NUMBER + FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG + FILEFLAGS VS_FF_DEBUG +#else + FILEFLAGS 0x0L +#endif + FILEOS VOS__WINDOWS32 + FILETYPE VFT_APP + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "to.bullet" "\0" + VALUE "FileDescription", "example" "\0" + VALUE "FileVersion", VERSION_AS_STRING "\0" + VALUE "InternalName", "example" "\0" + VALUE "LegalCopyright", "Copyright (C) 2025 to.bullet. All rights reserved." "\0" + VALUE "OriginalFilename", "example.exe" "\0" + VALUE "ProductName", "example" "\0" + VALUE "ProductVersion", VERSION_AS_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (United States) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED diff --git a/package/device_calendar_plus/example/windows/runner/flutter_window.cpp b/package/device_calendar_plus/example/windows/runner/flutter_window.cpp new file mode 100644 index 00000000..955ee303 --- /dev/null +++ b/package/device_calendar_plus/example/windows/runner/flutter_window.cpp @@ -0,0 +1,71 @@ +#include "flutter_window.h" + +#include + +#include "flutter/generated_plugin_registrant.h" + +FlutterWindow::FlutterWindow(const flutter::DartProject& project) + : project_(project) {} + +FlutterWindow::~FlutterWindow() {} + +bool FlutterWindow::OnCreate() { + if (!Win32Window::OnCreate()) { + return false; + } + + RECT frame = GetClientArea(); + + // The size here must match the window dimensions to avoid unnecessary surface + // creation / destruction in the startup path. + flutter_controller_ = std::make_unique( + frame.right - frame.left, frame.bottom - frame.top, project_); + // Ensure that basic setup of the controller was successful. + if (!flutter_controller_->engine() || !flutter_controller_->view()) { + return false; + } + RegisterPlugins(flutter_controller_->engine()); + SetChildContent(flutter_controller_->view()->GetNativeWindow()); + + flutter_controller_->engine()->SetNextFrameCallback([&]() { + this->Show(); + }); + + // Flutter can complete the first frame before the "show window" callback is + // registered. The following call ensures a frame is pending to ensure the + // window is shown. It is a no-op if the first frame hasn't completed yet. + flutter_controller_->ForceRedraw(); + + return true; +} + +void FlutterWindow::OnDestroy() { + if (flutter_controller_) { + flutter_controller_ = nullptr; + } + + Win32Window::OnDestroy(); +} + +LRESULT +FlutterWindow::MessageHandler(HWND hwnd, UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + // Give Flutter, including plugins, an opportunity to handle window messages. + if (flutter_controller_) { + std::optional result = + flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam, + lparam); + if (result) { + return *result; + } + } + + switch (message) { + case WM_FONTCHANGE: + flutter_controller_->engine()->ReloadSystemFonts(); + break; + } + + return Win32Window::MessageHandler(hwnd, message, wparam, lparam); +} diff --git a/package/device_calendar_plus/example/windows/runner/flutter_window.h b/package/device_calendar_plus/example/windows/runner/flutter_window.h new file mode 100644 index 00000000..6da0652f --- /dev/null +++ b/package/device_calendar_plus/example/windows/runner/flutter_window.h @@ -0,0 +1,33 @@ +#ifndef RUNNER_FLUTTER_WINDOW_H_ +#define RUNNER_FLUTTER_WINDOW_H_ + +#include +#include + +#include + +#include "win32_window.h" + +// A window that does nothing but host a Flutter view. +class FlutterWindow : public Win32Window { + public: + // Creates a new FlutterWindow hosting a Flutter view running |project|. + explicit FlutterWindow(const flutter::DartProject& project); + virtual ~FlutterWindow(); + + protected: + // Win32Window: + bool OnCreate() override; + void OnDestroy() override; + LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam, + LPARAM const lparam) noexcept override; + + private: + // The project to run. + flutter::DartProject project_; + + // The Flutter instance hosted by this window. + std::unique_ptr flutter_controller_; +}; + +#endif // RUNNER_FLUTTER_WINDOW_H_ diff --git a/package/device_calendar_plus/example/windows/runner/main.cpp b/package/device_calendar_plus/example/windows/runner/main.cpp new file mode 100644 index 00000000..a61bf80d --- /dev/null +++ b/package/device_calendar_plus/example/windows/runner/main.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +#include "flutter_window.h" +#include "utils.h" + +int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev, + _In_ wchar_t *command_line, _In_ int show_command) { + // Attach to console when present (e.g., 'flutter run') or create a + // new console when running with a debugger. + if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) { + CreateAndAttachConsole(); + } + + // Initialize COM, so that it is available for use in the library and/or + // plugins. + ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED); + + flutter::DartProject project(L"data"); + + std::vector command_line_arguments = + GetCommandLineArguments(); + + project.set_dart_entrypoint_arguments(std::move(command_line_arguments)); + + FlutterWindow window(project); + Win32Window::Point origin(10, 10); + Win32Window::Size size(1280, 720); + if (!window.Create(L"example", origin, size)) { + return EXIT_FAILURE; + } + window.SetQuitOnClose(true); + + ::MSG msg; + while (::GetMessage(&msg, nullptr, 0, 0)) { + ::TranslateMessage(&msg); + ::DispatchMessage(&msg); + } + + ::CoUninitialize(); + return EXIT_SUCCESS; +} diff --git a/package/device_calendar_plus/example/windows/runner/resource.h b/package/device_calendar_plus/example/windows/runner/resource.h new file mode 100644 index 00000000..66a65d1e --- /dev/null +++ b/package/device_calendar_plus/example/windows/runner/resource.h @@ -0,0 +1,16 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Runner.rc +// +#define IDI_APP_ICON 101 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 102 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/package/device_calendar_plus/example/windows/runner/resources/app_icon.ico b/package/device_calendar_plus/example/windows/runner/resources/app_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c04e20caf6370ebb9253ad831cc31de4a9c965f6 GIT binary patch literal 33772 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 literal 0 HcmV?d00001 diff --git a/package/device_calendar_plus/example/windows/runner/runner.exe.manifest b/package/device_calendar_plus/example/windows/runner/runner.exe.manifest new file mode 100644 index 00000000..153653e8 --- /dev/null +++ b/package/device_calendar_plus/example/windows/runner/runner.exe.manifest @@ -0,0 +1,14 @@ + + + + + PerMonitorV2 + + + + + + + + + diff --git a/package/device_calendar_plus/example/windows/runner/utils.cpp b/package/device_calendar_plus/example/windows/runner/utils.cpp new file mode 100644 index 00000000..3a0b4651 --- /dev/null +++ b/package/device_calendar_plus/example/windows/runner/utils.cpp @@ -0,0 +1,65 @@ +#include "utils.h" + +#include +#include +#include +#include + +#include + +void CreateAndAttachConsole() { + if (::AllocConsole()) { + FILE *unused; + if (freopen_s(&unused, "CONOUT$", "w", stdout)) { + _dup2(_fileno(stdout), 1); + } + if (freopen_s(&unused, "CONOUT$", "w", stderr)) { + _dup2(_fileno(stdout), 2); + } + std::ios::sync_with_stdio(); + FlutterDesktopResyncOutputStreams(); + } +} + +std::vector GetCommandLineArguments() { + // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use. + int argc; + wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc); + if (argv == nullptr) { + return std::vector(); + } + + std::vector command_line_arguments; + + // Skip the first argument as it's the binary name. + for (int i = 1; i < argc; i++) { + command_line_arguments.push_back(Utf8FromUtf16(argv[i])); + } + + ::LocalFree(argv); + + return command_line_arguments; +} + +std::string Utf8FromUtf16(const wchar_t* utf16_string) { + if (utf16_string == nullptr) { + return std::string(); + } + unsigned int target_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + -1, nullptr, 0, nullptr, nullptr) + -1; // remove the trailing null character + int input_length = (int)wcslen(utf16_string); + std::string utf8_string; + if (target_length == 0 || target_length > utf8_string.max_size()) { + return utf8_string; + } + utf8_string.resize(target_length); + int converted_length = ::WideCharToMultiByte( + CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, + input_length, utf8_string.data(), target_length, nullptr, nullptr); + if (converted_length == 0) { + return std::string(); + } + return utf8_string; +} diff --git a/package/device_calendar_plus/example/windows/runner/utils.h b/package/device_calendar_plus/example/windows/runner/utils.h new file mode 100644 index 00000000..3879d547 --- /dev/null +++ b/package/device_calendar_plus/example/windows/runner/utils.h @@ -0,0 +1,19 @@ +#ifndef RUNNER_UTILS_H_ +#define RUNNER_UTILS_H_ + +#include +#include + +// Creates a console for the process, and redirects stdout and stderr to +// it for both the runner and the Flutter library. +void CreateAndAttachConsole(); + +// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string +// encoded in UTF-8. Returns an empty std::string on failure. +std::string Utf8FromUtf16(const wchar_t* utf16_string); + +// Gets the command line arguments passed in as a std::vector, +// encoded in UTF-8. Returns an empty std::vector on failure. +std::vector GetCommandLineArguments(); + +#endif // RUNNER_UTILS_H_ diff --git a/package/device_calendar_plus/example/windows/runner/win32_window.cpp b/package/device_calendar_plus/example/windows/runner/win32_window.cpp new file mode 100644 index 00000000..60608d0f --- /dev/null +++ b/package/device_calendar_plus/example/windows/runner/win32_window.cpp @@ -0,0 +1,288 @@ +#include "win32_window.h" + +#include +#include + +#include "resource.h" + +namespace { + +/// Window attribute that enables dark mode window decorations. +/// +/// Redefined in case the developer's machine has a Windows SDK older than +/// version 10.0.22000.0. +/// See: https://docs.microsoft.com/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute +#ifndef DWMWA_USE_IMMERSIVE_DARK_MODE +#define DWMWA_USE_IMMERSIVE_DARK_MODE 20 +#endif + +constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW"; + +/// Registry key for app theme preference. +/// +/// A value of 0 indicates apps should use dark mode. A non-zero or missing +/// value indicates apps should use light mode. +constexpr const wchar_t kGetPreferredBrightnessRegKey[] = + L"Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"; +constexpr const wchar_t kGetPreferredBrightnessRegValue[] = L"AppsUseLightTheme"; + +// The number of Win32Window objects that currently exist. +static int g_active_window_count = 0; + +using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd); + +// Scale helper to convert logical scaler values to physical using passed in +// scale factor +int Scale(int source, double scale_factor) { + return static_cast(source * scale_factor); +} + +// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module. +// This API is only needed for PerMonitor V1 awareness mode. +void EnableFullDpiSupportIfAvailable(HWND hwnd) { + HMODULE user32_module = LoadLibraryA("User32.dll"); + if (!user32_module) { + return; + } + auto enable_non_client_dpi_scaling = + reinterpret_cast( + GetProcAddress(user32_module, "EnableNonClientDpiScaling")); + if (enable_non_client_dpi_scaling != nullptr) { + enable_non_client_dpi_scaling(hwnd); + } + FreeLibrary(user32_module); +} + +} // namespace + +// Manages the Win32Window's window class registration. +class WindowClassRegistrar { + public: + ~WindowClassRegistrar() = default; + + // Returns the singleton registrar instance. + static WindowClassRegistrar* GetInstance() { + if (!instance_) { + instance_ = new WindowClassRegistrar(); + } + return instance_; + } + + // Returns the name of the window class, registering the class if it hasn't + // previously been registered. + const wchar_t* GetWindowClass(); + + // Unregisters the window class. Should only be called if there are no + // instances of the window. + void UnregisterWindowClass(); + + private: + WindowClassRegistrar() = default; + + static WindowClassRegistrar* instance_; + + bool class_registered_ = false; +}; + +WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr; + +const wchar_t* WindowClassRegistrar::GetWindowClass() { + if (!class_registered_) { + WNDCLASS window_class{}; + window_class.hCursor = LoadCursor(nullptr, IDC_ARROW); + window_class.lpszClassName = kWindowClassName; + window_class.style = CS_HREDRAW | CS_VREDRAW; + window_class.cbClsExtra = 0; + window_class.cbWndExtra = 0; + window_class.hInstance = GetModuleHandle(nullptr); + window_class.hIcon = + LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON)); + window_class.hbrBackground = 0; + window_class.lpszMenuName = nullptr; + window_class.lpfnWndProc = Win32Window::WndProc; + RegisterClass(&window_class); + class_registered_ = true; + } + return kWindowClassName; +} + +void WindowClassRegistrar::UnregisterWindowClass() { + UnregisterClass(kWindowClassName, nullptr); + class_registered_ = false; +} + +Win32Window::Win32Window() { + ++g_active_window_count; +} + +Win32Window::~Win32Window() { + --g_active_window_count; + Destroy(); +} + +bool Win32Window::Create(const std::wstring& title, + const Point& origin, + const Size& size) { + Destroy(); + + const wchar_t* window_class = + WindowClassRegistrar::GetInstance()->GetWindowClass(); + + const POINT target_point = {static_cast(origin.x), + static_cast(origin.y)}; + HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST); + UINT dpi = FlutterDesktopGetDpiForMonitor(monitor); + double scale_factor = dpi / 96.0; + + HWND window = CreateWindow( + window_class, title.c_str(), WS_OVERLAPPEDWINDOW, + Scale(origin.x, scale_factor), Scale(origin.y, scale_factor), + Scale(size.width, scale_factor), Scale(size.height, scale_factor), + nullptr, nullptr, GetModuleHandle(nullptr), this); + + if (!window) { + return false; + } + + UpdateTheme(window); + + return OnCreate(); +} + +bool Win32Window::Show() { + return ShowWindow(window_handle_, SW_SHOWNORMAL); +} + +// static +LRESULT CALLBACK Win32Window::WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + if (message == WM_NCCREATE) { + auto window_struct = reinterpret_cast(lparam); + SetWindowLongPtr(window, GWLP_USERDATA, + reinterpret_cast(window_struct->lpCreateParams)); + + auto that = static_cast(window_struct->lpCreateParams); + EnableFullDpiSupportIfAvailable(window); + that->window_handle_ = window; + } else if (Win32Window* that = GetThisFromHandle(window)) { + return that->MessageHandler(window, message, wparam, lparam); + } + + return DefWindowProc(window, message, wparam, lparam); +} + +LRESULT +Win32Window::MessageHandler(HWND hwnd, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept { + switch (message) { + case WM_DESTROY: + window_handle_ = nullptr; + Destroy(); + if (quit_on_close_) { + PostQuitMessage(0); + } + return 0; + + case WM_DPICHANGED: { + auto newRectSize = reinterpret_cast(lparam); + LONG newWidth = newRectSize->right - newRectSize->left; + LONG newHeight = newRectSize->bottom - newRectSize->top; + + SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth, + newHeight, SWP_NOZORDER | SWP_NOACTIVATE); + + return 0; + } + case WM_SIZE: { + RECT rect = GetClientArea(); + if (child_content_ != nullptr) { + // Size and position the child window. + MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left, + rect.bottom - rect.top, TRUE); + } + return 0; + } + + case WM_ACTIVATE: + if (child_content_ != nullptr) { + SetFocus(child_content_); + } + return 0; + + case WM_DWMCOLORIZATIONCOLORCHANGED: + UpdateTheme(hwnd); + return 0; + } + + return DefWindowProc(window_handle_, message, wparam, lparam); +} + +void Win32Window::Destroy() { + OnDestroy(); + + if (window_handle_) { + DestroyWindow(window_handle_); + window_handle_ = nullptr; + } + if (g_active_window_count == 0) { + WindowClassRegistrar::GetInstance()->UnregisterWindowClass(); + } +} + +Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept { + return reinterpret_cast( + GetWindowLongPtr(window, GWLP_USERDATA)); +} + +void Win32Window::SetChildContent(HWND content) { + child_content_ = content; + SetParent(content, window_handle_); + RECT frame = GetClientArea(); + + MoveWindow(content, frame.left, frame.top, frame.right - frame.left, + frame.bottom - frame.top, true); + + SetFocus(child_content_); +} + +RECT Win32Window::GetClientArea() { + RECT frame; + GetClientRect(window_handle_, &frame); + return frame; +} + +HWND Win32Window::GetHandle() { + return window_handle_; +} + +void Win32Window::SetQuitOnClose(bool quit_on_close) { + quit_on_close_ = quit_on_close; +} + +bool Win32Window::OnCreate() { + // No-op; provided for subclasses. + return true; +} + +void Win32Window::OnDestroy() { + // No-op; provided for subclasses. +} + +void Win32Window::UpdateTheme(HWND const window) { + DWORD light_mode; + DWORD light_mode_size = sizeof(light_mode); + LSTATUS result = RegGetValue(HKEY_CURRENT_USER, kGetPreferredBrightnessRegKey, + kGetPreferredBrightnessRegValue, + RRF_RT_REG_DWORD, nullptr, &light_mode, + &light_mode_size); + + if (result == ERROR_SUCCESS) { + BOOL enable_dark_mode = light_mode == 0; + DwmSetWindowAttribute(window, DWMWA_USE_IMMERSIVE_DARK_MODE, + &enable_dark_mode, sizeof(enable_dark_mode)); + } +} diff --git a/package/device_calendar_plus/example/windows/runner/win32_window.h b/package/device_calendar_plus/example/windows/runner/win32_window.h new file mode 100644 index 00000000..e901dde6 --- /dev/null +++ b/package/device_calendar_plus/example/windows/runner/win32_window.h @@ -0,0 +1,102 @@ +#ifndef RUNNER_WIN32_WINDOW_H_ +#define RUNNER_WIN32_WINDOW_H_ + +#include + +#include +#include +#include + +// A class abstraction for a high DPI-aware Win32 Window. Intended to be +// inherited from by classes that wish to specialize with custom +// rendering and input handling +class Win32Window { + public: + struct Point { + unsigned int x; + unsigned int y; + Point(unsigned int x, unsigned int y) : x(x), y(y) {} + }; + + struct Size { + unsigned int width; + unsigned int height; + Size(unsigned int width, unsigned int height) + : width(width), height(height) {} + }; + + Win32Window(); + virtual ~Win32Window(); + + // Creates a win32 window with |title| that is positioned and sized using + // |origin| and |size|. New windows are created on the default monitor. Window + // sizes are specified to the OS in physical pixels, hence to ensure a + // consistent size this function will scale the inputted width and height as + // as appropriate for the default monitor. The window is invisible until + // |Show| is called. Returns true if the window was created successfully. + bool Create(const std::wstring& title, const Point& origin, const Size& size); + + // Show the current window. Returns true if the window was successfully shown. + bool Show(); + + // Release OS resources associated with window. + void Destroy(); + + // Inserts |content| into the window tree. + void SetChildContent(HWND content); + + // Returns the backing Window handle to enable clients to set icon and other + // window properties. Returns nullptr if the window has been destroyed. + HWND GetHandle(); + + // If true, closing this window will quit the application. + void SetQuitOnClose(bool quit_on_close); + + // Return a RECT representing the bounds of the current client area. + RECT GetClientArea(); + + protected: + // Processes and route salient window messages for mouse handling, + // size change and DPI. Delegates handling of these to member overloads that + // inheriting classes can handle. + virtual LRESULT MessageHandler(HWND window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Called when CreateAndShow is called, allowing subclass window-related + // setup. Subclasses should return false if setup fails. + virtual bool OnCreate(); + + // Called when Destroy is called. + virtual void OnDestroy(); + + private: + friend class WindowClassRegistrar; + + // OS callback called by message pump. Handles the WM_NCCREATE message which + // is passed when the non-client area is being created and enables automatic + // non-client DPI scaling so that the non-client area automatically + // responds to changes in DPI. All other messages are handled by + // MessageHandler. + static LRESULT CALLBACK WndProc(HWND const window, + UINT const message, + WPARAM const wparam, + LPARAM const lparam) noexcept; + + // Retrieves a class instance pointer for |window| + static Win32Window* GetThisFromHandle(HWND const window) noexcept; + + // Update the window frame's theme to match the system theme. + static void UpdateTheme(HWND const window); + + bool quit_on_close_ = false; + + // window handle for top level window. + HWND window_handle_ = nullptr; + + // window handle for hosted content. + HWND child_content_ = nullptr; +}; + +#endif // RUNNER_WIN32_WINDOW_H_ diff --git a/package/device_calendar_plus/lib/device_calendar_plus.dart b/package/device_calendar_plus/lib/device_calendar_plus.dart new file mode 100644 index 00000000..4c5bfc87 --- /dev/null +++ b/package/device_calendar_plus/lib/device_calendar_plus.dart @@ -0,0 +1,767 @@ +import 'package:device_calendar_plus_platform_interface/device_calendar_plus_platform_interface.dart'; +import 'package:flutter/services.dart'; + +import 'src/calendar.dart'; +import 'src/calendar_permission_status.dart'; +import 'src/event.dart'; +import 'src/event_availability.dart'; +import 'src/platform_exception_converter.dart'; + +export 'src/calendar.dart'; +export 'src/calendar_permission_status.dart'; +export 'src/device_calendar_error.dart'; +export 'src/event.dart'; +export 'src/event_availability.dart'; +export 'src/event_status.dart'; +export 'src/platform_exception_codes.dart'; + +/// Main API for accessing device calendar functionality. +class DeviceCalendar { + DeviceCalendar._internal(); + + static final DeviceCalendar instance = DeviceCalendar._internal(); + + factory DeviceCalendar() => instance; + + /// Requests calendar permissions from the user. + /// + /// On first call, this will show the system permission dialog. + /// On subsequent calls, it returns the current permission status. + /// + /// Returns a [CalendarPermissionStatus] indicating the result + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// final status = await plugin.requestPermissions(); + /// if (status == CalendarPermissionStatus.granted) { + /// // Access calendars + /// } else if (status == CalendarPermissionStatus.denied) { + /// // Show "Enable in Settings" message + /// } else if (status == CalendarPermissionStatus.restricted) { + /// // Show "Contact administrator" message + /// } + /// ``` + Future requestPermissions() async { + return _handlePermissionRequest( + () => DeviceCalendarPlusPlatform.instance.requestPermissions(), + ); + } + + /// Checks the current calendar permission status WITHOUT requesting permissions. + /// + /// Unlike [requestPermissions], this method will NOT prompt the user for + /// permissions if they haven't been granted yet. It only checks the current status. + /// + /// Use this method if you want to check permissions before deciding whether + /// to call [requestPermissions], or when you want to verify permissions without + /// triggering the system permission dialog. + /// + /// Returns the current [CalendarPermissionStatus]. + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// final status = await plugin.hasPermissions(); + /// if (status == CalendarPermissionStatus.granted) { + /// // Permissions already granted + /// final calendars = await plugin.listCalendars(); + /// } else if (status == CalendarPermissionStatus.notDetermined) { + /// // User hasn't been asked yet + /// final newStatus = await plugin.requestPermissions(); + /// } + /// ``` + Future hasPermissions() async { + return _handlePermissionRequest( + () => DeviceCalendarPlusPlatform.instance.hasPermissions(), + ); + } + + /// Opens the app's settings page in the system settings. + /// + /// This is useful when permissions have been denied and you want to guide + /// the user to manually enable calendar permissions in the system settings. + /// + /// On iOS, this opens the app's specific settings page directly. + /// On Android, this opens the app info page where users can navigate to permissions. + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// final status = await plugin.hasPermissions(); + /// if (status == CalendarPermissionStatus.denied) { + /// // Show dialog explaining why permission is needed + /// showDialog( + /// context: context, + /// builder: (context) => AlertDialog( + /// title: Text('Calendar Permission Required'), + /// content: Text('Please enable calendar access in settings.'), + /// actions: [ + /// TextButton( + /// onPressed: () { + /// Navigator.pop(context); + /// plugin.openAppSettings(); + /// }, + /// child: Text('Open Settings'), + /// ), + /// ], + /// ), + /// ); + /// } + /// ``` + Future openAppSettings() async { + try { + await DeviceCalendarPlusPlatform.instance.openAppSettings(); + } on PlatformException catch (e, stackTrace) { + final convertedException = + PlatformExceptionConverter.convertPlatformException(e); + if (convertedException != null) { + Error.throwWithStackTrace(convertedException, stackTrace); + } + rethrow; + } + } + + /// Helper method to handle permission requests and convert status values + Future _handlePermissionRequest( + Future Function() permissionCall, + ) async { + try { + final String? statusValue = await permissionCall(); + return _convertStatusValue(statusValue); + } on PlatformException catch (e, stackTrace) { + final convertedException = + PlatformExceptionConverter.convertPlatformException(e); + if (convertedException != null) { + Error.throwWithStackTrace(convertedException, stackTrace); + } + rethrow; + } + } + + /// Converts a status value string to CalendarPermissionStatus + CalendarPermissionStatus _convertStatusValue(String? statusValue) { + // Default to denied if status is null or unrecognized + if (statusValue == null) { + return CalendarPermissionStatus.denied; + } + + // Parse the enum value by name + try { + return CalendarPermissionStatus.values.firstWhere( + (e) => e.name == statusValue, + orElse: () => CalendarPermissionStatus.denied, + ); + } catch (_) { + return CalendarPermissionStatus.denied; + } + } + + /// Lists all calendars available on the device. + /// + /// Returns a list of [Calendar] objects representing each calendar. + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// final calendars = await plugin.listCalendars(); + /// for (final calendar in calendars) { + /// print('${calendar.name} (${calendar.id})'); + /// print(' Read-only: ${calendar.readOnly}'); + /// print(' Primary: ${calendar.isPrimary}'); + /// print(' Color: ${calendar.colorHex}'); + /// } + /// ``` + Future> listCalendars() async { + try { + final List> rawCalendars = + await DeviceCalendarPlusPlatform.instance.listCalendars(); + return rawCalendars.map((map) => Calendar.fromMap(map)).toList(); + } on PlatformException catch (e, stackTrace) { + final convertedException = + PlatformExceptionConverter.convertPlatformException(e); + if (convertedException != null) { + Error.throwWithStackTrace(convertedException, stackTrace); + } + rethrow; + } + } + + /// Creates a new calendar on the device. + /// + /// [name] is the display name for the calendar (required). + /// [colorHex] is an optional color in #RRGGBB format (e.g., "#FF5733"). + /// + /// Returns the ID of the newly created calendar. + /// + /// The calendar is created in the device's local storage. + /// Requires calendar write permissions - call [requestPermissions] first. + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// + /// // Create a calendar with just a name + /// final calendarId = await plugin.createCalendar(name: 'My Calendar'); + /// + /// // Create a calendar with a name and color + /// final coloredCalendarId = await plugin.createCalendar( + /// name: 'Work Calendar', + /// colorHex: '#FF5733', + /// ); + /// ``` + Future createCalendar({ + required String name, + String? colorHex, + }) async { + if (name.trim().isEmpty) { + throw ArgumentError.value( + name, + 'name', + 'Calendar name cannot be empty', + ); + } + + try { + final String calendarId = await DeviceCalendarPlusPlatform.instance + .createCalendar(name, colorHex); + return calendarId; + } on PlatformException catch (e, stackTrace) { + final convertedException = + PlatformExceptionConverter.convertPlatformException(e); + if (convertedException != null) { + Error.throwWithStackTrace(convertedException, stackTrace); + } + rethrow; + } + } + + /// Updates an existing calendar on the device. + /// + /// [calendarId] is the ID of the calendar to update. + /// [name] is the new display name for the calendar (optional). + /// [colorHex] is the new color in #RRGGBB format (optional, e.g., "#FF5733"). + /// + /// At least one of [name] or [colorHex] must be provided. + /// Requires calendar write permissions - call [requestPermissions] first. + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// + /// // Update just the name + /// await plugin.updateCalendar(calendarId, name: 'New Name'); + /// + /// // Update just the color + /// await plugin.updateCalendar(calendarId, colorHex: '#FF5733'); + /// + /// // Update both name and color + /// await plugin.updateCalendar( + /// calendarId, + /// name: 'New Name', + /// colorHex: '#FF5733', + /// ); + /// ``` + Future updateCalendar( + String calendarId, { + String? name, + String? colorHex, + }) async { + // Validate that at least one parameter is provided + if (name == null && colorHex == null) { + throw ArgumentError( + 'At least one of name or colorHex must be provided', + ); + } + + // Validate name if provided + if (name != null && name.trim().isEmpty) { + throw ArgumentError.value( + name, + 'name', + 'Calendar name cannot be empty', + ); + } + + try { + await DeviceCalendarPlusPlatform.instance + .updateCalendar(calendarId, name, colorHex); + } on PlatformException catch (e, stackTrace) { + final convertedException = + PlatformExceptionConverter.convertPlatformException(e); + if (convertedException != null) { + Error.throwWithStackTrace(convertedException, stackTrace); + } + rethrow; + } + } + + /// Deletes a calendar from the device. + /// + /// [calendarId] is the ID of the calendar to delete. + /// + /// This will also delete all events within the calendar. + /// Requires calendar write permissions - call [requestPermissions] first. + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// + /// // Delete a calendar by ID + /// await plugin.deleteCalendar(calendarId); + /// ``` + Future deleteCalendar(String calendarId) async { + try { + await DeviceCalendarPlusPlatform.instance.deleteCalendar(calendarId); + } on PlatformException catch (e, stackTrace) { + final convertedException = + PlatformExceptionConverter.convertPlatformException(e); + if (convertedException != null) { + Error.throwWithStackTrace(convertedException, stackTrace); + } + rethrow; + } + } + + /// Lists events within the specified date range. + /// + /// [startDate] and [endDate] are required parameters that define the time + /// window for fetching events. + /// + /// **Important iOS Limitation**: iOS automatically limits event queries to a + /// maximum span of 4 years. If you specify a range exceeding 4 years, iOS + /// will truncate it to the first 4 years automatically. + /// + /// [calendarIds] is an optional parameter to filter events to specific + /// calendars. If null or empty, events from all calendars are returned. + /// + /// Recurring events are automatically expanded into individual instances + /// within the date range. Each instance has: + /// - The same [Event.eventId] + /// - Different [Event.startDate] and [Event.endDate] + /// + /// This combination uniquely identifies each occurrence of a recurring event. + /// + /// Returns a list of [Event] objects sorted by start date. + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// final now = DateTime.now(); + /// final nextMonth = now.add(Duration(days: 30)); + /// + /// // Get all events in the next month + /// final events = await plugin.listEvents( + /// now, + /// nextMonth, + /// ); + /// + /// // Get events from specific calendars only + /// final workEvents = await plugin.listEvents( + /// now, + /// nextMonth, + /// calendarIds: ['work-calendar-id', 'project-calendar-id'], + /// ); + /// + /// for (final event in events) { + /// print('${event.title} at ${event.startDate}'); + /// } + /// ``` + Future> listEvents( + DateTime startDate, + DateTime endDate, { + List? calendarIds, + }) async { + try { + final List> rawEvents = + await DeviceCalendarPlusPlatform.instance.listEvents( + startDate, + endDate, + calendarIds, + ); + return rawEvents.map((map) => Event.fromMap(map)).toList(); + } on PlatformException catch (e, stackTrace) { + final convertedException = + PlatformExceptionConverter.convertPlatformException(e); + if (convertedException != null) { + Error.throwWithStackTrace(convertedException, stackTrace); + } + rethrow; + } + } + + /// Retrieves a single event by ID. + /// + /// The [id] can be either an event ID or an instance ID: + /// - **Event ID**: Returns the master event definition (for recurring events) + /// - **Instance ID**: Returns a specific occurrence (for recurring events) + /// + /// + /// Returns null if no matching event is found. + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// // Get specific instance of a recurring event + /// final instance = await plugin.getEvent(event.instanceId); + /// + /// // Get master event definition for a recurring event + /// final masterEvent = await plugin.getEvent(event.eventId); + /// ``` + Future getEvent(String id) async { + try { + final Map? rawEvent = + await DeviceCalendarPlusPlatform.instance.getEvent(id); + + if (rawEvent == null) { + return null; + } + + return Event.fromMap(rawEvent); + } on PlatformException catch (e, stackTrace) { + final convertedException = + PlatformExceptionConverter.convertPlatformException(e); + if (convertedException != null) { + Error.throwWithStackTrace(convertedException, stackTrace); + } + rethrow; + } + } + + /// Shows a calendar event in a modal dialog. + /// + /// The [id] can be either an event ID or an instance ID: + /// - **Event ID**: Shows the master event definition (for recurring events) + /// - **Instance ID**: Shows a specific occurrence (for recurring events) + /// + /// + /// **Platform Differences:** + /// - **iOS**: Presents the event in a native modal using EventKit's + /// `EKEventViewController`. The user can view and edit the event without + /// leaving your app. Requires your app to be in the foreground. + /// - **Android**: Opens the event using an Intent with `ACTION_VIEW`. + /// The system handles the presentation based on device and app configuration. + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// // Show specific instance of a recurring event + /// await plugin.showEventModal(event.instanceId); + /// + /// // Show master event definition + /// await plugin.showEventModal(event.eventId); + /// ``` + Future showEventModal(String id) async { + try { + await DeviceCalendarPlusPlatform.instance.showEventModal(id); + } on PlatformException catch (e, stackTrace) { + final convertedException = + PlatformExceptionConverter.convertPlatformException(e); + if (convertedException != null) { + Error.throwWithStackTrace(convertedException, stackTrace); + } + rethrow; + } + } + + /// Creates a new event in the specified calendar. + /// + /// [calendarId] is the ID of the calendar to create the event in (required). + /// [title] is the event title (required). + /// [startDate] is the start date/time (required). + /// [endDate] is the end date/time (required). + /// [isAllDay] indicates if this is an all-day event (default: false). + /// [description] is optional event notes/description. + /// [location] is optional event location. + /// [timeZone] is optional timezone identifier (null for all-day events). + /// The platform will validate the timezone string. + /// [url] is optional event URL (supported on both platforms). + /// [availability] is the availability status (default: EventAvailability.busy). + /// + /// Returns the system-generated event ID. + /// Requires calendar write permissions - call [requestPermissions] first. + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// + /// // Create a basic event + /// final eventId = await plugin.createEvent( + /// calendarId: 'cal-123', + /// title: 'Team Meeting', + /// startDate: DateTime.now(), + /// endDate: DateTime.now().add(Duration(hours: 1)), + /// ); + /// + /// // Create an event with all options + /// final detailedEventId = await plugin.createEvent( + /// calendarId: 'cal-123', + /// title: 'Project Review', + /// startDate: DateTime(2024, 3, 15, 14, 0), + /// endDate: DateTime(2024, 3, 15, 15, 0), + /// description: 'Q1 project review meeting', + /// location: 'Conference Room A', + /// timeZone: 'America/New_York', + /// availability: EventAvailability.busy, + /// ); + /// ``` + Future createEvent({ + required String calendarId, + required String title, + required DateTime startDate, + required DateTime endDate, + int? reminderMinutes, + bool isAllDay = false, + String? description, + String? location, + String? timeZone, + EventAvailability availability = EventAvailability.busy, + }) async { + print("createEvent: the reminder minutes are $reminderMinutes"); + + // Validate required fields + if (calendarId.trim().isEmpty) { + throw ArgumentError.value( + calendarId, + 'calendarId', + 'Calendar ID cannot be empty', + ); + } + + if (title.trim().isEmpty) { + throw ArgumentError.value( + title, + 'title', + 'Event title cannot be empty', + ); + } + + if (endDate.isBefore(startDate)) { + throw ArgumentError( + 'End date must be after start date', + ); + } + + // Normalize dates for all-day events + // All-day events should use midnight (00:00:00) and ignore time components + DateTime normalizedStartDate = startDate; + DateTime normalizedEndDate = endDate; + + if (isAllDay) { + normalizedStartDate = DateTime( + startDate.year, + startDate.month, + startDate.day, + ); + normalizedEndDate = DateTime( + endDate.year, + endDate.month, + endDate.day, + ); + } + + try { + final String eventId = + await DeviceCalendarPlusPlatform.instance.createEvent( + calendarId, + title, + normalizedStartDate, + normalizedEndDate, + isAllDay, + reminderMinutes, + description, + location, + timeZone, + availability.name, + ); + return eventId; + } on PlatformException catch (e, stackTrace) { + final convertedException = + PlatformExceptionConverter.convertPlatformException(e); + if (convertedException != null) { + Error.throwWithStackTrace(convertedException, stackTrace); + } + rethrow; + } + } + + /// Deletes an event from the device. + /// + /// [eventId] identifies the event to delete. You can pass either: + /// - An event ID (e.g., from `event.eventId`) + /// - An instance ID (e.g., from `event.instanceId`) - the event ID will be extracted by the platform + /// + /// **For recurring events**: This will delete the ENTIRE series (all past + /// and future occurrences). Single-instance deletion is not supported to + /// maintain consistent behavior across platforms. + /// + /// For non-recurring events, this deletes the single event. + /// Requires calendar write permissions - call [requestPermissions] first. + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// + /// // Delete using event ID + /// await plugin.deleteEvent(eventId: event.eventId); + /// + /// // Delete using instance ID (event ID will be extracted by platform) + /// await plugin.deleteEvent(eventId: event.instanceId); + /// ``` + Future deleteEvent({required String eventId}) async { + if (eventId.trim().isEmpty) { + throw ArgumentError.value( + eventId, + 'eventId', + 'Event ID cannot be empty', + ); + } + + try { + await DeviceCalendarPlusPlatform.instance.deleteEvent(eventId); + } on PlatformException catch (e, stackTrace) { + final convertedException = + PlatformExceptionConverter.convertPlatformException(e); + if (convertedException != null) { + Error.throwWithStackTrace(convertedException, stackTrace); + } + rethrow; + } + } + + /// Updates an existing event on the device. + /// + /// [eventId] identifies the event to update (required). You can pass either: + /// - An event ID (e.g., from `event.eventId`) + /// - An instance ID (e.g., from `event.instanceId`) - the event ID will be extracted by the platform + /// + /// **For recurring events**: This will update the ENTIRE series (all past + /// and future occurrences). Single-instance updates are not supported to + /// maintain consistent behavior across platforms. + /// + /// All field parameters are optional - only provided fields will be updated: + /// - [title] - new event title + /// - [startDate] - new start date/time + /// - [endDate] - new end date/time + /// - [description] - new event description + /// - [location] - new event location + /// - [isAllDay] - change between all-day and timed event + /// - Changing timed → all-day: Time components are stripped to midnight + /// - Changing all-day → timed: Midnight time is used + /// - [timeZone] - new timezone identifier + /// - Note: This reinterprets the local time, not preserving the instant + /// - Example: "3:00 PM EST" → "3:00 PM PST" (different instant in time) + /// + /// At least one field must be provided. + /// Requires calendar write permissions - call [requestPermissions] first. + /// + /// Example: + /// ```dart + /// final plugin = DeviceCalendar.instance; + /// + /// // Update event title using event ID (entire series for recurring events) + /// await plugin.updateEvent( + /// eventId: event.eventId, + /// title: 'Updated Meeting Title', + /// ); + /// + /// // Update using instance ID (event ID will be extracted by platform) + /// await plugin.updateEvent( + /// eventId: event.instanceId, + /// isAllDay: true, + /// ); + /// + /// // Update multiple fields + /// await plugin.updateEvent( + /// eventId: event.eventId, + /// title: 'Team Sync', + /// startDate: DateTime(2024, 3, 20, 10, 0), + /// endDate: DateTime(2024, 3, 20, 11, 0), + /// location: 'Conference Room B', + /// ); + /// ``` + Future updateEvent({ + required String eventId, + String? title, + DateTime? startDate, + DateTime? endDate, + String? description, + String? location, + bool? isAllDay, + String? timeZone, + }) async { + // Validate eventId + if (eventId.trim().isEmpty) { + throw ArgumentError.value( + eventId, + 'eventId', + 'Event ID cannot be empty', + ); + } + + // Validate at least one field is provided + if (title == null && + startDate == null && + endDate == null && + description == null && + location == null && + isAllDay == null && + timeZone == null) { + throw ArgumentError( + 'At least one field must be provided to update', + ); + } + + // Validate dates if both are provided + if (startDate != null && endDate != null && endDate.isBefore(startDate)) { + throw ArgumentError( + 'End date must be after start date', + ); + } + + // Normalize dates for all-day events + // We need to check if the event is becoming all-day or if we're updating dates on an existing all-day event + // Since we don't have access to the existing event here, we'll let the platform handle it + // But if isAllDay is being set to true, we should normalize the dates + DateTime? normalizedStartDate = startDate; + DateTime? normalizedEndDate = endDate; + + if (isAllDay == true) { + // Event is becoming all-day, normalize dates to midnight + if (startDate != null) { + normalizedStartDate = DateTime( + startDate.year, + startDate.month, + startDate.day, + ); + } + if (endDate != null) { + normalizedEndDate = DateTime( + endDate.year, + endDate.month, + endDate.day, + ); + } + } + + try { + await DeviceCalendarPlusPlatform.instance.updateEvent( + eventId, + title: title, + startDate: normalizedStartDate, + endDate: normalizedEndDate, + description: description, + location: location, + isAllDay: isAllDay, + timeZone: timeZone, + ); + } on PlatformException catch (e, stackTrace) { + final convertedException = + PlatformExceptionConverter.convertPlatformException(e); + if (convertedException != null) { + Error.throwWithStackTrace(convertedException, stackTrace); + } + rethrow; + } + } +} diff --git a/package/device_calendar_plus/lib/src/calendar.dart b/package/device_calendar_plus/lib/src/calendar.dart new file mode 100644 index 00000000..064bc6a2 --- /dev/null +++ b/package/device_calendar_plus/lib/src/calendar.dart @@ -0,0 +1,127 @@ +/// Represents a user's calendar +class Calendar { + /// Identifier returned by the platform (Android `Calendars._ID`, iOS `EKCalendar.calendarIdentifier`). + final String id; + + /// User-facing label shown in native calendar pickers. + final String name; + + /// Calendar color as a hex string in `#RRGGBB` format, if provided by the OS. + final String? colorHex; + + /// Whether edits are disallowed (subscribed/shared calendars, server-managed feeds, etc.). + final bool readOnly; + + /// Account name or email that owns the calendar, when exposed by the platform. + final String? accountName; + + /// Platform-specific account type (for example `com.google`, `CalDAV`, or `local` on Android). + final String? accountType; + + /// Indicates that the calendar is the default destination for new events on that account/device. + /// + /// Android maps this to `Calendars.IS_PRIMARY`; iOS matches `eventStore.defaultCalendarForNewEvents`. + final bool isPrimary; + + /// Marks calendars hidden in the Android Calendar UI. iOS always reports `false`. + final bool hidden; + + /// Creates an immutable calendar description. + const Calendar({ + required this.id, + required this.name, + this.colorHex, + required this.readOnly, + this.accountName, + this.accountType, + this.isPrimary = false, + this.hidden = false, + }); + + /// Builds a calendar object from a platform channel payload. + factory Calendar.fromMap(Map map) { + return Calendar( + id: map['id'] as String, + name: map['name'] as String, + colorHex: map['colorHex'] as String?, + readOnly: map['readOnly'] as bool? ?? false, + accountName: map['accountName'] as String?, + accountType: map['accountType'] as String?, + isPrimary: map['isPrimary'] as bool? ?? false, + hidden: map['hidden'] as bool? ?? false, + ); + } + + /// Serializes the calendar back into a map for platform channel use. + Map toMap() { + return { + 'id': id, + 'name': name, + 'colorHex': colorHex, + 'readOnly': readOnly, + 'accountName': accountName, + 'accountType': accountType, + 'isPrimary': isPrimary, + 'hidden': hidden, + }; + } + + /// Returns a copy with selectively overridden fields. + Calendar copyWith({ + String? id, + String? name, + String? colorHex, + bool? readOnly, + String? accountName, + String? accountType, + bool? isPrimary, + bool? hidden, + }) { + return Calendar( + id: id ?? this.id, + name: name ?? this.name, + colorHex: colorHex ?? this.colorHex, + readOnly: readOnly ?? this.readOnly, + accountName: accountName ?? this.accountName, + accountType: accountType ?? this.accountType, + isPrimary: isPrimary ?? this.isPrimary, + hidden: hidden ?? this.hidden, + ); + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is Calendar && + other.id == id && + other.name == name && + other.colorHex == colorHex && + other.readOnly == readOnly && + other.accountName == accountName && + other.accountType == accountType && + other.isPrimary == isPrimary && + other.hidden == hidden; + } + + @override + int get hashCode { + return Object.hash( + id, + name, + colorHex, + readOnly, + accountName, + accountType, + isPrimary, + hidden, + ); + } + + @override + String toString() { + return 'DeviceCalendar(id: $id, name: $name, colorHex: $colorHex, ' + 'readOnly: $readOnly, accountName: $accountName, accountType: $accountType, ' + 'isPrimary: $isPrimary, hidden: $hidden)'; + } +} diff --git a/package/device_calendar_plus/lib/src/calendar_permission_status.dart b/package/device_calendar_plus/lib/src/calendar_permission_status.dart new file mode 100644 index 00000000..b0f4733d --- /dev/null +++ b/package/device_calendar_plus/lib/src/calendar_permission_status.dart @@ -0,0 +1,32 @@ +/// Represents the current status of calendar permissions. +enum CalendarPermissionStatus { + /// Full read and write access to calendars. + granted, + + /// Permission has been denied by the user. + denied, + + /// Write-only access to calendars (iOS 17+ only). + /// + /// On iOS 17 and later, apps can request write-only access to add events + /// without being able to read existing calendar data. + /// + /// This status is never returned on Android. + writeOnly, + + /// Access is restricted by device policies (iOS only). + /// + /// This typically occurs when parental controls, Mobile Device Management (MDM), + /// or Screen Time restrictions prevent calendar access. The user cannot grant + /// permission even if they want to. + /// + /// This status is never returned on Android. + restricted, + + /// Permission has not been requested yet (iOS only). + /// + /// This is the initial state before the app has requested calendar permissions. + /// + /// This status is never returned on Android. + notDetermined, +} diff --git a/package/device_calendar_plus/lib/src/device_calendar_error.dart b/package/device_calendar_plus/lib/src/device_calendar_error.dart new file mode 100644 index 00000000..2951d5e5 --- /dev/null +++ b/package/device_calendar_plus/lib/src/device_calendar_error.dart @@ -0,0 +1,62 @@ +/// Error codes for device calendar operations. +enum DeviceCalendarError { + // Permission-related errors + + /// Calendar permissions are not declared in the app's manifest. + /// + /// On Android: Missing READ_CALENDAR or WRITE_CALENDAR in AndroidManifest.xml + /// On iOS: Missing NSCalendarsUsageDescription in Info.plist + permissionsNotDeclared, + + /// Calendar permission was denied by the user. + permissionDenied, + + // Input validation errors + + /// Invalid arguments were passed to a method. + invalidArguments, + + // Resource errors + + /// Requested calendar or event not found. + notFound, + + /// Calendar is read-only and cannot be modified. + readOnly, + + // Operation errors + + /// Calendar operation failed. + operationFailed, + + // System/availability errors + + /// Calendar system is not available. + calendarUnavailable, + + // Generic errors + + /// An unknown error occurred. + unknown, +} + +/// Exception thrown by device calendar operations. +class DeviceCalendarException implements Exception { + /// The error code describing what went wrong. + final DeviceCalendarError errorCode; + + /// A human-readable error message. + final String message; + + /// Optional additional details about the error. + final dynamic details; + + const DeviceCalendarException({ + required this.errorCode, + required this.message, + this.details, + }); + + @override + String toString() => 'DeviceCalendarException($errorCode): $message'; +} diff --git a/package/device_calendar_plus/lib/src/event.dart b/package/device_calendar_plus/lib/src/event.dart new file mode 100644 index 00000000..3ad4a77f --- /dev/null +++ b/package/device_calendar_plus/lib/src/event.dart @@ -0,0 +1,182 @@ +import 'event_availability.dart'; +import 'event_status.dart'; + +/// Represents a calendar event. +class Event { + /// Unique system identifier for this event. + /// For recurring events, all instances share the same eventId. + final String eventId; + + /// Instance identifier that uniquely identifies this specific event instance. + /// + /// **UNSTABLE ID:** This is a plugin-generated identifier, not a system ID. + /// It is derived from the [eventId] and the event's start date. + /// + /// Use this with [DeviceCalendar.instance.getEvent] and [DeviceCalendar.instance.showEventModal] + /// to fetch or display this specific event occurrence. + /// + /// For non-recurring events, this equals [eventId]. + /// For recurring events, this is a unique identifier for each occurrence. + /// + /// **Important:** This ID becomes invalid when the event's start date changes. + /// You are responsible for keeping instanceId up to date by re-fetching events. + /// + /// Example scenario where instanceId becomes invalid: + /// ```dart + /// // 1. You fetch some events + /// final events = await plugin.retrieveEvents(calendarId, ...); + /// + /// // 2. User opens native modal from one of the events and changes the start date + /// await plugin.showEventModal(event.instanceId); + /// // User changes date from Nov 5 to Nov 6 and saves + /// + /// // 3. Your stored instanceId is now invalid! + /// // The savedInstanceId no longer points to any event + /// + /// // 4. You must re-fetch to get the updated instanceId + /// final events = await plugin.retrieveEvents(calendarId, ...); + /// ``` + final String instanceId; + + /// ID of the calendar this event belongs to. + final String calendarId; + + /// Title of the event. + final String title; + + /// Description of the event. + final String? description; + + /// Location of the event. + final String? location; + + /// Start date and time of the event. + /// + /// For all-day events, treat this as a floating date (timezone-independent). + final DateTime startDate; + + /// End date and time of the event. + /// + /// For all-day events, treat this as a floating date (timezone-independent). + /// Uses half-open interval [start, end). (i.e. the event is up to, but not including, the end date.) + final DateTime endDate; + + /// Whether this is an all-day event. + final bool isAllDay; + + /// Availability status of the event. + final EventAvailability availability; + + /// Status of the event. + final EventStatus status; + + /// Timezone identifier for the event (e.g., "America/New_York"). + /// Null for all-day events (floating dates). + final String? timeZone; + + /// Whether this is a recurring event. + /// True for recurring events, false for one-time events. + final bool isRecurring; + + Event({ + required this.eventId, + required this.instanceId, + required this.calendarId, + required this.title, + this.description, + this.location, + required this.startDate, + required this.endDate, + required this.isAllDay, + required this.availability, + required this.status, + this.timeZone, + required this.isRecurring, + }); + + /// Creates an Event from a map returned by the platform. + factory Event.fromMap(Map map) { + return Event( + eventId: map['eventId'] as String, + instanceId: map['instanceId'] as String, + calendarId: map['calendarId'] as String, + title: map['title'] as String, + description: map['description'] as String?, + location: map['location'] as String?, + startDate: DateTime.fromMillisecondsSinceEpoch(map['startDate'] as int), + endDate: DateTime.fromMillisecondsSinceEpoch(map['endDate'] as int), + isAllDay: map['isAllDay'] as bool, + availability: EventAvailability.fromName(map['availability'] as String), + status: EventStatus.fromName(map['status'] as String), + timeZone: map['timeZone'] as String?, + isRecurring: map['isRecurring'] as bool? ?? false, + ); + } + + /// Converts this Event to a map for platform communication. + Map toMap() { + final map = { + 'eventId': eventId, + 'instanceId': instanceId, + 'calendarId': calendarId, + 'title': title, + 'startDate': startDate.millisecondsSinceEpoch, + 'endDate': endDate.millisecondsSinceEpoch, + 'isAllDay': isAllDay, + 'availability': availability.name, + 'status': status.name, + 'isRecurring': isRecurring, + }; + + if (description != null) map['description'] = description; + if (location != null) map['location'] = location; + if (timeZone != null) map['timeZone'] = timeZone; + + return map; + } + + @override + String toString() { + return 'Event(eventId: $eventId, instanceId: $instanceId, calendarId: $calendarId, title: $title, ' + 'startDate: $startDate, endDate: $endDate, isAllDay: $isAllDay)'; + } + + @override + bool operator ==(Object other) { + if (identical(this, other)) return true; + + return other is Event && + other.eventId == eventId && + other.instanceId == instanceId && + other.calendarId == calendarId && + other.title == title && + other.description == description && + other.location == location && + other.startDate == startDate && + other.endDate == endDate && + other.isAllDay == isAllDay && + other.availability == availability && + other.status == status && + other.timeZone == timeZone && + other.isRecurring == isRecurring; + } + + @override + int get hashCode { + return Object.hash( + eventId, + instanceId, + calendarId, + title, + description, + location, + startDate, + endDate, + isAllDay, + availability, + status, + timeZone, + isRecurring, + ); + } +} diff --git a/package/device_calendar_plus/lib/src/event_availability.dart b/package/device_calendar_plus/lib/src/event_availability.dart new file mode 100644 index 00000000..3843773b --- /dev/null +++ b/package/device_calendar_plus/lib/src/event_availability.dart @@ -0,0 +1,36 @@ +/// Availability status of a calendar event. +enum EventAvailability { + /// Availability is busy (default for most events). + /// + /// Available on: Android, iOS + busy, + + /// Availability is free (time is available despite event). + /// + /// Available on: Android, iOS + free, + + /// Availability is tentative (event is not confirmed). + /// + /// Available on: Android, iOS + tentative, + + /// Availability is unavailable (out of office, etc.). + /// + /// Available on: iOS only + unavailable, + + /// Availability status is not supported or unknown. + /// + /// Available on: iOS only (when calendar doesn't support availability) + notSupported; + + /// Safely parses a string to an EventAvailability enum. + /// Returns [notSupported] if the value doesn't match any known case. + static EventAvailability fromName(String name) { + return EventAvailability.values.firstWhere( + (e) => e.name == name, + orElse: () => EventAvailability.notSupported, + ); + } +} diff --git a/package/device_calendar_plus/lib/src/event_status.dart b/package/device_calendar_plus/lib/src/event_status.dart new file mode 100644 index 00000000..83d7f27f --- /dev/null +++ b/package/device_calendar_plus/lib/src/event_status.dart @@ -0,0 +1,31 @@ +/// Status of a calendar event. +enum EventStatus { + /// Event has no status or status is not set. + /// + /// Available on: Android, iOS + none, + + /// Event is confirmed. + /// + /// Available on: Android, iOS + confirmed, + + /// Event is tentative (not yet confirmed). + /// + /// Available on: Android, iOS + tentative, + + /// Event has been canceled. + /// + /// Available on: Android, iOS + canceled; + + /// Safely parses a string to an EventStatus enum. + /// Returns [none] if the value doesn't match any known case. + static EventStatus fromName(String name) { + return EventStatus.values.firstWhere( + (e) => e.name == name, + orElse: () => EventStatus.none, + ); + } +} diff --git a/package/device_calendar_plus/lib/src/platform_exception_codes.dart b/package/device_calendar_plus/lib/src/platform_exception_codes.dart new file mode 100644 index 00000000..5e4f552b --- /dev/null +++ b/package/device_calendar_plus/lib/src/platform_exception_codes.dart @@ -0,0 +1,65 @@ +/// Platform exception codes used for communication between native and Dart. +/// +/// These constants ensure consistency between native platform code +/// (Kotlin/Swift) and Dart error handling. +class PlatformExceptionCodes { + PlatformExceptionCodes._(); + + // Permission-related errors + + /// Calendar permissions are not declared in the app's manifest. + /// + /// Android: Missing READ_CALENDAR or WRITE_CALENDAR in AndroidManifest.xml + /// iOS: Missing NSCalendarsUsageDescription in Info.plist + static const String permissionsNotDeclared = 'PERMISSIONS_NOT_DECLARED'; + + /// Calendar permission denied by user. + /// + /// User has explicitly denied calendar access, or security exception occurred. + static const String permissionDenied = 'PERMISSION_DENIED'; + + // Input validation errors + + /// Invalid arguments passed to a method. + /// + /// Parameters are missing, of wrong type, or contain invalid values. + static const String invalidArguments = 'INVALID_ARGUMENTS'; + + // Resource errors + + /// Requested calendar or event not found. + /// + /// The calendar ID or event instance ID doesn't exist. + static const String notFound = 'NOT_FOUND'; + + /// Calendar is read-only and cannot be modified. + /// + /// Attempting to update or delete a calendar that doesn't allow modifications. + static const String readOnly = 'READ_ONLY'; + + // Operation errors + + /// Calendar operation failed. + /// + /// Save, update, or delete operation failed for reasons other than permissions. + /// Check error message for details. + static const String operationFailed = 'OPERATION_FAILED'; + + // System/availability errors + + /// Calendar system is not available. + /// + /// Examples: + /// - Calendar app not installed (Android) + /// - Local calendar source not found (iOS) + /// - Event store unavailable + static const String calendarUnavailable = 'CALENDAR_UNAVAILABLE'; + + // Generic errors + + /// An unknown or unexpected error occurred. + /// + /// Used for unexpected exceptions that don't fit other categories. + /// Check error message for details. + static const String unknownError = 'UNKNOWN_ERROR'; +} diff --git a/package/device_calendar_plus/lib/src/platform_exception_converter.dart b/package/device_calendar_plus/lib/src/platform_exception_converter.dart new file mode 100644 index 00000000..b22c03bc --- /dev/null +++ b/package/device_calendar_plus/lib/src/platform_exception_converter.dart @@ -0,0 +1,53 @@ +import 'package:flutter/services.dart'; + +import 'device_calendar_error.dart'; +import 'platform_exception_codes.dart'; + +/// Helper class for converting platform exceptions to DeviceCalendarExceptions. +class PlatformExceptionConverter { + PlatformExceptionConverter._(); // Prevent instantiation + + /// Converts a platform exception code string to a DeviceCalendarError enum. + /// + /// Returns null for unrecognized error codes. + static DeviceCalendarError? errorCodeFromString(String code) { + switch (code) { + case PlatformExceptionCodes.permissionsNotDeclared: + return DeviceCalendarError.permissionsNotDeclared; + case PlatformExceptionCodes.permissionDenied: + return DeviceCalendarError.permissionDenied; + case PlatformExceptionCodes.invalidArguments: + return DeviceCalendarError.invalidArguments; + case PlatformExceptionCodes.notFound: + return DeviceCalendarError.notFound; + case PlatformExceptionCodes.readOnly: + return DeviceCalendarError.readOnly; + case PlatformExceptionCodes.operationFailed: + return DeviceCalendarError.operationFailed; + case PlatformExceptionCodes.calendarUnavailable: + return DeviceCalendarError.calendarUnavailable; + case PlatformExceptionCodes.unknownError: + return DeviceCalendarError.unknown; + default: + return null; + } + } + + /// Converts a PlatformException to a DeviceCalendarException if it matches known codes. + /// Returns null if the exception should be rethrown as-is. + static DeviceCalendarException? convertPlatformException( + PlatformException e) { + final errorCode = errorCodeFromString(e.code); + + // Only convert recognized error codes + if (errorCode != null) { + return DeviceCalendarException( + errorCode: errorCode, + message: e.message ?? 'An error occurred', + details: e.details, + ); + } + + return null; + } +} diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/CHANGELOG.md b/package/device_calendar_plus/package/device_calendar_plus_android/CHANGELOG.md new file mode 100644 index 00000000..48b7a342 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/CHANGELOG.md @@ -0,0 +1,32 @@ +## 0.3.1 - 2025-11-07 + +### Fixed +- `showEvent()` now uses `startActivityForResult()` to properly await until the calendar activity is dismissed + +## 0.3.0 - 2024-11-05 + +### Changed +- **BREAKING**: `deleteEvent()` now always deletes entire series for recurring events (removed `deleteAllInstances` parameter) +- **BREAKING**: `updateEvent()` now always updates entire series for recurring events (removed `updateAllInstances` parameter) +- Native code now extracts event ID from instance ID format automatically + +### Removed +- **BREAKING**: `NOT_SUPPORTED` error code (no longer needed as single-instance operations are not attempted) + +## 0.2.0 - 2024-11-05 + +### Added +- `openAppSettings()` implementation to open Android app settings via Intent + +### Removed +- **BREAKING**: `getPlatformVersion()` implementation (unused boilerplate) + +## 0.1.1 - 2024-11-04 + +### Added +- ProGuard/R8 rules to prevent code stripping in release builds +- Automatic consumer ProGuard rules configuration + +## 0.1.0 - 2024-11-04 + +Initial release. \ No newline at end of file diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/LICENSE b/package/device_calendar_plus/package/device_calendar_plus_android/LICENSE new file mode 100644 index 00000000..0152eb2c --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 bullet.to + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/README.md b/package/device_calendar_plus/package/device_calendar_plus_android/README.md new file mode 100644 index 00000000..b8c6f7a2 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/README.md @@ -0,0 +1,20 @@ +# device_calendar_plus_android + +Android implementation of the `device_calendar_plus` plugin. + +This package implements calendar functionality using the Android Calendar Provider API. It is automatically included when you add `device_calendar_plus` to your Android app. + +## For App Developers + +You don't need to add this package directly. Just use the main [`device_calendar_plus`](https://pub.dev/packages/device_calendar_plus) package, and this Android implementation will be automatically included. + +## Implementation Details + +- **Platform**: Android API 24+ (target/compile 35) +- **Language**: Kotlin +- **APIs Used**: Android Calendar Provider, ContentResolver +- **Permissions**: READ_CALENDAR, WRITE_CALENDAR + +## License + +MIT © 2025 Bullet diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/analysis_options.yaml b/package/device_calendar_plus/package/device_calendar_plus_android/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/build.gradle b/package/device_calendar_plus/package/device_calendar_plus_android/android/build.gradle new file mode 100644 index 00000000..119050ee --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/android/build.gradle @@ -0,0 +1,72 @@ +group = "to.bullet.device_calendar_plus_android" +version = "1.0-SNAPSHOT" + +buildscript { + ext.kotlin_version = "2.1.0" + repositories { + google() + mavenCentral() + } + + dependencies { + classpath("com.android.tools.build:gradle:8.9.1") + classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version") + } +} + +allprojects { + repositories { + google() + mavenCentral() + } +} + +apply plugin: "com.android.library" +apply plugin: "kotlin-android" + +android { + namespace = "to.bullet.device_calendar_plus_android" + + compileSdk = 36 + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_11 + } + + sourceSets { + main.java.srcDirs += "src/main/kotlin" + test.java.srcDirs += "src/test/kotlin" + } + + defaultConfig { + minSdk = 24 + } + + buildTypes { + release { + consumerProguardFiles("proguard-rules.pro") + } + } + + dependencies { + testImplementation("org.jetbrains.kotlin:kotlin-test") + testImplementation("org.mockito:mockito-core:5.0.0") + } + + testOptions { + unitTests.all { + useJUnitPlatform() + + testLogging { + events "passed", "skipped", "failed", "standardOut", "standardError" + outputs.upToDateWhen {false} + showStandardStreams = true + } + } + } +} diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/gradle/wrapper/gradle-wrapper.jar b/package/device_calendar_plus/package/device_calendar_plus_android/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..980502d167d3610f88fa03b2f717935189d9fbcf GIT binary patch literal 43739 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 z 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 '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# This is normally unused +# shellcheck disable=SC2034 +APP_BASE_NAME=${0##*/} +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +fi + +# Increase the maximum file descriptors if we can. +if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then + case $MAX_FD in #( + max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + MAX_FD=$( ulimit -H -n ) || + warn "Could not query maximum file descriptor limit" + esac + case $MAX_FD in #( + '' | soft) :;; #( + *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 + ulimit -n "$MAX_FD" || + warn "Could not set maximum file descriptor limit to $MAX_FD" + esac +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + org.gradle.wrapper.GradleWrapperMain \ + "$@" + +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + +# Use "xargs" to parse quoted args. +# +# With -n1 it outputs one arg per line, with the quotes and backslashes removed. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/gradlew.bat b/package/device_calendar_plus/package/device_calendar_plus_android/android/gradlew.bat new file mode 100644 index 00000000..9d21a218 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/android/gradlew.bat @@ -0,0 +1,94 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/proguard-rules.pro b/package/device_calendar_plus/package/device_calendar_plus_android/android/proguard-rules.pro new file mode 100644 index 00000000..303a3fcd --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/android/proguard-rules.pro @@ -0,0 +1,5 @@ +# Keep all classes in the plugin package for Flutter method channel access +# R8/ProGuard can't detect that Flutter calls into these classes via method channels, +# so we need to explicitly keep them to prevent stripping in release builds +-keep class to.bullet.device_calendar_plus_android.** { *; } + diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/settings.gradle b/package/device_calendar_plus/package/device_calendar_plus_android/android/settings.gradle new file mode 100644 index 00000000..80511a30 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/android/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'device_calendar_plus_android' diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/AndroidManifest.xml b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/AndroidManifest.xml new file mode 100644 index 00000000..674d5b7b --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/AndroidManifest.xml @@ -0,0 +1,3 @@ + + diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/CalendarService.kt b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/CalendarService.kt new file mode 100644 index 00000000..a24a0640 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/CalendarService.kt @@ -0,0 +1,281 @@ +package to.bullet.device_calendar_plus_android + +import android.Manifest +import android.app.Activity +import android.content.pm.PackageManager +import android.provider.CalendarContract +import androidx.core.content.ContextCompat + +class CalendarService(private val activity: Activity) { + + fun listCalendars(): Result>> { + val calendars = mutableListOf>() + + val projection = arrayOf( + CalendarContract.Calendars._ID, + CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, + CalendarContract.Calendars.CALENDAR_COLOR, + CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, + CalendarContract.Calendars.ACCOUNT_NAME, + CalendarContract.Calendars.ACCOUNT_TYPE, + CalendarContract.Calendars.IS_PRIMARY, + CalendarContract.Calendars.VISIBLE + ) + + try { + activity.contentResolver.query( + CalendarContract.Calendars.CONTENT_URI, + projection, + null, + null, + null + )?.use { cursor -> + val idIndex = cursor.getColumnIndex(CalendarContract.Calendars._ID) + val nameIndex = cursor.getColumnIndex(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME) + val colorIndex = cursor.getColumnIndex(CalendarContract.Calendars.CALENDAR_COLOR) + val accessLevelIndex = cursor.getColumnIndex(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL) + val accountNameIndex = cursor.getColumnIndex(CalendarContract.Calendars.ACCOUNT_NAME) + val accountTypeIndex = cursor.getColumnIndex(CalendarContract.Calendars.ACCOUNT_TYPE) + val isPrimaryIndex = cursor.getColumnIndex(CalendarContract.Calendars.IS_PRIMARY) + val visibleIndex = cursor.getColumnIndex(CalendarContract.Calendars.VISIBLE) + + while (cursor.moveToNext()) { + val id = cursor.getString(idIndex) + val name = cursor.getString(nameIndex) + val color = if (!cursor.isNull(colorIndex)) cursor.getInt(colorIndex) else null + val accessLevel = cursor.getInt(accessLevelIndex) + val accountName = if (!cursor.isNull(accountNameIndex)) cursor.getString(accountNameIndex) else null + val accountType = if (!cursor.isNull(accountTypeIndex)) cursor.getString(accountTypeIndex) else null + val isPrimary = if (!cursor.isNull(isPrimaryIndex)) cursor.getInt(isPrimaryIndex) == 1 else false + val visible = if (!cursor.isNull(visibleIndex)) cursor.getInt(visibleIndex) == 1 else true + + // Determine if read-only based on access level + val readOnly = accessLevel < CalendarContract.Calendars.CAL_ACCESS_CONTRIBUTOR + + // Convert color to hex string + val colorHex = color?.let { ColorHelper.colorToHex(it) } + + val calendarMap = mutableMapOf( + "id" to id, + "name" to name, + "readOnly" to readOnly, + "isPrimary" to isPrimary, + "hidden" to !visible // Invert visible to hidden + ) + + colorHex?.let { calendarMap["colorHex"] = it } + accountName?.let { calendarMap["accountName"] = it } + accountType?.let { calendarMap["accountType"] = it } + + calendars.add(calendarMap) + } + } + } catch (e: SecurityException) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied: ${e.message}" + ) + ) + } catch (e: Exception) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.UNKNOWN_ERROR, + "Failed to query calendars: ${e.message}" + ) + ) + } + + return Result.success(calendars) + } + + fun createCalendar(name: String, colorHex: String?): Result { + // Check for write calendar permission + if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_CALENDAR) + != PackageManager.PERMISSION_GRANTED) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied. Call requestPermissions() first." + ) + ) + } + + val accountName = "local" + val accountType = CalendarContract.ACCOUNT_TYPE_LOCAL + + // Android automatically creates the account when inserting the first calendar + try { + val values = android.content.ContentValues().apply { + put(CalendarContract.Calendars.ACCOUNT_NAME, accountName) + put(CalendarContract.Calendars.ACCOUNT_TYPE, accountType) + put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, name) + put(CalendarContract.Calendars.NAME, name) + put(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL, CalendarContract.Calendars.CAL_ACCESS_OWNER) + put(CalendarContract.Calendars.OWNER_ACCOUNT, accountName) + put(CalendarContract.Calendars.VISIBLE, 1) + put(CalendarContract.Calendars.SYNC_EVENTS, 1) + + // Set color if provided + if (colorHex != null) { + val color = ColorHelper.hexToColor(colorHex) + put(CalendarContract.Calendars.CALENDAR_COLOR, color) + } + } + + val uri = activity.contentResolver.insert( + CalendarContract.Calendars.CONTENT_URI + .buildUpon() + .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true") + .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, accountName) + .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, accountType) + .build(), + values + ) + + if (uri != null) { + val calendarId = uri.lastPathSegment + if (calendarId != null) { + return Result.success(calendarId) + } + } + + return Result.failure( + CalendarException( + PlatformExceptionCodes.OPERATION_FAILED, + "Failed to create calendar: No calendar ID returned" + ) + ) + } catch (e: SecurityException) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied: ${e.message}" + ) + ) + } catch (e: Exception) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.OPERATION_FAILED, + "Failed to create calendar: ${e.message}" + ) + ) + } + } + + fun updateCalendar(calendarId: String, name: String?, colorHex: String?): Result { + // Check for write calendar permission + if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_CALENDAR) + != PackageManager.PERMISSION_GRANTED) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied. Call requestPermissions() first." + ) + ) + } + + try { + // Prepare values to update + val values = android.content.ContentValues() + + // Update name if provided + if (name != null) { + values.put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, name) + values.put(CalendarContract.Calendars.NAME, name) + } + + // Update color if provided + if (colorHex != null) { + val color = ColorHelper.hexToColor(colorHex) + values.put(CalendarContract.Calendars.CALENDAR_COLOR, color) + } + + // Update the calendar + val updatedRows = activity.contentResolver.update( + CalendarContract.Calendars.CONTENT_URI, + values, + "${CalendarContract.Calendars._ID} = ?", + arrayOf(calendarId) + ) + + if (updatedRows == 0) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.NOT_FOUND, + "Calendar with ID $calendarId not found" + ) + ) + } + + return Result.success(Unit) + } catch (e: SecurityException) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied: ${e.message}" + ) + ) + } catch (e: Exception) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.OPERATION_FAILED, + "Failed to update calendar: ${e.message}" + ) + ) + } + } + + fun deleteCalendar(calendarId: String): Result { + // Check for write calendar permission + if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_CALENDAR) + != PackageManager.PERMISSION_GRANTED) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied. Call requestPermissions() first." + ) + ) + } + + try { + val deletedRows = activity.contentResolver.delete( + CalendarContract.Calendars.CONTENT_URI, + "${CalendarContract.Calendars._ID} = ?", + arrayOf(calendarId) + ) + + if (deletedRows == 0) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.NOT_FOUND, + "Calendar with ID $calendarId not found" + ) + ) + } + + return Result.success(Unit) + } catch (e: SecurityException) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied: ${e.message}" + ) + ) + } catch (e: Exception) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.OPERATION_FAILED, + "Failed to delete calendar: ${e.message}" + ) + ) + } + } + +} + +data class CalendarException( + val code: String, + override val message: String +) : Exception(message) + diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/ColorHelper.kt b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/ColorHelper.kt new file mode 100644 index 00000000..8663d262 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/ColorHelper.kt @@ -0,0 +1,23 @@ +package to.bullet.device_calendar_plus_android + +import android.graphics.Color + +object ColorHelper { + fun hexToColor(hex: String): Int { + val hexSanitized = hex.trim().removePrefix("#") + + // Parse RGB hex string to integer + return try { + Color.parseColor("#$hexSanitized") + } catch (e: Exception) { + // Default to black if parsing fails + Color.BLACK + } + } + + fun colorToHex(color: Int): String { + // Android color is ARGB, we want RGB hex string + return String.format("#%06X", 0xFFFFFF and color) + } +} + diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/DeviceCalendarPlusAndroidPlugin.kt b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/DeviceCalendarPlusAndroidPlugin.kt new file mode 100644 index 00000000..3d83ff81 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/DeviceCalendarPlusAndroidPlugin.kt @@ -0,0 +1,503 @@ +package to.bullet.device_calendar_plus_android + +import android.app.Activity +import io.flutter.embedding.engine.plugins.FlutterPlugin +import io.flutter.embedding.engine.plugins.activity.ActivityAware +import io.flutter.embedding.engine.plugins.activity.ActivityPluginBinding +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugin.common.MethodChannel.MethodCallHandler +import io.flutter.plugin.common.MethodChannel.Result +import io.flutter.plugin.common.PluginRegistry + +/** DeviceCalendarPlusAndroidPlugin */ +class DeviceCalendarPlusAndroidPlugin : + FlutterPlugin, + MethodCallHandler, + ActivityAware, + PluginRegistry.RequestPermissionsResultListener, + PluginRegistry.ActivityResultListener { + + private lateinit var channel: MethodChannel + private var activity: Activity? = null + private var permissionService: PermissionService? = null + private var calendarService: CalendarService? = null + private var eventsService: EventsService? = null + private var showEventModalResult: Result? = null + + companion object { + private const val SHOW_EVENT_REQUEST_CODE = 1001 + } + + override fun onAttachedToEngine(flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) { + channel = MethodChannel(flutterPluginBinding.binaryMessenger, "device_calendar_plus_android") + channel.setMethodCallHandler(this) + } + + override fun onMethodCall(call: MethodCall, result: Result) { + when (call.method) { + "requestPermissions" -> handleRequestPermissions(result) + "hasPermissions" -> handleHasPermissions(result) + "openAppSettings" -> handleOpenAppSettings(result) + "listCalendars" -> handleListCalendars(result) + "createCalendar" -> handleCreateCalendar(call, result) + "updateCalendar" -> handleUpdateCalendar(call, result) + "deleteCalendar" -> handleDeleteCalendar(call, result) + "listEvents" -> handleListEvents(call, result) + "getEvent" -> handleGetEvent(call, result) + "showEventModal" -> handleShowEventModal(call, result) + "createEvent" -> handleCreateEvent(call, result) + "deleteEvent" -> handleDeleteEvent(call, result) + "updateEvent" -> handleUpdateEvent(call, result) + else -> result.notImplemented() + } + } + + private fun handleRequestPermissions(result: Result) { + val service = permissionService!! + + service.requestPermissions { serviceResult -> + serviceResult.fold( + onSuccess = { status -> result.success(status) }, + onFailure = { error -> + if (error is PermissionException) { + result.error(error.code, error.message, null) + } else { + result.error(PlatformExceptionCodes.UNKNOWN_ERROR, error.message, null) + } + } + ) + } + } + + private fun handleHasPermissions(result: Result) { + val service = permissionService!! + + val serviceResult = service.hasPermissions() + serviceResult.fold( + onSuccess = { status -> result.success(status) }, + onFailure = { error -> + if (error is PermissionException) { + result.error(error.code, error.message, null) + } else { + result.error(PlatformExceptionCodes.UNKNOWN_ERROR, error.message, null) + } + } + ) + } + + private fun handleOpenAppSettings(result: Result) { + val currentActivity = activity + if (currentActivity == null) { + result.error( + PlatformExceptionCodes.UNKNOWN_ERROR, + "Activity not available", + null + ) + return + } + + try { + val intent = android.content.Intent( + android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, + android.net.Uri.parse("package:${currentActivity.packageName}") + ) + intent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK) + currentActivity.startActivity(intent) + result.success(null) + } catch (e: Exception) { + result.error( + PlatformExceptionCodes.UNKNOWN_ERROR, + "Failed to open app settings: ${e.message}", + null + ) + } + } + + private fun handleListCalendars(result: Result) { + val service = calendarService!! + + val serviceResult = service.listCalendars() + serviceResult.fold( + onSuccess = { calendars -> result.success(calendars) }, + onFailure = { error -> + if (error is CalendarException) { + result.error(error.code, error.message, null) + } else { + result.error(PlatformExceptionCodes.UNKNOWN_ERROR, error.message, null) + } + } + ) + } + + private fun handleCreateCalendar(call: MethodCall, result: Result) { + val service = calendarService ?: error("CalendarService not initialized - plugin lifecycle error") + + // Parse arguments + val name = call.argument("name") + val colorHex = call.argument("colorHex") + + if (name == null) { + result.error( + PlatformExceptionCodes.INVALID_ARGUMENTS, + "Missing or invalid name", + null + ) + return + } + + val serviceResult = service.createCalendar(name, colorHex) + serviceResult.fold( + onSuccess = { calendarId -> result.success(calendarId) }, + onFailure = { error -> + if (error is CalendarException) { + result.error(error.code, error.message, null) + } else { + result.error(PlatformExceptionCodes.UNKNOWN_ERROR, error.message, null) + } + } + ) + } + + private fun handleUpdateCalendar(call: MethodCall, result: Result) { + val service = calendarService ?: error("CalendarService not initialized - plugin lifecycle error") + + // Parse arguments + val calendarId = call.argument("calendarId") + val name = call.argument("name") + val colorHex = call.argument("colorHex") + + if (calendarId == null) { + result.error( + PlatformExceptionCodes.INVALID_ARGUMENTS, + "Missing or invalid calendarId", + null + ) + return + } + + val serviceResult = service.updateCalendar(calendarId, name, colorHex) + serviceResult.fold( + onSuccess = { result.success(null) }, + onFailure = { error -> + if (error is CalendarException) { + result.error(error.code, error.message, null) + } else { + result.error(PlatformExceptionCodes.UNKNOWN_ERROR, error.message, null) + } + } + ) + } + + private fun handleDeleteCalendar(call: MethodCall, result: Result) { + val service = calendarService ?: error("CalendarService not initialized - plugin lifecycle error") + + // Parse arguments + val calendarId = call.argument("calendarId") + + if (calendarId == null) { + result.error( + PlatformExceptionCodes.INVALID_ARGUMENTS, + "Missing or invalid calendarId", + null + ) + return + } + + val serviceResult = service.deleteCalendar(calendarId) + serviceResult.fold( + onSuccess = { result.success(null) }, + onFailure = { error -> + if (error is CalendarException) { + result.error(error.code, error.message, null) + } else { + result.error(PlatformExceptionCodes.UNKNOWN_ERROR, error.message, null) + } + } + ) + } + + private fun handleListEvents(call: MethodCall, result: Result) { + val service = eventsService ?: error("EventsService not initialized - plugin lifecycle error") + + // Parse arguments + val startDateMillis = call.argument("startDate") + val endDateMillis = call.argument("endDate") + val calendarIds = call.argument>("calendarIds") + + if (startDateMillis == null || endDateMillis == null) { + result.error( + PlatformExceptionCodes.INVALID_ARGUMENTS, + "Missing or invalid startDate or endDate", + null + ) + return + } + + val startDate = java.util.Date(startDateMillis) + val endDate = java.util.Date(endDateMillis) + + val serviceResult = service.retrieveEvents(startDate, endDate, calendarIds) + serviceResult.fold( + onSuccess = { events -> result.success(events) }, + onFailure = { error -> + if (error is CalendarException) { + result.error(error.code, error.message, null) + } else { + result.error(PlatformExceptionCodes.UNKNOWN_ERROR, error.message, null) + } + } + ) + } + + private fun handleGetEvent(call: MethodCall, result: Result) { + val service = eventsService ?: error("EventsService not initialized - plugin lifecycle error") + + // Parse arguments + val instanceId = call.argument("instanceId") + + if (instanceId == null) { + result.error( + PlatformExceptionCodes.INVALID_ARGUMENTS, + "Missing or invalid instanceId", + null + ) + return + } + + val serviceResult = service.getEvent(instanceId) + serviceResult.fold( + onSuccess = { event -> result.success(event) }, + onFailure = { error -> + if (error is CalendarException) { + result.error(error.code, error.message, null) + } else { + result.error(PlatformExceptionCodes.UNKNOWN_ERROR, error.message, null) + } + } + ) + } + + private fun handleShowEventModal(call: MethodCall, result: Result) { + val service = eventsService ?: error("EventsService not initialized - plugin lifecycle error") + val currentActivity = activity ?: error("Activity not initialized - plugin lifecycle error") + + // Parse arguments + val instanceId = call.argument("instanceId") + + if (instanceId == null) { + result.error( + PlatformExceptionCodes.INVALID_ARGUMENTS, + "Missing or invalid instanceId", + null + ) + return + } + + // Store the result callback to call when activity returns + showEventModalResult = result + + val serviceResult = service.showEvent(currentActivity, instanceId, SHOW_EVENT_REQUEST_CODE) + serviceResult.fold( + onSuccess = { /* Result will be sent in onActivityResult */ }, + onFailure = { error -> + // Clear stored result on error + showEventModalResult = null + if (error is CalendarException) { + result.error(error.code, error.message, null) + } else { + result.error(PlatformExceptionCodes.UNKNOWN_ERROR, error.message, null) + } + } + ) + } + + private fun handleCreateEvent(call: MethodCall, result: Result) { + val service = eventsService ?: error("EventsService not initialized - plugin lifecycle error") + + // Parse arguments + val calendarId = call.argument("calendarId") + val title = call.argument("title") + val startDateMillis = call.argument("startDate") + val endDateMillis = call.argument("endDate") + val isAllDay = call.argument("isAllDay") + val description = call.argument("description") + val location = call.argument("location") + val timeZone = call.argument("timeZone") + val availability = call.argument("availability") + val reminderMinutes = call.argument("reminderMinutes") + + // Validate required arguments + if (calendarId == null || title == null || startDateMillis == null || + endDateMillis == null || isAllDay == null || availability == null) { + result.error( + PlatformExceptionCodes.INVALID_ARGUMENTS, + "Missing required arguments for createEvent", + null + ) + return + } + + val startDate = java.util.Date(startDateMillis) + val endDate = java.util.Date(endDateMillis) + + val serviceResult = service.createEvent( + calendarId, + title, + startDate, + endDate, + isAllDay, + description, + location, + timeZone, + reminderMinutes, + availability + ) + + serviceResult.fold( + onSuccess = { eventId -> result.success(eventId) }, + onFailure = { error -> + if (error is CalendarException) { + result.error(error.code, error.message, null) + } else { + result.error(PlatformExceptionCodes.UNKNOWN_ERROR, error.message, null) + } + } + ) + } + + private fun handleDeleteEvent(call: MethodCall, result: Result) { + val service = eventsService ?: error("EventsService not initialized - plugin lifecycle error") + + // Parse arguments + val instanceId = call.argument("instanceId") + + if (instanceId == null) { + result.error( + PlatformExceptionCodes.INVALID_ARGUMENTS, + "Missing required arguments for deleteEvent", + null + ) + return + } + + val serviceResult = service.deleteEvent(instanceId) + serviceResult.fold( + onSuccess = { result.success(null) }, + onFailure = { error -> + if (error is CalendarException) { + result.error(error.code, error.message, null) + } else { + result.error(PlatformExceptionCodes.UNKNOWN_ERROR, error.message, null) + } + } + ) + } + + private fun handleUpdateEvent(call: MethodCall, result: Result) { + val service = eventsService ?: error("EventsService not initialized - plugin lifecycle error") + + // Parse required arguments + val instanceId = call.argument("instanceId") + + if (instanceId == null) { + result.error( + PlatformExceptionCodes.INVALID_ARGUMENTS, + "Missing required arguments for updateEvent", + null + ) + return + } + + // Parse optional arguments (all can be null) + val title = call.argument("title") + val startDateMillis = call.argument("startDate") + val endDateMillis = call.argument("endDate") + val description = call.argument("description") + val location = call.argument("location") + val isAllDay = call.argument("isAllDay") + val timeZone = call.argument("timeZone") + + // Convert dates if provided + val startDate = startDateMillis?.let { java.util.Date(it) } + val endDate = endDateMillis?.let { java.util.Date(it) } + + val serviceResult = service.updateEvent( + instanceId, + title, + startDate, + endDate, + description, + location, + isAllDay, + timeZone + ) + + serviceResult.fold( + onSuccess = { result.success(null) }, + onFailure = { error -> + if (error is CalendarException) { + result.error(error.code, error.message, null) + } else { + result.error(PlatformExceptionCodes.UNKNOWN_ERROR, error.message, null) + } + } + ) + } + + override fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ): Boolean { + return permissionService?.onRequestPermissionsResult(requestCode, permissions, grantResults) ?: false + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: android.content.Intent?): Boolean { + if (requestCode == SHOW_EVENT_REQUEST_CODE) { + // Calendar activity closed, complete the future + showEventModalResult?.success(null) + showEventModalResult = null + return true + } + return false + } + + override fun onDetachedFromEngine(binding: FlutterPlugin.FlutterPluginBinding) { + channel.setMethodCallHandler(null) + } + + override fun onAttachedToActivity(binding: ActivityPluginBinding) { + activity = binding.activity + permissionService = PermissionService(binding.activity) + calendarService = CalendarService(binding.activity) + eventsService = EventsService(binding.activity) + binding.addRequestPermissionsResultListener(this) + binding.addActivityResultListener(this) + } + + override fun onDetachedFromActivityForConfigChanges() { + activity = null + permissionService = null + calendarService = null + eventsService = null + showEventModalResult = null + } + + override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) { + activity = binding.activity + permissionService = PermissionService(binding.activity) + calendarService = CalendarService(binding.activity) + eventsService = EventsService(binding.activity) + binding.addRequestPermissionsResultListener(this) + binding.addActivityResultListener(this) + } + + override fun onDetachedFromActivity() { + activity = null + permissionService = null + calendarService = null + eventsService = null + showEventModalResult = null + } +} diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/EventsService.kt b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/EventsService.kt new file mode 100644 index 00000000..72149502 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/EventsService.kt @@ -0,0 +1,764 @@ +package to.bullet.device_calendar_plus_android + +import android.app.Activity +import android.content.ContentUris +import android.content.ContentValues +import android.content.Intent +import android.provider.CalendarContract +import java.util.Date + +class EventsService(private val activity: Activity) { + + fun retrieveEvents( + startDate: Date, + endDate: Date, + calendarIds: List?, + eventId: String? = null + ): Result>> { + val events = mutableListOf>() + + // Convert dates to milliseconds + val startMillis = startDate.time + val endMillis = endDate.time + + // Build URI with date range for Instances API + val uri = CalendarContract.Instances.CONTENT_URI.buildUpon() + .appendPath(startMillis.toString()) + .appendPath(endMillis.toString()) + .build() + + val projection = arrayOf( + CalendarContract.Instances.EVENT_ID, + CalendarContract.Instances.CALENDAR_ID, + CalendarContract.Instances.TITLE, + CalendarContract.Instances.DESCRIPTION, + CalendarContract.Instances.EVENT_LOCATION, + CalendarContract.Instances.BEGIN, + CalendarContract.Instances.END, + CalendarContract.Instances.ALL_DAY, + CalendarContract.Instances.AVAILABILITY, + CalendarContract.Instances.STATUS, + CalendarContract.Instances.EVENT_TIMEZONE, + CalendarContract.Instances.RRULE + ) + + // Build selection clause for calendar and event filtering + val selections = mutableListOf() + val args = mutableListOf() + + if (calendarIds != null && calendarIds.isNotEmpty()) { + val placeholders = calendarIds.joinToString(",") { "?" } + selections.add("${CalendarContract.Instances.CALENDAR_ID} IN ($placeholders)") + args.addAll(calendarIds) + } + + if (eventId != null) { + selections.add("${CalendarContract.Instances.EVENT_ID} = ?") + args.add(eventId) + } + + val selection = if (selections.isNotEmpty()) selections.joinToString(" AND ") else null + val selectionArgs = if (args.isNotEmpty()) args.toTypedArray() else null + + try { + activity.contentResolver.query( + uri, + projection, + selection, + selectionArgs, + "${CalendarContract.Instances.BEGIN} ASC" + )?.use { cursor -> + while (cursor.moveToNext()) { + val eventMap = buildEventMapFromCursor( + cursor, + CalendarContract.Instances.EVENT_ID, + CalendarContract.Instances.CALENDAR_ID, + CalendarContract.Instances.TITLE, + CalendarContract.Instances.DESCRIPTION, + CalendarContract.Instances.EVENT_LOCATION, + CalendarContract.Instances.BEGIN, + CalendarContract.Instances.END, + CalendarContract.Instances.ALL_DAY, + CalendarContract.Instances.AVAILABILITY, + CalendarContract.Instances.STATUS, + CalendarContract.Instances.EVENT_TIMEZONE, + CalendarContract.Instances.RRULE + ) + events.add(eventMap) + } + } + } catch (e: SecurityException) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied: ${e.message}" + ) + ) + } catch (e: Exception) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.UNKNOWN_ERROR, + "Failed to query events: ${e.message}" + ) + ) + } + + return Result.success(events) + } + + private fun availabilityToString(availability: Int): String { + return when (availability) { + CalendarContract.Events.AVAILABILITY_BUSY -> "busy" + CalendarContract.Events.AVAILABILITY_FREE -> "free" + CalendarContract.Events.AVAILABILITY_TENTATIVE -> "tentative" + else -> "busy" + } + } + + private fun statusToString(status: Int): String { + return when (status) { + CalendarContract.Events.STATUS_CONFIRMED -> "confirmed" + CalendarContract.Events.STATUS_TENTATIVE -> "tentative" + CalendarContract.Events.STATUS_CANCELED -> "canceled" + else -> "none" + } + } + + private fun buildEventMapFromCursor( + cursor: android.database.Cursor, + eventIdColumn: String, + calendarIdColumn: String, + titleColumn: String, + descriptionColumn: String, + locationColumn: String, + startColumn: String, + endColumn: String, + allDayColumn: String, + availabilityColumn: String, + statusColumn: String, + timeZoneColumn: String, + recurrenceRuleColumn: String, + createdColumn: String? = null, + lastModifiedColumn: String? = null + ): Map { + val eventIdIndex = cursor.getColumnIndex(eventIdColumn) + val calendarIdIndex = cursor.getColumnIndex(calendarIdColumn) + val titleIndex = cursor.getColumnIndex(titleColumn) + val descriptionIndex = cursor.getColumnIndex(descriptionColumn) + val locationIndex = cursor.getColumnIndex(locationColumn) + val startIndex = cursor.getColumnIndex(startColumn) + val endIndex = cursor.getColumnIndex(endColumn) + val allDayIndex = cursor.getColumnIndex(allDayColumn) + val availabilityIndex = cursor.getColumnIndex(availabilityColumn) + val statusIndex = cursor.getColumnIndex(statusColumn) + val timeZoneIndex = cursor.getColumnIndex(timeZoneColumn) + val recurrenceRuleIndex = cursor.getColumnIndex(recurrenceRuleColumn) + val createdIndex = if (createdColumn != null) cursor.getColumnIndex(createdColumn) else -1 + val lastModifiedIndex = if (lastModifiedColumn != null) cursor.getColumnIndex(lastModifiedColumn) else -1 + + val eventId = cursor.getString(eventIdIndex) + val calendarId = cursor.getString(calendarIdIndex) + val title = if (!cursor.isNull(titleIndex)) cursor.getString(titleIndex) else "" + val description = if (!cursor.isNull(descriptionIndex)) cursor.getString(descriptionIndex) else null + val location = if (!cursor.isNull(locationIndex)) cursor.getString(locationIndex) else null + val rawStart = cursor.getLong(startIndex) + val rawEnd = if (!cursor.isNull(endIndex)) cursor.getLong(endIndex) else rawStart + val allDay = if (!cursor.isNull(allDayIndex)) cursor.getInt(allDayIndex) == 1 else false + val availability = if (!cursor.isNull(availabilityIndex)) cursor.getInt(availabilityIndex) else 0 + val status = if (!cursor.isNull(statusIndex)) cursor.getInt(statusIndex) else 0 + val timeZone = if (!cursor.isNull(timeZoneIndex)) cursor.getString(timeZoneIndex) else null + val recurrenceRule = if (!cursor.isNull(recurrenceRuleIndex)) cursor.getString(recurrenceRuleIndex) else null + val createdDate = if (createdIndex >= 0 && !cursor.isNull(createdIndex)) cursor.getLong(createdIndex) else null + val lastModifiedDate = if (lastModifiedIndex >= 0 && !cursor.isNull(lastModifiedIndex)) cursor.getLong(lastModifiedIndex) else null + + // Generate instanceId using RAW timestamps before any modifications + val instanceId: String = if (recurrenceRule != null) { + "$eventId@$rawStart" + } else { + eventId + } + + // For all-day events, Android stores and returns UTC timestamps + // We need to convert them to local time while preserving the calendar date + val start: Long + val end: Long + + if (allDay) { + // Extract date components from UTC timestamp + val utcCal = java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone("UTC")) + utcCal.timeInMillis = rawStart + val startYear = utcCal.get(java.util.Calendar.YEAR) + val startMonth = utcCal.get(java.util.Calendar.MONTH) + val startDay = utcCal.get(java.util.Calendar.DAY_OF_MONTH) + + utcCal.timeInMillis = rawEnd + val endYear = utcCal.get(java.util.Calendar.YEAR) + val endMonth = utcCal.get(java.util.Calendar.MONTH) + val endDay = utcCal.get(java.util.Calendar.DAY_OF_MONTH) + + // Create local timestamps with those date components + val localCal = java.util.Calendar.getInstance() + localCal.set(startYear, startMonth, startDay, 0, 0, 0) + localCal.set(java.util.Calendar.MILLISECOND, 0) + start = localCal.timeInMillis + + localCal.set(endYear, endMonth, endDay, 0, 0, 0) + localCal.set(java.util.Calendar.MILLISECOND, 0) + end = localCal.timeInMillis + } else { + start = rawStart + end = rawEnd + } + + val eventMap = mutableMapOf( + "eventId" to eventId, + "instanceId" to instanceId, + "calendarId" to calendarId, + "title" to title, + "startDate" to start, + "endDate" to end, + "isAllDay" to allDay, + "availability" to availabilityToString(availability), + "status" to statusToString(status) + ) + + description?.let { eventMap["description"] = it } + location?.let { eventMap["location"] = it } + + // Add timezone for timed events only + if (!allDay && timeZone != null) { + eventMap["timeZone"] = timeZone + } + + // Set isRecurring flag + eventMap["isRecurring"] = (recurrenceRule != null) + + // Add creation and modification dates if available + if (createdDate != null) { + eventMap["createdDate"] = createdDate + } + if (lastModifiedDate != null) { + eventMap["updatedDate"] = lastModifiedDate + } + + return eventMap + } + + fun getEvent(instanceId: String): Result?> { + // Parse instanceId: "eventId" or "eventId@timestamp" + val parts = instanceId.split("@", limit = 2) + val eventId = parts[0] + + if (parts.size == 2) { + // Recurring event with timestamp + val occurrenceMillis = parts[1].toLongOrNull() ?: return Result.failure( + CalendarException( + PlatformExceptionCodes.INVALID_ARGUMENTS, + "Invalid instanceId format: $instanceId" + ) + ) + + // Query ±1 second around the exact occurrence time + // We use a small window since we have the precise timestamp + val startMillis = occurrenceMillis - 1000 + val endMillis = occurrenceMillis + 1000 + + val startDate = Date(startMillis) + val endDate = Date(endMillis) + + // Use retrieveEvents with event ID filter + val eventsResult = retrieveEvents(startDate, endDate, null, eventId) + + return eventsResult.mapCatching { events -> + // Find closest match to the occurrence time + events.minByOrNull { event -> + val eventStart = event["startDate"] as? Long ?: return@minByOrNull Long.MAX_VALUE + kotlin.math.abs(eventStart - occurrenceMillis) + } + } + } else { + // Non-recurring event or master event + val projection = arrayOf( + CalendarContract.Events._ID, + CalendarContract.Events.CALENDAR_ID, + CalendarContract.Events.TITLE, + CalendarContract.Events.DESCRIPTION, + CalendarContract.Events.EVENT_LOCATION, + CalendarContract.Events.DTSTART, + CalendarContract.Events.DTEND, + CalendarContract.Events.ALL_DAY, + CalendarContract.Events.AVAILABILITY, + CalendarContract.Events.STATUS, + CalendarContract.Events.EVENT_TIMEZONE, + CalendarContract.Events.RRULE + ) + + val selection = "${CalendarContract.Events._ID} = ?" + val selectionArgs = arrayOf(eventId) + + try { + activity.contentResolver.query( + CalendarContract.Events.CONTENT_URI, + projection, + selection, + selectionArgs, + null + )?.use { cursor -> + if (cursor.moveToFirst()) { + val eventMap = buildEventMapFromCursor( + cursor, + CalendarContract.Events._ID, + CalendarContract.Events.CALENDAR_ID, + CalendarContract.Events.TITLE, + CalendarContract.Events.DESCRIPTION, + CalendarContract.Events.EVENT_LOCATION, + CalendarContract.Events.DTSTART, + CalendarContract.Events.DTEND, + CalendarContract.Events.ALL_DAY, + CalendarContract.Events.AVAILABILITY, + CalendarContract.Events.STATUS, + CalendarContract.Events.EVENT_TIMEZONE, + CalendarContract.Events.RRULE + ) + return Result.success(eventMap) + } else { + return Result.success(null) + } + } + + return Result.success(null) + } catch (e: SecurityException) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied: ${e.message}" + ) + ) + } catch (e: Exception) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.UNKNOWN_ERROR, + "Failed to query event: ${e.message}" + ) + ) + } + } + } + + /** + * Shows a calendar event in a modal dialog. + */ + fun showEvent(activityContext: Activity, instanceId: String, requestCode: Int): Result { + return try { + // Validate permissions + if (android.content.pm.PackageManager.PERMISSION_GRANTED != + activity.checkSelfPermission(android.Manifest.permission.READ_CALENDAR)) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied. Call requestPermissions() first." + ) + ) + } + + // Parse instanceId: "eventId" or "eventId@timestamp" + val parts = instanceId.split("@", limit = 2) + val eventId = parts[0] + + val intent = Intent(Intent.ACTION_VIEW) + + // Build event URI + val eventUri = android.content.ContentUris.withAppendedId( + CalendarContract.Events.CONTENT_URI, + eventId.toLong() + ) + intent.data = eventUri + + // Add begin time for specific recurring event instances + if (parts.size == 2) { + val occurrenceMillis = parts[1].toLongOrNull() + if (occurrenceMillis != null) { + intent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, occurrenceMillis) + } + } + + // Use startActivityForResult to get a callback when the activity closes + activityContext.startActivityForResult(intent, requestCode) + Result.success(Unit) + } catch (e: android.content.ActivityNotFoundException) { + Result.failure( + CalendarException( + PlatformExceptionCodes.CALENDAR_UNAVAILABLE, + "Calendar app not found" + ) + ) + } catch (e: SecurityException) { + Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Permission denied: ${e.message}" + ) + ) + } catch (e: Exception) { + Result.failure( + CalendarException( + PlatformExceptionCodes.UNKNOWN_ERROR, + "Failed to open event: ${e.message}" + ) + ) + } + } + + fun createEvent( + calendarId: String, + title: String, + startDate: java.util.Date, + endDate: java.util.Date, + isAllDay: Boolean, + description: String?, + location: String?, + timeZone: String?, + reminderMinutes: Int?, + availability: String + ): Result { + // Check for write calendar permission + if (android.content.pm.PackageManager.PERMISSION_GRANTED != + activity.checkSelfPermission(android.Manifest.permission.WRITE_CALENDAR)) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied. Call requestPermissions() first." + ) + ) + } + + try { + // For all-day events, Android interprets timestamps as UTC to determine the calendar date + // We need to convert local date components to UTC midnight to preserve the calendar date + val startMillis: Long + val endMillis: Long + + if (isAllDay) { + // Extract date components from local time + val localCal = java.util.Calendar.getInstance() + localCal.time = startDate + val startYear = localCal.get(java.util.Calendar.YEAR) + val startMonth = localCal.get(java.util.Calendar.MONTH) + val startDay = localCal.get(java.util.Calendar.DAY_OF_MONTH) + + localCal.time = endDate + val endYear = localCal.get(java.util.Calendar.YEAR) + val endMonth = localCal.get(java.util.Calendar.MONTH) + val endDay = localCal.get(java.util.Calendar.DAY_OF_MONTH) + + // Create UTC timestamps with those date components + val utcCal = java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone("UTC")) + utcCal.set(startYear, startMonth, startDay, 0, 0, 0) + utcCal.set(java.util.Calendar.MILLISECOND, 0) + startMillis = utcCal.timeInMillis + + utcCal.set(endYear, endMonth, endDay, 0, 0, 0) + utcCal.set(java.util.Calendar.MILLISECOND, 0) + endMillis = utcCal.timeInMillis + } else { + startMillis = startDate.time + endMillis = endDate.time + } + + val values = android.content.ContentValues().apply { + put(CalendarContract.Events.CALENDAR_ID, calendarId.toLong()) + put(CalendarContract.Events.TITLE, title) + put(CalendarContract.Events.DTSTART, startMillis) + put(CalendarContract.Events.DTEND, endMillis) + put(CalendarContract.Events.ALL_DAY, if (isAllDay) 1 else 0) + + // Set description if provided + if (description != null) { + put(CalendarContract.Events.DESCRIPTION, description) + } + + // Set location if provided + if (location != null) { + put(CalendarContract.Events.EVENT_LOCATION, location) + } + + // Set timezone + // For all-day events, use device timezone to make them "floating" + // This ensures the date components (year/month/day) stay the same + // regardless of timezone changes + if (isAllDay) { + put(CalendarContract.Events.EVENT_TIMEZONE, java.util.TimeZone.getDefault().id) + } else { + // For non-all-day events, use provided timezone or default to device timezone + val tz = timeZone ?: java.util.TimeZone.getDefault().id + put(CalendarContract.Events.EVENT_TIMEZONE, tz) + } + + // Map availability string to Android constant + val availabilityValue = when (availability) { + "free" -> CalendarContract.Events.AVAILABILITY_FREE + "tentative" -> CalendarContract.Events.AVAILABILITY_TENTATIVE + "unavailable" -> CalendarContract.Events.AVAILABILITY_BUSY + else -> CalendarContract.Events.AVAILABILITY_BUSY // "busy" or default + } + put(CalendarContract.Events.AVAILABILITY, availabilityValue) + + // Set status to confirmed + put(CalendarContract.Events.STATUS, CalendarContract.Events.STATUS_CONFIRMED) + } + + val uri = activity.contentResolver.insert( + CalendarContract.Events.CONTENT_URI, + values + ) + + if (uri != null) { + val eventId = uri.lastPathSegment + + reminderMinutes?.let{ + val remindersContentValues = ContentValues().apply { + put(CalendarContract.Reminders.EVENT_ID, eventId) + put(CalendarContract.Reminders.MINUTES, reminderMinutes) + put(CalendarContract.Reminders.METHOD, CalendarContract.Reminders.METHOD_ALERT) + } + + // bulkInsert requires an Array of ContentValues + activity.contentResolver.bulkInsert( + CalendarContract.Reminders.CONTENT_URI, + arrayOf(remindersContentValues) // Wrap in an array + ) + } + + if (eventId != null) { + return Result.success(eventId) + } + } + + return Result.failure( + CalendarException( + PlatformExceptionCodes.OPERATION_FAILED, + "Failed to create event: No event ID returned" + ) + ) + } catch (e: SecurityException) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied: ${e.message}" + ) + ) + } catch (e: Exception) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.OPERATION_FAILED, + "Failed to create event: ${e.message}" + ) + ) + } + } + + fun deleteEvent(instanceId: String): Result { + // Check for write calendar permission + if (android.content.pm.PackageManager.PERMISSION_GRANTED != + activity.checkSelfPermission(android.Manifest.permission.WRITE_CALENDAR)) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied. Call requestPermissions() first." + ) + ) + } + + try { + // Parse instanceId: "eventId" or "eventId@timestamp" + // For recurring events, we always delete the entire series + val parts = instanceId.split("@", limit = 2) + val eventId = parts[0] + + // Delete the event (entire series for recurring events) + val deletedRows = activity.contentResolver.delete( + CalendarContract.Events.CONTENT_URI, + "${CalendarContract.Events._ID} = ?", + arrayOf(eventId) + ) + + if (deletedRows == 0) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.NOT_FOUND, + "Event with ID $eventId not found" + ) + ) + } + + return Result.success(Unit) + } catch (e: SecurityException) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied: ${e.message}" + ) + ) + } catch (e: Exception) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.OPERATION_FAILED, + "Failed to delete event: ${e.message}" + ) + ) + } + } + + fun updateEvent( + instanceId: String, + title: String?, + startDate: java.util.Date?, + endDate: java.util.Date?, + description: String?, + location: String?, + isAllDay: Boolean?, + timeZone: String? + ): Result { + // Check for write calendar permission + if (android.content.pm.PackageManager.PERMISSION_GRANTED != + activity.checkSelfPermission(android.Manifest.permission.WRITE_CALENDAR)) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied. Call requestPermissions() first." + ) + ) + } + + try { + // Parse instanceId: "eventId" or "eventId@timestamp" + // For recurring events, we always update the entire series + val parts = instanceId.split("@", limit = 2) + val eventId = parts[0] + + // Need to fetch existing event to determine if it's all-day + // This is required for proper date normalization + val existingEventResult = getEvent(instanceId) + val existingEvent = existingEventResult.getOrNull() + val wasAllDay = existingEvent?.get("isAllDay") as? Boolean ?: false + + // Build ContentValues with only provided fields + val values = android.content.ContentValues() + + // Update title if provided + if (title != null) { + values.put(CalendarContract.Events.TITLE, title) + } + + // Update description if provided + if (description != null) { + values.put(CalendarContract.Events.DESCRIPTION, description) + } + + // Update location if provided + if (location != null) { + values.put(CalendarContract.Events.EVENT_LOCATION, location) + } + + // Update isAllDay if provided + val effectiveIsAllDay = isAllDay ?: wasAllDay + if (isAllDay != null) { + values.put(CalendarContract.Events.ALL_DAY, if (isAllDay) 1 else 0) + } + + // Update dates if provided + // If event is/becomes all-day, need to normalize to UTC midnight + if (startDate != null || endDate != null) { + val startMillis: Long? + val endMillis: Long? + + if (effectiveIsAllDay) { + // For all-day events, convert date components to UTC midnight + val localCal = java.util.Calendar.getInstance() + + if (startDate != null) { + localCal.time = startDate + val startYear = localCal.get(java.util.Calendar.YEAR) + val startMonth = localCal.get(java.util.Calendar.MONTH) + val startDay = localCal.get(java.util.Calendar.DAY_OF_MONTH) + + val utcCal = java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone("UTC")) + utcCal.set(startYear, startMonth, startDay, 0, 0, 0) + utcCal.set(java.util.Calendar.MILLISECOND, 0) + startMillis = utcCal.timeInMillis + } else { + startMillis = null + } + + if (endDate != null) { + localCal.time = endDate + val endYear = localCal.get(java.util.Calendar.YEAR) + val endMonth = localCal.get(java.util.Calendar.MONTH) + val endDay = localCal.get(java.util.Calendar.DAY_OF_MONTH) + + val utcCal = java.util.Calendar.getInstance(java.util.TimeZone.getTimeZone("UTC")) + utcCal.set(endYear, endMonth, endDay, 0, 0, 0) + utcCal.set(java.util.Calendar.MILLISECOND, 0) + endMillis = utcCal.timeInMillis + } else { + endMillis = null + } + } else { + // For timed events, use timestamps directly + startMillis = startDate?.time + endMillis = endDate?.time + } + + if (startMillis != null) { + values.put(CalendarContract.Events.DTSTART, startMillis) + } + if (endMillis != null) { + values.put(CalendarContract.Events.DTEND, endMillis) + } + } + + // Update timezone if provided + // Note: For all-day events, timezone should be set but is less relevant + if (timeZone != null) { + values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone) + } else if (isAllDay == true) { + // If changing to all-day, set device timezone + values.put(CalendarContract.Events.EVENT_TIMEZONE, java.util.TimeZone.getDefault().id) + } + + // Perform the update + val updatedRows = activity.contentResolver.update( + CalendarContract.Events.CONTENT_URI, + values, + "${CalendarContract.Events._ID} = ?", + arrayOf(eventId) + ) + + if (updatedRows == 0) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.NOT_FOUND, + "Event with ID $eventId not found" + ) + ) + } + + return Result.success(Unit) + } catch (e: SecurityException) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.PERMISSION_DENIED, + "Calendar permission denied: ${e.message}" + ) + ) + } catch (e: Exception) { + return Result.failure( + CalendarException( + PlatformExceptionCodes.OPERATION_FAILED, + "Failed to update event: ${e.message}" + ) + ) + } + } +} + diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/PermissionService.kt b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/PermissionService.kt new file mode 100644 index 00000000..29bbe4f8 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/PermissionService.kt @@ -0,0 +1,121 @@ +package to.bullet.device_calendar_plus_android + +import android.Manifest +import android.app.Activity +import android.content.pm.PackageManager +import androidx.core.app.ActivityCompat +import androidx.core.content.ContextCompat + +class PermissionService(private val activity: Activity) { + + companion object { + const val CALENDAR_PERMISSION_REQUEST_CODE = 2024 + + // Permission status values matching CalendarPermissionStatus enum + const val STATUS_GRANTED = "granted" + const val STATUS_DENIED = "denied" + } + + private var pendingCallback: ((Result) -> Unit)? = null + + private fun checkPermissionsDeclared(): PermissionException? { + val readPermission = Manifest.permission.READ_CALENDAR + val writePermission = Manifest.permission.WRITE_CALENDAR + + val packageInfo = activity.packageManager.getPackageInfo( + activity.packageName, + PackageManager.GET_PERMISSIONS + ) + + val declaredPermissions = packageInfo.requestedPermissions?.toList() ?: emptyList() + + if (!declaredPermissions.contains(readPermission) || !declaredPermissions.contains(writePermission)) { + val errorMessage = "Calendar permissions must be declared in AndroidManifest.xml.\n\n" + + "Add the following to android/app/src/main/AndroidManifest.xml:\n" + + "\n" + + "" + + return PermissionException(PlatformExceptionCodes.PERMISSIONS_NOT_DECLARED, errorMessage) + } + + return null + } + + private fun getCurrentPermissionStatus(): String { + val readPermission = Manifest.permission.READ_CALENDAR + val writePermission = Manifest.permission.WRITE_CALENDAR + + val readGranted = ContextCompat.checkSelfPermission( + activity, + readPermission + ) == PackageManager.PERMISSION_GRANTED + + val writeGranted = ContextCompat.checkSelfPermission( + activity, + writePermission + ) == PackageManager.PERMISSION_GRANTED + + return if (readGranted && writeGranted) STATUS_GRANTED else STATUS_DENIED + } + + fun hasPermissions(): Result { + val error = checkPermissionsDeclared() + if (error != null) { + return Result.failure(error) + } + + return Result.success(getCurrentPermissionStatus()) + } + + fun requestPermissions(callback: (Result) -> Unit) { + val error = checkPermissionsDeclared() + if (error != null) { + callback(Result.failure(error)) + return + } + + val currentStatus = getCurrentPermissionStatus() + if (currentStatus == STATUS_GRANTED) { + callback(Result.success(STATUS_GRANTED)) + return + } + + // Store the callback to be completed when permission result is received + pendingCallback = callback + + // Request both permissions + val readPermission = Manifest.permission.READ_CALENDAR + val writePermission = Manifest.permission.WRITE_CALENDAR + ActivityCompat.requestPermissions( + activity, + arrayOf(readPermission, writePermission), + CALENDAR_PERMISSION_REQUEST_CODE + ) + } + + fun onRequestPermissionsResult( + requestCode: Int, + permissions: Array, + grantResults: IntArray + ): Boolean { + if (requestCode != CALENDAR_PERMISSION_REQUEST_CODE) { + return false + } + + val callback = pendingCallback ?: return false + pendingCallback = null + + // Check if both permissions were granted + val allGranted = grantResults.isNotEmpty() && + grantResults.all { it == PackageManager.PERMISSION_GRANTED } + + callback(Result.success(if (allGranted) STATUS_GRANTED else STATUS_DENIED)) + return true + } +} + +data class PermissionException( + val code: String, + override val message: String +) : Exception(message) + diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/PlatformExceptionCodes.kt b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/PlatformExceptionCodes.kt new file mode 100644 index 00000000..af9cdd23 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/main/kotlin/to/bullet/device_calendar_plus_android/PlatformExceptionCodes.kt @@ -0,0 +1,82 @@ +package to.bullet.device_calendar_plus_android + +/** + * Platform exception codes matching PlatformExceptionCodes in Dart. + * + * These codes are sent via method channel errors and caught/transformed + * by the Dart layer into DeviceCalendarException. + */ +object PlatformExceptionCodes { + // Permission-related errors + + /** + * Calendar permissions not declared in AndroidManifest.xml. + * + * Missing READ_CALENDAR or WRITE_CALENDAR in AndroidManifest.xml + */ + const val PERMISSIONS_NOT_DECLARED = "PERMISSIONS_NOT_DECLARED" + + /** + * Calendar permission denied by user. + * + * User has explicitly denied calendar access, or security exception occurred. + */ + const val PERMISSION_DENIED = "PERMISSION_DENIED" + + // Input validation errors + + /** + * Invalid arguments passed to a method. + * + * Parameters are missing, of wrong type, or contain invalid values. + */ + const val INVALID_ARGUMENTS = "INVALID_ARGUMENTS" + + // Resource errors + + /** + * Requested calendar or event not found. + * + * The calendar ID or event instance ID doesn't exist. + */ + const val NOT_FOUND = "NOT_FOUND" + + /** + * Calendar is read-only and cannot be modified. + * + * Attempting to update or delete a calendar that doesn't allow modifications. + */ + const val READ_ONLY = "READ_ONLY" + + // Operation errors + + /** + * Calendar operation failed. + * + * Save, update, or delete operation failed for reasons other than permissions. + * Check error message for details. + */ + const val OPERATION_FAILED = "OPERATION_FAILED" + + // System/availability errors + + /** + * Calendar system is not available. + * + * Examples: + * - Calendar app not installed + * - Event store unavailable + */ + const val CALENDAR_UNAVAILABLE = "CALENDAR_UNAVAILABLE" + + // Generic errors + + /** + * An unknown or unexpected error occurred. + * + * Used for unexpected exceptions that don't fit other categories. + * Check error message for details. + */ + const val UNKNOWN_ERROR = "UNKNOWN_ERROR" +} + diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/android/src/test/kotlin/to/bullet/device_calendar_plus_android/DeviceCalendarPlusAndroidPluginTest.kt b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/test/kotlin/to/bullet/device_calendar_plus_android/DeviceCalendarPlusAndroidPluginTest.kt new file mode 100644 index 00000000..c99d0013 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/android/src/test/kotlin/to/bullet/device_calendar_plus_android/DeviceCalendarPlusAndroidPluginTest.kt @@ -0,0 +1,27 @@ +package to.bullet.device_calendar_plus_android + +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import org.mockito.Mockito +import kotlin.test.Test + +/* + * This demonstrates a simple unit test of the Kotlin portion of this plugin's implementation. + * + * Once you have built the plugin's example app, you can run these tests from the command + * line by running `./gradlew testDebugUnitTest` in the `example/android/` directory, or + * you can run them directly from IDEs that support JUnit such as Android Studio. + */ + +internal class DeviceCalendarPlusAndroidPluginTest { + @Test + fun onMethodCall_getPlatformVersion_returnsExpectedValue() { + val plugin = DeviceCalendarPlusAndroidPlugin() + + val call = MethodCall("getPlatformVersion", null) + val mockResult: MethodChannel.Result = Mockito.mock(MethodChannel.Result::class.java) + plugin.onMethodCall(call, mockResult) + + Mockito.verify(mockResult).success("Android " + android.os.Build.VERSION.RELEASE) + } +} diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/lib/device_calendar_plus_android.dart b/package/device_calendar_plus/package/device_calendar_plus_android/lib/device_calendar_plus_android.dart new file mode 100644 index 00000000..ed6b178e --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/lib/device_calendar_plus_android.dart @@ -0,0 +1,175 @@ +import 'package:device_calendar_plus_platform_interface/device_calendar_plus_platform_interface.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +/// The Android implementation of [DeviceCalendarPlusPlatform]. +class DeviceCalendarPlusAndroid extends DeviceCalendarPlusPlatform { + /// The method channel used to interact with the native platform. + @visibleForTesting + final methodChannel = const MethodChannel('device_calendar_plus_android'); + + /// Registers this class as the default instance of [DeviceCalendarPlusPlatform]. + static void registerWith() { + DeviceCalendarPlusPlatform.instance = DeviceCalendarPlusAndroid(); + } + + @override + Future requestPermissions() async { + return await methodChannel.invokeMethod('requestPermissions'); + } + + @override + Future hasPermissions() async { + return await methodChannel.invokeMethod('hasPermissions'); + } + + @override + Future openAppSettings() async { + await methodChannel.invokeMethod('openAppSettings'); + } + + @override + Future>> listCalendars() async { + final result = + await methodChannel.invokeMethod>('listCalendars'); + return result?.map((e) => Map.from(e as Map)).toList() ?? + []; + } + + @override + Future createCalendar(String name, String? colorHex) async { + final result = await methodChannel.invokeMethod( + 'createCalendar', + { + 'name': name, + 'colorHex': colorHex, + }, + ); + return result!; + } + + @override + Future updateCalendar( + String calendarId, String? name, String? colorHex) async { + await methodChannel.invokeMethod( + 'updateCalendar', + { + 'calendarId': calendarId, + 'name': name, + 'colorHex': colorHex, + }, + ); + } + + @override + Future deleteCalendar(String calendarId) async { + await methodChannel.invokeMethod( + 'deleteCalendar', + {'calendarId': calendarId}, + ); + } + + @override + Future>> listEvents( + DateTime startDate, + DateTime endDate, + List? calendarIds, + ) async { + final result = await methodChannel.invokeMethod>( + 'listEvents', + { + 'startDate': startDate.millisecondsSinceEpoch, + 'endDate': endDate.millisecondsSinceEpoch, + 'calendarIds': calendarIds, + }, + ); + return result?.map((e) => Map.from(e as Map)).toList() ?? + []; + } + + @override + Future?> getEvent(String instanceId) async { + final result = await methodChannel.invokeMethod>( + 'getEvent', + { + 'instanceId': instanceId, + }, + ); + return result != null ? Map.from(result) : null; + } + + @override + Future showEventModal(String instanceId) async { + await methodChannel.invokeMethod( + 'showEventModal', + {'instanceId': instanceId}, + ); + } + + @override + Future createEvent( + String calendarId, + String title, + DateTime startDate, + DateTime endDate, + bool isAllDay, + int? reminderMinutes, + String? description, + String? location, + String? timeZone, + String availability, + ) async { + final result = await methodChannel.invokeMethod( + 'createEvent', + { + 'calendarId': calendarId, + 'title': title, + 'startDate': startDate.millisecondsSinceEpoch, + 'endDate': endDate.millisecondsSinceEpoch, + 'isAllDay': isAllDay, + 'description': description, + 'location': location, + 'timeZone': timeZone, + 'availability': availability, + 'reminderMinutes': reminderMinutes, + }, + ); + return result!; + } + + @override + Future deleteEvent(String instanceId) async { + await methodChannel.invokeMethod( + 'deleteEvent', + { + 'instanceId': instanceId, + }, + ); + } + + @override + Future updateEvent( + String instanceId, { + String? title, + DateTime? startDate, + DateTime? endDate, + String? description, + String? location, + bool? isAllDay, + String? timeZone, + }) async { + await methodChannel.invokeMethod( + 'updateEvent', + { + 'instanceId': instanceId, + 'title': title, + 'startDate': startDate?.millisecondsSinceEpoch, + 'endDate': endDate?.millisecondsSinceEpoch, + 'description': description, + 'location': location, + 'isAllDay': isAllDay, + 'timeZone': timeZone, + }, + ); + } +} diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/pubspec.lock b/package/device_calendar_plus/package/device_calendar_plus_android/pubspec.lock new file mode 100644 index 00000000..1b3b4593 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/pubspec.lock @@ -0,0 +1,220 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + device_calendar_plus_platform_interface: + dependency: "direct main" + description: + path: "../device_calendar_plus_platform_interface" + relative: true + source: path + version: "0.3.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.dev" + source: hosted + version: "5.1.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + plugin_platform_interface: + dependency: transitive + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + url: "https://pub.dev" + source: hosted + version: "0.7.6" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.dev" + source: hosted + version: "15.0.2" +sdks: + dart: ">=3.8.0-0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/pubspec.yaml b/package/device_calendar_plus/package/device_calendar_plus_android/pubspec.yaml new file mode 100644 index 00000000..0dda027f --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/pubspec.yaml @@ -0,0 +1,64 @@ +name: device_calendar_plus_android +description: Android implementation of the device_calendar_plus plugin. +version: 0.3.1 +repository: https://github.com/bullet-to/device_calendar_plus + + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=3.3.0" + +dependencies: + flutter: + sdk: flutter + device_calendar_plus_platform_interface: + path: ../device_calendar_plus_platform_interface + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + plugin: + implements: device_calendar_plus + platforms: + android: + package: to.bullet.device_calendar_plus_android + pluginClass: DeviceCalendarPlusAndroidPlugin + dartPluginClass: DeviceCalendarPlusAndroid + + # To add assets to your plugin package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your plugin package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/to/font-from-package diff --git a/package/device_calendar_plus/package/device_calendar_plus_android/test/device_calendar_plus_android_test.dart b/package/device_calendar_plus/package/device_calendar_plus_android/test/device_calendar_plus_android_test.dart new file mode 100644 index 00000000..c60f2297 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_android/test/device_calendar_plus_android_test.dart @@ -0,0 +1,313 @@ +// import 'package:device_calendar_plus_android/device_calendar_plus_android.dart'; +// import 'package:device_calendar_plus_platform_interface/device_calendar_plus_platform_interface.dart'; +// import 'package:flutter/services.dart'; +// import 'package:flutter_test/flutter_test.dart'; +// +// void main() { +// TestWidgetsFlutterBinding.ensureInitialized(); +// +// group('DeviceCalendarPlusAndroid', () { +// late DeviceCalendarPlusAndroid plugin; +// late List log; +// +// setUp(() async { +// plugin = DeviceCalendarPlusAndroid(); +// +// log = []; +// TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger +// .setMockMethodCallHandler(plugin.methodChannel, (methodCall) async { +// log.add(methodCall); +// switch (methodCall.method) { +// case 'requestPermissions': +// return 'granted'; // CalendarPermissionStatus.granted +// case 'hasPermissions': +// return 'granted'; // CalendarPermissionStatus.granted +// case 'openAppSettings': +// return null; +// case 'listCalendars': +// return [ +// { +// 'id': '1', +// 'name': 'Work', +// 'readOnly': false, +// 'isPrimary': true, +// 'hidden': false, +// } +// ]; +// case 'createCalendar': +// return 'android-calendar-id-456'; +// case 'updateCalendar': +// return null; +// case 'deleteCalendar': +// return null; +// case 'listEvents': +// return [ +// { +// 'eventId': 'event1', +// 'calendarId': 'cal1', +// 'title': 'Test Event', +// 'startDate': DateTime.now().millisecondsSinceEpoch, +// 'endDate': DateTime.now().millisecondsSinceEpoch, +// 'isAllDay': false, +// 'availability': 'busy', +// 'status': 'confirmed', +// } +// ]; +// case 'createEvent': +// return 'android-event-id-789'; +// case 'deleteEvent': +// return null; +// case 'updateEvent': +// return null; +// default: +// return null; +// } +// }); +// }); +// +// test('can be registered', () { +// DeviceCalendarPlusAndroid.registerWith(); +// expect(DeviceCalendarPlusPlatform.instance, +// isA()); +// }); +// +// test('requestPermissions returns granted status', () async { +// final status = await plugin.requestPermissions(); +// expect( +// log, +// [isMethodCall('requestPermissions', arguments: null)], +// ); +// expect(status, equals('granted')); // CalendarPermissionStatus.granted +// }); +// +// test('hasPermissions returns granted status', () async { +// final status = await plugin.hasPermissions(); +// expect( +// log, +// [isMethodCall('hasPermissions', arguments: null)], +// ); +// expect(status, equals('granted')); // CalendarPermissionStatus.granted +// }); +// +// test('openAppSettings calls method', () async { +// await plugin.openAppSettings(); +// expect( +// log, +// [isMethodCall('openAppSettings', arguments: null)], +// ); +// }); +// +// test('listCalendars returns list of calendars', () async { +// final calendars = await plugin.listCalendars(); +// expect( +// log, +// [isMethodCall('listCalendars', arguments: null)], +// ); +// expect(calendars, hasLength(1)); +// expect(calendars[0]['id'], equals('1')); +// expect(calendars[0]['name'], equals('Work')); +// }); +// +// test('createCalendar with name only', () async { +// final calendarId = await plugin.createCalendar('My Calendar', null); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('createCalendar')); +// expect(log[0].arguments['name'], equals('My Calendar')); +// expect(log[0].arguments['colorHex'], isNull); +// expect(calendarId, equals('android-calendar-id-456')); +// }); +// +// test('createCalendar with name and color', () async { +// final calendarId = +// await plugin.createCalendar('Work Calendar', '#FF5733'); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('createCalendar')); +// expect(log[0].arguments['name'], equals('Work Calendar')); +// expect(log[0].arguments['colorHex'], equals('#FF5733')); +// expect(calendarId, equals('android-calendar-id-456')); +// }); +// +// test('updateCalendar with name only', () async { +// await plugin.updateCalendar('cal-456', 'Updated Name', null); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('updateCalendar')); +// expect(log[0].arguments['calendarId'], equals('cal-456')); +// expect(log[0].arguments['name'], equals('Updated Name')); +// expect(log[0].arguments['colorHex'], isNull); +// }); +// +// test('updateCalendar with name and color', () async { +// await plugin.updateCalendar('cal-456', 'Updated Name', '#00FF00'); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('updateCalendar')); +// expect(log[0].arguments['calendarId'], equals('cal-456')); +// expect(log[0].arguments['name'], equals('Updated Name')); +// expect(log[0].arguments['colorHex'], equals('#00FF00')); +// }); +// +// test('deleteCalendar calls method with correct arguments', () async { +// await plugin.deleteCalendar('cal-456'); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('deleteCalendar')); +// expect(log[0].arguments['calendarId'], equals('cal-456')); +// }); +// +// test('listEvents returns list of events', () async { +// final now = DateTime.now(); +// final later = now.add(Duration(days: 7)); +// +// final events = await plugin.listEvents(now, later, ['cal1']); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('listEvents')); +// expect(log[0].arguments['startDate'], equals(now.millisecondsSinceEpoch)); +// expect(log[0].arguments['endDate'], equals(later.millisecondsSinceEpoch)); +// expect(log[0].arguments['calendarIds'], equals(['cal1'])); +// +// expect(events, hasLength(1)); +// expect(events[0]['eventId'], equals('event1')); +// expect(events[0]['title'], equals('Test Event')); +// }); +// +// test('createEvent with all parameters', () async { +// final startDate = DateTime(2024, 3, 15, 14, 0); +// final endDate = DateTime(2024, 3, 15, 15, 0); +// +// final eventId = await plugin.createEvent( +// 'cal-123', +// 'Team Meeting', +// startDate, +// endDate, +// false, +// 'Weekly sync', +// 'Conference Room A', +// 'America/New_York', +// 'busy', +// ); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('createEvent')); +// expect(log[0].arguments['calendarId'], equals('cal-123')); +// expect(log[0].arguments['title'], equals('Team Meeting')); +// expect(log[0].arguments['startDate'], +// equals(startDate.millisecondsSinceEpoch)); +// expect( +// log[0].arguments['endDate'], equals(endDate.millisecondsSinceEpoch)); +// expect(log[0].arguments['isAllDay'], equals(false)); +// expect(log[0].arguments['description'], equals('Weekly sync')); +// expect(log[0].arguments['location'], equals('Conference Room A')); +// expect(log[0].arguments['timeZone'], equals('America/New_York')); +// expect(log[0].arguments['availability'], equals('busy')); +// expect(eventId, equals('android-event-id-789')); +// }); +// +// test('createEvent with minimal parameters', () async { +// final startDate = DateTime(2024, 3, 15, 14, 0); +// final endDate = DateTime(2024, 3, 15, 15, 0); +// +// final eventId = await plugin.createEvent( +// 'cal-123', +// 'Quick Event', +// startDate, +// endDate, +// true, +// null, +// null, +// null, +// 'free', +// ); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('createEvent')); +// expect(log[0].arguments['calendarId'], equals('cal-123')); +// expect(log[0].arguments['title'], equals('Quick Event')); +// expect(log[0].arguments['isAllDay'], equals(true)); +// expect(log[0].arguments['description'], isNull); +// expect(log[0].arguments['location'], isNull); +// expect(log[0].arguments['timeZone'], isNull); +// expect(log[0].arguments['availability'], equals('free')); +// expect(eventId, equals('android-event-id-789')); +// }); +// +// test('deleteEvent calls method with correct arguments', () async { +// await plugin.deleteEvent('event-123'); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('deleteEvent')); +// expect(log[0].arguments['instanceId'], equals('event-123')); +// }); +// +// test('deleteEvent for recurring event deletes entire series', () async { +// await plugin.deleteEvent('event-123@123456789'); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('deleteEvent')); +// expect(log[0].arguments['instanceId'], equals('event-123@123456789')); +// }); +// +// test('updateEvent with all parameters', () async { +// final startDate = DateTime(2024, 3, 20, 10, 0); +// final endDate = DateTime(2024, 3, 20, 11, 0); +// +// await plugin.updateEvent( +// 'event-123', +// title: 'Updated Title', +// startDate: startDate, +// endDate: endDate, +// description: 'Updated description', +// location: 'Updated location', +// isAllDay: false, +// timeZone: 'America/New_York', +// ); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('updateEvent')); +// expect(log[0].arguments['instanceId'], equals('event-123')); +// expect(log[0].arguments['title'], equals('Updated Title')); +// expect(log[0].arguments['startDate'], +// equals(startDate.millisecondsSinceEpoch)); +// expect( +// log[0].arguments['endDate'], equals(endDate.millisecondsSinceEpoch)); +// expect(log[0].arguments['description'], equals('Updated description')); +// expect(log[0].arguments['location'], equals('Updated location')); +// expect(log[0].arguments['isAllDay'], equals(false)); +// expect(log[0].arguments['timeZone'], equals('America/New_York')); +// }); +// +// test('updateEvent with minimal parameters', () async { +// await plugin.updateEvent( +// 'event-123', +// title: 'New Title', +// ); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('updateEvent')); +// expect(log[0].arguments['instanceId'], equals('event-123')); +// expect(log[0].arguments['title'], equals('New Title')); +// expect(log[0].arguments['startDate'], isNull); +// expect(log[0].arguments['endDate'], isNull); +// expect(log[0].arguments['description'], isNull); +// expect(log[0].arguments['location'], isNull); +// expect(log[0].arguments['isAllDay'], isNull); +// expect(log[0].arguments['timeZone'], isNull); +// expect(log[0].arguments['availability'], isNull); +// }); +// +// test('updateEvent for recurring event updates entire series', () async { +// await plugin.updateEvent( +// 'event-123', +// title: 'Updated Series', +// ); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('updateEvent')); +// expect(log[0].arguments['instanceId'], equals('event-123')); +// expect(log[0].arguments['title'], equals('Updated Series')); +// }); +// }); +// } diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/CHANGELOG.md b/package/device_calendar_plus/package/device_calendar_plus_ios/CHANGELOG.md new file mode 100644 index 00000000..c8cd783c --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/CHANGELOG.md @@ -0,0 +1,30 @@ +## 0.3.1 - 2025-11-07 + +### Fixed +- `showEvent()` now properly stores result callback and calls it in `eventViewController(_:didCompleteWith:)` delegate method after modal is dismissed + +## 0.3.0 - 2024-11-05 + +### Changed +- **BREAKING**: `deleteEvent()` now always deletes entire series for recurring events using `EKSpan.futureEvents` on master event (removed `deleteAllInstances` parameter) +- **BREAKING**: `updateEvent()` now always updates entire series for recurring events using `EKSpan.futureEvents` on master event (removed `updateAllInstances` parameter) +- Native code now extracts event ID from instance ID format automatically and fetches master event + +### Removed +- **BREAKING**: `NOT_SUPPORTED` error code (no longer needed) + +## 0.2.0 - 2024-11-05 + +### Added +- `openAppSettings()` implementation using UIApplication.openSettingsURLString + +### Removed +- **BREAKING**: `getPlatformVersion()` implementation (unused boilerplate) + +## 0.1.1 - 2024-11-04 + +Version sync with other packages. No functional changes. + +## 0.1.0 - 2024-11-04 + +Initial release. \ No newline at end of file diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/LICENSE b/package/device_calendar_plus/package/device_calendar_plus_ios/LICENSE new file mode 100644 index 00000000..0152eb2c --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 bullet.to + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/README.md b/package/device_calendar_plus/package/device_calendar_plus_ios/README.md new file mode 100644 index 00000000..c89d5462 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/README.md @@ -0,0 +1,20 @@ +# device_calendar_plus_ios + +iOS implementation of the `device_calendar_plus` plugin. + +This package implements calendar functionality using Apple's EventKit framework. It is automatically included when you add `device_calendar_plus` to your iOS app. + +## For App Developers + +You don't need to add this package directly. Just use the main [`device_calendar_plus`](https://pub.dev/packages/device_calendar_plus) package, and this iOS implementation will be automatically included. + +## Implementation Details + +- **Platform**: iOS 13+ +- **Language**: Swift +- **APIs Used**: EventKit, EventKitUI +- **Permissions**: Supports iOS 17+ write-only calendar access + +## License + +MIT © 2025 Bullet diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/analysis_options.yaml b/package/device_calendar_plus/package/device_calendar_plus_ios/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/CalendarService.swift b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/CalendarService.swift new file mode 100644 index 00000000..502bfa8c --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/CalendarService.swift @@ -0,0 +1,204 @@ +import EventKit + +class CalendarService { + private let eventStore: EKEventStore + private let permissionService: PermissionService + + init(eventStore: EKEventStore, permissionService: PermissionService) { + self.eventStore = eventStore + self.permissionService = permissionService + } + + func listCalendars(completion: @escaping (Result<[[String: Any]], CalendarError>) -> Void) { + // Check current permission status - listing calendars requires full access (reading) + guard permissionService.hasPermission(for: .full) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.permissionDenied, + message: "Calendar permission denied. Call requestPermissions() first." + ))) + return + } + + // Get all event calendars + let calendars = eventStore.calendars(for: .event) + let defaultCalendar = eventStore.defaultCalendarForNewEvents + + var calendarMaps: [[String: Any]] = [] + + for calendar in calendars { + var calendarMap: [String: Any] = [ + "id": calendar.calendarIdentifier, + "name": calendar.title, + "readOnly": !calendar.allowsContentModifications, + "isPrimary": calendar == defaultCalendar, + "hidden": false // iOS doesn't expose hidden calendars + ] + + // Add color if available + if let cgColor = calendar.cgColor { + calendarMap["colorHex"] = ColorHelper.colorToHex(cgColor: cgColor) + } + + // Add account name from source + if let sourceTitle = calendar.source?.title { + calendarMap["accountName"] = sourceTitle + } + + // Add account type from source + if let sourceType = calendar.source?.sourceType { + calendarMap["accountType"] = sourceTypeToString(sourceType: sourceType) + } + + calendarMaps.append(calendarMap) + } + + completion(.success(calendarMaps)) + } + + func createCalendar(name: String, colorHex: String?, completion: @escaping (Result) -> Void) { + // Check current permission status - creating calendars requires full access (writing) + guard permissionService.hasPermission(for: .full) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.permissionDenied, + message: "Calendar permission denied. Call requestPermissions() first." + ))) + return + } + + // Find the local source - this is the only writable source for local calendars + guard let localSource = eventStore.sources.first(where: { $0.sourceType == .local }) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.calendarUnavailable, + message: "Could not find local calendar source" + ))) + return + } + + // Create a new calendar + let calendar = EKCalendar(for: .event, eventStore: eventStore) + calendar.source = localSource + calendar.title = name + + // Set color if provided + if let colorHex = colorHex { + calendar.cgColor = ColorHelper.hexToColor(hex: colorHex) + } + + // Save the calendar + do { + try eventStore.saveCalendar(calendar, commit: true) + completion(.success(calendar.calendarIdentifier)) + } catch { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.operationFailed, + message: "Failed to save calendar: \(error.localizedDescription)" + ))) + } + } + + func updateCalendar(calendarId: String, name: String?, colorHex: String?, completion: @escaping (Result) -> Void) { + // Check current permission status - updating calendars requires full access (writing) + guard permissionService.hasPermission(for: .full) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.permissionDenied, + message: "Calendar permission denied. Call requestPermissions() first." + ))) + return + } + + // Find the calendar by ID + guard let calendar = eventStore.calendar(withIdentifier: calendarId) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.notFound, + message: "Calendar with ID \(calendarId) not found" + ))) + return + } + + // Check if calendar is modifiable + guard calendar.allowsContentModifications else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.readOnly, + message: "Calendar is read-only and cannot be modified" + ))) + return + } + + // Update name if provided + if let name = name { + calendar.title = name + } + + // Update color if provided + if let colorHex = colorHex { + calendar.cgColor = ColorHelper.hexToColor(hex: colorHex) + } + + // Save the calendar + do { + try eventStore.saveCalendar(calendar, commit: true) + completion(.success(())) + } catch { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.operationFailed, + message: "Failed to update calendar: \(error.localizedDescription)" + ))) + } + } + + func deleteCalendar(calendarId: String, completion: @escaping (Result) -> Void) { + // Check current permission status - deleting calendars requires full access (writing) + guard permissionService.hasPermission(for: .full) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.permissionDenied, + message: "Calendar permission denied. Call requestPermissions() first." + ))) + return + } + + // Find the calendar by ID + guard let calendar = eventStore.calendar(withIdentifier: calendarId) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.notFound, + message: "Calendar with ID \(calendarId) not found" + ))) + return + } + + // Delete the calendar + do { + try eventStore.removeCalendar(calendar, commit: true) + completion(.success(())) + } catch { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.operationFailed, + message: "Failed to delete calendar: \(error.localizedDescription)" + ))) + } + } + + private func sourceTypeToString(sourceType: EKSourceType) -> String { + switch sourceType { + case .local: + return "local" + case .exchange: + return "exchange" + case .calDAV: + return "caldav" + case .mobileMe: + return "mobileme" + case .subscribed: + return "subscribed" + case .birthdays: + return "birthdays" + @unknown default: + return "unknown" + } + } +} + +struct CalendarError: Error { + let code: String + let message: String +} + diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/ColorHelper.swift b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/ColorHelper.swift new file mode 100644 index 00000000..7ccc4eb4 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/ColorHelper.swift @@ -0,0 +1,31 @@ +import Foundation +import CoreGraphics + +class ColorHelper { + static func hexToColor(hex: String) -> CGColor { + var hexSanitized = hex.trimmingCharacters(in: .whitespacesAndNewlines) + hexSanitized = hexSanitized.replacingOccurrences(of: "#", with: "") + + var rgb: UInt64 = 0 + Scanner(string: hexSanitized).scanHexInt64(&rgb) + + let r = CGFloat((rgb & 0xFF0000) >> 16) / 255.0 + let g = CGFloat((rgb & 0x00FF00) >> 8) / 255.0 + let b = CGFloat(rgb & 0x0000FF) / 255.0 + + return CGColor(red: r, green: g, blue: b, alpha: 1.0) + } + + static func colorToHex(cgColor: CGColor) -> String { + guard let components = cgColor.components, components.count >= 3 else { + return "#000000" + } + + let r = Int(components[0] * 255.0) + let g = Int(components[1] * 255.0) + let b = Int(components[2] * 255.0) + + return String(format: "#%02X%02X%02X", r, g, b) + } +} + diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/DeviceCalendarPlusIosPlugin.swift b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/DeviceCalendarPlusIosPlugin.swift new file mode 100644 index 00000000..a42a830b --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/DeviceCalendarPlusIosPlugin.swift @@ -0,0 +1,542 @@ +import Flutter +import UIKit +import EventKit +import EventKitUI + +public class DeviceCalendarPlusIosPlugin: NSObject, FlutterPlugin, EKEventViewDelegate { + private let eventStore = EKEventStore() + private lazy var permissionService = PermissionService(eventStore: eventStore) + private lazy var calendarService = CalendarService(eventStore: eventStore, permissionService: permissionService) + private lazy var eventsService = EventsService(eventStore: eventStore, permissionService: permissionService) + private var eventModalResult: FlutterResult? + + public static func register(with registrar: FlutterPluginRegistrar) { + let channel = FlutterMethodChannel(name: "device_calendar_plus_ios", binaryMessenger: registrar.messenger()) + let instance = DeviceCalendarPlusIosPlugin() + registrar.addMethodCallDelegate(instance, channel: channel) + } + + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + switch call.method { + case "requestPermissions": + handleRequestPermissions(result: result) + case "hasPermissions": + handleHasPermissions(result: result) + case "openAppSettings": + handleOpenAppSettings(result: result) + case "listCalendars": + handleListCalendars(result: result) + case "createCalendar": + handleCreateCalendar(call: call, result: result) + case "updateCalendar": + handleUpdateCalendar(call: call, result: result) + case "deleteCalendar": + handleDeleteCalendar(call: call, result: result) + case "listEvents": + handleListEvents(call: call, result: result) + case "getEvent": + handleGetEvent(call: call, result: result) + case "showEventModal": + handleShowEventModal(call: call, result: result) + case "createEvent": + handleCreateEvent(call: call, result: result) + case "deleteEvent": + handleDeleteEvent(call: call, result: result) + case "updateEvent": + handleUpdateEvent(call: call, result: result) + default: + result(FlutterMethodNotImplemented) + } + } + + private func handleRequestPermissions(result: @escaping FlutterResult) { + permissionService.requestPermissions { serviceResult in + DispatchQueue.main.async { + switch serviceResult { + case .success(let status): + result(status) + case .failure(let error): + result(FlutterError(code: error.code, message: error.message, details: nil)) + } + } + } + } + + private func handleHasPermissions(result: @escaping FlutterResult) { + let serviceResult = permissionService.hasPermissions() + switch serviceResult { + case .success(let status): + result(status) + case .failure(let error): + result(FlutterError(code: error.code, message: error.message, details: nil)) + } + } + + private func handleOpenAppSettings(result: @escaping FlutterResult) { + guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else { + result(FlutterError( + code: PlatformExceptionCodes.unknownError, + message: "Failed to create settings URL", + details: nil + )) + return + } + + if UIApplication.shared.canOpenURL(settingsUrl) { + UIApplication.shared.open(settingsUrl, options: [:]) { success in + if success { + result(nil) + } else { + result(FlutterError( + code: PlatformExceptionCodes.unknownError, + message: "Failed to open app settings", + details: nil + )) + } + } + } else { + result(FlutterError( + code: PlatformExceptionCodes.unknownError, + message: "Cannot open settings URL", + details: nil + )) + } + } + + private func handleListCalendars(result: @escaping FlutterResult) { + calendarService.listCalendars { serviceResult in + DispatchQueue.main.async { + switch serviceResult { + case .success(let calendars): + result(calendars) + case .failure(let error): + result(FlutterError(code: error.code, message: error.message, details: nil)) + } + } + } + } + + private func handleCreateCalendar(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let args = call.arguments as? [String: Any] else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Invalid arguments for createCalendar", + details: nil + )) + return + } + + // Parse name (required) + guard let name = args["name"] as? String else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Missing or invalid name", + details: nil + )) + return + } + + // Parse colorHex (optional) + let colorHex = args["colorHex"] as? String + + calendarService.createCalendar(name: name, colorHex: colorHex) { serviceResult in + DispatchQueue.main.async { + switch serviceResult { + case .success(let calendarId): + result(calendarId) + case .failure(let error): + result(FlutterError(code: error.code, message: error.message, details: nil)) + } + } + } + } + + private func handleUpdateCalendar(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let args = call.arguments as? [String: Any] else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Invalid arguments for updateCalendar", + details: nil + )) + return + } + + // Parse calendar ID (required) + guard let calendarId = args["calendarId"] as? String else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Missing or invalid calendarId", + details: nil + )) + return + } + + // Parse name (optional) + let name = args["name"] as? String + + // Parse colorHex (optional) + let colorHex = args["colorHex"] as? String + + calendarService.updateCalendar(calendarId: calendarId, name: name, colorHex: colorHex) { serviceResult in + DispatchQueue.main.async { + switch serviceResult { + case .success: + result(nil) + case .failure(let error): + result(FlutterError(code: error.code, message: error.message, details: nil)) + } + } + } + } + + private func handleDeleteCalendar(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let args = call.arguments as? [String: Any] else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Invalid arguments for deleteCalendar", + details: nil + )) + return + } + + // Parse calendar ID (required) + guard let calendarId = args["calendarId"] as? String else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Missing or invalid calendarId", + details: nil + )) + return + } + + calendarService.deleteCalendar(calendarId: calendarId) { serviceResult in + DispatchQueue.main.async { + switch serviceResult { + case .success: + result(nil) + case .failure(let error): + result(FlutterError(code: error.code, message: error.message, details: nil)) + } + } + } + } + + private func handleListEvents(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let args = call.arguments as? [String: Any] else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Invalid arguments for listEvents", + details: nil + )) + return + } + + // Parse start date + guard let startDateMillis = args["startDate"] as? Int64 else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Missing or invalid startDate", + details: nil + )) + return + } + + // Parse end date + guard let endDateMillis = args["endDate"] as? Int64 else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Missing or invalid endDate", + details: nil + )) + return + } + + // Convert milliseconds to Date + let startDate = Date(timeIntervalSince1970: TimeInterval(startDateMillis) / 1000.0) + let endDate = Date(timeIntervalSince1970: TimeInterval(endDateMillis) / 1000.0) + + // Parse calendar IDs (optional) + let calendarIds = args["calendarIds"] as? [String] + + eventsService.retrieveEvents( + startDate: startDate, + endDate: endDate, + calendarIds: calendarIds + ) { serviceResult in + DispatchQueue.main.async { + switch serviceResult { + case .success(let events): + result(events) + case .failure(let error): + result(FlutterError(code: error.code, message: error.message, details: nil)) + } + } + } + } + + private func handleGetEvent(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let args = call.arguments as? [String: Any] else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Invalid arguments for getEvent", + details: nil + )) + return + } + + // Parse instance ID + guard let instanceId = args["instanceId"] as? String else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Missing or invalid instanceId", + details: nil + )) + return + } + + eventsService.getEvent(instanceId: instanceId) { serviceResult in + DispatchQueue.main.async { + switch serviceResult { + case .success(let event): + result(event) + case .failure(let error): + result(FlutterError(code: error.code, message: error.message, details: nil)) + } + } + } + } + + private func handleShowEventModal(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let args = call.arguments as? [String: Any] else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Invalid arguments for showEventModal", + details: nil + )) + return + } + + // Parse instance ID + guard let instanceId = args["instanceId"] as? String else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Missing or invalid instanceId", + details: nil + )) + return + } + + eventsService.showEvent(instanceId: instanceId) { serviceResult in + DispatchQueue.main.async { + switch serviceResult { + case .success(let viewController): + // If we have a view controller (modal mode), present it + if let viewController = viewController { + // Get the root view controller + guard let rootViewController = self.getRootViewController() else { + fatalError("Failed to get root view controller - plugin lifecycle error") + } + + // Set the delegate + viewController.delegate = self + + // Store the result callback to call it when modal is dismissed + self.eventModalResult = result + + // Wrap in navigation controller for proper dismissal + let navigationController = UINavigationController(rootViewController: viewController) + navigationController.modalPresentationStyle = .pageSheet + + rootViewController.present(navigationController, animated: true, completion: nil) + } else { + // Calendar app was opened + result(nil) + } + case .failure(let error): + result(FlutterError(code: error.code, message: error.message, details: nil)) + } + } + } + } + + private func handleCreateEvent(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let args = call.arguments as? [String: Any] else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Invalid arguments for createEvent", + details: nil + )) + return + } + + // Parse required parameters + guard let calendarId = args["calendarId"] as? String, + let title = args["title"] as? String, + let startDateMillis = args["startDate"] as? Int64, + let endDateMillis = args["endDate"] as? Int64, + let isAllDay = args["isAllDay"] as? Bool, + let availability = args["availability"] as? String else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Missing required arguments for createEvent", + details: nil + )) + return + } + + // Parse optional parameters + let description = args["description"] as? String + let location = args["location"] as? String + let timeZone = args["timeZone"] as? String + let reminderMinutes = args["reminderMinutes"] as? Int + print("Reminder set for \(reminderMinutes) minutes before the event") + // Convert dates + let startDate = Date(timeIntervalSince1970: TimeInterval(startDateMillis) / 1000.0) + let endDate = Date(timeIntervalSince1970: TimeInterval(endDateMillis) / 1000.0) + + eventsService.createEvent( + calendarId: calendarId, + title: title, + startDate: startDate, + endDate: endDate, + isAllDay: isAllDay, + description: description, + location: location, + timeZone: timeZone, + availability: availability, + reminderMinutes: reminderMinutes + ) { serviceResult in + DispatchQueue.main.async { + switch serviceResult { + case .success(let eventId): + result(eventId) + case .failure(let error): + result(FlutterError(code: error.code, message: error.message, details: nil)) + } + } + } + } + + private func handleDeleteEvent(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let args = call.arguments as? [String: Any] else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Invalid arguments for deleteEvent", + details: nil + )) + return + } + + // Parse parameters + guard let instanceId = args["instanceId"] as? String else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Missing required arguments for deleteEvent", + details: nil + )) + return + } + + eventsService.deleteEvent( + instanceId: instanceId + ) { serviceResult in + DispatchQueue.main.async { + switch serviceResult { + case .success: + result(nil) + case .failure(let error): + result(FlutterError(code: error.code, message: error.message, details: nil)) + } + } + } + } + + private func handleUpdateEvent(call: FlutterMethodCall, result: @escaping FlutterResult) { + guard let args = call.arguments as? [String: Any] else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Invalid arguments for updateEvent", + details: nil + )) + return + } + + // Parse required parameters + guard let instanceId = args["instanceId"] as? String else { + result(FlutterError( + code: PlatformExceptionCodes.invalidArguments, + message: "Missing required arguments for updateEvent", + details: nil + )) + return + } + + // Parse optional parameters + let title = args["title"] as? String + let description = args["description"] as? String + let location = args["location"] as? String + let isAllDay = args["isAllDay"] as? Bool + let timeZone = args["timeZone"] as? String + + // Parse dates if provided + let startDate: Date? + if let startDateMillis = args["startDate"] as? Int64 { + startDate = Date(timeIntervalSince1970: TimeInterval(startDateMillis) / 1000.0) + } else { + startDate = nil + } + + let endDate: Date? + if let endDateMillis = args["endDate"] as? Int64 { + endDate = Date(timeIntervalSince1970: TimeInterval(endDateMillis) / 1000.0) + } else { + endDate = nil + } + + eventsService.updateEvent( + instanceId: instanceId, + title: title, + startDate: startDate, + endDate: endDate, + description: description, + location: location, + isAllDay: isAllDay, + timeZone: timeZone + ) { serviceResult in + DispatchQueue.main.async { + switch serviceResult { + case .success: + result(nil) + case .failure(let error): + result(FlutterError(code: error.code, message: error.message, details: nil)) + } + } + } + } + + // MARK: - EKEventViewControllerDelegate + + public func eventViewController(_ controller: EKEventViewController, didCompleteWith action: EKEventViewAction) { + // Dismiss the modal + controller.navigationController?.dismiss(animated: true) { + // Call the stored result callback after modal is dismissed + self.eventModalResult?(nil) + self.eventModalResult = nil + } + } + + // MARK: - Helper Methods + + private func getRootViewController() -> UIViewController? { + // Get the key window + if #available(iOS 13.0, *) { + // Use window scene for iOS 13+ + let scenes = UIApplication.shared.connectedScenes + let windowScene = scenes.first as? UIWindowScene + return windowScene?.windows.first(where: { $0.isKeyWindow })?.rootViewController + } else { + // Use deprecated keyWindow for older iOS versions + return UIApplication.shared.keyWindow?.rootViewController + } + } +} diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/EventsService.swift b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/EventsService.swift new file mode 100644 index 00000000..857ca79d --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/EventsService.swift @@ -0,0 +1,520 @@ +import EventKit +import EventKitUI + +extension EKEventAvailability { + var stringValue: String { + switch self { + case .notSupported: + return "notSupported" + case .busy: + return "busy" + case .free: + return "free" + case .tentative: + return "tentative" + case .unavailable: + return "unavailable" + @unknown default: + return "notSupported" + } + } +} + +extension EKEventStatus { + var stringValue: String { + switch self { + case .none: + return "none" + case .confirmed: + return "confirmed" + case .tentative: + return "tentative" + case .canceled: + return "canceled" + @unknown default: + return "none" + } + } +} + +class EventsService { + private let eventStore: EKEventStore + private let permissionService: PermissionService + + init(eventStore: EKEventStore, permissionService: PermissionService) { + self.eventStore = eventStore + self.permissionService = permissionService + } + + func retrieveEvents( + startDate: Date, + endDate: Date, + calendarIds: [String]?, + completion: @escaping (Result<[[String: Any]], CalendarError>) -> Void + ) { + // Check permission + guard permissionService.hasPermission(for: .full) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.permissionDenied, + message: "Calendar permission denied. Call requestPermissions() first." + ))) + return + } + + // Filter calendars if IDs provided + var calendars: [EKCalendar]? + if let calendarIds = calendarIds, !calendarIds.isEmpty { + calendars = calendarIds.compactMap { calendarId in + eventStore.calendar(withIdentifier: calendarId) + } + + // If no valid calendars found, return empty list + if calendars?.isEmpty ?? true { + completion(.success([])) + return + } + } + + // Create predicate for events + // Note: iOS automatically limits to 4-year spans + let predicate = eventStore.predicateForEvents( + withStart: startDate, + end: endDate, + calendars: calendars + ) + + // Fetch events + let events = eventStore.events(matching: predicate) + + // Convert to maps + let eventMaps = events.map { event in + eventToMap(event: event) + } + + completion(.success(eventMaps)) + } + + private func eventToMap(event: EKEvent) -> [String: Any] { + // Generate instanceId + let startMillis = Int64(event.startDate.timeIntervalSince1970 * 1000) + let eventId = event.eventIdentifier ?? "" + let instanceId: String + if event.hasRecurrenceRules { + instanceId = "\(eventId)@\(startMillis)" + } else { + instanceId = eventId + } + + var eventMap: [String: Any] = [ + "eventId": eventId, + "instanceId": instanceId, + "calendarId": event.calendar.calendarIdentifier, + "title": event.title ?? "", + "isAllDay": event.isAllDay + ] + + // Add optional fields + if let notes = event.notes { + eventMap["description"] = notes + } + + if let location = event.location { + eventMap["location"] = location + } + + // Convert dates to milliseconds since epoch + var startDate = event.startDate! + var endDate = event.endDate! + + // For all-day events, iOS returns dates in UTC representing "floating" dates + // We need to convert them to the device's local timezone to preserve the calendar date + // Example: "Jan 1, 2022" in UTC should become "Jan 1, 2022 00:00" in local time + if event.isAllDay { + // For end date: iOS sets end time to 23:59:59, so add 1 second to get midnight (open interval) + endDate = endDate.addingTimeInterval(1) + + // Extract date components from UTC dates + let utcCalendar = Calendar(identifier: .gregorian) + let startComponents = utcCalendar.dateComponents([.year, .month, .day], from: startDate) + let endComponents = utcCalendar.dateComponents([.year, .month, .day], from: endDate) + + // Create dates in local timezone with same calendar date components + var localCalendar = Calendar.current + localCalendar.timeZone = TimeZone.current + if let localStartDate = localCalendar.date(from: startComponents) { + startDate = localStartDate + } + if let localEndDate = localCalendar.date(from: endComponents) { + endDate = localEndDate + } + } + + eventMap["startDate"] = Int64(startDate.timeIntervalSince1970 * 1000) + eventMap["endDate"] = Int64(endDate.timeIntervalSince1970 * 1000) + + // Map availability and status to strings + eventMap["availability"] = event.availability.stringValue + eventMap["status"] = event.status.stringValue + + // Add timezone for timed events (null for all-day events) + if !event.isAllDay, let timeZone = event.timeZone { + eventMap["timeZone"] = timeZone.identifier + } + + // Set isRecurring flag + eventMap["isRecurring"] = event.hasRecurrenceRules + + return eventMap + } + + func getEvent( + instanceId: String, + completion: @escaping (Result<[String: Any]?, CalendarError>) -> Void + ) { + // Check permission + guard permissionService.hasPermission(for: .full) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.permissionDenied, + message: "Calendar permission denied. Call requestPermissions() first." + ))) + return + } + + // Parse instanceId: "eventId" or "eventId@timestamp" + let parts = instanceId.split(separator: "@", maxSplits: 1) + let eventId = String(parts[0]) + + if parts.count == 2, let timestampMillis = Int64(parts[1]) { + // Recurring event with timestamp + let occurrenceDate = Date(timeIntervalSince1970: TimeInterval(timestampMillis) / 1000.0) + + // Query ±1 second around the exact occurrence time + // We use a small window since we have the precise timestamp + let startDate = occurrenceDate.addingTimeInterval(-1) + let endDate = occurrenceDate.addingTimeInterval(1) + + let predicate = eventStore.predicateForEvents( + withStart: startDate, + end: endDate, + calendars: nil + ) + + let events = eventStore.events(matching: predicate) + + // Find the closest matching instance + let matchingEvents = events.filter { $0.eventIdentifier == eventId } + let closestEvent = matchingEvents.min(by: { + abs($0.startDate.timeIntervalSince(occurrenceDate)) < abs($1.startDate.timeIntervalSince(occurrenceDate)) + }) + + if let closestEvent = closestEvent { + completion(.success(eventToMap(event: closestEvent))) + } else { + completion(.success(nil)) + } + } else { + // Non-recurring event or master event + if let event = eventStore.event(withIdentifier: eventId) { + completion(.success(eventToMap(event: event))) + } else { + completion(.success(nil)) + } + } + } + + func showEvent( + instanceId: String, + completion: @escaping (Result) -> Void + ) { + // Check permission + guard permissionService.hasPermission(for: .full) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.permissionDenied, + message: "Calendar permission denied. Call requestPermissions() first." + ))) + return + } + + // Parse instanceId: "eventId" or "eventId@timestamp" + let parts = instanceId.split(separator: "@", maxSplits: 1) + let eventId = String(parts[0]) + let occurrenceDate: Date? + + if parts.count == 2, let timestampMillis = Int64(parts[1]) { + occurrenceDate = Date(timeIntervalSince1970: TimeInterval(timestampMillis) / 1000.0) + } else { + occurrenceDate = nil + } + + // Fetch the event for modal presentation + let event: EKEvent? + + if let occurrenceDate = occurrenceDate { + // Query ±1 second around the exact occurrence time + // We use a small window since we have the precise timestamp + let startDate = occurrenceDate.addingTimeInterval(-1) + let endDate = occurrenceDate.addingTimeInterval(1) + + let predicate = eventStore.predicateForEvents( + withStart: startDate, + end: endDate, + calendars: nil + ) + + let events = eventStore.events(matching: predicate) + let matchingEvents = events.filter { $0.eventIdentifier == eventId } + + // Find the closest match to the occurrence date + event = matchingEvents.min(by: { abs($0.startDate.timeIntervalSince(occurrenceDate)) < abs($1.startDate.timeIntervalSince(occurrenceDate)) }) + } else { + // Get master event directly + event = eventStore.event(withIdentifier: eventId) + } + + // Check if event was found + guard let foundEvent = event else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.notFound, + message: "Event not found with instance ID: \(instanceId)" + ))) + return + } + + // Create event view controller + let eventViewController = EKEventViewController() + eventViewController.event = foundEvent + eventViewController.allowsEditing = true + eventViewController.allowsCalendarPreview = true + + completion(.success(eventViewController)) + } + private func createReminders(_ reminderMinutes: Int?) -> [EKAlarm]?{ + + guard let minutes = reminderMinutes as? Int else { + return nil + } + print("Reminder set for \(minutes) minutes before the event") + + var reminders = [EKAlarm]() + reminders.append(EKAlarm.init(relativeOffset: 60 * Double(-minutes))) + + return reminders + } + + func createEvent( + calendarId: String, + title: String, + startDate: Date, + endDate: Date, + isAllDay: Bool, + description: String?, + location: String?, + timeZone: String?, + availability: String, + reminderMinutes: Int?, + completion: @escaping (Result) -> Void + ) { + print("Reminder set for \(reminderMinutes) minutes before the event") + + // Check permission - creating events only requires write access + guard permissionService.hasPermission(for: .write) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.permissionDenied, + message: "Calendar permission denied. Call requestPermissions() first." + ))) + return + } + + // Get the calendar + guard let calendar = eventStore.calendar(withIdentifier: calendarId) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.notFound, + message: "Calendar with ID \(calendarId) not found" + ))) + return + } + + // Create the event + let event = EKEvent(eventStore: eventStore) + event.calendar = calendar + event.title = title + event.startDate = startDate + event.endDate = endDate + event.isAllDay = isAllDay + event.alarms = createReminders(reminderMinutes) + + // Set optional properties + if let description = description { + event.notes = description + } + + if let location = location { + event.location = location + } + + // Set timezone (nil for all-day events) + if !isAllDay, let timeZoneIdentifier = timeZone { + event.timeZone = TimeZone(identifier: timeZoneIdentifier) + } + + // Map availability string to EKEventAvailability + switch availability { + case "free": + event.availability = .free + case "tentative": + event.availability = .tentative + case "unavailable": + event.availability = .unavailable + default: // "busy" or default + event.availability = .busy + } + + // Save the event + do { + try eventStore.save(event, span: .thisEvent) + + // Return the event ID + if let eventId = event.eventIdentifier { + completion(.success(eventId)) + } else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.operationFailed, + message: "Failed to get event ID after creation" + ))) + } + } catch { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.operationFailed, + message: "Failed to save event: \(error.localizedDescription)" + ))) + } + } + + func deleteEvent( + instanceId: String, + completion: @escaping (Result) -> Void + ) { + // Check permission + guard permissionService.hasPermission(for: .full) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.permissionDenied, + message: "Calendar permission denied. Call requestPermissions() first." + ))) + return + } + + // Parse instanceId: "eventId" or "eventId@timestamp" + // For recurring events, we always delete the entire series, so extract just the eventId + let parts = instanceId.split(separator: "@", maxSplits: 1) + let eventId = String(parts[0]) + + // Fetch the master event by eventId + guard let event = eventStore.event(withIdentifier: eventId) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.notFound, + message: "Event not found with instance ID: \(instanceId)" + ))) + return + } + + // Delete the event + // For recurring events, .futureEvents on the master event deletes the entire series + // For non-recurring events, .futureEvents behaves the same as .thisEvent + do { + try eventStore.remove(event, span: .futureEvents) + completion(.success(())) + } catch { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.operationFailed, + message: "Failed to delete event: \(error.localizedDescription)" + ))) + } + } + + func updateEvent( + instanceId: String, + title: String?, + startDate: Date?, + endDate: Date?, + description: String?, + location: String?, + isAllDay: Bool?, + timeZone: String?, + completion: @escaping (Result) -> Void + ) { + // Check permission + guard permissionService.hasPermission(for: .full) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.permissionDenied, + message: "Calendar permission denied. Call requestPermissions() first." + ))) + return + } + + // Parse instanceId: "eventId" or "eventId@timestamp" + // For recurring events, we always update the entire series, so extract just the eventId + let parts = instanceId.split(separator: "@", maxSplits: 1) + let eventId = String(parts[0]) + + // Fetch the master event by eventId + guard let foundEvent = eventStore.event(withIdentifier: eventId) else { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.notFound, + message: "Event not found with instance ID: \(instanceId)" + ))) + return + } + + // Update only provided fields + if let title = title { + foundEvent.title = title + } + + if let description = description { + foundEvent.notes = description + } + + if let location = location { + foundEvent.location = location + } + + // Determine if event is/will be all-day + let effectiveIsAllDay = isAllDay ?? foundEvent.isAllDay + + // Update isAllDay if provided + if let isAllDay = isAllDay { + foundEvent.isAllDay = isAllDay + } + + // Update dates if provided + if let startDate = startDate { + foundEvent.startDate = startDate + } + if let endDate = endDate { + foundEvent.endDate = endDate + } + + // Update timezone + // For all-day events, timezone should be nil + // For timed events, set the timezone if provided + if effectiveIsAllDay { + foundEvent.timeZone = nil + } else if let timeZoneIdentifier = timeZone { + foundEvent.timeZone = TimeZone(identifier: timeZoneIdentifier) + } + + // Save the event + // For recurring events, .futureEvents on the master event updates the entire series + // For non-recurring events, .futureEvents behaves the same as .thisEvent + do { + try eventStore.save(foundEvent, span: .futureEvents) + completion(.success(())) + } catch { + completion(.failure(CalendarError( + code: PlatformExceptionCodes.operationFailed, + message: "Failed to update event: \(error.localizedDescription)" + ))) + } + } +} + diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/PermissionService.swift b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/PermissionService.swift new file mode 100644 index 00000000..393aaf85 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/PermissionService.swift @@ -0,0 +1,160 @@ +import EventKit + +enum CalendarPermissionType { + case write // Need to write events (iOS 17+ writeOnly or fullAccess is fine) + case full // Need to read calendars/events (requires fullAccess) +} + +class PermissionService { + private let eventStore: EKEventStore + + // Permission status values matching CalendarPermissionStatus enum + static let statusGranted = "granted" + static let statusWriteOnly = "writeOnly" + static let statusDenied = "denied" + static let statusRestricted = "restricted" + static let statusNotDetermined = "notDetermined" + + init(eventStore: EKEventStore) { + self.eventStore = eventStore + } + + /// Checks if calendar permissions are granted for the specified access level. + /// - Parameter type: The type of access required (.write or .full) + /// - Returns: true if the required permission level is granted + func hasPermission(for type: CalendarPermissionType = .full) -> Bool { + if #available(iOS 17.0, *) { + let status = EKEventStore.authorizationStatus(for: .event) + + switch type { + case .full: + // For full access (reading), need fullAccess only + switch status { + case .fullAccess: + return true + case .writeOnly, .denied, .restricted, .notDetermined: + return false + @unknown default: + return false + } + + case .write: + // For write-only operations, writeOnly or fullAccess is fine + switch status { + case .fullAccess, .writeOnly: + return true + case .denied, .restricted, .notDetermined: + return false + @unknown default: + return false + } + } + } else { + // iOS 16 and below only has .authorized (which is full access) + let status = EKEventStore.authorizationStatus(for: .event) + switch status { + case .authorized: + return true + case .denied, .restricted, .notDetermined: + return false + @unknown default: + return false + } + } + } + + private func checkUsageDescriptionDeclared() -> PermissionError? { + let usageDescription = Bundle.main.object(forInfoDictionaryKey: "NSCalendarsUsageDescription") as? String + + if usageDescription == nil || usageDescription?.isEmpty == true { + var errorMessage = "Calendar usage description not declared in Info.plist.\n\n" + errorMessage += "Add the following to ios/Runner/Info.plist:\n" + errorMessage += "NSCalendarsUsageDescription\n" + errorMessage += "Access your calendar to view and manage events.\n" + errorMessage += "NSCalendarsWriteOnlyAccessUsageDescription\n" + errorMessage += "Add events without reading existing events." + + return PermissionError(code: PlatformExceptionCodes.permissionsNotDeclared, message: errorMessage) + } + + return nil + } + + private func getCurrentPermissionStatus() -> String { + if #available(iOS 17.0, *) { + let currentStatus = EKEventStore.authorizationStatus(for: .event) + + switch currentStatus { + case .fullAccess: + return PermissionService.statusGranted + case .writeOnly: + return PermissionService.statusWriteOnly + case .denied: + return PermissionService.statusDenied + case .restricted: + return PermissionService.statusRestricted + case .notDetermined: + return PermissionService.statusNotDetermined + @unknown default: + return PermissionService.statusDenied + } + } else { + let currentStatus = EKEventStore.authorizationStatus(for: .event) + + switch currentStatus { + case .authorized: + return PermissionService.statusGranted + case .denied: + return PermissionService.statusDenied + case .restricted: + return PermissionService.statusRestricted + case .notDetermined: + return PermissionService.statusNotDetermined + @unknown default: + return PermissionService.statusDenied + } + } + } + + func hasPermissions() -> Result { + if let error = checkUsageDescriptionDeclared() { + return .failure(error) + } + + return .success(getCurrentPermissionStatus()) + } + + func requestPermissions(completion: @escaping (Result) -> Void) { + if let error = checkUsageDescriptionDeclared() { + completion(.failure(error)) + return + } + + let currentStatus = getCurrentPermissionStatus() + + // If already determined (granted, denied, restricted, or writeOnly), return immediately + if currentStatus != PermissionService.statusNotDetermined { + completion(.success(currentStatus)) + return + } + + // Request permissions if not determined + if #available(iOS 17.0, *) { + eventStore.requestFullAccessToEvents { granted, error in + let status = granted ? PermissionService.statusGranted : PermissionService.statusDenied + completion(.success(status)) + } + } else { + eventStore.requestAccess(to: .event) { granted, error in + let status = granted ? PermissionService.statusGranted : PermissionService.statusDenied + completion(.success(status)) + } + } + } +} + +struct PermissionError: Error { + let code: String + let message: String +} + diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/PlatformExceptionCodes.swift b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/PlatformExceptionCodes.swift new file mode 100644 index 00000000..c71a9bd0 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Classes/PlatformExceptionCodes.swift @@ -0,0 +1,62 @@ +/// Platform exception codes matching PlatformExceptionCodes in Dart. +/// +/// These codes are sent via method channel errors and caught/transformed +/// by the Dart layer into DeviceCalendarException. +enum PlatformExceptionCodes { + // Permission-related errors + + /// Calendar usage description not declared in Info.plist. + /// + /// Missing NSCalendarsUsageDescription in Info.plist + static let permissionsNotDeclared = "PERMISSIONS_NOT_DECLARED" + + /// Calendar permission denied by user. + /// + /// User has explicitly denied calendar access, or security exception occurred. + static let permissionDenied = "PERMISSION_DENIED" + + // Input validation errors + + /// Invalid arguments passed to a method. + /// + /// Parameters are missing, of wrong type, or contain invalid values. + static let invalidArguments = "INVALID_ARGUMENTS" + + // Resource errors + + /// Requested calendar or event not found. + /// + /// The calendar ID or event instance ID doesn't exist. + static let notFound = "NOT_FOUND" + + /// Calendar is read-only and cannot be modified. + /// + /// Attempting to update or delete a calendar that doesn't allow modifications. + static let readOnly = "READ_ONLY" + + // Operation errors + + /// Calendar operation failed. + /// + /// Save, update, or delete operation failed for reasons other than permissions. + /// Check error message for details. + static let operationFailed = "OPERATION_FAILED" + + // System/availability errors + + /// Calendar system is not available. + /// + /// Examples: + /// - Local calendar source not found + /// - Event store unavailable + static let calendarUnavailable = "CALENDAR_UNAVAILABLE" + + // Generic errors + + /// An unknown or unexpected error occurred. + /// + /// Used for unexpected exceptions that don't fit other categories. + /// Check error message for details. + static let unknownError = "UNKNOWN_ERROR" +} + diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Resources/PrivacyInfo.xcprivacy b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Resources/PrivacyInfo.xcprivacy new file mode 100644 index 00000000..a34b7e2e --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/Resources/PrivacyInfo.xcprivacy @@ -0,0 +1,14 @@ + + + + + NSPrivacyTrackingDomains + + NSPrivacyAccessedAPITypes + + NSPrivacyCollectedDataTypes + + NSPrivacyTracking + + + diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/ios/device_calendar_plus_ios.podspec b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/device_calendar_plus_ios.podspec new file mode 100644 index 00000000..4f0c9e08 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/ios/device_calendar_plus_ios.podspec @@ -0,0 +1,29 @@ +# +# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html. +# Run `pod lib lint device_calendar_plus_ios.podspec` to validate before publishing. +# +Pod::Spec.new do |s| + s.name = 'device_calendar_plus_ios' + s.version = '0.0.1' + s.summary = 'A new Flutter plugin project.' + s.description = <<-DESC +A new Flutter plugin project. + DESC + s.homepage = 'http://example.com' + s.license = { :file => '../LICENSE' } + s.author = { 'Your Company' => 'email@example.com' } + s.source = { :path => '.' } + s.source_files = 'Classes/**/*' + s.dependency 'Flutter' + s.platform = :ios, '13.0' + + # Flutter.framework does not contain a i386 slice. + s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' } + s.swift_version = '5.0' + + # If your plugin requires a privacy manifest, for example if it uses any + # required reason APIs, update the PrivacyInfo.xcprivacy file to describe your + # plugin's privacy impact, and then uncomment this line. For more information, + # see https://developer.apple.com/documentation/bundleresources/privacy_manifest_files + # s.resource_bundles = {'device_calendar_plus_ios_privacy' => ['Resources/PrivacyInfo.xcprivacy']} +end diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/lib/device_calendar_plus_ios.dart b/package/device_calendar_plus/package/device_calendar_plus_ios/lib/device_calendar_plus_ios.dart new file mode 100644 index 00000000..ed1fa78a --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/lib/device_calendar_plus_ios.dart @@ -0,0 +1,177 @@ +import 'package:device_calendar_plus_platform_interface/device_calendar_plus_platform_interface.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/services.dart'; + +/// The iOS implementation of [DeviceCalendarPlusPlatform]. +class DeviceCalendarPlusIos extends DeviceCalendarPlusPlatform { + /// The method channel used to interact with the native platform. + @visibleForTesting + final methodChannel = const MethodChannel('device_calendar_plus_ios'); + + /// Registers this class as the default instance of [DeviceCalendarPlusPlatform]. + static void registerWith() { + DeviceCalendarPlusPlatform.instance = DeviceCalendarPlusIos(); + } + + @override + Future requestPermissions() async { + return await methodChannel.invokeMethod('requestPermissions'); + } + + @override + Future hasPermissions() async { + return await methodChannel.invokeMethod('hasPermissions'); + } + + @override + Future openAppSettings() async { + await methodChannel.invokeMethod('openAppSettings'); + } + + @override + Future>> listCalendars() async { + final result = + await methodChannel.invokeMethod>('listCalendars'); + return result?.map((e) => Map.from(e as Map)).toList() ?? + []; + } + + @override + Future createCalendar(String name, String? colorHex) async { + final result = await methodChannel.invokeMethod( + 'createCalendar', + { + 'name': name, + 'colorHex': colorHex, + }, + ); + return result!; + } + + @override + Future updateCalendar( + String calendarId, String? name, String? colorHex) async { + await methodChannel.invokeMethod( + 'updateCalendar', + { + 'calendarId': calendarId, + 'name': name, + 'colorHex': colorHex, + }, + ); + } + + @override + Future deleteCalendar(String calendarId) async { + await methodChannel.invokeMethod( + 'deleteCalendar', + {'calendarId': calendarId}, + ); + } + + @override + Future>> listEvents( + DateTime startDate, + DateTime endDate, + List? calendarIds, + ) async { + final result = await methodChannel.invokeMethod>( + 'listEvents', + { + 'startDate': startDate.millisecondsSinceEpoch, + 'endDate': endDate.millisecondsSinceEpoch, + 'calendarIds': calendarIds, + }, + ); + return result?.map((e) => Map.from(e as Map)).toList() ?? + []; + } + + @override + Future?> getEvent(String instanceId) async { + final result = await methodChannel.invokeMethod>( + 'getEvent', + { + 'instanceId': instanceId, + }, + ); + return result != null ? Map.from(result) : null; + } + + @override + Future showEventModal(String instanceId) async { + await methodChannel.invokeMethod( + 'showEventModal', + {'instanceId': instanceId}, + ); + } + + @override + Future createEvent( + String calendarId, + String title, + DateTime startDate, + DateTime endDate, + bool isAllDay, + int? reminderMinutes, + String? description, + String? location, + String? timeZone, + String availability, + ) async { + print("createEvent2ios: the reminder minutes are $reminderMinutes"); + + final result = await methodChannel.invokeMethod( + 'createEvent', + { + 'calendarId': calendarId, + 'title': title, + 'startDate': startDate.millisecondsSinceEpoch, + 'endDate': endDate.millisecondsSinceEpoch, + 'isAllDay': isAllDay, + 'description': description, + 'location': location, + 'timeZone': timeZone, + 'availability': availability, + 'reminderMinutes': reminderMinutes, + }, + ); + return result!; + } + + @override + Future deleteEvent(String instanceId) async { + await methodChannel.invokeMethod( + 'deleteEvent', + { + 'instanceId': instanceId, + }, + ); + } + + @override + Future updateEvent( + String instanceId, { + String? title, + DateTime? startDate, + DateTime? endDate, + String? description, + String? location, + bool? isAllDay, + String? timeZone, + }) async { + await methodChannel.invokeMethod( + 'updateEvent', + { + 'instanceId': instanceId, + 'title': title, + 'startDate': startDate?.millisecondsSinceEpoch, + 'endDate': endDate?.millisecondsSinceEpoch, + 'description': description, + 'location': location, + 'isAllDay': isAllDay, + 'timeZone': timeZone, + }, + ); + } +} diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/pubspec.yaml b/package/device_calendar_plus/package/device_calendar_plus_ios/pubspec.yaml new file mode 100644 index 00000000..f4f21f92 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/pubspec.yaml @@ -0,0 +1,63 @@ +name: device_calendar_plus_ios +description: iOS implementation of the device_calendar_plus plugin. +version: 0.3.1 +repository: https://github.com/bullet-to/device_calendar_plus + + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=3.3.0" + +dependencies: + flutter: + sdk: flutter + device_calendar_plus_platform_interface: + path: ../device_calendar_plus_platform_interface + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + plugin: + implements: device_calendar_plus + platforms: + ios: + pluginClass: DeviceCalendarPlusIosPlugin + dartPluginClass: DeviceCalendarPlusIos + + # To add assets to your plugin package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your plugin package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/to/font-from-package diff --git a/package/device_calendar_plus/package/device_calendar_plus_ios/test/device_calendar_plus_ios_test.dart b/package/device_calendar_plus/package/device_calendar_plus_ios/test/device_calendar_plus_ios_test.dart new file mode 100644 index 00000000..9ed3f9ed --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_ios/test/device_calendar_plus_ios_test.dart @@ -0,0 +1,312 @@ +// import 'package:device_calendar_plus_ios/device_calendar_plus_ios.dart'; +// import 'package:device_calendar_plus_platform_interface/device_calendar_plus_platform_interface.dart'; +// import 'package:flutter/services.dart'; +// import 'package:flutter_test/flutter_test.dart'; +// +// void main() { +// TestWidgetsFlutterBinding.ensureInitialized(); +// +// group('DeviceCalendarPlusIos', () { +// late DeviceCalendarPlusIos plugin; +// late List log; +// +// setUp(() async { +// plugin = DeviceCalendarPlusIos(); +// +// log = []; +// TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger +// .setMockMethodCallHandler(plugin.methodChannel, (methodCall) async { +// log.add(methodCall); +// switch (methodCall.method) { +// case 'requestPermissions': +// return 'granted'; // CalendarPermissionStatus.granted +// case 'hasPermissions': +// return 'granted'; // CalendarPermissionStatus.granted +// case 'openAppSettings': +// return null; +// case 'listCalendars': +// return [ +// { +// 'id': '1', +// 'name': 'Work', +// 'readOnly': false, +// 'isPrimary': true, +// 'hidden': false, +// } +// ]; +// case 'createCalendar': +// return 'test-calendar-id-123'; +// case 'updateCalendar': +// return null; +// case 'deleteCalendar': +// return null; +// case 'listEvents': +// return [ +// { +// 'eventId': 'event1', +// 'calendarId': 'cal1', +// 'title': 'Test Event', +// 'startDate': DateTime.now().millisecondsSinceEpoch, +// 'endDate': DateTime.now().millisecondsSinceEpoch, +// 'isAllDay': false, +// 'availability': 'busy', +// 'status': 'confirmed', +// } +// ]; +// case 'createEvent': +// return 'ios-event-id-456'; +// case 'deleteEvent': +// return null; +// case 'updateEvent': +// return null; +// default: +// return null; +// } +// }); +// }); +// +// test('can be registered', () { +// DeviceCalendarPlusIos.registerWith(); +// expect(DeviceCalendarPlusPlatform.instance, isA()); +// }); +// +// test('requestPermissions returns granted status', () async { +// final status = await plugin.requestPermissions(); +// expect( +// log, +// [isMethodCall('requestPermissions', arguments: null)], +// ); +// expect(status, equals('granted')); // CalendarPermissionStatus.granted +// }); +// +// test('hasPermissions returns granted status', () async { +// final status = await plugin.hasPermissions(); +// expect( +// log, +// [isMethodCall('hasPermissions', arguments: null)], +// ); +// expect(status, equals('granted')); // CalendarPermissionStatus.granted +// }); +// +// test('openAppSettings calls method', () async { +// await plugin.openAppSettings(); +// expect( +// log, +// [isMethodCall('openAppSettings', arguments: null)], +// ); +// }); +// +// test('listCalendars returns list of calendars', () async { +// final calendars = await plugin.listCalendars(); +// expect( +// log, +// [isMethodCall('listCalendars', arguments: null)], +// ); +// expect(calendars, hasLength(1)); +// expect(calendars[0]['id'], equals('1')); +// expect(calendars[0]['name'], equals('Work')); +// }); +// +// test('createCalendar with name only', () async { +// final calendarId = await plugin.createCalendar('My Calendar', null); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('createCalendar')); +// expect(log[0].arguments['name'], equals('My Calendar')); +// expect(log[0].arguments['colorHex'], isNull); +// expect(calendarId, equals('test-calendar-id-123')); +// }); +// +// test('createCalendar with name and color', () async { +// final calendarId = +// await plugin.createCalendar('Work Calendar', '#FF5733'); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('createCalendar')); +// expect(log[0].arguments['name'], equals('Work Calendar')); +// expect(log[0].arguments['colorHex'], equals('#FF5733')); +// expect(calendarId, equals('test-calendar-id-123')); +// }); +// +// test('updateCalendar with name only', () async { +// await plugin.updateCalendar('cal-123', 'Updated Name', null); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('updateCalendar')); +// expect(log[0].arguments['calendarId'], equals('cal-123')); +// expect(log[0].arguments['name'], equals('Updated Name')); +// expect(log[0].arguments['colorHex'], isNull); +// }); +// +// test('updateCalendar with name and color', () async { +// await plugin.updateCalendar('cal-123', 'Updated Name', '#00FF00'); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('updateCalendar')); +// expect(log[0].arguments['calendarId'], equals('cal-123')); +// expect(log[0].arguments['name'], equals('Updated Name')); +// expect(log[0].arguments['colorHex'], equals('#00FF00')); +// }); +// +// test('deleteCalendar calls method with correct arguments', () async { +// await plugin.deleteCalendar('cal-123'); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('deleteCalendar')); +// expect(log[0].arguments['calendarId'], equals('cal-123')); +// }); +// +// test('listEvents returns list of events', () async { +// final now = DateTime.now(); +// final later = now.add(Duration(days: 7)); +// +// final events = await plugin.listEvents(now, later, ['cal1']); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('listEvents')); +// expect(log[0].arguments['startDate'], equals(now.millisecondsSinceEpoch)); +// expect(log[0].arguments['endDate'], equals(later.millisecondsSinceEpoch)); +// expect(log[0].arguments['calendarIds'], equals(['cal1'])); +// +// expect(events, hasLength(1)); +// expect(events[0]['eventId'], equals('event1')); +// expect(events[0]['title'], equals('Test Event')); +// }); +// +// test('createEvent with all parameters', () async { +// final startDate = DateTime(2024, 3, 15, 14, 0); +// final endDate = DateTime(2024, 3, 15, 15, 0); +// +// final eventId = await plugin.createEvent( +// 'cal-123', +// 'Team Meeting', +// startDate, +// endDate, +// false, +// 'Weekly sync', +// 'Conference Room A', +// 'America/New_York', +// 'busy', +// ); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('createEvent')); +// expect(log[0].arguments['calendarId'], equals('cal-123')); +// expect(log[0].arguments['title'], equals('Team Meeting')); +// expect(log[0].arguments['startDate'], +// equals(startDate.millisecondsSinceEpoch)); +// expect( +// log[0].arguments['endDate'], equals(endDate.millisecondsSinceEpoch)); +// expect(log[0].arguments['isAllDay'], equals(false)); +// expect(log[0].arguments['description'], equals('Weekly sync')); +// expect(log[0].arguments['location'], equals('Conference Room A')); +// expect(log[0].arguments['timeZone'], equals('America/New_York')); +// expect(log[0].arguments['availability'], equals('busy')); +// expect(eventId, equals('ios-event-id-456')); +// }); +// +// test('createEvent with minimal parameters', () async { +// final startDate = DateTime(2024, 3, 15, 14, 0); +// final endDate = DateTime(2024, 3, 15, 15, 0); +// +// final eventId = await plugin.createEvent( +// 'cal-123', +// 'Quick Event', +// startDate, +// endDate, +// true, +// null, +// null, +// null, +// 'free', +// ); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('createEvent')); +// expect(log[0].arguments['calendarId'], equals('cal-123')); +// expect(log[0].arguments['title'], equals('Quick Event')); +// expect(log[0].arguments['isAllDay'], equals(true)); +// expect(log[0].arguments['description'], isNull); +// expect(log[0].arguments['location'], isNull); +// expect(log[0].arguments['timeZone'], isNull); +// expect(log[0].arguments['availability'], equals('free')); +// expect(eventId, equals('ios-event-id-456')); +// }); +// +// test('deleteEvent calls method with correct arguments', () async { +// await plugin.deleteEvent('event-123'); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('deleteEvent')); +// expect(log[0].arguments['instanceId'], equals('event-123')); +// }); +// +// test('deleteEvent for recurring event deletes entire series', () async { +// await plugin.deleteEvent('event-123@123456789'); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('deleteEvent')); +// expect(log[0].arguments['instanceId'], equals('event-123@123456789')); +// }); +// +// test('updateEvent with all parameters', () async { +// final startDate = DateTime(2024, 3, 20, 10, 0); +// final endDate = DateTime(2024, 3, 20, 11, 0); +// +// await plugin.updateEvent( +// 'event-123', +// title: 'Updated Title', +// startDate: startDate, +// endDate: endDate, +// description: 'Updated description', +// location: 'Updated location', +// isAllDay: false, +// timeZone: 'America/New_York', +// ); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('updateEvent')); +// expect(log[0].arguments['instanceId'], equals('event-123')); +// expect(log[0].arguments['title'], equals('Updated Title')); +// expect(log[0].arguments['startDate'], +// equals(startDate.millisecondsSinceEpoch)); +// expect( +// log[0].arguments['endDate'], equals(endDate.millisecondsSinceEpoch)); +// expect(log[0].arguments['description'], equals('Updated description')); +// expect(log[0].arguments['location'], equals('Updated location')); +// expect(log[0].arguments['isAllDay'], equals(false)); +// expect(log[0].arguments['timeZone'], equals('America/New_York')); +// }); +// +// test('updateEvent with minimal parameters', () async { +// await plugin.updateEvent( +// 'event-123', +// title: 'New Title', +// ); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('updateEvent')); +// expect(log[0].arguments['instanceId'], equals('event-123')); +// expect(log[0].arguments['title'], equals('New Title')); +// expect(log[0].arguments['startDate'], isNull); +// expect(log[0].arguments['endDate'], isNull); +// expect(log[0].arguments['description'], isNull); +// expect(log[0].arguments['location'], isNull); +// expect(log[0].arguments['isAllDay'], isNull); +// expect(log[0].arguments['timeZone'], isNull); +// expect(log[0].arguments['availability'], isNull); +// }); +// +// test('updateEvent for recurring event updates entire series', () async { +// await plugin.updateEvent( +// 'event-123', +// title: 'Updated Series', +// ); +// +// expect(log.length, equals(1)); +// expect(log[0].method, equals('updateEvent')); +// expect(log[0].arguments['instanceId'], equals('event-123')); +// expect(log[0].arguments['title'], equals('Updated Series')); +// }); +// }); +// } diff --git a/package/device_calendar_plus/package/device_calendar_plus_platform_interface/CHANGELOG.md b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/CHANGELOG.md new file mode 100644 index 00000000..ef23deb7 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/CHANGELOG.md @@ -0,0 +1,28 @@ +## 0.3.1 - 2025-11-07 + +Version sync with other packages. No functional changes. + +## 0.3.0 - 2024-11-05 + +### Changed +- **BREAKING**: `deleteEvent()` signature changed - removed `deleteAllInstances` parameter, operations on recurring events now always delete entire series +- **BREAKING**: `updateEvent()` signature changed - removed `updateAllInstances` parameter, operations on recurring events now always update entire series + +### Removed +- **BREAKING**: `NOT_SUPPORTED` platform exception code (no longer needed) + +## 0.2.0 - 2024-11-05 + +### Added +- `openAppSettings()` method to direct users to app settings for permission management + +### Removed +- **BREAKING**: `getPlatformVersion()` method (unused boilerplate) + +## 0.1.1 - 2024-11-04 + +Version sync with other packages. No functional changes. + +## 0.1.0 - 2024-11-04 + +Initial release. \ No newline at end of file diff --git a/package/device_calendar_plus/package/device_calendar_plus_platform_interface/LICENSE b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/LICENSE new file mode 100644 index 00000000..0152eb2c --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 bullet.to + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/package/device_calendar_plus/package/device_calendar_plus_platform_interface/README.md b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/README.md new file mode 100644 index 00000000..861d0ab2 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/README.md @@ -0,0 +1,25 @@ +# device_calendar_plus_platform_interface + +Platform interface for the `device_calendar_plus` plugin. + +This package defines the interface that platform implementations must implement. It is not intended to be used directly by application developers. + +## For App Developers + +If you're building a Flutter app, use the main [`device_calendar_plus`](https://pub.dev/packages/device_calendar_plus) package instead. + +## For Plugin Developers + +This package contains: +- Method channel constants and method names +- Platform interface abstract class +- Data serialization contracts for calendars and events +- Permission status and error code definitions + +Platform implementations: +- [`device_calendar_plus_android`](https://pub.dev/packages/device_calendar_plus_android) - Android implementation +- [`device_calendar_plus_ios`](https://pub.dev/packages/device_calendar_plus_ios) - iOS implementation + +## License + +MIT © 2025 Bullet diff --git a/package/device_calendar_plus/package/device_calendar_plus_platform_interface/analysis_options.yaml b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/analysis_options.yaml new file mode 100644 index 00000000..a5744c1c --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/analysis_options.yaml @@ -0,0 +1,4 @@ +include: package:flutter_lints/flutter.yaml + +# Additional information about this file can be found at +# https://dart.dev/guides/language/analysis-options diff --git a/package/device_calendar_plus/package/device_calendar_plus_platform_interface/lib/device_calendar_plus_platform_interface.dart b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/lib/device_calendar_plus_platform_interface.dart new file mode 100644 index 00000000..8c82f78d --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/lib/device_calendar_plus_platform_interface.dart @@ -0,0 +1,201 @@ +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + +/// The interface that implementations of device_calendar_plus must implement. +/// +/// Platform implementations should extend this class rather than implement it +/// as `DeviceCalendar`. Extending this class (using `extends`) ensures that +/// the subclass will get the default implementation, while platform +/// implementations that `implements` this interface will be broken by newly +/// added [DeviceCalendarPlusPlatform] methods. +abstract class DeviceCalendarPlusPlatform extends PlatformInterface { + DeviceCalendarPlusPlatform() : super(token: _token); + + static final Object _token = Object(); + + static DeviceCalendarPlusPlatform? _instance; + + /// The default instance of [DeviceCalendarPlusPlatform] to use. + /// + /// Platform-specific implementations (Android/iOS) set this automatically. + static DeviceCalendarPlusPlatform get instance { + if (_instance == null) { + throw StateError( + 'DeviceCalendarPlusPlatform.instance has not been initialized. ' + 'This should never happen in production as platform-specific ' + 'implementations register themselves automatically.', + ); + } + return _instance!; + } + + /// Platform-specific plugins should set this with their own platform-specific + /// class that extends [DeviceCalendarPlusPlatform] when they register themselves. + static set instance(DeviceCalendarPlusPlatform instance) { + PlatformInterface.verify(instance, _token); + _instance = instance; + } + + /// Requests calendar permissions from the user. + /// + /// On first call, this will show the system permission dialog. + /// On subsequent calls, it returns the current permission status. + /// + /// Returns the raw string status value from the platform. + /// The main API layer converts this to [CalendarPermissionStatus]. + Future requestPermissions(); + + /// Checks the current calendar permission status WITHOUT requesting permissions. + /// + /// Unlike [requestPermissions], this method will NOT prompt the user for + /// permissions if they haven't been granted yet. It only checks the current status. + /// + /// Returns the raw string status value from the platform. + /// The main API layer converts this to [CalendarPermissionStatus]. + Future hasPermissions(); + + /// Opens the app's settings page in the system settings. + /// + /// This is useful when permissions have been denied and you want to guide + /// the user to manually enable calendar permissions in the system settings. + /// + /// On iOS, opens the app's specific settings page. + /// On Android, opens the app info page where users can navigate to permissions. + Future openAppSettings(); + + /// Lists all calendars available on the device. + /// + /// Returns a list of calendar data as maps. The main API layer + /// converts these to [DeviceCalendar] objects. + Future>> listCalendars(); + + /// Creates a new calendar on the device. + /// + /// [name] is the display name for the calendar (required). + /// [colorHex] is an optional color in #RRGGBB format. + /// + /// Returns the ID of the newly created calendar. + /// + /// The calendar is created in the device's local storage. + /// Requires calendar write permissions. + Future createCalendar(String name, String? colorHex); + + /// Updates an existing calendar on the device. + /// + /// [calendarId] is the ID of the calendar to update. + /// [name] is the new display name for the calendar (optional). + /// [colorHex] is the new color in #RRGGBB format (optional). + /// + /// At least one of [name] or [colorHex] must be provided. + /// Requires calendar write permissions. + Future updateCalendar( + String calendarId, String? name, String? colorHex); + + /// Deletes a calendar from the device. + /// + /// [calendarId] is the ID of the calendar to delete. + /// + /// This will also delete all events within the calendar. + /// Requires calendar write permissions. + Future deleteCalendar(String calendarId); + + /// Lists events within the specified date range. + /// + /// Returns a list of event data as maps. The main API layer + /// converts these to [Event] objects. + Future>> listEvents( + DateTime startDate, + DateTime endDate, + List? calendarIds, + ); + + /// Retrieves a single event by instance ID. + /// + /// [instanceId] uniquely identifies the event instance: + /// - For non-recurring events: Just the eventId + /// - For recurring events: "eventId@rawTimestampMillis" format + /// + /// Returns event data as a map (including instanceId field), or null if not found. + Future?> getEvent(String instanceId); + + /// Shows a calendar event in a modal dialog. + /// + /// [instanceId] uniquely identifies the event instance to show: + /// - For non-recurring events: Just the eventId + /// - For recurring events: "eventId@rawTimestampMillis" format + /// + /// On iOS, presents the event in a modal using EKEventViewController. + /// On Android, opens the event using an Intent with ACTION_VIEW. + Future showEventModal(String instanceId); + + /// Creates a new event in the specified calendar. + /// + /// [calendarId] is the ID of the calendar to create the event in. + /// [title] is the event title. + /// [startDate] is the start date/time. + /// [endDate] is the end date/time. + /// [isAllDay] indicates if this is an all-day event. + /// [description] is optional event notes/description. + /// [location] is optional event location. + /// [timeZone] is optional timezone identifier (null for all-day events). + /// [availability] is the availability status (busy, free, tentative, unavailable). + /// + /// Returns the ID of the newly created event (system-generated). + /// Requires calendar write permissions. + Future createEvent( + String calendarId, + String title, + DateTime startDate, + DateTime endDate, + bool isAllDay, + int? reminderMinutes, + String? description, + String? location, + String? timeZone, + String availability, + ); + + /// Deletes an event from the device. + /// + /// [instanceId] uniquely identifies the event instance to delete: + /// - For non-recurring events: Just the eventId + /// - For recurring events: "eventId@rawTimestampMillis" format + /// + /// **For recurring events**: This will delete the ENTIRE series (all past and + /// future occurrences). Single-instance deletion is not supported to maintain + /// consistent behavior across platforms. + /// + /// Requires calendar write permissions. + Future deleteEvent(String instanceId); + + /// Updates an existing event on the device. + /// + /// [instanceId] uniquely identifies the event instance to update: + /// - For non-recurring events: Just the eventId + /// - For recurring events: "eventId@rawTimestampMillis" format + /// + /// **For recurring events**: This will update the ENTIRE series (all past and + /// future occurrences). Single-instance updates are not supported to maintain + /// consistent behavior across platforms. + /// + /// All field parameters are optional - only provided fields will be updated: + /// - [title] - new event title + /// - [startDate] - new start date/time + /// - [endDate] - new end date/time + /// - [description] - new event description + /// - [location] - new event location + /// - [isAllDay] - change between all-day and timed event + /// - [timeZone] - new timezone identifier + /// + /// At least one field must be provided. + /// Requires calendar write permissions. + Future updateEvent( + String instanceId, { + String? title, + DateTime? startDate, + DateTime? endDate, + String? description, + String? location, + bool? isAllDay, + String? timeZone, + }); +} diff --git a/package/device_calendar_plus/package/device_calendar_plus_platform_interface/pubspec.yaml b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/pubspec.yaml new file mode 100644 index 00000000..ca8808f5 --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/pubspec.yaml @@ -0,0 +1,56 @@ +name: device_calendar_plus_platform_interface +description: Platform interface for device_calendar_plus plugin. +version: 0.3.1 +repository: https://github.com/bullet-to/device_calendar_plus + + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=3.3.0" + +dependencies: + flutter: + sdk: flutter + plugin_platform_interface: ^2.1.0 + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/to/font-from-package diff --git a/package/device_calendar_plus/package/device_calendar_plus_platform_interface/test/device_calendar_plus_platform_interface_test.dart b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/test/device_calendar_plus_platform_interface_test.dart new file mode 100644 index 00000000..bc1f9acf --- /dev/null +++ b/package/device_calendar_plus/package/device_calendar_plus_platform_interface/test/device_calendar_plus_platform_interface_test.dart @@ -0,0 +1,225 @@ +// import 'package:device_calendar_plus_platform_interface/device_calendar_plus_platform_interface.dart'; +// import 'package:flutter_test/flutter_test.dart'; +// import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +// +// class MockDeviceCalendarPlusPlatform extends DeviceCalendarPlusPlatform +// with MockPlatformInterfaceMixin { +// @override +// Future requestPermissions() async => "granted"; +// +// @override +// Future hasPermissions() async => "granted"; +// +// @override +// Future openAppSettings() async {} +// +// @override +// Future>> listCalendars() async => []; +// +// @override +// Future createCalendar(String name, String? colorHex) async => +// 'mock-calendar-id'; +// +// @override +// Future updateCalendar( +// String calendarId, String? name, String? colorHex) async {} +// +// @override +// Future deleteCalendar(String calendarId) async {} +// +// @override +// Future>> listEvents( +// DateTime startDate, +// DateTime endDate, +// List? calendarIds, +// ) async => +// []; +// +// @override +// Future?> getEvent(String instanceId) async => null; +// +// @override +// Future showEventModal(String instanceId) async {} +// +// @override +// Future createEvent( +// String calendarId, +// String title, +// DateTime startDate, +// DateTime endDate, +// bool isAllDay, +// String? description, +// String? location, +// String? timeZone, +// String availability, +// ) async => +// 'mock-event-id'; +// +// @override +// Future deleteEvent(String instanceId) async {} +// +// @override +// Future updateEvent( +// String instanceId, { +// String? title, +// DateTime? startDate, +// DateTime? endDate, +// String? description, +// String? location, +// bool? isAllDay, +// String? timeZone, +// String? availability, +// }) async {} +// } +// +// void main() { +// test('can set and get custom instance', () { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// expect(DeviceCalendarPlusPlatform.instance, mock); +// }); +// +// test('requestPermissions returns expected value', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// expect(await DeviceCalendarPlusPlatform.instance.requestPermissions(), +// 'granted'); +// }); +// +// test('hasPermissions returns expected value', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// expect( +// await DeviceCalendarPlusPlatform.instance.hasPermissions(), 'granted'); +// }); +// +// test('openAppSettings completes successfully', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// await DeviceCalendarPlusPlatform.instance.openAppSettings(); +// // Should complete without error +// }); +// +// test('listCalendars returns expected value', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// expect(await DeviceCalendarPlusPlatform.instance.listCalendars(), []); +// }); +// +// test('createCalendar returns expected value', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// final calendarId = await DeviceCalendarPlusPlatform.instance +// .createCalendar('Test Calendar', '#FF5733'); +// expect(calendarId, equals('mock-calendar-id')); +// }); +// +// test('updateCalendar completes', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// await DeviceCalendarPlusPlatform.instance +// .updateCalendar('calendar-123', 'New Name', '#00FF00'); +// // Should complete without error +// }); +// +// test('deleteCalendar completes', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// await DeviceCalendarPlusPlatform.instance.deleteCalendar('calendar-123'); +// // Should complete without error +// }); +// +// test('listEvents returns expected value', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// final result = await DeviceCalendarPlusPlatform.instance.listEvents( +// DateTime.now(), +// DateTime.now().add(Duration(days: 7)), +// null, +// ); +// expect(result, []); +// }); +// +// test('getEvent returns expected value', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// final result = +// await DeviceCalendarPlusPlatform.instance.getEvent('event-123'); +// expect(result, null); +// }); +// +// test('showEventModal completes', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// await DeviceCalendarPlusPlatform.instance.showEventModal('event-123'); +// // Should complete without error +// }); +// +// test('createEvent returns expected value', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// final eventId = await DeviceCalendarPlusPlatform.instance.createEvent( +// 'calendar-123', +// 'Team Meeting', +// DateTime(2024, 3, 15, 14, 0), +// DateTime(2024, 3, 15, 15, 0), +// false, +// 'Weekly team sync', +// 'Conference Room A', +// 'America/New_York', +// 'busy', +// ); +// expect(eventId, equals('mock-event-id')); +// }); +// +// test('deleteEvent completes', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// await DeviceCalendarPlusPlatform.instance.deleteEvent('event-123'); +// // Should complete without error +// }); +// +// test('deleteEvent for recurring event deletes entire series', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// await DeviceCalendarPlusPlatform.instance +// .deleteEvent('event-123@123456789'); +// // Should complete without error +// }); +// +// test('updateEvent with all parameters completes', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// await DeviceCalendarPlusPlatform.instance.updateEvent( +// 'event-123', +// title: 'Updated Title', +// startDate: DateTime(2024, 3, 20, 10, 0), +// endDate: DateTime(2024, 3, 20, 11, 0), +// description: 'Updated description', +// location: 'Updated location', +// isAllDay: false, +// timeZone: 'America/New_York', +// ); +// // Should complete without error +// }); +// +// test('updateEvent with minimal parameters completes', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// await DeviceCalendarPlusPlatform.instance.updateEvent( +// 'event-123', +// title: 'New Title', +// ); +// // Should complete without error +// }); +// +// test('updateEvent for recurring event updates entire series', () async { +// final mock = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mock; +// await DeviceCalendarPlusPlatform.instance.updateEvent( +// 'event-123', +// title: 'Updated Series', +// ); +// // Should complete without error +// }); +// } diff --git a/package/device_calendar_plus/pubspec.lock b/package/device_calendar_plus/pubspec.lock new file mode 100644 index 00000000..a5f5289d --- /dev/null +++ b/package/device_calendar_plus/pubspec.lock @@ -0,0 +1,237 @@ +# Generated by pub +# See https://dart.dev/tools/pub/glossary#lockfile +packages: + async: + dependency: transitive + description: + name: async + sha256: "758e6d74e971c3e5aceb4110bfd6698efc7f501675bcfe0c775459a8140750eb" + url: "https://pub.dev" + source: hosted + version: "2.13.0" + boolean_selector: + dependency: transitive + description: + name: boolean_selector + sha256: "8aab1771e1243a5063b8b0ff68042d67334e3feab9e95b9490f9a6ebf73b42ea" + url: "https://pub.dev" + source: hosted + version: "2.1.2" + characters: + dependency: transitive + description: + name: characters + sha256: f71061c654a3380576a52b451dd5532377954cf9dbd272a78fc8479606670803 + url: "https://pub.dev" + source: hosted + version: "1.4.0" + clock: + dependency: transitive + description: + name: clock + sha256: fddb70d9b5277016c77a80201021d40a2247104d9f4aa7bab7157b7e3f05b84b + url: "https://pub.dev" + source: hosted + version: "1.1.2" + collection: + dependency: transitive + description: + name: collection + sha256: "2f5709ae4d3d59dd8f7cd309b4e023046b57d8a6c82130785d2b0e5868084e76" + url: "https://pub.dev" + source: hosted + version: "1.19.1" + device_calendar_plus_android: + dependency: "direct main" + description: + name: device_calendar_plus_android + sha256: f66f363273e0b174fdb3f98030a8c67ae9e9dfcb6122e4ca842881f976313db0 + url: "https://pub.dev" + source: hosted + version: "0.3.1" + device_calendar_plus_ios: + dependency: "direct main" + description: + name: device_calendar_plus_ios + sha256: c9b234091d3edc78871ed524077c262ce66217b960b7942ef071032e47b60fa8 + url: "https://pub.dev" + source: hosted + version: "0.3.1" + device_calendar_plus_platform_interface: + dependency: "direct main" + description: + name: device_calendar_plus_platform_interface + sha256: fb4d893d04b10ab00bc175be8a374aad08a7c4ad7d763c7ff48036d76be7604b + url: "https://pub.dev" + source: hosted + version: "0.3.1" + fake_async: + dependency: transitive + description: + name: fake_async + sha256: "5368f224a74523e8d2e7399ea1638b37aecfca824a3cc4dfdf77bf1fa905ac44" + url: "https://pub.dev" + source: hosted + version: "1.3.3" + flutter: + dependency: "direct main" + description: flutter + source: sdk + version: "0.0.0" + flutter_lints: + dependency: "direct dev" + description: + name: flutter_lints + sha256: "5398f14efa795ffb7a33e9b6a08798b26a180edac4ad7db3f231e40f82ce11e1" + url: "https://pub.dev" + source: hosted + version: "5.0.0" + flutter_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" + leak_tracker: + dependency: transitive + description: + name: leak_tracker + sha256: "33e2e26bdd85a0112ec15400c8cbffea70d0f9c3407491f672a2fad47915e2de" + url: "https://pub.dev" + source: hosted + version: "11.0.2" + leak_tracker_flutter_testing: + dependency: transitive + description: + name: leak_tracker_flutter_testing + sha256: "1dbc140bb5a23c75ea9c4811222756104fbcd1a27173f0c34ca01e16bea473c1" + url: "https://pub.dev" + source: hosted + version: "3.0.10" + leak_tracker_testing: + dependency: transitive + description: + name: leak_tracker_testing + sha256: "8d5a2d49f4a66b49744b23b018848400d23e54caf9463f4eb20df3eb8acb2eb1" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + lints: + dependency: transitive + description: + name: lints + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 + url: "https://pub.dev" + source: hosted + version: "5.1.1" + matcher: + dependency: transitive + description: + name: matcher + sha256: dc58c723c3c24bf8d3e2d3ad3f2f9d7bd9cf43ec6feaa64181775e60190153f2 + url: "https://pub.dev" + source: hosted + version: "0.12.17" + material_color_utilities: + dependency: transitive + description: + name: material_color_utilities + sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec + url: "https://pub.dev" + source: hosted + version: "0.11.1" + meta: + dependency: transitive + description: + name: meta + sha256: e3641ec5d63ebf0d9b41bd43201a66e3fc79a65db5f61fc181f04cd27aab950c + url: "https://pub.dev" + source: hosted + version: "1.16.0" + path: + dependency: transitive + description: + name: path + sha256: "75cca69d1490965be98c73ceaea117e8a04dd21217b37b292c9ddbec0d955bc5" + url: "https://pub.dev" + source: hosted + version: "1.9.1" + plugin_platform_interface: + dependency: "direct dev" + description: + name: plugin_platform_interface + sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" + url: "https://pub.dev" + source: hosted + version: "2.1.8" + sky_engine: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" + source_span: + dependency: transitive + description: + name: source_span + sha256: "56a02f1f4cd1a2d96303c0144c93bd6d909eea6bee6bf5a0e0b685edbd4c47ab" + url: "https://pub.dev" + source: hosted + version: "1.10.2" + stack_trace: + dependency: transitive + description: + name: stack_trace + sha256: "8b27215b45d22309b5cddda1aa2b19bdfec9df0e765f2de506401c071d38d1b1" + url: "https://pub.dev" + source: hosted + version: "1.12.1" + stream_channel: + dependency: transitive + description: + name: stream_channel + sha256: "969e04c80b8bcdf826f8f16579c7b14d780458bd97f56d107d3950fdbeef059d" + url: "https://pub.dev" + source: hosted + version: "2.1.4" + string_scanner: + dependency: transitive + description: + name: string_scanner + sha256: "921cd31725b72fe181906c6a94d987c78e3b98c2e205b397ea399d4054872b43" + url: "https://pub.dev" + source: hosted + version: "1.4.1" + term_glyph: + dependency: transitive + description: + name: term_glyph + sha256: "7f554798625ea768a7518313e58f83891c7f5024f88e46e7182a4558850a4b8e" + url: "https://pub.dev" + source: hosted + version: "1.2.2" + test_api: + dependency: transitive + description: + name: test_api + sha256: "522f00f556e73044315fa4585ec3270f1808a4b186c936e612cab0b565ff1e00" + url: "https://pub.dev" + source: hosted + version: "0.7.6" + vector_math: + dependency: transitive + description: + name: vector_math + sha256: d530bd74fea330e6e364cda7a85019c434070188383e1cd8d9777ee586914c5b + url: "https://pub.dev" + source: hosted + version: "2.2.0" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + url: "https://pub.dev" + source: hosted + version: "15.0.2" +sdks: + dart: ">=3.8.0-0 <4.0.0" + flutter: ">=3.18.0-18.0.pre.54" diff --git a/package/device_calendar_plus/pubspec.yaml b/package/device_calendar_plus/pubspec.yaml new file mode 100644 index 00000000..cf5779bf --- /dev/null +++ b/package/device_calendar_plus/pubspec.yaml @@ -0,0 +1,77 @@ +name: device_calendar_plus +description: A modern, maintained Flutter plugin for reading and writing device calendar events on Android and iOS. +version: 0.3.1 +repository: https://github.com/bullet-to/device_calendar_plus +issue_tracker: https://github.com/bullet-to/device_calendar_plus/issues + + +topics: + - calendar + - events + - eventkit + - calendar-provider + - federated + +environment: + sdk: ">=3.5.0 <4.0.0" + flutter: ">=3.3.0" + +dependencies: + flutter: + sdk: flutter + device_calendar_plus_platform_interface: + path: ./package/device_calendar_plus_platform_interface + device_calendar_plus_android: + path: ./package/device_calendar_plus_android + device_calendar_plus_ios: + path: ./package/device_calendar_plus_ios + + +dev_dependencies: + flutter_test: + sdk: flutter + flutter_lints: ^5.0.0 + plugin_platform_interface: ^2.1.0 + +# For information on the generic Dart part of this file, see the +# following page: https://dart.dev/tools/pub/pubspec + +# The following section is specific to Flutter packages. +flutter: + plugin: + platforms: + android: + default_package: device_calendar_plus_android + ios: + default_package: device_calendar_plus_ios + + # To add assets to your package, add an assets section, like this: + # assets: + # - images/a_dot_burr.jpeg + # - images/a_dot_ham.jpeg + # + # For details regarding assets in packages, see + # https://flutter.dev/to/asset-from-package + # + # An image asset can refer to one or more resolution-specific "variants", see + # https://flutter.dev/to/resolution-aware-images + + # To add custom fonts to your package, add a fonts section here, + # in this "flutter" section. Each entry in this list should have a + # "family" key with the font family name, and a "fonts" key with a + # list giving the asset and other descriptors for the font. For + # example: + # fonts: + # - family: Schyler + # fonts: + # - asset: fonts/Schyler-Regular.ttf + # - asset: fonts/Schyler-Italic.ttf + # style: italic + # - family: Trajan Pro + # fonts: + # - asset: fonts/TrajanPro.ttf + # - asset: fonts/TrajanPro_Bold.ttf + # weight: 700 + # + # For details regarding fonts in packages, see + # https://flutter.dev/to/font-from-package diff --git a/package/device_calendar_plus/test/device_calendar_plus_test.dart b/package/device_calendar_plus/test/device_calendar_plus_test.dart new file mode 100644 index 00000000..8a687e31 --- /dev/null +++ b/package/device_calendar_plus/test/device_calendar_plus_test.dart @@ -0,0 +1,1348 @@ +// import 'package:device_calendar_plus/device_calendar_plus.dart'; +// import 'package:device_calendar_plus_platform_interface/device_calendar_plus_platform_interface.dart'; +// import 'package:flutter/services.dart'; +// import 'package:flutter_test/flutter_test.dart'; +// import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +// +// class MockDeviceCalendarPlusPlatform extends DeviceCalendarPlusPlatform +// with MockPlatformInterfaceMixin { +// String? _permissionStatusCode = +// "notDetermined"; // CalendarPermissionStatus.notDetermined.name +// List> _calendars = []; +// List> _events = []; +// Map? _event; +// PlatformException? _exceptionToThrow; +// +// // Callback to capture createEvent arguments +// Future Function( +// String calendarId, +// String title, +// DateTime startDate, +// DateTime endDate, +// bool isAllDay, +// String? description, +// String? location, +// String? timeZone, +// String availability, +// )? _createEventCallback; +// +// // Callback to capture updateEvent arguments +// Future Function( +// String instanceId, { +// String? title, +// DateTime? startDate, +// DateTime? endDate, +// String? description, +// String? location, +// bool? isAllDay, +// String? timeZone, +// String? availability, +// })? _updateEventCallback; +// +// void setPermissionStatus(CalendarPermissionStatus status) { +// _permissionStatusCode = status.name; +// } +// +// void setCalendars(List> calendars) { +// _calendars = calendars; +// } +// +// void setEvents(List> events) { +// _events = events; +// } +// +// void setEvent(Map? event) { +// _event = event; +// } +// +// void throwException(PlatformException exception) { +// _exceptionToThrow = exception; +// } +// +// void clearException() { +// _exceptionToThrow = null; +// } +// +// void setCreateEventCallback( +// Future Function( +// String calendarId, +// String title, +// DateTime startDate, +// DateTime endDate, +// bool isAllDay, +// String? description, +// String? location, +// String? timeZone, +// String availability, +// ) callback, +// ) { +// _createEventCallback = callback; +// } +// +// void setUpdateEventCallback( +// Future Function( +// String instanceId, { +// String? title, +// DateTime? startDate, +// DateTime? endDate, +// String? description, +// String? location, +// bool? isAllDay, +// String? timeZone, +// String? availability, +// }) callback, +// ) { +// _updateEventCallback = callback; +// } +// +// @override +// Future requestPermissions() async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// return _permissionStatusCode; +// } +// +// @override +// Future hasPermissions() async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// return _permissionStatusCode; +// } +// +// @override +// Future openAppSettings() async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// // Mock implementation - just returns successfully +// } +// +// @override +// Future>> listCalendars() async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// return _calendars; +// } +// +// @override +// Future createCalendar(String name, String? colorHex) async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// return 'mock-calendar-id-${DateTime.now().millisecondsSinceEpoch}'; +// } +// +// @override +// Future updateCalendar( +// String calendarId, String? name, String? colorHex) async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// } +// +// @override +// Future deleteCalendar(String calendarId) async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// } +// +// @override +// Future>> listEvents( +// DateTime startDate, +// DateTime endDate, +// List? calendarIds, +// ) async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// return _events; +// } +// +// @override +// Future?> getEvent(String instanceId) async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// return _event; +// } +// +// @override +// Future showEventModal(String instanceId) async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// // Mock implementation does nothing +// } +// +// @override +// Future createEvent( +// String calendarId, +// String title, +// DateTime startDate, +// DateTime endDate, +// bool isAllDay, +// String? description, +// String? location, +// String? timeZone, +// String availability, +// ) async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// +// // Use callback if set, otherwise return default +// if (_createEventCallback != null) { +// return _createEventCallback!( +// calendarId, +// title, +// startDate, +// endDate, +// isAllDay, +// description, +// location, +// timeZone, +// availability, +// ); +// } +// +// return 'mock-event-id-${DateTime.now().millisecondsSinceEpoch}'; +// } +// +// @override +// Future deleteEvent(String instanceId) async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// } +// +// @override +// Future updateEvent( +// String instanceId, { +// String? title, +// DateTime? startDate, +// DateTime? endDate, +// String? description, +// String? location, +// bool? isAllDay, +// String? timeZone, +// }) async { +// if (_exceptionToThrow != null) { +// throw _exceptionToThrow!; +// } +// if (_updateEventCallback != null) { +// return _updateEventCallback!( +// instanceId, +// title: title, +// startDate: startDate, +// endDate: endDate, +// description: description, +// location: location, +// isAllDay: isAllDay, +// timeZone: timeZone, +// ); +// } +// } +// } +// +// void main() { +// late MockDeviceCalendarPlusPlatform mockPlatform; +// +// setUp(() { +// mockPlatform = MockDeviceCalendarPlusPlatform(); +// DeviceCalendarPlusPlatform.instance = mockPlatform; +// }); +// +// group('DeviceCalendar', () { +// group('requestPermissions', () { +// group('status conversion', () { +// test('converts status code to CalendarPermissionStatus', () async { +// mockPlatform.setPermissionStatus(CalendarPermissionStatus.granted); +// final result = await DeviceCalendar.instance.requestPermissions(); +// expect(result, CalendarPermissionStatus.granted); +// }); +// }); +// +// group('edge case handling', () { +// test('defaults to denied when status is null', () async { +// mockPlatform._permissionStatusCode = null; +// final result = await DeviceCalendar.instance.requestPermissions(); +// expect(result, CalendarPermissionStatus.denied); +// }); +// }); +// +// group('error handling', () { +// test('throws DeviceCalendarException when permissions not declared', +// () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'PERMISSIONS_NOT_DECLARED', +// message: 'Calendar permissions must be declared', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.requestPermissions(), +// throwsA( +// isA().having( +// (e) => e.errorCode, +// 'errorCode', +// DeviceCalendarError.permissionsNotDeclared, +// ), +// ), +// ); +// }); +// +// test('rethrows other PlatformExceptions unchanged', () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'SOME_OTHER_ERROR', +// message: 'Something went wrong', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.requestPermissions(), +// throwsA( +// isA().having( +// (e) => e.code, +// 'code', +// 'SOME_OTHER_ERROR', +// ), +// ), +// ); +// }); +// }); +// }); +// +// group('hasPermissions', () { +// group('status conversion', () { +// test('converts status code to CalendarPermissionStatus', () async { +// mockPlatform.setPermissionStatus(CalendarPermissionStatus.granted); +// final result = await DeviceCalendar.instance.hasPermissions(); +// expect(result, CalendarPermissionStatus.granted); +// }); +// }); +// +// group('edge case handling', () { +// test('defaults to denied when status is null', () async { +// mockPlatform._permissionStatusCode = null; +// final result = await DeviceCalendar.instance.hasPermissions(); +// expect(result, CalendarPermissionStatus.denied); +// }); +// }); +// +// group('error handling', () { +// test('throws DeviceCalendarException when permissions not declared', +// () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'PERMISSIONS_NOT_DECLARED', +// message: 'Calendar permissions must be declared', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.hasPermissions(), +// throwsA( +// isA().having( +// (e) => e.errorCode, +// 'errorCode', +// DeviceCalendarError.permissionsNotDeclared, +// ), +// ), +// ); +// }); +// +// test('rethrows other PlatformExceptions unchanged', () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'SOME_OTHER_ERROR', +// message: 'Something went wrong', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.hasPermissions(), +// throwsA( +// isA().having( +// (e) => e.code, +// 'code', +// 'SOME_OTHER_ERROR', +// ), +// ), +// ); +// }); +// }); +// }); +// +// group('openAppSettings', () { +// test('completes successfully', () async { +// mockPlatform.clearException(); +// await DeviceCalendar.instance.openAppSettings(); +// // Should complete without error +// }); +// +// group('error handling', () { +// test('throws DeviceCalendarException when permissions not declared', +// () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'PERMISSIONS_NOT_DECLARED', +// message: 'Calendar permissions must be declared', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.openAppSettings(), +// throwsA( +// isA().having( +// (e) => e.errorCode, +// 'errorCode', +// DeviceCalendarError.permissionsNotDeclared, +// ), +// ), +// ); +// }); +// +// test('rethrows other PlatformExceptions unchanged', () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'UNABLE_TO_OPEN_SETTINGS', +// message: 'Failed to open settings', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.openAppSettings(), +// throwsA( +// isA().having( +// (e) => e.code, +// 'code', +// 'UNABLE_TO_OPEN_SETTINGS', +// ), +// ), +// ); +// }); +// }); +// }); +// +// group('listCalendars', () { +// test('returns list of Calendar objects', () async { +// mockPlatform.setCalendars([ +// { +// 'id': '1', +// 'name': 'Work', +// 'colorHex': '#FF0000', +// 'readOnly': false, +// 'accountName': 'work@example.com', +// 'accountType': 'com.google', +// 'isPrimary': true, +// 'hidden': false, +// }, +// { +// 'id': '2', +// 'name': 'Personal', +// 'readOnly': true, +// 'isPrimary': false, +// 'hidden': false, +// }, +// ]); +// +// final calendars = await DeviceCalendar.instance.listCalendars(); +// +// expect(calendars, hasLength(2)); +// expect(calendars[0].id, '1'); +// expect(calendars[0].name, 'Work'); +// expect(calendars[0].colorHex, '#FF0000'); +// expect(calendars[0].readOnly, false); +// expect(calendars[0].isPrimary, true); +// expect(calendars[0].hidden, false); +// +// expect(calendars[1].id, '2'); +// expect(calendars[1].name, 'Personal'); +// expect(calendars[1].readOnly, true); +// expect(calendars[1].isPrimary, false); +// }); +// +// test('throws DeviceCalendarException when permission denied', () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'PERMISSION_DENIED', +// message: 'Calendar permission denied', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.listCalendars(), +// throwsA( +// isA().having( +// (e) => e.errorCode, +// 'errorCode', +// DeviceCalendarError.permissionDenied, +// ), +// ), +// ); +// }); +// +// test('returns empty list when no calendars', () async { +// mockPlatform.setCalendars([]); +// final calendars = await DeviceCalendar.instance.listCalendars(); +// expect(calendars, isEmpty); +// }); +// }); +// +// group('createCalendar', () { +// test('returns calendar ID when created successfully', () async { +// final calendarId = +// await DeviceCalendar.instance.createCalendar(name: 'Test Calendar'); +// +// expect(calendarId, isNotEmpty); +// expect(calendarId, isA()); +// expect(calendarId, startsWith('mock-calendar-id')); +// }); +// +// test('creates calendar with name only', () async { +// final calendarId = +// await DeviceCalendar.instance.createCalendar(name: 'Work Calendar'); +// +// expect(calendarId, isNotEmpty); +// }); +// +// test('creates calendar with name and color', () async { +// final calendarId = await DeviceCalendar.instance.createCalendar( +// name: 'Personal Calendar', +// colorHex: '#FF5733', +// ); +// +// expect(calendarId, isNotEmpty); +// }); +// +// test('throws DeviceCalendarException when permission denied', () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'PERMISSION_DENIED', +// message: 'Calendar permission denied', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.createCalendar(name: 'Test Calendar'), +// throwsA( +// isA().having( +// (e) => e.errorCode, +// 'errorCode', +// DeviceCalendarError.permissionDenied, +// ), +// ), +// ); +// }); +// +// test('rethrows other PlatformExceptions unchanged', () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'SOME_OTHER_ERROR', +// message: 'Something went wrong', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.createCalendar(name: 'Test Calendar'), +// throwsA( +// isA().having( +// (e) => e.code, +// 'code', +// 'SOME_OTHER_ERROR', +// ), +// ), +// ); +// }); +// +// test('throws ArgumentError when name is empty', () async { +// expect( +// () => DeviceCalendar.instance.createCalendar(name: ''), +// throwsA( +// isA().having( +// (e) => e.message, +// 'message', +// contains('cannot be empty'), +// ), +// ), +// ); +// }); +// +// test('throws ArgumentError when name is whitespace only', () async { +// expect( +// () => DeviceCalendar.instance.createCalendar(name: ' '), +// throwsA( +// isA().having( +// (e) => e.message, +// 'message', +// contains('cannot be empty'), +// ), +// ), +// ); +// }); +// }); +// +// group('updateCalendar', () { +// test('updates calendar successfully', () async { +// await DeviceCalendar.instance.updateCalendar( +// 'calendar-123', +// name: 'Updated Name', +// colorHex: '#00FF00', +// ); +// // Should complete without error +// }); +// +// test('updates calendar with name only', () async { +// await DeviceCalendar.instance.updateCalendar( +// 'calendar-123', +// name: 'New Name', +// ); +// // Should complete without error +// }); +// +// test('updates calendar with color only', () async { +// await DeviceCalendar.instance.updateCalendar( +// 'calendar-123', +// colorHex: '#FF5733', +// ); +// // Should complete without error +// }); +// +// test('throws ArgumentError when no parameters provided', () async { +// expect( +// () => DeviceCalendar.instance.updateCalendar('calendar-123'), +// throwsA( +// isA().having( +// (e) => e.message, +// 'message', +// contains('At least one'), +// ), +// ), +// ); +// }); +// +// test('throws ArgumentError when name is empty', () async { +// expect( +// () => +// DeviceCalendar.instance.updateCalendar('calendar-123', name: ''), +// throwsA( +// isA().having( +// (e) => e.message, +// 'message', +// contains('cannot be empty'), +// ), +// ), +// ); +// }); +// +// test('throws ArgumentError when name is whitespace only', () async { +// expect( +// () => DeviceCalendar.instance +// .updateCalendar('calendar-123', name: ' '), +// throwsA( +// isA().having( +// (e) => e.message, +// 'message', +// contains('cannot be empty'), +// ), +// ), +// ); +// }); +// +// test('converts permissionDenied PlatformException', () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'PERMISSION_DENIED', message: 'Permission denied'), +// ); +// +// expect( +// () => DeviceCalendar.instance +// .updateCalendar('calendar-123', name: 'New Name'), +// throwsA( +// isA().having( +// (e) => e.errorCode, +// 'errorCode', +// DeviceCalendarError.permissionDenied, +// ), +// ), +// ); +// +// mockPlatform.clearException(); +// }); +// +// test('rethrows unknown PlatformException', () async { +// mockPlatform.throwException( +// PlatformException(code: 'someOtherError', message: 'Some error'), +// ); +// +// expect( +// () => DeviceCalendar.instance +// .updateCalendar('calendar-123', name: 'New Name'), +// throwsA( +// isA().having( +// (e) => e.code, +// 'code', +// 'someOtherError', +// ), +// ), +// ); +// +// mockPlatform.clearException(); +// }); +// }); +// +// group('listEvents', () { +// test('returns list of Event objects', () async { +// final now = DateTime.now(); +// final later = now.add(Duration(hours: 2)); +// +// mockPlatform.setEvents([ +// { +// 'eventId': 'event1', +// 'instanceId': 'event1', +// 'calendarId': 'cal1', +// 'title': 'Team Meeting', +// 'description': 'Weekly sync', +// 'location': 'Conference Room A', +// 'startDate': now.millisecondsSinceEpoch, +// 'endDate': later.millisecondsSinceEpoch, +// 'isAllDay': false, +// 'availability': 'busy', +// 'status': 'confirmed', +// 'isRecurring': false, +// }, +// { +// 'eventId': 'event2', +// 'instanceId': 'event2', +// 'calendarId': 'cal1', +// 'title': 'All Day Event', +// 'startDate': now.millisecondsSinceEpoch, +// 'endDate': later.millisecondsSinceEpoch, +// 'isAllDay': true, +// 'availability': 'free', +// 'status': 'tentative', +// 'isRecurring': false, +// }, +// ]); +// +// final events = await DeviceCalendar.instance.listEvents( +// now, +// now.add(Duration(days: 7)), +// ); +// +// expect(events, hasLength(2)); +// expect(events[0].eventId, 'event1'); +// expect(events[0].title, 'Team Meeting'); +// expect(events[0].description, 'Weekly sync'); +// expect(events[0].location, 'Conference Room A'); +// expect(events[0].isAllDay, false); +// expect(events[0].availability, EventAvailability.busy); +// expect(events[0].status, EventStatus.confirmed); +// +// expect(events[1].eventId, 'event2'); +// expect(events[1].title, 'All Day Event'); +// expect(events[1].isAllDay, true); +// expect(events[1].availability, EventAvailability.free); +// expect(events[1].status, EventStatus.tentative); +// }); +// +// test('handles unknown availability and status gracefully', () async { +// final now = DateTime.now(); +// +// mockPlatform.setEvents([ +// { +// 'eventId': 'event1', +// 'instanceId': 'event1', +// 'calendarId': 'cal1', +// 'title': 'Test Event', +// 'startDate': now.millisecondsSinceEpoch, +// 'endDate': now.millisecondsSinceEpoch, +// 'isAllDay': false, +// 'availability': 'unknownValue', +// 'status': 'unknownStatus', +// 'isRecurring': false, +// }, +// ]); +// +// final events = await DeviceCalendar.instance.listEvents( +// now, +// now.add(Duration(days: 1)), +// ); +// +// expect(events, hasLength(1)); +// expect(events[0].availability, EventAvailability.notSupported); +// expect(events[0].status, EventStatus.none); +// }); +// +// test('returns empty list when no events', () async { +// mockPlatform.setEvents([]); +// final events = await DeviceCalendar.instance.listEvents( +// DateTime.now(), +// DateTime.now().add(Duration(days: 7)), +// ); +// expect(events, isEmpty); +// }); +// +// test('throws DeviceCalendarException when permission denied', () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'PERMISSION_DENIED', +// message: 'Calendar permission denied', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.listEvents( +// DateTime.now(), +// DateTime.now().add(Duration(days: 7)), +// ), +// throwsA( +// isA().having( +// (e) => e.errorCode, +// 'errorCode', +// DeviceCalendarError.permissionDenied, +// ), +// ), +// ); +// }); +// }); +// +// group('getEvent', () { +// test('returns non-recurring event when found by instanceId', () async { +// final now = DateTime.now(); +// +// mockPlatform.setEvent({ +// 'eventId': 'event1', +// 'instanceId': 'event1', +// 'calendarId': 'cal1', +// 'title': 'Team Meeting', +// 'description': 'Weekly sync', +// 'startDate': now.millisecondsSinceEpoch, +// 'endDate': now.add(Duration(hours: 1)).millisecondsSinceEpoch, +// 'isAllDay': false, +// 'availability': 'busy', +// 'status': 'confirmed', +// 'isRecurring': false, +// }); +// +// final event = await DeviceCalendar.instance.getEvent('event1'); +// +// expect(event, isNotNull); +// expect(event!.eventId, 'event1'); +// expect( +// event.instanceId, 'event1'); // Non-recurring: instanceId == eventId +// expect(event.title, 'Team Meeting'); +// expect(event.description, 'Weekly sync'); +// }); +// +// test('returns recurring event instance by instanceId', () async { +// final eventStart = DateTime(2025, 11, 15, 14, 0); +// final instanceId = 'recurring1@${eventStart.millisecondsSinceEpoch}'; +// +// mockPlatform.setEvent({ +// 'eventId': 'recurring1', +// 'instanceId': instanceId, +// 'calendarId': 'cal1', +// 'title': 'Daily Standup', +// 'startDate': eventStart.millisecondsSinceEpoch, +// 'endDate': +// eventStart.add(Duration(minutes: 30)).millisecondsSinceEpoch, +// 'isAllDay': false, +// 'availability': 'busy', +// 'status': 'confirmed', +// 'isRecurring': true, +// }); +// +// final event = await DeviceCalendar.instance.getEvent(instanceId); +// +// expect(event, isNotNull); +// expect(event!.eventId, 'recurring1'); +// expect(event.instanceId, instanceId); +// expect(event.title, 'Daily Standup'); +// expect(event.startDate, eventStart); +// }); +// +// test('returns null when event not found', () async { +// mockPlatform.setEvent(null); +// +// final event = await DeviceCalendar.instance.getEvent('nonexistent'); +// +// expect(event, isNull); +// }); +// +// test('parses instanceId correctly for recurring events', () async { +// final eventStart = DateTime(2025, 11, 15, 14, 0); +// final instanceId = 'event123@${eventStart.millisecondsSinceEpoch}'; +// +// mockPlatform.setEvent({ +// 'eventId': 'event123', +// 'instanceId': instanceId, +// 'calendarId': 'cal1', +// 'title': 'Recurring Event', +// 'startDate': eventStart.millisecondsSinceEpoch, +// 'endDate': eventStart.add(Duration(hours: 1)).millisecondsSinceEpoch, +// 'isAllDay': false, +// 'availability': 'busy', +// 'status': 'confirmed', +// 'isRecurring': true, +// }); +// +// final event = await DeviceCalendar.instance.getEvent(instanceId); +// +// expect(event, isNotNull); +// expect(event!.eventId, 'event123'); +// expect(event.startDate, eventStart); +// }); +// +// test('throws DeviceCalendarException when permission denied', () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'PERMISSION_DENIED', +// message: 'Calendar permission denied', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.getEvent('event1'), +// throwsA( +// isA().having( +// (e) => e.errorCode, +// 'errorCode', +// DeviceCalendarError.permissionDenied, +// ), +// ), +// ); +// }); +// }); +// +// group('createEvent', () { +// test('creates event with all parameters', () async { +// final calendarId = 'cal-123'; +// final title = 'Team Meeting'; +// final startDate = DateTime(2024, 3, 15, 14, 0); +// final endDate = DateTime(2024, 3, 15, 15, 0); +// +// final eventId = await DeviceCalendar.instance.createEvent( +// calendarId: calendarId, +// title: title, +// startDate: startDate, +// endDate: endDate, +// description: 'Weekly sync', +// location: 'Conference Room A', +// timeZone: 'America/New_York', +// ); +// +// expect(eventId, isNotEmpty); +// expect(eventId, startsWith('mock-event-id-')); +// }); +// +// test('creates all-day event', () async { +// final eventId = await DeviceCalendar.instance.createEvent( +// calendarId: 'cal-123', +// title: 'All Day Event', +// startDate: DateTime(2024, 3, 15), +// endDate: DateTime(2024, 3, 16), +// isAllDay: true, +// ); +// +// expect(eventId, isNotEmpty); +// }); +// +// test('normalizes dates for all-day events (strips time components)', +// () async { +// // Create an all-day event with time components +// final startWithTime = DateTime(2024, 3, 15, 14, 30, 45); +// final endWithTime = DateTime(2024, 3, 16, 18, 15, 30); +// +// // Mock to capture what was actually passed to the platform +// DateTime? capturedStart; +// DateTime? capturedEnd; +// +// final mock = MockDeviceCalendarPlusPlatform(); +// mock.setCreateEventCallback(( +// calendarId, +// title, +// startDate, +// endDate, +// isAllDay, +// description, +// location, +// timeZone, +// availability, +// ) { +// capturedStart = startDate; +// capturedEnd = endDate; +// return Future.value('event-id'); +// }); +// +// DeviceCalendarPlusPlatform.instance = mock; +// +// await DeviceCalendar.instance.createEvent( +// calendarId: 'cal-123', +// title: 'All Day Event', +// startDate: startWithTime, +// endDate: endWithTime, +// isAllDay: true, +// ); +// +// // Verify dates were normalized to midnight +// expect(capturedStart, isNotNull); +// expect(capturedEnd, isNotNull); +// expect(capturedStart!.hour, 0); +// expect(capturedStart!.minute, 0); +// expect(capturedStart!.second, 0); +// expect(capturedStart!.millisecond, 0); +// expect(capturedEnd!.hour, 0); +// expect(capturedEnd!.minute, 0); +// expect(capturedEnd!.second, 0); +// expect(capturedEnd!.millisecond, 0); +// +// // Verify dates preserved the day +// expect(capturedStart!.year, 2024); +// expect(capturedStart!.month, 3); +// expect(capturedStart!.day, 15); +// expect(capturedEnd!.year, 2024); +// expect(capturedEnd!.month, 3); +// expect(capturedEnd!.day, 16); +// }); +// +// test('preserves exact time for non-all-day events', () async { +// final startWithTime = DateTime(2024, 3, 15, 14, 30, 45); +// final endWithTime = DateTime(2024, 3, 15, 18, 15, 30); +// +// DateTime? capturedStart; +// DateTime? capturedEnd; +// +// final mock = MockDeviceCalendarPlusPlatform(); +// mock.setCreateEventCallback(( +// calendarId, +// title, +// startDate, +// endDate, +// isAllDay, +// description, +// location, +// timeZone, +// availability, +// ) { +// capturedStart = startDate; +// capturedEnd = endDate; +// return Future.value('event-id'); +// }); +// +// DeviceCalendarPlusPlatform.instance = mock; +// +// await DeviceCalendar.instance.createEvent( +// calendarId: 'cal-123', +// title: 'Meeting', +// startDate: startWithTime, +// endDate: endWithTime, +// isAllDay: false, +// ); +// +// // Verify exact times were preserved +// expect(capturedStart, equals(startWithTime)); +// expect(capturedEnd, equals(endWithTime)); +// }); +// +// test('creates event with minimal parameters', () async { +// final eventId = await DeviceCalendar.instance.createEvent( +// calendarId: 'cal-123', +// title: 'Quick Meeting', +// startDate: DateTime.now(), +// endDate: DateTime.now().add(Duration(hours: 1)), +// ); +// +// expect(eventId, isNotEmpty); +// }); +// +// test('throws ArgumentError when calendar ID is empty', () async { +// expect( +// () => DeviceCalendar.instance.createEvent( +// calendarId: '', +// title: 'Meeting', +// startDate: DateTime.now(), +// endDate: DateTime.now().add(Duration(hours: 1)), +// ), +// throwsArgumentError, +// ); +// }); +// +// test('throws ArgumentError when title is empty', () async { +// expect( +// () => DeviceCalendar.instance.createEvent( +// calendarId: 'cal-123', +// title: '', +// startDate: DateTime.now(), +// endDate: DateTime.now().add(Duration(hours: 1)), +// ), +// throwsArgumentError, +// ); +// }); +// +// test('throws ArgumentError when end date is before start date', () async { +// final now = DateTime.now(); +// expect( +// () => DeviceCalendar.instance.createEvent( +// calendarId: 'cal-123', +// title: 'Invalid Event', +// startDate: now, +// endDate: now.subtract(Duration(hours: 1)), +// ), +// throwsArgumentError, +// ); +// }); +// +// test('converts PlatformException to DeviceCalendarException', () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'PERMISSION_DENIED', +// message: 'Calendar permission denied', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.createEvent( +// calendarId: 'cal-123', +// title: 'Meeting', +// startDate: DateTime.now(), +// endDate: DateTime.now().add(Duration(hours: 1)), +// ), +// throwsA( +// isA().having( +// (e) => e.errorCode, +// 'errorCode', +// DeviceCalendarError.permissionDenied, +// ), +// ), +// ); +// }); +// }); +// +// group('deleteEvent', () { +// test('deletes single event', () async { +// await DeviceCalendar.instance.deleteEvent(eventId: 'event-123'); +// // Should complete without error +// }); +// +// test('deletes all instances of recurring event', () async { +// await DeviceCalendar.instance.deleteEvent( +// eventId: 'event-123@123456789', +// ); +// // Should complete without error +// }); +// +// test('deletes single instance of recurring event', () async { +// await DeviceCalendar.instance.deleteEvent( +// eventId: 'event-123@123456789', +// ); +// // Should complete without error +// }); +// +// test('throws ArgumentError when instance ID is empty', () async { +// expect( +// () => DeviceCalendar.instance.deleteEvent(eventId: ''), +// throwsArgumentError, +// ); +// }); +// +// test('converts PlatformException to DeviceCalendarException', () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'PERMISSION_DENIED', +// message: 'Calendar permission denied', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.deleteEvent(eventId: 'event-123'), +// throwsA( +// isA().having( +// (e) => e.errorCode, +// 'errorCode', +// DeviceCalendarError.permissionDenied, +// ), +// ), +// ); +// }); +// }); +// +// group('updateEvent', () { +// test('updates event with all parameters', () async { +// await DeviceCalendar.instance.updateEvent( +// eventId: 'event-123', +// title: 'Updated Title', +// startDate: DateTime(2024, 3, 20, 10, 0), +// endDate: DateTime(2024, 3, 20, 11, 0), +// description: 'Updated description', +// location: 'Updated location', +// isAllDay: false, +// timeZone: 'America/New_York', +// ); +// // Should complete without error +// }); +// +// test('updates event with single field', () async { +// await DeviceCalendar.instance.updateEvent( +// eventId: 'event-123', +// title: 'New Title', +// ); +// // Should complete without error +// }); +// +// test('updates entire series for recurring event', () async { +// await DeviceCalendar.instance.updateEvent( +// eventId: 'event-123', +// title: 'Updated Series', +// ); +// // Should complete without error (updates entire series automatically) +// }); +// +// test('normalizes dates when isAllDay is true', () async { +// final startWithTime = DateTime(2024, 3, 15, 14, 30, 45); +// final endWithTime = DateTime(2024, 3, 16, 18, 15, 30); +// +// DateTime? capturedStart; +// DateTime? capturedEnd; +// +// final mock = MockDeviceCalendarPlusPlatform(); +// mock.setUpdateEventCallback(( +// instanceId, { +// title, +// startDate, +// endDate, +// description, +// location, +// isAllDay, +// timeZone, +// availability, +// }) { +// capturedStart = startDate; +// capturedEnd = endDate; +// return Future.value(); +// }); +// DeviceCalendarPlusPlatform.instance = mock; +// +// await DeviceCalendar.instance.updateEvent( +// eventId: 'event-123', +// startDate: startWithTime, +// endDate: endWithTime, +// isAllDay: true, +// ); +// +// expect(capturedStart, isNotNull); +// expect(capturedEnd, isNotNull); +// expect(capturedStart!.hour, 0); +// expect(capturedStart!.minute, 0); +// expect(capturedStart!.second, 0); +// expect(capturedStart!.millisecond, 0); +// expect(capturedEnd!.hour, 0); +// expect(capturedEnd!.minute, 0); +// expect(capturedEnd!.second, 0); +// expect(capturedEnd!.millisecond, 0); +// +// expect(capturedStart!.year, 2024); +// expect(capturedStart!.month, 3); +// expect(capturedStart!.day, 15); +// expect(capturedEnd!.year, 2024); +// expect(capturedEnd!.month, 3); +// expect(capturedEnd!.day, 16); +// }); +// +// test('preserves exact time when isAllDay is false', () async { +// final startWithTime = DateTime(2024, 3, 15, 14, 30, 45); +// final endWithTime = DateTime(2024, 3, 15, 18, 15, 30); +// +// DateTime? capturedStart; +// DateTime? capturedEnd; +// +// final mock = MockDeviceCalendarPlusPlatform(); +// mock.setUpdateEventCallback(( +// instanceId, { +// title, +// startDate, +// endDate, +// description, +// location, +// isAllDay, +// timeZone, +// availability, +// }) { +// capturedStart = startDate; +// capturedEnd = endDate; +// return Future.value(); +// }); +// DeviceCalendarPlusPlatform.instance = mock; +// +// await DeviceCalendar.instance.updateEvent( +// eventId: 'event-123', +// startDate: startWithTime, +// endDate: endWithTime, +// isAllDay: false, +// ); +// +// expect(capturedStart, equals(startWithTime)); +// expect(capturedEnd, equals(endWithTime)); +// }); +// +// test('throws ArgumentError when eventId is empty', () async { +// expect( +// () => DeviceCalendar.instance.updateEvent( +// eventId: '', +// title: 'New Title', +// ), +// throwsArgumentError, +// ); +// }); +// +// test('throws ArgumentError when no fields provided', () async { +// expect( +// () => DeviceCalendar.instance.updateEvent( +// eventId: 'event-123', +// ), +// throwsArgumentError, +// ); +// }); +// +// test('throws ArgumentError when endDate is before startDate', () async { +// expect( +// () => DeviceCalendar.instance.updateEvent( +// eventId: 'event-123', +// startDate: DateTime(2024, 3, 20, 11, 0), +// endDate: DateTime(2024, 3, 20, 10, 0), +// ), +// throwsArgumentError, +// ); +// }); +// +// test('converts PlatformException to DeviceCalendarException', () async { +// mockPlatform.throwException( +// PlatformException( +// code: 'PERMISSION_DENIED', +// message: 'Calendar permission denied', +// ), +// ); +// +// expect( +// () => DeviceCalendar.instance.updateEvent( +// eventId: 'event-123', +// title: 'New Title', +// ), +// throwsA( +// isA().having( +// (e) => e.errorCode, +// 'errorCode', +// DeviceCalendarError.permissionDenied, +// ), +// ), +// ); +// }); +// }); +// }); +// } diff --git a/pubspec.yaml b/pubspec.yaml index 00d9d42e..c4b1e51a 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -46,7 +46,8 @@ dependencies: file_picker: 10.3.8 local_auth: ^2.3.0 share_plus: ^11.1.0 - device_calendar_plus: ^0.3.1 + device_calendar_plus: + path: ./package/device_calendar_plus device_calendar: git: https://github.com/bardram/device_calendar manage_calendar_events: ^2.0.3 From 631fabad23a46a964ff2f27803ecdc2b57448a31 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 2 Mar 2026 14:12:41 +0300 Subject: [PATCH 16/27] updates --- lib/features/lab/lab_repo.dart | 3 ++- .../livecare/immediate_livecare_payment_details.dart | 2 +- .../todo_section/widgets/ancillary_orders_list.dart | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/features/lab/lab_repo.dart b/lib/features/lab/lab_repo.dart index 285c7322..10839b12 100644 --- a/lib/features/lab/lab_repo.dart +++ b/lib/features/lab/lab_repo.dart @@ -249,7 +249,8 @@ class LabRepoImp implements LabRepo { GenericApiModel? apiResponse; Failure? failure; await apiClient.post( - Utils.isVidaPlusProject(int.parse(labOrder.projectID!)) ? SEND_LAB_RESULT_EMAIL : SEND_LAB_RESULT_EMAIL_NEW, + // Utils.isVidaPlusProject(int.parse(labOrder.projectID!)) ? SEND_LAB_RESULT_EMAIL : SEND_LAB_RESULT_EMAIL_NEW, + SEND_LAB_RESULT_EMAIL_NEW, body: mapDevice, onFailure: (error, statusCode, {messageStatus, failureType}) { failure = failureType; diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart index fb6ebe72..e6654f5e 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart @@ -84,7 +84,7 @@ class ImmediateLiveCarePaymentDetails extends StatelessWidget { AppCustomChipWidget(labelText: "${appState.getAuthenticatedUser()!.age} ${LocaleKeys.yearsOld.tr(context: context)}"), AppCustomChipWidget( labelText: - "${LocaleKeys.clinic.tr()}: ${(appState.isArabic() ? immediateLiveCareVM.immediateLiveCareSelectedClinic.serviceNameN : immediateLiveCareVM.immediateLiveCareSelectedClinic.serviceName)!}"), + "${LocaleKeys.clinic.tr()}: ${(appState.isArabic() ? immediateLiveCareVM.immediateLiveCareSelectedClinic.serviceNameN : immediateLiveCareVM.immediateLiveCareSelectedClinic.serviceName) ?? ""}"), ], ), ], diff --git a/lib/presentation/todo_section/widgets/ancillary_orders_list.dart b/lib/presentation/todo_section/widgets/ancillary_orders_list.dart index 58ee6d46..6a41252e 100644 --- a/lib/presentation/todo_section/widgets/ancillary_orders_list.dart +++ b/lib/presentation/todo_section/widgets/ancillary_orders_list.dart @@ -118,7 +118,7 @@ class AncillaryOrderCard extends StatelessWidget { : Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - "Ancillary Orders".toText14(isBold: true), + LocaleKeys.ancillaryOrdersList.tr(context: context).toText14(isBold: true), Row( children: [ LocaleKeys.viewAll.tr(context: context).toText12(color: AppColors.primaryRedColor), From 961a1f5b03426ffa6f816b6ea926a3c80bdba506 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 2 Mar 2026 14:36:37 +0300 Subject: [PATCH 17/27] updates --- lib/core/utils/calendar_utils.dart | 316 ------------------ .../active_medication_page.dart | 25 +- 2 files changed, 19 insertions(+), 322 deletions(-) delete mode 100644 lib/core/utils/calendar_utils.dart diff --git a/lib/core/utils/calendar_utils.dart b/lib/core/utils/calendar_utils.dart deleted file mode 100644 index 8b21111f..00000000 --- a/lib/core/utils/calendar_utils.dart +++ /dev/null @@ -1,316 +0,0 @@ -import 'dart:async'; -import 'dart:collection'; -import 'dart:convert'; -import 'dart:io'; -import 'dart:ui'; - -import 'package:device_calendar/device_calendar.dart'; -import 'package:flutter/widgets.dart'; -import 'package:hmg_patient_app_new/core/dependencies.dart'; -import 'package:hmg_patient_app_new/core/utils/date_util.dart'; -import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; -import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_reminder_view.dart'; -import 'package:hmg_patient_app_new/services/dialog_service.dart'; -import 'package:hmg_patient_app_new/services/permission_service.dart'; -import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; -import 'package:jiffy/jiffy.dart'; -import 'package:manage_calendar_events/manage_calendar_events.dart' as ios; -import 'package:permission_handler/permission_handler.dart'; -import 'package:timezone/data/latest.dart' as tzl; - -final DeviceCalendarPlugin deviceCalendarPlugin = DeviceCalendarPlugin(); -final ios.CalendarPlugin _myPlugin = ios.CalendarPlugin(); - -class CalendarUtils { - static Completer? _completer; - - dynamic get writableCalendars => calendars.firstWhere((c) => !c.isReadOnly!); - dynamic calendars; - - CalendarUtils._(this.calendars); - - // static Future getInstance() async { - // if (_completer == null) { - // _completer = Completer(); - // print(_completer!.isCompleted); - // try { - // final dynamic calendarsResult; - // if (Platform.isIOS) { - // calendarsResult = await _myPlugin.getCalendars(); - // if (!_completer!.isCompleted) { - // _completer?.complete(CalendarUtils._(await calendarsResult!)); - // } - // } else { - // calendarsResult = await deviceCalendarPlugin.retrieveCalendars(); - // if (!_completer!.isCompleted) { - // _completer?.complete(CalendarUtils._(await calendarsResult.data!)); - // } - // } - // } on Exception catch (e) { - // if (!_completer!.isCompleted) { - // _completer!.completeError(e); - // } - // } - // } - // return _completer!.future; - // } - - static Future getInstance() async { - tzl.initializeTimeZones(); - if (_completer != null) { - return _completer!.future; - } - _completer = Completer(); - try { - final dynamic calendarsResult; - if (Platform.isIOS) { - calendarsResult = await _myPlugin.getCalendars(); - _completer!.complete(CalendarUtils._(calendarsResult)); - } else { - calendarsResult = await deviceCalendarPlugin.retrieveCalendars(); - _completer!.complete(CalendarUtils._(calendarsResult.data)); - } - } catch (e) { - _completer!.completeError(e); - } - - return _completer!.future; - } - - Future createOrUpdateEvents({List? scheduleList, String? title, String? description, List? scheduleDateTime, List? daysOfWeek}) async { - tzl.initializeTimeZones(); - List events = []; - Location _currentLocation; - if (DateTime.now().timeZoneName == "+04") - _currentLocation = getLocation('Asia/Dubai'); - else - _currentLocation = getLocation('Asia/Riyadh'); - - scheduleDateTime!.forEach((element) { - RecurrenceRule recurrenceRule = RecurrenceRule( - // RecurrenceFrequency.Daily, - // daysOfWeek: daysOfWeek, - // endDate: element, - until: element, frequency: Frequency.daily, - ); - //added byAamir Tz Time - Event event = Event(writableCalendars!.id, - recurrenceRule: recurrenceRule, - start: TZDateTime.from(element, _currentLocation), - end: TZDateTime.from(element.add(Duration(minutes: 30)), _currentLocation), - title: title, - description: description); - events.add(event); - }); - - events.forEach((element) { - deviceCalendarPlugin.createOrUpdateEvent(element); - }); - } - - Future createOrUpdateEvent({required String title, required String description, required String location, DateTime? scheduleDateTime, String? eventId}) async { - RecurrenceRule recurrenceRule = RecurrenceRule( - // RecurrenceFrequency.Daily, - // daysOfWeek: daysOfWeek, - // endDate: scheduleDateTime, - until: scheduleDateTime, frequency: Frequency.daily, - ); - - Location _currentLocation; - // if (DateTime.now().timeZoneName == "+04") - // _currentLocation = getLocation('Asia/Dubai'); - // else - _currentLocation = getLocation('Asia/Riyadh'); - - TZDateTime scheduleDateTimeUTZ = TZDateTime.from(scheduleDateTime!, _currentLocation); - - print("writableCalendars-name: " + writableCalendars.name); - print("writableCalendars-Id: " + writableCalendars.id); - print("writableCalendarsToString: " + writableCalendars.toString()); - print("writableCalendarsToString: " + writableCalendars!.id!); - Event event = Event( - writableCalendars!.id, - start: scheduleDateTimeUTZ, - end: scheduleDateTimeUTZ.add(Duration(minutes: 30)), - title: title, - description: description, - ); - - ios.CalendarEvent iosCalEvent = - ios.CalendarEvent(location: location, startDate: scheduleDateTimeUTZ, endDate: scheduleDateTimeUTZ.add(Duration(minutes: 30)), title: title, description: description, isAllDay: false); - - if (Platform.isAndroid) { - Result result = await deviceCalendarPlugin.hasPermissions(); - print(result); - await deviceCalendarPlugin.createOrUpdateEvent(event).catchError((e) { - print("catchError " + e.toString()); - }).whenComplete(() { - print("whenComplete Calender ID " + eventId!); - }); - } else { - await _myPlugin.createEvent(calendarId: writableCalendars.id!, event: iosCalEvent).catchError((e) { - print("catchError " + e.toString()); - }).whenComplete(() { - print("whenComplete Calender ID iOS " + eventId!); - }); - } - } - - deleteEvent(String _calendarId, String _eventId) async { - if (Platform.isIOS) { - await _myPlugin.deleteEvent(calendarId: _calendarId, eventId: _eventId); - } else { - await deviceCalendarPlugin.deleteEvent(_calendarId, _eventId); - } - } - - Future retrieveEvents( - String calendarId, - RetrieveEventsParams retrieveEventsParams, - ) async { - if (Platform.isIOS) { - return await _myPlugin.getEvents(calendarId: calendarId); - } else { - return await deviceCalendarPlugin.retrieveEvents(calendarId, retrieveEventsParams); - } - } - - Future createCalendar( - String calendarName, { - Color? calendarColor, - String? localAccountName, - }) async { - return await deviceCalendarPlugin.createCalendar(calendarName, calendarColor: calendarColor, localAccountName: localAccountName); - } -} - -Future> requestPermissions() async { - var permissionResults = [Permission.calendarFullAccess].request(); - return permissionResults; -} - -showReminderBottomSheet(BuildContext context, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted, - {required Function() onSuccess, String? title, String? description, Function(int)? onMultiDateSuccess, bool isMultiAllowed = false}) async { - if (Platform.isAndroid) { - if (await PermissionService.isCalendarPermissionEnabled()) { - _showReminderBottomSheet(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, - onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed); - } else { - // Utils.showPermissionConsentDialog(context, TranslationBase.of(context).calendarPermission, () async { - // if (await Permission.calendarFullAccess.request().isGranted) { - // _showReminderDialog(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, - // onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed); - // } - // }); - } - } else { - if (await Permission.calendarWriteOnly.request().isGranted) { - if (await Permission.calendarFullAccess.request().isGranted) { - _showReminderBottomSheet(context, dateTime, doctorName, eventId, appoDateFormatted, appoTimeFormatted, - onSuccess: onSuccess, title: title, description: description, onMultiDateSuccess: onMultiDateSuccess, isMultiAllowed: isMultiAllowed); - } - } - } -} - -Future _showReminderBottomSheet(BuildContext providedContext, DateTime dateTime, String doctorName, String eventId, String appoDateFormatted, String appoTimeFormatted, - {required Function onSuccess, String? title, String? description, Function(int)? onMultiDateSuccess, bool? isMultiAllowed}) async { - showCommonBottomSheetWithoutHeight(providedContext, title: "Set the timer of reminder", child: PrescriptionReminderView( - setReminder: (int value) async { - if (!isMultiAllowed!) { - if (onMultiDateSuccess == null) { - CalendarUtils calendarUtils = await CalendarUtils.getInstance(); - await calendarUtils.createOrUpdateEvent( - title: title ?? "You have appointment with Dr. $doctorName", - description: description ?? "At $appoDateFormatted $appoTimeFormatted", - scheduleDateTime: dateTime, - eventId: eventId, - location: ''); - onSuccess(); - } - } else { - onMultiDateSuccess!(value); - } - }, - ), callBackFunc: () {}, isFullScreen: false); -} - -setCalender(BuildContext context, - {required String eventId, required int selectedMinutes, int? frequencyNumber, required int days, required String orderDate, required String itemDescriptionN, required String route}) async { - DateTime actualDate = DateTime(DateTime.now().year, DateTime.now().month, DateTime.now().day, 8, 0); - frequencyNumber ??= 2; //Some time frequency number is null so by default will be 2 - - int remainingDays = days - (Jiffy.parseFromDateTime(DateTime.now()).diff(Jiffy.parseFromDateTime(DateUtil.convertStringToDate(orderDate)), unit: Unit.day) as int); - if (remainingDays.isNegative) { - getIt.get().showErrorBottomSheet(message: "Prescription date has been already passed you can not add a reminder for this prescription."); - return; - } - CalendarUtils calendarUtils = await CalendarUtils.getInstance(); - - try { - for (int i = 0; i < remainingDays; i++) { - //event for number of days. - for (int j = 0; j < frequencyNumber; j++) { - // event for number of times per day. - if (j != 0) { - actualDate.add(new Duration(hours: 8)); // 8 hours addition for daily dose. - } - //Time subtraction from actual reminder time. like before 30, or 1 hour. - - actualDate = Jiffy.parseFromDateTime(actualDate).subtract(minutes: selectedMinutes).dateTime; - - calendarUtils.createOrUpdateEvent( - title: "$itemDescriptionN} Prescription Reminder", - description: "$itemDescriptionN $frequencyNumber $route ", - scheduleDateTime: actualDate, - eventId: eventId + (i.toString() + j.toString()), - location: '', //event id with varitions - ); - print("Creating event #$j for day $i → $actualDate"); - actualDate = DateTime(actualDate.year, actualDate.month, actualDate.day, 8, 0); - } - actualDate = Jiffy.parseFromDateTime(actualDate).add(days: 1).dateTime; - } - } catch (ex) { - getIt.get().showErrorBottomSheet(message: "catch:$ex"); - } -} - -Future checkAndRemove(hasReminder, {bool delete = false, String itemDescriptionN = ""}) async { - final ios.CalendarPlugin _myPlugin = ios.CalendarPlugin(); - CalendarUtils calendarUtils = await CalendarUtils.getInstance(); - DateTime startEventsDate = Jiffy.parseFromDateTime(DateTime.now()).subtract(days: 30).dateTime; - DateTime endEventsDate = Jiffy.parseFromDateTime(DateTime.now()).add(days: 120).dateTime; - RetrieveEventsParams params = RetrieveEventsParams(startDate: startEventsDate, endDate: endEventsDate); - - if (calendarUtils.calendars != null) { - if (Platform.isAndroid) { - await processEvents(calendarUtils.calendars, calendarUtils, params, delete, itemDescriptionN, hasReminder); - } else { - List? iosCalendars = await _myPlugin.getCalendars(); - if (iosCalendars != null) { - await processEvents(iosCalendars.map((cal) => Calendar(id: cal.id, name: cal.name, accountName: cal.accountName)).toList(), calendarUtils, params, delete, itemDescriptionN, hasReminder); - } - } - } -} - -Future processEvents(List calendars, calendarUtils, params, delete, String itemDescriptionN, hasReminder) async { - for (var calendar in calendars) { - Result> events = await calendarUtils.retrieveEvents(calendar.id!, params); - for (var event in events.data!) { - if (event.title!.contains(itemDescriptionN)) { - if (delete) { - await calendarUtils.deleteEvent(calendar, event); - // AppToast.showSuccessToast(message: TranslationBase.of(context).reminderCancelSuccess); - hasReminder = false; - } else { - hasReminder = false; - // setState(() { - // hasReminder = true; - // }); - } - } - } - } -} diff --git a/lib/presentation/active_medication/active_medication_page.dart b/lib/presentation/active_medication/active_medication_page.dart index be6b82a6..cb114cd4 100644 --- a/lib/presentation/active_medication/active_medication_page.dart +++ b/lib/presentation/active_medication/active_medication_page.dart @@ -2,11 +2,11 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/calender_utils_new.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:flutter/cupertino.dart'; import '../../core/app_assets.dart'; -import '../../core/utils/calendar_utils.dart'; import '../../features/active_prescriptions/active_prescriptions_view_model.dart'; import '../../features/active_prescriptions/models/active_prescriptions_response_model.dart'; import '../../generated/locale_keys.g.dart'; @@ -34,7 +34,6 @@ class _ActiveMedicationPageState extends State { List selectedDayMeds = []; ActivePrescriptionsViewModel? activePreVM; - Map medReminderStatus = {}; String _buildMedKey(ActivePrescriptionsResponseModel med) { @@ -773,6 +772,8 @@ class _ReminderTimerDialogState extends State { String bigTimeText = "00:00"; bool showPicker = false; + CalenderUtilsNew calender = CalenderUtilsNew.instance; + final List> presetTimes = [ ["06:00 AM", "07:00 AM", "08:00 AM", "09:00 AM"], // Morning ["12:00 PM", "01:00 PM", "02:00 PM", "03:00 PM"], // Noon @@ -972,16 +973,28 @@ class _ReminderTimerDialogState extends State { if (isPM && hour != 12) hour += 12; if (!isPM && hour == 12) hour = 0; int totalMinutes = hour * 60 + minute; - await setCalender( - context, - eventId: widget.med.itemId.toString(), - selectedMinutes: totalMinutes, + + await calender.createMultipleEvents( + reminderMinutes: totalMinutes, frequencyNumber: widget.frequencyNumber, days: widget.med.days ?? 1, orderDate: widget.med.orderDate ?? "", itemDescriptionN: widget.med.itemDescription ?? "", route: widget.med.route ?? "", + onFailure: (errorMessage) {}, + prescriptionNumber: widget.med.itemId.toString() ); + + // await setCalender( + // context, + // eventId: widget.med.itemId.toString(), + // selectedMinutes: totalMinutes, + // frequencyNumber: widget.frequencyNumber, + // days: widget.med.days ?? 1, + // orderDate: widget.med.orderDate ?? "", + // itemDescriptionN: widget.med.itemDescription ?? "", + // route: widget.med.route ?? "", + // ); ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text(LocaleKeys.reminderAddedToCalendar.tr())), ); From b4a7508f7c01ea8b2429f55f3655e37f33854bac Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 3 Mar 2026 14:34:12 +0300 Subject: [PATCH 18/27] updates --- .../book_appointment/doctor_profile_page.dart | 4 ++++ .../immediate_livecare_pending_request_page.dart | 2 +- .../widgets/tracker_last_value_card.dart | 12 +++++++++++- lib/routes/app_routes.dart | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/presentation/book_appointment/doctor_profile_page.dart b/lib/presentation/book_appointment/doctor_profile_page.dart index c62404ab..25cda6b6 100644 --- a/lib/presentation/book_appointment/doctor_profile_page.dart +++ b/lib/presentation/book_appointment/doctor_profile_page.dart @@ -172,6 +172,10 @@ class DoctorProfilePage extends StatelessWidget { child: CustomButton( text: LocaleKeys.viewAvailableAppointments.tr(), onPressed: () async { + bookAppointmentsViewModel.selectedDoctor.speciality = bookAppointmentsViewModel.doctorsProfileResponseModel.specialty; + bookAppointmentsViewModel.selectedDoctor.specialityN = bookAppointmentsViewModel.doctorsProfileResponseModel.specialty; + bookAppointmentsViewModel.selectedDoctor.name = bookAppointmentsViewModel.doctorsProfileResponseModel.doctorName; + bookAppointmentsViewModel.selectedDoctor.name = bookAppointmentsViewModel.doctorsProfileResponseModel.doctorName; LoaderBottomSheet.showLoader(); bookAppointmentsViewModel.isLiveCareSchedule ? await bookAppointmentsViewModel.getLiveCareDoctorFreeSlots( diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart index 08543d23..da12f3ef 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart @@ -117,7 +117,7 @@ class _ImmediateLiveCarePendingRequestPageState extends State UserInfoSelectionPage(), userInfoFlowManager: (context) => UserInfoFlowManager(), smartWatches: (context) => SmartwatchHomePage(), - huaweiHealthExample: (context) => HuaweiHealthExample(), + // huaweiHealthExample: (context) => HuaweiHealthExample(), covid19Test: (context) => Covid19LandingPage(), waterConsumptionPage: (context) => WaterConsumptionPage(), waterMonitorSettingsPage: (context) => WaterMonitorSettingsPage(), From 074c060e360970135fa5cb412234866ce34d1308 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 4 Mar 2026 15:31:33 +0300 Subject: [PATCH 19/27] Updates & fixes --- lib/core/api_consts.dart | 2 +- lib/core/utils/date_util.dart | 2 +- .../authentication/authentication_view_model.dart | 8 +++++--- lib/presentation/profile_settings/profile_settings.dart | 6 ++++++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 39132004..50016d0a 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -4,7 +4,7 @@ import 'package:hmg_patient_app_new/core/enums.dart'; class ApiConsts { static const maxSmallScreen = 660; - static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.uat; + static AppEnvironmentTypeEnum appEnvironmentType = AppEnvironmentTypeEnum.prod; // static String baseUrl = 'https://uat.hmgwebservices.com/'; // HIS API URL UAT diff --git a/lib/core/utils/date_util.dart b/lib/core/utils/date_util.dart index 2b134735..87af0a27 100644 --- a/lib/core/utils/date_util.dart +++ b/lib/core/utils/date_util.dart @@ -493,7 +493,7 @@ class DateUtil { } static convertISODateToJsonDate(String isoDate) { - return "/Date(" + DateFormat('mm-dd-yyy').parse(isoDate).millisecondsSinceEpoch.toString() + ")/"; + return "/Date(" + DateFormat('mm-dd-yyy', "en-US").parse(isoDate).millisecondsSinceEpoch.toString() + ")/"; } static String getDay(DayOfWeek dayOfWeek) { diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart index 9a3fffc5..fe025f93 100644 --- a/lib/features/authentication/authentication_view_model.dart +++ b/lib/features/authentication/authentication_view_model.dart @@ -44,6 +44,7 @@ import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:sms_otp_auto_verify/sms_otp_auto_verify.dart'; +import '../insurance/insurance_view_model.dart'; import 'models/request_models/get_user_mobile_device_data.dart'; import 'models/request_models/insert_patient_mobile_deviceinfo.dart'; import 'models/request_models/patient_insert_device_imei_request.dart'; @@ -629,11 +630,12 @@ class AuthenticationViewModel extends ChangeNotifier { // medicalVm.getAllPendingRecordsByResponseId(); } await clearDefaultInputValues(); + myAppointmentsVM.setIsAppointmentDataToBeLoaded(true); + getIt.get().setIsInsuranceDataToBeLoaded(true); if (isUserAgreedBefore) { LoaderBottomSheet.hideLoader(); navigateToHomeScreen(); } else { - myAppointmentsVM.setIsAppointmentDataToBeLoaded(true); LoaderBottomSheet.hideLoader(); navigateToHomeScreen(); //Agreement page not designed yet so we are navigating to home screen directly @@ -833,8 +835,8 @@ class AuthenticationViewModel extends ChangeNotifier { } Future onRegistrationComplete() async { - // LoaderBottomSheet.showLoader(); - LoadingUtils.showFullScreenLoader(loadingText: "Setting up your medical file.\nMay take a moment."); + LoaderBottomSheet.showLoader(); + // LoadingUtils.showFullScreenLoader(loadingText: "Setting up your medical file.\nMay take a moment."); var request = RequestUtils.getUserSignupCompletionRequest(fullName: nameController.text, emailAddress: emailController.text, gender: genderType, maritalStatus: maritalStatus); final resultEither = await _authenticationRepo.registerUser(registrationPayloadDataModelRequest: request); diff --git a/lib/presentation/profile_settings/profile_settings.dart b/lib/presentation/profile_settings/profile_settings.dart index 82150ca7..3a44d1fd 100644 --- a/lib/presentation/profile_settings/profile_settings.dart +++ b/lib/presentation/profile_settings/profile_settings.dart @@ -1,3 +1,4 @@ +import 'dart:async'; import 'dart:io'; import 'package:easy_localization/easy_localization.dart'; @@ -44,6 +45,9 @@ class ProfileSettings extends StatefulWidget { class ProfileSettingsState extends State { @override void initState() { + scheduleMicrotask(() { + insuranceViewModel.initInsuranceProvider(); + }); super.initState(); } @@ -81,9 +85,11 @@ class ProfileSettingsState extends State { int length = 3; final SwiperController _controller = SwiperController(); + late InsuranceViewModel insuranceViewModel; @override Widget build(BuildContext context) { + insuranceViewModel = Provider.of(context, listen: false); return CollapsingListView( title: LocaleKeys.profileAndSettings.tr(context: context), logout: () { From f46b3f745f60bd2dbf778b5a31a0bbe6aed10016 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 5 Mar 2026 16:22:08 +0300 Subject: [PATCH 20/27] Dark mode enabled --- assets/images/svg/dark_mode_icon.svg | 3 + assets/langs/ar-SA.json | 3 +- assets/langs/en-US.json | 3 +- lib/core/api/api_client.dart | 2 +- lib/core/app_assets.dart | 1 + lib/core/utils/utils.dart | 14 +- lib/extensions/string_extensions.dart | 4 +- lib/extensions/widget_extensions.dart | 14 +- .../models/ui_models/vital_sign_ui_model.dart | 2 +- .../profile_settings_view_model.dart | 12 +- lib/generated/locale_keys.g.dart | 3 +- lib/main.dart | 49 ++- .../active_medication_page.dart | 10 +- .../allergies/allergies_list_page.dart | 4 +- .../appointment_details_page.dart | 26 +- .../appointment_payment_page.dart | 1 + .../widgets/appointment_card.dart | 6 +- .../widgets/appointment_doctor_card.dart | 6 +- .../hospital_list_items.dart | 1 + .../region_bottomsheet/region_list_item.dart | 1 + .../region_list_widget.dart | 5 +- .../widgets/ask_doctor_appointment_card.dart | 2 +- lib/presentation/authentication/register.dart | 2 +- .../authentication/register_step2.dart | 2 +- .../book_appointment_page.dart | 42 +- .../doctor_filter/doctors_filter.dart | 2 +- .../book_appointment/doctor_profile_page.dart | 6 +- .../immediate_livecare_payment_details.dart | 2 +- .../immediate_livecare_payment_page.dart | 1 + .../widgets/select_livecare_call_type.dart | 2 +- .../review_appointment_page.dart | 2 +- .../waiting_appointment_payment_page.dart | 1 + .../widgets/appointment_calendar.dart | 8 +- .../book_appointment/widgets/clinic_card.dart | 2 +- .../book_appointment/widgets/doctor_card.dart | 2 +- .../widgets/doctor_rating_details.dart | 20 +- .../contact_us/live_chat_page.dart | 6 +- .../contact_us/widgets/find_us_item_card.dart | 4 +- .../covid19test/covid_payment_screen.dart | 1 + .../e_referral/new_e_referral.dart | 2 +- .../e_referral/widget/e-referral_otp.dart | 3 +- .../widget/e_referral_requester_form.dart | 7 +- .../RRT/rrt_request_type_select.dart | 2 +- .../call_ambulance/call_ambulance_page.dart | 2 +- .../widgets/type_selection_widget.dart | 2 + .../emergency_services_page.dart | 34 +- .../er_online_checkin_payment_page.dart | 1 + .../widget/ambulance_history_item.dart | 2 +- .../history/widget/rrt_item.dart | 2 +- .../widgets/nearestERItem.dart | 2 +- .../habib_wallet/recharge_wallet_page.dart | 10 +- .../wallet_payment_confirm_page.dart | 5 +- .../widgets/hospital_list_item.dart | 1 + .../health_calculators_page.dart | 20 +- .../widgets/bf.dart | 20 +- .../widgets/bmi.dart | 8 +- .../widgets/bmr.dart | 18 +- .../widgets/calories.dart | 18 +- .../widgets/crabs.dart | 8 +- .../widgets/ibw.dart | 12 +- .../widgets/ovulation.dart | 4 +- .../add_health_tracker_entry_page.dart | 2 +- .../health_trackers/health_trackers_page.dart | 2 +- .../hmg_services/services_page.dart | 4 +- .../hmg_services/services_view.dart | 1 + .../home/data/landing_page_data.dart | 11 +- .../home/data/service_card_data.dart | 10 +- .../home/widgets/habib_wallet_card.dart | 4 +- .../home/widgets/large_service_card.dart | 5 +- .../home/widgets/small_service_card.dart | 27 +- .../home_health_care/hhc_procedures_page.dart | 2 +- .../LabResultByClinic.dart | 6 +- .../ai_analysis_widget.dart | 8 +- .../lab_ai_analysis_detailed_page.dart | 2 +- lib/presentation/lab/search_lab_report.dart | 5 +- .../medical_file/medical_file_page.dart | 60 +-- .../medical_file/widgets/lab_rad_card.dart | 1 + .../widgets/medical_file_card.dart | 2 +- .../widgets/patient_sick_leave_card.dart | 6 +- .../medical_report/medical_reports_page.dart | 4 +- .../monthly_report/monthly_report.dart | 2 +- .../widgets/invoice_list_card.dart | 2 +- .../prescription_detail_page.dart | 4 +- .../prescriptions/prescription_item_view.dart | 2 +- .../profile_settings/profile_settings.dart | 42 +- .../radiology/radiology_result_page.dart | 8 +- .../radiology/search_radiology.dart | 5 +- .../smartwatches/widgets/health_chart.dart | 2 +- .../possible_conditions_screen.dart | 2 +- .../symptoms_checker/risk_factors_screen.dart | 2 +- .../symptoms_checker/suggestions_screen.dart | 2 +- .../symptoms_selector_screen.dart | 2 +- .../symptoms_checker/triage_screen.dart | 2 +- .../widgets/organ_dot_widget.dart | 2 +- .../ancillary_order_payment_page.dart | 1 + .../ancillary_procedures_details_page.dart | 2 +- .../water_monitor/water_consumption_page.dart | 2 +- .../water_monitor_settings_page.dart | 2 +- lib/theme/app_theme.dart | 53 ++- lib/theme/colors.dart | 408 +++++++++++++----- lib/widgets/appbar/app_bar_widget.dart | 2 +- lib/widgets/appbar/collapsing_toolbar.dart | 2 +- lib/widgets/arrow_back.dart | 7 +- .../bottom_navigation/bottom_navigation.dart | 28 +- lib/widgets/bottom_sheet.dart | 5 +- lib/widgets/buttons/default_button.dart | 3 +- lib/widgets/chip/app_custom_chip_widget.dart | 32 +- lib/widgets/chip/custom_selectable_chip.dart | 7 +- lib/widgets/common_bottom_sheet.dart | 9 +- lib/widgets/countdown_timer.dart | 3 +- lib/widgets/custom_tab_bar.dart | 32 +- .../date_range_calender.dart | 8 +- lib/widgets/datepicker_widget.dart | 2 +- lib/widgets/dialogs/confirm_dialog.dart | 4 +- .../dropdown/country_dropdown_widget.dart | 4 +- lib/widgets/dropdown/dropdown_widget.dart | 12 +- lib/widgets/expandable_list_widget.dart | 11 +- .../family_files/family_file_add_widget.dart | 2 +- lib/widgets/graph/custom_graph.dart | 39 +- lib/widgets/image_picker.dart | 7 +- lib/widgets/input_widget.dart | 4 +- lib/widgets/loader/bottomsheet_loader.dart | 5 +- lib/widgets/map/map_utility_screen.dart | 2 +- lib/widgets/nfc/nfc_reader_sheet.dart | 2 +- 124 files changed, 823 insertions(+), 578 deletions(-) create mode 100644 assets/images/svg/dark_mode_icon.svg diff --git a/assets/images/svg/dark_mode_icon.svg b/assets/images/svg/dark_mode_icon.svg new file mode 100644 index 00000000..f3a03f1c --- /dev/null +++ b/assets/images/svg/dark_mode_icon.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 3635e650..0886f376 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -1581,5 +1581,6 @@ "invalidInsurance": "لا يمكنك إجراء الدفع عبر الإنترنت لأنه ليس لديك تأمين صالح.", "continueCash": "متابعة الدفع نقدًا", "timeFor": "الوقت", - "hmgPolicies": "سياسات مجموعة الحبيب الطبية" + "hmgPolicies": "سياسات مجموعة الحبيب الطبية", + "darkMode": "المظهر الداكن" } diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 15d78000..294201db 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -1574,5 +1574,6 @@ "invalidInsurance": "You cannot make online payment because you do not have a valid insurance.", "continueCash": "Continue as cash", "timeFor": "Time For", - "hmgPolicies": "HMG Policies" + "hmgPolicies": "HMG Policies", + "darkMode": "Dark Mode" } diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index f9c44e76..106b8fd4 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -195,7 +195,7 @@ class ApiClientImp implements ApiClient { } // body['TokenID'] = "@dm!n"; - // body['PatientID'] = 4773922; + // body['PatientID'] = 4772997; // body['PatientTypeID'] = 1; // body['PatientOutSA'] = 0; // body['SessionID'] = "45786230487560q"; diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index 942eb46b..efe62775 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -331,6 +331,7 @@ class AppAssets { static const String doctorResponseIcon = '$svgBasePath/doctor_response_icon.svg'; static const String changeLanguageHomePageIcon = '$svgBasePath/change_language_home_page.svg'; static const String aiOverView = '$svgBasePath/ai_overview.svg'; + static const String darkModeIcon = '$svgBasePath/dark_mode_icon.svg'; // PNGS // static const String hmgLogo = '$pngBasePath/hmg_logo.png'; diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart index 8b5b2849..0d600bd7 100644 --- a/lib/core/utils/utils.dart +++ b/lib/core/utils/utils.dart @@ -664,10 +664,12 @@ class Utils { double width = 24, double height = 24, BoxFit fit = BoxFit.cover, + bool applyThemeColor = true, }) { + final Color? resolvedColor = iconColor ?? (applyThemeColor && AppColors.isDarkMode ? AppColors.textColor : null); return SvgPicture.asset( icon, - colorFilter: iconColor != null ? ColorFilter.mode(isDisabled ? iconColor.withOpacity(0.5) : iconColor, BlendMode.srcIn) : null, + colorFilter: resolvedColor != null ? ColorFilter.mode(isDisabled ? resolvedColor.withOpacity(0.5) : resolvedColor, BlendMode.srcIn) : null, width: width, height: height, fit: fit, @@ -801,11 +803,13 @@ class Utils { double? fontSize, double? letterSpacing, FontWeight? fontWeight, - Color iconColor = AppColors.textColor, - Color textColor = AppColors.blackColor, + Color? iconColor, + Color? textColor, bool isSaudiCurrency = true, bool isExpanded = true, }) { + final resolvedIconColor = iconColor ?? AppColors.textColor; + final resolvedTextColor = textColor ?? AppColors.blackColor; return RichText( maxLines: 1, text: TextSpan( @@ -813,13 +817,13 @@ class Utils { WidgetSpan( alignment: PlaceholderAlignment.baseline, baseline: TextBaseline.alphabetic, - child: Utils.buildSvgWithAssets(icon: AppAssets.saudi_riyal_icon, width: iconSize.h, height: iconSize.h, iconColor: iconColor), + child: Utils.buildSvgWithAssets(icon: AppAssets.saudi_riyal_icon, width: iconSize.h, height: iconSize.h, iconColor: resolvedIconColor), ), TextSpan( // text: NumberFormat.currency(locale: 'en_US', symbol: " ", decimalDigits: 0).format(habibWalletAmount), text: " ${habibWalletAmount.toStringAsFixed(2)}", style: TextStyle( - color: textColor, + color: resolvedTextColor, fontSize: fontSize ?? 32.f, letterSpacing: letterSpacing ?? -4, fontFamily: "Poppins", diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 792bff50..ba646cd2 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -234,7 +234,7 @@ extension EmailValidator on String { TextOverflow? textOverflow, String? fontFamily, double? letterSpacing = -0.4, - Color decorationColor = AppColors.errorColor}) => + Color? decorationColor}) => Text( this, maxLines: maxlines, @@ -249,7 +249,7 @@ extension EmailValidator on String { fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), decoration: isUnderLine ? TextDecoration.underline : null, fontFamily: fontFamily ?? (isEnglishOnly ? "Poppins" : getIt.get().getLanguageCode() == "ar" ? 'GESSTwo' : 'Poppins'), - decorationColor: decorationColor), + decorationColor: decorationColor ?? AppColors.errorColor), ); Widget toText17({bool isEnglishOnly = false, Color? color, bool isBold = false, bool isCenter = false}) => Text( diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart index 58754dc9..64672f5f 100644 --- a/lib/extensions/widget_extensions.dart +++ b/lib/extensions/widget_extensions.dart @@ -28,10 +28,10 @@ extension WidgetExtensions on Widget { Widget toShimmer({bool isShow = true, bool isTransparent = false}) => isShow ? Shimmer.fromColors( - baseColor: Color(0xffb9bebe), - highlightColor: Colors.white, + baseColor: AppColors.shimmerBaseColor, + highlightColor: AppColors.shimmerHighlightColor, child: Container( - color: isTransparent ? Colors.transparent : Colors.white.withOpacity(0.3), + color: isTransparent ? Colors.transparent : AppColors.whiteColor.withOpacity(0.3), child: this, ), ) @@ -41,14 +41,14 @@ extension WidgetExtensions on Widget { Widget toShimmer2({bool isShow = true, double radius = 20, double? width, double? height}) => isShow ? Shimmer.fromColors( - baseColor: const Color(0xffe8eff0), - highlightColor: Colors.white, + baseColor: AppColors.shimmerBaseColor, + highlightColor: AppColors.shimmerHighlightColor, child: ClipRRect( borderRadius: BorderRadius.circular(radius), child: Container( width: width, height: height, - color: Colors.white, + color: AppColors.whiteColor, child: this, ), ), @@ -69,7 +69,7 @@ extension WidgetExtensions on Widget { return Container( padding: disablePadding ? EdgeInsets.zero : const EdgeInsets.only(top: 15, bottom: 15, left: 14, right: 14), decoration: BoxDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: BorderRadius.circular(radius), boxShadow: [ BoxShadow( diff --git a/lib/features/hmg_services/models/ui_models/vital_sign_ui_model.dart b/lib/features/hmg_services/models/ui_models/vital_sign_ui_model.dart index 45b0ab65..328ffc93 100644 --- a/lib/features/hmg_services/models/ui_models/vital_sign_ui_model.dart +++ b/lib/features/hmg_services/models/ui_models/vital_sign_ui_model.dart @@ -40,7 +40,7 @@ class VitalSignUiModel { } if (s.contains('high')) { - return const VitalSignUiModel( + return VitalSignUiModel( iconBg: AppColors.chipSecondaryLightRedColor, iconFg: AppColors.primaryRedColor, chipBg: AppColors.chipSecondaryLightRedColor, diff --git a/lib/features/profile_settings/profile_settings_view_model.dart b/lib/features/profile_settings/profile_settings_view_model.dart index 61acb260..2f788c69 100644 --- a/lib/features/profile_settings/profile_settings_view_model.dart +++ b/lib/features/profile_settings/profile_settings_view_model.dart @@ -1,8 +1,18 @@ import 'package:flutter/foundation.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; class ProfileSettingsViewModel extends ChangeNotifier { + bool _isDarkMode = false; - void notify(){ + bool get isDarkMode => _isDarkMode; + + void toggleDarkMode(bool value) { + _isDarkMode = value; + AppColors.isDarkMode = value; + notifyListeners(); + } + + void notify() { notifyListeners(); } } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 78d7f8a3..58639f9c 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -1573,7 +1573,8 @@ abstract class LocaleKeys { static const invalidEligibility = 'invalidEligibility'; static const invalidInsurance = 'invalidInsurance'; static const continueCash = 'continueCash'; + static const timeFor = 'timeFor'; static const hmgPolicies = 'hmgPolicies'; + static const darkMode = 'darkMode'; - static const timeFor = 'Time for'; } diff --git a/lib/main.dart b/lib/main.dart index cff0d043..023404a6 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -62,6 +62,9 @@ Future _firebaseMessagingBackgroundHandler(RemoteMessage message) async { getIt.get().logInfo("Firebase backgroundMessageHandler Main!!!"); } +// flutter3_32 pub run easy_localization:generate -O ./lib/generated -f keys -o locale_keys.g.dart --source-dir ./assets/langs + + class MyHttpOverrides extends HttpOverrides { @override HttpClient createHttpClient(SecurityContext? context) { @@ -247,27 +250,35 @@ class MyApp extends StatelessWidget { return Sizer( builder: (context, orientation, deviceType) { // SizeConfig().init(constraints, orientation); - return MaterialApp( - // title: 'Dr. AlHabib', - title: 'Dr. AlHabib Beta', - builder: (context, mchild) { - return MediaQuery( - data: MediaQuery.of(context).copyWith( - textScaler: TextScaler.noScaling, - alwaysUse24HourFormat: true, - ), - child: mchild!, + return Consumer( + builder: (context, profileVm, _) { + final isArabic = EasyLocalization.of(context)?.locale.languageCode == "ar"; + return MaterialApp( + key: ValueKey('app_theme_${profileVm.isDarkMode}'), + // title: 'Dr. AlHabib', + title: 'Dr. AlHabib Beta', + builder: (context, mchild) { + return MediaQuery( + data: MediaQuery.of(context).copyWith( + textScaler: TextScaler.noScaling, + alwaysUse24HourFormat: true, + ), + child: mchild!, + ); + }, + showSemanticsDebugger: false, + debugShowCheckedModeBanner: false, + localizationsDelegates: context.localizationDelegates, + supportedLocales: context.supportedLocales, + locale: context.locale, + initialRoute: AppRoutes.initialRoute, + routes: AppRoutes.routes, + theme: AppTheme.getTheme(isArabic), + darkTheme: AppTheme.getDarkTheme(isArabic), + themeMode: profileVm.isDarkMode ? ThemeMode.dark : ThemeMode.light, + navigatorKey: getIt.get().navigatorKey, ); }, - showSemanticsDebugger: false, - debugShowCheckedModeBanner: false, - localizationsDelegates: context.localizationDelegates, - supportedLocales: context.supportedLocales, - locale: context.locale, - initialRoute: AppRoutes.initialRoute, - routes: AppRoutes.routes, - theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"), - navigatorKey: getIt.get().navigatorKey, ); }, ); diff --git a/lib/presentation/active_medication/active_medication_page.dart b/lib/presentation/active_medication/active_medication_page.dart index cb114cd4..ae46d402 100644 --- a/lib/presentation/active_medication/active_medication_page.dart +++ b/lib/presentation/active_medication/active_medication_page.dart @@ -171,7 +171,7 @@ class _ActiveMedicationPageState extends State { offset: const Offset(0, -4), child: Text( _getSuffix(selectedDate.day), - style: const TextStyle( + style: TextStyle( fontSize: 12, color: AppColors.textColor, fontWeight: FontWeight.w500, @@ -181,7 +181,7 @@ class _ActiveMedicationPageState extends State { ), TextSpan( text: " ${DateFormat.MMMM().format(selectedDate)}", - style: const TextStyle( + style: TextStyle( color: AppColors.textColor, fontSize: 16, fontWeight: FontWeight.w500, @@ -278,7 +278,7 @@ class _ActiveMedicationPageState extends State { ), ], ).paddingOnly(left: 16, right: 16), - const Divider( + Divider( color: AppColors.greyColor), GestureDetector( onTap: () => showDoseDialog(med), @@ -330,7 +330,7 @@ class _ActiveMedicationPageState extends State { ], ).paddingAll(16), ), - const Divider( + Divider( color: AppColors.greyColor), _buildButtons(), ], @@ -657,7 +657,7 @@ class _ActiveMedicationPageState extends State { builder: (_) => Container( width: double.infinity, height: 460.h, - decoration: const BoxDecoration( + decoration: BoxDecoration( color: AppColors.bottomSheetBgColor, borderRadius: BorderRadius.only( topLeft: Radius.circular(24), diff --git a/lib/presentation/allergies/allergies_list_page.dart b/lib/presentation/allergies/allergies_list_page.dart index adb63f02..06ae2713 100644 --- a/lib/presentation/allergies/allergies_list_page.dart +++ b/lib/presentation/allergies/allergies_list_page.dart @@ -56,7 +56,7 @@ class AllergiesListPage extends StatelessWidget { Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.allergy_info_icon, width: 36.w, height: 36.h, fit: BoxFit.contain).toShimmer2(isShow: true), + Utils.buildSvgWithAssets(icon: AppAssets.allergy_info_icon, width: 36.w, height: 36.h, fit: BoxFit.contain, applyThemeColor: false).toShimmer2(isShow: true), SizedBox(width: 16.h), Expanded( child: Column( @@ -100,7 +100,7 @@ class AllergiesListPage extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.allergy_info_icon, width: 36.w, height: 36.h, fit: BoxFit.contain), + Utils.buildSvgWithAssets(icon: AppAssets.allergy_info_icon, width: 36.w, height: 36.h, fit: BoxFit.contain, applyThemeColor: false), SizedBox(height: 16.h), Row( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index e5961e30..cafb740e 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -241,13 +241,13 @@ class _AppointmentDetailsPageState extends State { }, backgroundColor: AppColors.successColor, borderColor: AppColors.successColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, fontSize: 14.f, fontWeight: FontWeight.w500, borderRadius: 12.r, height: 40.h, icon: AppAssets.confirm_appointment_icon, - iconColor: AppColors.whiteColor, + iconColor: Colors.white, iconSize: 16.h, ) : SizedBox.shrink()) @@ -305,16 +305,16 @@ class _AppointmentDetailsPageState extends State { } }, text: LocaleKeys.getDirections.tr(context: context), - backgroundColor: AppColors.textColor.withValues(alpha: 0.8), + backgroundColor: AppColors.bookAppointment.withValues(alpha: 0.8), borderColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withValues(alpha: 0.01), - textColor: AppColors.whiteColor, + textColor: Colors.white, fontSize: 14.f, fontWeight: FontWeight.w500, borderRadius: 12.r, padding: EdgeInsets.symmetric(horizontal: 10.w), height: 40.h, icon: AppAssets.directions_icon, - iconColor: AppColors.whiteColor, + iconColor: Colors.white, iconSize: 14.h, ).paddingAll(12.h), ), @@ -353,7 +353,7 @@ class _AppointmentDetailsPageState extends State { child: Row( mainAxisSize: MainAxisSize.max, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 35.h, height: 35.h), + Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 35.h, height: 35.h, applyThemeColor: false), SizedBox(width: 8.h), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -841,15 +841,15 @@ class _AppointmentDetailsPageState extends State { }, backgroundColor: AppColors.successColor, borderColor: AppColors.successColor, - textColor: AppColors.whiteColor, - fontSize: 16.f, + textColor: Colors.white, + fontSize: 16.f, fontWeight: FontWeight.w500, borderRadius: 12.r, padding: EdgeInsets.symmetric(horizontal: 10.w), height: 50.h, icon: AppAssets.add_icon, - iconColor: AppColors.whiteColor, - iconSize: 18.h, + iconColor: Colors.white, + iconSize: 18.h, ).paddingSymmetrical(16.h, 24.h) : SizedBox.shrink() : CustomButton( @@ -860,14 +860,14 @@ class _AppointmentDetailsPageState extends State { backgroundColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction), borderColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.01), - textColor: widget.patientAppointmentHistoryResponseModel.nextAction == 15 ? AppColors.textColor : AppColors.whiteColor, + textColor: widget.patientAppointmentHistoryResponseModel.nextAction == 15 ? AppColors.textColor : Colors.white, fontSize: 16.f, fontWeight: FontWeight.w500, borderRadius: 12.r, padding: EdgeInsets.symmetric(horizontal: 10.w), height: 56.h, icon: AppointmentType.getNextActionIcon(widget.patientAppointmentHistoryResponseModel.nextAction), - iconColor: AppColors.whiteColor, + iconColor: Colors.white, iconSize: 18.h, ).paddingSymmetrical(16.h, 24.h), ], @@ -904,7 +904,7 @@ class _AppointmentDetailsPageState extends State { }, backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, fontSize: 16.f, fontWeight: FontWeight.w500, borderRadius: 12.r, diff --git a/lib/presentation/appointments/appointment_payment_page.dart b/lib/presentation/appointments/appointment_payment_page.dart index e70ddf49..d762f795 100644 --- a/lib/presentation/appointments/appointment_payment_page.dart +++ b/lib/presentation/appointments/appointment_payment_page.dart @@ -318,6 +318,7 @@ class _AppointmentPaymentPageState extends State { width: 200.h, height: 80.h, fit: BoxFit.contain, + applyThemeColor: false ).paddingSymmetrical(24.h, 0.h).onPress(() { // payfortVM.setIsApplePayConfigurationLoading(true); if (Utils.havePrivilege(103)) { diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart index 971e9ca8..89a18bf5 100644 --- a/lib/presentation/appointments/widgets/appointment_card.dart +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -96,10 +96,10 @@ class AppointmentCard extends StatelessWidget { children: [ AppCustomChipWidget( icon: isLoading ? AppAssets.walkin_appointment_icon : (isLiveCare ? AppAssets.small_livecare_icon : AppAssets.walkin_appointment_icon), - iconColor: isLoading ? AppColors.textColor : (isLiveCare ? AppColors.whiteColor : AppColors.textColor), + iconColor: isLoading ? AppColors.textColor : (isLiveCare ? Colors.white : AppColors.textColor), labelText: isLoading ? LocaleKeys.walkin.tr(context: context) : (isLiveCare ? LocaleKeys.livecare.tr(context: context) : LocaleKeys.walkin.tr(context: context)), backgroundColor: isLoading ? AppColors.greyColor : (isLiveCare ? AppColors.successColor : AppColors.greyColor), - textColor: isLoading ? AppColors.textColor : (isLiveCare ? AppColors.whiteColor : AppColors.textColor), + textColor: isLoading ? AppColors.textColor : (isLiveCare ? Colors.white : AppColors.textColor), ).toShimmer2(isShow: isLoading), AppCustomChipWidget( labelText: @@ -145,7 +145,7 @@ class AppointmentCard extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h), + Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h, iconColor: AppColors.ratingColorYellow), SizedBox(height: 2.h), (isFoldable || isTablet) ? "${patientAppointmentHistoryResponseModel.decimalDoctorRate}".toText9(isBold: true, color: AppColors.textColor) diff --git a/lib/presentation/appointments/widgets/appointment_doctor_card.dart b/lib/presentation/appointments/widgets/appointment_doctor_card.dart index 467ba640..298e8732 100644 --- a/lib/presentation/appointments/widgets/appointment_doctor_card.dart +++ b/lib/presentation/appointments/widgets/appointment_doctor_card.dart @@ -68,7 +68,7 @@ class AppointmentDoctorCard extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h), + Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h, iconColor: AppColors.ratingColorYellow), SizedBox(height: 2.h), "${patientAppointmentHistoryResponseModel.decimalDoctorRate ?? 0.0}".toText11(isBold: true, color: AppColors.textColor), ], @@ -115,13 +115,13 @@ class AppointmentDoctorCard extends StatelessWidget { icon: !patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? AppAssets.walkin_appointment_icon : AppAssets.small_livecare_icon, - iconColor: !patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? AppColors.textColor : AppColors.whiteColor, + iconColor: !patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? AppColors.textColor : Colors.white, labelText: patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? LocaleKeys.livecare.tr(context: context) : LocaleKeys.walkin.tr(context: context), backgroundColor: !patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? AppColors.greyColor : AppColors.successColor, - textColor: !patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? AppColors.textColor : AppColors.whiteColor, + textColor: !patientAppointmentHistoryResponseModel.isLiveCareAppointment! ? AppColors.textColor : Colors.white, ), ], ), diff --git a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart index 5d9ed8db..b0a717b7 100644 --- a/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart +++ b/lib/presentation/appointments/widgets/hospital_bottom_sheet/hospital_list_items.dart @@ -56,6 +56,7 @@ class HospitalListItem extends StatelessWidget { children: [ Utils.buildSvgWithAssets( icon: (hospitalData?.isHMC == true) ? AppAssets.hmc : AppAssets.hmg, + applyThemeColor: false, ).paddingOnly(right: 10), Expanded( child: Text( diff --git a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart index 969e23af..99f31be6 100644 --- a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart +++ b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart @@ -63,6 +63,7 @@ class RegionListItem extends StatelessWidget { iconSize: 14.h, icon: svgPath, iconHasColor: false, + applyThemeColor: false, richText: RichText( text: TextSpan( text: count, diff --git a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart index 6588c2ea..fad96965 100644 --- a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart +++ b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart @@ -7,6 +7,7 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; import 'package:hmg_patient_app_new/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart' show RegionListItem; +import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:provider/provider.dart'; import '../../../../widgets/common_bottom_sheet.dart'; @@ -52,8 +53,8 @@ class _RegionBottomSheetBodyState extends State { if (myAppointmentsVM.isRegionListLoading) { return Container( height: MediaQuery.of(context).size.height * 0.3, - decoration: const BoxDecoration( - color: Colors.white, + decoration: BoxDecoration( + color: AppColors.whiteColor, borderRadius: BorderRadius.vertical(top: Radius.circular(16)), ), child: Center( diff --git a/lib/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart b/lib/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart index 4ff24c7a..e4185e72 100644 --- a/lib/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart +++ b/lib/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart @@ -109,7 +109,7 @@ class AskDoctorAppointmentCard extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h), + Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h, applyThemeColor: false), SizedBox(height: 2.h), "${askDoctorAppointmentHistoryList.decimalDoctorRate}".toText11(isBold: true, color: AppColors.textColor), ], diff --git a/lib/presentation/authentication/register.dart b/lib/presentation/authentication/register.dart index 2a26a726..9d67920f 100644 --- a/lib/presentation/authentication/register.dart +++ b/lib/presentation/authentication/register.dart @@ -85,7 +85,7 @@ class _RegisterNew extends State { Directionality( textDirection: Directionality.of(context), child: Container( - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(24)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(24)), padding: EdgeInsets.symmetric(horizontal: 16.h), child: Column( children: [ diff --git a/lib/presentation/authentication/register_step2.dart b/lib/presentation/authentication/register_step2.dart index c4bdf0f9..f4968850 100644 --- a/lib/presentation/authentication/register_step2.dart +++ b/lib/presentation/authentication/register_step2.dart @@ -76,7 +76,7 @@ class _RegisterNew extends State { LocaleKeys.personalDetailsVerification.tr(context: context).toText26(color: AppColors.textColor, weight: FontWeight.w600, letterSpacing: -2), SizedBox(height: 24.h), Container( - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(24)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(24)), padding: EdgeInsets.only(left: 16.h, right: 16.h), child: Column( children: [ diff --git a/lib/presentation/book_appointment/book_appointment_page.dart b/lib/presentation/book_appointment/book_appointment_page.dart index 03de8332..ab548449 100644 --- a/lib/presentation/book_appointment/book_appointment_page.dart +++ b/lib/presentation/book_appointment/book_appointment_page.dart @@ -230,7 +230,7 @@ class _BookAppointmentPageState extends State { children: [ Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.search_by_clinic_icon, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.search_by_clinic_icon, width: 40.h, height: 40.h, applyThemeColor: false), SizedBox(width: 12.h), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -262,7 +262,7 @@ class _BookAppointmentPageState extends State { children: [ Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.search_by_doctor_icon, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.search_by_doctor_icon, width: 40.h, height: 40.h, applyThemeColor: false), SizedBox(width: 12.h), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -292,7 +292,7 @@ class _BookAppointmentPageState extends State { children: [ Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.search_by_region_icon, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.search_by_region_icon, width: 40.h, height: 40.h, applyThemeColor: false), SizedBox(width: 12.h), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -336,9 +336,9 @@ class _BookAppointmentPageState extends State { children: [ Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.search_by_clinic_icon, width: 40.h, height: 40.h), - SizedBox(width: 12.h), - Column( + Utils.buildSvgWithAssets(icon: AppAssets.search_by_clinic_icon, width: 40.h, height: 40.h, applyThemeColor: false), + SizedBox(width: 12.h), + Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.immediateConsultation.tr(context: context).toText14(color: AppColors.textColor, weight: FontWeight.w500), @@ -378,9 +378,9 @@ class _BookAppointmentPageState extends State { children: [ Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.search_by_doctor_icon, width: 40.h, height: 40.h), - SizedBox(width: 12.h), - Column( + Utils.buildSvgWithAssets(icon: AppAssets.search_by_doctor_icon, width: 40.h, height: 40.h, applyThemeColor: false), + SizedBox(width: 12.h), + Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ LocaleKeys.scheduledConsultation.tr(context: context).toText14(color: AppColors.textColor, weight: FontWeight.w500), @@ -400,30 +400,6 @@ class _BookAppointmentPageState extends State { ), ); }), - // SizedBox(height: 16.h), - // Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.1), height: 1.h), - // SizedBox(height: 16.h), - // Row( - // mainAxisAlignment: MainAxisAlignment.spaceBetween, - // children: [ - // Row( - // children: [ - // Utils.buildSvgWithAssets(icon: AppAssets.search_by_region_icon, width: 40.h, height: 40.h), - // SizedBox(width: 12.h), - // Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // LocaleKeys.pharmaLiveCare.tr(context: context).toText14(color: AppColors.textColor, weight: FontWeight.w500), - // "".toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500), - // ], - // ), - // ], - // ), - // Transform.flip(flipX: appState.isArabic(), child: Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon, iconColor: AppColors.textColor, width: 40.h, height: 40.h)), - // ], - // ).onPress(() { - // openRegionListBottomSheet(context, RegionBottomSheetType.FOR_REGION); - // }), ], ), ), diff --git a/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart b/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart index d9aa9e5e..9cfcc1f8 100644 --- a/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart +++ b/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart @@ -159,7 +159,7 @@ class DoctorsFilters extends StatelessWidget{ Spacer(), DecoratedBox( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: Colors.white, + color: AppColors.whiteColor, customBorder: BorderRadius.only(topLeft: Radius.circular(24.h), topRight: Radius.circular(24.h)) , ), diff --git a/lib/presentation/book_appointment/doctor_profile_page.dart b/lib/presentation/book_appointment/doctor_profile_page.dart index 25cda6b6..4b2d4dbb 100644 --- a/lib/presentation/book_appointment/doctor_profile_page.dart +++ b/lib/presentation/book_appointment/doctor_profile_page.dart @@ -106,6 +106,7 @@ class DoctorProfilePage extends StatelessWidget { width: 48.w, height: 48.h, fit: BoxFit.contain, + applyThemeColor: false ), SizedBox(height: 16.h), "Ratings".toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), @@ -132,6 +133,7 @@ class DoctorProfilePage extends StatelessWidget { width: 48.w, height: 48.h, fit: BoxFit.contain, + applyThemeColor: false ), SizedBox(height: 16.h), "Reviews".toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), @@ -227,14 +229,14 @@ class DoctorProfilePage extends StatelessWidget { }, backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, fontSize: 16, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 50.h, icon: AppAssets.calendar, - iconColor: AppColors.whiteColor, + iconColor: Colors.white, iconSize: 20.h, ).paddingSymmetrical(24.h, 24.h), ), diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart index e6654f5e..7c2784de 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_details.dart @@ -110,7 +110,7 @@ class ImmediateLiveCarePaymentDetails extends StatelessWidget { children: [ Row( children: [ - Utils.buildSvgWithAssets(icon: getLiveCareTypeIcon(immediateLiveCareVM.liveCareSelectedCallType), width: 32.h, height: 32.h, fit: BoxFit.contain), + Utils.buildSvgWithAssets(icon: getLiveCareTypeIcon(immediateLiveCareVM.liveCareSelectedCallType), width: 32.h, height: 32.h, fit: BoxFit.contain, applyThemeColor: false), SizedBox(width: 8.h), getLiveCareType(context, immediateLiveCareVM.liveCareSelectedCallType).toText16(isBold: true), ], diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart index 73da69f5..4018b42a 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_payment_page.dart @@ -292,6 +292,7 @@ class _ImmediateLiveCarePaymentPageState extends State { }, backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, fontSize: 16, fontWeight: FontWeight.w500, borderRadius: 12, diff --git a/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_payment_page.dart b/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_payment_page.dart index abd8d102..663fd5b4 100644 --- a/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_payment_page.dart +++ b/lib/presentation/book_appointment/waiting_appointment/waiting_appointment_payment_page.dart @@ -313,6 +313,7 @@ class _WaitingAppointmentPaymentPageState extends State { }, backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, fontSize: 16.f, fontWeight: FontWeight.w500, borderRadius: 10.r, @@ -344,7 +344,7 @@ class TimeSlotChip extends StatelessWidget { ? Container( padding: EdgeInsets.symmetric(horizontal: 14.h, vertical: 8.h), decoration: ShapeDecoration( - color: isSelected ? AppColors.warningColorYellow : AppColors.whiteColor, + color: isSelected ? AppColors.warningColorYellow : AppColors.textColor, shape: SmoothRectangleBorder( borderRadius: BorderRadius.circular(8.h), smoothness: 1, @@ -367,8 +367,8 @@ class TimeSlotChip extends StatelessWidget { ), ), child: label.toText12( - color: isSelected ? AppColors.primaryRedColor : Colors.black87, - fontWeight: FontWeight.w500, + color: isSelected ? AppColors.primaryRedColor : AppColors.textColor, + fontWeight: FontWeight.w500, ), ), ); diff --git a/lib/presentation/book_appointment/widgets/clinic_card.dart b/lib/presentation/book_appointment/widgets/clinic_card.dart index 7e3c8df1..e7a6ca3a 100644 --- a/lib/presentation/book_appointment/widgets/clinic_card.dart +++ b/lib/presentation/book_appointment/widgets/clinic_card.dart @@ -34,7 +34,7 @@ class ClinicCard extends StatelessWidget { Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Utils.buildSvgWithAssets(icon: "assets/images/clinicIcons/${clinicsListResponseModel.clinicID ?? 1}.svg", width: 24.w, height: 24.h, fit: BoxFit.contain).toShimmer2(isShow: isLoading), (clinicsListResponseModel.isLiveCareClinicAndOnline ?? true) - ? Utils.buildSvgWithAssets(icon: AppAssets.livecare_clinic_icon, width: 32.w, height: 32.h, fit: BoxFit.contain).toShimmer2(isShow: isLoading) + ? Utils.buildSvgWithAssets(icon: AppAssets.livecare_clinic_icon, width: 32.w, height: 32.h, fit: BoxFit.contain, applyThemeColor: false).toShimmer2(isShow: isLoading) : SizedBox.shrink(), ], ), diff --git a/lib/presentation/book_appointment/widgets/doctor_card.dart b/lib/presentation/book_appointment/widgets/doctor_card.dart index ddb43e9d..9e3c69d1 100644 --- a/lib/presentation/book_appointment/widgets/doctor_card.dart +++ b/lib/presentation/book_appointment/widgets/doctor_card.dart @@ -72,7 +72,7 @@ class DoctorCard extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h), + Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h, applyThemeColor: false), SizedBox(height: 2.h), "${isLoading ? 4.78 : doctorsListResponseModel.decimalDoctorRate}".toText11(isBold: true, color: AppColors.textColor), ], diff --git a/lib/presentation/book_appointment/widgets/doctor_rating_details.dart b/lib/presentation/book_appointment/widgets/doctor_rating_details.dart index 0ed54862..6d9e1cb2 100644 --- a/lib/presentation/book_appointment/widgets/doctor_rating_details.dart +++ b/lib/presentation/book_appointment/widgets/doctor_rating_details.dart @@ -69,13 +69,13 @@ class DoctorRatingDetails extends StatelessWidget { Container( width: 100.0, margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0), - child: Text(LocaleKeys.excellent.tr(context: context), style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))), + child: Text(LocaleKeys.excellent.tr(context: context), style: TextStyle(fontSize: 13.0, color: AppColors.textColor, fontWeight: FontWeight.w600))), getRatingLine(bookAppointmentsVM.doctorDetailsList[0].ratio, Colors.green[700]!), ], ), Container( margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0), - child: Text("${getRatingWidth(bookAppointmentsVM.doctorDetailsList[0].ratio).round()}%", style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)), + child: Text("${getRatingWidth(bookAppointmentsVM.doctorDetailsList[0].ratio).round()}%", style: TextStyle(fontSize: 14.0, color: AppColors.textColor, fontWeight: FontWeight.w600)), ), ], ), @@ -89,13 +89,13 @@ class DoctorRatingDetails extends StatelessWidget { Container( width: 100.0, margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0), - child: Text(LocaleKeys.vGood.tr(context: context), style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))), + child: Text(LocaleKeys.vGood.tr(context: context), style: TextStyle(fontSize: 13.0, color: AppColors.textColor, fontWeight: FontWeight.w600))), getRatingLine(bookAppointmentsVM.doctorDetailsList[1].ratio, Color(0xffB7B723)), ], ), Container( margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0), - child: Text("${bookAppointmentsVM.doctorDetailsList[1].ratio.round()}%", style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)), + child: Text("${bookAppointmentsVM.doctorDetailsList[1].ratio.round()}%", style: TextStyle(fontSize: 14.0, color: AppColors.textColor, fontWeight: FontWeight.w600)), ), ], ), @@ -109,13 +109,13 @@ class DoctorRatingDetails extends StatelessWidget { Container( width: 100.0, margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0), - child: Text(LocaleKeys.good.tr(context: context), style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))), + child: Text(LocaleKeys.good.tr(context: context), style: TextStyle(fontSize: 13.0, color: AppColors.textColor, fontWeight: FontWeight.w600))), getRatingLine(bookAppointmentsVM.doctorDetailsList[2].ratio, Color(0xffEBA727)), ], ), Container( margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0), - child: Text("${bookAppointmentsVM.doctorDetailsList[2].ratio.round()}%", style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)), + child: Text("${bookAppointmentsVM.doctorDetailsList[2].ratio.round()}%", style: TextStyle(fontSize: 14.0, color: AppColors.textColor, fontWeight: FontWeight.w600)), ), ], ), @@ -129,13 +129,13 @@ class DoctorRatingDetails extends StatelessWidget { Container( width: 100.0, margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0), - child: Text(LocaleKeys.average.tr(context: context), style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))), + child: Text(LocaleKeys.average.tr(context: context), style: TextStyle(fontSize: 13.0, color: AppColors.textColor, fontWeight: FontWeight.w600))), getRatingLine(bookAppointmentsVM.doctorDetailsList[3].ratio, Color(0xffEB7227)), ], ), Container( margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0), - child: Text("${bookAppointmentsVM.doctorDetailsList[3].ratio.round()}%", style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)), + child: Text("${bookAppointmentsVM.doctorDetailsList[3].ratio.round()}%", style: TextStyle(fontSize: 14.0, color: AppColors.textColor, fontWeight: FontWeight.w600)), ), ], ), @@ -150,13 +150,13 @@ class DoctorRatingDetails extends StatelessWidget { Container( width: 100.0, margin: EdgeInsets.only(top: 10.0, left: 15.0, right: 15.0), - child: Text(LocaleKeys.average.tr(context: context), style: TextStyle(fontSize: 13.0, color: Colors.black, fontWeight: FontWeight.w600))), + child: Text(LocaleKeys.average.tr(context: context), style: TextStyle(fontSize: 13.0, color: AppColors.textColor, fontWeight: FontWeight.w600))), getRatingLine(bookAppointmentsVM.doctorDetailsList[4].ratio, Color(0xffE20C0C)), ], ), Container( margin: EdgeInsets.only(top: 10.0, left: 10.0, right: 10.0), - child: Text("${bookAppointmentsVM.doctorDetailsList[4].ratio.round()}%", style: TextStyle(fontSize: 14.0, color: Colors.black, fontWeight: FontWeight.w600)), + child: Text("${bookAppointmentsVM.doctorDetailsList[4].ratio.round()}%", style: TextStyle(fontSize: 14.0, color: AppColors.textColor, fontWeight: FontWeight.w600)), ), ], ), diff --git a/lib/presentation/contact_us/live_chat_page.dart b/lib/presentation/contact_us/live_chat_page.dart index a602eb14..5d09a64f 100644 --- a/lib/presentation/contact_us/live_chat_page.dart +++ b/lib/presentation/contact_us/live_chat_page.dart @@ -122,12 +122,12 @@ class LiveChatPage extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ ("${appState.isArabic() ? contactUsVM.liveChatProjectsList[index].projectNameN! : contactUsVM.liveChatProjectsList[index].projectName!}\n${contactUsVM.liveChatProjectsList[index].distanceInKilometers!} KM") - .toText14(isBold: true, color: contactUsVM.selectedLiveChatProjectIndex == index ? AppColors.whiteColor : AppColors.textColor), + .toText14(isBold: true, color: contactUsVM.selectedLiveChatProjectIndex == index ? Colors.white : AppColors.textColor), Transform.flip( flipX: getIt.get().isArabic(), child: Utils.buildSvgWithAssets( icon: AppAssets.forward_arrow_icon_small, - iconColor: contactUsVM.selectedLiveChatProjectIndex == index ? AppColors.whiteColor : AppColors.textColor, + iconColor: contactUsVM.selectedLiveChatProjectIndex == index ? Colors.white : AppColors.textColor, width: 18.h, height: 13.h, fit: BoxFit.contain, @@ -235,7 +235,7 @@ class LiveChatPage extends StatelessWidget { }, backgroundColor: contactUsVM.selectedLiveChatProjectIndex == -1 ? AppColors.greyColor : AppColors.primaryRedColor, borderColor: contactUsVM.selectedLiveChatProjectIndex == -1 ? AppColors.greyColor : AppColors.primaryRedColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, fontSize: 16, fontWeight: FontWeight.w500, borderRadius: 12, diff --git a/lib/presentation/contact_us/widgets/find_us_item_card.dart b/lib/presentation/contact_us/widgets/find_us_item_card.dart index 1774404d..4738a63a 100644 --- a/lib/presentation/contact_us/widgets/find_us_item_card.dart +++ b/lib/presentation/contact_us/widgets/find_us_item_card.dart @@ -102,9 +102,9 @@ class FindUsItemCard extends StatelessWidget { AppCustomChipWidget( labelText: LocaleKeys.callNow.tr(), icon: AppAssets.call_fill, - iconColor: AppColors.whiteColor, + iconColor: Colors.white, backgroundColor: AppColors.primaryRedColor.withValues(alpha: 1.0), - textColor: AppColors.whiteColor, + textColor: Colors.white, onChipTap: () { launchUrl(Uri.parse("tel://" + "${getHMGLocationsModel.phoneNumber}")); }, diff --git a/lib/presentation/covid19test/covid_payment_screen.dart b/lib/presentation/covid19test/covid_payment_screen.dart index e395a426..40bf2863 100644 --- a/lib/presentation/covid19test/covid_payment_screen.dart +++ b/lib/presentation/covid19test/covid_payment_screen.dart @@ -133,6 +133,7 @@ class _CovidPaymentScreenState extends State { width: 200.h, height: 80.h, fit: BoxFit.contain, + applyThemeColor: false ).paddingSymmetrical(24.h, 0.h).onPress(() { if (Utils.havePrivilege(103)) { startApplePay(); diff --git a/lib/presentation/e_referral/new_e_referral.dart b/lib/presentation/e_referral/new_e_referral.dart index 02881730..844ef5d5 100644 --- a/lib/presentation/e_referral/new_e_referral.dart +++ b/lib/presentation/e_referral/new_e_referral.dart @@ -171,7 +171,7 @@ class _NewReferralPageState extends State { ); }, bottomChild: Container( - color: Colors.white, + color: AppColors.whiteColor, padding: EdgeInsets.all(ResponsiveExtension(20).h), child: CustomButton( text: _currentStep <= 1 ? LocaleKeys.next.tr() : LocaleKeys.submit.tr(), diff --git a/lib/presentation/e_referral/widget/e-referral_otp.dart b/lib/presentation/e_referral/widget/e-referral_otp.dart index 390fc71f..17ae4272 100644 --- a/lib/presentation/e_referral/widget/e-referral_otp.dart +++ b/lib/presentation/e_referral/widget/e-referral_otp.dart @@ -90,7 +90,8 @@ class OTPService { }, backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedBorderColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, + iconColor: Colors.white, icon: AppAssets.message, ), ), diff --git a/lib/presentation/e_referral/widget/e_referral_requester_form.dart b/lib/presentation/e_referral/widget/e_referral_requester_form.dart index b49846f4..d57abe23 100644 --- a/lib/presentation/e_referral/widget/e_referral_requester_form.dart +++ b/lib/presentation/e_referral/widget/e_referral_requester_form.dart @@ -6,6 +6,7 @@ import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/e_referral/e_referral_form_manager.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/features/hmg_services/hmg_services_view_model.dart'; @@ -121,7 +122,7 @@ class RequesterFormStepState extends State { errorMessage: formManager.errors.relationship, hasError: !ValidationUtils.isNullOrEmpty(formManager.errors.relationship), hasSelectionCustomIcon: false, - labelColor: Colors.black, + labelColor: AppColors.textColor, padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16), leadingIcon: AppAssets.user_circle, dropdownItems: [], @@ -171,8 +172,8 @@ class RequesterFormStepState extends State { return DecoratedBox( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: Colors.white, - customBorder: BorderRadius.all(Radius.circular(24.h)) , + color: AppColors.whiteColor, + customBorder: BorderRadius.all(Radius.circular(24.h)) , ), child: ListView.builder( shrinkWrap: true, diff --git a/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart b/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart index 91db0ded..c17f3560 100644 --- a/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart +++ b/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart @@ -28,7 +28,7 @@ class RrtRequestTypeSelect extends StatelessWidget { ), DecoratedBox( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: 20.r, ), child: OptionSelection(context)), diff --git a/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart b/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart index 5a368a3b..e5578a3e 100644 --- a/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart +++ b/lib/presentation/emergency_services/call_ambulance/call_ambulance_page.dart @@ -79,7 +79,7 @@ class CallAmbulancePage extends StatelessWidget { ), Align( alignment: AlignmentDirectional.topStart, - child: Utils.buildSvgWithAssets(icon: AppAssets.closeBottomNav, width: 32.h, height: 32.h).onPress(() { + child: Utils.buildSvgWithAssets(icon: AppAssets.closeBottomNav, width: 32.h, height: 32.h, applyThemeColor: false).onPress(() { context.read().flushPickupInformation(); Navigator.pop(context); }), diff --git a/lib/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart b/lib/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart index 3ae93d0d..9ad98cb6 100644 --- a/lib/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart +++ b/lib/presentation/emergency_services/call_ambulance/widgets/type_selection_widget.dart @@ -52,6 +52,7 @@ class TypeSelectionWidget extends StatelessWidget { child: AppCustomChipWidget( icon: AppAssets.hmg, iconHasColor: false, + applyThemeColor: false, labelText: LocaleKeys.hmgHospitals.tr(context: context), shape: RoundedRectangleBorder( side: BorderSide( @@ -76,6 +77,7 @@ class TypeSelectionWidget extends StatelessWidget { child: AppCustomChipWidget( icon: AppAssets.hmc, iconHasColor: false, + applyThemeColor: false, labelText: LocaleKeys.hmcMedicalClinic.tr(context: context), shape: RoundedRectangleBorder( side: BorderSide( diff --git a/lib/presentation/emergency_services/emergency_services_page.dart b/lib/presentation/emergency_services/emergency_services_page.dart index a5281ca0..41597e40 100644 --- a/lib/presentation/emergency_services/emergency_services_page.dart +++ b/lib/presentation/emergency_services/emergency_services_page.dart @@ -53,7 +53,7 @@ class EmergencyServicesPage extends StatelessWidget { ), child: Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.call_ambulance_icon, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.call_ambulance_icon, width: 40.h, height: 40.h, applyThemeColor: false), SizedBox(width: 12.h), Expanded( child: Column( @@ -87,7 +87,7 @@ class EmergencyServicesPage extends StatelessWidget { "".toText14(), Utils.buildSvgWithAssets( icon: AppAssets.cancel_circle_icon, - iconColor: AppColors.whiteColor, + iconColor: Colors.white, width: 24.h, height: 24.h, fit: BoxFit.contain, @@ -99,10 +99,10 @@ class EmergencyServicesPage extends StatelessWidget { Lottie.asset(AppAnimations.ambulanceAlert, repeat: false, reverse: false, frameRate: FrameRate(60), width: 120.h, height: 120.h, fit: BoxFit.contain), SizedBox(height: 8.h), - LocaleKeys.confirmation.tr().toText28(color: AppColors.whiteColor, isBold: true), + LocaleKeys.confirmation.tr().toText28(color: Colors.white, isBold: true), SizedBox(height: 8.h), LocaleKeys.areYouSureYouWantToCallAmbulance.tr() - .toText14(color: AppColors.whiteColor, weight: FontWeight.w500), + .toText14(color: Colors.white, weight: FontWeight.w500), SizedBox(height: 24.h), CustomButton( text: LocaleKeys.confirm.tr(context: context), @@ -111,8 +111,8 @@ class EmergencyServicesPage extends StatelessWidget { await emergencyServicesViewModel.getTransportationOption(); openTranportationSelectionBottomSheet(context); }, - backgroundColor: AppColors.whiteColor, - borderColor: AppColors.whiteColor, + backgroundColor: Colors.white, + borderColor: Colors.white, textColor: AppColors.primaryRedColor, icon: AppAssets.checkmark_icon, iconColor: AppColors.primaryRedColor, @@ -140,7 +140,7 @@ class EmergencyServicesPage extends StatelessWidget { ), child: Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.nearest_er_icon, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.nearest_er_icon, width: 40.h, height: 40.h, applyThemeColor: false), SizedBox(width: 12.h), Expanded( child: Column( @@ -169,7 +169,7 @@ class EmergencyServicesPage extends StatelessWidget { ), child: Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.rrt_icon, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.rrt_icon, width: 40.h, height: 40.h, applyThemeColor: false), SizedBox(width: 12.h), Expanded( child: Column( @@ -199,10 +199,10 @@ class EmergencyServicesPage extends StatelessWidget { children: [ Lottie.asset(AppAnimations.ambulanceAlert, repeat: false, reverse: false, frameRate: FrameRate(60), width: 120.h, height: 120.h, fit: BoxFit.contain), SizedBox(height: 8.h), - LocaleKeys.confirm.tr().toText28(color: AppColors.whiteColor, isBold: true), + LocaleKeys.confirm.tr().toText28(color: Colors.white, isBold: true), SizedBox(height: 8.h), LocaleKeys.areYouSureYouWantToCallRRT.tr() - .toText14(color: AppColors.whiteColor, weight: FontWeight.w500), + .toText14(color: Colors.white, weight: FontWeight.w500), SizedBox(height: 24.h), CustomButton( text: LocaleKeys.confirm.tr(context: context), @@ -237,8 +237,8 @@ class EmergencyServicesPage extends StatelessWidget { ); }); }, - backgroundColor: AppColors.whiteColor, - borderColor: AppColors.whiteColor, + backgroundColor: Colors.white, + borderColor: Colors.white, textColor: AppColors.primaryRedColor, icon: AppAssets.checkmark_icon, iconColor: AppColors.primaryRedColor, @@ -268,7 +268,7 @@ class EmergencyServicesPage extends StatelessWidget { ), child: Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.rrt_icon, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.rrt_icon, width: 40.h, height: 40.h, applyThemeColor: false), SizedBox(width: 12.h), Expanded( child: Column( @@ -311,9 +311,9 @@ class EmergencyServicesPage extends StatelessWidget { Lottie.asset(AppAnimations.ambulanceAlert, repeat: false, reverse: false, frameRate: FrameRate(60), width: 120.h, height: 120.h, fit: BoxFit.contain), SizedBox(height: 8.h), - LocaleKeys.confirm.tr().toText28(color: AppColors.whiteColor, isBold: true), + LocaleKeys.confirm.tr().toText28(color: Colors.white, isBold: true), SizedBox(height: 8.h), - LocaleKeys.areYouSureYouWantToMakeERCheckIn.tr().toText14(color: AppColors.whiteColor, weight: FontWeight.w500), + LocaleKeys.areYouSureYouWantToMakeERCheckIn.tr().toText14(color: Colors.white, weight: FontWeight.w500), SizedBox(height: 24.h), CustomButton( text: LocaleKeys.confirm.tr(context: context), @@ -325,8 +325,8 @@ class EmergencyServicesPage extends StatelessWidget { context.read().navigateToEROnlineCheckIn(); }); }, - backgroundColor: AppColors.whiteColor, - borderColor: AppColors.whiteColor, + backgroundColor: Colors.white, + borderColor: Colors.white, textColor: AppColors.primaryRedColor, icon: AppAssets.checkmark_icon, iconColor: AppColors.primaryRedColor, diff --git a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart index 26456794..8b9633c1 100644 --- a/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart +++ b/lib/presentation/emergency_services/er_online_checkin/er_online_checkin_payment_page.dart @@ -288,6 +288,7 @@ class _ErOnlineCheckinPaymentPageState extends State width: 200.h, height: 80.h, fit: BoxFit.contain, + applyThemeColor: false ).paddingSymmetrical(24.h, 0.h).onPress(() { if (Utils.havePrivilege(103)) { startApplePay(); diff --git a/lib/presentation/emergency_services/history/widget/ambulance_history_item.dart b/lib/presentation/emergency_services/history/widget/ambulance_history_item.dart index 7b17eab8..e1ebc83c 100644 --- a/lib/presentation/emergency_services/history/widget/ambulance_history_item.dart +++ b/lib/presentation/emergency_services/history/widget/ambulance_history_item.dart @@ -26,7 +26,7 @@ class AmbulanceHistoryItem extends StatelessWidget { Widget build(BuildContext context) { return DecoratedBox( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: Colors.white, + color: AppColors.whiteColor, hasShadow: true, customBorder: BorderRadius.all( Radius.circular(20.h), diff --git a/lib/presentation/emergency_services/history/widget/rrt_item.dart b/lib/presentation/emergency_services/history/widget/rrt_item.dart index d345e2df..c8787791 100644 --- a/lib/presentation/emergency_services/history/widget/rrt_item.dart +++ b/lib/presentation/emergency_services/history/widget/rrt_item.dart @@ -26,7 +26,7 @@ class RRTItem extends StatelessWidget { Widget build(BuildContext context) { return DecoratedBox( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: Colors.white, + color: AppColors.whiteColor, hasShadow: true, customBorder: BorderRadius.all( Radius.circular(20.h), diff --git a/lib/presentation/emergency_services/widgets/nearestERItem.dart b/lib/presentation/emergency_services/widgets/nearestERItem.dart index 2226f82b..fae19a0a 100644 --- a/lib/presentation/emergency_services/widgets/nearestERItem.dart +++ b/lib/presentation/emergency_services/widgets/nearestERItem.dart @@ -27,7 +27,7 @@ class NearestERItem extends StatelessWidget { Widget build(BuildContext context) { return Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: Colors.white, + color: AppColors.whiteColor, customBorder: BorderRadius.only( topLeft: Radius.circular(24.h), topRight: Radius.circular(24.h), diff --git a/lib/presentation/habib_wallet/recharge_wallet_page.dart b/lib/presentation/habib_wallet/recharge_wallet_page.dart index c4587bf9..ef1642eb 100644 --- a/lib/presentation/habib_wallet/recharge_wallet_page.dart +++ b/lib/presentation/habib_wallet/recharge_wallet_page.dart @@ -133,7 +133,7 @@ class _RechargeWalletPageState extends State { children: [ Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.my_account_icon, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.my_account_icon, width: 40.h, height: 40.h, applyThemeColor: false), SizedBox(width: 8.h), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -171,7 +171,7 @@ class _RechargeWalletPageState extends State { children: [ Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.select_hospital_icon, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.select_hospital_icon, width: 40.h, height: 40.h, applyThemeColor: false), SizedBox(width: 8.h), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -197,7 +197,7 @@ class _RechargeWalletPageState extends State { SizedBox(height: 16.h), Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.email_icon, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.email_icon, width: 40.h, height: 40.h, applyThemeColor: false), SizedBox(width: 8.h), Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -281,14 +281,14 @@ class _RechargeWalletPageState extends State { }, backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, fontSize: 16, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 50.h, icon: AppAssets.appointment_pay_icon, - iconColor: AppColors.whiteColor, + iconColor: Colors.white, iconSize: 18.h, ).paddingSymmetrical(24.h, 24.h), ), diff --git a/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart b/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart index 4585b7d0..9efcb01b 100644 --- a/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart +++ b/lib/presentation/habib_wallet/wallet_payment_confirm_page.dart @@ -188,10 +188,7 @@ class _WalletPaymentConfirmPageState extends State { Platform.isIOS ? Utils.buildSvgWithAssets( icon: AppAssets.apple_pay_button, - width: 200.h, - height: 56.h, - fit: BoxFit.contain, - ).paddingSymmetrical(24.h, 0.h).onPress(() { + width: 200.h, height: 56.h, fit: BoxFit.contain, applyThemeColor: false).paddingSymmetrical(24.h, 0.h).onPress(() { if (Utils.havePrivilege(103)) { startApplePay(); } else { diff --git a/lib/presentation/habib_wallet/widgets/hospital_list_item.dart b/lib/presentation/habib_wallet/widgets/hospital_list_item.dart index a46f79db..67e174a3 100644 --- a/lib/presentation/habib_wallet/widgets/hospital_list_item.dart +++ b/lib/presentation/habib_wallet/widgets/hospital_list_item.dart @@ -54,6 +54,7 @@ class HospitalListItemAdvancePayment extends StatelessWidget { children: [ Utils.buildSvgWithAssets( icon: (hospitalModel.isHMC == true) ? AppAssets.hmc : AppAssets.hmg, + applyThemeColor: false ).paddingOnly(right: 10), Expanded( child: Text( diff --git a/lib/presentation/health_calculators_and_converts/health_calculators_page.dart b/lib/presentation/health_calculators_and_converts/health_calculators_page.dart index aae25b03..4f519d66 100644 --- a/lib/presentation/health_calculators_and_converts/health_calculators_page.dart +++ b/lib/presentation/health_calculators_and_converts/health_calculators_page.dart @@ -39,10 +39,10 @@ class _HealthCalculatorsPageState extends State { ? Column( children: [ Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r), child: Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.general_health, height: 40.h, width: 40.w, fit: BoxFit.none), + Utils.buildSvgWithAssets(icon: AppAssets.general_health, height: 40.h, width: 40.w, fit: BoxFit.none, applyThemeColor: false), SizedBox(width: 12.w), Flexible( child: Column( @@ -70,10 +70,10 @@ class _HealthCalculatorsPageState extends State { }), SizedBox(height: 16.h), Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r), child: Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.women_health, height: 40.h, width: 40.w, fit: BoxFit.none), + Utils.buildSvgWithAssets(icon: AppAssets.women_health, height: 40.h, width: 40.w, fit: BoxFit.none, applyThemeColor: false), SizedBox(width: 12.w), Flexible( child: Column( @@ -102,11 +102,11 @@ class _HealthCalculatorsPageState extends State { : Column( children: [ Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.bloodSugar, height: 40.h, width: 40.w, fit: BoxFit.none), + Utils.buildSvgWithAssets(icon: AppAssets.bloodSugar, height: 40.h, width: 40.w, fit: BoxFit.none, applyThemeColor: false), SizedBox(width: 12.w), Flexible( child: Column( @@ -136,11 +136,11 @@ class _HealthCalculatorsPageState extends State { }), SizedBox(height: 16.h), Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.bloodCholestrol, height: 40.h, width: 40.w, fit: BoxFit.none), + Utils.buildSvgWithAssets(icon: AppAssets.bloodCholestrol, height: 40.h, width: 40.w, fit: BoxFit.none, applyThemeColor: false), SizedBox(width: 12.w), Flexible( child: Column( @@ -166,11 +166,11 @@ class _HealthCalculatorsPageState extends State { }), SizedBox(height: 16.h), Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.triglycerides, height: 40.h, width: 40.w, fit: BoxFit.none), + Utils.buildSvgWithAssets(icon: AppAssets.triglycerides, height: 40.h, width: 40.w, fit: BoxFit.none, applyThemeColor: false), SizedBox(width: 12.w), Flexible( child: Column( diff --git a/lib/presentation/health_calculators_and_converts/widgets/bf.dart b/lib/presentation/health_calculators_and_converts/widgets/bf.dart index c8c949c4..481bfcbf 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/bf.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/bf.dart @@ -85,7 +85,7 @@ class _BodyFatWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.gender, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.gender, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( child: Row( @@ -111,7 +111,7 @@ class _BodyFatWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _genders.length, @@ -165,7 +165,7 @@ class _BodyFatWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -221,7 +221,7 @@ class _BodyFatWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _heightUnits.length, @@ -277,7 +277,7 @@ class _BodyFatWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -338,7 +338,7 @@ class _BodyFatWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _heightUnits.length, @@ -394,7 +394,7 @@ class _BodyFatWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -455,7 +455,7 @@ class _BodyFatWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _heightUnits.length, @@ -511,7 +511,7 @@ class _BodyFatWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -572,7 +572,7 @@ class _BodyFatWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _heightUnits.length, diff --git a/lib/presentation/health_calculators_and_converts/widgets/bmi.dart b/lib/presentation/health_calculators_and_converts/widgets/bmi.dart index 3969db41..a5ea06d1 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/bmi.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/bmi.dart @@ -67,7 +67,7 @@ class _BMIWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -123,7 +123,7 @@ class _BMIWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _heightUnits.length, @@ -179,7 +179,7 @@ class _BMIWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -240,7 +240,7 @@ class _BMIWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _weightUnits.length, diff --git a/lib/presentation/health_calculators_and_converts/widgets/bmr.dart b/lib/presentation/health_calculators_and_converts/widgets/bmr.dart index f19c6b5c..d1cb2c3a 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/bmr.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/bmr.dart @@ -80,7 +80,7 @@ class _BMRWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.gender, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.gender, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( child: Row( @@ -107,7 +107,7 @@ class _BMRWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _genders.length, @@ -162,7 +162,7 @@ class _BMRWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -199,7 +199,7 @@ class _BMRWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -255,7 +255,7 @@ class _BMRWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _heightUnits.length, @@ -312,7 +312,7 @@ class _BMRWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -373,7 +373,7 @@ class _BMRWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _weightUnits.length, @@ -430,7 +430,7 @@ class _BMRWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.activity, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.activity, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( child: Row( @@ -456,7 +456,7 @@ class _BMRWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _activity.length, diff --git a/lib/presentation/health_calculators_and_converts/widgets/calories.dart b/lib/presentation/health_calculators_and_converts/widgets/calories.dart index b1a4b773..1609c056 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/calories.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/calories.dart @@ -81,7 +81,7 @@ class _CaloriesWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.gender, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.gender, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( child: Row( @@ -108,7 +108,7 @@ class _CaloriesWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _genders.length, @@ -162,7 +162,7 @@ class _CaloriesWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -199,7 +199,7 @@ class _CaloriesWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -255,7 +255,7 @@ class _CaloriesWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _heightUnits.length, @@ -311,7 +311,7 @@ class _CaloriesWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -372,7 +372,7 @@ class _CaloriesWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _weightUnits.length, @@ -429,7 +429,7 @@ class _CaloriesWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.activity, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.activity, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( child: Row( @@ -455,7 +455,7 @@ class _CaloriesWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _activity.length, diff --git a/lib/presentation/health_calculators_and_converts/widgets/crabs.dart b/lib/presentation/health_calculators_and_converts/widgets/crabs.dart index 83130fe2..c241e688 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/crabs.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/crabs.dart @@ -62,7 +62,7 @@ class _CrabsWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -93,7 +93,7 @@ class _CrabsWidgetState extends State { ], ), ), - Utils.buildSvgWithAssets(icon: AppAssets.ask_doctor_icon).onPress(() { + Utils.buildSvgWithAssets(icon: AppAssets.ask_doctor_icon, applyThemeColor: false).onPress(() { Navigator.pop(context); Navigator.of(context).push(CustomPageRoute(page: HealthCalculatorDetailedPage(calculatorType: HealthCalculatorsTypeEnum.calories))); }), @@ -104,7 +104,7 @@ class _CrabsWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.activity, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.activity, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( child: Row( @@ -130,7 +130,7 @@ class _CrabsWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _activity.length, diff --git a/lib/presentation/health_calculators_and_converts/widgets/ibw.dart b/lib/presentation/health_calculators_and_converts/widgets/ibw.dart index 1665ccd1..a783d2c8 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/ibw.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/ibw.dart @@ -73,7 +73,7 @@ class _IdealBodyWeightWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.height, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -129,7 +129,7 @@ class _IdealBodyWeightWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _heightUnits.length, @@ -185,7 +185,7 @@ class _IdealBodyWeightWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.weight, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -246,7 +246,7 @@ class _IdealBodyWeightWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _weightUnits.length, @@ -301,7 +301,7 @@ class _IdealBodyWeightWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.activity, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.activity, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( child: Row( @@ -327,7 +327,7 @@ class _IdealBodyWeightWidgetState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: _activity.length, diff --git a/lib/presentation/health_calculators_and_converts/widgets/ovulation.dart b/lib/presentation/health_calculators_and_converts/widgets/ovulation.dart index 8d7591e6..556880d4 100644 --- a/lib/presentation/health_calculators_and_converts/widgets/ovulation.dart +++ b/lib/presentation/health_calculators_and_converts/widgets/ovulation.dart @@ -89,7 +89,7 @@ class _OvulationWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, @@ -126,7 +126,7 @@ class _OvulationWidgetState extends State { Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w), + Utils.buildSvgWithAssets(icon: AppAssets.age, width: 40.w, height: 40.w, applyThemeColor: false), SizedBox(width: 12.w), Expanded( flex: 3, diff --git a/lib/presentation/health_trackers/add_health_tracker_entry_page.dart b/lib/presentation/health_trackers/add_health_tracker_entry_page.dart index 702875d9..8320972e 100644 --- a/lib/presentation/health_trackers/add_health_tracker_entry_page.dart +++ b/lib/presentation/health_trackers/add_health_tracker_entry_page.dart @@ -211,7 +211,7 @@ class _AddHealthTrackerEntryPageState extends State { child: Container( constraints: BoxConstraints(maxHeight: MediaQuery.of(context).size.height * 0.7), padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: items.length, diff --git a/lib/presentation/health_trackers/health_trackers_page.dart b/lib/presentation/health_trackers/health_trackers_page.dart index 9c68281f..66630f28 100644 --- a/lib/presentation/health_trackers/health_trackers_page.dart +++ b/lib/presentation/health_trackers/health_trackers_page.dart @@ -26,7 +26,7 @@ Widget buildHealthTrackerCard({ required VoidCallback onTap, }) { return Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart index 4458b75a..4996850b 100644 --- a/lib/presentation/hmg_services/services_page.dart +++ b/lib/presentation/hmg_services/services_page.dart @@ -389,7 +389,7 @@ class ServicesPage extends StatelessWidget { spacing: 8.w, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.wallet, width: 40.w, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.wallet, width: 40.w, height: 40.h, applyThemeColor: false), LocaleKeys.habibWallet.tr().toText14(weight: FontWeight.w600, maxlines: 2).expanded, Utils.buildSvgWithAssets(icon: getIt.get().isArabic() ? AppAssets.arrow_back : AppAssets.arrow_forward), ], @@ -449,7 +449,7 @@ class ServicesPage extends StatelessWidget { spacing: 8.w, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.services_medical_file_icon, width: 40.w, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.services_medical_file_icon, width: 40.w, height: 40.h, applyThemeColor: false), LocaleKeys.medicalFile.tr().toText16(weight: FontWeight.w600, maxlines: 2).expanded, Utils.buildSvgWithAssets(icon: getIt.get().isArabic() ? AppAssets.arrow_back : AppAssets.arrow_forward), ], diff --git a/lib/presentation/hmg_services/services_view.dart b/lib/presentation/hmg_services/services_view.dart index 3dd5c462..dd70c413 100644 --- a/lib/presentation/hmg_services/services_view.dart +++ b/lib/presentation/hmg_services/services_view.dart @@ -48,6 +48,7 @@ class ServiceGridViewItem extends StatelessWidget { icon: hmgServiceComponentModel.icon, iconColor: isHealthToolIcon ? null : AppColors.whiteColor, fit: BoxFit.contain, + applyThemeColor: false ), ), ), diff --git a/lib/presentation/home/data/landing_page_data.dart b/lib/presentation/home/data/landing_page_data.dart index c52d5e19..1fefb8ce 100644 --- a/lib/presentation/home/data/landing_page_data.dart +++ b/lib/presentation/home/data/landing_page_data.dart @@ -1,11 +1,12 @@ import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/home/data/service_card_data.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; class LandingPageData { - static List getNotLoggedInServiceCardsList = [ + static List get getNotLoggedInServiceCardsList => [ ServiceCardData( serviceName: "emergency", icon: AppAssets.emergency_services_icon, @@ -68,15 +69,15 @@ class LandingPageData { ), ]; - static List getLoggedInServiceCardsList = [ + static List get getLoggedInServiceCardsList => [ ServiceCardData( serviceName: "emergency", icon: AppAssets.emergency_services_icon, title: LocaleKeys.emergency, subtitle: LocaleKeys.services2, backgroundColor: AppColors.primaryRedColor, - iconColor: AppColors.whiteColor, - textColor: AppColors.whiteColor, + iconColor: Colors.white, + textColor: Colors.white, isBold: true, ), ServiceCardData( @@ -141,7 +142,7 @@ class LandingPageData { ), ]; - static List getServiceCardsList = [ + static List get getServiceCardsList => [ ServiceCardData( serviceName: "livecare", icon: AppAssets.small_livecare_icon, diff --git a/lib/presentation/home/data/service_card_data.dart b/lib/presentation/home/data/service_card_data.dart index 3bc22d7c..c16147b1 100644 --- a/lib/presentation/home/data/service_card_data.dart +++ b/lib/presentation/home/data/service_card_data.dart @@ -8,8 +8,8 @@ class ServiceCardData { final String title; final String subtitle; final Color? iconColor; - final Color textColor; - final Color backgroundColor; + final Color? textColor; + final Color? backgroundColor; final bool isBold; final String largeCardIcon; @@ -19,9 +19,9 @@ class ServiceCardData { this.title = "", this.subtitle = "", this.largeCardIcon = "", - this.backgroundColor = AppColors.whiteColor, - this.iconColor = AppColors.blackColor, - this.textColor = AppColors.blackColor, + this.backgroundColor, + this.iconColor, + this.textColor, this.isBold = false }); } diff --git a/lib/presentation/home/widgets/habib_wallet_card.dart b/lib/presentation/home/widgets/habib_wallet_card.dart index ed48058d..0ac32443 100644 --- a/lib/presentation/home/widgets/habib_wallet_card.dart +++ b/lib/presentation/home/widgets/habib_wallet_card.dart @@ -45,7 +45,7 @@ class HabibWalletCard extends StatelessWidget { child: Stack(children: [ Positioned( right: 0, - child: ClipRRect(borderRadius: BorderRadius.circular(24.0), child: Utils.buildSvgWithAssets(icon: AppAssets.habib_background_icon, width: 150.h, height: 150.h)), + child: ClipRRect(borderRadius: BorderRadius.circular(24.0), child: Utils.buildSvgWithAssets(icon: AppAssets.habib_background_icon, width: 150.h, height: 150.h, applyThemeColor: false)), ), Padding( padding: EdgeInsets.all(16.h), @@ -123,7 +123,7 @@ class HabibWalletCard extends StatelessWidget { icon: AppAssets.recharge_icon, iconSize: 24.h, backgroundColor: AppColors.infoColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, text: LocaleKeys.recharge.tr(context: context), borderWidth: 0.w, fontWeight: FontWeight.w500, diff --git a/lib/presentation/home/widgets/large_service_card.dart b/lib/presentation/home/widgets/large_service_card.dart index e25ed0b3..e65eb1d8 100644 --- a/lib/presentation/home/widgets/large_service_card.dart +++ b/lib/presentation/home/widgets/large_service_card.dart @@ -72,7 +72,7 @@ class LargeServiceCard extends StatelessWidget { height: 48.h, width: 48.h, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: serviceCardData.backgroundColor, + color: serviceCardData.backgroundColor!, borderRadius: 12.r, hasShadow: false, ), @@ -209,7 +209,7 @@ class FadedLargeServiceCard extends StatelessWidget { height: 32.h, width: 32.h, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: serviceCardData.backgroundColor, + color: serviceCardData.backgroundColor!, borderRadius: 30.r, hasShadow: false, ), @@ -219,6 +219,7 @@ class FadedLargeServiceCard extends StatelessWidget { icon: serviceCardData.icon, iconColor: serviceCardData.iconColor, fit: BoxFit.contain, + applyThemeColor: false ), ), ), diff --git a/lib/presentation/home/widgets/small_service_card.dart b/lib/presentation/home/widgets/small_service_card.dart index 84ef6fa2..0c2da8d6 100644 --- a/lib/presentation/home/widgets/small_service_card.dart +++ b/lib/presentation/home/widgets/small_service_card.dart @@ -32,9 +32,9 @@ class SmallServiceCard extends StatelessWidget { final String icon; final String title; final String subtitle; - final Color iconColor; - final Color textColor; - final Color backgroundColor; + final Color? iconColor; + final Color? textColor; + final Color? backgroundColor; final bool isBold; SmallServiceCard({ @@ -43,33 +43,36 @@ class SmallServiceCard extends StatelessWidget { this.serviceName = "", this.title = "", this.subtitle = "", - this.backgroundColor = AppColors.whiteColor, - this.iconColor = AppColors.blackColor, - this.textColor = AppColors.blackColor, + this.backgroundColor, + this.iconColor, + this.textColor, this.isBold = false, }); @override Widget build(BuildContext context) { + final resolvedBgColor = backgroundColor ?? AppColors.whiteColor; + final resolvedIconColor = iconColor ?? AppColors.blackColor; + final resolvedTextColor = textColor ?? AppColors.blackColor; return Container( height: 92.h, width: 92.h, padding: EdgeInsets.all(4.0), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: backgroundColor, + color: resolvedBgColor, borderRadius: 16, ), child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: icon, iconColor: iconColor, width: 32.h, height: 32.h), + Utils.buildSvgWithAssets(icon: icon, iconColor: resolvedIconColor, width: 32.h, height: 32.h), SizedBox(height: 6.h), if (isFoldable || isTablet) ...[ - title.tr(context: context).toText10(color: textColor, weight: FontWeight.w500, isCenter: true, letterSpacing: -0.2, maxlines: 1), - subtitle.tr(context: context).toText10(color: textColor, weight: FontWeight.w500, isCenter: true, letterSpacing: -0.2, maxlines: 1), + title.tr(context: context).toText10(color: resolvedTextColor, weight: FontWeight.w500, isCenter: true, letterSpacing: -0.2, maxlines: 1), + subtitle.tr(context: context).toText10(color: resolvedTextColor, weight: FontWeight.w500, isCenter: true, letterSpacing: -0.2, maxlines: 1), ] else ...[ - title.tr(context: context).toText12(color: textColor, fontWeight: FontWeight.w500, isCenter: true, letterSpacing: -0.2, maxLine: 1), - subtitle.tr(context: context).toText12(color: textColor, fontWeight: FontWeight.w500, isCenter: true, letterSpacing: -0.2, maxLine: 1), + title.tr(context: context).toText12(color: resolvedTextColor, fontWeight: FontWeight.w500, isCenter: true, letterSpacing: -0.2, maxLine: 1), + subtitle.tr(context: context).toText12(color: resolvedTextColor, fontWeight: FontWeight.w500, isCenter: true, letterSpacing: -0.2, maxLine: 1), ] ], ), diff --git a/lib/presentation/home_health_care/hhc_procedures_page.dart b/lib/presentation/home_health_care/hhc_procedures_page.dart index ef5dce5c..c420742c 100644 --- a/lib/presentation/home_health_care/hhc_procedures_page.dart +++ b/lib/presentation/home_health_care/hhc_procedures_page.dart @@ -434,7 +434,7 @@ class _HhcProceduresPageState extends State { child: Container( height: 80.h, decoration: BoxDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: BorderRadius.circular(10.r), ), ), diff --git a/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart b/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart index 8fb30900..eed1eedb 100644 --- a/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart +++ b/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart @@ -146,14 +146,14 @@ class LabResultByClinic extends StatelessWidget { }, backgroundColor: AppColors.successColor, borderColor: AppColors.successColor, - textColor: AppColors.whiteColor, - fontSize: 16, + textColor: Colors.white, + fontSize: 16.f, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 45.h, icon: AppAssets.download, - iconColor: AppColors.whiteColor, + iconColor: Colors.white, iconSize: 20.h, ).paddingSymmetrical(24.h, 24.h), ), diff --git a/lib/presentation/lab/lab_result_via_clinic/ai_analysis_widget.dart b/lib/presentation/lab/lab_result_via_clinic/ai_analysis_widget.dart index f0c9b26b..7a477761 100644 --- a/lib/presentation/lab/lab_result_via_clinic/ai_analysis_widget.dart +++ b/lib/presentation/lab/lab_result_via_clinic/ai_analysis_widget.dart @@ -20,7 +20,7 @@ class AiAnalysisWidget extends StatelessWidget { padding: EdgeInsets.all(1.5.r), // Border thickness child: Container( decoration: BoxDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: BorderRadius.circular(22.r), ), padding: EdgeInsets.all(20.r), @@ -44,7 +44,7 @@ class AiAnalysisWidget extends StatelessWidget { SizedBox(height: 8.h), data.summary!.toText14(color: AppColors.textColorLight, height: 1.5, weight: FontWeight.w400), SizedBox(height: 16.h), - const Divider(color: AppColors.dividerColor, thickness: 1), + Divider(color: AppColors.dividerColor, thickness: 1), SizedBox(height: 16.h), ], if (data.aiPredictions != null && data.aiPredictions!.isNotEmpty) ...[ @@ -52,7 +52,7 @@ class AiAnalysisWidget extends StatelessWidget { SizedBox(height: 12.h), ...data.aiPredictions!.map((item) => _buildBulletItem(item)), SizedBox(height: 16.h), - const Divider(color: AppColors.dividerColor, thickness: 1), + Divider(color: AppColors.dividerColor, thickness: 1), SizedBox(height: 16.h), ], if (data.prevention != null && data.prevention!.isNotEmpty) ...[ @@ -88,7 +88,7 @@ class AiAnalysisWidget extends StatelessWidget { child: Container( width: 5.r, height: 5.r, - decoration: const BoxDecoration(color: AppColors.blackColor, shape: BoxShape.circle), + decoration: BoxDecoration(color: AppColors.blackColor, shape: BoxShape.circle), ), ), Expanded( diff --git a/lib/presentation/lab/lab_result_via_clinic/lab_ai_analysis_detailed_page.dart b/lib/presentation/lab/lab_result_via_clinic/lab_ai_analysis_detailed_page.dart index 14ff620b..2a4fd66d 100644 --- a/lib/presentation/lab/lab_result_via_clinic/lab_ai_analysis_detailed_page.dart +++ b/lib/presentation/lab/lab_result_via_clinic/lab_ai_analysis_detailed_page.dart @@ -133,7 +133,7 @@ class _LabAiAnalysisDetailedPageState extends State { ), if (!isLast) ...[ SizedBox(height: 12.h), - const Divider(color: AppColors.dividerColor, thickness: 1), + Divider(color: AppColors.dividerColor, thickness: 1), SizedBox(height: 12.h), ], ], diff --git a/lib/presentation/lab/search_lab_report.dart b/lib/presentation/lab/search_lab_report.dart index bf27b911..d366f38f 100644 --- a/lib/presentation/lab/search_lab_report.dart +++ b/lib/presentation/lab/search_lab_report.dart @@ -59,7 +59,7 @@ class _SearchLabResultsContentState extends State { title: LocaleKeys.labResults.tr(), isClose: true, bottomChild: Container( - color: Colors.white, + color: AppColors.whiteColor, padding: EdgeInsets.all(ResponsiveExtension(20).h), child: CustomButton( text: LocaleKeys.search.tr(), @@ -144,7 +144,8 @@ class SuggestionChip extends StatelessWidget { borderRadius: BorderRadius.circular(8), ), child: label.toText12( - color: isSelected ? Colors.white : Colors.black87, + // color: isSelected ? AppColors.textColor : Colors.black87, + color: AppColors.textColor, fontWeight: FontWeight.w500, ), ), diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart index 1a68f224..f288af66 100644 --- a/lib/presentation/medical_file/medical_file_page.dart +++ b/lib/presentation/medical_file/medical_file_page.dart @@ -478,11 +478,12 @@ class _MedicalFilePageState extends State { // Using CustomExpandableList CustomExpandableList( expansionMode: ExpansionMode.exactlyOne, - dividerColor: Color(0xff2b353e1a), + dividerColor: AppColors.dividerColor, itemPadding: EdgeInsets.symmetric(vertical: 16.h, horizontal: 14.h), items: [ ExpandableListItem( title: LocaleKeys.medicalServices.tr(context: context).toText18(weight: FontWeight.w600), + expandedBackgroundColor: Colors.transparent, children: [ SizedBox(height: 10.h), getSelectedTabData(0), @@ -518,53 +519,6 @@ class _MedicalFilePageState extends State { defaultTrailingIcon: Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, height: 22.h, width: 22.w, iconColor: AppColors.textColor), ), ).paddingSymmetrical(16.w, 0.0), - - // ExpansionTileList( - // shrinkWrap: true, - // trailing: Icon(Icons.arrow_drop_down), - // expansionMode: ExpansionMode.exactlyOne, - // children: [ - // ExpansionTile( - // title: "Medical Services".toText20(weight: FontWeight.w600, color: AppColors.textColor), - // iconColor: Color(0xFF2E3039), - // trailing: Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, height: 22.h, width: 22.w), - // children: [Text('Child 1')], - // ), - // ExpansionTile( - // title: "Medical Reports".toText20(weight: FontWeight.w600, color: AppColors.textColor), - // children: [Text('Child 2')], - // ), - // ExpansionTile( - // title: "Insurance & Payments".toText20(weight: FontWeight.w600, color: AppColors.textColor), - // children: [Text('Child 3')], - // ), - // ExpansionTile( - // title: "Tracker & Others".toText20(weight: FontWeight.w600, color: AppColors.textColor), - // children: [Text('Child 4')], - // ), - // ], - // ), - // Consumer(builder: (context, medicalFileVM, child) { - // return Column( - // children: [ - // CustomTabBar( - // activeTextColor: AppColors.primaryRedColor, - // activeBackgroundColor: AppColors.primaryRedColor.withValues(alpha: .1), - // tabs: [ - // CustomTabBarModel(AppAssets.myFilesBottom, LocaleKeys.general.tr(context: context).needTranslation), - // CustomTabBarModel(AppAssets.insurance, LocaleKeys.insurance.tr(context: context)), - // CustomTabBarModel(AppAssets.requests, LocaleKeys.request.tr(context: context).needTranslation), - // CustomTabBarModel(AppAssets.more, "More".needTranslation), - // ], - // onTabChange: (index) { - // medicalFileVM.onTabChanged(index); - // }, - // ).paddingSymmetrical(24.w, 0.0), - // SizedBox(height: 24.h), - // getSelectedTabData(medicalFileVM.selectedTabIndex), - // ], - // ); - // }), ], ), ); @@ -669,9 +623,9 @@ class _MedicalFilePageState extends State { ), ); }, - backgroundColor: Color(0xffFEE9EA), - borderColor: Color(0xffFEE9EA), - textColor: Color(0xffED1C2B), + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, fontSize: 14.f, fontWeight: FontWeight.w500, borderRadius: 12.r, @@ -792,7 +746,7 @@ class _MedicalFilePageState extends State { ? const CommonShimmerWidget().paddingSymmetrical(0.w, 0.h) : prescriptionVM.patientPrescriptionOrders.isNotEmpty ? Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: Colors.white, borderRadius: 20.r, hasShadow: false), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r, hasShadow: false), child: Padding( padding: EdgeInsets.all(16.w), child: Column( @@ -862,7 +816,7 @@ class _MedicalFilePageState extends State { separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), ), SizedBox(height: 16.h), - const Divider(color: AppColors.dividerColor), + Divider(color: AppColors.dividerColor), SizedBox(height: 16.h), Row( children: [ diff --git a/lib/presentation/medical_file/widgets/lab_rad_card.dart b/lib/presentation/medical_file/widgets/lab_rad_card.dart index f31c90b9..b107403d 100644 --- a/lib/presentation/medical_file/widgets/lab_rad_card.dart +++ b/lib/presentation/medical_file/widgets/lab_rad_card.dart @@ -36,6 +36,7 @@ class LabRadCard extends StatelessWidget { width: 40.w, height: 40.h, fit: BoxFit.cover, + applyThemeColor: false ).toShimmer2(isShow: false, radius: 12.r), SizedBox(width: 8.w), Flexible( diff --git a/lib/presentation/medical_file/widgets/medical_file_card.dart b/lib/presentation/medical_file/widgets/medical_file_card.dart index 77968c57..c2551d30 100644 --- a/lib/presentation/medical_file/widgets/medical_file_card.dart +++ b/lib/presentation/medical_file/widgets/medical_file_card.dart @@ -37,7 +37,7 @@ class MedicalFileCard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.center, mainAxisSize: MainAxisSize.min, children: [ - Utils.buildSvgWithAssets(icon: svgIcon, width: iconS, height: iconS, fit: BoxFit.contain), + Utils.buildSvgWithAssets(icon: svgIcon, width: iconS, height: iconS, fit: BoxFit.contain, applyThemeColor: false), SizedBox(height: 8.h), isLargeText ? label.toText13(color: textColor, isBold: true, maxLine: 2) : label.toText11(color: textColor, isBold: true, maxLine: 2), ], diff --git a/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart b/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart index 16c05d8b..a0c54e68 100644 --- a/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart +++ b/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart @@ -182,15 +182,15 @@ class PatientSickLeaveCard extends StatelessWidget { } Color getStatusColor() { - Color statusColor = Colors.white; + Color statusColor = AppColors.whiteColor; if (patientSickLeavesResponseModel.status == 1) { - statusColor = Color(0xffCC9B14); // TODO change color as per In Queue design + statusColor = AppColors.statusPendingColor; } else if (patientSickLeavesResponseModel.status == 2) { statusColor = AppColors.successColor; } else if (patientSickLeavesResponseModel.status == 3) { statusColor = AppColors.primaryRedColor; } else { - statusColor = Colors.white; + statusColor = AppColors.whiteColor; } return statusColor; } diff --git a/lib/presentation/medical_report/medical_reports_page.dart b/lib/presentation/medical_report/medical_reports_page.dart index 02a9bdec..fd3ba7f9 100644 --- a/lib/presentation/medical_report/medical_reports_page.dart +++ b/lib/presentation/medical_report/medical_reports_page.dart @@ -370,13 +370,13 @@ class _MedicalReportsPageState extends State { }, backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, fontSize: 16.f, fontWeight: FontWeight.w500, borderRadius: 12.r, height: 46.h, icon: AppAssets.requests, - iconColor: AppColors.whiteColor, + iconColor: Colors.white, iconSize: 20.h, ).paddingSymmetrical(24.h, 24.h), ), diff --git a/lib/presentation/monthly_report/monthly_report.dart b/lib/presentation/monthly_report/monthly_report.dart index 43c7fc1d..998d7f48 100644 --- a/lib/presentation/monthly_report/monthly_report.dart +++ b/lib/presentation/monthly_report/monthly_report.dart @@ -74,7 +74,7 @@ class MonthlyReport extends StatelessWidget { children: [ Row( children: [ - Utils.buildSvgWithAssets(icon: AppAssets.email_icon, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.email_icon, width: 40.h, height: 40.h, applyThemeColor: false), SizedBox(width: 8.h), Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/presentation/my_invoices/widgets/invoice_list_card.dart b/lib/presentation/my_invoices/widgets/invoice_list_card.dart index 4a328c5e..6e0fa0e4 100644 --- a/lib/presentation/my_invoices/widgets/invoice_list_card.dart +++ b/lib/presentation/my_invoices/widgets/invoice_list_card.dart @@ -80,7 +80,7 @@ class InvoiceListCard extends StatelessWidget { child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h), + Utils.buildSvgWithAssets(icon: AppAssets.rating_icon, width: 15.w, height: 15.h, applyThemeColor: false), SizedBox(height: 2.h), "${getInvoicesListResponseModel.decimalDoctorRate}".toText11(isBold: true, color: AppColors.textColor), ], diff --git a/lib/presentation/prescriptions/prescription_detail_page.dart b/lib/presentation/prescriptions/prescription_detail_page.dart index 5bb9cbd7..b9b5b789 100644 --- a/lib/presentation/prescriptions/prescription_detail_page.dart +++ b/lib/presentation/prescriptions/prescription_detail_page.dart @@ -240,7 +240,7 @@ class _PrescriptionDetailPageState extends State { backgroundColor: widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported! ? AppColors.successColor : AppColors.greyF7Color, borderColor: AppColors.successColor.withOpacity(0.01), textColor: - widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported! ? AppColors.whiteColor : AppColors.textColor.withOpacity(0.35), + widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported! ? Colors.white : AppColors.textColor.withOpacity(0.35), fontSize: 16, fontWeight: FontWeight.w500, borderRadius: 12, @@ -248,7 +248,7 @@ class _PrescriptionDetailPageState extends State { height: 50.h, icon: AppAssets.prescription_refill_icon, iconColor: - widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported! ? AppColors.whiteColor : AppColors.textColor.withOpacity(0.35), + widget.prescriptionsResponseModel.isHomeMedicineDeliverySupported! ? Colors.white : AppColors.textColor.withOpacity(0.35), iconSize: 20.h, ).paddingSymmetrical(24.h, 24.h), ), diff --git a/lib/presentation/prescriptions/prescription_item_view.dart b/lib/presentation/prescriptions/prescription_item_view.dart index 1369d4ac..38b96d37 100644 --- a/lib/presentation/prescriptions/prescription_item_view.dart +++ b/lib/presentation/prescriptions/prescription_item_view.dart @@ -89,7 +89,7 @@ class PrescriptionItemView extends StatelessWidget { child: Row( mainAxisSize: MainAxisSize.max, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 35.h, height: 35.h).toShimmer2(isShow: isLoading), + Utils.buildSvgWithAssets(icon: AppAssets.prescription_reminder_icon, width: 35.h, height: 35.h, applyThemeColor: false).toShimmer2(isShow: isLoading), SizedBox(width: 8.h), Column( crossAxisAlignment: CrossAxisAlignment.start, diff --git a/lib/presentation/profile_settings/profile_settings.dart b/lib/presentation/profile_settings/profile_settings.dart index 3a44d1fd..2bd41f06 100644 --- a/lib/presentation/profile_settings/profile_settings.dart +++ b/lib/presentation/profile_settings/profile_settings.dart @@ -158,7 +158,7 @@ class ProfileSettingsState extends State { spacing: 8.w, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.wallet, width: 40.w, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.wallet, width: 40.w, height: 40.h, applyThemeColor: false), LocaleKeys.habibWallet.tr(context: context).toText16(weight: FontWeight.w600, maxlines: 2).expanded, Utils.buildSvgWithAssets(icon: getIt.get().isArabic() ? AppAssets.arrow_back : AppAssets.arrow_forward), ], @@ -194,6 +194,38 @@ class ProfileSettingsState extends State { ], ), LocaleKeys.quickActions.tr(context: context).toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1).paddingOnly(left: 24.w, right: 24.w), + Container( + margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h, bottom: 24.h), + padding: EdgeInsets.only(top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + child: Column( + children: [ + actionItem(AppAssets.language_change, LocaleKeys.language.tr(context: context), () { + showCommonBottomSheetWithoutHeight(context, title: LocaleKeys.language.tr(context: context), child: AppLanguageChange(), callBackFunc: () {}, isFullScreen: false); + }, trailingLabel: Utils.appState.isArabic() ? "العربية" : "English"), + 1.divider, + actionItem(AppAssets.bell, LocaleKeys.notificationsSettings.tr(context: context), () { + openAppSettings(); + }), + 1.divider, + Consumer( + builder: (context, profileVm, _) { + return actionItem( + AppAssets.darkModeIcon, + LocaleKeys.darkMode.tr(context: context), + () { + profileVm.toggleDarkMode(!profileVm.isDarkMode); + }, + switchValue: profileVm.isDarkMode, + onSwitchChanged: (value) { + profileVm.toggleDarkMode(value); + }, + ); + }, + ), + ], + ), + ), Container( margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h, bottom: 24.h), padding: EdgeInsets.only(top: 4.h, bottom: 4.h), @@ -282,7 +314,7 @@ class ProfileSettingsState extends State { ); } - Widget actionItem(String icon, String label, VoidCallback onPress, {String trailingLabel = "", bool? switchValue, bool isExternalLink = false}) { + Widget actionItem(String icon, String label, VoidCallback onPress, {String trailingLabel = "", bool? switchValue, ValueChanged? onSwitchChanged, bool isExternalLink = false}) { return SizedBox( height: 56.h, child: Row( @@ -294,7 +326,7 @@ class ProfileSettingsState extends State { switchValue != null ? Switch( value: switchValue, - onChanged: (value) {}, + onChanged: onSwitchChanged ?? (value) {}, activeThumbColor: AppColors.successColor, activeTrackColor: AppColors.successColor.withValues(alpha: .15), ) @@ -463,8 +495,8 @@ class FamilyCardWidget extends StatelessWidget { onPressed: canSwitch ? () => onFamilySwitchPress(profile) : onAddFamilyMemberPress, backgroundColor: canSwitch ? AppColors.secondaryLightRedColor : AppColors.primaryRedColor, borderColor: canSwitch ? AppColors.secondaryLightRedColor : AppColors.primaryRedColor, - textColor: canSwitch ? AppColors.primaryRedColor : AppColors.whiteColor, - iconColor: canSwitch ? AppColors.primaryRedColor : AppColors.whiteColor, + textColor: canSwitch ? AppColors.primaryRedColor : Colors.white, + iconColor: canSwitch ? AppColors.primaryRedColor : Colors.white, height: isFoldable ? 50.h : 45.h, fontSize: 14.f, ).paddingOnly(top: 12.h, right: 16.w, left: 16.w, bottom: 16.h); diff --git a/lib/presentation/radiology/radiology_result_page.dart b/lib/presentation/radiology/radiology_result_page.dart index 2328d0ea..7b3f11d4 100644 --- a/lib/presentation/radiology/radiology_result_page.dart +++ b/lib/presentation/radiology/radiology_result_page.dart @@ -85,14 +85,14 @@ class _RadiologyResultPageState extends State { }, backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, fontSize: 14, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, icon: AppAssets.download, - iconColor: AppColors.whiteColor, + iconColor: Colors.white, iconSize: 20.h, ), SizedBox(height: 16.h), @@ -145,14 +145,14 @@ class _RadiologyResultPageState extends State { }, backgroundColor: AppColors.successColor, borderColor: AppColors.successColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, fontSize: 16, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 45.h, icon: AppAssets.download, - iconColor: AppColors.whiteColor, + iconColor: Colors.white, iconSize: 20.h, ).paddingSymmetrical(24.h, 24.h), ), diff --git a/lib/presentation/radiology/search_radiology.dart b/lib/presentation/radiology/search_radiology.dart index 8d63a59a..7c14fd1d 100644 --- a/lib/presentation/radiology/search_radiology.dart +++ b/lib/presentation/radiology/search_radiology.dart @@ -59,7 +59,7 @@ class _SearchRadiologyContentContentState extends State title: LocaleKeys.radiology.tr(), isClose: true, bottomChild: Container( - color: Colors.white, + color: AppColors.whiteColor, padding: EdgeInsets.all(ResponsiveExtension(20).h), child: CustomButton( text: LocaleKeys.search.tr(), @@ -144,7 +144,8 @@ class SuggestionChip extends StatelessWidget { borderRadius: BorderRadius.circular(8), ), child: label.toText12( - color: isSelected ? Colors.white : Colors.black87, + // color: isSelected ? Colors.white : Colors.black87, + color: AppColors.textColor, fontWeight: FontWeight.w500, ), ), diff --git a/lib/presentation/smartwatches/widgets/health_chart.dart b/lib/presentation/smartwatches/widgets/health_chart.dart index fe6ae78f..37474133 100644 --- a/lib/presentation/smartwatches/widgets/health_chart.dart +++ b/lib/presentation/smartwatches/widgets/health_chart.dart @@ -19,7 +19,7 @@ class HealthChart extends StatelessWidget { height: 200, padding: const EdgeInsets.all(16), decoration: BoxDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: BorderRadius.circular(16), boxShadow: [ BoxShadow( diff --git a/lib/presentation/symptoms_checker/possible_conditions_screen.dart b/lib/presentation/symptoms_checker/possible_conditions_screen.dart index 80c70714..323a13c2 100644 --- a/lib/presentation/symptoms_checker/possible_conditions_screen.dart +++ b/lib/presentation/symptoms_checker/possible_conditions_screen.dart @@ -49,7 +49,7 @@ class PossibleConditionsPage extends StatelessWidget { child: Container( height: 80.h, decoration: BoxDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: BorderRadius.circular(10.r), ), ), diff --git a/lib/presentation/symptoms_checker/risk_factors_screen.dart b/lib/presentation/symptoms_checker/risk_factors_screen.dart index 484ad2d7..462cffbd 100644 --- a/lib/presentation/symptoms_checker/risk_factors_screen.dart +++ b/lib/presentation/symptoms_checker/risk_factors_screen.dart @@ -184,7 +184,7 @@ class _RiskFactorsScreenState extends State { Container( height: 40.h, decoration: BoxDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: BorderRadius.circular(24.r), ), ).toShimmer2(isShow: true, radius: 24.r), diff --git a/lib/presentation/symptoms_checker/suggestions_screen.dart b/lib/presentation/symptoms_checker/suggestions_screen.dart index 8d32b7f4..cbfc15a1 100644 --- a/lib/presentation/symptoms_checker/suggestions_screen.dart +++ b/lib/presentation/symptoms_checker/suggestions_screen.dart @@ -160,7 +160,7 @@ class _SuggestionsScreenState extends State { Container( height: 40.h, decoration: BoxDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: BorderRadius.circular(24.r), ), ).toShimmer2(isShow: true, radius: 24.r), diff --git a/lib/presentation/symptoms_checker/symptoms_selector_screen.dart b/lib/presentation/symptoms_checker/symptoms_selector_screen.dart index cbbfc68e..d7fbf63c 100644 --- a/lib/presentation/symptoms_checker/symptoms_selector_screen.dart +++ b/lib/presentation/symptoms_checker/symptoms_selector_screen.dart @@ -222,7 +222,7 @@ class _SymptomsSelectorPageState extends State { Container( height: 40.h, decoration: BoxDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: BorderRadius.circular(24.r), ), ).toShimmer2(isShow: true, radius: 24.r), diff --git a/lib/presentation/symptoms_checker/triage_screen.dart b/lib/presentation/symptoms_checker/triage_screen.dart index 0231ef19..b4ceff4c 100644 --- a/lib/presentation/symptoms_checker/triage_screen.dart +++ b/lib/presentation/symptoms_checker/triage_screen.dart @@ -275,7 +275,7 @@ class _TriagePageState extends State { Container( height: 40.h, decoration: BoxDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: BorderRadius.circular(24.r), ), ).toShimmer2(isShow: true, radius: 24.r), diff --git a/lib/presentation/symptoms_checker/widgets/organ_dot_widget.dart b/lib/presentation/symptoms_checker/widgets/organ_dot_widget.dart index 0783dfb7..2ef4497c 100644 --- a/lib/presentation/symptoms_checker/widgets/organ_dot_widget.dart +++ b/lib/presentation/symptoms_checker/widgets/organ_dot_widget.dart @@ -34,7 +34,7 @@ class OrganDot extends StatelessWidget { child: Container( width: size.w * 0.25, height: size.h * 0.25, - decoration: const BoxDecoration( + decoration: BoxDecoration( shape: BoxShape.circle, color: AppColors.whiteColor, ), diff --git a/lib/presentation/todo_section/ancillary_order_payment_page.dart b/lib/presentation/todo_section/ancillary_order_payment_page.dart index b34bf212..9d75c769 100644 --- a/lib/presentation/todo_section/ancillary_order_payment_page.dart +++ b/lib/presentation/todo_section/ancillary_order_payment_page.dart @@ -264,6 +264,7 @@ class _AncillaryOrderPaymentPageState extends State { width: 200.h, height: 80.h, fit: BoxFit.contain, + applyThemeColor: false, ).paddingSymmetrical(24.h, 0.h).onPress(() { if (!todoSectionViewModel.isProcessingPayment) { if (Utils.havePrivilege(103)) { diff --git a/lib/presentation/todo_section/ancillary_procedures_details_page.dart b/lib/presentation/todo_section/ancillary_procedures_details_page.dart index eba80cd4..38d4f978 100644 --- a/lib/presentation/todo_section/ancillary_procedures_details_page.dart +++ b/lib/presentation/todo_section/ancillary_procedures_details_page.dart @@ -673,7 +673,7 @@ class _AncillaryOrderDetailsListState extends State { ); }, isDisabled: !isButtonEnabled, - textColor: AppColors.whiteColor, + textColor: Colors.white, borderRadius: 12.r, borderColor: Colors.transparent, padding: EdgeInsets.symmetric(vertical: 16.h), diff --git a/lib/presentation/water_monitor/water_consumption_page.dart b/lib/presentation/water_monitor/water_consumption_page.dart index 54dace58..7e6d1d5e 100644 --- a/lib/presentation/water_monitor/water_consumption_page.dart +++ b/lib/presentation/water_monitor/water_consumption_page.dart @@ -79,7 +79,7 @@ class _WaterConsumptionPageState extends State { subTitle.toText18(weight: FontWeight.w600), ], ), - Utils.buildSvgWithAssets(icon: AppAssets.greenTickIcon) + Utils.buildSvgWithAssets(icon: AppAssets.greenTickIcon, applyThemeColor: false) ], ).paddingSymmetrical(0, 8.h); } diff --git a/lib/presentation/water_monitor/water_monitor_settings_page.dart b/lib/presentation/water_monitor/water_monitor_settings_page.dart index a3c82c0c..81157c8a 100644 --- a/lib/presentation/water_monitor/water_monitor_settings_page.dart +++ b/lib/presentation/water_monitor/water_monitor_settings_page.dart @@ -75,7 +75,7 @@ class _WaterMonitorSettingsPageState extends State { message: "", child: Container( padding: EdgeInsets.only(left: 16.w, right: 16.w, top: 4.h, bottom: 4.h), - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(20.r)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(20.r)), child: ListView.separated( shrinkWrap: true, itemCount: items.length, diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart index c09d537f..51d2cbc2 100644 --- a/lib/theme/app_theme.dart +++ b/lib/theme/app_theme.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; class AppTheme { static ThemeData getTheme(isArabic) => ThemeData( @@ -14,33 +15,13 @@ class AppTheme { }, ), hintColor: Colors.grey[400], - // colorScheme: ColorScheme.fromSwatch(accentColor: MyColors.backgroundColor), disabledColor: Colors.grey[300], - // errorColor: const Colors, - // scaffoldBackgroundColor: MyColors.backgroundColor, textSelectionTheme: const TextSelectionThemeData(cursorColor: Colors.grey, selectionColor: Color.fromRGBO(80, 100, 253, 0.5), selectionHandleColor: Colors.grey), canvasColor: Colors.white, - // backgroundColor: const Color.fromRGBO(255, 255, 255, 1), highlightColor: Colors.grey[100]!.withOpacity(0.4), splashColor: Colors.transparent, - // primaryColor: primaryColor, - // primaryColorDark: primaryColor, - // toggleableActiveColor: secondaryColor, - // indicatorColor: secondaryColor, - // bottomSheetTheme: const BottomSheetThemeData( - // backgroundColor: Color(0xFFE0E0E0), - // ), bottomSheetTheme: BottomSheetThemeData( backgroundColor: Colors.black.withOpacity(0)), - // primaryTextTheme: const TextTheme( - // bodyText2: TextStyle(color: Colors.white), - // ), - // iconTheme: const IconThemeData(color: MyColors.darkTextColor), - // textTheme: const TextTheme( - // bodyText1: TextStyle(color: Colors.black, letterSpacing: 0.6), - // headline1: TextStyle(color: Colors.white, letterSpacing: 0.6), - // headline2: TextStyle(color: Colors.white, letterSpacing: 0.6), - // ), floatingActionButtonTheme: const FloatingActionButtonThemeData(highlightElevation: 2, disabledElevation: 0, elevation: 2), appBarTheme: AppBarTheme( color: const Color(0xff515A5D), @@ -52,6 +33,38 @@ class AppTheme { surfaceTintColor: Colors.transparent, ), ); + + static ThemeData getDarkTheme(isArabic) => ThemeData( + fontFamily: isArabic ? 'GESSTwo' : 'Poppins', + primarySwatch: Colors.red, + visualDensity: VisualDensity.adaptivePlatformDensity, + brightness: Brightness.dark, + pageTransitionsTheme: const PageTransitionsTheme( + builders: { + TargetPlatform.android: ZoomPageTransitionsBuilder(), + TargetPlatform.iOS: CupertinoPageTransitionsBuilder() + }, + ), + hintColor: Colors.grey[600], + disabledColor: Colors.grey[700], + textSelectionTheme: const TextSelectionThemeData(cursorColor: Colors.grey, selectionColor: Color.fromRGBO(80, 100, 253, 0.5), selectionHandleColor: Colors.grey), + canvasColor: AppColors.dark.scaffoldBgColor, + scaffoldBackgroundColor: AppColors.dark.scaffoldBgColor, + highlightColor: Colors.grey[800]!.withOpacity(0.4), + splashColor: Colors.transparent, + bottomSheetTheme: BottomSheetThemeData( + backgroundColor: Colors.black.withOpacity(0)), + floatingActionButtonTheme: const FloatingActionButtonThemeData(highlightElevation: 2, disabledElevation: 0, elevation: 2), + appBarTheme: AppBarTheme( + color: AppColors.dark.scaffoldBgColor, + elevation: 0.0, + actionsIconTheme: const IconThemeData( + color: Colors.white, + ), + systemOverlayStyle: SystemUiOverlayStyle.light, + surfaceTintColor: Colors.transparent, + ), + ); } extension ExtendedRevoCheckTheme on TextTheme { diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index f80085aa..514acfb4 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -1,118 +1,310 @@ import 'package:flutter/material.dart'; class AppColors { + /// Global dark-mode flag — toggled by ProfileSettingsViewModel. + /// When true, every getter below returns the dark palette value. + static bool isDarkMode = false; + static const transparent = Colors.transparent; - static const mainPurple = Color(0xFF7954F7); // #7954F7 - - static const scaffoldBgColor = Color(0xFFF8F8F8); // #F8F8F8 - static const bottomSheetBgColor = Color(0xFFF8F8FA); // #F8F8FA - static const lightGreyEFColor = Color(0xffeaeaff); // #EAEAFF - static const greyF7Color = Color(0xffF7F7F7); // #F7F7F7 - static const greyInfoTextColor = Color(0xff777777); // #777777 - static const lightGrayColor = Color(0xff808080); // #808080 - static const greyTextColorLight = Color(0xFFA2A2A2); // #A2A2A2 - -// New UI Colors - static const whiteColor = Color(0xFFffffff); // #FFFFFF - static const Color bgScaffoldColor = Color(0xffF8F8F8); // #F8F8F8 - static const Color primaryRedColor = Color(0xFFED1C2B); // #ED1C2B - static const Color primaryRedBorderColor = Color(0xFFED1C2B); // #ED1C2B - static const Color secondaryLightRedColor = Color(0xFFFEE9EA); // #FEE9EA - static const Color secondaryLightRedBorderColor = Color(0xFFFEE9EA); // #FEE9EA - static const Color bgRedLightColor = Color(0xFFFEE9EA); // #FEE9EA - static const Color bgGreenColor = Color(0xFF18C273); // #18C273 - static const Color textColor = Color(0xFF2E3039); // #2E3039 - static const Color borderGrayColor = Color(0x332E3039); // #2E3039 (20% opacity) - static const Color textColorLight = Color(0xFF5E5E5E); // #5E5E5E - static const Color borderOnlyColor = Color(0xFF2E3039); // #2E3039 - static const Color chipBorderColorOpacity20 = Color(0x332E3039); // #2E3039 (20% opacity) - static const Color dividerColor = Color(0x40D2D2D2); // #D2D2D2 (25% opacity) - static const Color warningColorYellow = Color(0xFFF4A308); // #F4A308 - static const Color blackBgColor = Color(0xFF2E3039); // #2E3039 - static const blackColor = textColor; // #2E3039 - static const Color inputLabelTextColor = Color(0xff898A8D); // #898A8D - static const Color greyTextColor = Color(0xFF8F9AA3); // #8F9AA3 - static const Color lightGrayBGColor = Color(0x142E3039); // #2E3039 (8% opacity) - static const Color checkBoxBorderColor = Color(0xffD2D2D2); // #D2D2D2 - - static const Color pharmacyBGColor = Color(0xFF359846); // #359846 - - static const lightGreenColor = Color(0xFF0ccedde); // #0CCEDDE - static const textGreenColor = Color(0xFF18C273); // #18C273 - static const Color ratingColorYellow = Color(0xFFFFAF15); // #FFAF15 - static const Color spacerLineColor = Color(0x2E30391A); // #2E3039 (10% opacity) - - //Chips - static const Color successColor = Color(0xff18C273); // #18C273 - static const Color successLightBgColor = Color(0xffDDF6EA); // #DDF6EA - static const Color errorColor = Color(0xFFED1C2B); // #ED1C2B - static const Color alertColor = Color(0xFFD48D05); // #D48D05 - static const Color infoColor = Color(0xFF0B85F7); // #0B85F7 - static const Color warningColor = Color(0xFFFFCC00); // #FFCC00 - static const Color greyColor = Color(0xFFEFEFF0); // #EFEFF0 - static const Color chipPrimaryRedBorderColor = Color(0xFFED1C2B); // #ED1C2B - static const Color chipSecondaryLightRedColor = Color(0xFFFEE9EA); // #FEE9EA - // static const Color chipSecondaryLightRedColor = Color(0xFFFF9E15); // #FEE9EA - - static const Color successLightColor = Color(0xFF18C273); // #18C273 - static const Color errorLightColor = Color(0xFFED1C2B); // #ED1C2B - static const Color alertLightColor = Color(0xFFD48D05); // #D48D05 - static const Color infoLightColor = Color(0xFF0B85F7); // #0B85F7 - static const Color warningLightColor = Color(0xFFFFCC00); // #FFCC00 - static const Color greyLightColor = Color(0xFFEFEFF0); // #EFEFF0 - static const Color thumbColor = Color(0xFF18C273); // #18C273 - static const Color switchBackgroundColor = Color(0x2618C273); // #18C273 (15% opacity) - - static const Color bottomNAVBorder = Color(0xFFEEEEEE); // #EEEEEE - - static const Color quickLoginColor = Color(0xFF666666); // #666666 - - static const Color tooltipTextColor = Color(0xFF414D55); // #414D55 - static const Color graphGridColor = Color(0x4D18C273); // #18C273 (30% opacity) - static const Color criticalLowAndHigh = Color(0xFFED1C2B); // #ED1C2B - static const Color highAndLow = Color(0xFFFFAF15); // #FFAF15 - static const Color labelTextColor = Color(0xFF838383); // #838383 - static const Color calenderTextColor = Color(0xFFD0D0D0); // #D0D0D0 - static const Color lightGreenButtonColor = Color(0x2618C273); // #18C273 (15% opacity) - - static const Color lightRedButtonColor = Color(0x1AED1C2B); // #ED1C2B (10% opacity) - - // Status Colors - static const Color statusPendingColor = Color(0xffCC9B14); // #CC9B14 - static const Color statusProcessingColor = Color(0xff2E303A); // #2E303A - static const Color statusCompletedColor = Color(0xff359846); // #359846 - static const Color statusRejectedColor = Color(0xffD02127); // #D02127 - - // Info Banner Colors - static const Color infoBannerBgColor = Color(0xFFFFF4E6); // #FFF4E6 - static const Color infoBannerBorderColor = Color(0xFFFFE5B4); // #FFE5B4 - static const Color infoBannerIconColor = Color(0xFFCC9B14); // #CC9B14 - static const Color infoBannerTextColor = Color(0xFF856404); // #856404 - - // SymptomsChecker - - static const Color chipColorSeekMedicalAdvice = Color(0xFFFFAF15); // #FFAF15 - static const Color chipTextColorSeekMedicalAdvice = Color(0xFFD48D05); // #AB7103 - static const Color chipColorMonitor = Color(0xFF18C273); // #18C273 - static const Color chipColorEmergency = Color(0xFFED1C2B); // #ED1C2B - - // Services Page Colors - static const Color eReferralCardColor = Color(0xFFFF8012); // #FF8012 - static const Color bloodDonationCardColor = Color(0xFFFF5662); // #FF5662 - static const Color myChildVaccineCardColor = Color(0xFFFF2D78); // #FF5662 - static const Color bookAppointment = Color(0xFF415364); // #415364 + + // ── Scaffold / Background ───────────────────────────────────────────────── + static Color get scaffoldBgColor => isDarkMode ? dark.scaffoldBgColor : const Color(0xFFF8F8F8); + static Color get bottomSheetBgColor => isDarkMode ? dark.bottomSheetBgColor : const Color(0xFFF8F8FA); + static Color get lightGreyEFColor => isDarkMode ? dark.lightGreyEFColor : const Color(0xffeaeaff); + static Color get greyF7Color => isDarkMode ? dark.greyF7Color : const Color(0xffF7F7F7); + static Color get greyInfoTextColor => isDarkMode ? dark.greyInfoTextColor : const Color(0xff777777); + static Color get lightGrayColor => isDarkMode ? dark.lightGrayColor : const Color(0xff808080); + static Color get greyTextColorLight => isDarkMode ? dark.greyTextColorLight : const Color(0xFFA2A2A2); + static Color get mainPurple => isDarkMode ? dark.mainPurple : const Color(0xFF7954F7); + + // ── Core Colors ─────────────────────────────────────────────────────────── + static Color get whiteColor => isDarkMode ? dark.whiteColor : const Color(0xFFffffff); + // static const Color primaryRedColor = Color(0xFFED1C2B); + static Color get primaryRedColor => isDarkMode ? dark.primaryRedColor : Color(0xFFED1C2B); + static Color get secondaryLightRedColor => isDarkMode ? dark.secondaryLightRedColor : const Color(0xFFFEE9EA); + static const Color successColor = Color(0xFF18C273); + static Color get successLightBgColor => isDarkMode ? dark.successLightBgColor : const Color(0xffDDF6EA); + static Color get greyColor => isDarkMode ? dark.greyColor : const Color(0xFFEFEFF0); + static Color get chipBgColor => isDarkMode ? dark.chipBgColor : const Color(0xFFEFEFF0); + static Color get textColor => isDarkMode ? dark.textColor : const Color(0xFF2E3039); + static Color get iconColor => isDarkMode ? dark.iconColor : const Color(0xFF2E3039); + static Color get borderGrayColor => isDarkMode ? dark.borderGrayColor : const Color(0x332E3039); + static Color get textColorLight => isDarkMode ? dark.textColorLight : const Color(0xFF5E5E5E); + static Color get dividerColor => isDarkMode ? dark.dividerColor : const Color(0x40D2D2D2); + static Color get warningColorYellow => isDarkMode ? dark.warningColorYellow : const Color(0xFFF4A308); + static Color get inputLabelTextColor => isDarkMode ? dark.inputLabelTextColor : const Color(0xff898A8D); + static Color get greyTextColor => isDarkMode ? dark.greyTextColor : const Color(0xFF8F9AA3); + static Color get lightGrayBGColor => isDarkMode ? dark.lightGrayBGColor : const Color(0x142E3039); + static Color get checkBoxBorderColor => isDarkMode ? dark.checkBoxBorderColor : const Color(0xffD2D2D2); + static Color get pharmacyBGColor => isDarkMode ? dark.pharmacyBGColor : const Color(0xFF359846); + static Color get lightGreenColor => isDarkMode ? dark.lightGreenColor : const Color(0xFF0ccedde); + static Color get ratingColorYellow => isDarkMode ? dark.ratingColorYellow : const Color(0xFFFFAF15); + static Color get spacerLineColor => isDarkMode ? dark.spacerLineColor : const Color(0x2E30391A); + + // ── Semantic / Status Colors ────────────────────────────────────────────── + static Color get errorColor => isDarkMode ? dark.errorColor : const Color(0xFFED1C2B); + static Color get alertColor => isDarkMode ? dark.alertColor : const Color(0xFFD48D05); + static Color get infoColor => isDarkMode ? dark.infoColor : const Color(0xFF0B85F7); + static Color get warningColor => isDarkMode ? dark.warningColor : const Color(0xFFFFCC00); + static Color get switchBackgroundColor => isDarkMode ? dark.switchBackgroundColor : const Color(0x2618C273); + static Color get bottomNAVBorder => isDarkMode ? dark.bottomNAVBorder : const Color(0xFFEEEEEE); + static Color get quickLoginColor => isDarkMode ? dark.quickLoginColor : const Color(0xFF666666); + static Color get tooltipTextColor => isDarkMode ? dark.tooltipTextColor : const Color(0xFF414D55); + static Color get graphGridColor => isDarkMode ? dark.graphGridColor : const Color(0x4D18C273); + static Color get highAndLow => isDarkMode ? dark.highAndLow : const Color(0xFFFFAF15); + static Color get labelTextColor => isDarkMode ? dark.labelTextColor : const Color(0xFF838383); + static Color get calenderTextColor => isDarkMode ? dark.calenderTextColor : const Color(0xFFD0D0D0); + static Color get lightGreenButtonColor => isDarkMode ? dark.lightGreenButtonColor : const Color(0x2618C273); + static Color get lightRedButtonColor => isDarkMode ? dark.lightRedButtonColor : const Color(0x1AED1C2B); + + // ── Status Colors ───────────────────────────────────────────────────────── + static Color get statusPendingColor => isDarkMode ? dark.statusPendingColor : const Color(0xffCC9B14); + static Color get statusProcessingColor => isDarkMode ? dark.statusProcessingColor : const Color(0xff2E303A); + static Color get statusCompletedColor => isDarkMode ? dark.statusCompletedColor : const Color(0xff359846); + static Color get statusRejectedColor => isDarkMode ? dark.statusRejectedColor : const Color(0xffD02127); + + // ── Info Banner Colors ──────────────────────────────────────────────────── + static Color get infoBannerBgColor => isDarkMode ? dark.infoBannerBgColor : const Color(0xFFFFF4E6); + static Color get infoBannerBorderColor => isDarkMode ? dark.infoBannerBorderColor : const Color(0xFFFFE5B4); + static Color get infoBannerIconColor => isDarkMode ? dark.infoBannerIconColor : const Color(0xFFCC9B14); + static Color get infoBannerTextColor => isDarkMode ? dark.infoBannerTextColor : const Color(0xFF856404); + + // ── Symptoms Checker ─────────────────────────────────────────────��──────── + static Color get chipColorSeekMedicalAdvice => isDarkMode ? dark.chipColorSeekMedicalAdvice : const Color(0xFFFFAF15); + static Color get chipTextColorSeekMedicalAdvice => isDarkMode ? dark.chipTextColorSeekMedicalAdvice : const Color(0xFFD48D05); + + // ── Services Page Colors ────────────────────────────────────────────────── + static Color get eReferralCardColor => isDarkMode ? dark.eReferralCardColor : const Color(0xFFFF8012); + static Color get bloodDonationCardColor => isDarkMode ? dark.bloodDonationCardColor : const Color(0xFFFF5662); + static Color get myChildVaccineCardColor => isDarkMode ? dark.myChildVaccineCardColor : const Color(0xFFFF2D78); + static Color get bookAppointment => isDarkMode ? dark.bookAppointment : const Color(0xFF415364); + + // ── Water Monitor ───────────────────────────────────────────────────────── + static Color get blueColor => isDarkMode ? dark.blueColor : const Color(0xFF4EB5FF); + static Color get blueGradientColorOne => isDarkMode ? dark.blueGradientColorOne : const Color(0xFFF1F7FD); + static Color get blueGradientColorTwo => isDarkMode ? dark.blueGradientColorTwo : const Color(0xFFD9EFFF); + + // ── Shimmer ─────────────────────────────────────────────────────────────── + static Color get shimmerBaseColor => isDarkMode ? dark.shimmerBaseColor : const Color(0xFFE0E0E0); + static Color get shimmerHighlightColor => isDarkMode ? dark.shimmerHighlightColor : const Color(0xFFF5F5F5); + static Color get covid29Color => isDarkMode ? dark.covid29Color : const Color(0xff2563EB); + static Color get lightGreyTextColor => isDarkMode ? dark.lightGreyTextColor : const Color(0xFF959595); + static Color get labelColorYellow => isDarkMode ? dark.labelColorYellow : const Color(0xFFFBCB6E); + + static const LinearGradient aiLinearGradient = + LinearGradient(colors: [Color(0xFF8A38F5), Color(0xFFE20BBB)], begin: Alignment.topLeft, end: Alignment.bottomRight); + + // ── Aliases ─────────────────────────────────────────────────────────────── + static Color get bgScaffoldColor => scaffoldBgColor; + static Color get primaryRedBorderColor => primaryRedColor; + static Color get chipPrimaryRedBorderColor => primaryRedColor; + static Color get criticalLowAndHigh => primaryRedColor; + static Color get chipColorEmergency => primaryRedColor; + static Color get errorLightColor => primaryRedColor; + static Color get secondaryLightRedBorderColor => secondaryLightRedColor; + static Color get bgRedLightColor => secondaryLightRedColor; + static Color get chipSecondaryLightRedColor => secondaryLightRedColor; + static Color get blackBgColor => textColor; + static Color get blackColor => textColor; + static Color get borderOnlyColor => textColor; + static Color get chipBorderColorOpacity20 => borderGrayColor; + static Color get bgGreenColor => successColor; + static Color get textGreenColor => successColor; + static Color get successLightColor => successColor; + static Color get thumbColor => successColor; + static Color get chipColorMonitor => successColor; + static Color get greyLightColor => greyColor; + static Color get alertLightColor => alertColor; + static Color get infoLightColor => infoColor; + static Color get warningLightColor => warningColor; + + // ── Dark Mode Palette ───────────────────────────────────────────────────── + static const AppColorsDark dark = AppColorsDark(); +} + +// --------------------------------------------------------------------------- +// Dark palette — mirrors every color in AppColors with a dark-friendly value. +// --------------------------------------------------------------------------- +class AppColorsDark { + const AppColorsDark(); + + // Scaffold / Background + Color get scaffoldBgColor => const Color(0xFF191919); + Color get bottomSheetBgColor => const Color(0xFF1C1C1E); + Color get lightGreyEFColor => const Color(0xFF2A2A3A); + Color get greyF7Color => const Color(0xFF1E1E1E); + Color get greyInfoTextColor => const Color(0xFF9E9E9E); + Color get lightGrayColor => const Color(0xFF9E9E9E); + Color get greyTextColorLight => const Color(0xFF757575); + + // ⚠️ NEW — was missing from AppColorsDark + Color get mainPurple => const Color(0xFF9B7AFF); // brighter purple for dark surfaces + + // Core + Color get baseColor => const Color(0xFF1E1E1E); + // ⚠️ NEW — maps whiteColor → dark surface color + Color get whiteColor => const Color(0xFF1E1E1E); // surface replacement for white + Color get primaryRedColor => const Color(0xFFDE5C5D); + Color get secondaryLightRedColor => const Color(0xFF3A1015); + Color get successColor => const Color(0xFF18C273); + Color get successLightBgColor => const Color(0xFF0D2E1F); + Color get textColor => const Color(0xFFFFFFFF); + Color get iconColor => const Color(0xFFFFFFFF); + Color get borderGrayColor => const Color(0x55ECECEC); + Color get textColorLight => const Color(0xFFB0B0B0); + Color get dividerColor => const Color(0x33FFFFFF); + Color get warningColorYellow => const Color(0xFFF4A308); + Color get inputLabelTextColor => const Color(0xFF9E9E9E); + Color get greyTextColor => const Color(0xFF8F9AA3); + Color get lightGrayBGColor => const Color(0x22FFFFFF); + Color get checkBoxBorderColor => const Color(0xFF555555); + Color get pharmacyBGColor => const Color(0xFF359846); + // ⚠️ NEW — was missing from AppColorsDark + Color get lightGreenColor => const Color(0xFF0ccedde); // same teal accent — works on dark + Color get ratingColorYellow => const Color(0xFFFFAF15); + Color get spacerLineColor => const Color(0x22FFFFFF); + + // Semantic / Status + Color get errorColor => const Color(0xFFD63D48); + Color get alertColor => const Color(0xFFD48D05); + Color get infoColor => const Color(0xFF4DA6FF); + Color get warningColor => const Color(0xFFFFCC00); + Color get greyColor => const Color(0xFF2C2C2E); + Color get chipBgColor => const Color(0xFF3E3E3E); + Color get cardDarkBorderColor => const Color(0x0DEAEAEA); + Color get serviceCardButtonColor => const Color(0xFF3E3E3E); + Color get switchBackgroundColor => const Color(0x2618C273); + Color get bottomNAVBorder => const Color(0xFF2C2C2E); + Color get quickLoginColor => const Color(0xFF9E9E9E); + Color get tooltipTextColor => const Color(0xFFCFD8DC); + Color get graphGridColor => const Color(0x4D18C273); + Color get highAndLow => const Color(0xFFFFAF15); + Color get labelTextColor => const Color(0xFF9E9E9E); + Color get calenderTextColor => const Color(0xFF555555); + Color get lightGreenButtonColor => const Color(0x2618C273); + Color get lightRedButtonColor => const Color(0x1AED1C2B); + + // Status + Color get statusPendingColor => const Color(0xFFCC9B14); + Color get statusProcessingColor => const Color(0xFFECECEC); + Color get statusCompletedColor => const Color(0xFF359846); + Color get statusRejectedColor => const Color(0xFFD02127); + + // Info Banner + Color get infoBannerBgColor => const Color(0xFF2A1F0A); + Color get infoBannerBorderColor => const Color(0xFF5A3D0A); + Color get infoBannerIconColor => const Color(0xFFCC9B14); + Color get infoBannerTextColor => const Color(0xFFFFCB6B); + + // Symptoms Checker + Color get chipColorSeekMedicalAdvice => const Color(0xFFFFAF15); + Color get chipTextColorSeekMedicalAdvice => const Color(0xFFD48D05); + + // Services Page + Color get eReferralCardColor => const Color(0xFFFF8012); + Color get bloodDonationCardColor => const Color(0xFFFF5662); + Color get myChildVaccineCardColor => const Color(0xFFFF2D78); + Color get bookAppointment => const Color(0xFF415364); + + // Water Monitor + Color get blueColor => const Color(0xFF4EB5FF); + Color get blueGradientColorOne => const Color(0xFF101C2A); + Color get blueGradientColorTwo => const Color(0xFF0D2235); + + // Shimmer + Color get shimmerBaseColor => const Color(0xFF2C2C2C); + Color get shimmerHighlightColor => const Color(0xFF3D3D3D); + Color get covid29Color => const Color(0xFF2563EB); + Color get lightGreyTextColor => const Color(0xFF757575); + Color get labelColorYellow => const Color(0xFFFBCB6E); + + // Aliases + Color get bgScaffoldColor => scaffoldBgColor; + Color get primaryRedBorderColor => primaryRedColor; + Color get chipPrimaryRedBorderColor => primaryRedColor; + Color get criticalLowAndHigh => primaryRedColor; + Color get chipColorEmergency => primaryRedColor; + Color get errorLightColor => primaryRedColor; + Color get secondaryLightRedBorderColor => secondaryLightRedColor; + Color get bgRedLightColor => secondaryLightRedColor; + Color get chipSecondaryLightRedColor => secondaryLightRedColor; + Color get blackBgColor => textColor; + Color get blackColor => textColor; + Color get borderOnlyColor => textColor; + Color get chipBorderColorOpacity20 => borderGrayColor; + Color get bgGreenColor => successColor; + Color get textGreenColor => successColor; + Color get successLightColor => successColor; + Color get thumbColor => successColor; + Color get chipColorMonitor => successColor; + Color get greyLightColor => greyColor; + Color get alertLightColor => alertColor; + Color get infoLightColor => infoColor; + Color get warningLightColor => warningColor; +} + +// --------------------------------------------------------------------------- +// BuildContext extension — resolves the right palette based on theme brightness +// --------------------------------------------------------------------------- +extension AppColorsContext on BuildContext { + bool get _isDark => Theme.of(this).brightness == Brightness.dark; + + // Scaffold / Background + Color get scaffoldBgColor => _isDark ? AppColors.dark.scaffoldBgColor : const Color(0xFFF8F8F8); + Color get bottomSheetBgColor => _isDark ? AppColors.dark.bottomSheetBgColor : const Color(0xFFF8F8FA); + Color get greyF7Color => _isDark ? AppColors.dark.greyF7Color : const Color(0xffF7F7F7); + Color get greyInfoTextColor => _isDark ? AppColors.dark.greyInfoTextColor : const Color(0xff777777); + Color get lightGrayColor => _isDark ? AppColors.dark.lightGrayColor : const Color(0xff808080); + + // Core + Color get cardBaseColor => _isDark ? AppColors.dark.baseColor : const Color(0xFFFFFFFF); + Color get primaryRedColor => _isDark ? AppColors.dark.primaryRedColor : AppColors.primaryRedColor; + Color get secondaryLightRedColor => _isDark ? AppColors.dark.serviceCardButtonColor : const Color(0xFFFEE9EA); + Color get secondaryLightRedForegroundColor => _isDark ? const Color(0xFFFFFFFF) : AppColors.primaryRedColor; + Color get successColor => AppColors.successColor; + Color get successLightBgColor => _isDark ? AppColors.dark.successLightBgColor : const Color(0xffDDF6EA); + Color get textColor => _isDark ? AppColors.dark.textColor : const Color(0xFF2E3039); + Color get iconColor => _isDark ? AppColors.dark.iconColor : const Color(0xFF2E3039); + Color get borderGrayColor => _isDark ? AppColors.dark.borderGrayColor : const Color(0x332E3039); + Color get textColorLight => _isDark ? AppColors.dark.textColorLight : const Color(0xFF5E5E5E); + Color get dividerColor => _isDark ? AppColors.dark.dividerColor : const Color(0x40D2D2D2); + Color get inputLabelTextColor => _isDark ? AppColors.dark.inputLabelTextColor : const Color(0xff898A8D); + Color get greyTextColor => AppColors.greyTextColor; + Color get lightGrayBGColor => _isDark ? AppColors.dark.lightGrayBGColor : const Color(0x142E3039); + Color get checkBoxBorderColor => _isDark ? AppColors.dark.checkBoxBorderColor : const Color(0xffD2D2D2); + + // Status / Semantic + Color get errorColor => _isDark ? AppColors.dark.errorColor : const Color(0xFFED1C2B); + Color get alertColor => AppColors.alertColor; + Color get infoColor => _isDark ? AppColors.dark.infoColor : const Color(0xFF0B85F7); + Color get warningColor => AppColors.warningColor; + Color get greyColor => _isDark ? AppColors.dark.greyColor : const Color(0xFFEFEFF0); + Color get chipBgColor => _isDark ? AppColors.dark.chipBgColor : const Color(0xFFEFEFF0); + Color get cardDarkBorderColor => _isDark ? AppColors.dark.cardDarkBorderColor : Colors.transparent; + Color get serviceCardButtonColor => _isDark ? AppColors.dark.serviceCardButtonColor : const Color(0xFF2E3039); + Color get bottomNAVBorder => _isDark ? AppColors.dark.bottomNAVBorder : const Color(0xFFEEEEEE); + Color get labelTextColor => _isDark ? AppColors.dark.labelTextColor : const Color(0xFF838383); + Color get lightGreyTextColor => _isDark ? AppColors.dark.lightGreyTextColor : const Color(0xFF959595); + + // Info Banner + Color get infoBannerBgColor => _isDark ? AppColors.dark.infoBannerBgColor : const Color(0xFFFFF4E6); + Color get infoBannerBorderColor => _isDark ? AppColors.dark.infoBannerBorderColor : const Color(0xFFFFE5B4); + Color get infoBannerIconColor => AppColors.infoBannerIconColor; + Color get infoBannerTextColor => _isDark ? AppColors.dark.infoBannerTextColor : const Color(0xFF856404); // Water Monitor - static const Color blueColor = Color(0xFF4EB5FF); // #4EB5FF - static const Color blueGradientColorOne = Color(0xFFF1F7FD); // #F1F7FD - static const Color blueGradientColorTwo = Color(0xFFD9EFFF); // #D9EFFF + Color get blueColor => AppColors.blueColor; + Color get blueGradientColorOne => _isDark ? AppColors.dark.blueGradientColorOne : const Color(0xFFF1F7FD); + Color get blueGradientColorTwo => _isDark ? AppColors.dark.blueGradientColorTwo : const Color(0xFFD9EFFF); // Shimmer - static const Color shimmerBaseColor = Color(0xFFE0E0E0); // #E0E0E0 - static const Color shimmerHighlightColor = Color(0xFFF5F5F5); // #F5F5F5 - static const Color covid29Color = Color(0xff2563EB); // #2563EB - static const Color lightGreyTextColor = Color(0xFF959595); - static const Color labelColorYellow = Color(0xFFFBCB6E); + Color get shimmerBaseColor => _isDark ? AppColors.dark.shimmerBaseColor : const Color(0xFFE0E0E0); + Color get shimmerHighlightColor => _isDark ? AppColors.dark.shimmerHighlightColor : const Color(0xFFF5F5F5); - static const LinearGradient aiLinearGradient = LinearGradient(colors: [Color(0xFF8A38F5), Color(0xFFE20BBB)], begin: Alignment.topLeft, end: Alignment.bottomRight); + // Aliases + Color get bgScaffoldColor => scaffoldBgColor; + Color get bgGreenColor => successColor; + Color get bgRedLightColor => secondaryLightRedColor; + Color get blackColor => textColor; + Color get blackBgColor => textColor; } diff --git a/lib/widgets/appbar/app_bar_widget.dart b/lib/widgets/appbar/app_bar_widget.dart index 942a93f2..05db7724 100644 --- a/lib/widgets/appbar/app_bar_widget.dart +++ b/lib/widgets/appbar/app_bar_widget.dart @@ -57,7 +57,7 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { ), // Logo - if (!hideLogoAndLang) Utils.buildSvgWithAssets(icon: AppAssets.habiblogo, height: 24.h), + if (!hideLogoAndLang) Utils.buildSvgWithAssets(icon: AppAssets.habiblogo, height: 24.h, applyThemeColor: false), if (!hideLogoAndLang) Expanded( diff --git a/lib/widgets/appbar/collapsing_toolbar.dart b/lib/widgets/appbar/collapsing_toolbar.dart index 8bf1e4b4..9b1d4854 100644 --- a/lib/widgets/appbar/collapsing_toolbar.dart +++ b/lib/widgets/appbar/collapsing_toolbar.dart @@ -96,7 +96,7 @@ class _CollapsingToolbarState extends State { ? Transform.flip( flipX: appState.isArabic(), child: IconButton( - icon: Utils.buildSvgWithAssets(icon: widget.isClose ? AppAssets.closeBottomNav : AppAssets.arrow_back, width: 32.h, height: 32.h), + icon: Utils.buildSvgWithAssets(icon: widget.isClose ? AppAssets.closeBottomNav : AppAssets.arrow_back, width: 32.h, height: 32.h, applyThemeColor: false), padding: EdgeInsets.only(left: 12), onPressed: () => Navigator.pop(context), highlightColor: Colors.transparent, diff --git a/lib/widgets/arrow_back.dart b/lib/widgets/arrow_back.dart index cf3e52ef..4446ea9b 100644 --- a/lib/widgets/arrow_back.dart +++ b/lib/widgets/arrow_back.dart @@ -3,12 +3,13 @@ import 'package:flutter/material.dart'; class ArrowBack extends StatelessWidget { final Function? onTap; - final Color color; + final Color? color; - ArrowBack({Key? key, this.onTap, this.color = AppColors.whiteColor}) : super(key: key); + ArrowBack({Key? key, this.onTap, this.color}) : super(key: key); @override Widget build(BuildContext context) { + final resolvedColor = color ?? AppColors.whiteColor; // ProjectViewModel projectViewModel = Provider.of(context); return GestureDetector( behavior: HitTestBehavior.opaque, @@ -17,7 +18,7 @@ class ArrowBack extends StatelessWidget { }, context), child: Icon( Icons.arrow_back_ios, - color: color, + color: resolvedColor, ), ); } diff --git a/lib/widgets/bottom_navigation/bottom_navigation.dart b/lib/widgets/bottom_navigation/bottom_navigation.dart index 46067dfe..9d390388 100644 --- a/lib/widgets/bottom_navigation/bottom_navigation.dart +++ b/lib/widgets/bottom_navigation/bottom_navigation.dart @@ -28,9 +28,7 @@ class BottomNavigation extends StatelessWidget { icon: AppAssets.bookAppoBottom, fillIcon: AppAssets.bookAppoBottom, label: LocaleKeys.appointment.tr(context: context), - iconSize: 32, - isSpecial: true, - ), + iconSize: 32, isSpecial: true), appState.isAuthenticated // ? BottomNavItem(icon: AppAssets.toDoBottom, label: LocaleKeys.todoList.tr(context: context)) ? BottomNavItem(icon: AppAssets.symptomCheckerBottomIcon, fillIcon: AppAssets.symptomCheckerBottomFillIcon, label: LocaleKeys.symptoms.tr(context: context)) @@ -39,8 +37,16 @@ class BottomNavigation extends StatelessWidget { ]; return Container( - decoration: _containerDecoration, - padding: _containerPadding, + decoration: BoxDecoration( + color: AppColors.whiteColor, + border: Border( + top: BorderSide( + color: AppColors.bottomNAVBorder, + width: 0.5, + ), + ), + ), + padding: const EdgeInsets.all(15), // height: 84.h, child: Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, @@ -69,6 +75,7 @@ class BottomNavigation extends StatelessWidget { icon: isSelected ? item.fillIcon : item.icon, height: item.iconSize.h, width: item.iconSize.w, + applyThemeColor: !item.isSpecial // iconColor: isSelected ? Colors.black87 : Colors.black87, ), // const SizedBox(height: 10), @@ -100,14 +107,3 @@ class BottomNavItem { }); } -// Constants -const EdgeInsets _containerPadding = EdgeInsets.all(15); -const BoxDecoration _containerDecoration = BoxDecoration( - color: Colors.white, - border: Border( - top: BorderSide( - color: AppColors.bottomNAVBorder, - width: 0.5, - ), - ), -); diff --git a/lib/widgets/bottom_sheet.dart b/lib/widgets/bottom_sheet.dart index 4aef0efa..ee70782b 100644 --- a/lib/widgets/bottom_sheet.dart +++ b/lib/widgets/bottom_sheet.dart @@ -1,5 +1,6 @@ import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; void showMyBottomSheet(BuildContext context, {required Widget child, required VoidCallback callBackFunc, String? type}) { showModalBottomSheet( @@ -10,8 +11,8 @@ void showMyBottomSheet(BuildContext context, {required Widget child, required Vo return Container( constraints: BoxConstraints( maxHeight: type =='CONTINUE_ACTION' ? MediaQuery.of(context).size.height *.75 : double.infinity,), - decoration: const BoxDecoration( - color: Colors.white, + decoration: BoxDecoration( + color: AppColors.whiteColor, borderRadius: BorderRadius.only( topRight: Radius.circular(25), topLeft: Radius.circular(25), diff --git a/lib/widgets/buttons/default_button.dart b/lib/widgets/buttons/default_button.dart index d8d8cacd..f6a47a1c 100644 --- a/lib/widgets/buttons/default_button.dart +++ b/lib/widgets/buttons/default_button.dart @@ -1,10 +1,11 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; extension WithContainer on Widget { Widget get insideContainer => Container( - color: Colors.white, + color: AppColors.whiteColor, padding: const EdgeInsets.only(top: 16, bottom: 16, right: 21, left: 21), child: this, ); diff --git a/lib/widgets/chip/app_custom_chip_widget.dart b/lib/widgets/chip/app_custom_chip_widget.dart index 8597b3ed..77345933 100644 --- a/lib/widgets/chip/app_custom_chip_widget.dart +++ b/lib/widgets/chip/app_custom_chip_widget.dart @@ -9,23 +9,24 @@ class AppCustomChipWidget extends StatelessWidget { const AppCustomChipWidget({ super.key, this.labelText, - this.textColor = AppColors.textColor, - this.backgroundColor = AppColors.greyColor, + this.textColor, + this.backgroundColor, this.iconSize, this.icon = "", - this.iconColor = AppColors.textColor, + this.iconColor, this.richText, this.iconHasColor = true, this.shape, this.deleteIcon, this.deleteIconSize, - this.deleteIconColor = AppColors.textColor, + this.deleteIconColor, this.deleteIconHasColor = false, this.padding = EdgeInsets.zero, this.isIconPNG = false, this.onChipTap, this.labelPadding, this.onDeleteTap, + this.applyThemeColor = true, }); final String? labelText; @@ -36,7 +37,7 @@ class AppCustomChipWidget extends StatelessWidget { final String icon; final String? deleteIcon; final Size? deleteIconSize; - final Color iconColor; + final Color? iconColor; final Color? deleteIconColor; final bool iconHasColor; final bool deleteIconHasColor; @@ -46,10 +47,15 @@ class AppCustomChipWidget extends StatelessWidget { final bool isIconPNG; final void Function()? onChipTap; final void Function()? onDeleteTap; + final bool applyThemeColor; @override Widget build(BuildContext context) { final iconS = iconSize ?? 12.w; + final resolvedTextColor = textColor ?? AppColors.textColor; + final resolvedBackgroundColor = backgroundColor ?? AppColors.greyColor; + final resolvedIconColor = iconColor ?? AppColors.textColor; + final resolvedDeleteIconColor = deleteIconColor ?? AppColors.textColor; return GestureDetector( onTap: onChipTap, child: SizedBox( @@ -74,15 +80,16 @@ class AppCustomChipWidget extends StatelessWidget { icon: icon, width: iconS, height: iconS, - iconColor: iconHasColor ? iconColor : null, + iconColor: iconHasColor ? resolvedIconColor : null, fit: BoxFit.contain, + applyThemeColor: applyThemeColor, ) : SizedBox.shrink(), - label: richText ?? (labelText?? "").toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor), + label: richText ?? (labelText?? "").toText10(weight: FontWeight.w500, letterSpacing: 0, color: resolvedTextColor), padding: padding, materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, labelPadding: labelPadding ?? EdgeInsetsDirectional.only(end: deleteIcon?.isNotEmpty == true ? 2.w : 8.w), - backgroundColor: backgroundColor, + backgroundColor: resolvedBackgroundColor, shape: shape ?? SmoothRectangleBorder( borderRadius: BorderRadius.circular(8.r), @@ -96,7 +103,8 @@ class AppCustomChipWidget extends StatelessWidget { icon: deleteIcon!, width: iconS, height: iconS, - iconColor: deleteIconHasColor ? deleteIconColor : null, + iconColor: deleteIconHasColor ? resolvedDeleteIconColor : null, + applyThemeColor: applyThemeColor, ), ) : null, @@ -104,9 +112,9 @@ class AppCustomChipWidget extends StatelessWidget { ) : Chip( materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - label: richText ?? (labelText?? "").toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor, isCenter: true), + label: richText ?? (labelText?? "").toText10(weight: FontWeight.w500, letterSpacing: 0, color: resolvedTextColor, isCenter: true), padding: EdgeInsets.zero, - backgroundColor: backgroundColor, + backgroundColor: resolvedBackgroundColor, shape: shape ?? SmoothRectangleBorder( borderRadius: BorderRadius.circular(8.r), @@ -118,7 +126,7 @@ class AppCustomChipWidget extends StatelessWidget { ? InkWell( onTap: onDeleteTap, child: Utils.buildSvgWithAssets( - icon: deleteIcon!, width: iconS, height: iconS, iconColor: deleteIconHasColor ? deleteIconColor : null)) + icon: deleteIcon!, width: iconS, height: iconS, iconColor: deleteIconHasColor ? resolvedDeleteIconColor : null, applyThemeColor: applyThemeColor)) : null, onDeleted: deleteIcon?.isNotEmpty == true ? () {} : null, ), diff --git a/lib/widgets/chip/custom_selectable_chip.dart b/lib/widgets/chip/custom_selectable_chip.dart index be42bfd9..06ccb95f 100644 --- a/lib/widgets/chip/custom_selectable_chip.dart +++ b/lib/widgets/chip/custom_selectable_chip.dart @@ -9,7 +9,7 @@ class CustomSelectableChip extends StatelessWidget { final Color activeColor; final Color activeTextColor; final Color inactiveBorderColor; - final Color inactiveTextColor; + final Color? inactiveTextColor; const CustomSelectableChip({ super.key, @@ -19,11 +19,12 @@ class CustomSelectableChip extends StatelessWidget { this.activeColor = const Color(0xFFD03C32), // red accent this.activeTextColor = Colors.white, this.inactiveBorderColor = const Color(0xFFE8E8E8), - this.inactiveTextColor = const Color(0xFF222222), + this.inactiveTextColor, }); @override Widget build(BuildContext context) { + final resolvedInactiveTextColor = inactiveTextColor ?? AppColors.textColor; final double radius = 8.0; return AnimatedContainer( duration: const Duration(milliseconds: 180), @@ -44,7 +45,7 @@ class CustomSelectableChip extends StatelessWidget { style: TextStyle( fontSize: 12.f, fontWeight: FontWeight.w500, - color: selected ? activeTextColor : inactiveTextColor, + color: selected ? activeTextColor : resolvedInactiveTextColor, letterSpacing: -0.02 * 18, height: 1.0, ), diff --git a/lib/widgets/common_bottom_sheet.dart b/lib/widgets/common_bottom_sheet.dart index 515d1f72..5269a8dc 100644 --- a/lib/widgets/common_bottom_sheet.dart +++ b/lib/widgets/common_bottom_sheet.dart @@ -134,7 +134,7 @@ class ButtonSheetContent extends StatelessWidget { padding: EdgeInsets.symmetric( horizontal: 16, ), - child: Utils.buildSvgWithAssets(icon: AppAssets.closeBottomNav, width: 32, height: 32).onPress(() { + child: Utils.buildSvgWithAssets(icon: AppAssets.closeBottomNav, width: 32, height: 32, applyThemeColor: false).onPress(() { Navigator.of(context).pop(); }), ) @@ -169,9 +169,10 @@ void showCommonBottomSheetWithoutHeight( bool useSafeArea = false, bool hasBottomPadding = true, EdgeInsets? padding, - Color backgroundColor = AppColors.bottomSheetBgColor, + Color? backgroundColor, VoidCallback? onCloseClicked, }) { + final resolvedBgColor = backgroundColor ?? AppColors.bottomSheetBgColor; showModalBottomSheet( sheetAnimationStyle: AnimationStyle( duration: Duration(milliseconds: 500), @@ -184,7 +185,7 @@ void showCommonBottomSheetWithoutHeight( showDragHandle: false, isDismissible: isDismissible, enableDrag: isDismissible, - backgroundColor: backgroundColor, + backgroundColor: resolvedBgColor, useSafeArea: useSafeArea, builder: (BuildContext context) { return SafeArea( @@ -228,7 +229,7 @@ void showCommonBottomSheetWithoutHeight( if (isCloseButtonVisible) ...[ Utils.buildSvgWithAssets( icon: AppAssets.close_bottom_sheet_icon, - iconColor: Color(0xff2B353E), + iconColor: AppColors.textColor, ).onPress(() { onCloseClicked?.call(); Navigator.of(context).pop(); diff --git a/lib/widgets/countdown_timer.dart b/lib/widgets/countdown_timer.dart index 1722ebfa..7f8304e6 100644 --- a/lib/widgets/countdown_timer.dart +++ b/lib/widgets/countdown_timer.dart @@ -3,6 +3,7 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; Widget buildTime(Duration duration, {bool isHomePage = false}) { String twoDigits(int n) => n.toString().padLeft(2, '0'); @@ -41,7 +42,7 @@ Widget buildDigit(String digit) { padding: const EdgeInsets.symmetric(horizontal: 10, vertical: 4), // margin: const EdgeInsets.symmetric(horizontal: 2), decoration: BoxDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: BorderRadius.circular(8), ), child: ClipRect( diff --git a/lib/widgets/custom_tab_bar.dart b/lib/widgets/custom_tab_bar.dart index c30c0700..0fd354e0 100644 --- a/lib/widgets/custom_tab_bar.dart +++ b/lib/widgets/custom_tab_bar.dart @@ -16,20 +16,20 @@ class CustomTabBarModel { class CustomTabBar extends StatefulWidget { final int initialIndex; final List tabs; - final Color activeTextColor; - final Color activeBackgroundColor; - final Color inActiveTextColor; - final Color inActiveBackgroundColor; + final Color? activeTextColor; + final Color? activeBackgroundColor; + final Color? inActiveTextColor; + final Color? inActiveBackgroundColor; final Function(int)? onTabChange; const CustomTabBar({ super.key, required this.tabs, this.initialIndex = 0, - this.activeTextColor = const Color(0xff2E3039), - this.inActiveTextColor = const Color(0xff898A8D), - this.activeBackgroundColor = const Color(0x142E3039), - this.inActiveBackgroundColor = Colors.white, + this.activeTextColor, + this.inActiveTextColor, + this.activeBackgroundColor, + this.inActiveBackgroundColor, this.onTabChange, }); @@ -57,6 +57,10 @@ class CustomTabBarState extends State { @override Widget build(BuildContext context) { + final resolvedActiveTextColor = widget.activeTextColor ?? AppColors.textColor; + final resolvedInActiveTextColor = widget.inActiveTextColor ?? AppColors.inputLabelTextColor; + final resolvedActiveBgColor = widget.activeBackgroundColor ?? AppColors.lightGrayBGColor; + final resolvedInActiveBgColor = widget.inActiveBackgroundColor ?? AppColors.whiteColor; late Widget parentWidget; if (widget.tabs.length > 3) { @@ -65,7 +69,7 @@ class CustomTabBarState extends State { scrollDirection: Axis.horizontal, padding: EdgeInsets.zero, physics: const BouncingScrollPhysics(), - itemBuilder: (cxt, index) => myTab(widget.tabs[index], index), + itemBuilder: (cxt, index) => myTab(widget.tabs[index], index, resolvedActiveTextColor, resolvedInActiveTextColor, resolvedActiveBgColor, resolvedInActiveBgColor), separatorBuilder: (cxt, index) => 4.width, itemCount: widget.tabs.length, ); @@ -73,7 +77,7 @@ class CustomTabBarState extends State { parentWidget = Row( mainAxisAlignment: MainAxisAlignment.center, spacing: 4.w, - children: [for (int i = 0; i < widget.tabs.length; i++) myTab(widget.tabs[i], i).expanded], + children: [for (int i = 0; i < widget.tabs.length; i++) myTab(widget.tabs[i], i, resolvedActiveTextColor, resolvedInActiveTextColor, resolvedActiveBgColor, resolvedInActiveBgColor).expanded], ); } @@ -87,14 +91,14 @@ class CustomTabBarState extends State { child: Center(child: parentWidget)); } - Widget myTab(CustomTabBarModel tabBar, int currentIndex) { + Widget myTab(CustomTabBarModel tabBar, int currentIndex, Color activeTextColor, Color inActiveTextColor, Color activeBgColor, Color inActiveBgColor) { bool isSelected = selectedIndex == currentIndex; return Container( height: (isTablet || isFoldable) ? 60.h : 54.h, padding: EdgeInsets.only(top: 4.h, bottom: 4.h, left: 14.w, right: 14.w), alignment: Alignment.center, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: isSelected ? widget.activeBackgroundColor : widget.inActiveBackgroundColor, + color: isSelected ? activeBgColor : inActiveBgColor, borderRadius: 10.r, ), child: Row( @@ -106,11 +110,11 @@ class CustomTabBarState extends State { icon: tabBar.image!, height: 18.h, width: 18.w, - iconColor: isSelected ? widget.activeTextColor : widget.inActiveTextColor, + iconColor: isSelected ? activeTextColor : inActiveTextColor, ), tabBar.title.toText13( weight: isSelected ? FontWeight.w600 : FontWeight.w500, - color: isSelected ? widget.activeTextColor : widget.inActiveTextColor, + color: isSelected ? activeTextColor : inActiveTextColor, letterSpacing: isSelected ? -0.3 : -0.1), ], )).onPress(() { diff --git a/lib/widgets/date_range_selector/date_range_calender.dart b/lib/widgets/date_range_selector/date_range_calender.dart index 89725f32..0f6c9b99 100644 --- a/lib/widgets/date_range_selector/date_range_calender.dart +++ b/lib/widgets/date_range_selector/date_range_calender.dart @@ -87,15 +87,15 @@ class _DateRangeSelectorState extends State { thickness: 1, ).paddingOnly(bottom: 16.h, top: 16.h), Material( - color: Colors.white, + color: AppColors.whiteColor, child: SfDateRangePicker( controller: _calendarController, selectionMode: DateRangePickerSelectionMode.range, showNavigationArrow: true, headerHeight: 40.h, - backgroundColor: Colors.white, + backgroundColor: AppColors.whiteColor, headerStyle: DateRangePickerHeaderStyle( - backgroundColor: Colors.white, + backgroundColor: AppColors.whiteColor, textAlign: TextAlign.start, textStyle: TextStyle( fontSize: 18.f, @@ -107,7 +107,7 @@ class _DateRangeSelectorState extends State { ), monthViewSettings: DateRangePickerMonthViewSettings( viewHeaderStyle: DateRangePickerViewHeaderStyle( - backgroundColor: Colors.white, + backgroundColor: AppColors.whiteColor, textStyle: TextStyle( fontSize: 14.f, fontWeight: FontWeight.w600, diff --git a/lib/widgets/datepicker_widget.dart b/lib/widgets/datepicker_widget.dart index 6ca9fe1f..1a5444a0 100644 --- a/lib/widgets/datepicker_widget.dart +++ b/lib/widgets/datepicker_widget.dart @@ -33,7 +33,7 @@ class DatePickerWidget extends StatelessWidget { padding: padding, alignment: Alignment.center, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: isAllowRadius ? 15 : null, side: isBorderAllowed ? BorderSide(color: const Color(0xffefefef), width: 1) : null, ), diff --git a/lib/widgets/dialogs/confirm_dialog.dart b/lib/widgets/dialogs/confirm_dialog.dart index ce597c2d..5f7782fa 100644 --- a/lib/widgets/dialogs/confirm_dialog.dart +++ b/lib/widgets/dialogs/confirm_dialog.dart @@ -20,7 +20,7 @@ class ConfirmDialog extends StatelessWidget { @override Widget build(BuildContext context) { return Dialog( - backgroundColor: Colors.white, + backgroundColor: AppColors.whiteColor, shape: const RoundedRectangleBorder(), insetPadding: const EdgeInsets.only(left: 21, right: 21), child: Padding( @@ -35,7 +35,7 @@ class ConfirmDialog extends StatelessWidget { Expanded( child: Text( title ?? LocaleKeys.confirm.tr(), - style: const TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: AppColors.blackColor, height: 35 / 24, letterSpacing: -0.96), + style: TextStyle(fontSize: 24, fontWeight: FontWeight.w600, color: AppColors.blackColor, height: 35 / 24, letterSpacing: -0.96), ).paddingOnly(top: 16), ), IconButton( diff --git a/lib/widgets/dropdown/country_dropdown_widget.dart b/lib/widgets/dropdown/country_dropdown_widget.dart index 1cd387f9..bc4b5edf 100644 --- a/lib/widgets/dropdown/country_dropdown_widget.dart +++ b/lib/widgets/dropdown/country_dropdown_widget.dart @@ -73,7 +73,7 @@ class CustomCountryDropdownState extends State { }, child: Row( children: [ - Utils.buildSvgWithAssets(icon: selectedCountry != null ? selectedCountry!.iconPath : AppAssets.ksa, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: selectedCountry != null ? selectedCountry!.iconPath : AppAssets.ksa, width: 40.h, height: 40.h, applyThemeColor: false), SizedBox(width: 8.h), Utils.buildSvgWithAssets(icon: _isDropdownOpen ? AppAssets.dropdow_icon : AppAssets.dropdow_icon), ], @@ -189,7 +189,7 @@ class CustomCountryDropdownState extends State { decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 16.h), child: Row( children: [ - Utils.buildSvgWithAssets(icon: country.iconPath, width: 38.h, height: 38.h), + Utils.buildSvgWithAssets(icon: country.iconPath, width: 38.h, height: 38.h, applyThemeColor: false), if (!widget.isFromBottomSheet) SizedBox(width: 12.h), if (!widget.isFromBottomSheet) Text(appState.getLanguageCode() == "ar" ? country.nameArabic : country.displayName, diff --git a/lib/widgets/dropdown/dropdown_widget.dart b/lib/widgets/dropdown/dropdown_widget.dart index 5ef5e580..a78b8fa5 100644 --- a/lib/widgets/dropdown/dropdown_widget.dart +++ b/lib/widgets/dropdown/dropdown_widget.dart @@ -55,8 +55,8 @@ class DropdownWidget extends StatelessWidget { padding: padding, alignment: Alignment.center, // This might need adjustment based on layout decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: Colors.white, - borderRadius: isAllowRadius ? 15.h : null, + color: AppColors.whiteColor, + borderRadius: isAllowRadius ? 15.h : null, side: isBorderAllowed ? BorderSide(color: hasError! ? Colors.red: const Color(0xffefefef), width: 1) : null, ), child: Row( @@ -92,7 +92,8 @@ class DropdownWidget extends StatelessWidget { margin: EdgeInsets.only(right: 10.h), padding: EdgeInsets.all(8.h), decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 10.h, color: AppColors.greyColor), - child: Utils.buildSvgWithAssets(icon: leadingIcon!)); + child: Utils.buildSvgWithAssets(icon: leadingIcon!), + ); } Widget _buildLabelText(Color? labelColor) { @@ -142,7 +143,7 @@ class DropdownWidget extends StatelessWidget { borderRadius: BorderRadius.circular(12), ), - color: AppColors.scaffoldBgColor + color: Colors.black ); if (selected != null && onChange != null) { @@ -163,7 +164,8 @@ class DropdownWidget extends StatelessWidget { fontSize: 14.f, height: 21 / 14, fontWeight: FontWeight.w500, - color: (selectedValue != null && selectedValue!.isNotEmpty) ? const Color(0xff2E3039) : const Color(0xffB0B0B0), + // color: (selectedValue != null && selectedValue!.isNotEmpty) ? const Color(0xff2E3039) : const Color(0xffB0B0B0), + color: AppColors.textColor, letterSpacing: -0.2, ), ), diff --git a/lib/widgets/expandable_list_widget.dart b/lib/widgets/expandable_list_widget.dart index db4e3980..d6d2efdf 100644 --- a/lib/widgets/expandable_list_widget.dart +++ b/lib/widgets/expandable_list_widget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; // ==================== MAIN CUSTOM WIDGET ==================== @@ -251,12 +252,12 @@ class ExpandableListTheme { }); factory ExpandableListTheme.defaultTheme(BuildContext context) { - final textColor = Theme.of(context).textTheme.bodyLarge?.color ?? Colors.black; + final textColor = Theme.of(context).textTheme.bodyLarge?.color ?? AppColors.textColor; return ExpandableListTheme( backgroundColor: Colors.transparent, expandedBackgroundColor: Colors.transparent, - dividerColor: Colors.grey.shade300, + dividerColor: AppColors.dividerColor, defaultTrailingIcon: Icon( Icons.keyboard_arrow_down, color: textColor, @@ -278,10 +279,10 @@ class ExpandableListTheme { }) { return ExpandableListTheme( backgroundColor: backgroundColor ?? Colors.transparent, - expandedBackgroundColor: expandedBackgroundColor ?? Colors.grey.shade50, - dividerColor: dividerColor ?? Colors.grey.shade300, + expandedBackgroundColor: expandedBackgroundColor ?? AppColors.whiteColor, + dividerColor: dividerColor ?? AppColors.dividerColor, defaultTrailingIcon: defaultTrailingIcon ?? - Icon(Icons.keyboard_arrow_down, color: Colors.black, size: 24), + Icon(Icons.keyboard_arrow_down, color: AppColors.textColor, size: 24), itemPadding: itemPadding ?? EdgeInsets.symmetric(horizontal: 16.w, vertical: 12.h), contentPadding: contentPadding ?? EdgeInsets.only(left: 16.w, right: 16.w, bottom: 16.h), leadingSpacing: leadingSpacing ?? 12.w, diff --git a/lib/widgets/family_files/family_file_add_widget.dart b/lib/widgets/family_files/family_file_add_widget.dart index 15751e93..d8b4d13e 100644 --- a/lib/widgets/family_files/family_file_add_widget.dart +++ b/lib/widgets/family_files/family_file_add_widget.dart @@ -39,7 +39,7 @@ class _FamilyFileAddWidgetState extends State { widget.message.toText16(color: AppColors.textColor, weight: FontWeight.w500), SizedBox(height: 20.h), Container( - decoration: BoxDecoration(color: Colors.white, borderRadius: BorderRadius.circular(24)), + decoration: BoxDecoration(color: AppColors.whiteColor, borderRadius: BorderRadius.circular(24)), padding: EdgeInsets.symmetric(horizontal: 16.h, vertical: 8.h), child: Column( children: [ diff --git a/lib/widgets/graph/custom_graph.dart b/lib/widgets/graph/custom_graph.dart index f1145212..d9a69a99 100644 --- a/lib/widgets/graph/custom_graph.dart +++ b/lib/widgets/graph/custom_graph.dart @@ -51,12 +51,12 @@ class CustomGraph extends StatelessWidget { final double? maxY; final double? maxX; final double? minX; - final Color spotColor; - final Color graphColor; + final Color? spotColor; + final Color? graphColor; final Color? secondaryGraphColor; // Color for secondary line - final Color graphShadowColor; - final Color graphGridColor; - final Color bottomLabelColor; + final Color? graphShadowColor; + final Color? graphGridColor; + final Color? bottomLabelColor; final double? bottomLabelSize; final FontWeight? bottomLabelFontWeight; final double? leftLabelInterval; @@ -92,12 +92,12 @@ class CustomGraph extends StatelessWidget { this.maxX, this.showBottomTitleDates = true, this.isFullScreeGraph = false, - this.spotColor = AppColors.bgGreenColor, - this.graphColor = AppColors.bgGreenColor, + this.spotColor, + this.graphColor, this.secondaryGraphColor, - this.graphShadowColor = AppColors.graphGridColor, - this.graphGridColor = AppColors.graphGridColor, - this.bottomLabelColor = AppColors.textColor, + this.graphShadowColor, + this.graphGridColor, + this.bottomLabelColor, this.bottomLabelFontWeight = FontWeight.w500, this.bottomLabelSize, this.leftLabelInterval, @@ -117,8 +117,13 @@ class CustomGraph extends StatelessWidget { @override Widget build(BuildContext context) { + final resolvedSpotColor = spotColor ?? AppColors.bgGreenColor; + final resolvedGraphColor = graphColor ?? AppColors.bgGreenColor; + final resolvedGraphShadowColor = graphShadowColor ?? AppColors.graphGridColor; + final resolvedGraphGridColor = graphGridColor ?? AppColors.graphGridColor; + return Material( - color: Colors.white, + color: AppColors.whiteColor, child: SizedBox( width: width, height: height, @@ -138,7 +143,7 @@ class CustomGraph extends StatelessWidget { // Show custom marker for touched spot with correct color per line return indicators.map((int index) { // Determine which line is being touched based on barData - Color dotColor = spotColor; + Color dotColor = resolvedSpotColor; if (secondaryDataPoints != null && barData.spots.length > 0) { // Check if this is the secondary line by comparing the first spot's color final gradient = barData.gradient; @@ -218,7 +223,7 @@ class CustomGraph extends StatelessWidget { top: BorderSide.none, ), ), - lineBarsData: _buildColoredLineSegments(dataPoints, showLinePoints), + lineBarsData: _buildColoredLineSegments(dataPoints, showLinePoints, resolvedGraphColor, resolvedGraphShadowColor), gridData: FlGridData( show: showGridLines ?? true, drawVerticalLine: false, @@ -228,7 +233,7 @@ class CustomGraph extends StatelessWidget { getDrawingHorizontalLine: getDrawingHorizontalLine ?? (value) { return FlLine( - color: graphGridColor, + color: resolvedGraphGridColor, strokeWidth: 1, dashArray: [5, 5], ); @@ -240,7 +245,7 @@ class CustomGraph extends StatelessWidget { ); } - List _buildColoredLineSegments(List dataPoints, bool showLinePoints) { + List _buildColoredLineSegments(List dataPoints, bool showLinePoints, Color resolvedGraphColor, Color resolvedGraphShadowColor) { final List allSpots = dataPoints.asMap().entries.map((entry) { double value = (makeGraphBasedOnActualValue) ? double.tryParse(entry.value.actualValue) ?? 0.0 : entry.value.value; return FlSpot(entry.key.toDouble(), value); @@ -254,7 +259,7 @@ class CustomGraph extends StatelessWidget { isStrokeJoinRound: true, barWidth: 2, gradient: LinearGradient( - colors: [graphColor, graphColor], + colors: [resolvedGraphColor, resolvedGraphColor], begin: Alignment.centerLeft, end: Alignment.centerRight, ), @@ -265,7 +270,7 @@ class CustomGraph extends StatelessWidget { cutOffY: cutOffY ?? 0, gradient: LinearGradient( colors: [ - graphShadowColor, + resolvedGraphShadowColor, Colors.white, ], begin: Alignment.topCenter, diff --git a/lib/widgets/image_picker.dart b/lib/widgets/image_picker.dart index e25b1176..eb3021f5 100644 --- a/lib/widgets/image_picker.dart +++ b/lib/widgets/image_picker.dart @@ -182,12 +182,13 @@ class _BottomSheetItem extends StatelessWidget { final Function onTap; final IconData icon; final String title; - final Color color; + final Color? color; - _BottomSheetItem({Key? key, required this.onTap, required this.title, required this.icon, this.color = AppColors.mainPurple}) : super(key: key); + _BottomSheetItem({Key? key, required this.onTap, required this.title, required this.icon, this.color}) : super(key: key); @override Widget build(BuildContext context) { + final resolvedColor = color ?? AppColors.mainPurple; return InkWell( onTap: () { if (onTap != null) { @@ -202,7 +203,7 @@ class _BottomSheetItem extends StatelessWidget { if (icon != null) Icon( icon, - color: color, + color: resolvedColor, size: 18.0, ), if (icon != null) const SizedBox(width: 24.0), diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart index aae196cf..25dd4580 100644 --- a/lib/widgets/input_widget.dart +++ b/lib/widgets/input_widget.dart @@ -133,7 +133,7 @@ class TextInputWidget extends StatelessWidget { // height: isMultiline ? null : 64.h, alignment: Alignment.center, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: Colors.white, + color: AppColors.whiteColor, borderRadius: isAllowRadius ? (12.r) : null, side: isBorderAllowed ? BorderSide(color: hasError ? errorColor : const Color(0xffefefef), width: 1) : null, ), @@ -210,7 +210,7 @@ class TextInputWidget extends StatelessWidget { borderRadius: 12.r, color: AppColors.greyColor, ), - child: Utils.buildSvgWithAssets(icon: leadingIcon!)); + child: Utils.buildSvgWithAssets(icon: leadingIcon!, applyThemeColor: false)); } Widget _buildTrailingIcon(BuildContext context, {bool isArrowTrailing = false}) { diff --git a/lib/widgets/loader/bottomsheet_loader.dart b/lib/widgets/loader/bottomsheet_loader.dart index 71b83415..bff293d0 100644 --- a/lib/widgets/loader/bottomsheet_loader.dart +++ b/lib/widgets/loader/bottomsheet_loader.dart @@ -7,6 +7,7 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; class LoaderBottomSheet { static final NavigationService _navService = GetIt.I(); @@ -27,8 +28,8 @@ class LoaderBottomSheet { builder: (_) { return Container( height: MediaQuery.of(context).size.height * 0.3, - decoration: const BoxDecoration( - color: Colors.white, + decoration: BoxDecoration( + color: AppColors.whiteColor, borderRadius: BorderRadius.vertical(top: Radius.circular(16)), ), child: Center( diff --git a/lib/widgets/map/map_utility_screen.dart b/lib/widgets/map/map_utility_screen.dart index cb3eb8ef..422809cf 100644 --- a/lib/widgets/map/map_utility_screen.dart +++ b/lib/widgets/map/map_utility_screen.dart @@ -80,7 +80,7 @@ class MapUtilityScreen extends StatelessWidget { ), Align( alignment: AlignmentDirectional.topStart, - child: Utils.buildSvgWithAssets(icon: AppAssets.closeBottomNav, width: 32.h, height: 32.h).onPress(() { + child: Utils.buildSvgWithAssets(icon: AppAssets.closeBottomNav, width: 32.h, height: 32.h, applyThemeColor: false).onPress(() { onCrossClicked?.call(); // context // .read() diff --git a/lib/widgets/nfc/nfc_reader_sheet.dart b/lib/widgets/nfc/nfc_reader_sheet.dart index b76b36fc..10228a94 100644 --- a/lib/widgets/nfc/nfc_reader_sheet.dart +++ b/lib/widgets/nfc/nfc_reader_sheet.dart @@ -18,7 +18,7 @@ void showNfcReader(BuildContext context, {required Function onNcfScan, required shape: RoundedRectangleBorder( borderRadius: BorderRadius.only(topLeft: Radius.circular(12), topRight: Radius.circular(12)), ), - backgroundColor: Colors.white, + backgroundColor: AppColors.whiteColor, builder: (context) { return NfcLayout( onNcfScan: onNcfScan, From 040ff6a80d17bdfc59508dfb56b121f689eef524 Mon Sep 17 00:00:00 2001 From: Haroon Amjad <> Date: Fri, 6 Mar 2026 15:31:10 +0300 Subject: [PATCH 21/27] Dark mode persistence added in the app --- lib/core/dependencies.dart | 2 +- .../profile_settings_view_model.dart | 18 ++++++++++++++++++ lib/main.dart | 3 +++ .../home/data/landing_page_data.dart | 4 ++-- lib/presentation/home/landing_page.dart | 6 +++--- .../home/widgets/welcome_widget.dart | 2 +- .../smartwatches/widgets/health_chart.dart | 1 + lib/widgets/datepicker_widget.dart | 1 + lib/widgets/phone_number_input.dart | 2 +- 9 files changed, 31 insertions(+), 8 deletions(-) diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index e7ac0515..4266aa3b 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -224,7 +224,7 @@ class AppDependencies { authenticationRepo: getIt(), cacheService: getIt(), navigationService: getIt(), dialogService: getIt(), appState: getIt(), errorHandlerService: getIt(), localAuthService: getIt()), ); - getIt.registerLazySingleton(() => ProfileSettingsViewModel()); + getIt.registerLazySingleton(() => ProfileSettingsViewModel(cacheService: getIt())); getIt.registerLazySingleton(() => DateRangeSelectorRangeViewModel()); diff --git a/lib/features/profile_settings/profile_settings_view_model.dart b/lib/features/profile_settings/profile_settings_view_model.dart index 2f788c69..e001d1bd 100644 --- a/lib/features/profile_settings/profile_settings_view_model.dart +++ b/lib/features/profile_settings/profile_settings_view_model.dart @@ -1,14 +1,32 @@ import 'package:flutter/foundation.dart'; +import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; class ProfileSettingsViewModel extends ChangeNotifier { + static const String _darkModeKey = 'is_dark_mode'; + + final CacheService _cacheService; + bool _isDarkMode = false; bool get isDarkMode => _isDarkMode; + ProfileSettingsViewModel({required CacheService cacheService}) + : _cacheService = cacheService; + + /// Call once at app startup (before the first frame) to restore the + /// persisted dark-mode preference. + void loadDarkMode() { + final saved = _cacheService.getBool(key: _darkModeKey); + _isDarkMode = saved ?? false; + AppColors.isDarkMode = _isDarkMode; + // No notifyListeners() here — we are called before build. + } + void toggleDarkMode(bool value) { _isDarkMode = value; AppColors.isDarkMode = value; + _cacheService.saveBool(key: _darkModeKey, value: value); notifyListeners(); } diff --git a/lib/main.dart b/lib/main.dart index 023404a6..d38c9aab 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -111,6 +111,9 @@ Future callInitializations() async { SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); HttpOverrides.global = MyHttpOverrides(); await callAppStateInitializations(); + + // Restore persisted dark-mode preference before the first frame. + getIt.get().loadDarkMode(); } void main() async { diff --git a/lib/presentation/home/data/landing_page_data.dart b/lib/presentation/home/data/landing_page_data.dart index 1fefb8ce..b74e57f3 100644 --- a/lib/presentation/home/data/landing_page_data.dart +++ b/lib/presentation/home/data/landing_page_data.dart @@ -13,8 +13,8 @@ class LandingPageData { title: LocaleKeys.emergency, subtitle: LocaleKeys.services2, backgroundColor: AppColors.primaryRedColor, - iconColor: AppColors.whiteColor, - textColor: AppColors.whiteColor, + iconColor: Colors.white, + textColor: Colors.white, isBold: true, ), ServiceCardData( diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index e8482bf0..607a47f7 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -296,9 +296,9 @@ class _LandingPageState extends State { context.navigateWithName(AppRoutes.userInfoSelection); }, padding: EdgeInsetsGeometry.zero, - backgroundColor: Color(0xFF2B353E), - borderColor: Color(0xFF2B353E), - textColor: AppColors.whiteColor, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + textColor: Colors.white, fontSize: 14.f, fontWeight: FontWeight.w600, borderRadius: 12.r, diff --git a/lib/presentation/home/widgets/welcome_widget.dart b/lib/presentation/home/widgets/welcome_widget.dart index 1bb17b5b..4ccc126a 100644 --- a/lib/presentation/home/widgets/welcome_widget.dart +++ b/lib/presentation/home/widgets/welcome_widget.dart @@ -40,7 +40,7 @@ class WelcomeWidget extends StatelessWidget { mainAxisSize: MainAxisSize.min, children: [ Flexible(child: name.toText16(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1, height: 1)), - const Icon(Icons.keyboard_arrow_down, size: 20, color: Colors.black), + Icon(Icons.keyboard_arrow_down, size: 20, color: AppColors.greyTextColor), ], ), ], diff --git a/lib/presentation/smartwatches/widgets/health_chart.dart b/lib/presentation/smartwatches/widgets/health_chart.dart index 37474133..e3c368ba 100644 --- a/lib/presentation/smartwatches/widgets/health_chart.dart +++ b/lib/presentation/smartwatches/widgets/health_chart.dart @@ -1,5 +1,6 @@ import 'package:fl_chart/fl_chart.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; class HealthChart extends StatelessWidget { final List spots; diff --git a/lib/widgets/datepicker_widget.dart b/lib/widgets/datepicker_widget.dart index 1a5444a0..e2891da4 100644 --- a/lib/widgets/datepicker_widget.dart +++ b/lib/widgets/datepicker_widget.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; class DatePickerWidget extends StatelessWidget { final String labelText; diff --git a/lib/widgets/phone_number_input.dart b/lib/widgets/phone_number_input.dart index 83ddcf16..793c8062 100644 --- a/lib/widgets/phone_number_input.dart +++ b/lib/widgets/phone_number_input.dart @@ -67,7 +67,7 @@ class _PhoneNumberInputState extends State { ) .toList(), onChanged: _onCountryCodeChanged, - icon: const Icon( + icon: Icon( Icons.keyboard_arrow_down_rounded, color: AppColors.mainPurple, ), From 8de803909605ca8550c24f77259405ccdda75fe3 Mon Sep 17 00:00:00 2001 From: Haroon Amjad <> Date: Sat, 7 Mar 2026 03:06:19 +0300 Subject: [PATCH 22/27] updates --- .../NewPatientAppKeyStore.jks | Bin 0 -> 2658 bytes android/app/src/main/AndroidManifest.xml | 8 +++++--- lib/core/api_consts.dart | 2 +- lib/core/utils/push_notification_handler.dart | 2 +- .../authentication_view_model.dart | 3 ++- .../models/patient_sickleave_response_model.dart | 2 +- .../home/widgets/large_service_card.dart | 1 + lib/services/dialog_service.dart | 5 +++-- lib/splashPage.dart | 1 + lib/widgets/buttons/custom_button.dart | 4 +++- pubspec.yaml | 2 +- 11 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 New Patient App android keystore/NewPatientAppKeyStore.jks diff --git a/New Patient App android keystore/NewPatientAppKeyStore.jks b/New Patient App android keystore/NewPatientAppKeyStore.jks new file mode 100644 index 0000000000000000000000000000000000000000..e50988ea1abefbad0bb17b540620f302d5d43851 GIT binary patch literal 2658 zcma);XE+;*8pjij7_}R#ghX4h8+#Mfp{S86fIlyD&9DLpB=~q zEGDrWf=Dd8ND|8ylEhf~UlLZwPvLi7_ zwSPu7q%;W9DL!JaVa>V@+{Jd|O>0wXocb0S7!X_xKp2t@%>3_*3@nTQBoxeojW-73 z&wzkZAg(Uks*mc?mVd=p>6DvS9ZZ2pprNA8zN3N-DCg?JPQJotyQe43{bG~eJ%;!w zI~6X$WTSJJ0vlbdWW~)ZCxsfII`0GhB8wJu40gzU^uK7w(UdX&-H{9HYV(m<4d=Z& zqEd+(CwY}CJKE22KUz2SQ2FM*QjYf}d}JASDEvh;!r>;`-0SYbnA)zTZq4Ngm)Yyh z0}cbKGNNI9bEgYJH`N+Drf>-xu}wL(3(2ON^AEF+X##G(Nn_7P%2ferkKWjpIYn&8 za&}=nSggGpxH3muQT1~ED?#t-4U@iW(*tKcVv~n=2V>H(o%_abE{H|J?bfHXQ#y-` zeIJhp&O7#SnK=mEnslKv;0Ah$I^SbynP7YrR4PY`oRRnC#wATOUs)00-ALz+13M#1t=?Z^v1|=4>`E4D&XWSBqr-#f#Jx9zS=h2G%@i~_Jj_H4%iGIkh}?a4SxT0LO*pC=opto8MvXyFZ=p0P_)+o}o7g@<4KUSwuc@~gRi5N=JExGi2 z{1cxUw&{auEw!sCQ-eEq=eU*MN4b@?ZMDqYma*LO-sOB%@cE-|xlsg0p}M}>Wx`}V zoA?o5^~4`eh$Mtf6pFqhDE4wnlY0{T+qG_FvSS=e1iJKjLetxEBOSs1q(wv9xef`U z7-^P&5-*KyXi>Zy?bQyMa!t}&j{Ch}(D)Kc?DlC%K*wcs{DYX04buQuO9BPqu(rdJ$>{U@+zKg1k&sG@u)E{Vex6Y5Zl-w*m%upsm?o8Mw`?gT`bKj} zw|&rZb8e5u!Iz;fnP!$Yvx+Z>(JD04*D~H~Ho8~dQAFkPkXZq!y_y!&_kh3dQjDiJ1^N6>Zo^3Uyym|hp&|fMlw`H0xd!3riVY5AE zW=!G750UO5`tq+DCSANChGws`V4by*dO*oq%mXL~7&x^-A?PrrqdGaGSi*HoWqzjE z8J#qV+if^DN2#tI;kpau-U~sCkXwiyfiY-^a?txKx}@Sdi%l>Fc%1wRu@My3f@NsG z!(V~UXRZ4X^XP@l5JMy|>h%)?-X?h4NP2D|ogIYmMlJNZH!_}9mnfjsLQ#hC5*1YS zmGV?6O=qXc9AaHz0;>eW>FUcuuv>Mas=?A;juY4CD*O+*sn@uWf-M4}+7Ab=F9;T< zT|<QW=ggr*Mfq-CR_wGmmX zgu_F^GHC0$V?&P!6c%uERd7e$cV3fHXL7O+v^$?2n(*?KYsM)nn^@ZbHEdi=58NHt zdT~sPDzfV9@V!e!td(HCV{EzpJz#wF-HxpYH97>CrpDJ|pofC8i*(_f)s#n6xi0%! zM~_pVIWc+4oRs+BXGHFWV^F!;ey+((Be`!wM_MUUAg>lqHMn(_+&p9cXdW5Dd<*V4 zOK~`j!>qm_R}f-aU$KOY?M8Y?VLLpkRDyN!yqQbr#nk4&;I5ajF0Ot zK`(B)k#+irFZ2T_+8%{TlRQ_h;%@Ra0>rJXm)$WXlWY>@V4dH9@am62b_?2l)7_`} zvn0^mwS-TL==}-1xmr!?@N=t)?|HDHX6%onp8FbET^Z9A6Ah6uUKTEe`UydP4bFo} zH`j#dydwri;xabq-O04k$mECsK@0GSs?XLan>Akd*$T=!w`QJkr?#-F$F<68NcD5H z{tVU89#XJ(dNXbM#Fj-VRFK{5%RQP6!cV>RsRCqKdc&?X-08I6V$c|7cyT5>F^u(3 zmJa*+q}TPMI$`Vbi_1gN81L*+zar_GX2HkRh$%*0+Vv{ z5_Km&zXi?x)qu)r>ta7&eEi$|FdQSyT{9joAEa}UYiNylzniJRE7+Ab|KZy?A8?&| zzV%wljU`y~9~a!Lv&`Gf&=yePK=)F|_+vWc&^6@XeI~ literal 0 HcmV?d00001 diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 7267f0ac..0e77b6b6 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -49,7 +49,7 @@ - + @@ -62,7 +62,6 @@ - + = 33) { - // await FlutterCallkitIncoming.requestFullIntentPermission(); + await FlutterCallkitIncoming.requestFullIntentPermission(); } } } diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart index fe025f93..6fc36191 100644 --- a/lib/features/authentication/authentication_view_model.dart +++ b/lib/features/authentication/authentication_view_model.dart @@ -1033,7 +1033,8 @@ class AuthenticationViewModel extends ChangeNotifier { label: LocaleKeys.notice.tr(), onOkPressed: () { _dialogService.showPhoneNumberPickerSheet( - label: "Where would you like to receive OTP?", + // label: "Where would you like to receive OTP?", + label: LocaleKeys.receiveOtpToast.tr(), message: "Please select from the below options to receive OTP.", onSMSPress: () { checkUserAuthentication(otpTypeEnum: OTPTypeEnum.sms); diff --git a/lib/features/medical_file/models/patient_sickleave_response_model.dart b/lib/features/medical_file/models/patient_sickleave_response_model.dart index 53c886f6..601bb598 100644 --- a/lib/features/medical_file/models/patient_sickleave_response_model.dart +++ b/lib/features/medical_file/models/patient_sickleave_response_model.dart @@ -122,7 +122,7 @@ class PatientSickLeavesResponseModel { patientName = json['PatientName']; projectName = json['ProjectName']; qR = json['QR']; - speciality = json['Speciality'].cast(); + // speciality = json['Speciality'].cast(); startDate = json['StartDate']; status = json['Status']; strRequestDate = json['StrRequestDate']; diff --git a/lib/presentation/home/widgets/large_service_card.dart b/lib/presentation/home/widgets/large_service_card.dart index e65eb1d8..7c86dd09 100644 --- a/lib/presentation/home/widgets/large_service_card.dart +++ b/lib/presentation/home/widgets/large_service_card.dart @@ -82,6 +82,7 @@ class LargeServiceCard extends StatelessWidget { icon: serviceCardData.icon, iconColor: serviceCardData.iconColor, fit: BoxFit.contain, + applyThemeColor: false, ), ), ), diff --git a/lib/services/dialog_service.dart b/lib/services/dialog_service.dart index 6347a389..c4dfb7c4 100644 --- a/lib/services/dialog_service.dart +++ b/lib/services/dialog_service.dart @@ -306,7 +306,7 @@ Widget showPhoneNumberPickerWidget({required BuildContext context, String? messa onPressed: onSMSPress, backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedBorderColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, icon: AppAssets.message, ), ), @@ -325,11 +325,12 @@ Widget showPhoneNumberPickerWidget({required BuildContext context, String? messa child: CustomButton( text: LocaleKeys.sendOTPWHATSAPP.tr(context: context), onPressed: onWhatsappPress, - backgroundColor: Colors.white, + backgroundColor: AppColors.whiteColor, borderColor: AppColors.borderOnlyColor, textColor: AppColors.textColor, icon: AppAssets.whatsapp, iconColor: null, + applyThemeColor: false, ), ), ], diff --git a/lib/splashPage.dart b/lib/splashPage.dart index dc7a7c98..64518f30 100644 --- a/lib/splashPage.dart +++ b/lib/splashPage.dart @@ -101,6 +101,7 @@ class _SplashScreenState extends State { print('Call Canceled : ------->'); try { + FlutterCallkitIncoming.unsilenceEvents(); FlutterCallkitIncoming.onEvent.listen((event) async { switch (event!.event) { case Event.actionCallIncoming: diff --git a/lib/widgets/buttons/custom_button.dart b/lib/widgets/buttons/custom_button.dart index 8500ce8e..de3b598a 100644 --- a/lib/widgets/buttons/custom_button.dart +++ b/lib/widgets/buttons/custom_button.dart @@ -25,6 +25,7 @@ class CustomButton extends StatelessWidget { final double? iconSize; final TextOverflow? textOverflow; final BorderSide? borderSide; + final bool applyThemeColor; const CustomButton({ super.key, @@ -47,6 +48,7 @@ class CustomButton extends StatelessWidget { this.iconSize, this.textOverflow, this.borderSide, + this.applyThemeColor = true, }); @override @@ -76,7 +78,7 @@ class CustomButton extends StatelessWidget { if (icon != null) Padding( padding: text.isNotEmpty ? EdgeInsets.only(right: 4.w, left: 4.w) : EdgeInsets.zero, - child: Utils.buildSvgWithAssets(icon: icon!, iconColor: iconColor, isDisabled: isDisabled, width: iconS, height: iconS), + child: Utils.buildSvgWithAssets(icon: icon!, iconColor: iconColor, isDisabled: isDisabled, width: iconS, height: iconS, applyThemeColor: applyThemeColor), ), if (text.isNotEmpty) Text( diff --git a/pubspec.yaml b/pubspec.yaml index c4b1e51a..43969000 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: hmg_patient_app_new description: "New HMG Patient App" publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 0.0.1+4 +version: 0.0.11+8 environment: sdk: ">=3.6.0 <4.0.0" From fdeeed10d686bbb040cdf357862aed1bb876e978 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Sun, 8 Mar 2026 15:09:19 +0300 Subject: [PATCH 23/27] updates --- .../book_appointments_view_model.dart | 3 + .../region_list_widget.dart | 60 ++++++++++++++++--- .../book_appointment/widgets/doctor_card.dart | 55 ++++++++++++++--- 3 files changed, 104 insertions(+), 14 deletions(-) diff --git a/lib/features/book_appointments/book_appointments_view_model.dart b/lib/features/book_appointments/book_appointments_view_model.dart index 3132dc8c..4dd103b8 100644 --- a/lib/features/book_appointments/book_appointments_view_model.dart +++ b/lib/features/book_appointments/book_appointments_view_model.dart @@ -692,6 +692,9 @@ class BookAppointmentsViewModel extends ChangeNotifier { result.fold( (failure) async { print(failure); + if (onError != null) { + onError(failure.message); + } }, (apiResponse) { if (apiResponse.messageStatus == 2) { diff --git a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart index fad96965..489ee8b7 100644 --- a/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart +++ b/lib/presentation/appointments/widgets/region_bottomsheet/region_list_widget.dart @@ -1,14 +1,21 @@ import 'dart:async'; +import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart' show Utils; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/appointment_via_region_viewmodel.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/appointments/widgets/region_bottomsheet/region_list_item.dart' show RegionListItem; import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:lottie/lottie.dart'; import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; import '../../../../widgets/common_bottom_sheet.dart'; @@ -31,13 +38,52 @@ class _RegionBottomSheetBodyState extends State { } else if (regionalViewModel.regionBottomSheetType == RegionBottomSheetType.FOR_CLINIIC) { myAppointmentsViewModel.getMappedDoctors(onError: (err) { Navigator.pop(context); - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getErrorWidget(loadingText: err), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); + if (myAppointmentsViewModel.selectedClinic.clinicID == 23) { + showCommonBottomSheetWithoutHeight( + context, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Lottie.asset(AppAnimations.errorAnimation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill), + SizedBox(height: 8.h), + ("For booking appointments in the Physiotherapy clinic, please contact: 920066666").toText16(color: AppColors.blackColor), + SizedBox(height: 16.h), + CustomButton( + height: 40.h, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + text: LocaleKeys.callNow.tr(), + textColor: AppColors.whiteColor, + iconColor: AppColors.whiteColor, + onPressed: () { + launchUrl( + Uri.parse("tel://920066666"), + ); + }, + icon: AppAssets.call), + ], + ).center, + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } else { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + // showCommonBottomSheetWithoutHeight( + // context, + // child: Utils.getErrorWidget(loadingText: err), + // callBackFunc: () {}, + // isFullScreen: false, + // isCloseButtonVisible: true, + // ); }); } }); diff --git a/lib/presentation/book_appointment/widgets/doctor_card.dart b/lib/presentation/book_appointment/widgets/doctor_card.dart index 9e3c69d1..6eecf5f8 100644 --- a/lib/presentation/book_appointment/widgets/doctor_card.dart +++ b/lib/presentation/book_appointment/widgets/doctor_card.dart @@ -15,6 +15,8 @@ import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:lottie/lottie.dart'; +import 'package:url_launcher/url_launcher.dart'; class DoctorCard extends StatelessWidget { const DoctorCard({ @@ -198,13 +200,52 @@ class DoctorCard extends StatelessWidget { }, onError: (err) { LoaderBottomSheet.hideLoader(); - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getErrorWidget(loadingText: err), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); + if (bookAppointmentsViewModel.selectedClinic.clinicID == 23) { + showCommonBottomSheetWithoutHeight( + context, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Lottie.asset(AppAnimations.errorAnimation, repeat: true, reverse: false, frameRate: FrameRate(60), width: 100.h, height: 100.h, fit: BoxFit.fill), + SizedBox(height: 8.h), + ("For booking appointments in the Physiotherapy clinic, please contact: 920066666").toText16(color: AppColors.blackColor), + SizedBox(height: 16.h), + CustomButton( + height: 40.h, + backgroundColor: AppColors.primaryRedColor, + borderColor: AppColors.primaryRedColor, + text: LocaleKeys.callNow.tr(), + textColor: AppColors.whiteColor, + iconColor: AppColors.whiteColor, + onPressed: () { + launchUrl( + Uri.parse("tel://920066666"), + ); + }, + icon: AppAssets.call), + ], + ).center, + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } else { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + // showCommonBottomSheetWithoutHeight( + // context, + // child: Utils.getErrorWidget(loadingText: err), + // callBackFunc: () {}, + // isFullScreen: false, + // isCloseButtonVisible: true, + // ); }); }, backgroundColor: Color(0xffFEE9EA), From 6e71aa7f13a516054ba399a6ee6b8e0e63fe2a7c Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 9 Mar 2026 12:39:05 +0300 Subject: [PATCH 24/27] updates & fixes --- lib/core/api/api_client.dart | 2 +- lib/features/lab/lab_view_model.dart | 5 ++++- .../widgets/ask_doctor_request_type_select.dart | 1 + .../widgets/ask_doctor_appointment_card.dart | 13 ++++++++++++- lib/presentation/authentication/login.dart | 6 ++++-- lib/widgets/bottomsheet/exception_bottom_sheet.dart | 2 +- 6 files changed, 23 insertions(+), 6 deletions(-) diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 106b8fd4..b17db626 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -195,7 +195,7 @@ class ApiClientImp implements ApiClient { } // body['TokenID'] = "@dm!n"; - // body['PatientID'] = 4772997; + // body['PatientID'] = 4773715; // body['PatientTypeID'] = 1; // body['PatientOutSA'] = 0; // body['SessionID'] = "45786230487560q"; diff --git a/lib/features/lab/lab_view_model.dart b/lib/features/lab/lab_view_model.dart index cd062b9e..07cbbde3 100644 --- a/lib/features/lab/lab_view_model.dart +++ b/lib/features/lab/lab_view_model.dart @@ -527,7 +527,10 @@ class LabViewModel extends ChangeNotifier { rangeEnd = 100.0; break; default: - throw ArgumentError('Invalid flag: $flag'); + rangeStart = 40.0; + rangeEnd = 59.0; + break; + // throw ArgumentError('Invalid flag: $flag'); } // Clamp input value to 0-100 and map it to the range bounds diff --git a/lib/presentation/appointments/widgets/ask_doctor_request_type_select.dart b/lib/presentation/appointments/widgets/ask_doctor_request_type_select.dart index 376c27a9..3002c1c9 100644 --- a/lib/presentation/appointments/widgets/ask_doctor_request_type_select.dart +++ b/lib/presentation/appointments/widgets/ask_doctor_request_type_select.dart @@ -5,6 +5,7 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/ask_doctor/models/ask_doctor_appointments_list.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/ask_doctor_request_type_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; diff --git a/lib/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart b/lib/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart index e4185e72..d58b75e9 100644 --- a/lib/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart +++ b/lib/presentation/ask_doctor/widgets/ask_doctor_appointment_card.dart @@ -171,7 +171,18 @@ class AskDoctorAppointmentCard extends StatelessWidget { child: AskDoctorRequestTypeSelect( askDoctorRequestTypeList: myAppointmentsViewModel.askDoctorRequestTypeList, myAppointmentsViewModel: myAppointmentsViewModel, - patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel() + patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel( + appointmentNo: askDoctorAppointmentHistoryList.appointmentNo, + doctorID: askDoctorAppointmentHistoryList.doctorID!, + doctorName: askDoctorAppointmentHistoryList.doctorName!, + doctorTitle: askDoctorAppointmentHistoryList.doctorTitle!, + doctorImageURL: askDoctorAppointmentHistoryList.doctorImageURL!, + clinicID: askDoctorAppointmentHistoryList.clinicID!, + clinicName: askDoctorAppointmentHistoryList.clinicName!, + projectID: askDoctorAppointmentHistoryList.projectID!, + projectName: askDoctorAppointmentHistoryList.projectName!, + appointmentDate: askDoctorAppointmentHistoryList.appointmentDate!, + ), // myAppointmentsVM.patientAppointmentsHistoryList[index], ), callBackFunc: () {}, diff --git a/lib/presentation/authentication/login.dart b/lib/presentation/authentication/login.dart index 9f64bde4..28b47304 100644 --- a/lib/presentation/authentication/login.dart +++ b/lib/presentation/authentication/login.dart @@ -188,7 +188,8 @@ class LoginScreenState extends State { }, backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedBorderColor, - textColor: AppColors.whiteColor, + textColor: Colors.white, + iconColor: Colors.white, icon: AppAssets.message, ), ), @@ -219,9 +220,10 @@ class LoginScreenState extends State { }, backgroundColor: Colors.white, borderColor: AppColors.borderOnlyColor, - textColor: AppColors.textColor, + textColor: AppColors.whiteColor, icon: AppAssets.whatsapp, iconColor: null, + applyThemeColor: false, ), ), ], diff --git a/lib/widgets/bottomsheet/exception_bottom_sheet.dart b/lib/widgets/bottomsheet/exception_bottom_sheet.dart index 16531bdb..ea5f8d83 100644 --- a/lib/widgets/bottomsheet/exception_bottom_sheet.dart +++ b/lib/widgets/bottomsheet/exception_bottom_sheet.dart @@ -47,7 +47,7 @@ class _ExceptionBottomSheetState extends State { child: Container( padding: EdgeInsets.all(24.h), decoration: BoxDecoration( - color: Color(0xFFF8F8FA), + color: AppColors.whiteColor, borderRadius: const BorderRadius.vertical(top: Radius.circular(16)), ), child: Column( From 5b04a5a3eaf277a298e094f448c9c7d7c5b25c5f Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Mon, 9 Mar 2026 13:08:59 +0300 Subject: [PATCH 25/27] lab test description update --- lib/presentation/lab/lab_result_via_clinic/LabResultList.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/presentation/lab/lab_result_via_clinic/LabResultList.dart b/lib/presentation/lab/lab_result_via_clinic/LabResultList.dart index 6caa4a59..07b9fb65 100644 --- a/lib/presentation/lab/lab_result_via_clinic/LabResultList.dart +++ b/lib/presentation/lab/lab_result_via_clinic/LabResultList.dart @@ -27,7 +27,7 @@ class LabResultList extends StatelessWidget { shrinkWrap: true,itemCount: list.length,itemBuilder: (____, index) { var labItem = list[index]; return LabOrderResultItem(onTap: () { - model.getPatientLabResult(model.currentlySelectedPatientOrder!, labItem.description ?? "", labItem.packageShortDescription!, labItem.uOM ?? ""); + model.getPatientLabResult(model.currentlySelectedPatientOrder!, labItem.description ?? "", labItem.testShortDescription!, labItem.uOM ?? ""); }, tests: labItem, index: index, From 29447cc9faf122a08b070589d2f5c0e61a4b2cf1 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Tue, 10 Mar 2026 15:33:38 +0300 Subject: [PATCH 26/27] updates --- lib/core/api/api_client.dart | 2 +- .../blood_donation/widgets/hospital_selection.dart | 2 +- lib/features/my_invoices/my_invoices_view_model.dart | 2 +- lib/presentation/authentication/login.dart | 8 ++++---- lib/presentation/authentication/saved_login_screen.dart | 5 +++-- .../book_appointment/review_appointment_page.dart | 2 +- lib/presentation/contact_us/live_chat_page.dart | 2 +- .../emergency_services/widgets/nearestERItem.dart | 4 ++-- lib/presentation/lab/lab_order_by_test.dart | 2 +- lib/presentation/lab/lab_orders_page.dart | 2 +- lib/presentation/lab/lab_results/lab_result_details.dart | 4 ++-- .../lab/lab_results/lab_result_list_item.dart | 2 +- lib/widgets/countdown_timer.dart | 4 ++-- lib/widgets/date_range_selector/date_range_calender.dart | 6 +++--- lib/widgets/datepicker_widget.dart | 4 ++-- lib/widgets/nfc/nfc_reader_sheet.dart | 6 +++--- lib/widgets/phone_number_input.dart | 2 +- 17 files changed, 30 insertions(+), 29 deletions(-) diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index b17db626..192f6a4a 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -195,7 +195,7 @@ class ApiClientImp implements ApiClient { } // body['TokenID'] = "@dm!n"; - // body['PatientID'] = 4773715; + // body['PatientID'] = 2007395; // body['PatientTypeID'] = 1; // body['PatientOutSA'] = 0; // body['SessionID'] = "45786230487560q"; diff --git a/lib/features/blood_donation/widgets/hospital_selection.dart b/lib/features/blood_donation/widgets/hospital_selection.dart index 9889410c..f49b42d6 100644 --- a/lib/features/blood_donation/widgets/hospital_selection.dart +++ b/lib/features/blood_donation/widgets/hospital_selection.dart @@ -75,7 +75,7 @@ class HospitalBottomSheetBodySelection extends StatelessWidget { children: [ Utils.buildSvgWithAssets(icon: AppAssets.hmg).paddingOnly(right: 10), Expanded( - child: Text(hospital.projectName ?? "", style: TextStyle(fontWeight: FontWeight.w600, fontSize: 16, color: AppColors.blackColor)), + child: Text(hospital.projectName ?? "", style: TextStyle(fontWeight: FontWeight.w600, fontSize: 16.f, color: AppColors.blackColor)), ) ], ); diff --git a/lib/features/my_invoices/my_invoices_view_model.dart b/lib/features/my_invoices/my_invoices_view_model.dart index a02d741d..20d7869f 100644 --- a/lib/features/my_invoices/my_invoices_view_model.dart +++ b/lib/features/my_invoices/my_invoices_view_model.dart @@ -43,7 +43,7 @@ class MyInvoicesViewModel extends ChangeNotifier { } else if (apiResponse.messageStatus == 1) { allInvoicesList = apiResponse.data!; isInvoicesListLoading = false; - + allInvoicesList.sort((a, b) => b.appointmentDate!.compareTo(a.appointmentDate!)); notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); diff --git a/lib/presentation/authentication/login.dart b/lib/presentation/authentication/login.dart index 28b47304..d68e933c 100644 --- a/lib/presentation/authentication/login.dart +++ b/lib/presentation/authentication/login.dart @@ -116,7 +116,7 @@ class LoginScreenState extends State { child: RichText( textAlign: TextAlign.center, text: TextSpan( - style: context.dynamicTextStyle(color: Colors.black, fontSize: 14.f, height: 26 / 16, fontWeight: FontWeight.w500), + style: context.dynamicTextStyle(color: AppColors.textColor, fontSize: 14.f, height: 26 / 16, fontWeight: FontWeight.w500), children: [ TextSpan(text: LocaleKeys.dontHaveAccount.tr(context: context), style: context.dynamicTextStyle()), TextSpan(text: " "), @@ -218,9 +218,9 @@ class LoginScreenState extends State { await authViewModel.checkUserAuthentication(otpTypeEnum: OTPTypeEnum.whatsapp); } }, - backgroundColor: Colors.white, - borderColor: AppColors.borderOnlyColor, - textColor: AppColors.whiteColor, + backgroundColor: AppColors.whiteColor, + borderColor: AppColors.textColor, + textColor: AppColors.textColor, icon: AppAssets.whatsapp, iconColor: null, applyThemeColor: false, diff --git a/lib/presentation/authentication/saved_login_screen.dart b/lib/presentation/authentication/saved_login_screen.dart index 231d7d14..98cbc37d 100644 --- a/lib/presentation/authentication/saved_login_screen.dart +++ b/lib/presentation/authentication/saved_login_screen.dart @@ -251,10 +251,11 @@ class _SavedLogin extends State { } }, backgroundColor: AppColors.whiteColor, - borderColor: Color(0xFF2E3039), - textColor: Color(0xFF2E3039), + borderColor: AppColors.textColor, + textColor: AppColors.textColor, borderWidth: 2.w, padding: EdgeInsets.fromLTRB(0, 14.h, 0, 14.h), + applyThemeColor: false, ), const Spacer(flex: 2), // OR divider diff --git a/lib/presentation/book_appointment/review_appointment_page.dart b/lib/presentation/book_appointment/review_appointment_page.dart index d75ab8be..794b821b 100644 --- a/lib/presentation/book_appointment/review_appointment_page.dart +++ b/lib/presentation/book_appointment/review_appointment_page.dart @@ -226,7 +226,7 @@ class _ReviewAppointmentPageState extends State { backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedColor, textColor: Colors.white, - fontSize: 16, + fontSize: 16.f, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), diff --git a/lib/presentation/contact_us/live_chat_page.dart b/lib/presentation/contact_us/live_chat_page.dart index 5d09a64f..0350c316 100644 --- a/lib/presentation/contact_us/live_chat_page.dart +++ b/lib/presentation/contact_us/live_chat_page.dart @@ -236,7 +236,7 @@ class LiveChatPage extends StatelessWidget { backgroundColor: contactUsVM.selectedLiveChatProjectIndex == -1 ? AppColors.greyColor : AppColors.primaryRedColor, borderColor: contactUsVM.selectedLiveChatProjectIndex == -1 ? AppColors.greyColor : AppColors.primaryRedColor, textColor: Colors.white, - fontSize: 16, + fontSize: 16.f, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), diff --git a/lib/presentation/emergency_services/widgets/nearestERItem.dart b/lib/presentation/emergency_services/widgets/nearestERItem.dart index fae19a0a..0c4a5a6a 100644 --- a/lib/presentation/emergency_services/widgets/nearestERItem.dart +++ b/lib/presentation/emergency_services/widgets/nearestERItem.dart @@ -90,7 +90,7 @@ class NearestERItem extends StatelessWidget { Expanded( child: CustomButton( text: LocaleKeys.viewLocationGoogleMaps.tr(context: context), - iconSize: 18.h, + iconSize: 16.h, icon: AppAssets.location, onPressed: () { context.read().openDirections(destLat: double.parse(nearestERItem.latitude??"0.0"), destLng: double.parse(nearestERItem.longitude??"0.0") ); @@ -100,7 +100,7 @@ class NearestERItem extends StatelessWidget { textColor: AppColors.primaryRedColor, iconColor: AppColors.primaryRedColor, height: 40.h, - fontSize: 14, + fontSize: 14.f, fontWeight: FontWeight.w500, ).toShimmer2(isShow: isLoading), ), diff --git a/lib/presentation/lab/lab_order_by_test.dart b/lib/presentation/lab/lab_order_by_test.dart index 2e4a96b6..1b5db920 100644 --- a/lib/presentation/lab/lab_order_by_test.dart +++ b/lib/presentation/lab/lab_order_by_test.dart @@ -66,7 +66,7 @@ class LabOrderByTest extends StatelessWidget { backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, textColor: AppColors.primaryRedColor, - fontSize: 14, + fontSize: 14.f, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), diff --git a/lib/presentation/lab/lab_orders_page.dart b/lib/presentation/lab/lab_orders_page.dart index 0bcbc364..15461659 100644 --- a/lib/presentation/lab/lab_orders_page.dart +++ b/lib/presentation/lab/lab_orders_page.dart @@ -1 +1 @@ -import 'dart:async'; import 'dart:convert'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_toolbar.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import 'alphabeticScroll.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; @override void initState() { scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return CollapsingListView( title: LocaleKeys.labResults.tr(context: context), search: () async { if (labProvider.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: labProvider.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; labProvider.filterLabReports(value); } } }, child: Consumer( builder: (context, labViewModel, child) { return SingleChildScrollView( physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.all(24.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, LocaleKeys.byVisit.tr()), CustomTabBarModel(null, LocaleKeys.byTest.tr()), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), ), ], ), if (activeIndex == 0) Padding( padding: EdgeInsets.symmetric(vertical: 10.h), child: Row( children: [ CustomButton( text: LocaleKeys.byClinic.tr(context: context), onPressed: () { labViewModel.setIsSortByClinic(true); }, backgroundColor: labViewModel.isSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, borderColor: labViewModel.isSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withValues(alpha: 0.2), textColor: labViewModel.isSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), SizedBox(width: 8.h), CustomButton( text: LocaleKeys.byHospital.tr(context: context), onPressed: () { labViewModel.setIsSortByClinic(false); }, backgroundColor: labViewModel.isSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, borderColor: labViewModel.isSortByClinic ? AppColors.textColor.withValues(alpha: 0.2) : AppColors.primaryRedColor, textColor: labViewModel.isSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ], ), ), SizedBox(height: 8.h), selectedFilterText!.isNotEmpty ? Column( children: [ AppCustomChipWidget( labelText: selectedFilterText!, backgroundColor: AppColors.alertColor, textColor: AppColors.whiteColor, deleteIcon: AppAssets.close_bottom_sheet_icon, deleteIconColor: AppColors.whiteColor, deleteIconHasColor: true, onDeleteTap: () { selectedFilterText = ""; labProvider.filterLabReports(""); }, ), SizedBox(height: 8.h), ], ) : SizedBox(), activeIndex == 0 ? // By Visit - show grouped view when available labViewModel.isLabOrdersLoading ? ListView.builder( shrinkWrap: true, physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: 5, itemBuilder: (context, index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ), ) : (labViewModel.patientLabOrdersViewList.isNotEmpty ? ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: labViewModel.patientLabOrdersViewList.length, itemBuilder: (context, index) { final group = labViewModel.patientLabOrdersViewList[index]; final isExpanded = expandedIndex == index; return AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: AnimatedContainer( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, margin: EdgeInsets.symmetric(vertical: 8.h), decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), child: InkWell( onTap: () { setState(() { expandedIndex = isExpanded ? null : index; }); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.all(16.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ AppCustomChipWidget(labelText: "${group.length} ${LocaleKeys.results.tr(context: context)}"), Icon(isExpanded ? Icons.expand_less : Icons.expand_more), ], ), SizedBox(height: 8.h), Text( labViewModel.isSortByClinic ? (group.first.clinicDescription ?? 'Unknown') : (group.first.projectName ?? 'Unknown'), style: TextStyle(fontSize: 16.h, fontWeight: FontWeight.w600), overflow: TextOverflow.ellipsis, ), ], ), ), AnimatedSwitcher( duration: Duration(milliseconds: 500), switchInCurve: Curves.easeIn, switchOutCurve: Curves.easeOut, transitionBuilder: (Widget child, Animation animation) { return FadeTransition( opacity: animation, child: SizeTransition( sizeFactor: animation, axisAlignment: 0.0, child: child, ), ); }, child: isExpanded ? Container( key: ValueKey(index), padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 0.h), child: ListView.separated( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (cxt, index) { PatientLabOrdersResponseModel order = group[index]; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisSize: MainAxisSize.min, children: [ Image.network( order.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", width: 24.w, height: 24.h, fit: BoxFit.cover, ).circle(100), SizedBox(width: 8.h), Expanded(child: (order.doctorName ?? order.doctorNameEnglish ?? "").toString().toText14(weight: FontWeight.w500)), ], ), SizedBox(height: 8.h), Wrap( direction: Axis.horizontal, spacing: 4.h, runSpacing: 4.h, children: [ AppCustomChipWidget( labelText: ("${LocaleKeys.orderNo.tr(context: context)}: ${order.orderNo!}"), ), AppCustomChipWidget( labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), ), AppCustomChipWidget( labelText: labViewModel.isSortByClinic ? (order.projectName ?? "") : (order.clinicDescription ?? ""), ), ], ), // Row( // children: [ // CustomButton( // text: ("Order No: ".needTranslation + order.orderNo!), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // SizedBox(width: 8.h), // CustomButton( // text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // ], // ), // SizedBox(height: 8.h), // Row( // children: [ // CustomButton( // text: model.isSortByClinic ? (order.clinicDescription ?? "") : (order.projectName ?? ""), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // ], // ), SizedBox(height: 12.h), Row( children: [ Expanded(flex: 2, child: SizedBox()), // Expanded( // flex: 1, // child: Container( // height: 40.h, // width: 40.w, // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( // color: AppColors.textColor, // borderRadius: 12, // ), // child: Padding( // padding: EdgeInsets.all(12.h), // child: Transform.flip( // flipX: _appState.isArabic(), // child: Utils.buildSvgWithAssets( // icon: AppAssets.forward_arrow_icon_small, // iconColor: AppColors.whiteColor, // fit: BoxFit.contain, // ), // ), // ), // ).onPress(() { // model.currentlySelectedPatientOrder = order; // labProvider.getPatientLabResultByHospital(order); // labProvider.getPatientSpecialResult(order); // Navigator.of(context).push( // CustomPageRoute(page: LabResultByClinic(labOrder: order)), // ); // }), // ) Expanded( flex: 2, child: CustomButton( icon: AppAssets.view_report_icon, iconColor: AppColors.primaryRedColor, iconSize: 16.h, text: LocaleKeys.viewResults.tr(context: context), onPressed: () { labViewModel.currentlySelectedPatientOrder = order; labProvider.getPatientLabResultByHospital(order); labProvider.getPatientSpecialResult(order); Navigator.of(context).push( CustomPageRoute(page: LabResultByClinic(labOrder: order)), ); }, backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, textColor: AppColors.primaryRedColor, fontSize: 14, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ) ], ), // SizedBox(height: 12.h), // Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), // SizedBox(height: 12.h), ], ).paddingOnly(top: 16, bottom: 16); }, separatorBuilder: (cxt, index) => Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), itemCount: group.length)) : SizedBox.shrink(), ), ], ), ), ), ), )); }, ) : Utils.getNoDataWidget(context, noDataText: LocaleKeys.noLabResults.tr(context: context))) : // By Test or other tabs keep existing behavior (labViewModel.isLabOrdersLoading) ? Column( children: List.generate( 5, (index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, )), ) : AlphabeticScroll( alpahbetsAvailable: labViewModel.indexedCharacterForUniqueTest, details: labViewModel.uniqueTestsList, labViewModel: labViewModel, rangeViewModel: rangeViewModel, appState: _appState, ) ], )); }, ), ); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file +import 'dart:async'; import 'dart:convert'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_toolbar.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import 'alphabeticScroll.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; @override void initState() { scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return CollapsingListView( title: LocaleKeys.labResults.tr(context: context), search: () async { if (labProvider.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: labProvider.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; labProvider.filterLabReports(value); } } }, child: Consumer( builder: (context, labViewModel, child) { return SingleChildScrollView( physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.all(24.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ Expanded( child: CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, LocaleKeys.byVisit.tr()), CustomTabBarModel(null, LocaleKeys.byTest.tr()), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), ), ], ), if (activeIndex == 0) Padding( padding: EdgeInsets.symmetric(vertical: 10.h), child: Row( children: [ CustomButton( text: LocaleKeys.byClinic.tr(context: context), onPressed: () { labViewModel.setIsSortByClinic(true); }, backgroundColor: labViewModel.isSortByClinic ? AppColors.bgRedLightColor : AppColors.whiteColor, borderColor: labViewModel.isSortByClinic ? AppColors.primaryRedColor : AppColors.textColor.withValues(alpha: 0.2), textColor: labViewModel.isSortByClinic ? AppColors.primaryRedColor : AppColors.blackColor, fontSize: 12.f, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), SizedBox(width: 8.h), CustomButton( text: LocaleKeys.byHospital.tr(context: context), onPressed: () { labViewModel.setIsSortByClinic(false); }, backgroundColor: labViewModel.isSortByClinic ? AppColors.whiteColor : AppColors.bgRedLightColor, borderColor: labViewModel.isSortByClinic ? AppColors.textColor.withValues(alpha: 0.2) : AppColors.primaryRedColor, textColor: labViewModel.isSortByClinic ? AppColors.blackColor : AppColors.primaryRedColor, fontSize: 12, fontWeight: FontWeight.w500, borderRadius: 10, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ], ), ), SizedBox(height: 8.h), selectedFilterText!.isNotEmpty ? Column( children: [ AppCustomChipWidget( labelText: selectedFilterText!, backgroundColor: AppColors.alertColor, textColor: AppColors.whiteColor, deleteIcon: AppAssets.close_bottom_sheet_icon, deleteIconColor: AppColors.whiteColor, deleteIconHasColor: true, onDeleteTap: () { selectedFilterText = ""; labProvider.filterLabReports(""); }, ), SizedBox(height: 8.h), ], ) : SizedBox(), activeIndex == 0 ? // By Visit - show grouped view when available labViewModel.isLabOrdersLoading ? ListView.builder( shrinkWrap: true, physics: AlwaysScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: 5, itemBuilder: (context, index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ), ) : (labViewModel.patientLabOrdersViewList.isNotEmpty ? ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: labViewModel.patientLabOrdersViewList.length, itemBuilder: (context, index) { final group = labViewModel.patientLabOrdersViewList[index]; final isExpanded = expandedIndex == index; return AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: AnimatedContainer( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, margin: EdgeInsets.symmetric(vertical: 8.h), decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), child: InkWell( onTap: () { setState(() { expandedIndex = isExpanded ? null : index; }); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: EdgeInsets.all(16.h), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ AppCustomChipWidget(labelText: "${group.length} ${LocaleKeys.results.tr(context: context)}"), Icon(isExpanded ? Icons.expand_less : Icons.expand_more), ], ), SizedBox(height: 8.h), Text( labViewModel.isSortByClinic ? (group.first.clinicDescription ?? 'Unknown') : (group.first.projectName ?? 'Unknown'), style: TextStyle(fontSize: 16.h, fontWeight: FontWeight.w600), overflow: TextOverflow.ellipsis, ), ], ), ), AnimatedSwitcher( duration: Duration(milliseconds: 500), switchInCurve: Curves.easeIn, switchOutCurve: Curves.easeOut, transitionBuilder: (Widget child, Animation animation) { return FadeTransition( opacity: animation, child: SizeTransition( sizeFactor: animation, axisAlignment: 0.0, child: child, ), ); }, child: isExpanded ? Container( key: ValueKey(index), padding: EdgeInsets.symmetric(horizontal: 16.w, vertical: 0.h), child: ListView.separated( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemBuilder: (cxt, index) { PatientLabOrdersResponseModel order = group[index]; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( mainAxisSize: MainAxisSize.min, children: [ Image.network( order.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", width: 24.w, height: 24.h, fit: BoxFit.cover, ).circle(100), SizedBox(width: 8.h), Expanded(child: (order.doctorName ?? order.doctorNameEnglish ?? "").toString().toText14(weight: FontWeight.w500)), ], ), SizedBox(height: 8.h), Wrap( direction: Axis.horizontal, spacing: 4.h, runSpacing: 4.h, children: [ AppCustomChipWidget( labelText: ("${LocaleKeys.orderNo.tr(context: context)}: ${order.orderNo!}"), ), AppCustomChipWidget( labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), ), AppCustomChipWidget( labelText: labViewModel.isSortByClinic ? (order.projectName ?? "") : (order.clinicDescription ?? ""), ), ], ), // Row( // children: [ // CustomButton( // text: ("Order No: ".needTranslation + order.orderNo!), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // SizedBox(width: 8.h), // CustomButton( // text: DateUtil.formatDateToDate(DateUtil.convertStringToDate(order.orderDate ?? ""), false), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // ], // ), // SizedBox(height: 8.h), // Row( // children: [ // CustomButton( // text: model.isSortByClinic ? (order.clinicDescription ?? "") : (order.projectName ?? ""), // onPressed: () {}, // backgroundColor: AppColors.greyColor, // borderColor: AppColors.greyColor, // textColor: AppColors.blackColor, // fontSize: 10, // fontWeight: FontWeight.w500, // borderRadius: 8, // padding: EdgeInsets.fromLTRB(10, 0, 10, 0), // height: 24.h, // ), // ], // ), SizedBox(height: 12.h), Row( children: [ Expanded(flex: 2, child: SizedBox()), // Expanded( // flex: 1, // child: Container( // height: 40.h, // width: 40.w, // decoration: RoundedRectangleBorder().toSmoothCornerDecoration( // color: AppColors.textColor, // borderRadius: 12, // ), // child: Padding( // padding: EdgeInsets.all(12.h), // child: Transform.flip( // flipX: _appState.isArabic(), // child: Utils.buildSvgWithAssets( // icon: AppAssets.forward_arrow_icon_small, // iconColor: AppColors.whiteColor, // fit: BoxFit.contain, // ), // ), // ), // ).onPress(() { // model.currentlySelectedPatientOrder = order; // labProvider.getPatientLabResultByHospital(order); // labProvider.getPatientSpecialResult(order); // Navigator.of(context).push( // CustomPageRoute(page: LabResultByClinic(labOrder: order)), // ); // }), // ) Expanded( flex: 2, child: CustomButton( icon: AppAssets.view_report_icon, iconColor: AppColors.primaryRedColor, iconSize: 16.h, text: LocaleKeys.viewResults.tr(context: context), onPressed: () { labViewModel.currentlySelectedPatientOrder = order; labProvider.getPatientLabResultByHospital(order); labProvider.getPatientSpecialResult(order); Navigator.of(context).push( CustomPageRoute(page: LabResultByClinic(labOrder: order)), ); }, backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, textColor: AppColors.primaryRedColor, fontSize: 14, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, ), ) ], ), // SizedBox(height: 12.h), // Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), // SizedBox(height: 12.h), ], ).paddingOnly(top: 16, bottom: 16); }, separatorBuilder: (cxt, index) => Divider(color: AppColors.borderOnlyColor.withValues(alpha: 0.05), height: 1.h), itemCount: group.length)) : SizedBox.shrink(), ), ], ), ), ), ), )); }, ) : Utils.getNoDataWidget(context, noDataText: LocaleKeys.noLabResults.tr(context: context))) : // By Test or other tabs keep existing behavior (labViewModel.isLabOrdersLoading) ? Column( children: List.generate( 5, (index) => LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, )), ) : AlphabeticScroll( alpahbetsAvailable: labViewModel.indexedCharacterForUniqueTest, details: labViewModel.uniqueTestsList, labViewModel: labViewModel, rangeViewModel: rangeViewModel, appState: _appState, ) ], )); }, ), ); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file diff --git a/lib/presentation/lab/lab_results/lab_result_details.dart b/lib/presentation/lab/lab_results/lab_result_details.dart index cab20aed..cff9764e 100644 --- a/lib/presentation/lab/lab_results/lab_result_details.dart +++ b/lib/presentation/lab/lab_results/lab_result_details.dart @@ -166,7 +166,7 @@ class LabResultDetails extends StatelessWidget { : (labmodel.filteredGraphValues.length < 3) ? (labmodel.filteredGraphValues.length * 64) + 80.h : 260.h, - padding: EdgeInsets.all(16.h), + padding: EdgeInsets.all(14.h), child: Column( mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ @@ -177,7 +177,7 @@ class LabResultDetails extends StatelessWidget { Text( labmodel.isGraphVisible ? LocaleKeys.historyFlowchart.tr(context: context) : LocaleKeys.history.tr(context: context), style: TextStyle( - fontSize: 16, + fontSize: 16.f, fontFamily: 'Poppins', fontWeight: FontWeight.w600, color: AppColors.textColor, diff --git a/lib/presentation/lab/lab_results/lab_result_list_item.dart b/lib/presentation/lab/lab_results/lab_result_list_item.dart index 6ccf7509..f2dc90e4 100644 --- a/lib/presentation/lab/lab_results/lab_result_list_item.dart +++ b/lib/presentation/lab/lab_results/lab_result_list_item.dart @@ -42,7 +42,7 @@ class LabHistoryItem extends StatelessWidget{ ), Transform.flip( flipY: shouldRotateIcon, - child: Utils.buildSvgWithAssets(icon: assetUrl,height: 18, width: 18) + child: Utils.buildSvgWithAssets(icon: assetUrl, height: 18, width: 18) ), ], ); diff --git a/lib/widgets/countdown_timer.dart b/lib/widgets/countdown_timer.dart index 7f8304e6..86249fc8 100644 --- a/lib/widgets/countdown_timer.dart +++ b/lib/widgets/countdown_timer.dart @@ -101,13 +101,13 @@ Widget buildLabel(String label) { } Widget buildTimeSeparator() { - return const Padding( + return Padding( padding: EdgeInsets.symmetric(horizontal: 2.0), child: Text( ":", style: TextStyle( color: Colors.black, - fontSize: 20, + fontSize: 20.f, ), ), ); diff --git a/lib/widgets/date_range_selector/date_range_calender.dart b/lib/widgets/date_range_selector/date_range_calender.dart index 0f6c9b99..d6e2eadf 100644 --- a/lib/widgets/date_range_selector/date_range_calender.dart +++ b/lib/widgets/date_range_selector/date_range_calender.dart @@ -74,7 +74,7 @@ class _DateRangeSelectorState extends State { LocaleKeys.to.tr(context: context), style: TextStyle( color: AppColors.calenderTextColor, - fontSize: 14.h, + fontSize: 14.f, fontWeight: FontWeight.w500, letterSpacing: -.2 ), @@ -247,7 +247,7 @@ class _DateRangeSelectorState extends State { label, style: TextStyle( color: AppColors.inputLabelTextColor, - fontSize: 12.h, + fontSize: 12.f, fontWeight: FontWeight.w500, ), ), @@ -255,7 +255,7 @@ class _DateRangeSelectorState extends State { date!, style: TextStyle( color: AppColors.textColor, - fontSize: 14.h, + fontSize: 14.f, fontWeight: FontWeight.w500, ), ) diff --git a/lib/widgets/datepicker_widget.dart b/lib/widgets/datepicker_widget.dart index e2891da4..f9d8ff73 100644 --- a/lib/widgets/datepicker_widget.dart +++ b/lib/widgets/datepicker_widget.dart @@ -53,7 +53,7 @@ class DatePickerWidget extends StatelessWidget { return Text( labelText, style: const TextStyle( - fontSize: 12, + fontSize: 12.f, fontWeight: FontWeight.w500, color: Color(0xff898A8D), letterSpacing: -0.2, @@ -99,7 +99,7 @@ class DatePickerWidget extends StatelessWidget { textAlign: TextAlign.left, textDirection: TextDirection.ltr, style: TextStyle( - fontSize: 14, + fontSize: 14.f, height: 21 / 14, fontWeight: FontWeight.w500, color: (selectedValue != null && selectedValue!.isNotEmpty) ? const Color(0xff2E3039) : const Color(0xffB0B0B0), diff --git a/lib/widgets/nfc/nfc_reader_sheet.dart b/lib/widgets/nfc/nfc_reader_sheet.dart index 10228a94..956f758b 100644 --- a/lib/widgets/nfc/nfc_reader_sheet.dart +++ b/lib/widgets/nfc/nfc_reader_sheet.dart @@ -87,7 +87,7 @@ class _NfcLayoutState extends State { "Ready To Scan", style: TextStyle( fontWeight: FontWeight.bold, - fontSize: 24, + fontSize: 24.f, ), ), SizedBox( @@ -103,7 +103,7 @@ class _NfcLayoutState extends State { Text( "Approach an NFC Tag", style: TextStyle( - fontSize: 18, + fontSize: 18.f, ), ), SizedBox( @@ -125,7 +125,7 @@ class _NfcLayoutState extends State { backgroundColor: AppColors.primaryRedColor, borderColor: AppColors.primaryRedColor, textColor: AppColors.whiteColor, - fontSize: 14, + fontSize: 14.f, fontWeight: FontWeight.w500, borderRadius: 12.h, height: 40.h, diff --git a/lib/widgets/phone_number_input.dart b/lib/widgets/phone_number_input.dart index 793c8062..6ea07141 100644 --- a/lib/widgets/phone_number_input.dart +++ b/lib/widgets/phone_number_input.dart @@ -100,7 +100,7 @@ class _PhoneNumberInputState extends State { ), ), style: const TextStyle( - fontSize: 18, + fontSize: 18.f, fontWeight: FontWeight.bold, letterSpacing: 2, color: Colors.black, From 47b50e35a1a3a29f8d45c8c82e7f88f30ab56f31 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Wed, 11 Mar 2026 16:02:17 +0300 Subject: [PATCH 27/27] updates --- assets/images/svg/download.svg | 5 +- lib/core/api/api_client.dart | 20 +-- lib/features/radiology/radiology_repo.dart | 8 +- .../appointments/my_doctors_page.dart | 9 ++ .../book_appointment/doctor_profile_page.dart | 2 +- .../LabResultByClinic.dart | 148 ++++++++++-------- .../lab/lab_results/lab_result_details.dart | 124 +++++++++++---- lib/widgets/appbar/collapsing_list_view.dart | 6 + 8 files changed, 211 insertions(+), 111 deletions(-) diff --git a/assets/images/svg/download.svg b/assets/images/svg/download.svg index 37aef2bd..7bedc456 100644 --- a/assets/images/svg/download.svg +++ b/assets/images/svg/download.svg @@ -1,4 +1,3 @@ - - + + diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 192f6a4a..921e274b 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -195,7 +195,7 @@ class ApiClientImp implements ApiClient { } // body['TokenID'] = "@dm!n"; - // body['PatientID'] = 2007395; + // body['PatientID'] = 809289; // body['PatientTypeID'] = 1; // body['PatientOutSA'] = 0; // body['SessionID'] = "45786230487560q"; @@ -301,14 +301,16 @@ class ApiClientImp implements ApiClient { } else if (parsed['MessageStatus'] == 1 || parsed['SMSLoginRequired'] == true) { onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); - } else if (parsed['IsAuthenticated'] == false) { - onFailure( - "User is not Authenticated", - statusCode, - failureType: - UnAuthenticatedUserFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'] ?? "User is not Authenticated", url: url), - ); - } else if (parsed['MessageStatus'] == 2 && parsed['IsAuthenticated']) { + } + // else if (parsed['IsAuthenticated'] == false) { + // onFailure( + // "User is not Authenticated", + // statusCode, + // failureType: + // UnAuthenticatedUserFailure(parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage'] ?? "User is not Authenticated", url: url), + // ); + // } + else if (parsed['MessageStatus'] == 2 && parsed['IsAuthenticated']) { if (parsed['SameClinicApptList'] != null) { onSuccess(parsed, statusCode, messageStatus: parsed['MessageStatus'], errorMessage: parsed['ErrorEndUserMessage'] ?? parsed['ErrorMessage']); diff --git a/lib/features/radiology/radiology_repo.dart b/lib/features/radiology/radiology_repo.dart index 5847718d..3ad4e54f 100644 --- a/lib/features/radiology/radiology_repo.dart +++ b/lib/features/radiology/radiology_repo.dart @@ -188,14 +188,16 @@ class RadiologyRepoImp implements RadiologyRepo { failure = failureType; }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { - final radOrders; + List radOrders = []; try { if (response['FinalRadiologyList'] != null && response['FinalRadiologyList'].length != 0) { final list = response['FinalRadiologyList']; radOrders = list.map((item) => PatientRadiologyResponseModel.fromJson(item as Map)).toList().cast(); } else { - final list = response['FinalRadiologyListAPI']; - radOrders = list.map((item) => PatientRadiologyResponseModel.fromJson(item as Map)).toList().cast(); + if (response['FinalRadiologyListAPI'] != null && response['FinalRadiologyListAPI'].length != 0) { + final list = response['FinalRadiologyListAPI']; + radOrders = list.map((item) => PatientRadiologyResponseModel.fromJson(item as Map)).toList().cast(); + } } apiResponse = GenericApiModel>( diff --git a/lib/presentation/appointments/my_doctors_page.dart b/lib/presentation/appointments/my_doctors_page.dart index fc7798f8..d1ea0e98 100644 --- a/lib/presentation/appointments/my_doctors_page.dart +++ b/lib/presentation/appointments/my_doctors_page.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; @@ -34,6 +36,13 @@ class _MyDoctorsPageState extends State { int? expandedIndex; final Map _groupKeys = {}; + @override + void initState() { + scheduleMicrotask(() { + myAppointmentsViewModel.getPatientMyDoctors(); + }); + super.initState(); + } @override Widget build(BuildContext context) { diff --git a/lib/presentation/book_appointment/doctor_profile_page.dart b/lib/presentation/book_appointment/doctor_profile_page.dart index 4b2d4dbb..549b8b0d 100644 --- a/lib/presentation/book_appointment/doctor_profile_page.dart +++ b/lib/presentation/book_appointment/doctor_profile_page.dart @@ -41,7 +41,7 @@ class DoctorProfilePage extends StatelessWidget { child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - SizedBox(height: 24.h), + // SizedBox(height: 24.h), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ diff --git a/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart b/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart index eed1eedb..af6c97f8 100644 --- a/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart +++ b/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart @@ -41,21 +41,54 @@ class LabResultByClinic extends StatelessWidget { Expanded( child: CollapsingListView( title: LocaleKeys.labResults.tr(), - aiOverview: () async { - final _dialogService = getIt.get(); - await _dialogService.showCommonBottomSheetWithoutH( - message: LocaleKeys.aiDisclaimer.tr(), - label: LocaleKeys.consent.tr(), - okLabel: LocaleKeys.acceptLbl.tr(), - cancelLabel: LocaleKeys.rejectView.tr(), - onOkPressed: () { - context.pop(); - labViewModel.getAiOverviewLabOrders(labOrder: labOrder, loadingText: LocaleKeys.loadingAIAnalysis.tr(context: context)); - }, - onCancelPressed: () { - context.pop(); - }); + downloadReport: () async { + LoaderBottomSheet.showLoader(loadingText: LocaleKeys.generatingReport.tr(context: context)); + await labViewModel + .getLabResultReportPDF( + labOrder: labOrder, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }) + .then((val) async { + LoaderBottomSheet.hideLoader(); + if (labViewModel.patientLabResultReportPDFBase64.isNotEmpty) { + String path = await Utils.createFileFromString(labViewModel.patientLabResultReportPDFBase64, "pdf"); + try { + OpenFilex.open(path); + } catch (ex) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Cannot open file"), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + } + }); }, + // aiOverview: () async { + // final _dialogService = getIt.get(); + // await _dialogService.showCommonBottomSheetWithoutH( + // message: LocaleKeys.aiDisclaimer.tr(), + // label: LocaleKeys.consent.tr(), + // okLabel: LocaleKeys.acceptLbl.tr(), + // cancelLabel: LocaleKeys.rejectView.tr(), + // onOkPressed: () { + // context.pop(); + // labViewModel.getAiOverviewLabOrders(labOrder: labOrder, loadingText: LocaleKeys.loadingAIAnalysis.tr(context: context)); + // }, + // onCancelPressed: () { + // context.pop(); + // }); + // }, child: SingleChildScrollView( child: Column( spacing: 8.h, @@ -109,53 +142,46 @@ class LabResultByClinic extends StatelessWidget { borderRadius: 24.h, hasShadow: true, ), - child: CustomButton( - text: LocaleKeys.downloadReport.tr(context: context), - onPressed: () async { - LoaderBottomSheet.showLoader(loadingText: LocaleKeys.generatingReport.tr(context: context)); - await labViewModel - .getLabResultReportPDF( - labOrder: labOrder, - onError: (err) { - LoaderBottomSheet.hideLoader(); - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getErrorWidget(loadingText: err), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); - }) - .then((val) async { - LoaderBottomSheet.hideLoader(); - if (labViewModel.patientLabResultReportPDFBase64.isNotEmpty) { - String path = await Utils.createFileFromString(labViewModel.patientLabResultReportPDFBase64, "pdf"); - try { - OpenFilex.open(path); - } catch (ex) { - showCommonBottomSheetWithoutHeight( - context, - child: Utils.getErrorWidget(loadingText: "Cannot open file"), - callBackFunc: () {}, - isFullScreen: false, - isCloseButtonVisible: true, - ); - } - } - }); - }, - backgroundColor: AppColors.successColor, - borderColor: AppColors.successColor, - textColor: Colors.white, - fontSize: 16.f, - fontWeight: FontWeight.w500, - borderRadius: 12, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 45.h, - icon: AppAssets.download, - iconColor: Colors.white, - iconSize: 20.h, - ).paddingSymmetrical(24.h, 24.h), + child: Container( + height: 56.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12.r), + gradient: LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + stops: [0.236, 1.0], // 53.6% and 100% + colors: [ + Color(0xFF8A38F5), // Transparent + Color(0xFFE20BBB), // Solid #F8F8F8 + ], + ), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(right: 4.w, left: 4.w), + child: Utils.buildSvgWithAssets(icon: AppAssets.aiOverView, width: 16.h, height: 16.h, iconColor: Colors.white), + ), + LocaleKeys.generateAiAnalysis.tr(context: context).toText16(isBold: true) + ], + ), + ).paddingSymmetrical(24.h, 24.h).onPress(() async { + final _dialogService = getIt.get(); + await _dialogService.showCommonBottomSheetWithoutH( + message: LocaleKeys.aiDisclaimer.tr(), + label: LocaleKeys.consent.tr(), + okLabel: LocaleKeys.acceptLbl.tr(), + cancelLabel: LocaleKeys.rejectView.tr(), + onOkPressed: () { + context.pop(); + labViewModel.getAiOverviewLabOrders(labOrder: labOrder, loadingText: LocaleKeys.loadingAIAnalysis.tr(context: context)); + }, + onCancelPressed: () { + context.pop(); + }); + }), ), ], ), diff --git a/lib/presentation/lab/lab_results/lab_result_details.dart b/lib/presentation/lab/lab_results/lab_result_details.dart index cff9764e..d2c1b524 100644 --- a/lib/presentation/lab/lab_results/lab_result_details.dart +++ b/lib/presentation/lab/lab_results/lab_result_details.dart @@ -34,41 +34,97 @@ class LabResultDetails extends StatelessWidget { Widget build(BuildContext context) { LabViewModel labViewModel = Provider.of(context, listen: false); final appState = getIt.get(); - return CollapsingListView( - title: LocaleKeys.labResultDetails.tr(context: context), - aiOverview: () async { - final _dialogService = getIt.get(); - await _dialogService.showCommonBottomSheetWithoutH( - message: LocaleKeys.aiDisclaimer.tr(), - label: LocaleKeys.consent.tr(), - okLabel: LocaleKeys.acceptLbl.tr(), - cancelLabel: LocaleKeys.rejectView.tr(), - onOkPressed: () { - context.pop(); - labViewModel.getAiOverviewSingleLabResult(langId: appState.getLanguageID().toString(), recentLabResult: recentLabResult, loadingText: LocaleKeys.loadingAIAnalysis.tr(context: context)); - }, - onCancelPressed: () { - context.pop(); - }); - }, - child: SingleChildScrollView( - child: Column( - spacing: 16.h, - children: [ - LabNameAndStatus(context), - getLabDescription(context), - LabGraph(context), - Selector( - selector: (_, model) => model.labOrderResponseByAi, - builder: (_, aiData, __) { - if (aiData != null) { - return AiAnalysisWidget(data: aiData).paddingOnly(bottom: 16.h); - } - return const SizedBox.shrink(); - }, + return Scaffold( + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: LocaleKeys.labResultDetails.tr(context: context), + // aiOverview: () async { + // final _dialogService = getIt.get(); + // await _dialogService.showCommonBottomSheetWithoutH( + // message: LocaleKeys.aiDisclaimer.tr(), + // label: LocaleKeys.consent.tr(), + // okLabel: LocaleKeys.acceptLbl.tr(), + // cancelLabel: LocaleKeys.rejectView.tr(), + // onOkPressed: () { + // context.pop(); + // labViewModel.getAiOverviewSingleLabResult(langId: appState.getLanguageID().toString(), recentLabResult: recentLabResult, loadingText: LocaleKeys.loadingAIAnalysis.tr(context: context)); + // }, + // onCancelPressed: () { + // context.pop(); + // }); + // }, + child: SingleChildScrollView( + child: Column( + spacing: 16.h, + children: [ + LabNameAndStatus(context), + getLabDescription(context), + LabGraph(context), + Selector( + selector: (_, model) => model.labOrderResponseByAi, + builder: (_, aiData, __) { + if (aiData != null) { + return AiAnalysisWidget(data: aiData).paddingOnly(bottom: 16.h); + } + return const SizedBox.shrink(); + }, + ), + ], + ).paddingAll(24.h), + ), ), - ], - ).paddingAll(24.h), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: Container( + height: 56.h, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12.r), + gradient: LinearGradient( + begin: Alignment.centerLeft, + end: Alignment.centerRight, + stops: [0.236, 1.0], // 53.6% and 100% + colors: [ + Color(0xFF8A38F5), // Transparent + Color(0xFFE20BBB), // Solid #F8F8F8 + ], + ), + ), + child: Row( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: EdgeInsets.only(right: 4.w, left: 4.w), + child: Utils.buildSvgWithAssets(icon: AppAssets.aiOverView, width: 16.h, height: 16.h, iconColor: Colors.white), + ), + LocaleKeys.generateAiAnalysis.tr(context: context).toText16(isBold: true) + ], + ), + ).paddingSymmetrical(24.h, 24.h).onPress(() async { + final _dialogService = getIt.get(); + await _dialogService.showCommonBottomSheetWithoutH( + message: LocaleKeys.aiDisclaimer.tr(), + label: LocaleKeys.consent.tr(), + okLabel: LocaleKeys.acceptLbl.tr(), + cancelLabel: LocaleKeys.rejectView.tr(), + onOkPressed: () { + context.pop(); + labViewModel.getAiOverviewSingleLabResult( + langId: appState.getLanguageID().toString(), recentLabResult: recentLabResult, loadingText: LocaleKeys.loadingAIAnalysis.tr(context: context)); + }, + onCancelPressed: () { + context.pop(); + }); + }), + ), + ], ), ); } diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart index 25221962..0c32d87d 100644 --- a/lib/widgets/appbar/collapsing_list_view.dart +++ b/lib/widgets/appbar/collapsing_list_view.dart @@ -25,6 +25,7 @@ class CollapsingListView extends StatelessWidget { VoidCallback? requests; VoidCallback? sendEmail; VoidCallback? doctorResponse; + VoidCallback? downloadReport; Widget? bottomChild; Widget? trailing; bool isClose; @@ -47,6 +48,7 @@ class CollapsingListView extends StatelessWidget { this.requests, this.sendEmail, this.doctorResponse, + this.downloadReport, this.isLeading = true, this.trailing, this.leadingCallback, @@ -89,6 +91,7 @@ class CollapsingListView extends StatelessWidget { requests: requests, sendEmail: sendEmail, doctorResponse: doctorResponse, + downloadReport: downloadReport, bottomChild: bottomChild, trailing: trailing, aiOverview: aiOverview, @@ -200,6 +203,7 @@ class ScrollAnimatedTitle extends StatefulWidget implements PreferredSizeWidget VoidCallback? requests; VoidCallback? sendEmail; VoidCallback? doctorResponse; + VoidCallback? downloadReport; Widget? bottomChild; Widget? trailing; @@ -217,6 +221,7 @@ class ScrollAnimatedTitle extends StatefulWidget implements PreferredSizeWidget this.requests, this.sendEmail, this.doctorResponse, + this.downloadReport, this.bottomChild, this.trailing, }); @@ -295,6 +300,7 @@ class _ScrollAnimatedTitleState extends State { if (widget.doctorResponse != null) actionButton(context, t, title: LocaleKeys.doctorResponses.tr(context: context), icon: AppAssets.doctorResponseIcon).onPress(widget.doctorResponse!), if (widget.search != null) Utils.buildSvgWithAssets(icon: AppAssets.search_icon).onPress(widget.search!), if (widget.aiOverview != null) actionButton(context, t, title: LocaleKeys.aiOverView.tr(context: context), icon: AppAssets.aiOverView, isAiButton: true).onPress(widget.aiOverview!), + if (widget.downloadReport != null) actionButton(context, t, title: LocaleKeys.downloadReport.tr(context: context), icon: AppAssets.download).onPress(widget.downloadReport!), if (widget.trailing != null) widget.trailing!, ] ],

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 z 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