From 3a8c8a240e97bc6158925cde3efd6fa3738dc0ac Mon Sep 17 00:00:00 2001 From: David Zumbrunnen Date: Sun, 15 Feb 2015 13:35:08 +0100 Subject: [PATCH 01/11] Improved launcher and status bar icons --- ServiceApp/res/drawable-hdpi/ic_launcher.png | Bin 432 -> 5314 bytes .../res/drawable-hdpi/ic_stat_notify.png | Bin 0 -> 2065 bytes ServiceApp/res/drawable-mdpi/ic_launcher.png | Bin 327 -> 3216 bytes .../res/drawable-mdpi/ic_stat_notify.png | Bin 0 -> 1348 bytes ServiceApp/res/drawable-xhdpi/ic_launcher.png | Bin 484 -> 7772 bytes .../res/drawable-xhdpi/ic_stat_notify.png | Bin 0 -> 2878 bytes .../res/drawable-xxhdpi/ic_launcher.png | Bin 591 -> 13290 bytes .../res/drawable-xxhdpi/ic_stat_notify.png | Bin 0 -> 4390 bytes .../android/api/DroidPlannerService.java | 2 +- 9 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 ServiceApp/res/drawable-hdpi/ic_stat_notify.png create mode 100644 ServiceApp/res/drawable-mdpi/ic_stat_notify.png create mode 100644 ServiceApp/res/drawable-xhdpi/ic_stat_notify.png create mode 100644 ServiceApp/res/drawable-xxhdpi/ic_stat_notify.png diff --git a/ServiceApp/res/drawable-hdpi/ic_launcher.png b/ServiceApp/res/drawable-hdpi/ic_launcher.png index 6acfd527e7b163fd892d4e8859d71977ffa1c001..d70fb7aebfd9ddcaca8fc5c27d6521aef8f0f1e4 100644 GIT binary patch literal 5314 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 Ugt-Cbb^rhX07*qoM6N<$f@q^kh5!Hn delta 406 zcmV;H0crliDX;^OB!3xnMObuGZ)S9NVRB^vL1b@YWgtmyVP|DhWnpA_ami&o0003} zNkl%Faw$3umYLk zFanw4umPFlFad4BVFB8P!vM4u2OVfT4l)n~4k{1~4k8c~4jK>~4iXR~4hj$~4gwG~ z&Tb%hoSi@vIDfl(c@?Wxxmo^a)YA*R0~88p6et|d2vA6zUZAizJwTyxT0r4( zYCwro0ZN<-P~ud85~l)`IHk_(c&9?Sp8x{@()WDgcn^j7wEzGB07*qoM6N<$f`Bxg AegFUf diff --git a/ServiceApp/res/drawable-hdpi/ic_stat_notify.png b/ServiceApp/res/drawable-hdpi/ic_stat_notify.png new file mode 100644 index 0000000000000000000000000000000000000000..71ac52a64bb5f2f433712ebcfedf4b59fb631502 GIT binary patch literal 2065 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 literal 0 HcmV?d00001 diff --git a/ServiceApp/res/drawable-xhdpi/ic_launcher.png b/ServiceApp/res/drawable-xhdpi/ic_launcher.png index 990fbd01384c3ceab322337e6ca0710e334218ea..9f61f15aa92f4a55ee38abd4689f4c0a1a5482f2 100644 GIT binary patch literal 7772 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 literal 0 HcmV?d00001 diff --git a/ServiceApp/res/drawable-xxhdpi/ic_launcher.png b/ServiceApp/res/drawable-xxhdpi/ic_launcher.png index e4ef3bf5c4ddb24ef46232fd67f618085390ca40..c90b2c171c75abd9b954d1713acc0b8f941926a1 100644 GIT binary patch literal 13290 zcmV$uE_peW*iabXh(0tQePA%H*<5<=)CorI**Ypu8L zz304t+^SA@(o1z$Rac_(`+WLSN%y_?Jonb`KIb{lc^09y=6~_Om?>nn1^8ba-7u>y zK&2pr01$v4^~r2#-2B*M@Yky8|Ee^Q5CV}0AYiosWd2hGhaCRpmV10auzI!3k1b)% zh*+b4{u=OCp@Bwe8|dm13=Ij=b&}j(f$9{z_Dqupw&sXN728fyLWr_!qY)Wau9OT6 zNbF-x8haFSug2c0u{$(PO^OX03WMqbiH>INB#u_$N4>$p8^3a;U|>L!jY`7OAm>Ov zef0^nc3g%PdJ}*7{fYeO8@<#ipYCo2sB+!=2zfd?C4+{6>6=_}_x&jU1^V}1&9~q2 zAinPtjrye1Dj@PUO)#yF5#nh3K8`v9jny^?`Z^?;T7ffc&>#$!o>9a3AH9&;rpqwx zu8|Xm`@h2H&%P36=a^%5)}F;k2TmL9ub8Dja$6lq385Iid+PM%x5agdh=>4 z=Z_5TzlLkScniBSf3%Ii zJLA2?YTt!4+KRq#YUmGq@!WUe=7y2+EC=R!uwKuUL1VN}E*(OoYxu%1K10jGj~9Ir zzj`(I{%kWcmLlxrO0k6k?Xyx+pR%yc2+?Q*U%Tm#nAW`M%Z7)O{vG>w zUCnp?{sEM9i7KCLwlKYo7~Mz8cLqlYfkvD&U0s5{K1nJj$t5Iq+~oBaHn8f#OR1@U z4~DtCNVLL2fY1zGHn@Kcf|y5N{LkkU?uGgjO|t=s(`V@|S+UWEp+; zSrUUkX8r&Cf_r~CM6}k!5kB#>qP<&Gs^ z%Z=y%@+toNqu1k-#B_4(S?}(6;nq6k&w2 zNZSS--7+tW9P=|~JEE`^^0wf(&Q3|AX<+##+Os+N)$gQIfkt7vNb34j0nO?>{E zQ%IU7ot+imo|y_&BhbiO+}0+sw8?G%mBr0&nU%pKHC?>vL&u|K2-CL!ljfBst*r*F zFEMCt4*tKfH~4JsHEC_l|7;14>r*C%XJNY`7OiZczU6SgPbDCTvhLblnA#+fkkC~y z0jh#(?u7+6oy|%@+CptgJ#d2+n$IjQNY= z#2e#8YHIM@9GPT_WPg%fTarBay9}u~NMDfC7N!y9{Exf^X~btm?ty)`vgwZ+BV>^? zTvlck8>gOnD}}1rKtc#XSC?S>fQ9Wvv1A>g+7`b2+dDAr!#&C6hE@&-cK@7MT`P8E zF^0JiA!?ZVZB{5XfbZ?V&F&;Mw1@iE3$g6E6_*(_H-GOU9{A$c2v zQB4h`*|0&-*$BxNjhEHA{uYl2bn_{4$u5)H~o7btFl~29&*_}ZvO852uJ4z%*P>)KmEWP)cTT^#LGS67ttvy!MPf$~~N6HhC0 z+C!=w%Fp6^X}+CfPVJE03Z^?%Er=m2$f8aw8bkuK8A zB1MKfuelxN=c+B*5rHS~z8ORYC9+`Th-r_8h9hF3aU>8Zc$2~@g)KZhl|%bkc5OMp z{+$n2TezwtJ-m}UuYCfQ*FGV`BULjxyrZh9I)O&iZ(W@x>-t#21Cc}E@aVeVRad$r z0M9*s2SPgtnFHzKYoEyQ2zja<(NT2*jbI}nB)C$cw4%02aPq6qsJ2*DN6W%R)HVpD z=OcZEOl!>Us%xGCj)ZWId;;KBgSk-)A)>tL|D3>S=Y5}0bVb#KJCcx1ZRQU*ewe#{ zwh>5SWO6Lu)Wrz zie=F;k3IP1NKcw6N+OUDV%kRBm}#pmVW5UA{A`%7-26!zT0Tz|V_S|AX!>9LI^TTz z|3hW6FwbSr2A?Vg+)tZ8ha~wGP}GWGjOJ-=H4t$NPeu6GoBl5~4Kvvp|J%iI-}m{_ zxtC*vv*?7&vB&!PVEZXabVvka;XgB4)lF*^cChLNl9eliA37ynT@sK73u8ZNFyFZSTNo;Wh+AykYUHC6C&ZZQAs`|6-stKog!4{2JhmuX zW9(|FN6;KH_|Q*JV$*%k(es@&FAQl~TNROrrm1P9`UPVhU3r^ltAUEz@4PHoeN zrX_KiQ7=4Nq)Vf8X_78Y!lOyLG)j*q5d_@yX^Vbk(x)u?bnw})EcPplL0v_2t)}69 zeD215eC48VV*_n_Vb5yv&woS{jnVvFU9fMT#BCI~LlV6N&iO(EJ^#>0Jg(T*u7wZ^ ziql3#O<`lQC#W}>w>Zp4zOxC4;$;4Zotv)VnvZQkDUX^OpHxawSEmp0mI~TWm#97) z*AMf#Yv04%jw_gDn@0f4jWnlP2~M|$S!85Oy50^y%tLN1kGOHR`q65*hBbS)f1Gc= z@8{Ur3}T^6&qIgq(&y8{6A~w45Hbwfj}LL#<>wJ^d>_(S$<0?R=l8dz^3_XOxe3>KfWh8txb_RTjmhyWbIv7iy5xG;2p3qrj_#q{?co12@-WHKa^$!VXP){@^k&HTohLq^Yn!(Xc;f4<{v zZn*Lpgr6hqDFzgTErXhv#fQH8YMSO-<3)MPN4q%v&FhM|BNr$0J6`O*n(uz_VU#avT@mLKKe!n?eEihs&m0Dt zH-!4RB)p$`F>`IRYSk*z=`@c%_86uyGi5obO|H+jaHrFVUulixI-9uiL+7$@O9J2W zdF`c*ocZQUh}FLb!(2S&`H$Uo9yfgbA(C#IM$;{3Dw~u*LI}a?)q>6a23|Id<<@ff zul}9-mW!u#V_xoA_V4-yvD)LQYku3b&YdP!S;M?1@*?x4Q_^)>TU$B#AjX}a} zIY=acOT+v4Y-}fX8OdKV?C=ua{V!*LZ<9+Jbo5DBGvOm1mq7WYyI@W%D12b}A(ou* z&WZ^=P0W!lSJZ6h%rZ{{LWmLV1HtmOFpU8mbIdU#|1JlK0M4|AxT0n|bEG@UDc+8P5SJpgFr;#c9wdc;A zOHIweFr-5X)Y8(zoTjFc|CftIokoT$Yo0%HNK{k*YR3RYC(Ok;-; zC^%>hw526>%*2v5XIywOqWUp9woqIi+d)$W9<&gG&d#wj^q~ZTgSJos^y+c7&;%N2lOz+C2+txGkJ8vyQQu855WuIRJr&VB0Q2U} z8>4+-d;&GknM3oOIb(iTPEGWwXwQ*hSU0t;!H!38FtKd|ddJm5;}B?#fFXgUO@y*| z_t(zBv|0{7Zg%mG@cy#fJOzxWePDb7!Qom6%4-w7BfP)l>y!-Bn#+5?@p>?AG8u#R zAu-;Pehh&Ec5N3lh7EGs!XU)_WtYsB%oAaiHN++1eHFWYTU#5k*x~LiH35OOjGDx1Y+9W6k>iNOUpD)a zAH)(P%Rg06txu$V0GNP4FuoRo@-6ZIDcZx55<^W&Mzr>H&b_P??b{@5vtUe*#%K)` z?0dyx5}|^^kte*O>Pz>JM0S_eNq8vQ+S-Ul$FCx+)Wig8YHXynwRPOTmCM=qk;v|n zu2BXEPJYch!LX6iU}(rV)R>kq$}sBf6~RHuV);o8)HT1UDq`oc${H@)_QZIYRQmuh zF@XS%8|4=|6y@6XSY-{Dbd8cx-*P^4m&S3hh{fcg#`HlAv}O&22PB4JpnaS3KD-8L zR4q5lK=YnRWh=bQpFe*>?E`@)dNKkvG&C@G?!=`L%R!>|L|(+GW(vGv*7LScy%|iK zv@mEJ7_&cikU(p<3tosyvSAY?Y+4pozE0sJctfbaLl<8;(2eQiNsV zmgwv4-!^sIvQkKN zL8uq2nzm59@wGH92;&+FGwU0+JcNhh6zX->VhmrN#cU6=a$`YDgCjmO#k!V6O#r<4lbTsgf*Y6;D= zev~~bG_CVWMmDvN?v4M$um0nU^la+K#KG(L*&J1{H=h-^Ar8$u!M8P`kO#u$&TAg$ z&TC$veffM|_ukjC^u)6W$0}Yy{?rODTNf-?Ksa1nIBBs{7(i`pE$#E?)3bYO-;L`9 z)AMx0V^6h)dDNYSjtW{UdUrj|lYh92yMFR8O7|oEKBQ1+Lu1SvQHA+C=!V8dfrtoP zUt(whMo>9nxG%#K_dLsezq}V|?4h`XLKlW_U1bNCiY*^tW)v+ePFS^KT4xa9|T@cfg{gFl28 z!$^_DG}Gi%j^3mXTQ#5yuYh29fna_gWGs!eG@kG=bfAqOhgLbBd%TASe*GXlTOXrt zj-a-2F4CC1x$HEs!bo#LxUXE7I}8gKE}U}3G#ZIS0wqBvUDdhl|sq z(r7B6N&oe}=W+T1S0zJ;$DQZmIWldIjyD1q&7s3Qf-doe65%AjYnY#9$KQjS7Pf7;haZ0W282qYWD;~5K^mRDGNUJPiJA?8iiTXGWgoTmpQ^YHz<}7@^Ku+yl%w-Ml??WBT|gIS)DHrB3QLXv1yZJXvoJ6d!(d` zWjNqEgbWu@2yIYPU$SM_Qo(rOg$ox>Tl>Jw2^5RPShR2<-8*(n>%3w~)FNF5{SpaO z+t`ZM!w3dZVhGbp<2ykkm#FWP$@#?NiY;4$3M<{?7oZwfib4y5{En;78U)+B6n%X@ z$&iQe71{vlnTvM`6ZLAQ1W~zN)<^+O+T4=iG7ek^(>4IOJBXmN9qOC}gL8~N) z6pqMHBV2NhkGUt9h4!u1@Rdn(<0m!$wbsGUFSTaF21R$bPpj$U4Y>$E2g1d$eN3z5 zgzriO$^$G~v^x9&CMEnfxn=<%>nkumOWf%sF7f)T3Vj`5HfgsRA z)AcwPFd2!;^sEH)SAzw}GtzQr91CiBuK=XpK&>IB6KWTG~@FpB2n3%RrA6cOc#UzX&f|yr(yihO;u+Jd$+cS>8mD!uZTJu=~LTL7E z%}|Eci+yFN_-eI%^4wvRrx7yv8RZ9> z4yHw*z`?Xuz{% zKC79KD3jQOB8b+H0L`k9^FA#Ly(j{W>h>a`PvSWe-;!u0K}%9YCD&dV)FwM-SUcIa zZ5EZVWiTNsKp=q5rAue*X4vJ285+-CoGyuygL?tcN}_y0UEK(Irql9iQUZ%t@`>@#46C?TLi@nv)j3LmWmznnp%(h{WLX*0 zAyHfBYxwYYE?~hiaZnb+zDZ-JNk@l4S689;+m!vo4x{oYZ4-PJ+63)R8Q39%j=ziY zw$GkVee?UU!>1J|ZE<+Sjq~C&Zad;WQHx!knQd(@qx z-i4Rn<}jwPv+QsyohN;fkN(%kNDcmy7oNU~pM7}?Iol(d^k{D%Y1wsX|FO{+Gs+0v zR<9OxcT18XNhWFF+a@3QatF&_`aUAHmmpQlFo%jHO=eA?Q4 zqESVA`?y3h;gF7YbPAr?Yhc?ZbrFjX|LAoz&btgd{2In<6I4cM;9;+pbL`@(QG`Mv z7A&Y-7Pi)b_EAbzgrrNCEaACr+ltmgk9zUqmr2thQ2>D*K8u!xXYu(Pc9RL=bX3Gb&GDgtRA(6`9ynk%vxU=3vwD!FiMn|y{lmm~r#S^HK z+6NBC#Z-zwrfIT#*)pElxUs0?ADeDg>hwtzKpOLjH-4To&;K+pd;P8S?fxPEe%YUx zdJs8Ix}6qYVo zQdGcyMoXTW%KjM-C3&ocMJRe9ZOhj2?R)QMK}RJ2CXF=cl_S$vTb;z}H`)G>BsEw> zL%GVpMHH33yL9Q&8HbA&3q1=2G7N*|%cd^HbgMIG<}EZ!-}Zo9wugONEQWlOwzfjy z@lnh8TvA|411)VHzxy|(jaC|d1 z4}WrNdDc7VIGauF1GB4v06G>eB08${-c~Ql!<8y1RV<12KEIycT|@Xfhn6m`uZRvQ z)&_r;2fd1QnoLF^j2zO)g2-_H+FK|?uvjVhUS>W{UQu>-c9z{EJQ)hh_;Q7{PKD80 zD5oVq%oJbCXhtZ8M1Q*ZW{_Eg&Z1qHtn#U=3-aX|t%2B}iAH^VJfzMc{0vXr^8y3= zo~rC!Opfh-m@CrlM50mV&!1nhag&J;&pZKS44X%;1|gZ|13|pXP<` zZVvSI;W(A6U%hDILL$*9-$~D>dp0^dPe!7_-e-9Dw&&0?gVYXMx`fk;4I4%ZEsR|& z*VSour+l=`AyiOsX!Aq2^78XfsQ8Ucf2)OeRSrlOz)fh7$?W z>GX)k84W{7`uqFo?;q;aOa6Uyk{1>^-Scke)f^u zK%|j=25IDoDxX+`V$YtDL&g@EYHrpXIN;-1E|%pW{0ujJ?*U%=`abMPiH?Ywqcd*u z@&&~YuaqL4PUi`dB#}svNG5`shwk)}@_el@gv8flr!m)c$0e4OlA2hInsLZgY`E>2 z9nCC#BF*!OS!{uMD2Z~}es22D^+=gPdJb4FDNE74ab)^}L-)eguh-D2n4j@b%0Y_^ zo|9td=5=(QT(y?pUs_p=amLoPju zG;eTTK%@qytxZb7bVxK2GTAJdY?l4KV+*O9riqHxv(8#fdu@bc>TFJI4AD_z(Vd*- zM!cR2TKn96-EE-LNU~t$aJ0|dZdE8WH6r`rSJZ%&hUYfy;XuzLG%tAh zY~4oz-6@xs+_Do!t%Por^?Wv#V2Lri54Rj78V_3?i*NQf(x=iu<=R^njr}|R%+?LN zkt&0f4xaP~rxY6wuTnO~BRBGgo;r==`{3nJWI<>6%lcbq@fJowfMvrd=V70+_(HOS z2WJ=pTM7y!Di3yPqD_gzNd)k)Tg&H?i`nXxrPfu^meR{Ad2>->&4j$M2uk zx#MDd5_S7wK9^j~w^9q)JBuA{iY3ur72;c|g?ui#xUwGR9h)BEv30*DIXL}n;eFlr z(Yx~inher#z;vl`6pUZu7bYq5D};ciCdKycK6Y&mNfs^AJbK41y!j)qnNpZ^qL;0Y z-p8HS+|T}92@ry(?|+WZUB8%kV~NpVc@nv~F{?9xhut`jx;4BeG{8mSUg|2?xUPW7 zR%b)n0>cRLN`-&H>piT<7Z^b0>DopKQ34$ipX7`k5nDq0tvfRIzWU>>>SX3!Y~ z4z8cWl|J*D6y4nu&a`5pf{KAVezl}+tAT5Wuyh>XYy{Q9*KYoA;tk6WJ4tKB{+&;= z;jVkQ=lZ{(RThMUz()yz)HZ*2<`Uldm9Jr#Wq1wsxFjkdA{1{5^>JS4z^t^498IE( zmfY&h;TETbXH{4CM8iEm!~ z5fuB8st;Erv2qT3_IONEwRH*tAy~Om(vz^LF=J?5k1yx&?#tiCiLd(P$icbHFx#Jc zfV;1|m+eo#2qJ^f8MMkEWDc!8w2%lDM$0&Fc<<@F?p>cL>aCa(lamO7E{HF&lDyPP zaEh6rq09w63m8x)kEuEybz(f_*33MHdAiVA@yFj>$sJeShaef)tY`!#T7(cff)-&c zJId?cbs8(rcqI*UmoqvK{_)@cUw-|q--75xib158CLVVuT74BTA%S3&7HZyTV%LT7 zRSl9xYUa%2i#Pm=2WbsuFY4`}=2)h1=S`ZCf z^yxQp>bV~ra}zUvf>V-c|Bh4vRl9yQt7L?eZW0xQ1&-rO{n;*@`ILM-8DHAkL z-hB45H0plyZ;U4>~F_=J%%j@Atbnz-zn7jxXp-(IfgSS*P~qfU4qQvfY~F_vya@swU=Ly&;uX_kTQXfgJJrpj0Dp{ zdm*F<2Q9mF1Y`uMLTF)7KhLD=Rn6RU{bMLGfT4$w(KKetrMuf_ilXC_5(x6iKV4md zojXl*I7HZt;_Dg^G0-+h(8@zd2kB+;O$VuRAYFXn5psQoC4^0hc5M(bgs4Y|1~iR) z?E4?4IUbJk2su9Ca6Uobfwr_nHki0>7{jRnqYkYb5xS8N{^$GYJn4<)d8&USB-*w4 zZhr9b?*sjL@(dwDNlcl=8}Nukf-g3g6J){?TbMY?Bw|`<-v(tNMW8-49zI!2nIY}x zm}9zZ+cv4~Q$Vo<0uXd`7z{}ROPiRW~48q-pE+9%@sWHLdUphKNcT?qEIOLUEe za3d&PgQgBmBj^U+`;CkEyE89hmTjV0L3v4}+49J*`03@pK_;$!%q3AO%O077 zo)O;-Yu1o&*(J!vB#tl$rOd#jkP;h#=P7*c;TbOVc${*I&)T&`^~;!&KqChh3~G7= ztx<`ameea4lwgE3p`np-An=uuHbI3P>Y(z+YC+pp1F(?cFuslhb!gE5x`B&6`$k@N z_WR1yX8f;^L|XZ5xa-IK`pVlu4PSO zsD+^-C>_HWbr`w;4KzlpNT_EkF2Ap1S{85QD%VQV(N@B%aKo z6E6GOeb`V`tENMWh!rp`;*4BtCIlKS$P5V>)FNtaH82bdSB4ScDAKP3T@Ta~iO=Eh zzx6&At$f9d1suUqOrjkd*YmS4|Ag#tA4&`WgGiOY^;1~UEc22s%=7b^5=Hmpepwr>my|jTW1it6j~307yx6Cbh4iVd!8>vzJnNl1GZ{Vs(4wRzW+W_ ziGGv_rY&s_;fIpgIs-|U4SRexY|wd3ON>JGwNg-(Cz=;r!+J$ek3wsYw4Vi)M#=<2 z4}jtm->63^iB3ItH9{oNau}r&gq$>HDvJ<-%`**yw-PuKo~CB`9-sJJ53C$Y zWKlSr|Bow(#>-s0_b4P$)BMv}dV-DgGZ6fUtd-7K$QtJqKVd{vHLU` zN8x%JsT41H#f6m_^(Z5els4yl;9R6u7=GZKjYbu$pD@U4HgSYJMW7qdN?@6Smz~o> z?VQz>8|)|}QOm*$k+y-dB%UYOHhZE?g{nWnyn|BES}O>}4e)JNU;GY)sBoIXQA8rs zZs(FOuSRGSHzaA#&R&IyDR3k_JpsJ}XV^gcCUp%Fn%dUP+R#S}i547lX;5NLn`C2! z8iiFS(h>0F)&N5STLjwY;xE4e(`uc)@sAP`MdN33=9&&r79n9k&$RnmR036fYQfEK z7c_N(sZClFGI;r_i)ueH0euqJ3<96t^x+jm<1d?) zku%8wp84ZCc5Qi#!TsIjoFtZ|iy)E4_p&4h_VD8NC)xVgAMpM1=U9(NqK4+TP}dv< z-y{+-VADvw=4zpg?fs^QgT`~ez#lNtmd#66zl+(L*Pp!icGg~TAK+0~4ogE4Z?K6s zhKbcjh}DI$LI&yKEQ$Us!+jYB_GLh6G#afX5|jUPrOBd|XO>;Y0*MOS9@1>$?VmZ1 z|Nf`zA(Nxs^Qcm;Z~;{#P=ExuX^ABbI!~yjZcbU+MokINO|$OD_agKVN;n7#O)&(6 zeS*OQ0*OFt0cfNEE%QDXt%7EI5`;F;BE&Zpa6A z0ve$;LTFGDB~7G`@|Qp4IOqLasBJpD%xXC>nna=SGERA26VKe0BpjBsw~Io_xoV&) z1R4o+a-86;2e|$lo4Dya=X3r?&t+NHo2hR(u2RGE$6wuyl7qkynlzqp5mF%mR|^as zERh2Z6r3Xnx>O@I9$+Ym@NKlnf>3OG{0>fjZDj}qkm%pWj*U0-yC43B{uhVPIw;k= zp<*Kzg_6QKN*Y)Q0V^dPDT|DXAdT7}Tf=AsRnLj9TFx17c^wOnIUU0)UoP;#zNh&5 zTR#b+7mp!KGX}71Udtea6#CD)S9e-a2k9|f?;ENF_h6jxMm)o|HUsb zL*+|)SALGY+aKl6x3A;Rw?C5)B#iK zj3i1K2%&iV-e-9758J74y^*soJCkEheI+&ZZ6%Mo`QckZrtnl6rBnD`h8o|)OK9AA z`MPa>5V7YbfTnz9c0d{$YacYs5$sM$jGT{Y34{)jO%Ai?`MX(oTERdI_Qd_% zb?tik_x7W73L%n6hS55OVL2GSM+ltqusyTEXho zuzr31q}9OsQJ?wWb#zMxF$w7~Qq}=;Sh?zWF8@8SNnf63?8 zW$<+xbQ(jZffQ1w&_;#~4*htrO;vM8zG?)5!Zfy8jC>h}XCW*bQ-qK@jGs@0(}k=` z9RVUNI{PVTnreW^MMa$%52I+q40q*(5z3h5+ACN(a4CoA6r_lr%zLG2+S@3dr zhRYxxoZ>@q*%OsQRhRKvYb}I;ZWMI7G{+R#K@Syii6{p{WKbf6)?uU$0}-@{(!D9k z)t}vsY5$h9-+wA6ob^f?=S^?33bN5dl#`iKnP?uYa42ld|XOLtuv_nqju%t^W;}Wj- z8FYNurl7mp;Xu{ZKyYY){%S#Ik02B>NF*dunrLm}8#YRWP=wGrpPnlspaZR>WtbDr zTFjYmeKiY@Jq^=}95&GYoe%J@@B9)5`|))@ki>LyQ&pdsRPNPCHowHc9|&VvaRf~W zqm?iH>gR+ahwtZkxfHveeVF@xbvIl7yfbJYKn6rQDC#6KC_gCfKyJNuIiI8?|$8;Ef-61;?DWnwt89y%C_$hX8xsxR)zI){0L|-?XA6d`3YyU`QIFYXamPO??jwXXpS+wEcNe5fH z2;q^le8Oo(OM_zLMolleP^+if#3`Wa8t71rNjX`)TF~1o7#b49Vv`0m@ zFHFR*MX5$QPFT!k-@K0AosaS0ZTIl#?b{K;LF+7tbWp%j1XHO&7O5SCkpshHDCH5V z^AFKBFas?)8#v+!G#X>b)YT>E>yy-G1j7*nAq=vZXv0Q(HiihJj4(n)P=t{x1kyxn zg&oO}%M5}Z#5WQ|qG{r4%Gx(Y%h%p+;Dv338%4-EH1$O48b}QqK)!m3%;vq`fl(~9 zgHR4g7bQJ%+9Q$;!d1tng&&c`Dd31EPyv%_r9{F+))?SfC>cU|Hd=%*Lp$&MW+x-mr9jiPi7N=89jfW{CWJ`PelqqL37kn{*? zpKz*>7G6jeJEBQ58b<|zMq?D21YKRw*C+EtI%sq|R#47F2m`dp*SpS<(^-_|GB4z@ zabsEhCx`j7hFu#w62kOsd|}{AjnY1*bis2`!X>ADLir*Tb=wLl#c&i6r+}l5Km{B& zy$uZs(rHOJEa^23LKy?wl4uP%S7C*HJi`l|hLkjQjUz`OOQCv+EldmylrND|lkelJW$RSzi}c@B|71QCKyNZRTo ox#YpIt*|DVAO8q9il>YJ4@@=jF}4tn2LJ#707*qoM6N<$g454lcmMzZ literal 591 zcmeAS@N?(olHy`uVBq!ia0vp^6F``Q4M;wBd$a>cNtU=qlmzFem6RtIr7}3C&+!cUZy}E*Ncp%H>CJa9AG{nWiFtzM{R%R zzn!bs?W(Zc{=Bq?U-NbG_QoKa^~VdDmPnlc&){Jw*AQ}ud4g93Ll7swgVsYv4^UusCc!0}H>ytAoq}K&AZr4nUQ5HVg-uC;a*VmN<+qAz-tY5vT*G zuCaoliCv+B;Zgud15kgahFrq~Mh>|K6A_RCkSZQNpaO`hJSYRmd)ooh2NCW=2v;x& zK}`bM4>kxw2to~GVCjcw0_$vYhu8|Tnh9trMD4{qCgTe~DWM4f*hRcG diff --git a/ServiceApp/res/drawable-xxhdpi/ic_stat_notify.png b/ServiceApp/res/drawable-xxhdpi/ic_stat_notify.png new file mode 100644 index 0000000000000000000000000000000000000000..e777215b54c6c0f380ec989a12e2056dfd7cbe4b GIT binary patch literal 4390 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 literal 0 HcmV?d00001 diff --git a/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java b/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java index 013558da4a..6d95a1dbd4 100644 --- a/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java +++ b/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java @@ -188,7 +188,7 @@ public void onCreate() { //Put the service in the foreground final Notification.Builder notifBuilder = new Notification.Builder(context) .setContentTitle("3DR Services") - .setSmallIcon(R.drawable.ic_launcher) + .setSmallIcon(R.drawable.ic_stat_notify) .setContentIntent(PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 0)); From fefd026d0aa2f0bf59790976763730d95050eed8 Mon Sep 17 00:00:00 2001 From: David Zumbrunnen Date: Mon, 16 Feb 2015 07:32:37 +0100 Subject: [PATCH 02/11] SVG icons added Hint: the ic_stat_notify icon might look empty, it's because its shape is white. --- ServiceApp/art/ic_launcher.svg | 315 ++++++++++++++++++++++++++++++ ServiceApp/art/ic_stat_notify.svg | 169 ++++++++++++++++ 2 files changed, 484 insertions(+) create mode 100644 ServiceApp/art/ic_launcher.svg create mode 100644 ServiceApp/art/ic_stat_notify.svg diff --git a/ServiceApp/art/ic_launcher.svg b/ServiceApp/art/ic_launcher.svg new file mode 100644 index 0000000000..02b5396945 --- /dev/null +++ b/ServiceApp/art/ic_launcher.svg @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ServiceApp/art/ic_stat_notify.svg b/ServiceApp/art/ic_stat_notify.svg new file mode 100644 index 0000000000..cac206be75 --- /dev/null +++ b/ServiceApp/art/ic_stat_notify.svg @@ -0,0 +1,169 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + From f3525e189f4fe9af2cbbff631a8c3f9aac951e4d Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Mon, 16 Feb 2015 11:33:56 -0800 Subject: [PATCH 03/11] Fixed missing camera detail crash bug. --- .../mission/item/complex/CameraDetail.java | 15 +++- ServiceApp/build.gradle | 2 +- .../android/api/DroidPlannerService.java | 36 ++++++++++ .../services/android/api/DroneApi.java | 68 ++++++------------- .../services/android/drone/DroneManager.java | 6 -- 5 files changed, 70 insertions(+), 57 deletions(-) diff --git a/AidlLib/src/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.java b/AidlLib/src/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.java index 5828a5436a..9f4eb0ffdc 100644 --- a/AidlLib/src/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.java +++ b/AidlLib/src/com/o3dr/services/android/lib/drone/mission/item/complex/CameraDetail.java @@ -3,8 +3,6 @@ import android.os.Parcel; import android.os.Parcelable; -import java.io.Serializable; - /** * Created by fhuya on 11/6/14. */ @@ -19,6 +17,17 @@ public class CameraDetail implements Parcelable { private final double sidelap; private final boolean isInLandscapeOrientation; + public CameraDetail() { + name = "Canon SX260"; + sensorWidth = 6.12; + sensorHeight = 4.22; + sensorResolution = 12.1; + focalLength = 5.0; + overlap = 50.0; + sidelap = 60.0; + isInLandscapeOrientation = true; + } + public CameraDetail(String name, double sensorWidth, double sensorHeight, double sensorResolution, double focalLength, double overlap, double sidelap, boolean isInLandscapeOrientation) { @@ -32,7 +41,7 @@ public CameraDetail(String name, double sensorWidth, double sensorHeight, double this.isInLandscapeOrientation = isInLandscapeOrientation; } - public CameraDetail(CameraDetail copy){ + public CameraDetail(CameraDetail copy) { this(copy.name, copy.sensorWidth, copy.sensorHeight, copy.sensorResolution, copy.focalLength, copy.overlap, copy.sidelap, copy.isInLandscapeOrientation); } diff --git a/ServiceApp/build.gradle b/ServiceApp/build.gradle index b75650a5ed..9693d1bec5 100644 --- a/ServiceApp/build.gradle +++ b/ServiceApp/build.gradle @@ -27,7 +27,7 @@ android { applicationId 'org.droidplanner.services.android' minSdkVersion 14 targetSdkVersion 21 - versionCode 10207 + versionCode 10208 versionName getGitVersion() } diff --git a/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java b/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java index 0b0f0aaed8..7410d64c84 100644 --- a/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java +++ b/ServiceApp/src/org/droidplanner/services/android/api/DroidPlannerService.java @@ -18,11 +18,13 @@ import com.google.android.gms.analytics.HitBuilders; import com.o3dr.services.android.lib.drone.connection.ConnectionParameter; import com.o3dr.services.android.lib.drone.connection.ConnectionType; +import com.o3dr.services.android.lib.drone.mission.item.complex.CameraDetail; import com.o3dr.services.android.lib.model.IApiListener; import com.o3dr.services.android.lib.model.IDroidPlannerServices; import org.droidplanner.core.MAVLink.connection.MavLinkConnection; import org.droidplanner.core.MAVLink.connection.MavLinkConnectionListener; +import org.droidplanner.core.survey.CameraInfo; import org.droidplanner.services.android.R; import org.droidplanner.services.android.communication.connection.AndroidMavLinkConnection; import org.droidplanner.services.android.communication.connection.AndroidTcpConnection; @@ -35,7 +37,11 @@ import org.droidplanner.services.android.ui.activity.MainActivity; import org.droidplanner.services.android.utils.Utils; import org.droidplanner.services.android.utils.analytics.GAUtils; +import org.droidplanner.services.android.utils.file.IO.CameraInfoLoader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; /** @@ -73,6 +79,9 @@ public class DroidPlannerService extends Service { private DroneAccess droneAccess; private MavLinkServiceApi mavlinkApi; + private CameraInfoLoader cameraInfoLoader; + private List cachedCameraDetails; + DroneApi registerDroneApi(IApiListener listener, String appId) { if (listener == null) return null; @@ -223,6 +232,32 @@ void disconnectMAVConnection(ConnectionParameter connParams, String listenerTag) } } + synchronized List getCameraDetails() { + if (cachedCameraDetails == null) { + List cameraInfoNames = cameraInfoLoader.getCameraInfoList(); + + List cameraInfos = new ArrayList<>(cameraInfoNames.size()); + for (String infoName : cameraInfoNames) { + try { + cameraInfos.add(cameraInfoLoader.openFile(infoName)); + } catch (Exception e) { + Log.e(TAG, e.getMessage(), e); + } + } + + List cameraDetails = new ArrayList<>(cameraInfos.size()); + for (CameraInfo camInfo : cameraInfos) { + cameraDetails.add(new CameraDetail(camInfo.name, camInfo.sensorWidth, + camInfo.sensorHeight, camInfo.sensorResolution, camInfo.focalLength, + camInfo.overlap, camInfo.sidelap, camInfo.isInLandscapeOrientation)); + } + + cachedCameraDetails = cameraDetails; + } + + return cachedCameraDetails; + } + @Override public IBinder onBind(Intent intent) { Log.d(TAG, "Binding intent: " + intent); @@ -251,6 +286,7 @@ public void onCreate() { droneAccess = new DroneAccess(this); dpServices = new DPServices(this); lbm = LocalBroadcastManager.getInstance(context); + this.cameraInfoLoader = new CameraInfoLoader(context); updateForegroundNotification(); } diff --git a/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java b/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java index 4eb7a66beb..a577810612 100644 --- a/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java +++ b/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java @@ -118,7 +118,6 @@ public final class DroneApi extends IDroneApi.Stub implements DroneEventsListene private final DroidPlannerService service; private ConnectionParameter connectionParams; - private List cachedCameraDetails; DroneApi(DroidPlannerService dpService, Looper looper, MavLinkServiceApi mavlinkApi, IApiListener listener, String ownerId) { @@ -234,27 +233,32 @@ public Bundle getAttribute(String type) throws RemoteException { } private CameraProxy getCameraProxy() { - if (droneMgr == null) - return null; + final CameraDetail camDetail; + final FootPrint currentFieldOfView; + final List proxyPrints = new ArrayList<>(); - Drone drone = droneMgr.getDrone(); - Camera droneCamera = drone.getCamera(); + if (droneMgr == null) { + camDetail = new CameraDetail(); + currentFieldOfView = new FootPrint(); + } + else{ + Drone drone = droneMgr.getDrone(); + Camera droneCamera = drone.getCamera(); - List footprints = droneCamera.getFootprints(); - final int printsCount = footprints.size(); + camDetail = ProxyUtils.getCameraDetail(droneCamera.getCamera()); - List proxyPrints = new ArrayList(footprints.size()); - for (Footprint footprint : footprints) { - proxyPrints.add(getProxyCameraFootPrint(footprint)); - } + List footprints = droneCamera.getFootprints(); + for (Footprint footprint : footprints) { + proxyPrints.add(getProxyCameraFootPrint(footprint)); + } - GPS droneGps = drone.getGps(); - final FootPrint currentFieldOfView = droneGps.isPositionValid() - ? getProxyCameraFootPrint(droneCamera.getCurrentFieldOfView()) - : new FootPrint(); + GPS droneGps = drone.getGps(); + currentFieldOfView = droneGps.isPositionValid() + ? getProxyCameraFootPrint(droneCamera.getCurrentFieldOfView()) + : new FootPrint(); + } - return new CameraProxy(ProxyUtils.getCameraDetail(droneCamera.getCamera()), - currentFieldOfView, proxyPrints, getCameraDetails()); + return new CameraProxy(camDetail, currentFieldOfView, proxyPrints, service.getCameraDetails()); } private Gps getGps() { @@ -815,36 +819,6 @@ private FollowState getFollowState() { return new FollowState(state, followModeToType(currentAlg.getType()), params); } - private List getCameraDetails() { - if (droneMgr == null) - return Collections.emptyList(); - - if (cachedCameraDetails == null) { - final CameraInfoLoader camInfoLoader = this.droneMgr.getCameraInfoLoader(); - List cameraInfoNames = camInfoLoader.getCameraInfoList(); - - List cameraInfos = new ArrayList(cameraInfoNames.size()); - for (String infoName : cameraInfoNames) { - try { - cameraInfos.add(camInfoLoader.openFile(infoName)); - } catch (Exception e) { - Log.e(TAG, e.getMessage(), e); - } - } - - List cameraDetails = new ArrayList(cameraInfos.size()); - for (CameraInfo camInfo : cameraInfos) { - cameraDetails.add(new CameraDetail(camInfo.name, camInfo.sensorWidth, - camInfo.sensorHeight, camInfo.sensorResolution, camInfo.focalLength, - camInfo.overlap, camInfo.sidelap, camInfo.isInLandscapeOrientation)); - } - - cachedCameraDetails = cameraDetails; - } - - return cachedCameraDetails; - } - private static FootPrint getProxyCameraFootPrint(Footprint footprint) { if (footprint == null) return null; diff --git a/ServiceApp/src/org/droidplanner/services/android/drone/DroneManager.java b/ServiceApp/src/org/droidplanner/services/android/drone/DroneManager.java index e116cdd410..7aab55e28d 100644 --- a/ServiceApp/src/org/droidplanner/services/android/drone/DroneManager.java +++ b/ServiceApp/src/org/droidplanner/services/android/drone/DroneManager.java @@ -53,7 +53,6 @@ public class DroneManager implements MAVLinkStreams.MavlinkInputStream, private final Context context; private final Drone drone; private final Follow followMe; - private final CameraInfoLoader cameraInfoLoader; private final MavLinkMsgHandler mavLinkMsgHandler; private MagnetometerCalibration magCalibration; private final ConnectionParameter connectionParameter; @@ -61,7 +60,6 @@ public class DroneManager implements MAVLinkStreams.MavlinkInputStream, public DroneManager(Context context, ConnectionParameter connParams, final Handler handler, MavLinkServiceApi mavlinkApi) { this.context = context; this.connectionParameter = connParams; - this.cameraInfoLoader = new CameraInfoLoader(context); MAVLinkClient mavClient = new MAVLinkClient(context, this, connParams, mavlinkApi); @@ -324,10 +322,6 @@ public boolean isConnected() { return drone.isConnected(); } - public CameraInfoLoader getCameraInfoLoader() { - return cameraInfoLoader; - } - @Override public void onDroneEvent(DroneInterfaces.DroneEventsType event, Drone drone) { if (connectedApps.isEmpty()) From ecaa6be665dc89f6ca6e3a55f7875c7f3d6548f8 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Mon, 16 Feb 2015 12:08:45 -0800 Subject: [PATCH 04/11] version update. --- AidlLib/build.gradle | 4 ++-- ClientLib/mobile/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/AidlLib/build.gradle b/AidlLib/build.gradle index 0984907441..c3beb78b17 100644 --- a/AidlLib/build.gradle +++ b/AidlLib/build.gradle @@ -7,8 +7,8 @@ android { defaultConfig { minSdkVersion 14 targetSdkVersion 21 - versionCode 20052 - versionName '2.0.52' + versionCode 20053 + versionName '2.0.53' } defaultPublishConfig "release" diff --git a/ClientLib/mobile/build.gradle b/ClientLib/mobile/build.gradle index 5138903a31..5c098cbc7a 100644 --- a/ClientLib/mobile/build.gradle +++ b/ClientLib/mobile/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' ext { PUBLISH_ARTIFACT_ID = '3dr-services-lib' - PUBLISH_VERSION = '2.2.16' + PUBLISH_VERSION = '2.2.17' PROJECT_DESCRIPTION = "3DR Services Client Library" PROJECT_LABELS = ['3DR', '3DR Services', 'DroneAPI', 'Android'] PROJECT_LICENSES = ['Apache-2.0'] @@ -15,7 +15,7 @@ android { defaultConfig { minSdkVersion 14 targetSdkVersion 21 - versionCode 20216 + versionCode 20217 versionName PUBLISH_VERSION } From 0b30c272599f5eddab576e15a58af929ff888d88 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Mon, 16 Feb 2015 13:25:32 -0800 Subject: [PATCH 05/11] fixed issue with complex mission item not building when disconnected from the vehicle. updated status bar notification icon. --- ClientLib/mobile/libs/AidlLib.jar | Bin 493015 -> 493194 bytes .../services/android/api/DroneApi.java | 12 ++++-------- .../service/UploaderService.java | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/ClientLib/mobile/libs/AidlLib.jar b/ClientLib/mobile/libs/AidlLib.jar index b17a554d2a0eec9345ff1a6a4972a87d337dc79f..9e2aef6cd193ccc6350d52680828e6220af77c9d 100644 GIT binary patch delta 25871 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 diff --git a/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java b/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java index a577810612..7c04fa4e31 100644 --- a/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java +++ b/ServiceApp/src/org/droidplanner/services/android/api/DroneApi.java @@ -853,10 +853,8 @@ public void buildComplexMissionItem(Bundle itemBundle) { } private Survey buildSurvey(Survey survey) { - if (droneMgr == null) - return survey; - - org.droidplanner.core.mission.Mission droneMission = this.droneMgr.getDrone().getMission(); + org.droidplanner.core.mission.Mission droneMission = droneMgr == null ? null + : this.droneMgr.getDrone().getMission(); org.droidplanner.core.mission.survey.Survey updatedSurvey = (org.droidplanner.core.mission.survey.Survey) ProxyUtils.getMissionItemImpl (droneMission, survey); @@ -864,10 +862,8 @@ private Survey buildSurvey(Survey survey) { } private StructureScanner buildStructureScanner(StructureScanner item) { - if (droneMgr == null) - return item; - - org.droidplanner.core.mission.Mission droneMission = this.droneMgr.getDrone().getMission(); + org.droidplanner.core.mission.Mission droneMission = droneMgr == null ? null + : this.droneMgr.getDrone().getMission(); org.droidplanner.core.mission.waypoints.StructureScanner updatedScan = (org.droidplanner.core.mission.waypoints.StructureScanner) ProxyUtils .getMissionItemImpl(droneMission, item); diff --git a/ServiceApp/src/org/droidplanner/services/android/communication/service/UploaderService.java b/ServiceApp/src/org/droidplanner/services/android/communication/service/UploaderService.java index 9ad3042825..74a4aecbd7 100644 --- a/ServiceApp/src/org/droidplanner/services/android/communication/service/UploaderService.java +++ b/ServiceApp/src/org/droidplanner/services/android/communication/service/UploaderService.java @@ -152,7 +152,7 @@ protected void onHandleIntent(Intent intent) { private NotificationCompat.Builder generateNotificationBuilder() { return new NotificationCompat.Builder(getApplicationContext()) .setContentTitle(getString(R.string.uploader_notification_title)) - .setSmallIcon(R.drawable.ic_launcher) + .setSmallIcon(R.drawable.ic_stat_notify) // .setProgress(fileSize, 0, false) .setAutoCancel(true).setPriority(NotificationCompat.PRIORITY_HIGH); } From d03fa031ca692a3667d741b0bb5b564a463ec9f8 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Mon, 23 Feb 2015 18:11:59 -0800 Subject: [PATCH 06/11] Fixed issue causing lack of gps location update on nexus 6. --- ServiceApp/build.gradle | 2 +- .../droidplanner/services/android/location/FusedLocation.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ServiceApp/build.gradle b/ServiceApp/build.gradle index 9693d1bec5..b7a7661643 100644 --- a/ServiceApp/build.gradle +++ b/ServiceApp/build.gradle @@ -27,7 +27,7 @@ android { applicationId 'org.droidplanner.services.android' minSdkVersion 14 targetSdkVersion 21 - versionCode 10208 + versionCode 10209 versionName getGitVersion() } diff --git a/ServiceApp/src/org/droidplanner/services/android/location/FusedLocation.java b/ServiceApp/src/org/droidplanner/services/android/location/FusedLocation.java index fb57825bc8..fc24bb98fd 100644 --- a/ServiceApp/src/org/droidplanner/services/android/location/FusedLocation.java +++ b/ServiceApp/src/org/droidplanner/services/android/location/FusedLocation.java @@ -26,7 +26,7 @@ public class FusedLocation implements LocationFinder, com.google.android.gms.loc private static final String TAG = FusedLocation.class.getSimpleName(); - private static final long MIN_TIME_MS = 0; + private static final long MIN_TIME_MS = 16; private static final float MIN_DISTANCE_M = 0.0f; private static final float LOCATION_ACCURACY_THRESHOLD = 15.0f; private static final float JUMP_FACTOR = 4.0f; From d82c297ae01ab5767fd75da38790e4d7b4f83329 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Mon, 23 Feb 2015 19:18:50 -0800 Subject: [PATCH 07/11] Updated camera profiles. Updated parameter metadata. --- .../CameraInfo/{NEX5_16mm.xml => Sony NEX5 16mm.xml} | 0 .../CameraInfo/{NEX5_25mm.xml => Sony NEX5 25mm.xml} | 0 .../{RX100_M3_24mm.xml => Sony RX100 M3 24mm.xml} | 2 +- .../{RX100_M3_70mm.xml => Sony RX100 M3 70mm.xml} | 2 +- ServiceApp/assets/CameraInfo/Sony RX100_M3 50mm.xml | 8 ++++++++ ServiceApp/assets/Parameters/ParameterMetaData.xml | 4 ++-- 6 files changed, 12 insertions(+), 4 deletions(-) rename ServiceApp/assets/CameraInfo/{NEX5_16mm.xml => Sony NEX5 16mm.xml} (100%) rename ServiceApp/assets/CameraInfo/{NEX5_25mm.xml => Sony NEX5 25mm.xml} (100%) rename ServiceApp/assets/CameraInfo/{RX100_M3_24mm.xml => Sony RX100 M3 24mm.xml} (85%) rename ServiceApp/assets/CameraInfo/{RX100_M3_70mm.xml => Sony RX100 M3 70mm.xml} (85%) create mode 100644 ServiceApp/assets/CameraInfo/Sony RX100_M3 50mm.xml diff --git a/ServiceApp/assets/CameraInfo/NEX5_16mm.xml b/ServiceApp/assets/CameraInfo/Sony NEX5 16mm.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/NEX5_16mm.xml rename to ServiceApp/assets/CameraInfo/Sony NEX5 16mm.xml diff --git a/ServiceApp/assets/CameraInfo/NEX5_25mm.xml b/ServiceApp/assets/CameraInfo/Sony NEX5 25mm.xml similarity index 100% rename from ServiceApp/assets/CameraInfo/NEX5_25mm.xml rename to ServiceApp/assets/CameraInfo/Sony NEX5 25mm.xml diff --git a/ServiceApp/assets/CameraInfo/RX100_M3_24mm.xml b/ServiceApp/assets/CameraInfo/Sony RX100 M3 24mm.xml similarity index 85% rename from ServiceApp/assets/CameraInfo/RX100_M3_24mm.xml rename to ServiceApp/assets/CameraInfo/Sony RX100 M3 24mm.xml index 48b56764f5..772c9c1476 100644 --- a/ServiceApp/assets/CameraInfo/RX100_M3_24mm.xml +++ b/ServiceApp/assets/CameraInfo/Sony RX100 M3 24mm.xml @@ -4,5 +4,5 @@ 13.2 8.8 20.2 - 24.0 + 8.8 diff --git a/ServiceApp/assets/CameraInfo/RX100_M3_70mm.xml b/ServiceApp/assets/CameraInfo/Sony RX100 M3 70mm.xml similarity index 85% rename from ServiceApp/assets/CameraInfo/RX100_M3_70mm.xml rename to ServiceApp/assets/CameraInfo/Sony RX100 M3 70mm.xml index 442a06617d..97c02a3721 100644 --- a/ServiceApp/assets/CameraInfo/RX100_M3_70mm.xml +++ b/ServiceApp/assets/CameraInfo/Sony RX100 M3 70mm.xml @@ -4,5 +4,5 @@ 13.2 8.8 20.2 - 70.0 + 25.7 diff --git a/ServiceApp/assets/CameraInfo/Sony RX100_M3 50mm.xml b/ServiceApp/assets/CameraInfo/Sony RX100_M3 50mm.xml new file mode 100644 index 0000000000..7f83813549 --- /dev/null +++ b/ServiceApp/assets/CameraInfo/Sony RX100_M3 50mm.xml @@ -0,0 +1,8 @@ + + + RX100_M3 24mm + 13.2 + 8.8 + 20.2 + 18.3 + diff --git a/ServiceApp/assets/Parameters/ParameterMetaData.xml b/ServiceApp/assets/Parameters/ParameterMetaData.xml index e5220e2243..d933aa5806 100644 --- a/ServiceApp/assets/Parameters/ParameterMetaData.xml +++ b/ServiceApp/assets/Parameters/ParameterMetaData.xml @@ -2311,8 +2311,8 @@ Advanced - Mavlink version - Allows reconising the mavlink version + MAVLink version + Allows recognising the MAVLink version 1 255 Advanced From bfb3edece1310a300e0c54335d9502f4094feca0 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Mon, 23 Feb 2015 19:23:13 -0800 Subject: [PATCH 08/11] update the directory structure for the 3dr services app store assets. --- .../recommended_apps.json => AppStore/recommendedApps.json} | 0 .../services/android/ui/adapter/RecommendedAppsAdapter.java | 4 +--- 2 files changed, 1 insertion(+), 3 deletions(-) rename ServiceApp/assets/{recommended_apps/recommended_apps.json => AppStore/recommendedApps.json} (100%) diff --git a/ServiceApp/assets/recommended_apps/recommended_apps.json b/ServiceApp/assets/AppStore/recommendedApps.json similarity index 100% rename from ServiceApp/assets/recommended_apps/recommended_apps.json rename to ServiceApp/assets/AppStore/recommendedApps.json diff --git a/ServiceApp/src/org/droidplanner/services/android/ui/adapter/RecommendedAppsAdapter.java b/ServiceApp/src/org/droidplanner/services/android/ui/adapter/RecommendedAppsAdapter.java index 118468986c..91d73d4414 100644 --- a/ServiceApp/src/org/droidplanner/services/android/ui/adapter/RecommendedAppsAdapter.java +++ b/ServiceApp/src/org/droidplanner/services/android/ui/adapter/RecommendedAppsAdapter.java @@ -2,10 +2,8 @@ import android.content.Context; import android.content.Intent; -import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.AsyncTask; import android.support.v7.widget.RecyclerView; @@ -56,7 +54,7 @@ public ViewHolder(View itemView, TextView title, TextView description, ImageView private static final String TAG = RecommendedAppsAdapter.class.getSimpleName(); - private static final String RECOMMENDED_APPS_DATA_PATH = "recommended_apps/recommended_apps.json"; + private static final String RECOMMENDED_APPS_DATA_PATH = "AppStore/recommendedApps.json"; /* JSON Attributes */ private static final String APPS_DATA_ATTRIBUTE = "apps"; From c88700f4ef21a9b1e2ecbe57a72912cd8bd7e56d Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Mon, 23 Feb 2015 22:00:31 -0800 Subject: [PATCH 09/11] updated the directory structure for public data files (custom camera profiles, and parameters metadata). --- .../android/utils/file/DirectoryPath.java | 31 +++++++++++-------- .../file/IO/ParameterMetadataMapReader.java | 2 +- .../utils/file/IO/VehicleProfileReader.java | 2 +- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/file/DirectoryPath.java b/ServiceApp/src/org/droidplanner/services/android/utils/file/DirectoryPath.java index e27d54b220..d733606912 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/file/DirectoryPath.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/file/DirectoryPath.java @@ -5,23 +5,35 @@ import android.content.Context; import android.os.Environment; +import org.droidplanner.services.android.R; + public class DirectoryPath { /** - * Main path used to store files related to the program + * Main path used to store private data files related to the program * - * @return Path to DroidPlanner/ folder in external storage + * @return Path to 3DR Services private data folder in external storage */ - static public String get3DRServicesPath(Context context) { + static public String getPrivateDataPath(Context context) { File dataDir = context.getExternalFilesDir(null); return dataDir.getAbsolutePath(); } + /** + * Main path used to store public data files related to the app. + * @param context application context + * @return Path to 3DR Services public data directory. + */ + public static String getPublicDataPath(Context context){ + final String root = Environment.getExternalStorageDirectory().getPath(); + return root + "/" + context.getString(R.string.app_title) + "/"; + } + /** * Folder where telemetry log files are stored */ static public File getTLogPath(Context context, String appId) { - File f = new File(get3DRServicesPath(context) + "/tlogs/" + appId); + File f = new File(getPrivateDataPath(context) + "/tlogs/" + appId); if(!f.exists()) { f.mkdirs(); } @@ -43,21 +55,14 @@ static public File getTLogSentPath(Context context, String appId) { * Storage folder for user camera description files */ public static String getCameraInfoPath(Context context) { - return get3DRServicesPath(context) + "/camera_info/"; + return getPublicDataPath(context) + "/CameraInfo/"; } /** * Storage folder for stacktraces */ public static String getLogCatPath(Context context) { - return get3DRServicesPath(context) + "/log_cat/"; - } - - /** - * Storage folder for SRTM data - */ - static public String getSrtmPath(Context context) { - return get3DRServicesPath(context) + "/srtm/"; + return getPrivateDataPath(context) + "/log_cat/"; } } diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/file/IO/ParameterMetadataMapReader.java b/ServiceApp/src/org/droidplanner/services/android/utils/file/IO/ParameterMetadataMapReader.java index 8115f19944..a5465ac523 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/file/IO/ParameterMetadataMapReader.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/file/IO/ParameterMetadataMapReader.java @@ -33,7 +33,7 @@ public static Map load(Context context, String metada // use user supplied file in ~/Parameters if available, else fallback to // asset from resources final InputStream inputStream; - final File file = new File(DirectoryPath.get3DRServicesPath(context) + PARAMETERMETADATA_PATH); + final File file = new File(DirectoryPath.getPublicDataPath(context) + PARAMETERMETADATA_PATH); if (file.exists()) { inputStream = new FileInputStream(file); return open(inputStream, metadataType); diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/file/IO/VehicleProfileReader.java b/ServiceApp/src/org/droidplanner/services/android/utils/file/IO/VehicleProfileReader.java index 1e0268e0df..828fb3c8d8 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/file/IO/VehicleProfileReader.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/file/IO/VehicleProfileReader.java @@ -41,7 +41,7 @@ public static VehicleProfile load(Context context, FirmwareType vehicleType) { try { VehicleProfile newProfile = new VehicleProfile(); - File file = new File(DirectoryPath.get3DRServicesPath(context) + path); + File file = new File(DirectoryPath.getPublicDataPath(context) + path); if (file.exists()) { loadProfileFromFile(newProfile, file); } else { From 7344cbb1ef315b914ec5754cabe18205c851c228 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Mon, 23 Feb 2015 22:07:03 -0800 Subject: [PATCH 10/11] update directory name for the public data files. --- .../droidplanner/services/android/utils/file/DirectoryPath.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ServiceApp/src/org/droidplanner/services/android/utils/file/DirectoryPath.java b/ServiceApp/src/org/droidplanner/services/android/utils/file/DirectoryPath.java index d733606912..a147cd0210 100644 --- a/ServiceApp/src/org/droidplanner/services/android/utils/file/DirectoryPath.java +++ b/ServiceApp/src/org/droidplanner/services/android/utils/file/DirectoryPath.java @@ -26,7 +26,7 @@ static public String getPrivateDataPath(Context context) { */ public static String getPublicDataPath(Context context){ final String root = Environment.getExternalStorageDirectory().getPath(); - return root + "/" + context.getString(R.string.app_title) + "/"; + return root + "/3DRServices/"; } /** From d76a9b6c2418b8389d54267a72d0dbd0da2adf94 Mon Sep 17 00:00:00 2001 From: ne0fhyk Date: Tue, 24 Feb 2015 01:03:41 -0800 Subject: [PATCH 11/11] Fixed the issue causing lack of roi update when in follow mode on the nexus 6: the location object returned by the nexus 6 location provider is missing the speed value, which the roi estimator was relying on to update its state. Possible fix for the 'copter pointed east' reported issue. --- .../android/location/FusedLocation.java | 21 ++++++++++++------ .../droidplanner/core/gcs/follow/Follow.java | 8 ++++--- .../core/gcs/follow/FollowAlgorithm.java | 11 +++++----- .../core/gcs/follow/FollowSplineAbove.java | 2 ++ .../core/gcs/follow/FollowSplineLeash.java | 1 + .../core/gcs/roi/ROIEstimator.java | 22 ++++++++++--------- .../core/helpers/geoTools/GeoTools.java | 3 +-- 7 files changed, 41 insertions(+), 27 deletions(-) diff --git a/ServiceApp/src/org/droidplanner/services/android/location/FusedLocation.java b/ServiceApp/src/org/droidplanner/services/android/location/FusedLocation.java index fc24bb98fd..b255bd9ffd 100644 --- a/ServiceApp/src/org/droidplanner/services/android/location/FusedLocation.java +++ b/ServiceApp/src/org/droidplanner/services/android/location/FusedLocation.java @@ -90,9 +90,10 @@ public void onLocationChanged(Location androidLocation) { float distanceToLast = -1.0f; long timeSinceLast = -1L; + final long androidLocationTime = androidLocation.getTime(); if (mLastLocation != null) { distanceToLast = androidLocation.distanceTo(mLastLocation); - timeSinceLast = (androidLocation.getTime() - mLastLocation.getTime()) / 1000; + timeSinceLast = (androidLocationTime - mLastLocation.getTime()) / 1000; } final float currentSpeed = distanceToLast > 0f && timeSinceLast > 0 @@ -101,9 +102,14 @@ public void onLocationChanged(Location androidLocation) { final boolean isLocationAccurate = isLocationAccurate(androidLocation.getAccuracy(), currentSpeed); org.droidplanner.core.gcs.location.Location location = new org.droidplanner.core.gcs.location.Location( - new Coord3D(androidLocation.getLatitude(), androidLocation.getLongitude(), - new Altitude(androidLocation.getAltitude())), androidLocation.getBearing(), - androidLocation.getSpeed(), isLocationAccurate, androidLocation.getTime()); + new Coord3D( + androidLocation.getLatitude(), + androidLocation.getLongitude(), + new Altitude(androidLocation.getAltitude())), + androidLocation.getBearing(), + androidLocation.hasSpeed() ? androidLocation.getSpeed() : currentSpeed, + isLocationAccurate, + androidLocationTime); mLastLocation = androidLocation; receiver.onLocationUpdate(location); @@ -141,7 +147,7 @@ public void setLocationListener(LocationReceiver receiver) { @Override public void onGoogleApiConnectionError(ConnectionResult result) { - if(receiver != null) + if (receiver != null) receiver.onLocationUnavailable(); GooglePlayServicesUtil.showErrorNotification(result.getErrorCode(), this.context); @@ -149,7 +155,7 @@ public void onGoogleApiConnectionError(ConnectionResult result) { @Override public void onUnavailableGooglePlayServices(int status) { - if(receiver != null) + if (receiver != null) receiver.onLocationUnavailable(); GooglePlayServicesUtil.showErrorNotification(status, this.context); @@ -161,5 +167,6 @@ public void onManagerStarted() { } @Override - public void onManagerStopped() {} + public void onManagerStopped() { + } } diff --git a/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/Follow.java b/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/Follow.java index f6bf18e39f..e9d1e5b0b8 100644 --- a/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/Follow.java +++ b/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/Follow.java @@ -62,11 +62,11 @@ public void toggleFollowMeState() { private void enableFollowMe() { lastLocation = null; + state = FollowStates.FOLLOW_START; locationFinder.enableLocationUpdates(); followAlgorithm.enableFollow(); - state = FollowStates.FOLLOW_START; drone.notifyDroneEvent(DroneEventsType.FOLLOW_START); } @@ -90,14 +90,16 @@ public boolean isEnabled() { public void onDroneEvent(DroneEventsType event, Drone drone) { switch (event) { case MODE: - if (!GuidedPoint.isGuidedMode(drone)) { + if (isEnabled() && !GuidedPoint.isGuidedMode(drone)) { disableFollowMe(); } break; case HEARTBEAT_TIMEOUT: case DISCONNECTED: - disableFollowMe(); + if(isEnabled()) { + disableFollowMe(); + } break; } } diff --git a/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/FollowAlgorithm.java b/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/FollowAlgorithm.java index e10fd9d0f0..7c6006cc43 100644 --- a/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/FollowAlgorithm.java +++ b/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/FollowAlgorithm.java @@ -31,12 +31,13 @@ public void enableFollow() { } public void disableFollow() { - isFollowEnabled.set(false); - if (GuidedPoint.isGuidedMode(drone)) { - drone.getGuidedPoint().pauseAtCurrentLocation(); - } + if(isFollowEnabled.compareAndSet(true, false)) { + if (GuidedPoint.isGuidedMode(drone)) { + drone.getGuidedPoint().pauseAtCurrentLocation(); + } - roiEstimator.disableFollow(); + roiEstimator.disableFollow(); + } } public void updateAlgorithmParams(Map paramsMap) { diff --git a/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/FollowSplineAbove.java b/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/FollowSplineAbove.java index e9b26d804f..35674066f2 100644 --- a/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/FollowSplineAbove.java +++ b/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/FollowSplineAbove.java @@ -13,6 +13,8 @@ public class FollowSplineAbove extends FollowAlgorithm { @Override public void processNewLocation(Location location) { Coord2D gcsLoc = new Coord2D(location.getCoord().getLat(), location.getCoord().getLng()); + + //TODO: some device (nexus 6) do not report the speed (always 0).. figure out workaround. double speed = location.getSpeed(); double bearing = location.getBearing(); double bearingInRad = Math.toRadians(bearing); diff --git a/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/FollowSplineLeash.java b/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/FollowSplineLeash.java index 62b721d849..6e78882520 100644 --- a/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/FollowSplineLeash.java +++ b/dependencyLibs/Core/src/org/droidplanner/core/gcs/follow/FollowSplineLeash.java @@ -25,6 +25,7 @@ public void processNewLocation(Location location) { double headingGCSToDrone = GeoTools.getHeadingFromCoordinates(userLoc, droneLoc); Coord2D goCoord = GeoTools.newCoordFromBearingAndDistance(userLoc, headingGCSToDrone, radius); + //TODO: some device (nexus 6) do not report the speed (always 0).. figure out workaround. double speed = location.getSpeed(); double bearing = location.getBearing(); double bearingInRad = Math.toRadians(bearing); diff --git a/dependencyLibs/Core/src/org/droidplanner/core/gcs/roi/ROIEstimator.java b/dependencyLibs/Core/src/org/droidplanner/core/gcs/roi/ROIEstimator.java index 5f2dd1fc44..f9aeed0185 100644 --- a/dependencyLibs/Core/src/org/droidplanner/core/gcs/roi/ROIEstimator.java +++ b/dependencyLibs/Core/src/org/droidplanner/core/gcs/roi/ROIEstimator.java @@ -45,14 +45,16 @@ public void enableFollow() { } public void disableFollow() { - disableWatchdog(); - isFollowEnabled.set(false); - MavLinkDoCmds.resetROI(drone); + if(isFollowEnabled.compareAndSet(true, false)){ + realLocation = null; + MavLinkDoCmds.resetROI(drone); + disableWatchdog(); + } } @Override public final void onLocationUpdate(Location location) { - if(!isFollowEnabled.get()) + if (!isFollowEnabled.get()) return; realLocation = location; @@ -67,7 +69,7 @@ public void onLocationUnavailable() { disableWatchdog(); } - protected void disableWatchdog(){ + protected void disableWatchdog() { watchdog.removeCallbacks(watchdogCallback); } @@ -76,17 +78,17 @@ protected void updateROI() { return; } - Coord2D gcsCoord = new Coord2D(realLocation.getCoord().getLat(), realLocation.getCoord().getLng()); + Coord2D gcsCoord = realLocation.getCoord(); double bearing = realLocation.getBearing(); double distanceTraveledSinceLastPoint = realLocation.getSpeed() * (System.currentTimeMillis() - timeOfLastLocation) / 1000f; Coord2D goCoord = GeoTools.newCoordFromBearingAndDistance(gcsCoord, bearing, distanceTraveledSinceLastPoint); - if (distanceTraveledSinceLastPoint > 0.0) { - MavLinkDoCmds.setROI(drone, new Coord3D(goCoord.getLat(), goCoord.getLng(), new Altitude(0.0))); - } - watchdog.postDelayed(watchdogCallback, TIMEOUT); + MavLinkDoCmds.setROI(drone, new Coord3D(goCoord.getLat(), goCoord.getLng(), new Altitude(0.0))); + + if (realLocation.getSpeed() > 0) + watchdog.postDelayed(watchdogCallback, TIMEOUT); } public boolean isFollowEnabled() { diff --git a/dependencyLibs/Core/src/org/droidplanner/core/helpers/geoTools/GeoTools.java b/dependencyLibs/Core/src/org/droidplanner/core/helpers/geoTools/GeoTools.java index 276abed3ca..4525e1deac 100644 --- a/dependencyLibs/Core/src/org/droidplanner/core/helpers/geoTools/GeoTools.java +++ b/dependencyLibs/Core/src/org/droidplanner/core/helpers/geoTools/GeoTools.java @@ -54,8 +54,7 @@ public static Double latToMeters(double lat) { * distance to be added * @return New point with the added distance */ - public static Coord2D newCoordFromBearingAndDistance(Coord2D origin, double bearing, - double distance) { + public static Coord2D newCoordFromBearingAndDistance(Coord2D origin, double bearing, double distance) { double lat = origin.getLat(); double lon = origin.getLng();