From 2952fd56ab8981e217c2d57ddb04cf12f92349ff Mon Sep 17 00:00:00 2001 From: Mohammad Aljammal Date: Thu, 24 Sep 2020 12:21:50 +0300 Subject: [PATCH] Done Active Medications Service --- android/app/src/main/AndroidManifest.xml | 12 +- .../diplomaticquarterapp/MainActivity.kt | 41 +- .../app/src/main/res/drawable/app_icon.png | Bin 0 -> 1912 bytes android/app/src/main/res/drawable/food.png | Bin 0 -> 1789 bytes android/app/src/main/res/drawable/me.png | Bin 0 -> 1021 bytes .../main/res/drawable/sample_large_icon.png | Bin 0 -> 180 bytes .../src/main/res/drawable/secondary_icon.png | Bin 0 -> 1073 bytes android/app/src/main/res/raw/keep.xml | 3 + .../src/main/res/raw/slow_spring_board.mp3 | Bin 0 -> 37616 bytes ios/Runner.xcodeproj/project.pbxproj | 618 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - .../xcshareddata/xcschemes/Runner.xcscheme | 91 --- .../contents.xcworkspacedata | 10 - .../xcshareddata/IDEWorkspaceChecks.plist | 8 - .../xcshareddata/WorkspaceSettings.xcsettings | 8 - ios/Runner/AppDelegate.swift | 13 - ios/Runner/Info.plist | 2 + ios/Runner/Runner-Bridging-Header.h | 1 - lib/config/config.dart | 3 + .../ActivePrescriptionReport.dart | 146 +++++ .../medical/ActiveMedicationsService.dart | 27 + .../medical/ActiveMedicationsViewModel.dart | 28 + lib/locator.dart | 4 + lib/pages/landing/landing_page.dart | 70 +- lib/pages/login/login.dart | 3 +- .../ActiveMedicationsPage.dart | 129 ++++ .../active_medications/reminder_page.dart | 263 ++++++++ lib/pages/medical/medical_profile_page.dart | 5 +- lib/uitl/CalendarUtils.dart | 77 +++ lib/uitl/LocalNotification.dart | 97 +++ lib/uitl/utils.dart | 7 + pubspec.yaml | 4 + 34 files changed, 907 insertions(+), 786 deletions(-) create mode 100644 android/app/src/main/res/drawable/app_icon.png create mode 100644 android/app/src/main/res/drawable/food.png create mode 100644 android/app/src/main/res/drawable/me.png create mode 100644 android/app/src/main/res/drawable/sample_large_icon.png create mode 100644 android/app/src/main/res/drawable/secondary_icon.png create mode 100644 android/app/src/main/res/raw/keep.xml create mode 100644 android/app/src/main/res/raw/slow_spring_board.mp3 delete mode 100644 ios/Runner.xcodeproj/project.pbxproj delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme delete mode 100644 ios/Runner.xcworkspace/contents.xcworkspacedata delete mode 100644 ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist delete mode 100644 ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings delete mode 100644 ios/Runner/AppDelegate.swift delete mode 100644 ios/Runner/Runner-Bridging-Header.h create mode 100644 lib/core/model/active_medications/ActivePrescriptionReport.dart create mode 100644 lib/core/service/medical/ActiveMedicationsService.dart create mode 100644 lib/core/viewModels/medical/ActiveMedicationsViewModel.dart create mode 100644 lib/pages/medical/active_medications/ActiveMedicationsPage.dart create mode 100644 lib/pages/medical/active_medications/reminder_page.dart create mode 100644 lib/uitl/CalendarUtils.dart create mode 100644 lib/uitl/LocalNotification.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 884c7e09..f1a5a3f8 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -15,7 +15,8 @@ - + + + + + + + + + + + diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/MainActivity.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/MainActivity.kt index b8a87c8c..35ce314d 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/MainActivity.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/MainActivity.kt @@ -1,11 +1,36 @@ package com.cloud.diplomaticquarterapp -import androidx.annotation.NonNull; - import io.flutter.embedding.android.FlutterFragmentActivity - import io.flutter.embedding.engine.FlutterEngine - import io.flutter.plugins.GeneratedPluginRegistrant +import android.content.ContentResolver +import android.content.Context +import android.media.RingtoneManager +import io.flutter.embedding.android.FlutterActivity +import io.flutter.embedding.engine.FlutterEngine +import io.flutter.plugin.common.MethodCall +import io.flutter.plugin.common.MethodChannel +import io.flutter.plugins.GeneratedPluginRegistrant -class MainActivity: FlutterFragmentActivity() { - override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) { - GeneratedPluginRegistrant.registerWith(flutterEngine); - } +class MainActivity : FlutterActivity() { + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { + GeneratedPluginRegistrant.registerWith(flutterEngine) + MethodChannel(flutterEngine.dartExecutor, "crossingthestreams.io/resourceResolver").setMethodCallHandler { call: MethodCall, result: MethodChannel.Result -> + if ("drawableToUri" == call.method) { + val resourceId = this@MainActivity.resources.getIdentifier(call.arguments as String, "drawable", this@MainActivity.packageName) + result.success(resourceToUriString(this@MainActivity.applicationContext, resourceId)) + } + if ("getAlarmUri" == call.method) { + result.success(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM).toString()) + } + } + } + + companion object { + private fun resourceToUriString(context: Context, resId: Int): String { + return (ContentResolver.SCHEME_ANDROID_RESOURCE + + "://" + + context.resources.getResourcePackageName(resId) + + "/" + + context.resources.getResourceTypeName(resId) + + "/" + + context.resources.getResourceEntryName(resId)) + } + } } \ No newline at end of file diff --git a/android/app/src/main/res/drawable/app_icon.png b/android/app/src/main/res/drawable/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..c4cc798d7408b624d2be0ae7a5276c50aa9ee25b GIT binary patch literal 1912 zcmZuydpy(YAK!l1W(Xk)uQQXE>+HKNm7Q&}VU|mCZC>=t7@BNjn_TKtTb<&_QG_9v za*NZHNRlI3p)E^Fox2p^WQO;u^iA1@81^!ersIJd!T6xfn_Y4t$Kw1VW1A_`LnJ58rb|6E@ z@bSh+@;Hu67B3>oF_{yuM1w$tWV~|Ai4rmq$(%T@0G~`menjAvdzBlFM0|t@4-=6L zA3B1<<3}N!9CtVZND>@@KoIz>XuQ9h$LDb6iHJNT6vpGx=%l11$0VF1j~|1^I6FI| z0W2DeMJW*|K?+yMOh$19mYp!Alepkw{gczsBc2Iq`oL z;tD>qQu0G5Gvm=1M*#i*f`shozuWtdDAmoUu#c=h6(cC6!BhBAOd*dS$m7M4Tvgg3 zXdGrtlz$YHl|n%OH{$P3396L%eSCJ5lB{fL77{H~OEn{peMSOM)va z{rONNxUFL^5d_lkpt-pQGBm%J>^l_ZZq{`I_s8fu&A+fP4GxEs3t!g2YTRdQrd(ky zw5!ItRjG|eGmFJ;X-&zEi~a+`9FE%hWq-|`MyK*mrd1j1MwFk;-tl0TJJNOnw|-o) zRLM)q>797U`gLx$XqTd>|9u~CVwVE6{>OGJN{+B{Z)$Du(2kp&N1RS|qN77MB{w{1 zskY@Yy4`MMk?hR4kXOD?SZ6wV>2-)-&}$b$N<;oelbgwx;*>e-Nw4V^`6{rHZ#t3x zVnBNEz{OEq$nq#QKh()5Qu40CIQ_jZiW9eI>vl;C78cN$iY-6>5c+G;n%h&WZ@NsT zLd?arM=uMJIPi`K=N>)(XFx`Cvm(saK-Tl6y8*NHrm3fGg*IlW^*$YL;Y5MndtG8_ zQt6$u-RE}kDSGb~2{#bJocAl|Vf7HAnGmgG&xj`?Z3MJi8V){JDLVty=AhoOWou%Z zMq?>(7c$6`8~~fEdw1=DYW%1_;Cg=+CL91bqNRT*o^Wcmbhbr>tqfLl+(nG981EnA zGhb-+{G!1QBlQ92E4`$9(!;5u?1+Hsv9cRBy-yGdxJ%yqJ-8BT$}xB`>X0_sK^|Ks z_0`>~cr=-bfnMqMg0HPNBn@{L$nJiflGya->cHC&Vx+l2o$fj76qE298oiAOA!Z^W zxgb2-@`?II*6_r}77;c$I=St|b<8;Q*af9nI)0`;Y>}Cv$K#0hM2ha=I{9e=aZQ|1 z4WOJ}w49Hyvsx(6K0^5!GEsa`z9u({?CTCu>wxT43#S8F*{?l1V59qiO5=v4?$t?O z%%FK()z52sT&O3xHesA~q{seQ)j4j)#R^{rUrXO!4fkr@CHSqged%cnE%htmWPcBJ znCul>Y%$3@lO9SR$<7{s_pVi-Q+(9nEnR>f?0*3C58Ew6!KE_Pbo)46k;UlIs|PLw zi60wkQzQoZJx6f$iQStIWzuhLj$e{5TFl5?FZpEbE`oJZO-lN8U|kDp;Le;72o<}# zN!`lgH;+l+r^HZ1?Vh2Y-(I@=GPW_9IPD|fl1{;qp5}W2*~`n5cba9xep_R`*i=N2 zJ^rvLb1}gqE#{t-C|#JhFOi!Y`1V3=jn36(xHRYF?Mn>3_Dr1HzD$kwjpmgeV6=hTos;d(ga)Ca!Ukfl3^NGDEM!n?5Y9#ifTss*Qb4vn4(> z#iNa4Tf^IF`RYAc$0v_<+`Sod{~JYoKo+puTko2*-DTIkyr)pGd}(4dsjh7mV_4;6 zV>D&<)6|>#xzv#Ya)PD*4^7U+hQGIEA5~*kH98VlV>Tj$L|gs4WhOg%bFFS{*)r?$ zmU&H+_aDqIdXUWoo6Dpy&KI3#C}(NFV#D+H-b`eF47I~pl(bROCR{|4%^)Mo>Zra7 z7JUH=(k(1T&>GmU!8`EtT)YksE+~cVi~l8>W1T8 z^l4FH*_#-WZSe5#e%t~ugl^Ue0prgM7VGM}VISXk>S7pZJ!(3hN3yz8H|}jowZ8K1 zYiMdaVA^bRDMjDodTWO442NUK)2keVd{O0f;oy0AJN3F@WdWs>KVSC?VS!mt0-olD zovc~VWOa(q;&?o`KDcsT!Mz{72+3jF%@gD3B-7~k7@&GI1?;HQLj z4D?8=C-$ewe|*Jy-jwT4UzydDa8Fsfdn}9xZIw$w=H{~ATenR~jLMm2j{P=qUVZEk ba&_LNsHUcTP+UHw`VMLCzHW8oaPhwYY>_fz literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/food.png b/android/app/src/main/res/drawable/food.png new file mode 100644 index 0000000000000000000000000000000000000000..41b394d380a0ca9d6ebaa45c2ddb64d1ba7be0c2 GIT binary patch literal 1789 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D29ilcK~!i%?O4rk zR8GSuy@0>U9y?N7?7Kn-SOHSs@IrpA>&b{ZJd+)Pa zXrYA`T4>=xAzPeV*+1=V94NW_`faxax&x{TkuO2FccA3Gwfm~yCf$~YHMyC0I)=(V zdHzQEHA6G+l3xhDw!3b?cK5@%SvcoMDLWldQqH#hC3j?C%6&o1EQpRF=R9fc@ZD7+ zLI6YMElmT+mA8^_hT(JmQ~f2c7tYkw*^!^B{`k)||L89@f8u7%KXof0@|00Gaw(k;Y;VWt8UG0}+Z5^_XjDWDz}X&kI>zV9pOH@kXAUWG#W)TcyHfQ}L>yK+2^lFV zXIu8sK(HE9ebY0~iTPBhfAG21vFq=3B6J2~PDlBilO>---?aBCbD9GWU-10nH|mZZ zyQBn-GClSqHPm6_knQ<9rUD`#)iKrBhka>-woD%cvD=<`R)&i~{UafO z>qdw@a3t<@ou`hx!sNW9%_yAJSv-uq)>NRg+s;({&6BhK`^V!%Sr>FYXv4Pb!@g=q zgFrzjZolfUkYPipe@d%|ofjFv_xuxWpgeSE$ty66Jsg0kpm}}ZvdkQ2n2vw&ZKLB! zVwYc1&hRD@9tV zTq=DuF>7qnHpk$8Fah9%7B|vT=$@!7Yh|YJc6(>RCy^Ji0gU`bV|usYsoIDCX^t$1 zXmjvf5WplV9mmAv{V8rV1b{MsM^u*8)>-&a18B?SH;LE)Mm$~%j9~;p!_3(TRzDvXgTt*sx z*eS&GV6iC#=VNDt)!v!!4p#uYhz(%mk!@mLQ#gihVjN~aiW~4z{VVv^8;741aRBUr zU8=+i42swQM)(YTq-9jEDVV%H;zlfhRqMw(L>!!Q=u}G z4|jeP{CdE_VhFLRW(Mn|##suw!*0k&o)wR&$;wZ{2y=o+>{h!^IE{09Esphyx(+Z`T{- zZ;Ln;{PdwgH2bVVIZteLm?tdLgSz=XtMu94%Q8#@;sF#ci8uge-BBfZ5jO?jt2`w+ zFjIlgz_brroL#-!M2V%6)kaef1>$V8&nb#n0Le*)pcYZqL_9CJCopSYVDPdA!UKqV zg4Klg8FiREWz@w!Euz}MMmKGV*`|p3n90wIH~<7W&^;11NbD-H5X`=?-JAvzCEh4W zNqNxL-8)#U#IFSN0BQ3T$TifN|5C&c4*X<}+1$YUi&U#WIKzelzDOOf2M_G?dJ8SI f&_WCUV_4R|jPWVYtkgm#00000NkvXXu0mjfhB8mW literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/me.png b/android/app/src/main/res/drawable/me.png new file mode 100644 index 0000000000000000000000000000000000000000..ba75bc55bf4433d4fc364089c7556b6e119da94d GIT binary patch literal 1021 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1CmKZK~!i%?U-Lk zQ&AkpXF^dv^io7%^ks%)nGl7N;X^{GU_t+< zXp}kA{yjw`6(Q+^z9f;lQReyeJ9odq_4-rX+Rhg23m2y{gcaaf?!!d)u5GFrA-%eALPjTV$(F-0@j1 zv=KuSZ^>4jumSCxA4zB$)Pg;?4GUOr*AT9I)1-v*!GJH ztVhm~bGMxBd+qL@*-bX;V=nov-2w#g{-OmH#(+x*#22vafuRcoO)0 z9$*#4h+cSJ^Z5et$2}NyP>kq>J8_LOR{?&Nu2PKX<@N_(a^{K{q!`f)kI*DztcnSW r5xwvT1sP*S1cDSJrIb=)WitH*z#@M?8?WqE00000NkvXXu0mjfQ^nfk literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/sample_large_icon.png b/android/app/src/main/res/drawable/sample_large_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f354ca234d31b0d663336c154933042eb1513bdb GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDB3?!H8JlO)ID|0t=hP86DQPxDme>0B8wRq_>O=u<5X=vX`rBur;B5VMQ?I~ z1nc64qys8qix`vx88%lWJG(G-xJ)(>5=#wWpPX?ZaMQ+xv5YQ@PIt5#v8Xnj2sB7y ZWQg9zdAz9V#xviX literal 0 HcmV?d00001 diff --git a/android/app/src/main/res/drawable/secondary_icon.png b/android/app/src/main/res/drawable/secondary_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9de9ff41bdae5d1b3a2bfceb45861d035b8ec7fc GIT binary patch literal 1073 zcmV-11kU@3P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGw)c^n-)dAs~2Fw5e02y>eSaefwW^{L9 za%BK;VQFr3E^cLXAT%y8E;2FkAZe8V00W^(L_t(oN7dI`$WB=p!12!vGfaa-j-!!s zm_mk>V{(i^j-`plG(|3^apzQW;gCe4kPDHBa)DwbB3y8T$eEF2&So5PX8iy4J@xk5 z-@Es_eQD;YUwysbT5GSp*0T<~B1e3Q`S>@*1bmkG&vobv%)reQV^AD5&;>m!|E{*E zg9a(SLSfW|qjn2_VHBz@9Hk#H35&4~YvELm$9E_mffhK8n9}{V&q{m`qdP9Z|386KmpPw&Gb=dn zg&lbghkOqfVtS=zIE;sQiNcN@gD>WE4~1>cMRBfG87AQrJU}$;-#rwk=_P z?S!3=`Zq8VcFNBAj7(vLX>drRF^9PyzCqTgkBM-^q8+z{z9=iY!MCx2w>W@iC=NUB zs#;ztDM1}ESL8{=v>%15E>pOg4#J8yup3F8G0d?wh_@eyqy+UhH^j?`vRhFLsqs5v zN&k(ms4B8{$nf`Ja7(bPNpC)tjK(+*D>yncQ7X#mP{e9Pc}J;aPMQx-Vc}D#Y9&SF z=}<@9hUKrKEfT{exD?U&Z1})Zk*7m-VP0C^Ss0GQIu_go3qHd@q(z<%`TqrQ^;*ZX z(AD};G=fXhLhcoATxpS~Lx!h*Y?yx{aVDDL8Z6}D*$Qcqw?l5Qk*g<=xMRE5M6!7b zyZxs{-VS-{$0^{dPV7(V}v|(6Fbxp-eD}{Nd1Vk$lIac@B-G^ zj>H`L7CT@echR4a7Czkb%PWeSBQ31sxfiFwJS46%d+BnFf{T#(dQe8V*?L&}43CjP zs4|AY^UK06eecHA9lh}wKI1InCYcyco6FF`T7ks*%^8mPHrTei^m?S8_@nU}R&phb zK$b*J3p?YbKT^WBdm%NfxDhc*XW*B^r-U!$i+K-^c0DpOkA6G2TSsL#N-tP>lDsxd zTyxU4oT`1Ohs@zJ^fGl1(J8+YX2E-M)^N99g?|w3IN}{pb{g2JKDdKu>=pdbn~L~c zcGMht`M1BhI{l#ZCE`?fWc)_+ew{lft>`j!--w2T`LGv$LYoguumOiq__ZQ8+AYX( zU}p-iwv!QGB3U^qo>lJR + \ No newline at end of file diff --git a/android/app/src/main/res/raw/slow_spring_board.mp3 b/android/app/src/main/res/raw/slow_spring_board.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..60dbf9794d2d1270b43308ab84425261ba2f5b19 GIT binary patch literal 37616 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 literal 0 HcmV?d00001 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 5ba52820..00000000 --- a/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,618 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 5A016D0DD1095D385566337C /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AC606583E610E227F8186476 /* Pods_Runner.framework */; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 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 */; }; -/* End PBXBuildFile 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 */ - 09DDD2020D673759BD0E86B8 /* 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 = ""; }; - 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 = ""; }; - 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 = ""; }; - A8949DBAE70E5B302D91F1DB /* 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 = ""; }; - AC606583E610E227F8186476 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E2D9C922B5D0172FE487333D /* 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 = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 5A016D0DD1095D385566337C /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0A1F078D9C068A8B18DE1EDB /* Pods */ = { - isa = PBXGroup; - children = ( - A8949DBAE70E5B302D91F1DB /* Pods-Runner.debug.xcconfig */, - E2D9C922B5D0172FE487333D /* Pods-Runner.release.xcconfig */, - 09DDD2020D673759BD0E86B8 /* Pods-Runner.profile.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; - 44EDA189DE1BB86E3A41BD4A /* Frameworks */ = { - isa = PBXGroup; - children = ( - AC606583E610E227F8186476 /* Pods_Runner.framework */, - ); - name = Frameworks; - 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 */, - 0A1F078D9C068A8B18DE1EDB /* Pods */, - 44EDA189DE1BB86E3A41BD4A /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - B4860726BBF5BF6213BBC91C /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 72E9699567A7106FD141B9B3 /* [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 = { - LastUpgradeCheck = 1020; - ORGANIZATIONNAME = ""; - TargetAttributes = { - 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 */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 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; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; - }; - 72E9699567A7106FD141B9B3 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../Flutter/Flutter.framework", - "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", - "${BUILT_PRODUCTS_DIR}/MTBBarcodeScanner/MTBBarcodeScanner.framework", - "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", - "${BUILT_PRODUCTS_DIR}/Protobuf/protobuf.framework", - "${BUILT_PRODUCTS_DIR}/Reachability/Reachability.framework", - "${BUILT_PRODUCTS_DIR}/SwiftProtobuf/SwiftProtobuf.framework", - "${BUILT_PRODUCTS_DIR}/TOCropViewController/TOCropViewController.framework", - "${BUILT_PRODUCTS_DIR}/barcode_scan/barcode_scan.framework", - "${BUILT_PRODUCTS_DIR}/connectivity/connectivity.framework", - "${BUILT_PRODUCTS_DIR}/device_info/device_info.framework", - "${BUILT_PRODUCTS_DIR}/flutter_flexible_toast/flutter_flexible_toast.framework", - "${BUILT_PRODUCTS_DIR}/flutter_inappwebview/flutter_inappwebview.framework", - "${BUILT_PRODUCTS_DIR}/flutter_local_notifications/flutter_local_notifications.framework", - "${BUILT_PRODUCTS_DIR}/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework", - "${BUILT_PRODUCTS_DIR}/hexcolor/hexcolor.framework", - "${BUILT_PRODUCTS_DIR}/image_cropper/image_cropper.framework", - "${BUILT_PRODUCTS_DIR}/image_picker/image_picker.framework", - "${BUILT_PRODUCTS_DIR}/local_auth/local_auth.framework", - "${BUILT_PRODUCTS_DIR}/manage_calendar_events/manage_calendar_events.framework", - "${BUILT_PRODUCTS_DIR}/map_launcher/map_launcher.framework", - "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", - "${BUILT_PRODUCTS_DIR}/shared_preferences/shared_preferences.framework", - "${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/MTBBarcodeScanner.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/protobuf.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Reachability.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SwiftProtobuf.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TOCropViewController.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/barcode_scan.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/connectivity.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/device_info.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_flexible_toast.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_inappwebview.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_local_notifications.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_plugin_android_lifecycle.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hexcolor.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_cropper.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/local_auth.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/manage_calendar_events.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/map_launcher.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - 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"; - }; - B4860726BBF5BF6213BBC91C /* [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; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase 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; - 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; - 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 = 8.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)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.cloud.diplomaticquarterapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_VERSION = 5.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - 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; - 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 = 8.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; - 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; - 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 = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SUPPORTED_PLATFORMS = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - 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)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.cloud.diplomaticquarterapp; - 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)"; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.cloud.diplomaticquarterapp; - 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 */ - 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/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a16..00000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5..00000000 --- a/ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index a28140cf..00000000 --- a/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/Runner.xcworkspace/contents.xcworkspacedata b/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc14..00000000 --- a/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d98100..00000000 --- a/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index f9b0d7c5..00000000 --- a/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - PreviewsEnabled - - - diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift deleted file mode 100644 index 70693e4a..00000000 --- a/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,13 +0,0 @@ -import UIKit -import Flutter - -@UIApplicationMain -@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/ios/Runner/Info.plist b/ios/Runner/Info.plist index 8f1009c3..792eb95e 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -22,6 +22,8 @@ $(FLUTTER_BUILD_NUMBER) LSRequiresIPhoneOS + NSCalendarsUsageDescription + We Need to access the calender to add reminder for you UILaunchStoryboardName LaunchScreen UIMainStoryboardFile diff --git a/ios/Runner/Runner-Bridging-Header.h b/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index 308a2a56..00000000 --- a/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1 +0,0 @@ -#import "GeneratedPluginRegistrant.h" diff --git a/lib/config/config.dart b/lib/config/config.dart index ca902b45..698ff8df 100644 --- a/lib/config/config.dart +++ b/lib/config/config.dart @@ -218,6 +218,9 @@ const GET_WEIGHT_PRESSURE_RESULT='Services/Patients.svc/REST/Patient_GetWeightMe const ADD_WEIGHT_PRESSURE_RESULT='Services/Patients.svc/REST/Patient_AddWeightMeasurementResult'; +const ADD_ACTIVE_PRESCRIPTIONS_REPORT_BY_PATIENT_ID='Services/Patients.svc/Rest/GetActivePrescriptionReportByPatientID'; + + const TIMER_MIN = 10; diff --git a/lib/core/model/active_medications/ActivePrescriptionReport.dart b/lib/core/model/active_medications/ActivePrescriptionReport.dart new file mode 100644 index 00000000..866cb728 --- /dev/null +++ b/lib/core/model/active_medications/ActivePrescriptionReport.dart @@ -0,0 +1,146 @@ +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; + +class ActivePrescriptionReport { + dynamic address; + int appointmentNo; + dynamic clinic; + dynamic companyName; + int days; + dynamic doctorName; + int doseDailyQuantity; + String frequency; + int frequencyNumber; + List image; + String imageExtension; + dynamic imageSRCUrl; + String imageString; + dynamic imageThumbUrl; + dynamic isCovered; + String itemDescription; + int itemID; + DateTime orderDate; + int patientID; + dynamic patientName; + dynamic phoneOffice1; + dynamic prescriptionQR; + int prescriptionTimes; + dynamic productImage; + String productImageBase64; + String productImageString; + int projectID; + dynamic projectName; + dynamic remarks; + String route; + String sKU; + int scaleOffset; + DateTime startDate; + + ActivePrescriptionReport( + {this.address, + this.appointmentNo, + this.clinic, + this.companyName, + this.days, + this.doctorName, + this.doseDailyQuantity, + this.frequency, + this.frequencyNumber, + this.image, + this.imageExtension, + this.imageSRCUrl, + this.imageString, + this.imageThumbUrl, + this.isCovered, + this.itemDescription, + this.itemID, + this.orderDate, + this.patientID, + this.patientName, + this.phoneOffice1, + this.prescriptionQR, + this.prescriptionTimes, + this.productImage, + this.productImageBase64, + this.productImageString, + this.projectID, + this.projectName, + this.remarks, + this.route, + this.sKU, + this.scaleOffset, + this.startDate}); + + ActivePrescriptionReport.fromJson(Map json) { + address = json['Address']; + appointmentNo = json['AppointmentNo']; + clinic = json['Clinic']; + companyName = json['CompanyName']; + days = json['Days']; + doctorName = json['DoctorName']; + doseDailyQuantity = json['DoseDailyQuantity']; + frequency = json['Frequency']; + frequencyNumber = json['FrequencyNumber']; + image = json['Image'].cast(); + imageExtension = json['ImageExtension']; + imageSRCUrl = json['ImageSRCUrl']; + imageString = json['ImageString']; + imageThumbUrl = json['ImageThumbUrl']; + isCovered = json['IsCovered']; + itemDescription = json['ItemDescription']; + itemID = json['ItemID']; + orderDate = DateUtil.convertStringToDate(json['OrderDate']); + patientID = json['PatientID']; + patientName = json['PatientName']; + phoneOffice1 = json['PhoneOffice1']; + prescriptionQR = json['PrescriptionQR']; + prescriptionTimes = json['PrescriptionTimes']; + productImage = json['ProductImage']; + productImageBase64 = json['ProductImageBase64']; + productImageString = json['ProductImageString']; + projectID = json['ProjectID']; + projectName = json['ProjectName']; + remarks = json['Remarks']; + route = json['Route']; + sKU = json['SKU']; + scaleOffset = json['ScaleOffset']; + startDate = DateUtil.convertStringToDate(json['StartDate']); + } + + Map toJson() { + final Map data = new Map(); + data['Address'] = this.address; + data['AppointmentNo'] = this.appointmentNo; + data['Clinic'] = this.clinic; + data['CompanyName'] = this.companyName; + data['Days'] = this.days; + data['DoctorName'] = this.doctorName; + data['DoseDailyQuantity'] = this.doseDailyQuantity; + data['Frequency'] = this.frequency; + data['FrequencyNumber'] = this.frequencyNumber; + data['Image'] = this.image; + data['ImageExtension'] = this.imageExtension; + data['ImageSRCUrl'] = this.imageSRCUrl; + data['ImageString'] = this.imageString; + data['ImageThumbUrl'] = this.imageThumbUrl; + data['IsCovered'] = this.isCovered; + data['ItemDescription'] = this.itemDescription; + data['ItemID'] = this.itemID; + data['OrderDate'] = this.orderDate; + data['PatientID'] = this.patientID; + data['PatientName'] = this.patientName; + data['PhoneOffice1'] = this.phoneOffice1; + data['PrescriptionQR'] = this.prescriptionQR; + data['PrescriptionTimes'] = this.prescriptionTimes; + data['ProductImage'] = this.productImage; + data['ProductImageBase64'] = this.productImageBase64; + data['ProductImageString'] = this.productImageString; + data['ProjectID'] = this.projectID; + data['ProjectName'] = this.projectName; + data['Remarks'] = this.remarks; + data['Route'] = this.route; + data['SKU'] = this.sKU; + data['ScaleOffset'] = this.scaleOffset; + data['StartDate'] = this.startDate; + return data; + } +} diff --git a/lib/core/service/medical/ActiveMedicationsService.dart b/lib/core/service/medical/ActiveMedicationsService.dart new file mode 100644 index 00000000..070b7e5f --- /dev/null +++ b/lib/core/service/medical/ActiveMedicationsService.dart @@ -0,0 +1,27 @@ +import 'package:diplomaticquarterapp/config/config.dart'; +import 'package:diplomaticquarterapp/core/model/active_medications/ActivePrescriptionReport.dart'; +import 'package:diplomaticquarterapp/core/service/base_service.dart'; + +class ActiveMedicationsService extends BaseService{ + + List activePrescriptionReport = List(); + + getActiveMedication() async { + hasError = false; + super.error = ""; + Map body = Map(); + body['isDentalAllowedBackend'] = false; + await baseAppClient.post(ADD_ACTIVE_PRESCRIPTIONS_REPORT_BY_PATIENT_ID, + onSuccess: (response, statusCode) async { + activePrescriptionReport.clear(); + response['List_ActiveGetPrescriptionReportByPatientID'].forEach((appoitment) { + activePrescriptionReport + .add(ActivePrescriptionReport.fromJson(appoitment)); + }); + }, onFailure: (String error, int statusCode) { + hasError = true; + super.error = error; + }, body: body); + } + +} \ No newline at end of file diff --git a/lib/core/viewModels/medical/ActiveMedicationsViewModel.dart b/lib/core/viewModels/medical/ActiveMedicationsViewModel.dart new file mode 100644 index 00000000..ee4f37c5 --- /dev/null +++ b/lib/core/viewModels/medical/ActiveMedicationsViewModel.dart @@ -0,0 +1,28 @@ +import 'package:diplomaticquarterapp/core/enum/viewstate.dart'; +import 'package:diplomaticquarterapp/core/model/active_medications/ActivePrescriptionReport.dart'; +import 'package:diplomaticquarterapp/core/service/medical/ActiveMedicationsService.dart'; +import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart'; +import 'package:diplomaticquarterapp/locator.dart'; + +class ActiveMedicationsViewModel extends BaseViewModel { + ActiveMedicationsService _activeMedicationsService = + locator(); + + List get activePrescriptionReport => + _activeMedicationsService.activePrescriptionReport; + + getActiveMedication() async { + setState(ViewState.Busy); + await _activeMedicationsService.getActiveMedication(); + if (_activeMedicationsService.hasError) { + error = _activeMedicationsService.error; + setState(ViewState.Error); + } else { + setState(ViewState.Idle); + } + } + + + + +} diff --git a/lib/locator.dart b/lib/locator.dart index 4c5a1df3..79e92a63 100644 --- a/lib/locator.dart +++ b/lib/locator.dart @@ -9,6 +9,7 @@ import 'core/service/er/am_service.dart'; import 'core/service/er/er_service.dart'; import 'core/service/feedback/feedback_service.dart'; import 'core/service/hospital_service.dart'; +import 'core/service/medical/ActiveMedicationsService.dart'; import 'core/service/medical/BloodPressureService.dart'; import 'core/service/medical/BloodSugarService.dart'; import 'core/service/medical/EyeService.dart'; @@ -28,6 +29,7 @@ import 'core/viewModels/er/near_hospital_view_model.dart'; import 'core/viewModels/feedback/feedback_view_model.dart'; import 'core/service/medical/reports_service.dart'; import 'core/viewModels/hospital_view_model.dart'; +import 'core/viewModels/medical/ActiveMedicationsViewModel.dart'; import 'core/viewModels/medical/EyeViewModel.dart'; import 'core/viewModels/medical/blood_pressure_view_model.dart'; import 'core/viewModels/medical/labs_view_model.dart'; @@ -80,6 +82,7 @@ void setupLocator() { locator.registerLazySingleton(() => BloodPressureService()); locator.registerLazySingleton(() => WeightService()); locator.registerLazySingleton(() => EyeService()); + locator.registerLazySingleton(() => ActiveMedicationsService()); /// View Model locator.registerFactory(() => HospitalViewModel()); @@ -106,5 +109,6 @@ void setupLocator() { locator.registerFactory(() => BloodPressureViewMode()); locator.registerFactory(() => WeightPressureViewMode()); locator.registerFactory(() => EyeViewModel()); + locator.registerFactory(() => ActiveMedicationsViewModel()); } diff --git a/lib/pages/landing/landing_page.dart b/lib/pages/landing/landing_page.dart index d892be83..9cd88cd9 100644 --- a/lib/pages/landing/landing_page.dart +++ b/lib/pages/landing/landing_page.dart @@ -1,4 +1,5 @@ import 'dart:io'; +import 'dart:typed_data'; import 'package:diplomaticquarterapp/config/config.dart'; import 'package:diplomaticquarterapp/config/shared_pref_kay.dart'; @@ -13,6 +14,8 @@ import 'package:diplomaticquarterapp/pages/medical/medical_profile_page.dart'; import 'package:diplomaticquarterapp/pages/medical/my_admissions_page.dart'; import 'package:diplomaticquarterapp/services/robo_search/search_provider.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; +import 'package:diplomaticquarterapp/uitl/CalendarUtils.dart'; +import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/widgets/bottom_navigation/bottom_nav_bar.dart'; import 'package:diplomaticquarterapp/widgets/dialogs/confirm_dialog.dart'; @@ -21,12 +24,17 @@ import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:provider/provider.dart'; +import 'package:rxdart/rxdart.dart'; import 'home_page.dart'; import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; + + + class LandingPage extends StatefulWidget { static bool isOpenCallPage = false; @@ -43,6 +51,16 @@ class _LandingPageState extends State with WidgetsBindingObserver { final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); final authService = new AuthProvider(); + void _requestIOSPermissions() { + flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation< + IOSFlutterLocalNotificationsPlugin>() + ?.requestPermissions( + alert: true, + badge: true, + sound: true, + ); + } bool isPageNavigated = false; _changeCurrentTab(int tab) { @@ -106,6 +124,7 @@ class _LandingPageState extends State with WidgetsBindingObserver { setState(() { AppGlobal.context = context; }); + _requestIOSPermissions(); pageController = PageController(keepPage: true); _firebaseMessaging.setAutoInitEnabled(true); @@ -245,7 +264,9 @@ class _LandingPageState extends State with WidgetsBindingObserver { ); } - showDialog(String message) { + + + showDialogs(String message) { ConfirmDialog dialog = new ConfirmDialog( context: context, confirmMessage: message, @@ -263,10 +284,55 @@ class _LandingPageState extends State with WidgetsBindingObserver { Permission.camera, Permission.photos, Permission.notification, - Permission.accessMediaLocation + Permission.accessMediaLocation, + Permission.calendar, ].request(); + + var permissionsGranted = await deviceCalendarPlugin.hasPermissions(); + if (permissionsGranted.isSuccess && !permissionsGranted.data) { + permissionsGranted = await deviceCalendarPlugin.requestPermissions(); + if (!permissionsGranted.isSuccess || !permissionsGranted.data) { + return; + } + } + } + Future _scheduleNotification() async { + var scheduledNotificationDateTime = + DateTime.now().add(Duration(seconds: 5)); + var vibrationPattern = Int64List(4); + vibrationPattern[0] = 0; + vibrationPattern[1] = 1000; + vibrationPattern[2] = 5000; + vibrationPattern[3] = 2000; + + var androidPlatformChannelSpecifics = AndroidNotificationDetails( + 'your other channel id', + 'your other channel name', + 'your other channel description', + // icon: 'secondary_icon', + sound: RawResourceAndroidNotificationSound('slow_spring_board'), + largeIcon: DrawableResourceAndroidBitmap('sample_large_icon'), + vibrationPattern: vibrationPattern, + enableLights: true, + color: const Color.fromARGB(255, 255, 0, 0), + ledColor: const Color.fromARGB(255, 255, 0, 0), + ledOnMs: 1000, + ledOffMs: 500); + var iOSPlatformChannelSpecifics = + IOSNotificationDetails(sound: 'slow_spring_board.aiff'); + var platformChannelSpecifics = NotificationDetails( + androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); + await flutterLocalNotificationsPlugin.schedule( + 0, + 'scheduled title', + 'scheduled body', + scheduledNotificationDateTime, + platformChannelSpecifics); + } + + @override Widget build(BuildContext context) { //final searchValue = Provider.of(context); diff --git a/lib/pages/login/login.dart b/lib/pages/login/login.dart index 7510987c..c1f04a71 100644 --- a/lib/pages/login/login.dart +++ b/lib/pages/login/login.dart @@ -131,6 +131,7 @@ class _Login extends State { } void validateForm() { + //TODO fix login if (util.validateIDBox(nationalIDorFile.text, loginType) == true && mobileNo.length >= 9 && util.isSAUDIIDValid(nationalIDorFile.text, loginType) == true) { @@ -139,7 +140,7 @@ class _Login extends State { }); } else { setState(() { - isButtonDisabled = true; + isButtonDisabled = false; }); } } diff --git a/lib/pages/medical/active_medications/ActiveMedicationsPage.dart b/lib/pages/medical/active_medications/ActiveMedicationsPage.dart new file mode 100644 index 00000000..3409c3db --- /dev/null +++ b/lib/pages/medical/active_medications/ActiveMedicationsPage.dart @@ -0,0 +1,129 @@ +import 'package:diplomaticquarterapp/config/size_config.dart'; +import 'package:diplomaticquarterapp/core/viewModels/medical/ActiveMedicationsViewModel.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/medical/active_medications/reminder_page.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/uitl/utils.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; + +class ActiveMedicationsPage extends StatelessWidget { + @override + Widget build(BuildContext context) { + return BaseView( + onModelReady: (model) => model.getActiveMedication(), + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + appBarTitle: 'Active Medications', + isShowAppBar: true, + body: Container( + child: ListView.builder( + itemCount: model.activePrescriptionReport.length, + itemBuilder: (context, index) => Container( + padding: EdgeInsets.all(10), + margin: EdgeInsets.all(10), + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(8), color: Colors.white), + child: Row( + children: [ + Image.memory( + Utils.dataFromBase64String(model + .activePrescriptionReport[index].productImageBase64), + height: SizeConfig.imageSizeMultiplier * 19, + width: SizeConfig.imageSizeMultiplier * 18, + fit: BoxFit.cover, + ), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Texts( + model.activePrescriptionReport[index].itemDescription, + bold: true, + ), + SizedBox( + height: 5, + ), + Texts( + 'Exp Date :' + + DateUtil.getDayMonthYearDateFormatted(model + .activePrescriptionReport[index].orderDate), + ), + SizedBox( + height: 5, + ), + Texts( + 'Route :' + + model.activePrescriptionReport[index].route, + ), + SizedBox( + height: 5, + ), + Texts( + 'Frequency :' + + model.activePrescriptionReport[index].frequency, + ), + SizedBox( + height: 5, + ), + Texts( + 'Daily Quantity :${model.activePrescriptionReport[index].doseDailyQuantity}', + ), + ], + ), + ), + InkWell( + onTap: () { + Navigator.push( + context, + FadePage( + page: ReminderPage( + frequency: model.activePrescriptionReport[index] + .frequencyNumber, + days: model.activePrescriptionReport[index].days, + itemDescription: model + .activePrescriptionReport[index] + .itemDescription, + ), + ), + ); + }, + child: Container( + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Icon( + Icons.notifications, + color: Colors.red, + size: 28, + ), + Row( + children: [ + Icon( + Icons.notifications_active, + color: Colors.red, + size: 28, + ), + Texts( + 'Reminder', + color: Colors.red, + ) + ], + ) + ], + ), + ), + ) + ], + ), + ), + ), + ), + ), + ); + } +} diff --git a/lib/pages/medical/active_medications/reminder_page.dart b/lib/pages/medical/active_medications/reminder_page.dart new file mode 100644 index 00000000..72f6c211 --- /dev/null +++ b/lib/pages/medical/active_medications/reminder_page.dart @@ -0,0 +1,263 @@ +import 'package:diplomaticquarterapp/core/viewModels/medical/ActiveMedicationsViewModel.dart'; +import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart'; +import 'package:diplomaticquarterapp/pages/base/base_view.dart'; +import 'package:diplomaticquarterapp/pages/medical/balance/new_text_Field.dart'; +import 'package:diplomaticquarterapp/uitl/CalendarUtils.dart'; +import 'package:diplomaticquarterapp/uitl/LocalNotification.dart'; +import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; +import 'package:diplomaticquarterapp/widgets/buttons/secondary_button.dart'; +import 'package:diplomaticquarterapp/widgets/data_display/text.dart'; +import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_datetime_picker/flutter_datetime_picker.dart'; +import 'package:provider/provider.dart'; + +// ignore: must_be_immutable +class ReminderPage extends StatefulWidget { + final int frequency; + final int days; + final String itemDescription; + + List _scheduleList = List(); + + DateTime startDay; + DateTime endDay; + + ReminderPage({Key key, this.frequency, this.days, this.itemDescription}) { + startDay = DateTime.now(); + endDay = DateTime.now().add(Duration(days: days)); + int hour = (24 ~/ frequency).round(); + int durations = 24 ~/ hour; + for (int count = 0; count < durations; count++) { + _scheduleList.add(DateTime(DateTime.now().year, DateTime.now().month, + DateTime.now().day, (hour * count))); + } + } + + @override + _ReminderPageState createState() => _ReminderPageState(); +} + +class _ReminderPageState extends State { + @override + Widget build(BuildContext context) { + ProjectViewModel projectViewModel = Provider.of(context); + + return BaseView( + builder: (_, model, w) => AppScaffold( + baseViewModel: model, + isShowAppBar: true, + appBarTitle: 'Reminder', + body: SingleChildScrollView( + child: Container( + margin: EdgeInsets.all(8.0), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + width: double.maxFinite, + child: Texts( + 'Please select treatment start day and time to be notified when it\'s time to take the medicine'), + ), + Divider(), + SizedBox( + height: 12, + ), + Texts('Start day'), + InkWell( + onTap: () { + DatePicker.showDatePicker(context, + showTitleActions: true, + minTime: DateTime( + DateTime.now().year, DateTime.now().month - 1, 1), + maxTime: DateTime.now(), onConfirm: (date) { + print('confirm $date'); + setState(() { + widget.startDay = date; + }); + }, + currentTime: widget.startDay, + locale: projectViewModel.localeType); + }, + child: Container( + padding: EdgeInsets.all(12), + width: double.infinity, + height: 65, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts(getStartDay()), + Icon( + Icons.calendar_today, + color: Colors.black, + ) + ], + ), + ), + ), + SizedBox( + height: 12, + ), + Texts('End day'), + InkWell( + onTap: () { + DatePicker.showDatePicker(context, + showTitleActions: true, + minTime: DateTime( + DateTime.now().year, DateTime.now().month - 1, 1), + maxTime: DateTime.now(), onConfirm: (date) { + print('confirm $date'); + setState(() { + widget.endDay = date; + }); + }, + currentTime: widget.endDay, + locale: projectViewModel.localeType); + }, + child: Container( + padding: EdgeInsets.all(12), + width: double.infinity, + height: 65, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Texts(getEndDay()), + Icon( + Icons.calendar_today, + color: Colors.black, + ) + ], + ), + ), + ), + ...List.generate( + widget._scheduleList.length, + (index) => Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SizedBox( + height: 7, + ), + Texts('Schedule time'), + SizedBox( + height: 7, + ), + InkWell( + onTap: () { + DatePicker.showTimePicker(context, + showTitleActions: true, onConfirm: (date) { + print('confirm $date'); + setState(() { + widget._scheduleList[index] = date; + }); + }, + currentTime: widget._scheduleList[index], + locale: projectViewModel.localeType); + }, + child: Container( + padding: EdgeInsets.all(12), + width: double.infinity, + height: 65, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(12), + color: Colors.white), + child: Row( + mainAxisAlignment: + MainAxisAlignment.spaceBetween, + children: [ + Texts(getDateTime( + widget._scheduleList[index])), + Icon( + Icons.access_time, + color: Colors.black, + ) + ], + ), + ), + ), + ], + )), + Container( + width: double.maxFinite, + height: MediaQuery.of(context).size.height * 0.12, + ), + ], + ), + ), + ), + bottomSheet: Container( + width: double.infinity, + height: MediaQuery.of(context).size.height * 0.1, + padding: EdgeInsets.all(10), + child: SecondaryButton( + label: 'OK', + color: Colors.grey[800], + onTap: () { + schedule(); + }, + ), + ), + ), + ); + } + + schedule() async { + List scheduleDateTime = + calculateDaysInterval(widget.startDay, widget.endDay); + + // scheduleDateTime.forEach((date) { + // LocalNotification.scheduleNotification( + // scheduledNotificationDateTime: date, + // title: 'Remainder', + // description: widget.itemDescription); + // return; + // }); + + CalendarUtils calendarUtils = await CalendarUtils.getInstance(); + + calendarUtils.createOrUpdateEvents( + scheduleList: widget._scheduleList, + description: widget.itemDescription, + title: widget.itemDescription, + scheduleDateTime: scheduleDateTime); + + + + var asd = calendarUtils.writableCalendars; + Navigator.pop(context); + } + + List calculateDaysInterval(DateTime startDate, DateTime endDate) { + List days = []; + for (int i = 0; i <= endDate.difference(startDate).inDays; i++) { + widget._scheduleList.forEach((element) { + days.add(startDate.add( + Duration(days: i, hours: element.hour, minutes: element.minute))); + }); + } + return days; + } + + String getStartDay() { + return "${DateUtil.getMonth(widget.startDay.month)} ${widget.startDay.day}, ${widget.startDay.year}"; + } + + String getEndDay() { + return "${DateUtil.getMonth(widget.endDay.month)} ${widget.endDay.day}, ${widget.endDay.year}"; + } + + String getDateTime(DateTime dateTime) { + return '${dateTime.hour}:${dateTime.minute}'; + } + + String getDays() { + return ''; + } +} diff --git a/lib/pages/medical/medical_profile_page.dart b/lib/pages/medical/medical_profile_page.dart index 2ac090b9..cf9738df 100644 --- a/lib/pages/medical/medical_profile_page.dart +++ b/lib/pages/medical/medical_profile_page.dart @@ -24,6 +24,7 @@ import 'package:flutter/material.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_card_screen.dart'; import 'package:provider/provider.dart'; import '../../locator.dart'; +import 'active_medications/ActiveMedicationsPage.dart'; import 'balance/my_balance_page.dart'; import 'doctor/doctor_home_page.dart'; import 'package:diplomaticquarterapp/pages/insurance/insurance_update_screen.dart'; @@ -186,8 +187,8 @@ class _MedicalProfilePageState extends State { Expanded( flex: 1, child: InkWell( -// onTap: () => Navigator.push( -// context, FadePage(page: RadiologyHomePage())), + onTap: () => Navigator.push(context, + FadePage(page: ActiveMedicationsPage())), child: MedicalProfileItem( title: TranslationBase.of(context) .myMedical, diff --git a/lib/uitl/CalendarUtils.dart b/lib/uitl/CalendarUtils.dart new file mode 100644 index 00000000..d61a19b6 --- /dev/null +++ b/lib/uitl/CalendarUtils.dart @@ -0,0 +1,77 @@ +import 'dart:async'; +import 'dart:ui'; + +import 'package:device_calendar/device_calendar.dart'; + +final DeviceCalendarPlugin deviceCalendarPlugin = DeviceCalendarPlugin(); + +class CalendarUtils { + static Completer _completer; + + Calendar get writableCalendars => calendars?.firstWhere((c) => !c.isReadOnly); + List calendars; + + CalendarUtils._(this.calendars); + + static Future getInstance() async { + if (_completer == null) { + _completer = Completer(); + try { + final calendarsResult = await deviceCalendarPlugin.retrieveCalendars(); + _completer.complete(CalendarUtils._(calendarsResult?.data)); + } on Exception catch (e) { + _completer.completeError(e); + final Future sharedPrefsFuture = _completer.future; + _completer = null; + return sharedPrefsFuture; + } + } + return _completer.future; + } + + Future createOrUpdateEvents( + {List scheduleList, + String title, + String description, + List scheduleDateTime}) async { + List events = List(); + scheduleDateTime.forEach((element) { + RecurrenceRule recurrenceRule = RecurrenceRule( + RecurrenceFrequency.Daily, + endDate: element, + ); + Event event = Event(writableCalendars.id, + recurrenceRule: recurrenceRule, + start: element, + end: element.add(Duration(minutes: 30)), + title: title, + description: description); + events.add(event); + }); + + events.forEach((element) { + deviceCalendarPlugin.createOrUpdateEvent(element); + }); + } + + deleteEvent(Calendar _calendar, Event _event) async { + await deviceCalendarPlugin.deleteEvent(_calendar.id, _event.eventId); + } + + Future retrieveEvents( + String calendarId, + RetrieveEventsParams retrieveEventsParams, + ) async { + return await deviceCalendarPlugin.retrieveEvents( + calendarId, retrieveEventsParams); + } + + Future createCalendar( + String calendarName, { + Color calendarColor, + String localAccountName, + }) async { + return await deviceCalendarPlugin.createCalendar(calendarName, + calendarColor: calendarColor, localAccountName: localAccountName); + } +} diff --git a/lib/uitl/LocalNotification.dart b/lib/uitl/LocalNotification.dart new file mode 100644 index 00000000..ac4f5860 --- /dev/null +++ b/lib/uitl/LocalNotification.dart @@ -0,0 +1,97 @@ +import 'dart:typed_data'; +import 'dart:ui'; + +import 'package:flutter/cupertino.dart'; +import 'package:flutter_local_notifications/flutter_local_notifications.dart'; + +final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin(); + +class LocalNotification { + + + static Future scheduleNotification( + {@required DateTime scheduledNotificationDateTime, + @required String title, + @required String description}) async { + + ///vibrationPattern + var vibrationPattern = Int64List(4); + vibrationPattern[0] = 0; + vibrationPattern[1] = 1000; + vibrationPattern[2] = 5000; + vibrationPattern[3] = 2000; + + var androidPlatformChannelSpecifics = AndroidNotificationDetails( + 'active-prescriptions', + 'ActivePrescriptions', + 'ActivePrescriptionsDescription', + // icon: 'secondary_icon', + sound: RawResourceAndroidNotificationSound('slow_spring_board'),///change it to be as ionic + // largeIcon: DrawableResourceAndroidBitmap('sample_large_icon'),///change it to be as ionic + vibrationPattern: vibrationPattern, + enableLights: true, + color: const Color.fromARGB(255, 255, 0, 0), + ledColor: const Color.fromARGB(255, 255, 0, 0), + ledOnMs: 1000, + ledOffMs: 500); + var iOSPlatformChannelSpecifics = + IOSNotificationDetails(sound: 'slow_spring_board.aiff');///change it to be as ionic + var platformChannelSpecifics = NotificationDetails( + androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); + await flutterLocalNotificationsPlugin.schedule( + 0, + title, + description, + scheduledNotificationDateTime, + platformChannelSpecifics); + } + + ///Repeat notification every day at approximately 10:00:00 am + static Future showDailyAtTime() async { + var time = Time(10, 0, 0); + var androidPlatformChannelSpecifics = AndroidNotificationDetails( + 'repeatDailyAtTime channel id', + 'repeatDailyAtTime channel name', + 'repeatDailyAtTime description'); + var iOSPlatformChannelSpecifics = IOSNotificationDetails(); + var platformChannelSpecifics = NotificationDetails( + androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); + await flutterLocalNotificationsPlugin.showDailyAtTime( + 0, + 'show daily title', + 'Daily notification shown at approximately ${_toTwoDigitString(time.hour)}:${_toTwoDigitString(time.minute)}:${_toTwoDigitString(time.second)}', + time, + platformChannelSpecifics); + } + + ///Repeat notification weekly on Monday at approximately 10:00:00 am + static Future showWeeklyAtDayAndTime() async { + var time = Time(10, 0, 0); + var androidPlatformChannelSpecifics = AndroidNotificationDetails( + 'show weekly channel id', + 'show weekly channel name', + 'show weekly description'); + var iOSPlatformChannelSpecifics = IOSNotificationDetails(); + var platformChannelSpecifics = NotificationDetails( + androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics); + await flutterLocalNotificationsPlugin.showWeeklyAtDayAndTime( + 0, + 'show weekly title', + 'Weekly notification shown on Monday at approximately ${_toTwoDigitString(time.hour)}:${_toTwoDigitString(time.minute)}:${_toTwoDigitString(time.second)}', + Day.Monday, + time, + platformChannelSpecifics); + } + + static String _toTwoDigitString(int value) { + return value.toString().padLeft(2, '0'); + } + + static Future cancelNotification() async { + await flutterLocalNotificationsPlugin.cancel(0); + } + + static Future cancelAllNotifications() async { + await flutterLocalNotificationsPlugin.cancelAll(); + } +} diff --git a/lib/uitl/utils.dart b/lib/uitl/utils.dart index 6958e67f..52138759 100644 --- a/lib/uitl/utils.dart +++ b/lib/uitl/utils.dart @@ -1,3 +1,6 @@ +import 'dart:convert'; +import 'dart:typed_data'; + import 'package:connectivity/connectivity.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; @@ -137,4 +140,8 @@ class Utils { // await pr.hide(); // } } + + static Uint8List dataFromBase64String(String base64String) { + return base64Decode(base64String); + } } diff --git a/pubspec.yaml b/pubspec.yaml index 4204d4ad..49710761 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -112,6 +112,10 @@ dependencies: flutter_datetime_picker: ^1.4.0 + flutter_local_notifications: ^1.4.4+4 + rxdart: ^0.24.1 + + device_calendar: ^3.1.0 #Handle Geolocation geolocator: ^6.0.0+1