From 3ead80b4653dc26682311fc4889777929bbc1118 Mon Sep 17 00:00:00 2001 From: Supan Adit Pratama Date: Fri, 3 Jan 2020 22:13:00 +0700 Subject: [PATCH] Migrate to Android X Update some Dependencies Logo Added Start and Stop Tracking Button Optimize Code Stable Version --- android/app/build.gradle | 6 +- android/app/src/main/AndroidManifest.xml | 4 +- android/app/src/main/res/values/strings.xml | 5 + android/gradle.properties | 2 + assets/images/logo.png | Bin 0 -> 14410 bytes lib/bloc/setting.dart | 1 + lib/config.dart | 3 +- lib/main.dart | 2 + lib/model/response.dart | 4 + lib/model/setting.dart | 16 ++- lib/page/map.dart | 142 ++++++++++++++------ lib/page/setting.dart | 31 ++++- lib/page/startup.dart | 5 +- lib/provider/position_provider.dart | 1 + pubspec.lock | 47 ++----- pubspec.yaml | 8 +- 16 files changed, 181 insertions(+), 96 deletions(-) create mode 100644 android/app/src/main/res/values/strings.xml create mode 100644 assets/images/logo.png diff --git a/android/app/build.gradle b/android/app/build.gradle index 1a626d0..144136c 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -44,7 +44,7 @@ android { targetSdkVersion 28 versionCode flutterVersionCode.toInteger() versionName flutterVersionName - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -64,8 +64,8 @@ dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" implementation 'com.google.firebase:firebase-analytics:17.2.0' testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0' } apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index c2c7103..687ca3f 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -12,11 +12,11 @@ + android:value="@string/api_key" /> + + Geo Smart App + AIzaSyCjhBV5aq1gsTCYsr6QCCxYusFlBa3DEMs + \ No newline at end of file diff --git a/android/gradle.properties b/android/gradle.properties index 1441b1d..2324ab5 100644 --- a/android/gradle.properties +++ b/android/gradle.properties @@ -1,3 +1,5 @@ org.gradle.jvmargs=-Xmx1536M android.enableR8=true +android.useAndroidX=true +android.enableJetifier=true diff --git a/assets/images/logo.png b/assets/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f525c15d099486a012f2def20af7f082f4d29a71 GIT binary patch literal 14410 zcmeHu^;cWn^EHLwPH}<-mqLq6aV^&3#fv+n#T|kcch@4tT>=y+?(QC-xVyuf=lw6f zYkjiT{UKR*%}majd+yBay?=gDk;BFy$3Q?p!2TpJt%iW`M&Q2-4F&$oxZkM_0s;-f zCus={cf(^J%mppYv>Q_u6Jj;0>gq2Ps`b)rr0;OuyWUHZ^Iuh0af3sMnh{JD!S_tw6PkWjHOSB*kyxZs=cm{Ke+oKttSYH2h&0@Iq@ucrWkOQ1lxTQqcfcu67(3ryo7L^)IKX+3C^{Yy)*LiLfsg&@#3Vh-ai|6L6oG~5zp z4GfJ*qzpMRz)11h9U<^mGC!kQ9@4q&AJo#j#kBF7MLIO^t^G}&vpa8(<=Oa~E9_)= zm31->HpDKN^9lRS-YiWGGNp`!4V_Br`9Vz`26OBZO<4~zL7y=zGEtk9($yswDTe~Wq)WL&G<^R_&hAy@5aiV4 z?a#;>h!-j;!52DFdXuEcB&Z!6NWnyw;?z%`(%PQS}6zJ?k z=`^hXnP#UrbY??@ir?X`$2kwsnr@$Qa~6BEwHQBh*KRI3@)httwJHVtmdr}QFz*Yp z%zhk|ZGMUr=6MhV>PY;c#Lt0;;o5tz|CQlrJ3&Yt5v;om8?e&5w=fe=fMm-e6 z6@$)6)|vHgaASTHG{2c0v5)a1r$<#@Xfxg-KFG_p?x+-s-Qh^}jVL#`Ml~XVdiyg; zFJr)MOw?_qgK7&mPQ}6ohMUK8e!SkiL+JR7`i8T4gJ7eYyWP;H zkHd{sJ8=1Up@X(C>Sdw2lBr?yqp>jRY9>=WdVzqv(>u;AS+L&EffJFOyk@_x*Ns*# zWLhFTZN^vr$6Hg-MFv;YMOw7fUqy$-uso;7iE=hb%h6ETN3I1K~KQWpHEfQt|Ja0_u6$JCwXpw04K(!-R;hHwB z&;`{5JrrV)FVJn9i+6B?%Xn;$R;ApyBP5@xpkbjsKMOi=|DiL}Y_32?v~6V{^h1?x zcghChl^>>bbbrJITCV?58{i`no(d7kIgJ=N_`4f1n-}3+qctrj;w?#DBz+>Do|B0{zBfd%!E3x6EA zN-5_b6q>>ZP}!W9wb4#|Ko?--Oi8L>9{;dbt<7_pVN&kHa9JR~c4x)DdA=Jr`O#RW zSmlTNCe$sTEZSq2Q}Eq-c93O`SHfO{sNMTC5FS(Em|DH|X(EHcT|k}VmF zzc6;K{2$-(lN7QV@)N6llh6CNX^mItyQ)Nd4*WUS=S9A`maTUuZwaN2y)=b_{~ds! zZnsahe5c_j2DY(R@fh8wm;h80OiV#NoG*Lar&n=$FJ5<=hQ3Aj_$#F?`t>_h++9{Z z!uObu!+R{r)EB3;?DB*FjdDVtI;Cmzr_`LxtOZbubr z6i^aL+%gd=@q?QvW0jZ#ShRAMdrs!g2b<2H#{xO7Vdq~mPHmJR z6zrh&lH%XtQI6#|d{BMg#H=f1Nb4tQM&@&7b@&Ovo#9v#u`)pxUG_Wr&zx1A%hH8q zRR2tdrAm?<@whE{SydHRg5q`BcvM@bOKZ6F%$Y$&VGl^)smFi;B#>V8_2g~bGn+~| zJWvRAX}4d>-?!11eZ@3jFUd7Tqky(KsV0$GjpIAE6f*TYgZfu-(}Z32wA4R78Muna zw-|5Zmu{4?Al)H>`0EJAL9NwP@%F`_zd}26BxpGN+d{1oXUYgq8>UMdxkqAdgVM9# z@uN43CdA&8un4U#uhhaETu$OmyDTR{bNpWqcKg?07w-OqsMZ`dB?{oy@PT7+O@vVC zm@SsJ`6U}p87JNf75)*j^84<3G`VTUHa#n_JVj^Ple+POEr!?CU=-- z96JGvZHx%n#Gl=9!;lQNmgkpwEw)xx;Eez)UXB?$coF|B3RL5NKv4~by;Ozi9~{yI zoaT_k9n+1_xj?+sq*vONw#Dl=QFgBfxw|#;e^Ywf)47}0z=(Nssy#MJ-jaVZ4lh*7 z*)GaDQRfq}8jt*5Mm{=Q#okHla!W~hVnbvbieTq&*ifJXR+RZSP)b9T9r_6^x=6WD zNsU;#9SRl-S!|^_+upwwnLqT)=EoxbJj&2>gDoA7i47cmx!NoW;TC$K?xH`gIgRGJ z$D{@;Kst0TAx|*d+u;MEjwH8Ze);IfBUH1{PCdC0==Er`L!B4sO$XDQY6E+x1htFz zVV<>O%sN4wU(|%t0RYwdB@s#5=!uLTUGIU**!4ge&=Y5<2_W8x_d$xCAY8H>-l>}ZFkti4+-2T+p^ z+9!Op#;+5&e;8<3Y$BqHzfWVvvnR(qKL&6e1o4#De0;;557d-G$DxhRrCrf(^+%tH z*#4L;)ER{zM=huCSS_voE#%8vZ0cs(jgg=T67taFa2hpwomi&m4#wwf%(riwf4y{z zL6satS_Ql3XBO$UCroc6(VQOBFMyi)#UYaDCrbE&RX(xxe=IXUxJJ&{9srsW!pft9 zl4f__@p$&{_H$G#I83xDzYda@<%|3Z(|4QN=*wr_NsB`Mhk`!o{N%C`@CUEo$R(p@ z=#Vm3VE)5@1$;$70Y%JjASSJiub zZC2yuY>MCW0H{V%3qsdPwMx>_VLXe8=s1EGCc&MM3W|az#*C&fx6DA24Kqhp8va-(u(ZlkkWd_RC!lw*{(OI(k4GL6nb@*-%<&?$x> z7+6Ey-0z)8`j{79@?}mqPdPj+{sXiqqI}Ztkmp4~#b{MUdMbv-)Q==~fo=@xorQsl zKLQi^o`T5!D_#%wI`e2GhxA)Fsdi0iOc$_RP41k5hsN!uEJ=uFA$XbB3wSLw1{%~G z*`7vKNz~p$fKVFD9CqB%vd@w>UY#>4d%cj+HEerZh(2+DE^XWscPt*0zPD+DpDiFV zJ-r$kz^nxz8_)F9kc-cxJCJ8!;Ru5H5}ZS|%(GsnOxXgZxj4y0-xG5Az}PaL{p?>) zN#Y(Gl0>f67@^$K|7`KWwF-{3Ye*cn_gw!%JS3?3cLSx&rWMiHw>Xxzs;VfDZ!1lm zn_~41)H0J{v6C1jce)0-NK*c{a?${Djq3YT5LQ=mvu&&X@&wyP3&uX0X`&W^K93@J zyC<$3Auqm^cx%);>}sdh&1p5&2BlJ&;w!^xsRgh|=q#=6cG<`}wdqbCs?H!7x+rhW zqM`_^90)HZp4Pm9jg)TdF>ss6RU<1*cceepOOcFO!;`%qx?`Ude?pAwmNE(dBFH#y6G zh)W-u`z9-qxu32#sYP|R9nFXkzsJr-Qz9|msIjz;_*x3$goK^K4z;*urJc$+ME=R3 zd9NfVc|&j^fhBlVEDN%E5_avJBx;dLktQK8r@0}GI2LsNUI;vI09a!4eC-Yr;{@%_ zO*ph>(049s|4lcgrDqqAJWpN8=PF?({u#9QhbIGPOEOw3XE3~|!i17~P$C|wFH7yC z8qj+N(#2wpj`L8g)$1L&iaEAYLPU`1BZL2*=w8Ds39pquMMr)y0(l;#zBin$)!M*= zcBnB;1oavCD?ioSR+VYSz2(5&dtCTv6GHcDgXW-z|3UctUY7jjxk^vIU?acm27o>m znKR2n-;=jyLA-fE%-otOPm3m^ePn`>K~;u3KPg1q*|~7P9W_cuhp!@9An=C*!b!mc z;8&22y@C=kgum*rq3Hg?CCDV>+1i$rA5(>gWH$wM8)NVM9lc4x7U@x@ue8u-m;}Qk zg(a713t?v)fAjvAXpC5*uP%C?&1Szb8pr{+IIr-kPLOGF{p`YXc;Hyb%NyCRZokqn z@m^lD2#`{8ShRV&W{8Ici+X+>bagyk|L0Qk9R0ivZzlEX+A}WdevK1db}YVs6(8ha zM2R6?q-l-SGp6X&MDINLi8ciwl$7?d8MCTdPR(D<{i2XgvhfJI@GG^8^tb#3e)CPR z)Mk!X<@2mwz^>#p(WZ=BR_>4C+BUTJjUxMfL=pg4I!3g6O4M3~@tG|vjhO)SQ8I1$ zhoqT3=zP@J(mVfy!>B50i|}1T`(yFonj%KVFxd*!-_7b=AMI;KAP;H`28ouy3Fr$X z4?wBT%h~moH~1GHb~b>dWq9P8_mKSeZ<`8I({@^nzTX@a$M(%c7PN~r4noI!+J(iN zf9t0hvoG%lb_(mih)~O)`zLfTqrt3Mp>}__!=iHKK9lYAel(KcCeaI&UqTw3)Qs&W zR*l6*#`iP&z-KfR#k6Y~VdlUj;~~&SaX2bE9g1B91mK6@r$Y%J{!p#IF8y(>lSR zhlV5Ed_2*c7iiOPESxzfq>bIl^2yOGp`2z1s1Zho7ZDtotJ0(X`AdvmC{&xAi^!3) zgqLrFHNhYur7iFjq;A&T@_Re3_pEYZ1JaD%a$Z!D=+%ON`spPr=ez zucSsFnGVk1;?p$0I;0a=*-xiK>C+8ZJC21NbT(9KmEmQ6cuGEAfEZm4kN@eWAXu@q z$wNkbC~bZ#_mz`KvXD}{Bb6e$Lev`P#%w})(<*FvAv9TJdx&s-kDy=k4z{Dn&N5cW zDDLO+Y02C$P!Wgzg2hnCy=(NfF6?QdDO(gm!2udg^cF z27e-ga38EIwZ}CA*n2`t`u9M=$_`zCfXnfAyZ zhu}crnASS=$(2!TrBn?le-GJL%xZL$*`Fk8s&v=5-k#b!kLnlRW*3FjJ)k|1bKLtd zchY8fwkqs>{RD2)9@^74x)O2O))+{qfIhw_<33cVN(*w$hk`;92m4Ep`O8qzv3nX0 zUao8VeFM$LecT8aVwy3~jNy${t?MjxdZ`38pZ)&ZHsAyNMWA>er; zIZO>BPgfX5Gw~vkKX#Fn2cC}JZ@P;eJ)`IhvasK7neP1XMW2xU6V^A(m{;*@eJGG$1 z58FT}Y5HoXmg$OPHJ^g0y3ADF_~|(0+`XIW9?hXBZ04;{XCxK6N^6-=zM&4JTPTKI zrIVhac_jb_#;J=X?cMGxxQ>YW5KU?i#R7lUd$CJspR)XIL7`5>8^C$hN)RdoLUa?e zJ;w*uGWcjN>O|VmLrIw%E2C-wmRH~YRx68!bC^zjmD5~SjMkfWN&!v_Nz+}MVUk;8 zu2O+|0~TbJvM0|pm?;<*uLB7X0&W>+<-kl415JoR<+@1#ZKBROQKMv7X4AS%ylt=Q zY|$Og_X5XvS0`)V`o7<%javL_97a)QX1)sBVg^1)b@439dd~K2%rSQ>u(!p@cmqPK z0q0UFOLCtf>Xmk(8f;Qv;fSz%8ykQ(ZO@GM*?$8N9rFsV3N_?n4fprVui$?}2 z>vdoG=R}4WH~P`+C1F}BeZRORkCCogwRL|c--v+#4>RmtBZ~?O!9%OnYk=WMu4V9U za4;-WP~RKi1`X?(-1PiCSu75j-k4!&7=oWUDEhPLnhem(5PM^wB>&sY!&=(pafex# zx>bG4V~fES%Ii$82|4iN&jCNpEa|_O^iYIqpNW@7kigrZ;ad|NyRC#c16o4vj zSF>x^0#%?%c3*G_jBpWoDP1NfA;YnJRsh^O;CmGGK!-&oA#4%)UfB_{;4g-)n<0xu zp+@ctu1Rg9!%GeOIg%H(jh5&uZ7l`Ruly65yFMGJjgAT`Sxo%(MkJlbGn>FddT42D zVZ*o_od7V+_w{ak`{q(?l?N%6fkxR5CZ>lB`x>?`@NBC6gb*{m_+$+P)z>_=;40B1m2`oQ81Lc=T9|g zFmE4hNAP~t(*z8aTj?)d%9P4StPaJHd$7w)c}#q`u1mGX3rmf!6} zPKL}?ud~{}r?*!nz$%I2KAEFvZjuq`qfcPPIE!>{4BSQZUXpu~#p-E&bAHIv(VqFm z`2*RsN0pZ-zE0+)!M=?&8>HFfVjv_C$=0$OZ(5rN*u~J%cWV!ssA(kVucQ~yXHAu_ zfEww0h}n9_k>BItotxb;la9MNvLuWi*0H@V&7se`M1+5m@C+oJ4<}F{Z~QR3iKDT{ z?p#g})kfgi^v}nmXSSE{S@?ectKVjMc>Yo_AP@#_Js3(rAkevaLNlB;$fO~oA<&e=WUQeKI)H6@0MO=$>?Sxy76KIH z))ODA?y!M=Xkil5Ci2)x=`w*%l$vLm-U?|EWQM}R3oLX&+IJV_qS568G(>a%@-M3em+<41iCV`adfhyHrqfKvA*(!wjuE$CHaCN zu8J$PE8LLih9to692pT_9}fN3cOWm4*0~TyNF|!|u5fLaA%||Xm7SgtK1Fr50`T{=ITPU+yv0o?zRfO{dx=Q>$ON$aqL8K@;2;~P4*;uoHR+;3X z-5RyxUr5)R%N;Mz+!;k2r{_&kg6s1c!uA>5mobCXf66gECdT8AX&qf&BrD-5g(FfL z$1=p|f{fdD?*GnYkm{93-okJ`5mne?KB^H+-#a;@CDaM*;o%GYIp8G?IKZ(*kAs1= zW5f*{Bci?C_~ie;=@DJ%yWmCXv|l2%OG_x7Q5{wi$2)k9E4VHh5j?De^tzpk5!ov)Qe zPU-zNU?$vE-G=00b#A0Nh7WW+ARHsDC%{VaSFAxljB9>=rR_2%#mbqm)Owc4_Bgr^ z*=lW^u?KDZ*vWYcem1{KG+xRpJ=nOz5t}yIC*(w)rynZ999hCjf}O1hO9RAW?v_(9 z(JRS2kLf^SY<#M}2?I$e%}}Sjjsje?-oBN0oK6;1%^=+U@unM}DD964afY;B@&K)- zNYf7f;%1cI@Yo|I<0-k5{>a9SO9hXjSdaG!@=hzH&70>dAz@RoMB|`#+5GX{4t9HxzV8YXB=*nl5lhIQcv zn}cDVKPNFMfUe9lt9QqgY?))s;+0ro6Voy>h1c!57@a`gF?Q30L=J#o^{mI2%nAtQ zdx(Ej{r)Tuo<+xrqcMEXJ6#%i!H4Y4hK6&=x1VYvM_LmnFk%89i{x(>GM%>TIDABo zM%uafNnM#}zb>dTn_Lv%{SkmJ^i8gWRTI6EGXV}&33cWn=QqpSi6q(=^X(UvBN|@M zZL_AKaWn!#PgE#9Dn52Nm`l zk5Ql=UXqOv#68axJ3Gq2J7S0wTi^1`LetNpjXs_{wACR#x;Y`lZ%cL?N)EcVC;BTi zP3xj9AS;C$w3C*Sd~y!mkYDX0quEg|(xWlk*dPenUzboV3`DUX<^!8y5zkxxu8&i} zk(~N!_pglkLnUmF+HhPiNB`A+5_N zwXNPJlXOe_dWV7>BxjM_oslJzLTDU^mXToyC8jcFmqXl+j!5z?b<)z6gmGSqIKhBj zlrhrnrju{6uKbM8*rsXE6Qv7anx@4BV$2;K_UAPoag~nKX6;x0DSAV}jkb$TM?cDs zh0iJvkwEXI#m;deYOp>BI{|(w5pt3cItRr-wg^3H?J}>G^KnIF4jt*Uw~@4#EGY*1 z81}F8+B_n)%;S)nu^=`+5p^X=w>XOAU&Vfpi`Xf{pDl7s3lKukT#+NOjnj za(k?a)NZZK@~B6zVD52VX-trsvY~MxnJVI^(SYP`yki|35-{YkIB3LRI~(55VKTL0xX>xW6WPe&*T}~D3Vt#9$n7^9FxQx z?{bQ=;*e>d$97K=TS>|t9;o7C-Gu9P2V6q0i0#PZslWZk)33Sv3<{Izg+{ zAxPCEzTdn8Ogg@n%Bt5GWad(*1U~a7;KW|Xh)YekngRIjd-NCYx{N%1n(q&rV#(a9 zQhXgHsfvH}66qi}{~lIwB*jLrTuDDGdBCey_+At3c%K)D1s=8<(!?XTrz0fDm{D`d z=G!vQacUcV!2&crbgmDTZ^a(hxRH7G0PY9ot8lYCs~&J#n-r!f&?~2E&o;>M-^)JA z_!+#BdVn#>#5+5k%A+#Hrj11|L^Drkx<@~9=N zr^-#e&k5Bt_SC?-`+XxL35}c=v_gW5(8zj-0p^vv>!tkox1I&9pw>rOWwE^EOL>x% zmB#eQ^nCUQQVSwVqJnx4%k_Er9Lr&jB6*-T-V2$XjI|dXr1|5`%iVz;x}!31CKAR>F%)Xsl}zB zCPUJ>3s3ts;Y-f^AM#ocafa%P z?1tLAi=rzs<&Z8~r(3Amh8)?c&i1b)Sm~dcB8jEM&^aUfekJ z^ENPAv%NEeXrE&EA4IPx+s`UaDRE_e=Tto?5H{ip9-HBY_r`r_i`L`Ek$r8i?l7yg zyNcd)pLq?`pJw1r6Baaz6>kH*Ql_jld9qIf{6LDhM2}{BHB~au1-^cosUtq-`UfZ$ zis+xZ)5~9eO?bdQ2j`xCk|ooXqb(9Lr~C&8;)cIk6_%J;1o9y?z?n``Grk|zAiB!JikfT>d(*L6fI%eQ}{6SLqt5*7-@MAxX*ZT1n z9W3uu%XLdy%a)(8$c@DJv=yRb$%`UdSlsXK8a?@(&_`8QTs<~hzYg@7&osI>U(kL%AJG@3<8do zVUyfd>qY$B3^W|4x=I%LZ#z%<<=?mLbZ&R+mSyW zzHhX*X^9LCl{*a)g?o`gJ2?&S4P1T8mpjOa-6D)<_QGjsl0Y!&Zd#36ITxT^t z({);-jmcpxy@Aj0QpI6=NlCS8zip}JOw}rl!WP|Yd_r0{401wXN?S9LxKgurjH5z# zS4m5}xFx7+eG8HQye5M3qRP*D3E0lR4~P%XxKM6fyp+6GLun3x+7~LRphppE%X(hc zQ$z?yet}aQ@UVOhxW|!mLIdm#csP@f7nPdKMjJ{NoMnEEh?&5rI+|T3Z$gXMRfF3N zB6O2s6Efx0bfZG`fw1>-W&3FDJS^M7&k))U{>pR#{cN8<_XFtY*XmBPaLy2Q9GtAS zf7MgG8EmXzni^Gw)x7FG*N^-lqZrUk>YI8PdqZK+2NGBYh?5Fbin|4;ERjg7U79RD z3?2O$TA12it~dTQ*|AY5*Je>Ru%o*CK-+om_cPO0f272w4*xI_Gvvuxq&>~h%p2!= z4W&9j%qR1s%R1NM)l@{(!GL~Ds$-tVXOVv>v}m5+QpyS~pkqSh5Tw?SJEs<*AZH|k zYWyr&#F~a2%C=lFp$0@QJ|&)qCZ(pL&XFRGcZ%R8y3!r_-1|K16hO+mic1g+ouHnU zTaKee@U!~;fBl5507~=ra`e>bv7)f#Gyy$0{K7`iBW}{PN4O z9!36jA7fxF$zSbxQx#+HKSMP${Mi$y!oe%=9k4sCoj>Q1`v0RjChVPt7x5qdQmHt7 zbdDk!dz8r%XWq9uFg+o4tg*_*?iDs#x3r3ES(OBnmRl!n$ zdmHgdVb$Cmv8y;TSFblIDj@!MojOQ(T0zqV6Z3e$v6DtRZbK!#6C`FHpQen|_`x8l z%dTApx{4?r9j*$*HpZp`i}oyIgqs>; zGqfPXVAMAfj>LyuZ;p2g5#DtsiG)b%cF6=(5u&RIb3CE_i)oBy^{&}ddZ-pcAKTr_ zF`l+3(8n8exj+tdbaGv~rQs(%mxMSaCc`OcU+W3OnFRk}XxZyX$a&i6WWg>>Jw_0N7`^Ba{tiEyDY7|Rmql5?=vG!G)s z_od|4rp8lWJ7%IMbbT2hlmzD$(WDg=&_XvMRt0ISkFCX_5z62RolQ9wdO(!LnEfi0 z>Tg^709s7_>s1=1(@0ruz|wU&6Bk;@EP*=S{1Y5^Dl>SevyHCuXkt2&C)BAVrWFF? z8P`}e?N!e0l~`sPC|&d$e0FYn3$)l}Xoiz(Z3-qSK7v-p6fu2=u7R?H?>=nKek-FD z*o&)10*_4VQre<(_({*UFOWJF3u`elSP!srrUem{pj?_{{qmIzl)CB8#l|E`r=vxN zAdRuMeJBu2jj9f!J=-NQa^IMeTC3T9ef9H`QM)OJB02`S;N>-jz`{8N`NYE6OaR%F zL0^Xwe(vf`UyP=IqK+ToXD_oJO;I;WI3qyrc-(CT`%x? z#h9K*H{DMNr)fqhUHkZj`m)PMWJ|Zm%v$`6j}tDMl>In7c}CXlF6VQcPFne-h^dcs z{+zlq*~dW+NVA)i;ZKaAfTLV8hQ~C9y%^l_^(B8&Itl-0D$O=fJ@lXbG|we#ek;~w zs1^8t7&1I39%#D-^<1!QU%U8&wG=fqgeG7*yx6v@-u})w{4bh zc~sQ#YsY;BP;s%H2k`ql7w58{VQ1z3?~#ZsCe_i1jB9*PERKjb*~1AjJ2LD`b=LIL zcq}S`>P`4Suok6`D*ingo(NLBfzdl~i;>S^m*MnjljiHGou|hZQ!DaY?9N$+UP718 z=_#dmCbrHt9t7C?Qe}RZ`%OI2w;t?p7(hF3t&X-qEfeLp1HHgse`=0mDwUZ(1wLte z?0E@8`nuM+m4(spw4hhB0L$d7k1A@?3#@Z{JX7@TmBk3@Q0qQt;7TdycooTwngZJGXn=H$=v%0jC@w>PpXfE(Z)~?4N=I{Eb~SC0tq+$({lXV= zO_(g%DP$$cjKK=eMobs2Wj7!n)ZBXbM`0RbAbXeoP~^)yP88GK=rRqPIR>PR8bs*j zi>?%e7MuAq~#MnOYw4Y>>w6)h)`YG*3AY{T||AbeMjdr zifIWFs2G(0AXaL9%p*`J2~HKO?#{;I3JcU|TF%=d2TWo!(D5!*ZC}#)*Y_Ja=VOub zxUa6uaI8Y_LlogUl>pA`k$p7$MFZ&_b5y_vLedo!zADg}q6gtx1`&DEYGZ=n7XPk15ZF|GDXi=&Sb3 zWt84Dj{JLWvWp76CU4xM8Z8Ow(DL&@IUv21=fGH!O#7_3|A6oFgh*8NMsxvZ?Ut7) z__1c)!1sth#PP|sFU{khd1A6;SJhDG8X9$iVK$Vc6ikSea5g#4RQW;QET5sg zGg9cuJMhK&k3)WbNh;cGim+-WiGMisMV)a@aIl>sFY%@JyHwx;Yht1XPF0sUq^z3m z&MHTOCgK;;bIrjVFMte>GV!^x)_RND=X_4Gg?$d0o4DIY)4Iwuo1xQXL=8-101+oF zsYKcd#}wN$sr!tI#qxqD4?h239^r%ZCQP43SYGrlNdHd*W}c{ojR%}&e!OIJ#Lo-( zW`N*BDPNWO74RYR|%I~H{v!}K*DQD{CaxI=oZ;>{N+>7j&%6k`E! zi4h$ly?_H2Tv!w@;}1wVn)+b^R~N;?pr~+Rkv#Dm0{vRW;h+BrlptGFG>FnPI&cNj zAjdl runApp(MyApp()); @@ -6,6 +7,7 @@ void main() => runApp(MyApp()); class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { + SystemChrome.setEnabledSystemUIOverlays([]); return MaterialApp( title: 'Geo Smart App', theme: ThemeData( diff --git a/lib/model/response.dart b/lib/model/response.dart index 8e85890..0e151a6 100644 --- a/lib/model/response.dart +++ b/lib/model/response.dart @@ -7,6 +7,10 @@ class ResponseModel { status = json['status']; } + ResponseModel.fromNull() { + status = "Error"; + } + Map toJson() { final Map data = new Map(); data['status'] = this.status; diff --git a/lib/model/setting.dart b/lib/model/setting.dart index 3875178..1c4a1a7 100644 --- a/lib/model/setting.dart +++ b/lib/model/setting.dart @@ -2,5 +2,19 @@ class SettingModel { String host = ""; String id = ""; - SettingModel(this.host); + SettingModel(this.host, this.id); + + bool isNullHost() { + return (this.host == "" || this.host == null); + } + + bool isNullId() { + return (this.id == "" || this.id == null); + } + + bool isNullHostId(String operator) { + return (operator == "and") + ? isNullHost() && isNullId() + : isNullHost() || isNullId(); + } } diff --git a/lib/page/map.dart b/lib/page/map.dart index 6104806..59ec18f 100644 --- a/lib/page/map.dart +++ b/lib/page/map.dart @@ -5,9 +5,8 @@ import 'package:flutter/material.dart'; import 'package:geo_app/bloc/position_bloc.dart'; import 'package:geo_app/bloc/setting.dart'; import 'package:geo_app/model/position.dart'; +import 'package:geo_app/page/setting.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; -import 'package:flutter_background_geolocation/flutter_background_geolocation.dart' - as bg; class Map extends StatefulWidget { Map({Key key, this.title}) : super(key: key); @@ -33,10 +32,23 @@ class _MapState extends State { String id; String host; + bool isGranted = false; + bool isTracking = false; + @override void initState() { - BackgroundLocation.startLocationService(); super.initState(); + BackgroundLocation.checkPermissions(); + BackgroundLocation.getPermissions( + onDenied: () { + isGranted = false; + print("Denied"); + }, + onGranted: () { + isGranted = true; + print("Granted"); + }, + ); _settingBloc = new SettingBloc(); _settingBloc.getSetting(); @@ -45,51 +57,65 @@ class _MapState extends State { this.id = settingModel.id; this.host = settingModel.host; + if (settingModel.isNullId()) { + Navigator.of(context).pushReplacement(new MaterialPageRoute( + builder: (BuildContext context) => Setting(), + )); + } + if (this.host != null && this.host != "") { setState(() { _positionBloc = new PositionBloc(settingModel); }); } }); - bg.BackgroundGeolocation.onLocation((bg.Location location) { - print('[location] - $location'); - }); - bg.BackgroundGeolocation.ready( - bg.Config( - desiredAccuracy: bg.Config.DESIRED_ACCURACY_HIGH, - distanceFilter: 10.0, - stopOnTerminate: false, - startOnBoot: true, - debug: true, - logLevel: bg.Config.LOG_LEVEL_VERBOSE), - ).then((bg.State state) { - if (!state.enabled) { - bg.BackgroundGeolocation.start(); - } - }); - BackgroundLocation.getLocationUpdates((location) async { - print("Location Update"); - setState(() { - this.latitude = location.latitude; - this.longitude = location.longitude; - this.accuracy = location.accuracy; - this.altitude = location.altitude; - this.bearing = location.bearing; - this.speed = location.speed; - if (this._position != null) { - if (this._position.isValid()) { - print("VALID"); - if (_positionBloc != null) { - print("SEND"); - _positionBloc.sendPosition( - this._position.lat.toString(), - this._position.lng.toString(), - ); - } + BackgroundLocation.getLocationUpdates((location) async { + if (!isTracking) { + this.isTracking = true; + } + if (!isGranted) { + this.isGranted = true; + } + print("Location Updated"); + this.latitude = location.latitude; + this.longitude = location.longitude; + this.accuracy = location.accuracy; + this.altitude = location.altitude; + this.bearing = location.bearing; + this.speed = location.speed; + + if (this.id != null) { + this._position = Position( + id: this.id, + lat: this.latitude.toString(), + lng: this.longitude.toString(), + type: "user", + ); + } else { + BackgroundLocation.stopLocationService(); + Navigator.of(context).pushReplacement(new MaterialPageRoute( + builder: (BuildContext context) => Setting(), + )); + } + + if (this._position != null) { + if (this._position.isValid()) { + print("Valid Position"); + if (_positionBloc != null) { + print("Send Position " + + this._position.lat.toString() + + ", " + + this._position.lng.toString()); + _positionBloc.sendPosition( + this._position.lat.toString(), + this._position.lng.toString(), + ); } + } else { + print("Invalid Position"); } - }); + } }); } @@ -110,17 +136,51 @@ class _MapState extends State { myLocationButtonEnabled: true, onMapCreated: (GoogleMapController controller) { _controller.complete(controller); - print("Map Created"); }, ), + Container( + child: Image.asset("assets/images/logo.png"), + width: 70, + height: 70, + alignment: Alignment.topLeft, + margin: EdgeInsets.only(left: 10.0), + ), + Container( + child: FlatButton( + color: (isTracking) ? Colors.redAccent : Colors.green, + onPressed: toggleTracking, + child: Text( + (isTracking) ? "Stop Tracking" : "Start Tracking", + style: TextStyle(color: Colors.white), + ), + ), + margin: EdgeInsets.only(bottom: 50.0), + alignment: Alignment.bottomCenter, + ) ], ), ); } + toggleTracking() { + if (isGranted) { + if (isTracking) { + BackgroundLocation.stopLocationService(); + } else { + BackgroundLocation.startLocationService(); + } + setState(() { + isTracking = !isTracking; + }); + } else { + print("Access Denied"); + } + } + @override void dispose() { - BackgroundLocation.stopLocationService(); + print("Disposed"); super.dispose(); + BackgroundLocation.stopLocationService(); } } diff --git a/lib/page/setting.dart b/lib/page/setting.dart index d2ebf58..9830066 100644 --- a/lib/page/setting.dart +++ b/lib/page/setting.dart @@ -2,6 +2,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:geo_app/bloc/setting.dart'; import 'package:geo_app/bloc/unique_id_bloc.dart'; +import 'package:geo_app/config.dart'; import 'package:geo_app/model/setting.dart'; import 'package:geo_app/page/map.dart'; @@ -25,23 +26,39 @@ class _SettingState extends State { _settingBloc.getSetting(); + if (!Config.dynamicHostSetting) { + _settingBloc.setSetting(new SettingModel(Config.api, null)); + } + _settingBloc.subject.listen((settingModel) { - this.id = settingModel.id; - this.host = settingModel.host; + if (!settingModel.isNullId()) { + this.id = settingModel.id; + } + if (!settingModel.isNullHost()) { + this.host = settingModel.host; + } _hostController.text = this.host; - if (this.host != null && this.host != "") { + if (settingModel.isNullId()) { + print("Requesting Unique ID"); _uniqueIDBloc = new UniqueIDBloc(settingModel); _uniqueIDBloc.getUniqueID(); } if (_uniqueIDBloc != null) { this._uniqueIDBloc.subject.listen((uniqueId) { + print("Your Unique ID " + uniqueId.id.toString()); if (uniqueId.id != null && uniqueId.id != "") { - Navigator.of(context).pushReplacement(new MaterialPageRoute( - builder: (BuildContext context) => Map(), - )); + if (!settingModel.isNullId()) { + Navigator.of(context).pushReplacement(new MaterialPageRoute( + builder: (BuildContext context) => Map(), + )); + } else { + this._settingBloc.setSetting( + new SettingModel(this._hostController.text, uniqueId.id), + ); + } } }); } @@ -78,7 +95,7 @@ class _SettingState extends State { FlatButton( onPressed: () { this._settingBloc.setSetting( - new SettingModel(this._hostController.text), + new SettingModel(this._hostController.text, null), ); }, child: Text("Save"), diff --git a/lib/page/startup.dart b/lib/page/startup.dart index ec2ddb2..e4ff4c5 100644 --- a/lib/page/startup.dart +++ b/lib/page/startup.dart @@ -2,8 +2,8 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:geo_app/bloc/setting.dart'; import 'package:geo_app/component/loader.dart'; -import 'package:geo_app/page/setting.dart'; import 'package:geo_app/page/map.dart'; +import 'package:geo_app/page/setting.dart'; class Startup extends StatefulWidget { @override @@ -22,8 +22,7 @@ class _StartupState extends State { _settingBloc.getSetting(); _settingBloc.subject.listen((settingModel) { - if ((settingModel.host == "" || settingModel.host == null) && - (settingModel.id == "" || settingModel.id == null)) { + if (settingModel.isNullHost() && settingModel.isNullId()) { Navigator.of(context).pushReplacement(new MaterialPageRoute( builder: (BuildContext context) => Setting(), )); diff --git a/lib/provider/position_provider.dart b/lib/provider/position_provider.dart index f9dd1a5..8be6737 100644 --- a/lib/provider/position_provider.dart +++ b/lib/provider/position_provider.dart @@ -23,6 +23,7 @@ class PositionProvider { ); return ResponseModel.fromJson(response.data); } on DioError catch (e) { + print(e); return ResponseModel.fromJson(e.response.data); } } diff --git a/pubspec.lock b/pubspec.lock index 118a21c..67e8050 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + _fe_analyzer_shared: + dependency: transitive + description: + name: _fe_analyzer_shared + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" adhara_socket_io: dependency: "direct main" description: @@ -14,7 +21,7 @@ packages: name: analyzer url: "https://pub.dartlang.org" source: hosted - version: "0.38.5" + version: "0.39.2+1" archive: dependency: transitive description: @@ -36,13 +43,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.4.0" - background_fetch: - dependency: transitive - description: - name: background_fetch - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.2" background_location: dependency: "direct main" description: @@ -133,19 +133,12 @@ packages: name: dio url: "https://pub.dartlang.org" source: hosted - version: "3.0.7" + version: "3.0.8" flutter: dependency: "direct main" description: flutter source: sdk version: "0.0.0" - flutter_background_geolocation: - dependency: "direct main" - description: - name: flutter_background_geolocation - url: "https://pub.dartlang.org" - source: hosted - version: "1.4.5" flutter_test: dependency: "direct dev" description: flutter @@ -156,13 +149,6 @@ packages: description: flutter source: sdk version: "0.0.0" - front_end: - dependency: transitive - description: - name: front_end - url: "https://pub.dartlang.org" - source: hosted - version: "0.1.27" glob: dependency: transitive description: @@ -190,7 +176,7 @@ packages: name: http url: "https://pub.dartlang.org" source: hosted - version: "0.12.0+2" + version: "0.12.0+3" http_parser: dependency: transitive description: @@ -218,21 +204,14 @@ packages: name: json_annotation url: "https://pub.dartlang.org" source: hosted - version: "3.0.0" + version: "3.0.1" json_serializable: dependency: "direct main" description: name: json_serializable url: "https://pub.dartlang.org" source: hosted - version: "3.2.3" - kernel: - dependency: transitive - description: - name: kernel - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.27" + version: "3.2.5" logging: dependency: transitive description: @@ -370,7 +349,7 @@ packages: name: source_gen url: "https://pub.dartlang.org" source: hosted - version: "0.9.4+6" + version: "0.9.4+7" source_span: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index b45659a..a3b18fb 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,15 +23,14 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^0.1.2 - google_maps_flutter: ^0.5.21+8 - background_location: ^0.0.9+1 + google_maps_flutter: ^0.5.21+15 + background_location: ^0.0.9 adhara_socket_io: ^0.4.1 http: ^0.12.0+2 json_serializable: ^3.2.3 - shared_preferences: ^0.5.4+3 + shared_preferences: ^0.5.6 rxdart: ^0.23.1 dio: ^3.0.7 - flutter_background_geolocation: ^1.4.5 dev_dependencies: flutter_test: @@ -52,6 +51,7 @@ flutter: # To add assets to your application, add an assets section, like this: assets: - assets/images/server.png + - assets/images/logo.png # An image asset can refer to one or more resolution-specific "variants", see # https://flutter.dev/assets-and-images/#resolution-aware.