7(gv})f*#wugc!hVIz{z=OUZgQPkHoY285Wmz62_bwvdh3Y`#~0?{>%@zFWi#v=@2d z^j$qt4PJOy{GytQ_hw~nh1Uj=g1pYcYq=M(nq8mmPkHAHy~_%qnJ=?mQQrI_ZvEyE zf7ZnNv6G@vR1-0s=Xj3@FYW@Mp8S_?yUfDvUf|VLND`? Yu*Ui9c^s`yN*JfBTZOWKZYpdE3a^MfxDrnLlb9Y%mo{&B#Ks0egK7 zuS@8sg(TK+>?Z_auW#5bQw;XL +jX=p>w2Qz<*5*b_Ivt&5@D1<~Apkr?*l3-ROb zzepUrs(*@|azXU sSjHA(;zl4^}m`k^%M zCYyaYA5(AyO}a`#Q8CTBO8f&)x;&Zq&fw 6(-Q zTLp@)v(v~QW*-Q wIi>2TS^z)m4o9}ux zrsn&Z0_A+Ip7XVq&38+)Cu*^*$Aw>y`C3oXF~2asqMWe(VLG5(443m&Ma()v&Ns_* zzGDS&v*5-kWh7Jh6&pywqiOgpma!}8pj#|sS4mH*Y}r=3JlQ_+@MPO4fIo*UYzck4aCq_41lH-uU_WQmE^uyC6w0e7v{Mer2w~7>pfd{nsHmPVc{jLUo z0!olZ)=M6gtXF9G9hOEH_;kHW_%M4TN&K4;hu`k|Yr&z}Te>y-P;@6zTGn#;4WOed za5^nz46ruS6$$M<54YM}0n{tM<|TFCEIQ~3@gMHsV+x)vuURB|H3;XFYAQ;>r{~;0 zq|~=?b)ZyNfm wmNN|owXF+JedLV;qA046DLu8W^F&x4 XREeggy27aq;=_urHdp}T zrYvZxj11t*?U%;K6r4^&?i2r4auucNm0LbEO9iXQWC-B93S2K4%~9Y+7bELt4@TDQ z0{9^D;0mSxnOI=4!xbzxH(V3Ptfr5z@sKT3{Fbl3wl-O+>qt^5P#~7zY6Y6)0{eLI z({%w g&2RI1x@)dGK^(CIEu=G_Y9 z^@eu~p7q8ymxerGWo{O)wLL`&svBp!QMzmTBb!q?swf>BU+3=IQe9USrbvNXY00mw z=;^$u@TBl8DtcK_37G1&K;5^)H52!kd6XF4y~I?C`B{{}e=CAlHV^FXMsS#lnOph| zcX=}3QttV=$mx2Xi+b6)SpELhb4owcWyGCswv3->T1AHiHxb9htgrd;Vg6ImeUh{I z{5WaT7B1;}A%#Y`Jb9_yvPHQv#umqiRSw&l3xNKxOO<$A3}5i!@qZ_1Ybvja<6c&` z$3V@?UlQ~R_$fEyyrg2Cz|}#gvH~Ycu(|>#yZBkB@nOZ!I#U3LqW51=`cp(ki(^#5 zVtd0iah#Z5xhv<_Sn+F;=xq1BRM$!*l?Vl1mSBtmuekVW*FE@Yw*-KDXT7ZSuZkLY zgO4frCiVNB)xcL2qvUt|=Q^Z!p&)B)a7>@z Tf%>0l*B=$)Jk3xNA n-T0p;Q6H)v&38ZtErD*N2ZO-M;dgIJ#fz&Nra9 zm*nT|{qgq;RjTWvjbO9!Ru4b=Y;FTUyELrN1%4?E)bj)#HMCFw7pC7^r@(nGBkl>D z&q1ZMfTE|Y2&*R{@8C~buZoij)}<~h-gOkXOoH_l_<<{a)&f54c5JN{K$V_zRDM`j zh+|7sQDsIHP`D 7Nos_(wjbU~vG!HF2yvF!Cbj*G2J5`L1M-s&zIbsq~;LpRpp`Tbi=*)|mI2 zo~^M>UxZBl$ct|=FAKM^DA?p5MjTJ-9}ed}Uspcg2(H-KBJFBIAL5otb2U>%oA~;W z$RAyX!7gU4?(-MG(RStC9;khJ7`*)W*kaw}pF$iRTgUiu4*ZP*f0y9Btj40hROh9a zaDCvQo;~!-5?m#{>b#xc$AD)$p_jE2nQ_Zi-O{hRjJWUX8yr+dMTLZG;>a0ke#Y5u zQ4!mk6I5HZ8d|BWSl&CN5lxgrn8TL} Te8k* y|+NR+Y1eAk%jXr=BL+akhFoEhVOk$v%EEf<6^?Ur+5O-CAFD zneho!V0#Iw2Ep3V6+mkWA65ah_7Fhjm72dY(pi+ JwhyW@za(FI?|{1fdCG@He4Nu+G0_5#kr$gQZUeR*ab zkDO1E;@8Tad2Xvzx9*fwl4-u# !{hErb?Xg9cb-CTx;*(TP~a`sp0nQL!-}r; zfdKx@ZmL>M>m893rIHX&Q|o l6_)aNu2ck9jTvz`T6vX4#b=EIRZ&s((aMVo zoFP`vqGBy8DsPhQs)@A@;QTz_B3jdFiN)mq%1*`TOWy&nj8M)i^9evE?^R$G3GP>5 zH5svBKI|5;Is(}B?uHMPehtp3eFz^@a4mUF9E(S7uE`@-toWVmFnOoj!-L9~Q#9L; zH7Y)5r7cYsHqA3dw6YZG{`9E&?VHwFG%6w~=siE4v@b>b3KBOIiJRBz*1IhISRZrF z5Tv^b{6m83vBCNTf&_&_E60abkTer5VT~5HJ{89kl5r5n6PDM+F>&MEd>~`Nl9Gii zdKS1$de`K-S-ce}*Uh3SP_CQixo%q7x-A*o#qGGQA^3T$o94c5{XWm>#Q9ZG{HnID z6}?${wI#WtW2vdYRuZhOz&5UZWoyTWRmf}|1@Lgv;BS?FGVgfXi;baRQA6RHIPN?4 ziugq+evzqjs|;1@VtNqcSXy$8{UXcKObynNl 4CJP{BO5GU>%n^$? zfsZM8qP!-Kn+KIHmQEuy|! z0QVZ4+OG6hxQw`0|CJn6N~>sbc~-n8Dt?n@KggLR6>KsuEmIXJ^U|W?VdHtpTVBt+ z^fd{7LnfG2%WHf3ANcvAzw`5TPuT`-AMN7NT%g!G9p^F(MJ(UqGHRjwekJ}k%W^d+ zdmx)<4`eIrfuc`5?yvM0i!CQsh_+ UH2#&S<}4^mW_hchuIg zDn^H-4Xa{wM1h cR)O4LI+zq*wVq4o(uv^=|e%} zfS3hhF$gfFgDD+M>0n9+Q{8m1W%C7514Jl@1Q4A;3;>Y{VhV_PAXb3b0pbvdQy{K_ zc*KOS7tIPV`FE-epR0nX38FTLx*!^WXaXV}L?nn<5b+?IfoQ=5ssZ~3_09U1&q)U@ z4lw1KK5aFn3w)!j5*-<6T2?vB_Vynh3#Y-|qiEGirs%0ybTEHkRo}^=0e?N<3sdo> zAPPXN1F;pvE)WMmd {$Qd!0ilBk08s-(JrH3arowc}w*t`tL=O=C zLBR5q9|dAOh+GixmkZ^cAU*)`F^JDV7$Ek6I1J(>h;tyWfPlXQD-TgG|BMN{4+!{@ zn7vB&YfM7W?TtZ1gGd0;7DNh&J|NOTya{3~h_^w&uCc=(OW2oySP5c16R5`6auuCj ztre|+e9HvOqHlssYw=X{=AYH3cr3>Mqb!>Gf1gDj!Q?yJBd1h4h5b`1jV d5QTwl;#dGOD56^yi 1$N(sr6_i>ccd2^V8fQ!^{OZ!C3e7GqJT!d3nq%Ij l!ZpI`nsFuytPIlnn`=FEAQHE&K^ z-<-DQ*R1c_ynjSU1^CZ?@NZ3b^scW(7=DZGIeEvhq2~;Skp)*z?FdcWg$zfcS3ceG zH0kMR{dhNY*lEYF1%+NtE$OATb?hY@+tRc?xU2o%Ov{d5cRKqzjf!jNJ;a{%aST0Z zLjHP1XVfJSwbbJxP@d*wxtvea=s7>)L#uW|T9r`006+hzgoJTv=@n+;AIF1yH8lK# z*EF&ds%)81!5GL@p3oM1>6$#$mag7Hv?d($V~@oKgoLFegeN2?h9-vw1%;+0gan2q zrGySk2@f0=nv@to(|aRtYKcQJv_%Zk+VUr3gM)(u0)mHyg#{*uBqt{aC5MKlL<9zf zCL|^YCnP2YM1%$>1O*KXj~zcTEiHB2gyxfin*$M=Fc5js`7x+nIVji<< PXv|qpAMt@8wB^mx7KO7J{E_wW9Tp@N!+T! m^BqxQY1cgK-g+(MKg(Ree1%~-21P%)e6?r+z3x!eN9ms?F#~^3=*%IW|ocoTA zNEsFq9+naqmY9?r5Rs4&p2AYqKQSaRA~`uUI3y{8rF?L35-p*~hp 4oDW~x07vPE z>*Fd29kJ)$hjDM}KLv-fU!wJ^4e=U+jCw{>+|$UOI~Rc0pyPDShbWv{1933@B@n+s zr)lo5s4KOG;082L!)98;4~OdugYh)>EH#JYFR}Amd&y_vv}Y?Es@ILcP6!e34nQk? zWlMa4xEf;z2V}A91JQ&y+>VZo#sTzETO5uy(10#DoGv_$TIrugVt0f#(_VvxN}ygN z8Y2UvSgRu*Xmm0fn#}kIU04sdrt!5 RVO{OJMM;12wP+)n(vF+(H{E< z|1C&A^FCiDP3?_Opnf!~Aqv;oMU;%tK)bbQK5dmq!tMU|JL=c^;eD{CRRi%(RG((` zggC_G*81^5*aM-)G&dQ2qz{S3f3WrBMBN+9*OU7*qaPoFs@n5k`_r58xGTy78uoLq zTIv5tz<$WEZbF3xblW-H161_5L_E#lWNhBd? GVQe=&7>#l zvt@Gh^$ffMO^0-nV^5w`e5ik#!A!Xt^_B6pd3 U#-w)r;rg z`%qP`*jQCgwdbyBN#mxoV&|5Fy$~92FIX!8YRkc%8#d0ztTq&V)cmZd4GZmTX?1g1 zZEz8_0Ra7UF4P8%7UaIG4Gf0bKwD9)qo3{Rv%{%>f7C`Fz6`uvXI?naj&A9L%yh$i zc9_|GTYd6!Jf9u>U5|p+3x~yPn8O*L;Ruv390H&>$^(aA+qY$gQ?8Mhhdp^!;zPZ` z8l29|%$k)GO`~SB`ka3rMNp3~Sb@Jtw=G~M-8VAfU%)7)usDhN*z>HPxhsb|*JE#V zg$C?FEva=QQyOv}St*O3P}lcuz*Cu%tk6l$G<7U<(sL`0r2pKETcf!&-~euCKleOD zANdvbK`5K1-(b&yhW>I3uEQ=7T75e%G+$#I=lTnXn=~Psm8K^ZaR)kS2lg`F0`v~u zHoX*WG;-_+fF8nTS1_<@R$(%iQvkgS;xUL~e%Wz5TffFebf1MOnx6B W!F4qv$jqX3iZq(`YMnBw1?|B-JMuv AUaaC(OtDGb4^t-|cKw?4Y~SvwugeX^ST~3hA_V7iOCQ z(fZRTxEexxSUbQk7gxPU37*5w;l#&R*Yby#WTK9A(7)JYyWnU?+cSSNQR_<_p!>YQ zwGrA&^Dz>w1XJyxN591T8O5cq@t5X#EJvK@g2)y W%nZ3u$E1^%FA>2(*spW>qSd~b~Yd< zomj#ZJCQ=8tMS_1jWhZE4C%hqgVo&_3u(`qFOSNs+l!AvVY=o 5rjNGc+hMJ(S+k=2z*RXBxv zs*-i6NOYOk@>qj&sv3ENogdgeXav2UhXQHZDt7EymnnvNehm`C93~7++X~6jmF71f z0d#V0(iR&lK(@@F8&X+|!{L2(32R2u*pcQ#Pj}*l3_Ks%8a?%ebx98(alIkgjN&M2 z!MGo6LIU(xjfgWsi4-*^S@fkpX{|GOG3#S2nijz0#QGRkz~K7)&W{8mi_RXNgy^<- zl&Qb)C+8s}PX&`TXt>yn7BAUSeheY6(P*0R98J^T4 z!R*OPZO8$1SJa+N50;l!3)`#8kr2g)l%;qyd`M!TzU@gc9pTOblzNiwc+W`EP7jDC zUxN3`9mrKQ)}DSVTrciOY{)QfLWL#tMkg}Ip7F#=XBM-g!6tg@%R3WK=&HALCkvtR zZ`+6LL3!ffv4+=8kLpW0BeV|U7D4m-lAhx9!5lr;p9JcE?@yMq;Cz)g>V_-;#Y0FJ z`qd!Pg&jj)d;!oW4<@VtP*wn9Xnq8%>~99M9a@pY4l|qYs{eBcxy~$g+}5o+x0J9h zg3cVqmS!EsqTG+>rlCpto?(PQyAGwZI30D?Ba_Hw_SCet)v4GVs2T9qC_V(@jl*BQ z{3VP?8vUoY`9C$AE(@T8i=r8quv?iP=C7<$k4V;Rmh%OcLbGYN-!J!@FFn*3dtnzl zJv5*7>*b~jE$;44Y%9vkw?#C2Zz=CXyaD|#nw_BXKIzdKSE7Gw_g_5ueLK>z-0rsh zf(MFESN^j^8aEy)U-{$Tt3zoNTdDr@uktIlY<<6Zzr!-oZ?Vh2rM`GLsmERn>vpPp zuk_9GA*)$|sU(!04)JCQz{0!i>|akM>^;3Tyk4^2Ih{n%J@;5cFt`UhdIy=7{!==E zmhO6^z(I7)Kz4tgo5t84n@A#16>*ONpih`Y*t>BJd&yN+p{lcT{&*5Q-*K@lsrdZN zDP%4)Grdms5q=ZVb2C^4oBAOMM84t@;6UXW ?iqo-z(cC5>09~1~c&z?={BJ?}W9fUrnTl3z*yXKIitTgH~ZDc2l%#1Ic zwu^>?wFqXKpG$)E9Scb^n`+gK><~d?<<~; k-YYO2- zIYi(4DR~41c+)EKC0e$$8}pt?aIk*hGgh_GO8rnC31!{HJkv*ac_{70XIbDrCvBPE z?MGWj)9-^xYx{w@fqMPTq$PGTc7Aa>mG7%PQ*WvF_?mC4wxz*);(b5 ?3Q~W;}bT7gG0dwx_;5*auhF z50MaTct!)dqX{(UFuRQnzw?$BX7!gxc&WYG@uO^BYWc@Qt51^<+T{cZL77y%;4?sf zcmm4wN8%#kDsd;-rJH(+9E9-rf6p%6v*Hy#?R(aEc0Wsu2o=&^XT_x(N*NrcM;DOR z29{(qFR<`ep*zKohZjgV8`b}jv}He%ek5V+$I2f`4Eymb16`~1+uY?8qloSP!<&1t zwurbubL3WK*`tYej(;+yCdZoz+$s0S6pn8l?PCW0dIG2WFS4tr3jOUO_tEqx?s4Q# zq$LBt_=$92KkolT`m-O=mq=^&W9B8&-e`5NZbWIcb|&`HFJB_-4X6*z`h}#R{`BrI zWR HP5hcRk@o+PkC>WD@QnhS(=4N*O2Yu*L*XF; zm>OMYv;teuLq>zQM KhdDj}&c4A@&S`}btfasTVx^aa4~1V9!0xa8$|zst zE2XdQ5R)_CB<%|QH}h9XF4E9MnP^I*iikIA&OLZKE=vocnK0c#M9*O%S`gh`#1 Cw z9O2aF==5U&R4ZIwT`A8KPP6%(f^%r-J?8Y3v_DDBotEG<1)dR33xp4aUl71o{c4v{ zJ}aDxgiyML^cgrcN&5@soXIRf@dgK{(PR EYniR8au)8-KP>S#TH0>B;95>_xZV zX9w>Ty>Xu%JhireD3vq9jpN!(rEA;P>fdThOlO4~hqajsY1#v}wvlof-zxi~B&aHl zX^e21E|#K{Cko*H>U*gQOchSY@i_&Lr+yEa)9up!&vMSPLxR^8xKr%nH^PU)_X*%t z@~8ZzSkywD@8Zbad`{`^kz- 7I#lxUsb8!=jt%=Oo0z1_`3oh z334TTj( 6RQ5o5$X#8#tX>ijFTuk0YfM z^CIb)U#HxL*)G9GN^=Q4^qAchpYl0H$Gl1a4c*r_P|B2|C&YW?az3Zv6>`jC)xU87 zCl{v3g lkYEzZ+aY0U0A_a?s3S(lM zcr5u6C)ZPv>vf~Ug;=R>%9cF(DKJNZ0~PqOICr@Y GEX8M5pPW0Jq!sf>8JD>V93{bQ1&$Fr=~$%9rA2Du%tbAgaw^|R zk8#|Pg2&VN65`#FA4OgvoR(LKdhR3@Oq- FkhI*E;R6 BtvQ(}te$6PaWHP9e7{{~e`IIq)+*LPnoilNegMU{$k3RI=y2L&$SW!2NM zR9IHg_}^INqN0#G6bDP$;_$@qM>?l-OVRmtO1&pDq!Ud A{P|8K3a^2^13VuL)zF?JWh@vxe zj`w_ cvWnqWBXvaE$GDV{h+Q=zQ#8)L@ZXpVx2H1wsDn4idaol z &dDi$O1-7@yjg**B)C<9ZA68L=5s2Qw2lIpJ7{EQr5q{9i6gFHak^nl zYypD&XYyD{==S@UVYLb(2^dETGJ5gjgVeCzR%Ev60AuoY_eLSHDShQ_63}Mq)lE zVKb3qVq4L@Svn_oQIY%USi5HG_A{% T;K`jc}dVv%2#RBTUIG9ij=x6-HSJ>D{@S18^0ZMjnh%@7S6rS+}NjTltmmD z2xUL%!6MEKfa=}C;v`bau?4i0wt&+UE2$4REY70Jn -D}X?WGyK>Nu-U2+Y;E8Q?Qsk~G&4=dU)OQ`=^)FM!jX-5V(7S|V6={>;Z*SB{CT zd;3ri&S$yWyA?H;yhhTBc9W|E57o?Tw @zj#rTRHFuacC?a275at&m za-wJ}8?VZc+f=b>E+= aSpcukPP(g< o%=3-Bdut1*IZ&0sCKQJ0^bwa Fj4uNA;@J3E()I`fbS2LtX5!#AUBK8 zDR{OV6WjWwZLV>0;}p5^*(WC!OLdbdfj~~(n5GBZ27s#ZH$4*DS|Ye83(p1cD!t_n z1wIkmDk`LcMR9~Nv3-&L;Wkb#Tan8txP3?^hegyF;ITm3u!uqfpk09##Z_6wft;m= z08q+BbyO@qqWh}K=ah|V)YsME-Epm=vu^z8lOa;UBx{z-1_jER<)RvY(-09W$C_m- zty!bU*Q&=f#fexA`!gL=*}@gxyeNamYPTY{$8BiGGJi}HtAVf_P~@s{n*bhBU=2a8 zwg`>F>kDAdyv-{WSc{XRD@^YSs;REzNo-3~^J{Tl=M}HQZXbTLOByh%pj}j;3fdI~ z4iVj#W6;dW)Yr@kD*KKY``9_eAx!47VQLWKCg|K(bRHDdZ+LS_I_qy-RN9-(GBB#I zH(Nvrb-V}7rT5^=;kyPXw(jDV7AdM=k)1FmwrO9@&jli`MAC6JEO}dLxl(WPj)$v@ z0-H)u{TadBT#yUkb7ks#hya#N=y6|JXd%c2@;LCM$)0lo_CBSG~?1xr71{08zlMb0ur0MDl {g;RR-b!_|D9XU2rvgP~2C%OJ=ZI~!Igm4dEP&cG>(5ro^Z2%UWJ@yQ?#`iB zcUHI(6`iE(PfY5MX4-Q80C*lQjcF?+sH%vzO58wegm cW|9R!qLyXju73IyKAo##Nn8b2n}Sn5Zo= zzbDekvAr>uwl@=2k5QeqxreBz;+QLM;)KJP*zOp=-NMNoQRKdj=`?2)jrL@%;Bons zNt_U%b6SCI#8ne5_DA6z1yHM-UmXQT@~g(9os5lW1>4hOo`z<|F<|;P{dZ48edL70 zcOQI8)2bP~Gn^T2@&VBhL>Pz|5bz})(+40XgO~?`g4h5;2XP$4MG!?GUNB*H2H^vu zA&4*#F(3wj_y9x(hy@_>(leOc3cnrzaTdfi5KlnBw~I8erGYICY-wOi16vx{(k6qL z2ZDkCQyQ4kz?252G%%%sDT_OZS|D10h-4ze(gS{t1Ca_M1H=Llc_6leI1b_>h$0X# zm~eCEfv-4`{a&Fm`|gzmz^WjsgMh!iyTP}g+~9jqZcRY=fd~W<3?dvvwU!`TgJ{bH zstI|52Bod?UfI{~pV^jbl??3-h5wvWkM^l#*ycU>MEooV&+OkZ`WQm6+cet4$516> z2H2Vl0#@O+48$4`n?URUu@}Tq5Z{A >+I z_P t^d_f5s7H4Iabsq4P{Qw8iivVWiZxT>KqMYRl(s27c{W$^Lt zms-&6bLJY=WC9;%!upJku4NdD_*WRcH0v{%IKzbaQlnQj>$B_@W8Oe6Tc0zbzSU^G UOdI(cK6io#uINAb8k#u$52mcGEdT%j diff --git a/app/build.gradle b/app/build.gradle index 2b2bc6c..06f1423 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -40,4 +40,5 @@ dependencies { implementation 'com.android.support:cardview-v7:28.0.0' implementation 'com.github.danielnilsson9:color-picker-view:1.4.0@aar' implementation 'com.android.support:recyclerview-v7:28.0.0' + implementation 'com.android.support:support-v4:28.0.0' } diff --git a/app/src/main/java/at/smartshopper/smartshopper/activitys/Dash.java b/app/src/main/java/at/smartshopper/smartshopper/activitys/Dash.java index b9804f7..c479c45 100644 --- a/app/src/main/java/at/smartshopper/smartshopper/activitys/Dash.java +++ b/app/src/main/java/at/smartshopper/smartshopper/activitys/Dash.java @@ -1,5 +1,8 @@ package at.smartshopper.smartshopper.activitys; +import android.content.ClipData; +import android.content.ClipboardManager; +import android.content.Context; import android.content.Intent; import android.graphics.Color; import android.net.Uri; @@ -7,10 +10,13 @@ import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.support.design.widget.FloatingActionButton; +import android.support.design.widget.Snackbar; +import android.support.design.widget.TabLayout; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; @@ -44,12 +50,12 @@ import at.smartshopper.smartshopper.shoppinglist.Shoppinglist; import at.smartshopper.smartshopper.shoppinglist.ShoppinglistAdapter; -public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnItemClicked, ShoppinglistAdapter.OnChangeItemClick { +public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnItemClicked, ShoppinglistAdapter.OnChangeItemClick, ShoppinglistAdapter.OnShareClick { private Database db = new Database(); - private SwipeRefreshLayout ownswiperefresh; + private SwipeRefreshLayout ownswiperefresh, sharedswiperefresh; private FloatingActionButton addShoppinglistFab; - private PopupWindow popupWindowAdd; + private PopupWindow popupWindowAdd, popupShare, popupAddShare; private String color; private Button colorBtn; @@ -116,12 +122,30 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte try { try { showOwnShoppingList(uid); + showSharedShoppingList(uid); } catch (SQLException e) { e.printStackTrace(); } } catch (JSONException e) { e.printStackTrace(); } + + sharedswiperefresh = (SwipeRefreshLayout) findViewById(R.id.sharedSwipe); + + sharedswiperefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { + @Override + public void onRefresh() { + try { + showSharedShoppingList(uid); + sharedswiperefresh.setRefreshing(false); + } catch (SQLException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + + } + }); ownswiperefresh = (SwipeRefreshLayout) findViewById(R.id.ownSwipe); ownswiperefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @@ -187,9 +211,9 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte if (fromDB) { Shoppinglist dbShoppinglist = db.getShoppinglist(sl_id); String colorstring; - if(dbShoppinglist.getcolor().contains("#")){ + if (dbShoppinglist.getcolor().contains("#")) { colorstring = dbShoppinglist.getcolor(); - }else{ + } else { colorstring = "#" + dbShoppinglist.getcolor(); } this.color = colorstring; @@ -205,7 +229,7 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte @Override public void onClick(View v) { - if(fromDB){ + if (fromDB) { try { db.editShoppinglist(sl_idString, name.getText().toString(), description.getText().toString(), color); color = "ffffff"; @@ -216,7 +240,7 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte } catch (JSONException e) { e.printStackTrace(); } - }else { + } else { try { db.addShoppinglist(name.getText().toString(), description.getText().toString(), username, color); color = "ffffff"; @@ -259,6 +283,7 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte popupWindowAdd.setOutsideTouchable(false); popupWindowAdd.setFocusable(true); + popupWindowAdd.setAnimationStyle(R.style.popup_window_animation_phone); popupWindowAdd.showAtLocation(v, Gravity.CENTER, 0, 0); @@ -301,6 +326,24 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte } + /** + * Macht eine Datenbankverbindung und holt alle Shoppinglists die mit dem User geteilt werden, diese werden auf dem recycled view angezeigt + * + * @param uid Die UserId damit von diesem user die shoppinglisten angezeigt werden + */ + private void showSharedShoppingList(String uid) throws JSONException, SQLException { + RecyclerView sharedRecycler = (RecyclerView) findViewById(R.id.sharedrecycler); + sharedRecycler.setHasFixedSize(true); + sharedRecycler.setLayoutManager(new LinearLayoutManager(this)); + List ownListsList = db.getSharedShoppinglists(uid); + ShoppinglistAdapter shpAdapter = new ShoppinglistAdapter(Dash.this, ownListsList); + shpAdapter.setOnDelClick(Dash.this); + shpAdapter.setOnChangeClick(Dash.this); + shpAdapter.setOnShareClick(Dash.this); + sharedRecycler.setAdapter(shpAdapter); + + } + /** * Macht eine Datenbankverbindung und holt alle Shoppinglists die dem User gehören, diese werden auf dem recycled view angezeigt * @@ -314,6 +357,7 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte ShoppinglistAdapter shpAdapter = new ShoppinglistAdapter(Dash.this, ownListsList); shpAdapter.setOnDelClick(Dash.this); shpAdapter.setOnChangeClick(Dash.this); + shpAdapter.setOnShareClick(Dash.this); ownRecycleView.setAdapter(shpAdapter); } @@ -371,6 +415,9 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte logout(); return true; + case R.id.addInvite: + popupaddInvite(); + default: // If we got here, the user's action was not recognized. // Invoke the superclass to handle it. @@ -379,6 +426,82 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte } } + /** + * Öffnet ein popup in dem ein invite link eingegeben werden kann. Diese Shoppingliste wird dann hinzugefügt + */ + private void popupaddInvite() { + final LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); + View popupContentView = inflater.inflate(R.layout.add_share_link, null); + + final TextView linkEingabe = (TextView) popupContentView.findViewById(R.id.addShareLinkInput); + + ImageButton exitButton = (ImageButton) popupContentView.findViewById(R.id.addShareExit); + Picasso.get().load(R.drawable.close).into(exitButton); + exitButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + popupAddShare.dismiss(); + } + }); + + Button finish = (Button) popupContentView.findViewById(R.id.shareAddFinish); + finish.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + String eingabeLink = linkEingabe.getText().toString(); + + String delString = null; + if (eingabeLink.contains("https://")) { + delString = "https://www.smartshopper.cf/invite/"; + } else if (eingabeLink.contains("http://")) { + delString = "http://www.smartshopper.cf/invite/"; + } else if (eingabeLink.contains("www.smartshopper.cf/invite/")) { + delString = "www.smartshopper.cf/invite/"; + } else if (!eingabeLink.contains("www.smartshopper.cf/invite/")) { + delString = ""; + } + String invite = eingabeLink.replace(delString, ""); + + try { + db.addInviteLink(invite, FirebaseAuth.getInstance().getCurrentUser().getUid()); + } catch (SQLException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + + popupAddShare.dismiss(); + + + try { + TabHost tabhost = (TabHost) findViewById(R.id.tabHost1); + tabhost.setCurrentTab(1); + sharedswiperefresh.setRefreshing(true); + showSharedShoppingList(FirebaseAuth.getInstance().getCurrentUser().getUid()); + sharedswiperefresh.setRefreshing(false); + } catch (JSONException e) { + e.printStackTrace(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + }); + + popupAddShare = new PopupWindow(popupContentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + popupAddShare.setOutsideTouchable(false); + popupAddShare.setFocusable(true); + // Set an elevation value for popup window + // Call requires API level 21 + if (Build.VERSION.SDK_INT >= 21) { + popupAddShare.setElevation(5.0f); + } + popupAddShare.setAnimationStyle(R.style.popup_window_animation_phone); + + + popupAddShare.showAtLocation(getWindow().getDecorView().findViewById(android.R.id.content), Gravity.CENTER, 0, 0); + popupAddShare.update(); + } + //Für Double Back press to exit private boolean doubleBackToExitPressedOnce = false; @@ -437,4 +560,90 @@ public class Dash extends AppCompatActivity implements ShoppinglistAdapter.OnIte e.printStackTrace(); } } + + @Override + public void onShareClick(String sl_id, View v) { + Log.d("ShareClick test", "Workt sl_id: " + sl_id); + String link = null; + try { + if (db.isShared(sl_id)) { + link = db.getInviteLink(sl_id); + } else { + + link = db.createInviteLink(sl_id); + } + } catch (SQLException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + + final LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE); + View popupContentView = inflater.inflate(R.layout.add_share, null); + + final TextView linkausgabe = (TextView) popupContentView.findViewById(R.id.shareLink); + linkausgabe.setText("www.smartshopper.cf/invite/" + link); + + ImageButton exitButton = (ImageButton) popupContentView.findViewById(R.id.shareExit); + Picasso.get().load(R.drawable.close).into(exitButton); + exitButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + popupShare.dismiss(); + } + }); + + Button copyButton = (Button) popupContentView.findViewById(R.id.shareCopy); + copyButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + ClipboardManager clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); + ClipData clip = ClipData.newPlainText("SmartShopper", linkausgabe.getText().toString()); + clipboard.setPrimaryClip(clip); + popupShare.dismiss(); + } + }); + + Button delShare = (Button) popupContentView.findViewById(R.id.delShare); + + final String finalLink = link; + delShare.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + try { + db.deleteInvite(finalLink); + + + TabHost tabhost = (TabHost) findViewById(R.id.tabHost1); + tabhost.setCurrentTab(1); + sharedswiperefresh.setRefreshing(true); + + showSharedShoppingList(FirebaseAuth.getInstance().getCurrentUser().getUid()); + sharedswiperefresh.setRefreshing(false); + popupShare.dismiss(); + } catch (SQLException e) { + e.printStackTrace(); + } catch (JSONException e) { + e.printStackTrace(); + } + + + } + }); + + popupShare = new PopupWindow(popupContentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + popupShare.setOutsideTouchable(false); + popupShare.setFocusable(true); + // Set an elevation value for popup window + // Call requires API level 21 + if (Build.VERSION.SDK_INT >= 21) { + popupShare.setElevation(5.0f); + } + popupShare.setAnimationStyle(R.style.popup_window_animation_phone); + + + popupShare.showAtLocation(v, Gravity.CENTER, 0, 0); + popupShare.update(); + } } diff --git a/app/src/main/java/at/smartshopper/smartshopper/db/Database.java b/app/src/main/java/at/smartshopper/smartshopper/db/Database.java index e74a97b..8eff423 100644 --- a/app/src/main/java/at/smartshopper/smartshopper/db/Database.java +++ b/app/src/main/java/at/smartshopper/smartshopper/db/Database.java @@ -35,7 +35,6 @@ public class Database { public Database() { } - /** * Verbindet Sich mit der Datenbank. Auf der Konsole wird "Database connected!" angezeigt, bei erfolgreicher verbindung * @@ -50,10 +49,125 @@ public class Database { System.out.println("Database connected!"); } + /** + * Entfernt einen invitelink anhand des invitelinks + * @param invitelink Löscht den invitelink aus der ganzen db + * @throws SQLException + * @throws JSONException + */ + public void deleteInvite(String invitelink) throws SQLException, JSONException { + String sl_id = getSlIdFromInvite(invitelink); + sqlUpdate("DELETE FROM \"Shoppinglist_member\" WHERE sl_id = ?", sl_id); + sqlUpdate("Update \"Shoppinglist\" set invitelink=null where sl_id=?", sl_id); + } + + /** + * Gibt den Invite link einer Shoppingliste zurück, wenn keiner vorhanden ist --> null + * @param sl_id Die shoppinglist von der der invitelimnk gefragt ist + * @return Der invite link + * @throws SQLException + * @throws JSONException + */ + public String getInviteLink(String sl_id) throws SQLException, JSONException{ + connectDatabase(); + String SQL = "Select invitelink from \"Shoppinglist\" WHERE sl_id = ?"; + + PreparedStatement pstmt = conect.prepareStatement(SQL); + pstmt.setString(1, sl_id); + ResultSet rs = pstmt.executeQuery(); + + rs.next(); + String returnLink = rs.getString(1); + + + return returnLink; + } + + /** + * Sucht anhand des invitelinks eine Shoppingliste und gibt dessen sl_id zurück + * @param invitelink Der invitelink nach dem gesucht werden soll + * @return Die sl_id die dem invitelink zugeordnet ist + * @throws SQLException + * @throws JSONException + */ + private String getSlIdFromInvite(String invitelink) throws SQLException, JSONException{ + connectDatabase(); + String SQL = "Select sl_id from \"Shoppinglist\" WHERE invitelink = ?"; + + PreparedStatement pstmt = conect.prepareStatement(SQL); + pstmt.setString(1, invitelink); + ResultSet rs = pstmt.executeQuery(); + + rs.next(); + String returnSl_id = rs.getString(1); + + + return returnSl_id; + } + + + /** + * Fügt einen invite link zu den shoppinglisten hinzu + * @param invitelink Der invite link der hinzugefügt werden soll + * @param uid Der user zu dem der invitelink hinzugefügt werden soll + * @throws SQLException + * @throws JSONException + */ + public void addInviteLink(String invitelink, String uid) throws SQLException, JSONException { + String sl_id = getSlIdFromInvite(invitelink); + if(!sl_id.equals("null")){ + sqlUpdate2Param("INSERT INTO \"Shoppinglist_member\" (username, sl_id) VALUES (?, ?)", uid, sl_id); + } + } + + /** + * Erstellt einen neuen InviteLink + * @param sl_id + * @return Der neue InviteLink + * @throws SQLException + */ + public String createInviteLink(String sl_id) throws SQLException{ + String invitelink = generateInviteLink(); + sqlUpdate2Param("UPDATE \"Shoppinglist\" SET invitelink = ? WHERE sl_id = ?", invitelink, sl_id); + return invitelink; + } + + /** + * Wenn die Shoppingliste bereits geshared ist wird true zurückgegeben + * @param sl_id Die Liste die geprüft werden soll + * @return True wenn die liste bereits geshared ist + * @throws SQLException + * @throws JSONException + */ + public boolean isShared(String sl_id) throws SQLException, JSONException { + connectDatabase(); + + String SQL = "SELECT row_to_json(\"Shoppinglist\") AS obj FROM \"Shoppinglist\" WHERE sl_id = ?"; + + PreparedStatement pstmt = conect.prepareStatement(SQL); + pstmt.setString(1, sl_id); + ResultSet rs = pstmt.executeQuery(); + boolean returnBoolean = false; + while(rs.next()){ + JSONObject jsonObject = new JSONObject(rs.getString(1)); + + Log.d("isShared LOG ", jsonObject.getString("invitelink")); + + if(jsonObject.getString("invitelink").equals("null")){ + returnBoolean = false; + }else{ + returnBoolean = true; + } + } + + return returnBoolean; + } + /** * Löscht eine Gruppe von der Tabelle Group und alle items dieser group, desswegen wird aucj die tabelle item geleert + * * @param group_id Die group id welche gelöscht werden soll - * @param sl_id Die Shoppingliste auf der sich die group befindet + * @param sl_id Die Shoppingliste auf der sich die group befindet * @throws SQLException */ public void deleteGroup(String group_id, String sl_id) throws SQLException { @@ -61,12 +175,31 @@ public class Database { sqlUpdate2Param("DELETE FROM \"Group\" WHERE group_id = ? AND sl_id = ?", group_id, sl_id); } + /** + * Gibt den Besitzer einer Shoppingliste zurück + * @param sl_id Shoppingliste von der der Besitzer gefunden werden soll + * @return Die uid des Besitzers + */ + public String getShoppinglistOwner(String sl_id) throws SQLException { + connectDatabase(); + + String SQL = "Select username from \"Shoppinglist_admin\" WHERE sl_id = ?"; + PreparedStatement pstmt = conect.prepareStatement(SQL); + pstmt.setString(1, sl_id); + ResultSet rs = pstmt.executeQuery(); + + String owner = rs.getString(1); + + return owner; + } + /** * Bearbeitet ein Item in der Datenbank - * @param item_id Daqs zu bearbeitende item + * + * @param item_id Daqs zu bearbeitende item * @param group_id Die gruppe in dem da sitem ist - * @param sl_id die shoppinglist in dem das item ist - * @param newname der neue name + * @param sl_id die shoppinglist in dem das item ist + * @param newname der neue name * @param newcount die neue anzahl * @throws SQLException * @throws JSONException @@ -91,9 +224,10 @@ public class Database { /** * Löscht ein item - * @param item_id Item id + * + * @param item_id Item id * @param group_id group id - * @param sl_id shoppoinglist id + * @param sl_id shoppoinglist id */ public void deleteItem(String item_id, String group_id, String sl_id) throws SQLException { sqlUpdate3Param("DELETE FROM \"Item\" WHERE item_id = ? AND group_id = ? AND sl_id = ?", item_id, group_id, sl_id); @@ -101,10 +235,11 @@ public class Database { /** * Fügt ein neues Item der Datenbank hinzu + * * @param group_id Die group id in der das neue item angezeigt werden soll - * @param sl_id Die Shoppingliste in der das neue item nagezeigt werden soll - * @param name Der name des Items - * @param count Die anzahl des Items + * @param sl_id Die Shoppingliste in der das neue item nagezeigt werden soll + * @param name Der name des Items + * @param count Die anzahl des Items * @throws SQLException */ public void addItem(String group_id, String sl_id, String name, int count) throws SQLException { @@ -154,6 +289,7 @@ public class Database { /** * Hollt ein bestimtes item + * * @param item_id Die sl_id in der das item ist * @return * @throws SQLException @@ -349,6 +485,35 @@ public class Database { } + /** + * Verbindet sich mit dem server + * Holt alle shared shoppinglists des users + * @param uid User von dem die Shared Shoppinglists geholt werden sollen + * @return Die Shared Shoppinglisten des Users + * @throws SQLException + * @throws JSONException + */ + public List getSharedShoppinglists(String uid) throws SQLException, JSONException { + connectDatabase(); + String SQL = "SELECT row_to_json(\"Shoppinglist\") AS obj FROM \"Shoppinglist\" JOIN \"Shoppinglist_member\" USING (sl_id) WHERE username = ?"; + PreparedStatement pstmt = conect.prepareStatement(SQL); + pstmt.setString(1, uid); + ResultSet rs = pstmt.executeQuery(); + System.out.println(uid); + + ArrayList shoppinglistArrayList = new ArrayList (); + + while(rs.next()){ + String shoppinglist = rs.getString(1); + JSONObject jsonObject = new JSONObject(shoppinglist); + + shoppinglistArrayList.add(new Shoppinglist(jsonObject.getString("sl_id"), jsonObject.getString("name"), jsonObject.getString("description"), jsonObject.getString("invitelink"), jsonObject.getString("color"))); + } + + + return (List ) shoppinglistArrayList; + } + /** * Hoolt alle groups und items der list und erstelt ein Detail objekt von jeder group. Die detail objekte kommen in eine List @@ -382,8 +547,9 @@ public class Database { /** * Holt alle Items einer bestimmten gruppe + * * @param group_id Gruppe welche geholt werden soll - * @param sl_id Die Shoppinglist in der sich die gruppe befindet + * @param sl_id Die Shoppinglist in der sich die gruppe befindet * @return * @throws SQLException * @throws JSONException @@ -392,9 +558,9 @@ public class Database { List details = getListDetails(sl_id); ArrayList- result = new ArrayList
- (); - for(Details d : details){ + for (Details d : details) { String group_idtmp = d.getGroup().getGroup_id(); - if(group_idtmp.equals(group_id)){ + if (group_idtmp.equals(group_id)) { result = d.getItems(); } } @@ -428,6 +594,7 @@ public class Database { private String generateGroupId() { return generateSL_Id(); } + /** * Generiert eine neue 8 stellige item_id * @@ -437,6 +604,15 @@ public class Database { return generateSL_Id(); } + /** + * Generiert eine neue 8 stellige inviteLink + * + * @return Neue intielink + */ + public String generateInviteLink() { + return generateSL_Id(); + } + /** * Holt alle Items einer bestimmten shoppingliste, angegeben durch die shoppinglist id diff --git a/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/ShoppinglistAdapter.java b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/ShoppinglistAdapter.java index dc7e6b3..5a6288d 100644 --- a/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/ShoppinglistAdapter.java +++ b/app/src/main/java/at/smartshopper/smartshopper/shoppinglist/ShoppinglistAdapter.java @@ -14,6 +14,7 @@ import android.view.ViewGroup; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Toast; import com.google.firebase.auth.FirebaseAuth; import com.google.firebase.auth.FirebaseUser; @@ -31,6 +32,7 @@ public class ShoppinglistAdapter extends RecyclerView.Adapter
+ + + \ No newline at end of file diff --git a/app/src/main/res/drawable-hdpi/share.png b/app/src/main/res/drawable-hdpi/share.png new file mode 100644 index 0000000000000000000000000000000000000000..312a6eed101def5d51f436ee22802c3ab46a844f GIT binary patch literal 547 zcmV+;0^I$HP)+ WIUmsCw^$ql z!*4)p=;k0JBO@O?jsatk8oD_MXki5*2LW*jz1+hD^!*GXLdcgMA!822SBMB5+NL2x zLqjQ`B}>sPeFwz9u;nr!4yB1hw6(R_fQFX?@mI8LJ=4 J9-~C=3kp zJy_y?1ITee`UjHOZ=hJ8o}L~zEpy5$B60~R+a545Fi@p+w$&xVF%LoY6um0M^ubiZ zg6g0&A{ u3(U0(89ffH}&+!GQ(nh&*V;33nLKQ7eG7q^_>6 zAds#BMK=fo#T$SXG7mj6f(WRF2h#tL9QGC31VK-W_kmHaLYEK&)$~9MPY{tqFNB7M zGSjo@Xe8t)V2J9_vriU5MCBYr&m3q#L A002ovPDHLkV1gW**(Cq~ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/share.png b/app/src/main/res/drawable-mdpi/share.png new file mode 100644 index 0000000000000000000000000000000000000000..b789b6833a6b0c8c95a1d152a94b82544981eefc GIT binary patch literal 461 zcmV;;0W$uHP)
aHq|IS+FtyFg?rd}068?g{NlD64xG4@!TwIjegA)J5mba56Axb$o z6K?XB*UwMS*4oBm=Q%O;X=a~kzTe;eUY?mq 30{j0ByE+ZD2lL$$OhcP zIlm`4FTzcs$Wr*SDw#~C*0QV)A~EC|s)^d<;Z?YY3xt&Ocml&_G)~0*&j3VwpUJaH^ z@(fJCCIM~1XsAw;Lk3J*Rwfx<)OJy**8?WQ5{!;_K_`NT0Zp;~?RN3Qu4`8N(kBD{ z-I}hKj?`oX9!pZxudV7*P(;U6fj^3D7)H(C`Y?D0bqd-#apOB?00000NkvXXu0mjf Dby?A( literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/share.png b/app/src/main/res/drawable-xhdpi/share.png new file mode 100644 index 0000000000000000000000000000000000000000..a50c5a8dab5c310f8958b873e2afb121cef5f8bd GIT binary patch literal 1011 zcmV %Vm;wq z56G1Pe}Ke)z_~+wmhWg|06f|k-dzcDt!c<75$CgfM;ikWI^g9m&wzXq<$OmQ13+jV za5_^1umUF$My0y&cfgw~fGaju;1rCQtBV0WKz fD$1w>A1($agY*WV2EUsuq~0PV?qj?NTxZh)+GRf3 z$XaNy*XuRe^s?&pXf)ajAD;>myMZs_<)l}CGyXBZnPDX*^@JFa5b~52)k>rUJT?a( zzeF#03WpCs1LmiBJf6YXuG?cJ0T%%=U?xb6x6BvAqak1yJbDZNUjg4N9=(S9dszxe z9{&roQtn(XS8pt136~omJp!B)?^f|15P?UhU|a@*hcP~|#Q7)SIqsdsxQ@>;H?rn+ zl4tTr<#?B(Lc9U4g7`j+k0kk$bBy^W%pElhqd#*(MJ$`*?SvgLgkbb4{2rxJs|*K` z^%BdO5NEhF02Lq~WzN9sMJjhmE)dyo!}BbAmE53cAy!x|D4=YF&3Rz4PW#kSO4wXB zperF%#l+WT!_k!_e#o+kaW)JYhq0ehBczO8wp&JldaT}Btl}7@26VHLQLr`hY)4dS zp$Z$)Nr_{?7K@ZvDn}&uEK;IfBykOl+(=EIRVk59%z@A>tC$Oi!-HT*0CPKlI^ZSn zRg9q_H&_(#-U8;A)9LJ^^HE_5NL~P5cM3V~#2UG3G(zk1PHz7|bP|YewHz5*`^H_2 zd#IOW%gIBo3g(ocl6nduJV4peNhA^(h%lQ7B5OeC4Di^p_l-00ovhv~GQ3A&5Q8 zfP5Xdsk-$#2ZZ7Tk?e6Pt0~JU6JDzXwj4heu@g&^yCdrLpGIaF#t5yo6XiC%yqY^Y houowm%3ry1{RLkRDmoiKadrRz002ovPDHLkV1h1d?a literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/share.png b/app/src/main/res/drawable-xxhdpi/share.png new file mode 100644 index 0000000000000000000000000000000000000000..6dab22342092452dccf32b5d01b6a29449369db3 GIT binary patch literal 755 zcmV 45o8^wc{MjH{l6l-GcAzBzv5J4L?VrQpdA%cPyg8B#SgmZp?AZl^!1qCe> zEG!f&5v?p#Yy|PPzHj^na+cjB=j@7P=6&ITg-n*6hn?M-Z?;rY6h%=K YV9G7 zM&pU`CBb9j+DVWE{Y|skJWkO0Uq(EJK|B2C7?Ge*1$8=|wFI60WW z>-EEA31SxD&Lcsg2}0*C8*xr95(x@O&~k!dF-r; Js`7Q{Z=@>7KyhF>c*SrKJ zQmfTA6LjL1k=4=9#&=_)r3UDesl8()D3K_NRuNqECF84+wb+~^-EMb1!GpFzkY|Q# z@5&v6GRV}HJ0vK3DD5Y>_%}w@(0ESJb~g#8;N`s_+^z=*ZtwHPRpTH@wr{uFTM2%< zPeus&V4NcO>oQ~NYQYke=->u|2jl}X!E1G%IB_`sW+dDFAZT-gR4SF#Wa{o12^v4; zzhlHj02z-+wOZXyd{`4nP==VYkypw); U()SVxlAwj@^?EA_B%CwchF_{M zNV-jMyor>{<#hzdSB&{#(DoXMqG%0~Am0R~Oh`8px5bR(-$qiF+oE o>WNzLu@CJpwI*jElpk-i A(okRU}-6h$d2e*h43%%c%?G?f4V002ovPDHLkV1gB{Q8NGl literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/share.png b/app/src/main/res/drawable-xxxhdpi/share.png new file mode 100644 index 0000000000000000000000000000000000000000..ff4132d7983e6a27859fbaa2c20b3d5804f62082 GIT binary patch literal 1741 zcmV;;1~U1HP) }R)6q=Qc{9_zbKu9!q;F}y@6CPpo_p>~ zS(%52hlhuUhlhuUheymJl}a5!>gwudgB79+{E-2Fwp`4%{aiseVAG3+hK5}l8ylyP z`uh4C2t-{7z7oHH-VFG&FU3OJ&yLg7)U>lJn`6}0)*cS=P9+fYA2A4qa%9l5$LHU~ z&_?nrfvJz#@p++zlu>1Ii)N2}E7Vp**uZIDWY+?go^c0sBClvk2aIMqofEnzl0t z&*h45Xuu)hI`K&a27C e~v(e*Cl+HrVulmiq+We6~d`ROG|*O3I2UP_*Se9 z_7A5dZOU?kDM?Oqj{ELpWo6}-1cIFm5v~;`P~U%Ct#+k;2f-dBxL-`?94^7J>coZE z<{c5Hsl!Qmo3xMRq`VtYq&9vAfpFJo0JTbO`2V%h+~z%keXGU3J|=Yoq6^#{x5mwA z4}yWvG!BLce(^&IzTy?^s}pXUW&eqZL}FWlZ7LynGl7V=i6_7su`UpMomhi&yi2g( z!}xp$q3~k2acuyFhj2#`h;SabLbMZzaw%SqB{U&(e+rMD#C` _cI>m=D041l!yj^uJrh9PqsO z6#OK@{``Po`~H%!fzS*!ebZ>>xW3vcJO>^GV!ld7Gs`4{(qh{;1U#j#WS_c?*+!qt z;q>EtFJk+9h}}0TDk`>$O>^T06geQkl@Q_?F%%^bc^Sd`dDgSSU~Ics_s!jaA_ONH zz+?hJ?t}?%kvxh$5Tq5pu;YVU#5pW@BH6|faWH`5SBZ`YuJ+y_n>p9Y$2}L|29(S| zYl?}I=cZ>ke`8e(IR4R=XLscl7`^TfVJ;>b2zh0h8xS)C&^%m3A~N73r6cBGfOn89 z?go_PO?Z}w^d^k=$H4HZ#FY=ap%5oQBJ75yi>P4m?KsbA#FcjgN-q@wf$qZV+ai)w zL~#7Mgp)khEaCH{xSMemcvcKWjFp1i$GKv{0$4Y|4Jcj|aY80NC5iJb#_I!OvY6xs zxB-QU0!+%&%pXLyiew)5Wnyb{S#5#O2M|rzcv(tVmI7fegHSU`wz3pn!B#{?LxZa4 zk-kysXFkw)yk0^$YgVSUVQzpMP`GAkV@eabtcNDZ2=3EF0s|ifKZ?Hs18k|$&)|K+ zr=eKY1T(9|myV7-2{@go>ub+!`*VbEMYr91tj5$++-|@oAHz$OAnftra$yT7dPgz^ zCOj=>T7^YbRn<-eCa3WEM)63{BQq9Rg$5UNu%{Kb@)$Ru*aq-Mt($eN^{6<2(;%)R zSirG1+k$Frx00yp;(QW3L#WLR!uzGR)*xV+6{D$lcM35hVp*%C?(41u!nN2MFs=t1 z;c19{LFUz#tM-f{KgAx`_k_JW>*2WpZb0FKRnde?kZi@H${5?kH)3_h%1K*mVB?7X zQ5euC!+Ny7cs^HI27|u|WpNITsMCw{^dO~9nJ^SlF#(xp_b4~O4JgS0T_x9^iO(Z2 zq61CeVT9>%SKJLKtzfa26@ID7$hQHnSpqQ*5AGPtH()BR&eKVrt2u0zZ>0^+s;jH_ zcE#O*(i^ZroFj>zEtFRSI4_=3_@6V$63Jw8M?Sn&4{%))fdPwc@`rQfuDBaey6J3I zWvDBfkM8JFWl!5(VmF|)4G88F_($6w5|$NRKbB-13zZ2BINK%8y+>5eftdzp*&ghg zb2{1{v6Dz7c6VjnfK4MZN-M22a=7AK&!@;~N-~yDYsvGsAzj?7NqI}wE%HfuH^9Tg j!^6YF!^6YFW1PmnZaQrE53Qy+00000NkvXXu0mjf`))9l literal 0 HcmV?d00001 diff --git a/app/src/main/res/layout/activity_dash.xml b/app/src/main/res/layout/activity_dash.xml index fdd25b3..e62986d 100644 --- a/app/src/main/res/layout/activity_dash.xml +++ b/app/src/main/res/layout/activity_dash.xml @@ -75,10 +75,19 @@ android:layout_height="match_parent" android:orientation="vertical"> - + android:layout_height="match_parent"> + + + + + + diff --git a/app/src/main/res/layout/add_share.xml b/app/src/main/res/layout/add_share.xml new file mode 100644 index 0000000..72a33ff --- /dev/null +++ b/app/src/main/res/layout/add_share.xml @@ -0,0 +1,94 @@ + + ++ + diff --git a/app/src/main/res/layout/add_share_link.xml b/app/src/main/res/layout/add_share_link.xml new file mode 100644 index 0000000..814fa84 --- /dev/null +++ b/app/src/main/res/layout/add_share_link.xml @@ -0,0 +1,77 @@ + + ++ + + ++ + + ++ + + ++ + + + ++ + + + ++ + + + + + ++ + + + ++ + diff --git a/app/src/main/res/layout/cardviewshoppinglist.xml b/app/src/main/res/layout/cardviewshoppinglist.xml index 340e3d3..320f74e 100644 --- a/app/src/main/res/layout/cardviewshoppinglist.xml +++ b/app/src/main/res/layout/cardviewshoppinglist.xml @@ -76,7 +76,7 @@+ + + ++ + + ++ + + ++ + + + + ++ + + + ++ + + + + ++ card_view:layout_constraintGuide_begin="319dp" /> + + - + android:id="@+id/addInvite" + android:title="Insert Invite" />
- @color/colorAccent
+ \ No newline at end of file