From 7a6853f6110ea544918fa8b84ac5345ade7133be Mon Sep 17 00:00:00 2001 From: Ebubekir <32433476+EbuSezer@users.noreply.github.com> Date: Thu, 23 Apr 2020 14:47:48 +0300 Subject: [PATCH 1/3] Face detection and Text Analysis were added --- .../Resources/Resource.designer.cs | 6 +- .../Resources/drawable/tr.png | Bin 0 -> 13470 bytes .../TravelMonkey.Android.csproj | 84 +++++++++----- src/TravelMonkey.iOS/Resources/tr.png | Bin 0 -> 13470 bytes src/TravelMonkey.iOS/TravelMonkey.iOS.csproj | 79 +++++++++---- src/TravelMonkey.sln | 56 +++++---- src/TravelMonkey/ApiKeys.cs | 12 +- src/TravelMonkey/Models/FaceModel.cs | 108 ++++++++++++++++++ .../Services/TranslationService.cs | 2 +- src/TravelMonkey/TravelMonkey.csproj | 11 +- .../ViewModels/AddPicturePageViewModel.cs | 77 ++++++++++++- src/TravelMonkey/ViewModels/BaseViewModel.cs | 8 ++ .../TranslateResultPageViewModel.cs | 19 ++- src/TravelMonkey/Views/AddPicturePage.xaml | 2 +- src/TravelMonkey/Views/AddPicturePage.xaml.cs | 15 ++- src/TravelMonkey/Views/FaceAnalysisPage.xaml | 95 +++++++++++++++ .../Views/FaceAnalysisPage.xaml.cs | 41 +++++++ src/TravelMonkey/Views/MainPage.xaml | 2 +- src/TravelMonkey/Views/SplashScreen.xaml.cs | 2 +- src/TravelMonkey/Views/TextAnalysisPage.xaml | 95 +++++++++++++++ .../Views/TextAnalysisPage.xaml.cs | 99 ++++++++++++++++ .../Views/TranslationResultPage.xaml | 26 ++++- .../Views/TranslationResultPage.xaml.cs | 15 ++- 23 files changed, 752 insertions(+), 102 deletions(-) create mode 100644 src/TravelMonkey.Android/Resources/drawable/tr.png create mode 100644 src/TravelMonkey.iOS/Resources/tr.png create mode 100644 src/TravelMonkey/Models/FaceModel.cs create mode 100644 src/TravelMonkey/Views/FaceAnalysisPage.xaml create mode 100644 src/TravelMonkey/Views/FaceAnalysisPage.xaml.cs create mode 100644 src/TravelMonkey/Views/TextAnalysisPage.xaml create mode 100644 src/TravelMonkey/Views/TextAnalysisPage.xaml.cs diff --git a/src/TravelMonkey.Android/Resources/Resource.designer.cs b/src/TravelMonkey.Android/Resources/Resource.designer.cs index 5e6cbf4..1d07de8 100644 --- a/src/TravelMonkey.Android/Resources/Resource.designer.cs +++ b/src/TravelMonkey.Android/Resources/Resource.designer.cs @@ -2,6 +2,7 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. +// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. @@ -11198,7 +11199,10 @@ public partial class Drawable public const int tooltip_frame_light = 2131165309; // aapt resource value: 0x7F07007E - public const int TravelMonkey = 2131165310; + public const int tr = 2131165310; + + // aapt resource value: 0x7F07007F + public const int TravelMonkey = 2131165311; static Drawable() { diff --git a/src/TravelMonkey.Android/Resources/drawable/tr.png b/src/TravelMonkey.Android/Resources/drawable/tr.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f1fbcb40dea56126176181c57da8c8812ea60f GIT binary patch literal 13470 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
  • &wfpHA&W?<*5Y-avD3 zUXpKTzPqELh{g_BR=TG5>EQzfQ4pT~ZV7^~;eFxXt5U~@XGq zRN56o*oBJJr69NFUN?PfO>Bvn@NHqdGh84Rv}6tDo|z8sQ(?8aOooBHpWXbgw8X}h zxy_%MFuy*K>uKjtWp8F6Kg-L9$^_(=MZYmm-_!nHpUAFEhR*N(2tgy&CcK>?o`dXT zg6d_uK{BU2;i*(xE_Svtb!rp7 ze`Tr;JFh*Sb=ZyEgu9L2`6h!0oQLJVdxS<6-WlF}F2s(Eggy5Ace0s%UZ88bV;2)y zll^31CpJ(blICs}iXj9@muIxrAzST*{vh~?tXD|eDvTdks9o)hD;7ht4eyj>AE14@ z94|5=wij)^n{glOj2X|*yO$PC*KJ?i?n9m5jh~IZD>r&G+*^FlY?*jG%n6(bwFsKq zW6|lpPl<8IgAP^r>Q2ZBU7_cACA`{n41UcwbpkG&>e5K8AD_Dr^6bE_!xluXjd*5( zl(S94L+YY=jbx266;5bVz?WGK=kBTC{Z?pCJ1@GtjoY5LhP)7hGcj4ZG7W~zHO z_OGe)Z+&pG@bB`;S@xw%?g^q=&_%lvkLj9R+2_N!WCE%ba+R@+T>%4`BC}$yjv?3) zlVyec3|&mv*NEIbb$RBHC(FJwH&|g)DE4$CogPu{j}T_8 z4Q9fH!EMNQ+Rl>eZ^Vi_--^h24R34u^7^u`UG>$3Qeav-gE--^-;YeI8^6U6*53DQ z4epyf0gb&825T~8k z@2}dQS19_fXsOIha*ksubWJCR3xk!{Wl9nE7E5GAoH6HeO0rv8$ZFelwa(k%)OwlU zvvgSOd6(QsWej>*KNA!yJcmZd8t83zigA!EYAq6m4Z>#B5*f&+*!31Y&osK6h9cjQ z)6xhfbxk-tP)Z4F>6*d{(}J;M#e?7C`(R@8QD@5>GLp!ZcKFPXDFK80AZhS+!l!-T zx>vU>Z1?Jh{Un4JA%9%1=e+(d)ln1HqQTw1+3KZLCQr?`S8jG8`RH# zxWY&o_)zr7jPE?Vz?EHNu`j8<`>W<6rHKw90!lbbuji~VcbL276-G7il|Pb=`fZ)9 zUrd_X40uvA4^9n-w|xxREUPCTM5p3+WrYa6tpvp~@4(ysabA;c71_ZK^}H#U?@*l_ z-`4jh_|S$M7all%J>5iB_eM8T1^Znwi20TW+Y`^7ovq>fv9dg;o{RBth=rdE@6bZm z&T-=g4KrJ5%Rt`4nDfwtT(D7bISeWv-+I`$#Jk`9d|b(zS?sqHS)qlKDv_Fh%43QZ zMnv_cfhf;y!Zr|I>mPS0288l_3aB^hP=DN}wz;8qscCR3WVHXU8B%9-ofVYWul<;_ zQYmn-&kLT7tgiC@ea;J;;phLbFnz1GV&l{-zkb8BB8?GQC27zTj4e1dSpV_K^_rU7 zFJG8z$8_lZ(C@j0hHTx9E0GsyCw!>tvl3&-h$as|EGwXs(5(6TMDmHz=i+qRw8%mv zXQLgB@;XZO@}wu~3+OYan-+v!G@-o8k%3$x6kAaIzCZ81^3qSysr#P`hJ%ud>Mo^K z?{dv6XstDA`d8EGO=YX=?!lo+tG}$ErP^}zmRj9~7jnMTDAYXG4%aqcdx6xcz&t-V zBKWgh>z~x}rhfHsn>UOYj$uZARX`|nQViVr+p~GYQKm%9ZqFNr{f%tM`P_16PLPdY zPU?Zn9NeacU#e=nPG`mIhOtKQKJxYP7&V$j4f)~J;$B(8`^l$(B~#iW$3UnuJagG#gip(C=9(4Zum6%@ACt9N(01l zgCkk6sHZYQ)4GYC@0$^KV$W&^ZOj#mC)uQ*f?f(ivFYKL#v4f%Y^8lS?)R-Fl3L2Q z!*4WxcX2%McT3}7$<>^qHUm$lyjDhj=teJu!pu$YYWmTj#Wlv$0b&ZSr6VnubMTu) zPsY6Fqx^6h6)Ck}yX9|YGhVCyuy0KbzFzLksCY7_VcJ6Ow9dy+EE#jIzbDF?H_tFo z%1&X(Qj1DEc+QWTE^e+%;rSsA@lJS~(<{G@k7}BvIEIT< z?}gru)bk*F)c@K6kp(Y{lzQ`P!Q+y?r6d1i9Xfdo8hNB)$sKP~V0u_V28hFSzU@}L z5+4Sa8nP^o%v(;6UkmMP8{vO$NbEy0Eo|8X`@r2-u3a z?`)p{YngD3xOML{{aAy}CceC6?FYy$UEYY#fj>Y!F9Hqv%z!^NU^^U%0*-(9Uz zmp5X1GbLxrqMxK~J|eL{t|3PZUDyqo?gSeFyQ(*JkiC3%Jdl7PRP8cI+4`j-wcfy% zsIE)2Q)?j&NmyEiEZN^|+7zp1_`4WB3i4Tqhy9O_pN>aznE%&f+PwJPo~wS$*E}65 z-elTFj`noD&O7!1R(m&^5qu1Cb0LU;ZDK64M;$XBu!;N?Ioe;|U`71)GtkTZ%ZOtp zzdk)e_P;(^{5e97on3%HT8IFChv909Y^VxY+ios@cKHi*!5^xy)=-(~9+iu=Y~7RT@2`CihVu!(wEzEn1f6|usMt_+nz z=H8f&fP`0U6!C*NvR*BXVI;wX+_(#BDp@f190j;-30MfsGD0E zf90mb;FpSrmjy;pUpWz+e0*B0k;bYg#UTIS%1vi8@}h*05Oh9=sZdwXiD964JtkMQ z_(+4Xvy+QelUmzHZgcur*fxG7Op}Le|KneLQbo3u(EgL&Q{El-F?IQE4?%3JXErOJfDeBl3qmJKDaU!E^~Be-KXVe`ldLY&=Uy3?!BLp*;`FZW9@^Rx`|9=KYaq< zW~izw*2#7>lRgNQ*N|I}j?W9NE;If&4DvgO<%>aa22`yka3IxQ%GPZP z=0<4e%MtMH<8~Cq!)~6jjlQx8G@)9azcEK>V1&EgSbX#&uIv*_8uAH1XwhV-;bVZ%3rI{ z0iiuh-z77dk?MmzPt8zTL%vxjLWm*bquoXq0V}6Ozf3;v{zX7EN+O5>R@jt##%)=l zR8TcNi>Yo_7RBE8SE)PRV{eQ{QG@!jTasYxI`a37(wu+WHF5-%V~^jc-4rX#D#@Vm zMd}r!tIC^t+t>yRGWCLtf^yEa3Pmzd*EWKNVCo)P(GPHFR8?K-KqWGpbE(~D7e3*G zP&9~Kz5)U8P27nWo4T9fzwk;icV&h6zLMF?c6@=tgakBAq+H!OYRd*83S`4@jmq`2 zInMntL#)WuMM|d5HjvsW2$s{cD2#J}QU1lP$YXZb7UMJoFi+gErz-^XwbT-iVhNt{ zC-*^M3MYyJaU#zQNk2!j3-mmv|Kp{{?6sJV(qgvxb{;cfFSslbqQhE@{ z3>o3A7cI%+6jn@1n0}W%m#t&i>e|n?TL%l{(0C?x0|n#fkbNE9-Lxh>@NLT7`2Z)fdW2h#(A)myl9LHIB zGi}^)IdHp)eM3>?s*pv-9E4Q)sul`^vh+!HvY@NQG=Be8<+qTUs?|inlQ9Mb><0y)EO=K^x_#oV zB0-t7rHKdJ^DUZ~YPk*Fdx`a*Uh=wpwNGEN(*IH9r8j?b{C0Ss?~=;(FVgxbPXE;% zOl^2fd=r(y*o9z~i#pg{dg1)I&cd;VuI}$|r&k-w^~YbYWA~e`sXuzot&#__~2e#TE5qlx$kl72{nxp z{tLX3pC(=P-ghbJQ6u8?2WhoWVuWmI5v5{wE}i!5kolMtWY&)%b0X@3y?mY_&x+F4 zQ+ow&t{!Dp)Vx{gJZ(CC#ZXDMMC}3R8ud;O`)Hl5`M0M{2mY#cvI^wCZI1g~{JhMT z)?NB=!Cha3D2>Sp|4JM?NGAT^@o`Mtzl}c2uAUs(km@dU)*-OHah^VitA6Y9c3oY6 zvmittwV`EJY+jiW7TbNM>avO-kxrIX5|&+e^BnC(JNZ#{p@p0v@8z)3+9n6%SH;5UcNQoP9&T_Gi;)am0Z{4Cm6ipZcp(tWu*jQ&*@WS<_rpDF4EBSC}*(n5-@ zG>7!DjBq8Rt=ZDDcqDY1+7ybV__se`e`b__-lpPHM2LcLZ(zNaZw&PY1aOeqiig7O z+PBx!OX$LbD4B1ru|;Y0YpC}07zqBWZBBIaF?gpN33lE-Pd1Nbf*(KD$AEhx^8U8{ zD9a7?`2Ca(h0BUw1>Zj~;dgYAh1_rdM-L|UM6^1k>xwAsuA6aK=8FA!I_f=t$Lc#S z3SWt2h#_hFs&Qa1I&n|*4j+Bs;FF}A>+7;NE5SGJ8C!r|$SgpWi^;KuV?*G_fW7F) zZJ>4Po@4l<>V$Ip`Vpb^%}9L$QEMT-Izc`FOMYDLcLW0OE-OrkhMJD7D(L^2o2{z( zLhVq)R3GfVxnNW-z@Rlk5k-?`4Ry(`+d5G|Fw|FSYx01F(mD?ht&WmjyXqMAfmCF6 zU37|rvezNDHc@g1$hwYbl%P9=hW2_WNV}a^Ysn0mqxG*d?C&nnNJ)0TmBV|&{0uk* zo|VQBPE0B=4m0(+*{E|c7PJVU7OpNh3ZXVewkVXAwIp>8vU@U7Mu}Xr6QSGBuf{O{ z7&V7?(P-vYse5cmJ$;YonQ~qf?0DChq%h8dBJuif)y1q^9A*N{|C>si!l0=%$@aIr z9FQvo!cF$(1HM%U=v_pwVT2mk@RFgT@pw_#`Q)I}+HY&P^e2*Y_NMbrQn-st1%5s| z$(|?#u;d(YRjrsrC_K4VLa0l?dW&55^am%r z)1?ko-P`s6+^m?QD#b?=hjZ-4-ZsZ1>aF+e1EQKu}j3 z!0(-)3In;ul3yPId@-@YXF3hCbt%VKv1r<~<$0-ZzYvg&Vx&+jX84%o?c1|Gh_WS` z$i3^5`$(gI7ESQ}C#NbK5&#$Ex-9nrc;}P6!g?4Xm=VqVO1bq9R-pHcWWaP_CqRw4 zMs>{e_N8HyLZ?<^of_}(=n44U4UEk}Ac?!n$n1y&ssrcuT;I+Q%Sn`)Nh$z)t{=d@ zbEzl@6hl6CiwOvJ3wM9yCW}C?ATvr5vb%T*%nNb%E%g9ga!BsBuG=H1SQ((jO99W; zpYtNw$$Z;MYCV1GSJP%Ds9|CRyu|ZI6D_6;Y@eo)413mrWJeSA?;xOhYbrtH*e|1UIt4QJiu1 zJU~`@Qi*29XGoHm$y-H>mKyRcA=?jr=s%o*XO=&rt%T8WtXt5vUi~^nTya#vk%!s^ zj2VG!R+QP(zp^cDCxHWsWmXlOd|qX`<0{YP&0bV>F-t;fbGZQ;;i6?4NOehBnrrRym-= z2^|W%1Updny45}Hd8q_dDVk300PKaNv$hz5x408IFzFK(0IrjeAfA}A~q*5s) zJDu2)hk?3`sZ)c@uzZ8;Z+r;IUlJ7ZD};HsJAeBdt?d*}CY5*~*@eWmeJIH!e#%6H z1wL^guBjIQ9tgSGXer5VTiV!9jNo@uUt-zP3QKuvshP|PNiHP) zqY4C{&Vn-Q3~B^Og_7F}+)P0V%2AEYwl7=r$(V;v0Md&xk92!&wg>#r-X7ZK06F|kao_;YC^Cn!4G^v>r*1Vi zRcwzkn14w^4)CTWF@YCa7NIrA& zZkQJ-Q8`B|mZV9eOX^p?#E;&~?BYzn@?qNJx$WujK17eTPmWmFW4Y}s5RkeABVhp> zeM}MmIS$RgnPAvvY+Q6=1+pEu!jrezSmP#5uVzuSUK1CXyzGavwS0?|n$m~Yv*xzD zXvnwOW^^5^?p`Ta;Q`?ovUYo+-EJ5;>zN>?*R~fF`7t*P*IyU_C7`oUGu{F1NeY)C z7xDT%26a!mmlh}eapVg+l>I3CO&H`eZNA7ou0iuKym2TYtt!$}>AqU=79Z&f4-B9ze+rV9QmCX`|la_`-hILWAi7#Z-ZZZnFZxkHjcNIqF}&1pPlb+UxB1F zk*(g}F_5(26RoBWkg>?nzmC$o0?FKk%oxH#arOP^2xcf(Ke=ipYYGO!)yGk`?5<7-0pi3wqHtTc3aBg?AF^K`CMT(E$ChcW|VfDTZuUYm9lsma_gTiaK z1Wskwk4>7vyghd+%C^M(AGT!xv*3Z0=YlZLQ$5C!$HWcH$cLpFSsy2qqKWk^n{Mqh z14@%FA?@Bl5w|Naq8&pOe$bqTvOPProxC+auwv(TRu?3kPmqLcD)%>)EM5jAG}`71 z?O6>ka7Qpt9MWj{g;1P4Ii|m+nF1kP8*j_{JPG7uZJs|n`<4X^j^WOsd{pB9@=<%& z?^9;hGNhR)j~d&(_{`SO%la-Mdf}`$)EQ{*TIYrlV`kOUHt$fbD?_JE;2|#s1X>xd zpcGj)?*FC8S_)uDC%vrWLDis4P2+4dsu50b3!+?G`TxVUjo98AzHxLKZ#1_&eI}c2 zjDTDpO}J0|n8QF}^pyGJ;)7ChGq}HL+u%jcAz1F1XcEUHCG8}TA8I?H9N;*i|HA=} zA=k9CduXA&;GKVay!36mO)>C_A4f7gX#E=$waYjftPirFL`H5wX&=|u*zBIGkDnyq zU{w-Vbw|QTdnbYN;3|pZ!rL?hAZtYv+@;RYt}^h(i#asy zWpmi`u`56xQ|9UWq{9;W*;IKE)so+@krh3z62HD-5iGNI{NnM%2PIbD$A2^Zd`H^a z0Ldjzc-4w{38D1ueav}ADh8(xJt3E#n)Fh7RLzEi-iSs@VDbIyJN;5@B7C0tYN2wT z+!Om+?&%zQML2nVsk--OH46?@g>WxVqNHKA!y`qNjms~e?L=on9OkJzEA8yec(;V; z=oS8p38jsz2hCrSO1v&yc`CE9Mm3)c2X&h4?8y%IIG=`M{nhd+9y>pgLfPr>@P2oz z%#Tv8a_apdH@ca+aG=lPz>LvY(lvUe!>mY`&U$&AROve|^l;)ZH&38g;8hah-SG<>voscUR;Q98=H;IT64o#|(rG=j`0Thf7zhvc@nE z`YOhY(n>{M1f$0K?{M(ye_jPJVfxRj0B0&SPEu)ZY@+CwEJo>3e-cH#Q(TQ-s7>{G#)= z7rG^sSA=g?QI~ARuV1)$;kZE?kJ1^^r5SV`Lg%P&#M|vW4i@s$wyGM+NV4odgEY9& zS0os&mbV|6yy(GOAw=3zYA|`(T{33>f{_65ZFTL+>vlzt6uvxv;e$n9swO@6=Kdil zsnF`c#9otoJB{k|q7~2ds1!hKU(vO0uv{>Ahp$jHrFdpZWjaqM`E6P3Lj6yG?3%)K}R`w~x2?81QVK9O&tb z+#K$jh$=9k`_@cHeQ?{Hvnz~hw%k;3pBxsqrJHV2=RO*Sl94SfhdRB$GlxM5(2t?M Lsb0B`)7Ae69ox4? literal 0 HcmV?d00001 diff --git a/src/TravelMonkey.Android/TravelMonkey.Android.csproj b/src/TravelMonkey.Android/TravelMonkey.Android.csproj index 4b9a5ab..155acb7 100644 --- a/src/TravelMonkey.Android/TravelMonkey.Android.csproj +++ b/src/TravelMonkey.Android/TravelMonkey.Android.csproj @@ -1,4 +1,4 @@ - + Debug @@ -53,6 +53,9 @@ + + 4.0.0 + @@ -93,57 +96,80 @@ - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + + + + - - + @@ -151,5 +177,5 @@ TravelMonkey - - + + \ No newline at end of file diff --git a/src/TravelMonkey.iOS/Resources/tr.png b/src/TravelMonkey.iOS/Resources/tr.png new file mode 100644 index 0000000000000000000000000000000000000000..b5f1fbcb40dea56126176181c57da8c8812ea60f GIT binary patch literal 13470 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
  • &wfpHA&W?<*5Y-avD3 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 Lsb0B`)7Ae69ox4? literal 0 HcmV?d00001 diff --git a/src/TravelMonkey.iOS/TravelMonkey.iOS.csproj b/src/TravelMonkey.iOS/TravelMonkey.iOS.csproj index 479887f..38d53b8 100644 --- a/src/TravelMonkey.iOS/TravelMonkey.iOS.csproj +++ b/src/TravelMonkey.iOS/TravelMonkey.iOS.csproj @@ -75,24 +75,60 @@ false - - - - - - - - - - - - - - - - - - + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + + + false + @@ -103,6 +139,9 @@ + + 4.0.0 + @@ -129,7 +168,5 @@ - - - + \ No newline at end of file diff --git a/src/TravelMonkey.sln b/src/TravelMonkey.sln index 222f516..8f51a42 100644 --- a/src/TravelMonkey.sln +++ b/src/TravelMonkey.sln @@ -1,57 +1,65 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.29911.84 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TravelMonkey.Android", "TravelMonkey.Android\TravelMonkey.Android.csproj", "{A06A377B-F901-4238-88BD-A92726C715C2}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TravelMonkey.iOS", "TravelMonkey.iOS\TravelMonkey.iOS.csproj", "{8C00CCB8-214B-4B88-8042-4C8D31284CD3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TravelMonkey", "TravelMonkey\TravelMonkey.csproj", "{04991790-FBB2-415A-9531-268B4193DB3E}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TravelMonkey", "TravelMonkey\TravelMonkey.csproj", "{04991790-FBB2-415A-9531-268B4193DB3E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - Debug|iPhoneSimulator = Debug|iPhoneSimulator - Release|iPhoneSimulator = Release|iPhoneSimulator Debug|iPhone = Debug|iPhone + Debug|iPhoneSimulator = Debug|iPhoneSimulator + Release|Any CPU = Release|Any CPU Release|iPhone = Release|iPhone + Release|iPhoneSimulator = Release|iPhoneSimulator EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {A06A377B-F901-4238-88BD-A92726C715C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A06A377B-F901-4238-88BD-A92726C715C2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A06A377B-F901-4238-88BD-A92726C715C2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A06A377B-F901-4238-88BD-A92726C715C2}.Release|Any CPU.Build.0 = Release|Any CPU - {A06A377B-F901-4238-88BD-A92726C715C2}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {A06A377B-F901-4238-88BD-A92726C715C2}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {A06A377B-F901-4238-88BD-A92726C715C2}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {A06A377B-F901-4238-88BD-A92726C715C2}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {A06A377B-F901-4238-88BD-A92726C715C2}.Debug|Any CPU.Deploy.0 = Debug|Any CPU {A06A377B-F901-4238-88BD-A92726C715C2}.Debug|iPhone.ActiveCfg = Debug|Any CPU {A06A377B-F901-4238-88BD-A92726C715C2}.Debug|iPhone.Build.0 = Debug|Any CPU + {A06A377B-F901-4238-88BD-A92726C715C2}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {A06A377B-F901-4238-88BD-A92726C715C2}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {A06A377B-F901-4238-88BD-A92726C715C2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A06A377B-F901-4238-88BD-A92726C715C2}.Release|Any CPU.Build.0 = Release|Any CPU {A06A377B-F901-4238-88BD-A92726C715C2}.Release|iPhone.ActiveCfg = Release|Any CPU {A06A377B-F901-4238-88BD-A92726C715C2}.Release|iPhone.Build.0 = Release|Any CPU + {A06A377B-F901-4238-88BD-A92726C715C2}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {A06A377B-F901-4238-88BD-A92726C715C2}.Release|iPhoneSimulator.Build.0 = Release|Any CPU {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Debug|Any CPU.ActiveCfg = Debug|iPhoneSimulator {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Debug|Any CPU.Build.0 = Debug|iPhoneSimulator - {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator - {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Release|Any CPU.Build.0 = Release|iPhoneSimulator - {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator - {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator - {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator - {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Debug|iPhone.ActiveCfg = Debug|iPhone {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Debug|iPhone.Build.0 = Debug|iPhone + {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Release|Any CPU.ActiveCfg = Release|iPhoneSimulator + {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Release|Any CPU.Build.0 = Release|iPhoneSimulator {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Release|iPhone.ActiveCfg = Release|iPhone {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Release|iPhone.Build.0 = Release|iPhone + {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {8C00CCB8-214B-4B88-8042-4C8D31284CD3}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator {04991790-FBB2-415A-9531-268B4193DB3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {04991790-FBB2-415A-9531-268B4193DB3E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {04991790-FBB2-415A-9531-268B4193DB3E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {04991790-FBB2-415A-9531-268B4193DB3E}.Release|Any CPU.Build.0 = Release|Any CPU - {04991790-FBB2-415A-9531-268B4193DB3E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU - {04991790-FBB2-415A-9531-268B4193DB3E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU - {04991790-FBB2-415A-9531-268B4193DB3E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU - {04991790-FBB2-415A-9531-268B4193DB3E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU {04991790-FBB2-415A-9531-268B4193DB3E}.Debug|iPhone.ActiveCfg = Debug|Any CPU {04991790-FBB2-415A-9531-268B4193DB3E}.Debug|iPhone.Build.0 = Debug|Any CPU + {04991790-FBB2-415A-9531-268B4193DB3E}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {04991790-FBB2-415A-9531-268B4193DB3E}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {04991790-FBB2-415A-9531-268B4193DB3E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04991790-FBB2-415A-9531-268B4193DB3E}.Release|Any CPU.Build.0 = Release|Any CPU {04991790-FBB2-415A-9531-268B4193DB3E}.Release|iPhone.ActiveCfg = Release|Any CPU {04991790-FBB2-415A-9531-268B4193DB3E}.Release|iPhone.Build.0 = Release|Any CPU + {04991790-FBB2-415A-9531-268B4193DB3E}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {04991790-FBB2-415A-9531-268B4193DB3E}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {09B5064B-74F7-4DA7-BCE3-0CFA917E847F} EndGlobalSection EndGlobal diff --git a/src/TravelMonkey/ApiKeys.cs b/src/TravelMonkey/ApiKeys.cs index 82c4dd3..8c91c78 100644 --- a/src/TravelMonkey/ApiKeys.cs +++ b/src/TravelMonkey/ApiKeys.cs @@ -3,12 +3,16 @@ public static class ApiKeys { #warning You need to set up your API keys. - public static string ComputerVisionApiKey = ""; - public static string TranslationsApiKey = ""; - public static string BingImageSearch = ""; + public static string ComputerVisionApiKey = "2e9223ee697640f7becd960bdab55f77"; + public static string TranslationsApiKey = "8e45a578f3b74d41977c1baf5b7cf4a7"; + public static string BingImageSearch = "0cde39557e7243d1b9dd4da4c3047b97"; + public static string TextAnalysisApiKey = "294dedcfddda47d2b131c9a08fe40c9c"; + public static string FaceDetectionApiKey = "d960b7f532cc4c70a70c3abe5b74dcd7"; // Change this to the Azure Region you are using - public static string ComputerVisionEndpoint = "https://westeurope.api.cognitive.microsoft.com/"; + public static string ComputerVisionEndpoint = "https://westus2.api.cognitive.microsoft.com/"; public static string TranslationsEndpoint = "https://api.cognitive.microsofttranslator.com/"; + public static string TextAnalysisEndPoint = "https://ebubekiranalysis.cognitiveservices.azure.com/"; + public static string FaceDetectionEndPoint = "https://ebubekirdetection.cognitiveservices.azure.com/face/v1.0/detect"; } } \ No newline at end of file diff --git a/src/TravelMonkey/Models/FaceModel.cs b/src/TravelMonkey/Models/FaceModel.cs new file mode 100644 index 0000000..9d8b41e --- /dev/null +++ b/src/TravelMonkey/Models/FaceModel.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace TravelMonkey.Models +{ + public class FaceModel + { + public string faceId { get; set; } + public FaceRectangle faceRectangle { get; set; } + public FaceAttributes faceAttributes { get; set; } + } + public class FaceRectangle + { + public int top { get; set; } + public int left { get; set; } + public int width { get; set; } + public int height { get; set; } + } + + public class HeadPose + { + public double pitch { get; set; } + public double roll { get; set; } + public double yaw { get; set; } + } + + public class FacialHair + { + public double moustache { get; set; } + public double beard { get; set; } + public double sideburns { get; set; } + } + + public class Emotion + { + public double anger { get; set; } + public double contempt { get; set; } + public double disgust { get; set; } + public double fear { get; set; } + public double happiness { get; set; } + public double neutral { get; set; } + public double sadness { get; set; } + public double surprise { get; set; } + } + + public class Blur + { + public string blurLevel { get; set; } + public double value { get; set; } + } + + public class Exposure + { + public string exposureLevel { get; set; } + public double value { get; set; } + } + + public class Noise + { + public string noiseLevel { get; set; } + public double value { get; set; } + } + + public class Makeup + { + public bool eyeMakeup { get; set; } + public bool lipMakeup { get; set; } + } + + public class Occlusion + { + public bool foreheadOccluded { get; set; } + public bool eyeOccluded { get; set; } + public bool mouthOccluded { get; set; } + } + + public class HairColor + { + public string color { get; set; } + public double confidence { get; set; } + } + + public class Hair + { + public double bald { get; set; } + public bool invisible { get; set; } + public List hairColor { get; set; } + } + + public class FaceAttributes + { + public double smile { get; set; } + public HeadPose headPose { get; set; } + public string gender { get; set; } + public double age { get; set; } + public FacialHair facialHair { get; set; } + public string glasses { get; set; } + public Emotion emotion { get; set; } + public Blur blur { get; set; } + public Exposure exposure { get; set; } + public Noise noise { get; set; } + public Makeup makeup { get; set; } + public List accessories { get; set; } + public Occlusion occlusion { get; set; } + public Hair hair { get; set; } + } +} diff --git a/src/TravelMonkey/Services/TranslationService.cs b/src/TravelMonkey/Services/TranslationService.cs index cac08af..9421eca 100644 --- a/src/TravelMonkey/Services/TranslationService.cs +++ b/src/TravelMonkey/Services/TranslationService.cs @@ -22,7 +22,7 @@ public async Task TranslateText(string inputText) { // Build the request. request.Method = HttpMethod.Post; - request.RequestUri = new Uri(ApiKeys.TranslationsEndpoint + "/translate?api-version=3.0&to=en&to=nl&to=es&to=fr"); + request.RequestUri = new Uri(ApiKeys.TranslationsEndpoint + "/translate?api-version=3.0&to=tr&to=en&to=nl&to=es&to=fr"); request.Content = new StringContent(requestBody, Encoding.UTF8, "application/json"); request.Headers.Add("Ocp-Apim-Subscription-Key", ApiKeys.TranslationsApiKey); diff --git a/src/TravelMonkey/TravelMonkey.csproj b/src/TravelMonkey/TravelMonkey.csproj index de0691b..ced6953 100644 --- a/src/TravelMonkey/TravelMonkey.csproj +++ b/src/TravelMonkey/TravelMonkey.csproj @@ -11,6 +11,7 @@ + @@ -23,9 +24,7 @@ - - @@ -51,4 +50,12 @@ Code + + + MSBuild:UpdateDesignTimeXaml + + + MSBuild:UpdateDesignTimeXaml + + \ No newline at end of file diff --git a/src/TravelMonkey/ViewModels/AddPicturePageViewModel.cs b/src/TravelMonkey/ViewModels/AddPicturePageViewModel.cs index c7acb84..cb3226a 100644 --- a/src/TravelMonkey/ViewModels/AddPicturePageViewModel.cs +++ b/src/TravelMonkey/ViewModels/AddPicturePageViewModel.cs @@ -1,23 +1,43 @@ -using System.Threading.Tasks; +using System.Collections.Generic; +using System.ComponentModel; +using System.IO; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading.Tasks; using Acr.UserDialogs; +using Newtonsoft.Json; using Plugin.Media; using Plugin.Media.Abstractions; using TravelMonkey.Data; using TravelMonkey.Models; using TravelMonkey.Services; +using TravelMonkey.Views; using Xamarin.Forms; namespace TravelMonkey.ViewModels { - public class AddPicturePageViewModel : BaseViewModel + public class AddPicturePageViewModel : BaseViewModel,INotifyPropertyChanged { - private readonly ComputerVisionService _computerVisionService = new ComputerVisionService(); + private readonly ComputerVisionService _computerVisionService = new ComputerVisionService(); + public INavigation Navigation { get; set; } public bool ShowImagePlaceholder => !ShowPhoto; public bool ShowPhoto => _photoSource != null; + private string url; + public string Url + { + get { return url; } + set { url = value; } + } MediaFile _photo; StreamImageSource _photoSource; + List faceModels = new List(); + public List FaceModels + { + get => faceModels; + set => Set(ref faceModels, value); + } public StreamImageSource PhotoSource { get => _photoSource; @@ -55,8 +75,9 @@ public string PictureDescription public Command TakePhotoCommand { get; } public Command AddPictureCommand { get; } - public AddPicturePageViewModel() + public AddPicturePageViewModel(INavigation navigation) { + this.Navigation = navigation; TakePhotoCommand = new Command(async () => await TakePhoto()); AddPictureCommand = new Command(() => { @@ -73,14 +94,16 @@ private async Task TakePhoto() if (result.Equals("Take photo")) { _photo = await CrossMedia.Current.TakePhotoAsync(new StoreCameraMediaOptions { PhotoSize = PhotoSize.Small }); + PhotoSource = (StreamImageSource)ImageSource.FromStream(() => _photo.GetStream()); + Url = _photo.Path; - PhotoSource = (StreamImageSource)ImageSource.FromStream(() => _photo.GetStream()); } else if (result.Equals("Choose photo")) { _photo = await CrossMedia.Current.PickPhotoAsync(new PickMediaOptions { PhotoSize = PhotoSize.Small }); - PhotoSource = (StreamImageSource)ImageSource.FromStream(() => _photo.GetStream()); + PhotoSource = (StreamImageSource)ImageSource.FromStream(() => _photo.GetStream()); + MakeAnalysisRequest(_photo.Path); } else { @@ -123,6 +146,48 @@ private async Task Post() { IsPosting = false; } + } + + public async void MakeAnalysisRequest(string imageFilePath) + { + + HttpClient client = new HttpClient(); + + client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", ApiKeys.FaceDetectionApiKey); + + string requestParameters = "returnFaceId=true&returnFaceLandmarks=false" + + "&returnFaceAttributes=age,gender,headPose,smile,facialHair,glasses," + + "emotion,hair,makeup,occlusion,accessories,blur,exposure,noise"; + + string uri = ApiKeys.FaceDetectionEndPoint + "?" + requestParameters; + HttpResponseMessage response; + byte[] byteData = GetImageAsByteArray(imageFilePath); + + using (ByteArrayContent content = new ByteArrayContent(byteData)) + { + content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); + response = await client.PostAsync(uri, content); + string contentString = await response.Content.ReadAsStringAsync(); + + //Display Result + faceModels = JsonConvert.DeserializeObject>(contentString); + if (faceModels.Count != 0) + { + var res =await Application.Current.MainPage.DisplayAlert("Hmm I see a Face", "Do you want me to Analyze Face?", "OK", "CANCEL"); + if (res) + await Navigation.PushModalAsync(new FaceAnalysisPage(faceModels)); + //var a = faceModels[0].faceAttributes.gender; + } + } + } + public byte[] GetImageAsByteArray(string imageFilePath) + { + using (FileStream fileStream = + new FileStream(imageFilePath, FileMode.Open, FileAccess.Read)) + { + BinaryReader binaryReader = new BinaryReader(fileStream); + return binaryReader.ReadBytes((int)fileStream.Length); + } } } } \ No newline at end of file diff --git a/src/TravelMonkey/ViewModels/BaseViewModel.cs b/src/TravelMonkey/ViewModels/BaseViewModel.cs index 1240a74..fd74e33 100644 --- a/src/TravelMonkey/ViewModels/BaseViewModel.cs +++ b/src/TravelMonkey/ViewModels/BaseViewModel.cs @@ -1,10 +1,18 @@ using System.ComponentModel; using System.Runtime.CompilerServices; +using Xamarin.Forms; namespace TravelMonkey.ViewModels { public abstract class BaseViewModel : INotifyPropertyChanged { + private INavigation navigation; + + public INavigation Navigation + { + get { return navigation; } + set { navigation = value; } + } protected bool Set(ref T field, T value, [CallerMemberName] string propertyName = null) { if (Equals(field, value)) diff --git a/src/TravelMonkey/ViewModels/TranslateResultPageViewModel.cs b/src/TravelMonkey/ViewModels/TranslateResultPageViewModel.cs index 137b899..89c3fe6 100644 --- a/src/TravelMonkey/ViewModels/TranslateResultPageViewModel.cs +++ b/src/TravelMonkey/ViewModels/TranslateResultPageViewModel.cs @@ -7,8 +7,11 @@ namespace TravelMonkey.ViewModels public class TranslateResultPageViewModel : BaseViewModel { private readonly TranslationService _translationService = - new TranslationService(); - + new TranslationService(); + + private Command _selectCountryCommand; + + private string _inputText; private Dictionary _translations; @@ -40,6 +43,18 @@ public Dictionary Translations InputText = inputText; }); + public Command SelectCountryCommand + { + get + { + return _selectCountryCommand ?? (_selectCountryCommand = new Command((code) => + { + Application.Current.MainPage.DisplayAlert("Selected Country", "Country code : " + code, "Ok"); + //Navigation.PushAsync(new PrivacyPolicyPage()); + })); + } + } + private async void TranslateText() { var result = await _translationService.TranslateText(_inputText); diff --git a/src/TravelMonkey/Views/AddPicturePage.xaml b/src/TravelMonkey/Views/AddPicturePage.xaml index 8a6f98a..98db819 100644 --- a/src/TravelMonkey/Views/AddPicturePage.xaml +++ b/src/TravelMonkey/Views/AddPicturePage.xaml @@ -15,7 +15,7 @@ - + diff --git a/src/TravelMonkey/Views/AddPicturePage.xaml.cs b/src/TravelMonkey/Views/AddPicturePage.xaml.cs index 3ea8d36..1985f96 100644 --- a/src/TravelMonkey/Views/AddPicturePage.xaml.cs +++ b/src/TravelMonkey/Views/AddPicturePage.xaml.cs @@ -1,4 +1,10 @@ -using System; +using Newtonsoft.Json; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Http; +using System.Net.Http.Headers; +using TravelMonkey.Models; using TravelMonkey.ViewModels; using Xamarin.Forms; @@ -10,12 +16,13 @@ public AddPicturePage() { InitializeComponent(); - BindingContext = new AddPicturePageViewModel(); + BindingContext = new AddPicturePageViewModel(Navigation); - MessagingCenter.Subscribe(this, Constants.PictureAddedMessage, async (vm) => await Navigation.PopModalAsync(true)); + MessagingCenter.Subscribe(this, Constants.PictureAddedMessage, async (vm) => await Navigation.PopModalAsync(true)); MessagingCenter.Subscribe(this, Constants.PictureFailedMessage, async (vm) => await DisplayAlert("Uh-oh!", "Can you hand me my glasses? Something went wrong while analyzing this image", "OK")); - } + + } private void Button_Clicked(object sender, EventArgs e) { diff --git a/src/TravelMonkey/Views/FaceAnalysisPage.xaml b/src/TravelMonkey/Views/FaceAnalysisPage.xaml new file mode 100644 index 0000000..149ce5b --- /dev/null +++ b/src/TravelMonkey/Views/FaceAnalysisPage.xaml @@ -0,0 +1,95 @@ + + + + + + + + + + + +