From 0999359454fdd44966b7d2ec6df0980e8403df0b Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Tue, 29 May 2018 15:45:20 -0400 Subject: [PATCH] Improve the image editor. A variety of improvements to the image editor, such as: - New, fullscreen styling - Smoother lines - Better text and sticker handling - Improved color picker with a history pallette - New highlighter tool --- AndroidManifest.xml | 2 +- .../baseline_highlight_white_24.png | Bin 0 -> 961 bytes res/drawable-hdpi/ic_brush_white_24dp.png | Bin 268 -> 788 bytes res/drawable-hdpi/ic_check_white_24dp.png | Bin 331 -> 561 bytes res/drawable-hdpi/ic_delete_white_24dp.png | Bin 345 -> 582 bytes res/drawable-hdpi/ic_replay_white_24dp.png | Bin 391 -> 1260 bytes res/drawable-hdpi/ic_tag_faces_white_24dp.png | Bin 593 -> 1838 bytes .../ic_text_fields_white_24dp.png | Bin 139 -> 708 bytes .../baseline_highlight_white_24.png | Bin 0 -> 654 bytes res/drawable-mdpi/ic_brush_white_24dp.png | Bin 193 -> 506 bytes res/drawable-mdpi/ic_check_white_24dp.png | Bin 311 -> 351 bytes res/drawable-mdpi/ic_delete_white_24dp.png | Bin 301 -> 446 bytes res/drawable-mdpi/ic_replay_white_24dp.png | Bin 244 -> 838 bytes res/drawable-mdpi/ic_tag_faces_white_24dp.png | Bin 376 -> 1100 bytes .../ic_text_fields_white_24dp.png | Bin 100 -> 482 bytes .../baseline_highlight_white_24.png | Bin 0 -> 1073 bytes res/drawable-xhdpi/ic_brush_white_24dp.png | Bin 315 -> 984 bytes res/drawable-xhdpi/ic_check_white_24dp.png | Bin 474 -> 576 bytes res/drawable-xhdpi/ic_delete_white_24dp.png | Bin 398 -> 685 bytes res/drawable-xhdpi/ic_replay_white_24dp.png | Bin 457 -> 1731 bytes .../ic_tag_faces_white_24dp.png | Bin 774 -> 2694 bytes .../ic_text_fields_white_24dp.png | Bin 105 -> 539 bytes .../baseline_highlight_white_24.png | Bin 0 -> 1721 bytes res/drawable-xxhdpi/ic_brush_white_24dp.png | Bin 429 -> 1757 bytes res/drawable-xxhdpi/ic_check_white_24dp.png | Bin 460 -> 990 bytes res/drawable-xxhdpi/ic_delete_white_24dp.png | Bin 338 -> 1072 bytes res/drawable-xxhdpi/ic_replay_white_24dp.png | Bin 675 -> 3145 bytes .../ic_tag_faces_white_24dp.png | Bin 1146 -> 4928 bytes .../ic_text_fields_white_24dp.png | Bin 134 -> 763 bytes .../baseline_highlight_white_24.png | Bin 0 -> 2102 bytes res/drawable-xxxhdpi/ic_brush_white_24dp.png | Bin 532 -> 2411 bytes res/drawable-xxxhdpi/ic_check_white_24dp.png | Bin 0 -> 946 bytes res/drawable-xxxhdpi/ic_delete_white_24dp.png | Bin 0 -> 1324 bytes res/drawable-xxxhdpi/ic_replay_white_24dp.png | Bin 908 -> 4258 bytes .../ic_tag_faces_white_24dp.png | Bin 1528 -> 6974 bytes .../ic_text_fields_white_24dp.png | Bin 111 -> 840 bytes res/drawable/circle_white.xml | 4 + res/layout/item_color.xml | 22 ++ res/layout/scribble_activity.xml | 59 ++--- res/layout/scribble_hud.xml | 89 +++++++ res/layout/scribble_view.xml | 4 +- res/values-v19/themes.xml | 8 + res/values/arrays.xml | 10 +- res/values/colors.xml | 2 +- res/values/dimens.xml | 2 +- res/values/themes.xml | 3 + .../securesms/scribbles/ScribbleActivity.java | 128 +++++---- .../securesms/scribbles/ScribbleHud.java | 250 ++++++++++++++++++ .../securesms/scribbles/ScribbleToolbar.java | 240 ----------------- .../scribbles/viewmodel/TextLayer.java | 2 +- .../scribbles/widget/CanvasView.java | 25 +- .../scribbles/widget/ColorPaletteAdapter.java | 73 +++++ .../scribbles/widget/MotionView.java | 34 ++- .../scribbles/widget/ScribbleView.java | 103 +++++--- .../widget/VerticalSlideColorPicker.java | 66 +++-- 55 files changed, 701 insertions(+), 425 deletions(-) create mode 100644 res/drawable-hdpi/baseline_highlight_white_24.png create mode 100644 res/drawable-mdpi/baseline_highlight_white_24.png create mode 100644 res/drawable-xhdpi/baseline_highlight_white_24.png create mode 100644 res/drawable-xxhdpi/baseline_highlight_white_24.png create mode 100644 res/drawable-xxxhdpi/baseline_highlight_white_24.png create mode 100644 res/drawable-xxxhdpi/ic_check_white_24dp.png create mode 100644 res/drawable-xxxhdpi/ic_delete_white_24dp.png create mode 100644 res/drawable/circle_white.xml create mode 100644 res/layout/item_color.xml create mode 100644 res/layout/scribble_hud.xml create mode 100644 res/values-v19/themes.xml create mode 100644 src/org/thoughtcrime/securesms/scribbles/ScribbleHud.java delete mode 100644 src/org/thoughtcrime/securesms/scribbles/ScribbleToolbar.java create mode 100644 src/org/thoughtcrime/securesms/scribbles/widget/ColorPaletteAdapter.java diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 4434022adb..7478ebc6cb 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -375,7 +375,7 @@ android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/> diff --git a/res/drawable-hdpi/baseline_highlight_white_24.png b/res/drawable-hdpi/baseline_highlight_white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..2491e9ecb113f0b9563e0c841b6192b193340dc4 GIT binary patch literal 961 zcmV;y13vtTP)37bAYR%_FGi@L z2Y;n12wtQ$LN)f5L#(A255-$swE4BszVCJhmXKsO+ck&cgU5v3nKz&J=IzXz)YSZ= z2qb2+SymHC&ABjP(GZ%Nnr^kUv;;_fPN(y_;$3ycVzFRS%j)Xtr&A_ApYJJqCm22< zrG^Q4Q7S+*DO%g&;$rONfM*D8lmCT%&O`T6+0%Up-?DDQEFgR>M#(u+kNxk z;2?=fMn^}V;2jw;6-#OY_hP9?$6YR$yD%F3r_E-&yt1+qh0W>d>DL5zfz4O`%b`xz zWHR{y12dUSj+)%a$Oxd!%B9r!CCX0P?RIf_dHFqT9v>g4&`wNDJXZYx7_l%oI2a(9 zAC#zol3<{_yStr5s&F|37=;$P%lk$mkyo&BbaeC^?at25#tjn8r|Kl{;P?A|*=+VF z43Ky48XFr$zNBzoiwbN&S65g2;o;#o*ow#F8)WM$n@d}$Yin!eoW`S|u>~zoCUQss8@{hwSjyU*5tS=21PB z3=sw;X@wy{gwj-+4C^{B%9JEBR5%=tC=<1mAZHjRJVWJKd>Qy_BokJJ% zt#|OK!~4MX>g8Pg@&EtNInTX3-bo!u@%em4C={*^sJ+9GuYcs)-k^{oD+sIAdZSXQ zyeSro&ms9%46dEn1Tf?Ac%{sIK4*zSlgVTX=U_1SfIFVHO&($sf|(PT1uB+h7a*9^>GZ%@ zfk43DnN8@=H-Et_;_>*S-?^p~?El$>VE}H9V3Lq$qztofo0hRy3}AR7k?0_7N>UB+ znoa#<*hF8ML$Qg^f!VK3WSSxvH_6NqHUUhEsxklr<#M@h4F-dwVCdQe0I-rmiN)eo zZqn)WW4r~xzO>k2Q;K8L_STwBOFF)GDwD}P1(4Zn27g(eufuFz8Il#$CaBD2v)g1c z1q}v+4P82ohlq2zTpmNMV5r%ImvsJpRGm)eBPS!@tJUgDolbWJ4;5vzS%CTxjYgAH zZHh!9_aL)4xDXNeSb??M?GGxIN{8E+a~6vQloM@zqa?kOLZP_W>-9bZ0J3AY{8J0k z%M=QQJb&Cm))y+fHq0bA8;wRcnK{d~f;9%J)oQ&5bpV8FKLh#k`Fs&z;cf+7AUHRh z%}?kS1-6ZD3tB3bp5xiWZUACIxkjV$4h=nnMP+EHBa+Ev7ZQm?3N_+Cv0Z;zMj-R~ z{1YneC+YarYPGW4?Y`xzu*R|=0Y@9^7mY@9iGOC883=SZ9KO@<_q!Z>U^`$z6%r@( za})}NZc~5IBTDJ@`m5z~`2}jYzOE@Wsn_eZ>!`Rhl4^09ZbqxsUiNyucm00K6#bP>0F0>yQ8d002ovPDHLk GU;%<$+;n3A delta 251 zcmVc zvydVOu#vU6f`yMkIg15%kV)YP7Q*DE_YjgRttY*Rp+H+1qbctOQw9}KJ4l!`D<8BB&U88Y7?XT( zD97FhwPhE|GUV(aC#oXG#xhi_B|DT!yuti?(G8fS)l!%%jD`RJ002ovPDHLkV1gdD BX;A;8Gi-<007|tn3w%oCtAYb8wN6V8iG~VPZCl)&USoX?@@3YR-xl$)!cpC%J@h$=&as=lZ@! zNTy7g{+TGH5)2te>L3Bk=f7xrFbW8Nce~va%d$@Sxx`^)S$_^-+U@qS@B20kzt`)v za=Dx?ff9q_onbJq%jME@90!@EhG87w901d#VUExlgjuiG2s3Fk8Wo&Fhmww|1^_QS zOtaanGH2wZovDS+xUP#Z&j4fKoT{oy(lEvbXLg6dB7q;kjxkly4S?|h#^YlOfq#9{ zP}@L7ocVwe5`R+&kk98ysZ>(pKFbJ9g~5o4iNVl9p+H8X(G4toZnOoYW0Zh%D!%DDu+<_cF`EEaD; zNu5rI;1n)QVFQUjH4h^sCi1oY1{*@Jx#Xed^Z6Y(6@SF1>$=Kd4u!__9aLCBqfii^ z1y1QW*XeZ7nMa{9{dBougitLW%C_y>!C+vbGuR}B#}rc-6$W*IyDrfVrqycYM|+d7 zn6`}XoI!yxj+;tv+7RCvQn2^TBypHc@%8(Cyyy?`o+&31Q%p&qnx+x%r6-d#6=}K> l*$1)ywHzNXnKJzay#pmw%$0~q3-SN}002ovPDHLkV1gn`1Oos7 delta 315 zcmdnUa++y^WIYQ51A{kbfH06^Nq6*hWMFJtVEAHMJdn?n17M^Km=%)Q-n}a$97B9xrpi(nKBUhcoJpKbsk|8eI7zqB($fsLb^pQJkjm@? zbct$-YeY#(Vo9o1a#1RfVlXl=G}SdQ)HO5+F*LF=HnB1?(>1WLGBB|F*6|#!!33lu tH$NpatrDce1gKos$SA}JsKXGbR@cBBNZx%E`v$0k!PC{xWt~$(69C|XX~h5l diff --git a/res/drawable-hdpi/ic_delete_white_24dp.png b/res/drawable-hdpi/ic_delete_white_24dp.png index 6522b421a9ca10dede4094c58fdbc2dda27ceb0a..b1b2ed1b364a6ed1d4799b1f4be59687f0503458 100644 GIT binary patch delta 568 zcmV-80>}N?0>%W88Gi-<007|tn3wRBoN(5 zi&P|LxG#$^Q{4L4w~BW8n$gY~M-Xh#dGw&>gOB4d zo^!r?J?CQH#a0GnHd8U=5%t6bg@@B@+Z;)a&*7z=33EC?_-;jh;z4sD(EO z3lnRhSS&t`bbm%H7Q0j`NbDjs>2&(KTCKK$&3e7w)8C-qc=STdh_d?&iDG3)MWux?HZka5#Jt3WYAf z&Lw^icrhLb1dhyR^OoXibpcU79%H7aaN1PLFZ;*i-{J!&85pCF?+tta0000uWq4S5-gq$COR5?CQ@GjoU*>=L zA9r@^f5if;_x`irxIivcU3lxEjx4r7-h@umlKb_^SFd^WIR5W6;BdbGfcs5gvm39J zX~q==mLKi`*Xq z2`>ahJ~Tu?5X=IM2O-;|kwn6VFGw_xUDW%lk|9TIeAg;IUcD(pcPR=Rkp8x%w-~aOx5P$Gwq9S4IfYTHLA_xL4 zwZ+B7@2J&k-Kl~B0Al1!b93_-i;Ig7u{KC#sZI+_U|n6^ryj`o`1n2iKKIlC@nB3Q z(`N+6?RFnbOibLx-$I@$ARbJ8eZ2_A>2$hio}8S#hrQ6iz(9KD3`F3Z-9Lhth+rBT z8bmNImusH}t$)YH#>iyGqh|n4@CzGN@E4<+1`}ip&R4 z>k>nExPQbbkgqTnYHMpvy!k3CD?gOnVpQ%OllZ#f)}t=ZYx<)gKXC;(#wOxxez z|2@m<%gf7mbvoS(>>0(=K~`4QCHTuvc=5lAD~l=s&p_n;$)c~Yu<#16!>5YjC3}ks zjYi{ntTo4-mrQqdaB%RJZ7C#Aj@p@q#7egS_|F^uQ$_{mX^ND0HIy6lh1ht#1uzHM!weD+dG6|wOA~j!NI}0 zlR6;sr`dO5T^cfCG%Z`1pAF zg_ebRTwGiV4m)5vHz`9Uw~!9Hl^kDUY=1^XM8vGFuKo&Lq8_W&`U5U@)+c|IKnZPa zZDzhW!ZAN$PRM{A6=Il~!eB65KtD9ZHFmCyjEr3V;oGAgNq+!m z1Tk8)6}qsnuop8kGcUHcw_6aQ4hf8SrmwH>CiP6j%!z9%b8xg8X^0ZL)Zn{W_`<&) zt*orfqaPY2HqeeNac%5j-`&~S`K?x~6*Kb_S9k_0JUslRuCA_ch$xRtL6`WTyuADx zj%yTcH@K>-hEu+Y8@GX(MI!8&23-Hq^z`&ZRaMo;xI{Gnq2Q1Ib{r~2eY*f~S$TPR z?-djje2|}?e--O1NEfeCSvcl0{`-QJ6S8vim7lnCE}t4QBGmxqY8UuxR!_IrNYJzfLJKit}ZmaiOhkGy{Z%MiVxvHRb za8)(g(%{uptZ-vG>e@{8uWxb;o-KU4zZkXupmx}L6r-tgWaP_EDtZa$x_^?}K84CO zytFSXYu{C6?L_ZSE6`@s%eOPTWJBxk`ZQ=KN_trj@&@WFXVQqYjEuBl$;7{c^aj8h V;`WV_+Q$F@002ovPDHLkV1f@DunGVG diff --git a/res/drawable-hdpi/ic_tag_faces_white_24dp.png b/res/drawable-hdpi/ic_tag_faces_white_24dp.png index 3aeae65b14618b66ab17523fd7890dcb02cd2ebd..54d12d1b15f61cbdd64f3185a4681c9ecb7ae5d2 100644 GIT binary patch delta 1834 zcmV+_2i5q|1g;K{8Gi-<007|tn3w&;p7gsnpicDoP1b z5o)CZ?k;=jcmB>X!|oyowUbQ#-G9!`eCPI^GpkZfaHuh+xPKmMT2}oZgFv{sx$&W| z93+RSexpF-^Zfk$Lgvq(AHQJ1g5*Vu7G+>=#pex?k&*MTK284pcoZ1-kT(MeeO6Xh z&c%xt&vbNjwA=0WLHo#IHJMC(w{PEWIez?jd17MXI{eI2Sd8?V95A-Z)TvVg4j(>z z2q1oyPq*1@_J1*k`RdiHmshV|{obUl#bDr;<;~5_-}4C;i$z9Z8W^1d73AWMrh_z#iJvXf&Ex>)P5{Ltb9q{@B>q#96au zMR<96=>h`-^-)n#^H!`_k@6YF{rmTSl7Lz1+0f8nn13;2M(AsSVle6H>1kH0bwEL2 zHe2WkAeUFIT9t%lkFoag_4U;ObnfHFk2{1yCVC>i>Vt!W^%PEH#uTHTJ9qA~!NI{^ ziV>lm88P$`mb_U`qtPhoPm>3ICWUB?_Y4aQi!>Mv-x8P?FJ361E?v6x4P?C?GS?}! zm4hgNTYp+w8kGPsnTF|+lasTXWN?t1ySuxBWIQzC;o+eX3ItrZaN(?Mse=a(=F1*& z8m!eJ3<-?AprGJmdXIqAOoUqmp;M*?-@0|Hkz=aAzyArW_bwa4Nh5mr`}>D?qk$S664ik~gfPfDH`|jas~TaawqIc&sQ7YJW#73$Q*Q$@P%k1Vywghm1`a8XD^7 zAg`#XD3y)jWSt#5cI0qsV;bY);*uEf#*G`-L#s{^3w_zy*_lju42I;8aXxU*Y0j|v z`ueJXfPf(38uh7Dr@jsD)r5(0)5yrIUlrkyS@yS$|jW z`5n6@B_$=3&jJOt6xZCh5&B1!_JK6&!wR}84Sy80X$PgYzl0?xm+wY7x> zj~+c*BAPQdtf^5DzqU_sppDteZpU7_2M-?H<+Z}X!cUyontglX#EA;#2lQNbDX@7B z7K{Z4Js}Q)OU;n6jy7q4gA@X-s;W9eY0dP3>`VWbH?4Gz8P#BoOdlfvVSjNQgoe2* z+`D&g9=+$Py?OKIOsoxw9%-0%wT&EBtXsHNfz6wyPoF*$`!k<;H#Rn2;nIQiYp{%; z%QzK$;{~Fs5%tVUwMMVkM+(;|pit9N!RYtKauY0b4qarJtPm+EH+(yH?%eINxXLD5 zxpL(OC~o5Rqo$^&8ro?o&VLvbI=(PuO7WdLcbZYX|AKcc)ODuSdpFfqXcMbb#CE|72F)D==^`%U1rp})~e-@yEWlIUorlBmvU?yNL2heb; zHmo&=0vJB2x3{;Gt%ErbA0O`=JFdD$5}>Z}`t|Fza&^b|2BdJj%zr7aHlqS6HIzQN zxw&~LMSsdo-+==M_P?@QbP-D`Xgm`Yy+Q7UVX=N(0KbTdiCND5wW|R)y@j?S9aX)C zvzD8_l9G~735(0P8LQc+!bri%n{xIc4hE4eb;ph!E2Tn7wTa3>adB}Wksc`H=a&~Z zVHI){y5s$V1gA{q3V-d38%F^G_K(-NvD&!-6XoFtT&t7D?WR}V9ykL)|IuY-Wu=5>Uyrfe$Q(nlNmFzMDkJfo*VS(n$Y}Un%t?)Z Y056x*A32oL%K!iX07*qoM6N<$g2qjP82|tP delta 579 zcmV-J0=)gM4$%aV8Gi%-002t~P!j+E0vJg|K~#7F<<(D1d}SEM@sp#YsDrsnaZ_yy zYT3fQD3ujRjbd-1MHJRXN+LxmLd_v+84427tElV+gqC2=6o@lpL_wKuKDoFz51uof zO^Y90*XnxiXTCFYKmW4-p;W!3;X7TockVc{Yu@9z3hfy=oVCE`^LBl!?Z)3OeQn#bvHglc<^AA*{sDL->GCa| Rnt}iT002ovPDHLkV1h6+8D#(f diff --git a/res/drawable-hdpi/ic_text_fields_white_24dp.png b/res/drawable-hdpi/ic_text_fields_white_24dp.png index a675d51c6e5898d072878fa41b43b654e2ca57b8..a1ff66d673e0ed9049754ead252790503c0e989e 100644 GIT binary patch delta 695 zcmV;o0!aOf0mKE68Gi-<007|tn3wXg-@-r`r3=Kc%#;v6b zFI0$yt-HV*Q8BylI_M^Kw@Lg5T?nhFbmK25R>TE=KoA=!h}Q+(W4khgY_r)O`2GH; zKA$fJ{EP%JR$#B!8`A6bw}=esbUGouG)?D!Z7`fp=brq5*EW<&rE)yapU>xW2AKp9 z9P(^7;~WmhBSnUi$>b5svfOk!ogps*7P^oDSe#$fz{9Y}lgWftY$%h-ls36#E|+Vc z$dEL^?RM`)B7c#CP$+Z={7M9kZLwJF&2Tt8!-X&d$n|=?jeXH*l$P}2a9CiNN{stL2M;$L#)WKjd!afO&M&q;9YV~Z=(6Owr z;;Fg~uzv#Zqx!Jd>-`kX=rV|YDhKoPYrcCo$umpaEhGI=ie_gbQ!%8 zLp$T~n3I?Na=CmWzj2c2i31AWjX)sqT)Yh)05BhVJf0`gr$ecJI|6@^<+sUIzsu|D d)lg$A<2N~vU^WuY$p8QV002ovPDHLkV1i~pPniG! delta 121 zcmX@Y+RZpYvWSI&fx(+IKp02`dAc};cpOhokYIHd`&0hIU#39fAe-i&e1}H<1yb@0 zI<+TA{a|0fCcD5yEHhc4?Re*Romq~2DeV6{3_F@`$e3naS#U5lfN9GF4+Xy(k)8qu ZhE+$ykL{Xu=O@r~22WQ%mvv4FO#pf=D~SLA diff --git a/res/drawable-mdpi/baseline_highlight_white_24.png b/res/drawable-mdpi/baseline_highlight_white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..b48342dd71021ecac4489c78d3767762b1e38927 GIT binary patch literal 654 zcmV;90&)F`P)LIygAqUCTf1$Sx1ae!vL6OtL*GnFhGwpP}*HvBB?Qr}raJgLfBaz7KU@-U!Lw08( z#@GQtjKzB>6gr>J=gU^BHNx-_|Ez5CvxJx|p5bsGV6{cZ*zARU@bQeEyPFIU0?I@p$}# zM5W0z=P@T=tsG#POyuT(1awp=cML!}*V-3KYG!$2UQ zK}@I3rKg#RZ(gtW)N+%hoGP(cOkdgnl`Wyu>D<82&B+zZ(!{Egf&;eLWDuCq6V)|b zFI_7EeF1QyZ4nqDp!o)HbMGRMB3*nxd zkLRBAdUB)7<%~Et#6hkN=m*!)MYx$LWYK8!0HfDD?+lzVMt>xh&1NqQ!_dp+@{Pyi z@xiV2DzU=z`Mf-VMi7mqQt2A!dHPA#g}W{AF^(a{s;X+ZCYS|qj=)J2ze9;cB1Q0( zD_9bKO!saS&htF`U+{UD%jKMd6Bs@+dPooiQBjmD$KbT5Sm%-?Z8e+C20=fdwKJy? zZ(|@9i=`rw$bUY~QN?z>UVkL`8)P^0DLfvJAGTVp244Ni5UN(I_rYK=gk$FpN+y#h zwlXLA{eG$2?LJYa`b-AJ#bQzU%f_XAM=LVeax{md0%L4S)3iR;-=Zp4hFk4Pr_*O- z4Vb#63LRCw;BsJI@X8Co8gC|(IUfuLuOqV;35=%sq-2E(g~HS#6lpJeQ51cZO67L4 zK)qg14Tr;f<_6}rv;BU@r%Y9K0EkIMK~y-6)y_K(f>0Di(c8%kOdNnS!4Ehx z8VU{5cs3?B4oQN1?Y51d*WLSUfL*VX9FaLjN=qKXp8&=Q$(zGHjQ7Mk-~Y>p@%hf< z8hBFs*l;1snqO|O<^c^ih| zL4TK0Ds5uHpN~E{fYwOWb^VB&Kijsw$IXEg+~{H*P17_LLcY4LTTQ|+)bOW&!|C;r z37noxzTx5Aj7Z~HIl;|{(zpy0(#{EPnJ6^bBK!m3*UoU$g#IOvs4CC%TW@glPPC65 h0`JnDoD6=E)-OH9%}`b#x4r-X002ovPDHLkV1kczo?HL` literal 311 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+U~W1%@xC#RK_FN#5=* z4FB8v&+G^CI14-?fvUKLL70(Y)*O)jOivfb5R21qCmiH#Fc4rd&pME#<9?-Na@-Lu z;Yjli(i3MzT=hSNgzV9<`ZrakYc diff --git a/res/drawable-mdpi/ic_delete_white_24dp.png b/res/drawable-mdpi/ic_delete_white_24dp.png index 66cc72179399a6636957af045de4d4dc8caf562f..a98c3d9424898913c2385ca83cb25fb33e92c5a8 100644 GIT binary patch delta 431 zcmV;g0Z{&}0=@%~8Gi-<007{3J@^0s0fk9KK~#9!?Nz}}gFp~vi>--?CTfp0v?hi2 zW{f7*M39p=LaYV0#X@@ILA$u>WseE>&a;a3xePS!Vi}+7ZP+j zoeS4>-z>}W5u?$_n@lGDD#qinm%+7d`_(XvA%q_k66DXWUaz0Pw(kKCENHjecUkr1 z*XxKL^dGRu0)JaK&*MhKJ zh$k!!?|Xr+>ram3yiBLl8EU)^D2-{FLq$>4yaJopUMQw*8Fng-&az>@A}jZoflnAw ZXkSG{Ca{o9psfG^002ovPDHLkV1gyb%+mk> literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_*1mUKs7M+U~W1%@xC#RK_FN#5=* z4FB8v&+G^CI14-?fvUKLL70(Y)*O)jcuyC{5R22v2@6aUj)(}QJ!sjq&v?(#<>76P zK=^R~q5r@CCqDRB&)T68_VoWph88Qeu0IOR&KHGa>J;867|k(RmB^Cyzm0Xkxq!^403{7Z4hZydYW#heY( znM0lKedK&_NL|``K)!RnAMcOnectaVk<+5gF z2#hM0aZNt3xqq>-QR(yfp2A=*m&*%|@`*&^huE3l?|*GD7~1Q~M6^*lKR^G3Q51

mHBCOAdcyZD(g^OQX@WqV_ds0w+{MZ02TXXCK4R-rn9GnQ92~q& z%KDDA)z#JKEc?3Z!JH6X%kg+TO$JIb<#}F#J;TGpBY#9;7D-wx78~a14EHboIi`Q+ zM0n+=rl#(xR4N^tS11&aspJ&_Su8FtJ}R}lTwZsNRFotclHrxaGyw zq&Az)H##~xu2R&pO4*4g7#02f{R41taBzScY0Dh2gJk>~HYStFLz159H0cQrq*Ux7 z!9kSXTYt(NfM$#)lj(9golc-&y}i9w;X0_wCn&-=IXQW!K%lPw0KY;^(z52l;yVIK zzTowG7fO}od3hy15fq9^V*_y?Lqt6 zIr!7-_3dbXcHfZ9UyhHDPf$h!Lxkz+>AS&T@H1OqCP0KRe(HV1T3xHv8dp|Up3(V2 zu?kYDRAPpJz`;t*m!0@Nv0AORxw*LoL=2tp@9#%9Ha6b7T&@S*-Q7Jx!Rz}bh^`3n zAv0cRq89PzlJ&xwKb?YVxD(DLf|9uN{DUDq@v8}c0p^s3{&)G+DF6Tf07*qoM6N<$ Ef}U}oz5oCK delta 227 zcmV<90383u2J``t8Gi%-002sU^>Y9K0J}*JRN;jLcAhz#=6=R5rx|K8>7CW@|( d)wlmQeEc|O(Kp3JkwTIlCS;mImZG17Fk))DgiOh$XwxAQn3<2g z`km|juj@>+4qUkZbN=W2&ih`G=l~Ln#qRX%C-?C15W9m!|9?tuAn3WVvs5ZogoTA2 z4-XGNgXeTmP*4Qe5}_lcb|~XQkCKv-QXYehM&oC@-EML4w7I$YV{B~feQj-RT|`8L zhIfi{>`=y4Dpg=dN5@mxvNNL=i)F)XHk(#fR?I^F>gwvZnwpwhlra|le#SXLWMrgf zdV2aJGtl4P|9?uW)m{n-35oLc^;P-%`>Ug)qvIjt;YXeSLi|WHOnYeB1*< z#)+UDI5RWzi4+zW7r$m_XXhRiv6q*Ztg5Q&CZgLSot~ba=M>4F#^6)q*4f$lj2VxM zi#sVSqC4{fgtJ)aWPX0WZhL#111T*ntq>Ic_e)}8;(uAlZC0z*l9`#QB_2hDl%0ZY zZ$TkBJs%&R0LT&~5{Zn?4Gj&AymRvkh2p5Q9t_|Kh%O8c4i4~zK4vf&hHW;Rqphv& z;f^n2E()bmse(*TviA1&M{vLcM%5;hX`XBp6%}1!bHe)EcXoExNWz?)oO}X~jg3uY z1w{9(;D4H&b#PQvRDw_j;3LFuY;3%TcD6qU?E;`7qCQ7@HiCnLH9V+{JfE7H`che0 zd7agYB0yTCLK&+~Zf&- z(0}ssvNFMbgc*n)g{Dp>wYS!1+ztaU8f0keDp^NC2Dc1;IgD~wU zSQ)Uh`iYM%JL2i-DdYE%+pcM@uCBh#hrdx!P@rQVa=F|;D=SM|TwGj*r!qM?`5dhx zwn>_rn(mSwvSWoTZP%(`BhBv{?}34Vmw$8_S+LgE*WXdA)q(qU57KkIx3~8tiwX|j z*kfD>LQ&Dm?e6aGVoD1O3vB4WyVZO)QJ8easPFDhNyD1e!8Gi%-002sU^>Y9K0Y6DZK~y*qy}?0BQ~>}6;D1J&*F_XPLP1K4 z+7~E^;ikoix~?+_0~RQF1~ZQ$gS(=%N$Uu{d9(R?13uJ2UHW~=BlFanBY%vH{B~$n zC-<}BpGoJIau;p;#*TH(=;)ZWu5WBtJCp3=(udrlrK`klZhy0aOD}Qp*60~DyzFu-gcU>>Jw_=fewv|lEDHOy)u=Wmxg$o+w7s#)yfT8HVyG5leFy_ z>)SA=P?)#n#Mo!;+{LmBlLp@8ehRA&ov93+I`GbuJhJ~N3V)#~?*q300000m0N{5$_y7O_sYygZRCwCmRZD8ZP!u&L($a!LKOiOJ#5J_E zU4vu+3JRqQ=zr3ggKVJ~5F9wQPzqg#BymtGYQ`BA6ij+=cu!u^#Fr?vr3Vf-+#7R} zoRe!V_frrAA)giS8zJ}Wpf^!2mn*8Oo-2xS3iWIi={coRf9Z(5Ml2*r%42P}+x^92 z;m>9>A1l)HJf8xOX&=tdE70wBU;TJ^gx}C?HXpbGq9_Ietyb&FvaHEq zFc{gkJ%Qt~>$;!xVvggu&>IbhL&r4DF;-2}F461)AdUGuzfWM zkI>u2K5(0Ge?5ReP(h&22n6q2mgNeVd;&a<1|r7%(31$1@=p z8!{^b50gSbW?MXyR|(`3LU6?fWD|ixTnJ!(O9CQoOe!F8=3;6AvY!I5(c{e13$Xi% zd{y7U*6UAf10Z&VgLXD07*qo IM6N<$g1s8m6951J delta 81 zcmaFFoH9Yun}vaa!K?0TF_6;sba4!^IGvmzq4uEuaDB{z#0Hau4Amt)T2dP!$f zR~mLm@6SAe-rn9&h9r?l{6@dLy!@GlTWUrC6PMzC2_S{dC@h~$CR6BFS66q`5TG@0 zLemVtq}No0g~9_OdEf-S8V|@bRz=whSgG;!cxhy0BuKhifU%HeWNTndu?FHa+*FJJ z&+{-A9|#0)c6D`Khe{gb%FQMK-#9Zf^MWv(%+1Zcrtu~sAmk&#EM`L1p|JTBi^V=t zza0*TBQ)Mn$fANEU_J|ZZ-_$g2g$bE?e+kNYER$?Hk-{pJv}{6;4`E!3ro(<&b}oQ z%^*=AoG@-h)DbF<0s_xoV^ zbUJ-X3NzG;jKmvK=p==FJ`QSjV)jm;J!6Q#f5RN2D8gt-JTEORy<)h`sytw|TJ2L) zQ_tW565@~*Q>j!MN+Xd-7*?yaL_jD)y1Tn?AZ#S?5Ipbh?r!*eKDR0lDAqs&k$4Wh z@Bs5ddUA5|F^|=y4FQfow(afhZLrjvvpoI1)zQ)6E^7@)B*<%s+eRWWE@hO7iHRqy zEa0^$4H!6cdwaVp9*=*JEbnr;0Nzqo7Lt>|f~7|rE$F921mNo_W8@Ue_` zVpb0VD0f#@R=(&;pufNWJ|>jPYORE-+?+wy*Vni339C5)R@8BJyZv%B8ht09v{E6D z=ECRr`1oLOaPSVzCFpV#$vz=bWL;TUScqytLIR&iBn}1!2JWJKCjI6*y@dNKf)*tH z2cCV{>nnLki01-)Ari<=rGU?}BL@QivnJq`Bq(ECou8k7FSl$V@Q}m9!(RmcUd_PE z&U12KX@0-Iqzz8muwtoB}2mlp{SLyBTjr8~T-}87pSMeJ?6D$u;Dv`DCUuzr4x+m`$;bRP5;t8+MzT55g zEiElA)D^t(Sq$my?7Tr-1x?cqNma|jqdhfF4WIyEUw?=)^|7~icXxjSQiCT}gJ+ycU*ChSuC7~XG~iz&iOGpPp!fIp zi@f0->}W$7A0L0Vy}kX*=vkTkNhXsYySuw@(zr(EL?d$|hXJuzY@Y1>TxOoqMxnlCd_G?X)`UocSFkm6{-+73HUJ5QLhXe@VT)$FM50xw@46F|X3t@6u25VW zDWiGr>FK$PS*D3EmF0f<>463hX+3-*GZ**M1Ak-Y!r|~^;yONLs^kE!D=RDOWPX{u z1C+x0<}@)e@zQ)sR?Pv5z*n;KaB~2&PVi2)@B*1kCT#|+;DEkJ5{X2dY%lPP09KsC z<#GjQXJ@C`j#@gbB8G!wV`C$*KX(V%hUK8D(=s&CSgu!1ng`)YHB!P4F74pxV&T&_k|g`9@>X+}s?9$K&&+ z^e7oSuSr$Y!d53IC!;j$7qN45tv-kXW)YQy^7%FZNe6eSdiMD9~Wrk9tOKc`ZuZzz?hHb$ePqa%Sp;5z&FL~O8{uv|9sxrx+Gs$io+ vsbm#Pu_fxkIR{`wSn z5nh7w);suA-8dz)b7uaXC0xd^iro-2mI|3blyvjXG2meFUKak>{#_uczo*ex1@5jPF xa>qyRa8fm1L?nbFZTc+8FwE#EoPAuJ_cj!N5<+3oh%f*E002ovPDHLkV1g%`gwFr~ diff --git a/res/drawable-xhdpi/ic_check_white_24dp.png b/res/drawable-xhdpi/ic_check_white_24dp.png index 2df770d103d61254818415f9022805d0b289b271..9868d19a42c48a737917ed5198a74cb175d122ea 100644 GIT binary patch delta 562 zcmV-20?qx}1Hc538Gi-<00374`G)`i0tZP%K~#9!?U+AH!$25^le?rtmQH>I*FqgF zO4pW79qQ;uaPb=`6wyU+6ch!kOK4NtkI`LMXa6jvG-(pwH$BS{(%4pL-oX7J9G4XO zJa@<4n`oMfii(Pg3c+yBbx1zp8Dk6b+)3cbV_PnlHOsOh2Y*?JbWGD^*w*WH9t43s z91gGHUNkA>*OP$P8;u5cUH94Zyb$9!&Uv9wz-7hAI>g~&^h3DZ>2&I%gl*d=VtH}u z@Gk=16IVEyOkP{9)*db)oCRv|x`1cW$S>gG-WxpI6+07Y_@^{@_${Xj&lS8{Hk-je zZVes}kN*}{F@N}nt-@pTTVrh^kr}+$c9~%qTD4l;!FJv4IO~yTSV(od-D5b--=VEw zAD$VjNJ#KHfZlHv9*4PDENZ=8?+D;sIL@&o`Re!k2dhYA1}_Sxh^*aimyjCZeUyM; z_xmr2OyR{0=wb#en1QQsPCtWYCP^eNr_AAH3GpWyz<*vQNPNKkeOW@lGXT`!H+PvI zQuFr*ov$JRJCrHG-;z0DV-goh5`)2@f)iG&)fg%GB@%5}0)pMo(P(ry9*=LZL$bC> zk?xz3XMsm# zF#`j)FbFd;%$g&?z`)4k>Eaj?aro`Djb4WxWZLU}UuCRpZsvHTVzJY#WakpuS|N9N zhfgfE!h$lfHQn3tFCN?Zp)^B!vVexlcljy5k6G7$dj7kwV2%g}3zKO_$E@tY>5gxG zRF_Xba;EOY9HtYJl0EagEVCK7KD|13p?~k3d#Q={HXMJ@(J?bnrro^nICJL=*5CiL z_rJ}szcxMZ-0k&Nx8gh8?Fx>leG5-IV{ScdNA&-1Lf32L?C)*~6_{MQZMuqHrS{ut zJ9giC=aORkhQHpXW6z)6=1caA?tOdOQTdaXYt{Sn|BeK2P4f17b9Ud>B-d9L|G5OM z|B!hCJ(OpJgiTLcVN}pR@kL>Lo`X96w+$!0|`$+e+Wf3k4+9lYzmd zTH+c}l9E`GYL#4+3Zxi}3=BpjLdWmEL^M%4D7yjJV()yo1c=I pRteH!0#vSRWE5fq)L{rzs%u~lB=0_oeFN0M;OXk;vd$@?2>@?Fy<7kQ diff --git a/res/drawable-xhdpi/ic_delete_white_24dp.png b/res/drawable-xhdpi/ic_delete_white_24dp.png index 20ae6d313dc88d5b115cf136cc93e2496664f183..d337127653da47a490b0ce0aff32b867eae09a95 100644 GIT binary patch delta 672 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 Uq5$*L_y7O^07*qoM6N<$f}6BdzyJUM delta 442 zcmV;r0Y(194aozL8Gi%-008|9F$@3z0gy>VK~#7F?bk6*8$lERP|J~6N4773+`v+Y zOCUG_mc?nNvM`BK8<`R$ZeocBITyfAifBb^irwa=b4BdgtfvZp+SPy3%%A^fTmM@K zTJ=`F&jTreKuREx5(uOO0x5w&N+6ID2mk;oub#||^qT|0wtskY=OiTnl^dN1paH=` zzRyEGaOlj~3jhkI`!CbBp(Pt4PjS(@?g1=x(zJ?i04AxL-2Fb7Ti1YTD&QP2PX!DBMJgZzl)HfnaF7ak1stZ@q9?#vE#M;lkY|8# zEnpH~rX#?Mc7JsGPga1--9XFTt0oJ-PWqJo#>PDsS`vtg-Yj!6pz`06!h-_t4uc1poj507*qoM6N<$g3}bnz5oCK diff --git a/res/drawable-xhdpi/ic_tag_faces_white_24dp.png b/res/drawable-xhdpi/ic_tag_faces_white_24dp.png index c97abc49f1f5a9a5bb82c2eb3a452840ca3bfeea..4aac3940c604284aab3c2fa8c8974fa6241496d3 100644 GIT binary patch literal 2694 zcmV;13VHR3P)5 z&c(sum(e>^DwTsqqfzmrmLBChwOXxu;fN-p1i{3E9ZdExMGXJn1{1AeqKSC7;lqa; zrcRw2HGTT@Kg^stGkMmmSt)qln=xZXQe1mJki_w5m}r;4 zz`#lA>FFygsCivOYSDM&qsX=g(ir$;tURHa0fF(b3V5WYH}TMT5^> z>S{jF6;h4P&(F_pZ*Tuzrn0lMv&&>Mb%I#q6CU_zqVFxnlluDl3t)b^mzUQl?5QQe zJU3;4cr9MKQKLq^lAWEs$80wDNE!s2IyyQOVyzIW49u738RdCbuU@T5OiX+m`@1tE z>LHCR*iVO#&hhc_3-8>y^NmapNt!-OgQVSxdEZ{Tbg3T1ee>|)!zO%x|EWo=C3*{u zWMyUT_Vo1pH3@1+OiCi&ean_DAK;KjLgFCOBoW?TU0q$VY15_+)22;J3=0dJ3{4rd zTCLx(VZ#F8C$CJNJUJRtPCj<*SXOIm>vu9Ev=@f*cWrHLMNm*sFwWEuiV2SC3h@~k z85>FHq;@_`NUgn~pdc5K=69IqO_CGKrRXGwS9-gQ962(O93M`9NoW%fX++@y-~TH# zG&F2bnqZrE-n@A;N#5LTDQ2Qx5qm>J!}++lxOlc(az2fS?;NQVA+Q#oN^Tqow7$N+ zFK1?Eek3$2tD>>7@r%);M~@>W2Alx-5Z&Cla~IO)f_S_Y$sam&C>OSBAR;u~Lp4C{ ziX5V4-+H^Pt*u!wAv94|R#vFf>3m>{TDzkYOHNDC29DT3>Xpp~j+V*ENXJAB#!OY9 zjm%C5--*6=?_Q%N6B{>fTtkTu^ECD{pv3vSyu3ZaVFmGr4mX$%L?e5@fxPmAu5TU;xt)- zC0+I~L0HJjIyEz)PfJT%PD&u534bUoEX>7`t}NVsrSFVTmo22P7=LGHdrV9WIjojd zNryR2oH#KuDk^FzqR?CLi4pXDKTK%)Sf?g)!sAt5US34!Q=Y)tW{~kCLi20HzfFH* z^{5O6Ll_cIE7?A6KpPbm6@5z4h9VO&iN_f+|9#B)kBH}&FJCT4ybmPJSWBe5&Z)0; zAYO@3@P`;=>oyXepkddpT|4^>t89eJp0dV*ann$>U=3KjW?UJ{*_ei4As+Rdsw-YB$6wyM$EVK|Awi1MU zbGTFpn>~B>QgSpQ9g$5dD=Ta9v!@jX>|V!n)d>j+i`W;;jGO)&9v=R>B#@`W8F4mZ z#0UejU<2FV6Aoj47a>y+f@txU0$u>h1VE!hDk>@}+0?8uV9&bl_@Gh;1Ox=$zJ2?e z@C6d;+O=yx5H*Cg=;II(5fMdro?|~{Tq7_{qL?EX_3`l;aplUD3Jbt#T()dk5+^sc zB`g`pI(`p3e*AceQb@2h6c-ogP>`|7098_C_ag2Ssw7}WG>90?_NN^?c5EOr@*YU9 z7SEZ~)YK&W4P+hrqtlTiM>1swN=iyj6JypG5Gqa~1CrHf6##T0!LE1pF zu+4SCA{H%Llqxd-XRpK8K7BFpp3DFhBOV?e0oE9h1^cW}s2@b&uyW;PmO!pIZylJseZ(gXU9c<7(>x zoH*Jd_CBu`h{}Qi7eJbWG6Tp_g_Ns)!hnDg!NI{3VLjiAOib?u3l=OD%_w$4HLy$w z9R6LH++TocQl9k@eIwwkg(yAUr7~9I;^N|0Q&aP$%s_5#?ngG^1ce#BUhjPYLtd1h zpPxn2kQ3RGB}?Ay8o~jjTLlJOhz6=%7S4O&ufV{lC z2-18lA|eSCIiMK7dD!e3iFEJe{HjZ$@xYpLzI=Rmy%210(ZZCE~@}Ge4;Z)%%0E;yn6cqF-YU3LMwUPjvnwl45_WcFdVGCjs+(MI%?N=kA|ZUS8f_S&Q`f z+_`h5h>kwor?S7Pg-zWNclS!QsiJ?V_dDbODl8nyc10tLwIRB2E)3RuxCKL?P2anH zcjguKH9q^x#PjHCZ*Ok_oS)7N+n+$$lyq)xZojFoudkB&p$Ze&_}}o8zmn9r-J!K{ zwWPLo)g(2w^y9~m4+lgz!DomDnj*L4;W%fv>eGGW4mkefGeUbGTv%rK1t zXd{Lttde874ZI_6baW_g3>!9VNQd7v3(0fqQrUa^_U&s)lN^}_b)lgLba)j`{RK18 z$vsTrm~ALDjwU81{)w8lRB$lfmmQ95+!c@Clqpl9wr<_};q~j+zm_gVOj0g+0^-+* zF36xSJOmR4gCUTvk>pDa%LGO>?8%cSOHfH=pcwgEQc_YXL1IFcg@uI&tE;OC+x%z| za*d+rdjJ0YmXwqfiuVL7bVGJqBhouI_1(5@+d3TdgJ_G3t0d92?l%SZt})7Ms;a6! z3l9%}jqe4tLymR1TR^7Z7!nc^Sx``r1J&P?@5Z>-^Q5mwx?AYtHu^sidQ-5suYfDh z`=U?Oux`LZGk5Ray%R)`JwLV=2m!?1DlacDUc7kmJ4l+NIFt_U-IyI$t>X4YPq&On zaBr+%zdoH>A8_h&D!?g`Q5lG&_BjSAAWjy2f9}B}&Rdl%@TmS$707*qoM6N<$f}17) AX8-^I delta 761 zcmVPeRkhp?mU-!4k!19hxtFm4hOvMvhS_x>3>;u-RF*b)_{;BGdAXZ zzv`E}-ZolZ(DaF(T(-;^E+cr!n(b!A!G9*GIu8IkE@+uBtfpqfgqDjs0ANmKyMl%* z0J!0hK|#up!)^iKOM~(PRaXE!a8yMopz4@SqN0))oCk2zQ-VC>+5qNqf)@c?^@OlZ znic^ZED|)W0e^00em+&S0m~lmFZdYnXYz3JjN1f!*iSH~2RJH}U>eXh`uBqO05{@Z zc+^=P>&~bPk$$tPHsGXGV8AbcL$NyxU^aF|vld{^7YNT#U_Q*5$(=8u6NW zz^kcX63{UeyA$$ZT0AOj04Ah|ou2`RV^?!kE?=w0zdr)_NqX1`-UZweFEM6GQGPHg z-j3UVw|@kwz>|7_V}hu#s9(OZSGtN_d;0y${0Q*C(_*Xc4I2OeI!>qwk$t*=(?UPN zh*dyaQxLJsD;6y2=~=SiWjh5CyWIi&ZdWRZcmcp-ROH$1TL91JUcAl$Xd4&u*yj#_ zSs^E=_zJ+LX;qzt6zTfrah%U0wV+VoAH_N rtk}}E?3#Jgo{2|VNkIu73QF)7L9B@Gswi}m00000NkvXXu0mjf?uKEx diff --git a/res/drawable-xhdpi/ic_text_fields_white_24dp.png b/res/drawable-xhdpi/ic_text_fields_white_24dp.png index 612d143869d6e916d10bb7bc7cdfef5c79dec2cb..bd6051f8c86ecae6a7da54fe865ae9ce988354df 100644 GIT binary patch delta 525 zcmV+o0`mQ7n*@*;e+UKu00374`G)`i0pdwSK~#9!?O45T!Y~jfBtb~+kfE)3feziW zFoO_d`w|^W#o7nSTksMHk(q`5iJ@J)GgfUO^t;ND5Rlf1&nZIpNv9j^^X0pX{aLP5 z1OmZf!2w*?t=cxiLDY-0^5m*P5S+K$?dw*nbqmjKYTaHKe}-4cS66w>L2V`9?RIZg zC15g{ydYhW=4B&*3iTGi2e7aJEc;1*G#Wi1-5EOpYBN=clGvy`mR*t`kH=3|2&fJ$ zRi&0$1|+*aFiDctZ*f@ni@dcCU=Q?5+5@jhcfv+Moy!hRhfB2go+?Cb-n2N5fBbYh zeM>98?&tIQe>=u!nD@LZUak8WMbQBHj=1%J&a^t64%FTZYf$By&F0bmh)Etujs* zXYZ6-mjEj7awt2ya_bVH--J`y*_1mk0aImXSMIz7e@vB~UAYT(U`yF`m7HC<3+#dZ zUMaUO0XpY*DSKWeXIJh5I9xnuhfDjM@LO=*uc|X#< zHJZj-e?R)`)@T}U?fppi)@T}U`~67w)@T}U@BK)(a;EVDfj}S-5WWG!JjV{B13!rX P0000<2SrXqu0mjf`YikM delta 87 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 IM6N<$g6Ijgy#N3J diff --git a/res/drawable-xxhdpi/ic_check_white_24dp.png b/res/drawable-xxhdpi/ic_check_white_24dp.png index 6e03d54cf42955e7a3169bcfbe4649277e729727..2a7c32de61f8b28d694e1cb1c8f8ee7b6f178574 100644 GIT binary patch delta 979 zcmV;^11$W^1KtOa8Gi-<0033(vqt~`1EonsK~#9!?VHU?8&MR;Gc!rX)QpBuy6M8S z72K+zg*-zZpqp$&p&MVKi`EvQ(nS~QLdd4I@q=2LBJ=?QCW4^SP2a$U5u!FTcY4m{ z4qPrXNm^}ja?c+wLncGG=RfCnKh8`N2@;7!B9TZW5{X12k$*^}J0-&~umvJRRC7S4 ze9kmYaw#w;olbKzHa0fypPrsRcO1tclY}{`RElTL+S*#q_xyNy9T1w-Xf&3x*=%sFp)FRctE>0Gk8f93SLllije${~FzH1u zmmAV*;10oR|9|@W8vWpzBjmN)ZEjMnR(pom+O}u6 zWX|sN^fWgonM|5GVKoHtf9ZwQNS#9$^)Z zRT|>oC9J}+!U1_NHdsOG8rXTz|HA5XY_LLeq>tupZ)akSRj~6dl}e-Ka`{OSxt{W0Puis3iK zYDfI88;jWrkBf_oXigQg2F#ID-V?R(AB{$1LS$0kxP@S~C1J(x{30-TDp@ELOc-z8 z^V=#4-?B*}sFTCP!vMFQOMqBor38XO7#KKY$$tu;QaT-1zQY)lgj+%2W<}u^YplWq zf%1oK5V!>fyu;o@K%Qb!fZH(`IUa?Zg4K{RTd~;gt;8A#GsysyR(jxe1lK%LaZ|8L z!F3-7YHuYXRdMqoa66K5gS#JKWdc^XmfDOpR$Xv2CEVWr0d8r570!qs2Lh`;a7zG6 z%YPBLxdCpV!r0gt){yOi!>Ui*-bCRhOlm@V3ax_p3>;Q{;AY^fB@wtWvHEV|QGCa= zsRSysTNG|gIqFpjl*c5%?R5lhOzQ%>gj)h|TN1c2HEXmju!qcUuO!@<)&=%1xV@D2 zZl0FUt-9c5iP??g)^4|%mRR-5BrM4WnM~AbwYGzom$ZG$G{mGtCX+EMl}dSLX6Avm zSoJE|D)l8&NcGU7zX6a)Boc{4B9TZW5{YyR`VC<>C0P)GfP?@5`Tzg`fam}Kbua(` z>RI+y?e7jT@qQ9J+u00Lr5M??VshmXv^00009a7bBm000XU000XU0RWnu7ytkP zL`g(JRA}Dq+D&f4Fc1Y`gE#;OC?pFm$PMOZ?Gf1X(@H(aV}HS-DByU;%(Ia?6Db=< z(Wlt)JVjX`y;m)J0|FGF00pQwAV2{M(Ek9f-wQORLz3($S|1~R008oQycZ`+>c`2D zTCSlneWjszRkx?pdCHWWR-i%4X#*PYt>v@;nK*oqk;4X=Ib2W$hY70U@IaLu7O0xT z0S&m+au}eOIDh`27di8w9X|2VmNN(1;TOQsKyu*ZK{pNzBo|H&^v3~!lY->L$$|Eh zo0mviFHU~S#6WW7%q{9i(uU8Of9*9SXHIEjERozf<(+y;I^U5998K%UktiHpFMCEJ zakS0#kwoI?yZw|z;#lH`wBXqCknlOyfF^8?JuwQGQ#KP}g~_SQ)WYK+ttvjv$=%t# n7V#rNfC3bt00k&O0cu-U;@b0JeT7A<00000NkvXXu0mjftx~!d diff --git a/res/drawable-xxhdpi/ic_delete_white_24dp.png b/res/drawable-xxhdpi/ic_delete_white_24dp.png index 0e95e9b1d0a70a13c1c4a28f5180f697b7828e01..57f96b268d24fc2346324c972af289ef9144c0d0 100644 GIT binary patch delta 1062 zcmV+>1ljx208Gi-<0033(vqt~`1NTWpK~#9!?VQg`R8bVi=RNh!FCBlRY04nD za51h6WEMdPZ6aJ`rjBhA-MC3;QHx4(oC?B)5GXRDt5%7-v~*LeXf^!<5?aox#VBL* z!|D6gJ0O9-o%fz{zHqpV@a{eDbI*D2Jh(@PLnIQ3L?Y2KRDT4Ol$01S=PAr6hA@qG z*|_kAG+oyXj2@U9Rt76Sf%)>+f-$exFB2$T-Bd*&5D516_CD|F=^4ZL>bMpPg(4V7 z+S=OgVxDTiF10-*I9Ys*v~W3{PDa4hmX?-VYin!Ya%a;SKz3|(dNMhJxF#7xZ$4+u{J5cT%bbr!$78Vx1!rxM)q{l2k4A(O3 z&?r+Skw_$uN)OyqHg~?-Nu^SUuDQ9nNxxFjXmknw)*6Q4HRs{82dJE3Oi$@d&V~ZO z-E^Frn_K2X-E2TU<~Vl|JGD(`>}FeATl6bEGc)taY(RVlx%&G0BDo8o`T6-TjCcSt z=NY8x3V(xd2ZZlO?9d{{6}uVyTEe(AFfcI8DjZ)aPBZHvF6LFWMlGxX)@UPRjZ~-V zFpn}*i^bhMgb!7LV|&3jTQ!IfhlAB$_H3U8-n&iJ~#A3bof( znEJ*WLHc*G_E8_m)_t#?wrDK0OfL@4vuG@&sej@yZF+HdQHn;(io**CXk{NDO#lfX z0VIF~kN^@u0!RP}AOR$R1dsp{Kmter2_OL^fCP{L5e)aK|b@>2x|vKcdm-2l#abfZUco zgMU;Hsi(cY{T}@LlgVTVCu}|`qiLGU zVUwO#Mv(^&)eH>{-H*rPKj3K6?CeS;5`VuYCnuk}-R=hXQwD!@hfSpIWt+}J+tu~; z^?`6W+&48fHG{Va8(o$Q)Ud*NKTl6jzaJkTf7068dYzF&I2el@HtdMjv1@$ovt>Kq z(96Dwx&m5_T8E9jK9yFsZWq@W+9i8(u}6!wNP&&5;RZw4ae@BXfVR*6|9xKOI3M6| gB9TZW5{Y*85BuI(hU`an%K!iX07*qoM6N<$g6@I#TmS$7 delta 322 zcmdnMafxYyWIYQ51H=C()n|Z|Lb6AYF9SoB8UsT^3j@P1pisjL28L1t28LG&3=CE? z7#PG0=Ijcz0ZK3>dAqwX{BQ3+vmeOgEbxddW?y;M9VC^+)6ezmwzYrNm+X^^}|cW`3}+m!a;SyNblxg1q;Y-0IoHH+Wtbw3e zxjkm@`C11zMb~|rDSO-IwkF#uO^{(<-tJ+Lxzod#s51R9&|eImu6{1-oD!M< Da8q#z diff --git a/res/drawable-xxhdpi/ic_replay_white_24dp.png b/res/drawable-xxhdpi/ic_replay_white_24dp.png index fcddcf02ddb58ee1680889e7315757d76419b4b2..5df9d2b99ede9d6095e3142b67d497e85b9d349e 100644 GIT binary patch literal 3145 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 diff --git a/res/drawable-xxhdpi/ic_tag_faces_white_24dp.png b/res/drawable-xxhdpi/ic_tag_faces_white_24dp.png index 4bfd7518672fba124c1a2e18c5cf28c970cb1f02..6105b8637e3be6ce29f8fa934eacf05fda3ab122 100644 GIT binary patch literal 4928 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 L)z4*}Q$iB}fzdBz diff --git a/res/drawable-xxxhdpi/baseline_highlight_white_24.png b/res/drawable-xxxhdpi/baseline_highlight_white_24.png new file mode 100644 index 0000000000000000000000000000000000000000..5e2f24bb90561d99af77a389e1b1839c6d51d635 GIT binary patch literal 2102 zcmZ{m`9BkmAIG;f%rSSua%7H5MN|~#W)v1vG7C{8TDgzqCh~EA+*hbvA1o3vHpfg^ zYwqyH93^bIGRpP!`ThHSJ|6Ga^FMgMUWq7cb10uQ9{>P=S|CkqkL>dALAZ}{E;mRU z0N~lTFfl|2Pq495IJ^6jtBVtZgH0=o?sY$nA*X7Bb%jZhHN`z5LYekAR`A1k_kZ@_r_5+rO zMl86zQw3`!Ef395Mmo!5yC=bivdsBd@G**^(xeS00*718ZV%foo<52@69*=tvY3N# z>D{L%+la0*j9Lj0pYZDUEr( ztiyqyTwk}2qHBW`61E^(r zybGUki82|#J&R|7qFO%fNZ=VBoJI>AjRT?8PKK9Ou(6{*FaSH!El=^gpKENR)!;NB4%UIZD$0?K-F5 zbu~3B$N!u+lP9B^fr^#k24!aZks(aCzjzP)gMvtw2T*LwlTtO=RF$VP8#5JWJOhCG zQi&$5y;SOM72v=;pA^3T$J5-L3hSG!TDSy5iJ@(R?V+JvugSRAMoqK5$uKv3Uc{He zt3xM}&Dsd5Pb=?Op{RQK*++G{@?&yT!;K7ZbodslME2PxAAv ztqa1*D*Ds;g@wA;!|(TzboXLOZf{3fzt@2QbrKfk`6hd0d20j$huOKxwA z!M+cU70$(nR3+cK?9uZ}>F{$Lc`QwxdN2c%l-v<+QAgNcw^CI$umLsm)(=ILi>vKl zr=hAZs{E4@(10DF)9Fy~LGabJ<3REFH4!i#llOJ-F22s$!hWP8|>-zd8&S`JtTh&^4zFY@RE@`ZQob%ya{% z3wiOj+zeAiynTFZ^dI(Y_wyhQd$Ktl0!bS}Xo?ujB~k8089x{F$uBPMCXxDE&tK$XMedrGP}qN zz~beJ>HOLm!=oSH?zp?fltbWKQd8IqDY^Bs#-f{{-SURcVhm)bOEo^J@_eB>e5^P<)m=M3<#lq$D|WWN4qgH`G2>F3do6Cun`k2JSK zWkxzW>0lNjko8sKRUT^NnWC1jCaRB*a6VP1 zKi{q?TWo&2Mvvc&sU67mQ~pjSThAM z1ZWg_^p*a<2=^eKv$H?s-V(o*fyG@&?2qlx^S9stG0AkjFis)0Oxf3S^d6Yj^|;~C zV*~E>fmbS(YDdi4Bu5?VcCgN~uJGeOzjdW_VSM@=i>d+RP_OxQIm|8keo)ZU)5Fbl zJlnl3Xw1c*mgb?uPk?bU@T^)Cat)Bm4(J)H#cb1SG0ovIcH`coG{uGS4iGDD z>b;8U?5)Y=Cu(cHrc-`#y)^;siKf*IyBw<<(Gq+8gfY%S@%x11oe|P6kW**j3KgMN zmeI0%cdfpcw`W-*E8#oY5{(%QVP-*AY&^)BV$+z$c*0Z#(G0qX=*FAm2w72pZK)+w zUoQflwP$G&y!!of0ZB}|1^yPrCCZ1NzUss?HuRV86@eZ8bbzoe_|tA?W@f}19N=qK zmby7h)Yh+yS-JT8F(w8v=MbiqJhr&mj-342+1WX_XQ-T+r?{4Q?=E8L;8sRQl?@V%X*w?xG zeRF2!%spqWqKJryh=_=Yh=_=YJVjy|;%6cT5)j2Lnw$38B1A+Ebge~`#E^`pmPl15hhzI>1hIxm?e? z-R}3Rs;UlDS6A0jt6i{QK_QXj1QAhDQL(z2AS4(7zKy_#wmb9k@@6zQHy;WHgLi`c z;_vM2JiB)7+C?^-Eej+O8A5`=;Ac*mGNrJst*r@&-@A7&c>n%=ADY+e4YAPG)%C-= zb?X)r3E56(0 za@HWhi**7PYgjQ00V4x`NQi(QRaJvTfCsB)q%JsjB;ZFHd?p~|4v2vLNLe6nBr{-e z@C%IuAL9@K=>Ochb?aItAl~c*j1>6VdcoJy(&CvmZQ4{?3nWt{Wa{<6qrg`U2EV7Z zwe{$vNs|ibI;liJyw3hx1pLT@f1JR74GBD2jKTR@Me|1%e8m14d_9|4ZU55%evDa@ zaZi)x3-|)QfNy&6n*{tP3%*~#7w`pq0bjru@CAGUU%(ge1^j0Nd;&+nf0E!6NR1Hy z-!I@lS@0V%zJM>_KNX^Z?-1~x%nZ;@rli9r3-}|f{Z^}WH1!S&HK)Td3iu-^(b3U1 z5bzR7b8~Y8LPG(61kF!uY^`@u;Cd0(*}Cdp1XF{r z*Lo{yGY+Srz(rbOVq#8dY3aPm%F4~#wr$((cDw6qYHALl-@bkOZhC*ys#UAz;d@L- zGXEZ+S(yaKBS;X<*BmHmF%G6V0cd%7`Ql^8j(Jp7y?~P=gP4swe!su{=+UE|va+&b zCIVZ$$1r#U%n^aCkq}xZpl9%#%xrc5KF&mqn=oNQJ^}v$f$~$|`5nJM2rb1yHm%_` zAF{$LeoJ zrP|usGW1ICu}}w-Wg76KILu7W$;lZH^MM?W<`9RHJHTw<-~Zjv&`_P7ot=a6bqC%; zzJ@DVq2c`mer*j~Pdxi8SH$s%UY0FewurR%SJr(0aI$CkJ;w2Ry}vA7y7X;~uRHP? zUdt_xtCK{V4Sc9SG!fdLbNu*mkG^KYaD~TF$(bLZ;j`&FNw}Ueuv($HK-c3>rUB{W zl$9%2&Lgw&J)Eck>Ek|s0KZK$;X+AC$sAmVuP3z^H0R6aCuP&7O`8d`zc{1}1dWjZ zM@4rwZroUj>+toY_JWRpL{x~Xs;b%zZDr?am|#2zt)M@q>!ot-1tCBqAT~BO6q6G` zpK8@Yj3huC52YfpI_5A_Oi;-CSuAkCDMUifzJ2=|SYsnXfZOdptRp~X0JM-pzqI`P z{HYf&Ui^~N4Ur8%e*OCQaG$`e1(3+!TCiIIIiFFi`8k=Hnfa$qojQoz51SrCLr|JgA^U&h z#*J_0&Yg>7TMGRfVil7WK(esS#R?Q!kK2fuGiT0xOt&YU^vrKP2B?%cVv`pT6n%?Nrp^mQ(;U~72;6}&j zl9H0bj*gC2Ek|R(j^#m35A}ag?7z}(w`Y(NAl+fg`fGjrdk_NRaUC=hiY{Ni{1xZx z0hG_6nED$EUu+Pl^wwZDG7b;ph!?gsCMq9eBDAwo#ARo(;S<9$FXn=U;mml_)z_Y@Ts%|dEh>3twhoMPg-n~%x^Ve6rt zTIeZ51Xjk9B}-;)*|KH(i4!NVPv<*oHy^Sq;vUiq*REar8jGy*^73NR`tcYG4ma$P zP$Ca;&Q>-PAOd?j(^6AYCzX|z6;+TBAs?txr|@cSI-gj%b@A&t@DR5lZh_fEest z;IjZ@c>jNruHjrj0@4adtP$|h0=#iVC`$j%HT{!E!<+tOj3U5CmJksU5fKp)5fKp) d5fPC=Fl2LrZDY^gv002ovPDHLkV1nEtg4O^4 delta 517 zcmV+g0{Z>y5|jjx8Gi%-002mlzq0@U0ozGLK~#9!?VGzwTu~TCPb9$si@bnw)FN2< z8o^$J1nh%Fkcgn>=7kJCg3|}Fvk`=;(%A@xK3_#c=%^njAy+>}LZSY@ zgi2(6fUmLj;V`y7v|{VSo}&H=t`%k zKZyQk>s#OY)_?Q>Mg4>XRsE6)%K9Y|zGV6oBt+0JNQk1Jlc1u{APY2T(xy$52J=)) zBxvYUWs~cBYkzyq1}_Q|MD*Wqk^6a`GntzpqCeYp!q0R}kXili-0)g;rc?_y&t1;w z*9_P!eNFqOs6W_Y^5k*FfL_1?Da`2wG?D^#^a7em0eY`WXeR}zy(*y>Vh6lT3^-N` zc$*lotEK;h{ltKEt$=A#nNZRnOPoM(A@jnMXDo7=yng<51@#J}%=4RcS_~@$)Ojd1 zjm`6v?FZ@a)2nm(ZYAsgVMuBI^svTFlK!aPCGHgmr8mz|rU-p3aoTnA)MWO4$B5^= z=U48rRhJl?B{D{M#|A$*;gS}|?6S^8xPOd{F~%5U{yY8xY9*7O4D_~(7jH6<4N(z9Z-wo! zi$gt%M`7T8WNjC}-})9~s9Un;hb+$n;Z4$n?tMPV`@Zeo#grDE0V^{bxe zElc@SwujB@4we#@KR!Ngt*)+K5&0iCHa4X2nzB77`%iKwq$mHw&d!d?cct8uvLX9t z2_aqi4evKiUkDH7xZ`?)<2ZE83CrK}{?G|wTl$0tlarI@GyoYL^iP{_l2>pW&5%QKY^_es=O-BR_ljP2?jV`A1H^nJwnXVw=fJ$WK$g z<(n-g6w(eMxANr=)_=X(I$^0=txm~uP1jY1k&^Z}e@vvl$&-9Xg-b58U(UriKOp~xROm}*wwNp} zvz}-O`^Z1qSH9!4r@Qp&3}LCrb!~P6v&Hs&l}#jsJj?IX`7YDb)7JX>`dz8eC)aiT z^1Uu0Ecrs{xnmBDc2xdSZa!q002~v*y>^@9y1Ux!bg6jkcS3Hj{6Gjg>8K!0&{?U} zyw=XljZ8EI7 zLa>50Aq>b*xKHQ|T^VX77{crUeF9g0!hOOC z{aJs65Rjix#~daE33>QmG8p>-9O2|4pB} zBin<>PdS8gxqP}-tKF7z82Kp^e7+9P+sP(`g8s$;`2YX_0000000000002jcU#U~L UWj~2`3;+NC07*qoM6N<$f`1gjw*UYD literal 0 HcmV?d00001 diff --git a/res/drawable-xxxhdpi/ic_delete_white_24dp.png b/res/drawable-xxxhdpi/ic_delete_white_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..08042108df8e3727e5a232cf2fc50e5a071d3958 GIT binary patch literal 1324 zcmcJP`BxGK0LQUBuu@zgB~od9zT75{Z#FX|ITS0d>sG)aEjSY zAgyl3=K$?jTXUWr3INy|VhFf|Lgh?L9ML@)Qa(ogSasj!r}OYN<aBiD9wEh`@v(!<=)%hoGNgQmSCMrpEw+;FV~WxK~*xpQXt4-~%8vJ>xW_2}1JKKP7+t;L$29+7+SG5?NG*di0 z$qa$>s_ZmRZ9Ol0{8sV#h~w#C7WU0%$QS9k9@`n89yFwL=h2$>i@cQpELA-x;CU~6 z(rUF1Zla|A@eSKk!b@$GO6GdYWvubKCAsg0u!f#09nFE*CeubQV;tU3O-UOiW)_!g zxqw+zHMb8845Ys)VzG?A_6Xp~crW`EFW`Q&E@*P)5GVa@QMJkC+UPWV?T7*MG1#76 zP>@Dpvsgdei{~Mqm-c2=5;c;ZdH7my!SHQN0E5AJR$s!nrEHzh(%l+gu6%7e4(wqX zcg=f8hTJS4vw4;evQXA7zq^vh@AErM1^iCDSGKhI1$atif(Wh9rAGZ&PGMldMk)1U z{;5g3CgZG#ar9~{=Kyaf z0bm>XKYDJ>NT`hj4KPKogga&sH9(}D3m&VH7k01V&rPfIP^wdzm3(EhO?K3Pj;BfG z^j(wf+R>xfFf`iirg+#*KU{u#_l>C$;ER2;T24P;SYEr_cl?ep z3)*xAzJNKFo0IdQ|6tETEM$Ay@eA2Ap3f^|^fs(W;t@Hb7+b;Av8~9Gtd_wgz0f4Z z?!aPKbZT`*GW1UCmOrr@V#8%oFeA>-h#%0iJp@SKX4qJSm=p-TE)WPn=gysz9i&jW zHQa?n`cvaW#hfQA62!uJvG74GG{WClU`0_JX^|%o(xDpgyUM)%6TO<$9wkYJ=@KUF z50@vF$LsP*q>^B832lB4RnT?ICpNspl{|~2p3?}swOa|TIMQG8^(t+u+Ukd>L`qYzfZJV)!CP{eA@ELVBh+7UELcUwK+ zR%%E*QdjHLrpt4!PXB-pRI)w0dq6P*B|t@B-0$c5y?7mmVbp;chWk6`o(uQhnS1B^ z`F)?i@ArEJK^e-ha;Ri`7mY^aN}GoNS1IJ_dE$$Nr%g@6i}r5#n>Keou8dwFzN?#? z+W^{oO`be?+{~FX9|8abhyp?{5#OKo!NZ3Sk34<)^cUNY3m{?j``q6b7t5>i72;4yD1}XsbJn{9zh7Eh9tgI}LXn(D}y}ctPB_*4V2l9CZ zfF36PZ^J5JrB?p2~k8_Fk(Zr1@NXr zppL-sR;$%+G9Xm_5eS@p2sO<-AN=r$h=>WKaPw?Id~gEv0d4rMj<&Wo9J_8b z8s(QkVOJFw7ZuE?)7{l$d6mJuMLZxtk zjlp2fkYv==%F4c5D@c_05H%3~0Hhl*Ae#W7s2>g=KD>LK;ZqFP=Ml_UyOJ384f8p4HVE#E?xu zkN`+YNy#DmeXyseX9y9=n}cw^{JlX8iebi#8Bv*;nW;bh^wYm2(Zt-)6$s+F6DLj_ z9zA+=H2Vqz6cEfW$Y4DnfQcgo+ca>j5N@D7;z00x4YOv=noicvU+AMXvY3+50tm*k zva%d98h#BBI4M}|3`+T)KrjP{2sonBf{s+n>VYfs;bBm2$FR~;_APN ziHQqYANV`d>f2p`a2Eh{`XU^BLqs%;Z2rf}%gg`4Aea?L9UMr4$2?}t7%^-?Ab1K+ zln#H#Al$>Eyo$w=yN8E|D3VCYPCIt&STXB__AZ$ci+a18x!a&Yk57PqYEy$l9iQ}?(grfCsC&51szqt1HlH_(Gt;6Z-ymG{h&dE zM(*3U@2_Ama~?AX`@jX|3nZx)2Ib)~#$mO`u`hp4Eis8CLDnKgt+ ztg)q~rFh=FdB3C21(5#e7lq<-5PGUtgoa~1deSeOWxj`84|H(eQFTH>LOcWDE%c*G zeU+8R?p6%>5+{Tt(I6t9H}#G=#|8WPS6+GL53s_p24N39ptA9Gjxbz!HV2U&h#?{$ zmu9_*A{M0+`2!nZ6cA{B_5wi4!&jTx`eKeg0Pw)9o;!E$)P{zJ5(Yq?L1Z2&c zHCx#c>~%{>#csS8=j3bQjmkFsKY$Zp`%=0eY*8rpz$sIvjH|A${<}=^-nJyVcJ10M z2B244C8+pjkb6G7M|@pe_TxSN_v3Te`byABMe-ld8bH3ra1MQlIY#CHNKQ`vNU%ez z1Q%W#^^S^)il>LjqM7hF#AOg1!=C@oijR+9MD9I+kT{{w0HD+9hV0$DH@6!A5R20H zHUMh&{yaBt-n`3F_5!i+XJf~X#e(@j$SZ{dYyH1@MfxC1xU74P-?Wku@=yZRNh;ElO5U zfF&yk#UN}2ZLxVex0nRalD$QT2Y@}{P)GHIB>-Rr1tcUSEJQ&ZM-5F= zM*v7$Vq#(j*pw8vmd#N|_Ku}kP^cBLpwsmGpSMRWNRpGf*x1;~q;E^O@}$jN*!JMT zg9V5#(hm!kWtBN10G-j$kt0WrEh;Md%u+P8xw*MGCMM<)yF^1_sv&JVEG%qDZf@=_ za}Ua^M`Fr7$zW97s>jA_O;{Q20IUnowdb_O$NWMT2iJ0~D zkXM;iji#yIbgnfsGc(=C$0rOcP7a#Tq~aXX0AF9 z5XY%0c3Be^D<1(sWMt%MpH!E(1NVqj7;eD`L>rty|aA^ER8y zih!8K?+9>w&9SXin+wZy-@bhxkm4Re zvqsNZ%JwRDkY~nua%NoQ{{8#6LC;#sjJt5*LK%6<$czi-ENQh}Sr=9SGKRCVvNj=i zlEu(%wlhnonhhH^BzSpw4MI+)jD76^0L)GlkRvxVJUu-<(Td#A%iFha-#BpKK!?c< z?KItZ%O1yuAFYNs}f41hLZYA<9-VlE}VPj%$btzYQ*q62!sE;^wLZ5O#Fd@11_;j#STH?;oU#b6f|jWbd#S~o74##2#7E;m!I6bcQ1-C&RP(Y@;c!Tax!-f9Xb?s!l8~{C#(`~zGNp9 z73Qckmj&vKT{PZkmwX5B8Y)Hh=a8M8qA%tE>B#L%Eh(5J=su|%iJ^sgWoX2&z9-qVKWpNySFCWgCdBWv!}Jw|q5l5<_pey7;)Tk}%FhwJlN4ij zVxot-CSD;A_u$f{OXKleOng69xK7bE(KHO;Em

cicA= zj3QI;#)gK5^6c#Flm{PtaDw3EeM4^vguy}Lg$%TZG{nZnK7ndS&O&Q3>3rDEqNPJ7 zT8wwlIk(-Ub8ZWo`_cV2#>B)t1}lx9!>K#xniEMHUI@`~d`184v(HAOw=*Zi!hCF% zO<~cR0Wpylh+fg$GrG-+-q8?qCk`AqkVoJDMdmVeO zs8Ae*Zs#jku1w9z$=TV|)P$x=)wIY^2Mk0gxjz%$5)jhcvc(`8gP}7CH%Rdvu{EV^la85t zg9b{ayi8ta((ei16%c|fstJV+5rr@}YS9p6^8+wkgQk_$qiOlLpX?nn?#er4Y^Stc zOvBBB`KnB{pu9y%8Ol(GGL)eVWhg@#%20+flwoQ7A27RrKZqNucmMzZ07*qoM6N<$ Ef)}6-FaQ7m delta 896 zcmV-`1AqLYA&du*8Gi%-002mlzq0@U15-&vK~#7F?9Z_Y08tdfup8Z*>!$cc;5mIj z-*sItlke@`-p4W^mI1L0h-E-517aBv%Yax0#4;e30kI5-Wk4(gVi^$2fc)*-&nt9Y z0KoD0-nVATV2}l6H`vmXO!5cFS{6!{N(v!sA!NvpDD~`>A%By_lRrRto&{M+Gwd)E z&&&eDV$kwG3smbI0FYuBQ^Q+G@SA3x{)uJM3>5D%s>(WMX}-uj)DWPH5q3zB zO9XG}PbJ#eAb-hcj_~R*nJZ(IJLC>9^_WikSR{kYsy-hyEku#&*XNV6oCC6@Y0~GT z-ej9>Czv`dtH=_DbXwRliC~qaN~fj83SwBz>9x4qN(Rvre!Z60m#~`DYlFi_98nBI zuPvr=tUC1CJBMKDspZLapz&WC>f<8u1 z?FU24@sU0k zbpcg8Bg)XCbof7bL-a_c%9XhVtfG`F8-69%Ab*9a3aBO}-;h&q{mUU%5BOEDP7jl9 zTS>rAvJI-=;4t|kO)zc#^<~39#&BYXrkNMAMSrNUaql0J?TLU>n|uSv#AyBIljjzHi;k?XZ(N8k$g;&KrW2o^iI8(BR-R4llB}#FbJ|m ziqHJQQ;5SJUJl6Ro?XW1rjc5_c&Vk4ZpH}nKrUfCg*t9yvWjYhhDc(^Uj{LXd-%JWIiC2AM`rMs#_tFGOcEm>Q6{J?t)HM6bg;rD zU%4Peu#|sCR!~qE~FTC?knj22pV}>5;)E~ds^l}5-05`x5a0A=`H^2>0aQz3T W@7w=K#~w`p0000Udw=|=ryHir>&e8Fg?tUNN4|}!` zJGT3H?)$o~-+4Y^>Z)=e97-G{BqWf6JWLaKH~#m+!T_!tscwQuNL1(wFiCCq#X|#3 zckP*mth8X_$&ugiSi(~OP)%(FLpU!PeK64j3vW(~X zDIDvrLXFc?vWXr=lSE3%;%wHh#&upu$k~Dg!eD%LefarJnzQSB+vAz*MGR>LR#xT$ zcw!<7M?W#)3p|9f=H+-vR;lIIwPH9GGiE4DLdlDyH`?urDIAB=Gcl#&Gf1V9+Cc@B zeb3jsyKSdgMMak2x_l``1&wkSbS~Na2@)ixE)Ueyi%!B4{bK!+5KT}%Cl8 zwoM@=+p3(`bOpg;k#AkB$wMvj>LAj|#mULbAktB!S}f!HyF1y&&udTOo>zYtzKrKc zqJGDxdF#407&j#wLo4d{JC!?PAeyE%^1!K7=`{06JjOTst@&VVH7X|l-?eoJ6fcH5XtRN~Zk0=lOM=~t(xr<~^%Soz!-6BHwF7$enC5Db43IkXD#Qf(;8>rR4$ zgWr*}>75w8t27jq@Naru?ns5Yyn~Xn!tRRA;CcZaocR?&em$Bc>g8=`_frD)63$9# zyFcI|@Up9D;}5S`o$KM^*jO5m?YY;;TR9kdk0Ku?+?`!}zu}VOYdB{H zOF_fR`Zwy%x_|!c?(WtJi@VHMc{r0d$g@K-xbtM+`49DjIM@%BTc z=Z<|{#8nAhY{^N@rx97AvCy?T>nTRcv18@rztOI!5nVST!e0-jvtYEZji1`&m1Wvd zjmrpF-&K6{Fm*LJ0=7W^^LEe{R-tVAZX7lV%SF9@IUf=h5^Y%`i&kl@{Z-FjkP|x0 zOb!+t5;B`A;^FlC`dtNeLNLa6`7Tv?HMQq&6wa8FM2yAdgtH`(GAyT9%w-A*EZh)g zYOM)Hz7zEP_C~kk)lQOTYn5Z!4WHC+;1d}Ir6eI^xh{`hbJqC2omt+FsICCoAhL52 zx1;4;*(l0-bynN{yqx=3q@Gfpva5%u$9n;+mI~(C>fspi&vt7aKD4YBpsE9_nbd{7 z?cBUwndS&mm@zdk?I(fp8_Eem@^N=9ZU;=^ZVo$&`>VqbS_O)vFKu)2Qlz#qWyghI zB@Ye`DzdV&W}iv$6<}F!8!feYoF|@bkBDQ&OP8TfD(su)jZ=6~b5UR*V^iz`#Ze?F zJ1!X*wd>sHJBO{{&iMO-3E-D#sU?9-RTKE|@W8k;nkkI)x;L5q_YyTI{HC{mIO(;3F`~5>juQlJS}d#~L6inR ze&6$AN*~yL8=(@LSC;K_wZIjR(~ArxW5cn-4<$ej!nU8t`&9<7_hnB@m@!T7aZ!*G zTx|NXsfUzp-9ff65q`~0TJ>3%1`SaxUN7}7`~vM8l-GW-j_=Q{;A>lc_KC#ZwwNrR zwDKZDVrk#K83G+~K`t&X>P04b+)9jA)Ue&2o72sEPY(~7KyL2dBtE^t4K9D5ZT0geZ}8F&XysfbVb8D^$VOS=Bd3bo2J{}w`w~xzVNWV`A|MvytTEZpd4sVnadNNwlQCA_QOW2 zn}g{_G|_AghWCQVcDBRk{wnzDkH}!*C%R_G^`35vKk4n^Gbs5fFi&MW{;TV&tA5o3 z#mY=#SMsK>L~B86L(Dh08E>b>sW*L<)eH<2WJ|=A#O_CA_&vndA;G+zF8h-V>~DTM zXg_!q8g=@vR6Bxw3%%p$lu>?@D}PHJVT<0c5}NmPvjC#V(A?ZRZdHX4KBoT&=|vg- z#imd$LcAA8h9GV-+1C4;$A{bVR;wO*0*26i7c*v3ZNE3tA;_E%ditD)zYDcR^ck}4 zxJ?B9L$Zwfc%g7&9@hvw>>Lxq9o=&M_CX?BkDr;2E4gOry>39_@yrC-t-ji^-k2ZD ziDQz(A82sfU`5TVZqbyim29~2c?VA4dfLWZPU96t_ifUo{>I;EuXt4jf z={+&_xHI~z&P^dkTxZb2#GfYzdWj2iJlPLOkJ~rm#&uOfnp+DiZ&f zTY*{6R9=H9%PN2fVd2)1NiK z_(BY>ctxbIb=jDQN>NPVsnC`_%t$*=^{w3o`z3xwAm^6JJj=*o(S(JEm&($l(KPLf zps9o`AF`;>rW4Sr>pi9k?*0B)qFHc2CE%cJB4~An9NZ6uK-yC2#EebZIp9D^oN)9bsRi}1MVSfV^!!N zWB)?Rujh>&!@>Bs)#suR7c0xsL^1P0!c^v;cB3bb#&dlFz2eH&Wo4)=xn;T6d z%x{U7I3wwgqzEQzC!?aeXSCvl$)Jp{?K$IHam7WE;|`N)V?AOsk13x!q-ACK$_EkQ zqRk_V%S!mSVyWY6OE{2g2EJ`loM;})xW(a47&lym76U7*bv+&d2#qa)5TQZs+O=tjm{WH}N(zTZk}l$7u|a50=9&D{ z939&|FKsdezvQXA`w!``Vp+^3vwvt|L>E=SQvZDc>5#%%)X>vZ_lIN7)9fP)Cd_pB zcv*V-=cb~YHV-$^yvKIBK$;Bdn3zI!RDRXz>7Nb9Ui$*aP8fb988vUt!5)bZ9X#ID zh%7CFknStMq)7O$fu4lhy>4z|)x&~OxPbm)JgGYf^S^~abEQ1!$h!WmFYQ;-+Ys;6 zq4bNt=BdY++FX7#^Ic@q0^$wyCLmAX7gxG%rC6`xUD&`;QP19O7RxgwkNR}RPSDO>8>uQt#9QB<25`e53|Lh&4@?P1kNWT5)~ zq=?hMgTeIl^e%uj@m18c4xOO$a`r=Yw1_F~!ml5M#<#b-*>jepn@(q2L-oN(@-C~C zSSJV`JKYVh(~BE!(U^H4q$cZ^>o$s-+GJNH?add(tIZc~lN_zIUUQK()_wE{twRMhwNAejoZWj5cv8q0%uUI^>T?wal5ZY7+M+*}^*}R9H%U5_AO|GUS82$N z5c+1GjF)IkM;tOT^L2TQnwpvyd5p^5HT`%6_5i&r)w@pTzheB>12iNu@yClP9d1=Q z=h!^PWZ|%IK^aG{2;B}LaSft3bXB~cS4HI39bb^cP$fUAQ$;n=gL93YW(8K=^Zy(! zHTtbG4?xKN3C4G8C zPW`>17-DmiL@Xj4H||Tq zzCR%sIrbmDfctcAvMo{3DCdtxb?xN_EX&zSq#kbpO4Cjqod2?{6Fq4pg|n5I>W+Wv z+51<>PFS>W@^H1;fS4OGO=gGHL|&Lh?Ry#;_Qw4o%POfd?UKn8M0XIYop5yoo4$;s zYm@j=04k>LlprBN_%eZ5NE_zgK1mRdsW%y?p$OQr-@PM!V#3Jp@v>jP-eyKtd%1Uh z;4FiHLe#Tv>KqwZ-#tGI3&t)gqxLSU6YHm*S?zNDdY1d^W3}}?z7=l}dd*)t$fx0D zz{}VibaMB1Th7<@hfD7d-}(cng*F-1;p`&jKXm?Qz4v=ef8I7p0fCPL#S%dg?5DiV zcQz(f)j@N+g&JmTsG_5(`dfyCh&pa!6b~pb;}BL6k(Q8|sVqY*gvxSEb28o@017cy zEl}D%j#jloka^Dune4fTCvXfSJaR4HzGZM;@A=j)$k1DuRuh6E2(>V`px!z@rV|5j z1)C#-=-y|eFYK|cy?rF;1(-I2Xk?pBz&u+_!&ORKd)gVWH+QiKb+1l^*)-;9uvdmnh` z@`o81z+LCM_@y7UjcYb-2YrGSS97yA5+Pyhr*-FQj!#(Miy&iJqOB>gF_sV%F=o~X z6Ui(1vm$81E9Pcm`)f;Cpzk9_I6H$EHtN`Ra;>8s5^8q? zD=eLGe*auXUVdK`>hhD0+Z5(kXFE6w|FrWYLK9i^B1QmZE6)9w?z>U!DGo5sL;}eJ zsrv@LJPd(u0su^LC%}j*92tq7DvYaA8G-_P*@-DJ-!{O^l|0t7^&xoRNgs?P;5dDy zf^N1R1s@=;vrj};?-4-+tA$Ut*jp%7l-Te2)P}X5F9C;_@RRwxjGQWL`ai(aJW(^u z4(Hhg>_!k02W*u7qerOz*CK;K(l4k&qr9>+3_%f+g|;-nZ0owV`B`e#Nr<$#gzjv2|&j=$Zm7N^cr@LLnx>7QIY%=9oD= zlfVo$d01`9F%gy}{dX|!GEHp4Ji&2wP(fr!qY{R1g&k|1*}ZZ} z&O=V=`JGiTO8(+sh26n+=Y}xYX&~_U;%35Icf5t$KsL(Pn&)@Kqgu#)DG91Am^I`| z(-L3KXvWq(See@u26oF%=;m(%)QMFXh@sUTn`}n0nK!+!0)uLn!WoTXmBU}u+5z&x zh$(Ehsy6cd&j)jVHwX($Kf{+S2H~m1>;qT`{T;~o87;xJ@&~ua7$C|z<4OHJaP3(Wg-OQQ*;zQnTNf*6UQiLe&z@C{kkDqu z$L2G3r@A;BBa)!+L&?rfqTv}|)=f-I)YO2SJ`M=e7~F|>oL}g6(vp*1ox1#y53L(b z1Te{&Pn`F7Emi6ye4zpP0!K)W@q7~;@3lA`7VB6`%m$)QA)ntNbc#pQ^#~cl54NZn zZB6x>owoDd0*qbdalZ4*Tl#y|@e)lMH<$P#k|k6n{Q{r0kkm2!LgSN4qR!VXPU9wLz2PI(*K^uU)8~`7A`r=JY#u-=DTz4|&obUC!H}?Y7xJ_}n>q9T6$ z*(rTxe;rrENp{_%XC1EtP}D7l$^ra!bACaeZyvQ#qr-~k)+&p6pN5wj*l9PKp9;8; z=}@;2>JVvR>&Un1~23`|G0>R&*D? zF1k=khOAR@$d!Y*??aQ5A5vVK4i?e#QR^}PMib$HP1e@#xwD_YN{cvR7I5ae4K_2S z=$MZ0!~c6kwz+M=D>?`L!>Gr^#Kcp)M79o4ZxR*n-$@XqD~RdGYHN>`Ws1YNqvw76 z0Y((vyK;TL<+e$)=*>PtFKN3qyAIHl77FO32!2FB*ID80;J=6s3|{_(?YaPTSc zKR9+Jlf_B^K~}JW;;b2|C#O@z_HrJqtVB$K$WO+QFRrzdVkOTdhIdI+UQ}Vzd-NoA zEf3D3AaosSBK(hRP{t^^_kG?k%;A$=ikjBs?~t8Fub|z;gv|;N^|wRUX}NKC5JO)i;)ZMQ;*B;!h2l-?v9$NzS6Oo250*9qwV zdi%SJ{U)We!+*_+X)qu7sL(O3bVE!P76^~0ugI z4G~)yDZdPI?g%E`-2eyS&AQJ_rv*4-V4P(!TtD*qr7vmM6Rvk(L2kuNa)3fG8~yoZblZ)x zsQLWD?}NX(1v4B+Ek3Y> z^DH3#9p2b&sPJ~dYfZ(YL_e(HVo{UP(h@Yp{~treYicSgDon6H6Zj^5-7&3sMFBh) OLsF1Yg;huy2mTMAkC3wf delta 1521 zcmV_-Lz$h=Qd_(9BOcu*Hz#YuE!5%8e94!Gp%J`mVSQX|t3rP1i;1z1= z!H!#05%eY?$ma~=gnl;RPi{aOtLVi^-7HUDKoKpt;WQJI5wM!4xMheH?gnIX6eHc7 zppJ58kcS^1K7ah=F@tjIIY|#j_A=J3fH!DGEyg+4QiL#=$*ki7G1M-S<3_+#x=|Tm zD}~Z(&jI`hhbF*b^!&zH`+osPh&RF-gu}CzDDn2#4OmUQ z2xSNtrkn`zR@ezB;wf4YN)RqhsZPQW6B7+cqXn%I$`CG21yQt4CmQfE@zx+*o+{!k zPb477eYEx?k}yZmx{Kd>z-MT6;7>|Gfa_>&v>Gsu5V8?wBa$?8h$8DJXf2=yt(}M@ zP9s|DtbYXfxQnb`_ngO14Xs3oaFuE@5Q?$BFPjjuTcn#0Sd3P!&Z>#DOKaLF&{>t} zzAb2#m=9=1Hb6kC$2 zduHB>o-6VyTlQ>5IPe<&#<({?ti|E$i6Wba0}U5&jPBEb(#ry9Sy~m zhO6kgEUmG-ZyH)T#sQ0wbtBYA$KcnE{eAb5l^O?ZMs@r1G2rw0WHYN|MzIF=L*9NbD4G8qv*)KrO3`02V6ro1L5J! zM1S^|alk*w@;nX5N7iQ?5JBemG$0dM*f=1H%;#x<5824eA27;ZLIGsqm;X&X%05PC zS^pUQ6$ku5L|$VF>1B5vNn zIqDCK>1a(b4iI#i`eWlfPC9Gq3dS{rnSX%2$Sxps=6#$r2ca{UknJ`X@FB7oMd~-0 zBfdrG%oMbim%YLiVOTh$c`e+ z1}sEtGeUQ2v8&4DuP~TzJ|LYt$OagX(4DWb;|qlDZrCTS)E6jyI{ArwgInNmT0fJm^ zqvtwv5Dv^-x)lF@wo|uV7SoHKD2-$zY|I3jh@q#4NlxDQI$e2r_pTQxF z+^3lamNJukGV$RfKt8jmq=9C7G1ABwcOQUQ#S`2T;-h3df>OvC+;ED5=;NAQO X6kVCMI9aSW-r^>)t1EGb8kw#`~x z7iZjR;O)FJ``*?I;U64lwSR~c{Bld3Lq$BZ>Y?`!rCM&yjICRqPl=omv}pC_b2Hz3 zKb)v{=jP0t`FH19{@;+E&Y{>M-~=X?O)*&aK~{IC#{MRc&5vP^ zv>sjf7yqh4rsv3?qtkax$nY>xz2|wySh}zbuL#Ye%ycEIse{_xG#0i|6+LJm>#=eZNYr{*I3` z*$Y<7f&vBt&NOkc9{6sRuy*6koVwJV1ywas+dW=0gdJ)ta*U7Bd-1U&=ECO`qnVzT zv(G=jf7!bF`rP$P<<@_V`J3*)b3xnbu34-b=JKxHt@G$>~itdpEu?GSHn%`*JNd1TXg=-y4CT;&#PCi{qH)ZZ-)N+ zkn@3sm-n4xWGK0HqwuTt|1X+1yJ~+=n#0gwd0?h^S@pTwYb&p%{ZF)GRB^M-zC3Sp zK7(rVyseezZ(1|J=+)Y#tF?3QGn}cscCFZVA4ABRwCuI%(Vv+Tj;)7<(Si(y8LX~b z_)c7%tar+)Vd{p1F&FISmEN1TrSiPx`J5Me=YNTS*gr+;9JDv6-_`1ppKw*sdZ~IW zhr7<|@3WSx$5!}TO#8+NGY~JmfP>-Nz0)&=8v@?WW|)wvzx?^$X$x=juWSBZRCOy` za@XGv3`Xyse%X87sO0y-sb7CP@B1FrmUo}8h3CHfC$MOmLdwrwo$o=~%o!g{`MPFn hKQyI6((J;fm;8@6i5 + + + \ No newline at end of file diff --git a/res/layout/item_color.xml b/res/layout/item_color.xml new file mode 100644 index 0000000000..83507eba1c --- /dev/null +++ b/res/layout/item_color.xml @@ -0,0 +1,22 @@ + + + + + + + + \ No newline at end of file diff --git a/res/layout/scribble_activity.xml b/res/layout/scribble_activity.xml index cd2b89c6a1..644b4936de 100644 --- a/res/layout/scribble_activity.xml +++ b/res/layout/scribble_activity.xml @@ -1,44 +1,23 @@ - + - + - + - - - - - - - + diff --git a/res/layout/scribble_hud.xml b/res/layout/scribble_hud.xml new file mode 100644 index 0000000000..b827fbcdf0 --- /dev/null +++ b/res/layout/scribble_hud.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/layout/scribble_view.xml b/res/layout/scribble_view.xml index 5dbd35fbfa..29abcf4429 100644 --- a/res/layout/scribble_view.xml +++ b/res/layout/scribble_view.xml @@ -1,9 +1,7 @@ + xmlns:android="http://schemas.android.com/apk/res/android"> + + + diff --git a/res/values/arrays.xml b/res/values/arrays.xml index e9e6832d98..8c10c34e7a 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -273,11 +273,15 @@ - #000000 + #ffffff #ff0000 - #ffff00 - #00ffff #ff00ff + #0000ff + #00ffff + #00ff00 + #ffff00 + #ff5500 + #000000 diff --git a/res/values/colors.xml b/res/values/colors.xml index 891f5942ad..5cd5e555d7 100644 --- a/res/values/colors.xml +++ b/res/values/colors.xml @@ -54,7 +54,7 @@ #400099cc #40ffffff - #8cf437 + #99ffffff #00FFFFFF #88000000 diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 82a34404ef..0c5eceb268 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -58,7 +58,7 @@ 34sp 20sp - 3dp + 2dp 16dp diff --git a/res/values/themes.xml b/res/values/themes.xml index c47aa779eb..45a58f1f8b 100644 --- a/res/values/themes.xml +++ b/res/values/themes.xml @@ -373,4 +373,7 @@ @drawable/permission_rationale_dialog_corners + + diff --git a/src/org/thoughtcrime/securesms/scribbles/ScribbleActivity.java b/src/org/thoughtcrime/securesms/scribbles/ScribbleActivity.java index 9b3953fdc6..ec9d083218 100644 --- a/src/org/thoughtcrime/securesms/scribbles/ScribbleActivity.java +++ b/src/org/thoughtcrime/securesms/scribbles/ScribbleActivity.java @@ -5,7 +5,6 @@ import android.annotation.TargetApi; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import android.graphics.Color; import android.graphics.PointF; import android.net.Uri; import android.os.AsyncTask; @@ -18,7 +17,6 @@ import android.view.View; import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.crypto.MasterSecret; import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.providers.PersistentBlobProvider; @@ -40,41 +38,37 @@ import java.io.IOException; import java.util.concurrent.ExecutionException; @TargetApi(Build.VERSION_CODES.JELLY_BEAN) -public class ScribbleActivity extends PassphraseRequiredActionBarActivity implements ScribbleToolbar.ScribbleToolbarListener, VerticalSlideColorPicker.OnColorChangeListener { +public class ScribbleActivity extends PassphraseRequiredActionBarActivity implements ScribbleHud.EventListener, VerticalSlideColorPicker.OnColorChangeListener { private static final String TAG = ScribbleActivity.class.getName(); public static final int SELECT_STICKER_REQUEST_CODE = 123; public static final int SCRIBBLE_REQUEST_CODE = 31424; - private VerticalSlideColorPicker colorPicker; - private ScribbleToolbar toolbar; - private ScribbleView scribbleView; - private GlideRequests glideRequests; + private ScribbleHud scribbleHud; + private ScribbleView scribbleView; + private GlideRequests glideRequests; @Override protected void onCreate(Bundle savedInstanceState, boolean ready) { setContentView(R.layout.scribble_activity); this.glideRequests = GlideApp.with(this); + this.scribbleHud = findViewById(R.id.scribble_hud); this.scribbleView = findViewById(R.id.scribble_view); - this.toolbar = findViewById(R.id.toolbar); - this.colorPicker = findViewById(R.id.scribble_color_picker); - this.toolbar.setListener(this); - this.toolbar.setToolColor(Color.RED); + scribbleHud.setEventListener(this); scribbleView.setMotionViewCallback(motionViewCallback); + scribbleView.setDrawingChangedListener(() -> scribbleHud.setColorPalette(scribbleView.getUniqueColors())); scribbleView.setDrawingMode(false); scribbleView.setImage(glideRequests, getIntent().getData()); - colorPicker.setOnColorChangeListener(this); - colorPicker.setVisibility(View.GONE); - - setSupportActionBar(toolbar); - - getSupportActionBar().setDisplayHomeAsUpEnabled(false); - getSupportActionBar().setTitle(null); + if (Build.VERSION.SDK_INT >= 19) { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | + View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | + View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + } } private void addSticker(final Bitmap pica) { @@ -96,6 +90,7 @@ public class ScribbleActivity extends PassphraseRequiredActionBarActivity implem textEntity.getLayer().getFont().setColor(selectedColor); textEntity.updateEntity(); scribbleView.invalidate(); + scribbleHud.setColorPalette(scribbleView.getUniqueColors()); } private void startTextEntityEditing() { @@ -119,23 +114,21 @@ public class ScribbleActivity extends PassphraseRequiredActionBarActivity implem TextEntity textEntity = new TextEntity(textLayer, scribbleView.getWidth(), scribbleView.getHeight()); scribbleView.addEntityAndPosition(textEntity); - // move text sticker up so that its not hidden under keyboard PointF center = textEntity.absoluteCenter(); center.y = center.y * 0.5F; textEntity.moveCenterTo(center); - // redraw scribbleView.invalidate(); startTextEntityEditing(); - changeTextEntityColor(toolbar.getToolColor()); + changeTextEntityColor(scribbleHud.getActiveColor()); } private TextLayer createTextLayer() { TextLayer textLayer = new TextLayer(); Font font = new Font(); - font.setColor(TextLayer.Limits.INITIAL_FONT_COLOR); + font.setColor(scribbleHud.getActiveColor()); font.setSize(TextLayer.Limits.INITIAL_FONT_SIZE); textLayer.setFont(font); @@ -150,7 +143,6 @@ public class ScribbleActivity extends PassphraseRequiredActionBarActivity implem if (resultCode == RESULT_OK) { if (requestCode == SELECT_STICKER_REQUEST_CODE) { if (data != null) { - toolbar.setStickerSelected(true); final String stickerFile = data.getStringExtra(StickerSelectActivity.EXTRA_STICKER_FILE); new AsyncTask() { @@ -176,44 +168,52 @@ public class ScribbleActivity extends PassphraseRequiredActionBarActivity implem } @Override - public void onBrushSelected(boolean enabled) { - scribbleView.setDrawingMode(enabled); - colorPicker.setVisibility(enabled ? View.VISIBLE : View.GONE); + public void onModeStarted(@NonNull ScribbleHud.Mode mode) { + switch (mode) { + case DRAW: + scribbleView.setDrawingMode(true); + scribbleView.setDrawingBrushWidth(ScribbleView.DEFAULT_BRUSH_WIDTH); + break; + + case HIGHLIGHT: + scribbleView.setDrawingMode(true); + scribbleView.setDrawingBrushWidth(ScribbleView.DEFAULT_BRUSH_WIDTH * 3); + break; + + case TEXT: + scribbleView.setDrawingMode(false); + addTextSticker(); + break; + + case STICKER: + scribbleView.setDrawingMode(false); + Intent intent = new Intent(this, StickerSelectActivity.class); + startActivityForResult(intent, SELECT_STICKER_REQUEST_CODE); + break; + + case NONE: + scribbleView.clearSelection(); + scribbleView.setDrawingMode(false); + break; + } } @Override - public void onPaintUndo() { + public void onColorChange(int color) { + scribbleView.setDrawingBrushColor(color); + changeTextEntityColor(color); + } + + @Override + public void onUndo() { scribbleView.undoDrawing(); + scribbleHud.setColorPalette(scribbleView.getUniqueColors()); } @Override - public void onTextSelected(boolean enabled) { - if (enabled) { - addTextSticker(); - scribbleView.setDrawingMode(false); - colorPicker.setVisibility(View.VISIBLE); - } else { - scribbleView.clearSelection(); - colorPicker.setVisibility(View.GONE); - } - } - - @Override - public void onStickerSelected(boolean enabled) { - colorPicker.setVisibility(View.GONE); - - if (!enabled) { - scribbleView.clearSelection(); - } else { - scribbleView.setDrawingMode(false); - Intent intent = new Intent(this, StickerSelectActivity.class); - startActivityForResult(intent, SELECT_STICKER_REQUEST_CODE); - } - } - - public void onDeleteSelected() { + public void onDelete() { scribbleView.deleteSelected(); - colorPicker.setVisibility(View.GONE); + scribbleHud.setColorPalette(scribbleView.getUniqueColors()); } @Override @@ -250,14 +250,14 @@ public class ScribbleActivity extends PassphraseRequiredActionBarActivity implem @Override public void onEntitySelected(@Nullable MotionEntity entity) { if (entity == null) { - toolbar.setNoneSelected(); - colorPicker.setVisibility(View.GONE); + scribbleHud.enterMode(ScribbleHud.Mode.NONE); } else if (entity instanceof TextEntity) { - toolbar.setTextSelected(true); - colorPicker.setVisibility(View.VISIBLE); + int textColor = ((TextEntity) entity).getLayer().getFont().getColor(); + + scribbleHud.enterMode(ScribbleHud.Mode.TEXT); + scribbleHud.setActiveColor(textColor); } else { - toolbar.setStickerSelected(true); - colorPicker.setVisibility(View.GONE); + scribbleHud.enterMode(ScribbleHud.Mode.STICKER); } } @@ -266,14 +266,4 @@ public class ScribbleActivity extends PassphraseRequiredActionBarActivity implem startTextEntityEditing(); } }; - - @Override - public void onColorChange(int color) { - if (color == 0) color = Color.RED; - - toolbar.setToolColor(color); - scribbleView.setDrawingBrushColor(color); - - changeTextEntityColor(color); - } } diff --git a/src/org/thoughtcrime/securesms/scribbles/ScribbleHud.java b/src/org/thoughtcrime/securesms/scribbles/ScribbleHud.java new file mode 100644 index 0000000000..ed2f996da9 --- /dev/null +++ b/src/org/thoughtcrime/securesms/scribbles/ScribbleHud.java @@ -0,0 +1,250 @@ +package org.thoughtcrime.securesms.scribbles; + +import android.content.Context; +import android.graphics.Color; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.widget.LinearLayoutManager; +import android.support.v7.widget.RecyclerView; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +import org.thoughtcrime.securesms.R; +import org.thoughtcrime.securesms.scribbles.widget.ColorPaletteAdapter; +import org.thoughtcrime.securesms.scribbles.widget.VerticalSlideColorPicker; + +import java.util.Set; + +/** + * The HUD (heads-up display) that contains all of the tools for interacting with + * {@link org.thoughtcrime.securesms.scribbles.widget.ScribbleView} + */ +public class ScribbleHud extends FrameLayout { + + private View drawButton; + private View highlightButton; + private View textButton; + private View stickerButton; + private View undoButton; + private View deleteButton; + private View saveButton; + private VerticalSlideColorPicker colorPicker; + private RecyclerView colorPalette; + + private EventListener eventListener; + private ColorPaletteAdapter colorPaletteAdapter; + + public ScribbleHud(@NonNull Context context) { + super(context); + initialize(); + } + + public ScribbleHud(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + initialize(); + } + + public ScribbleHud(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + initialize(); + } + + private void initialize() { + inflate(getContext(), R.layout.scribble_hud, this); + + drawButton = findViewById(R.id.scribble_draw_button); + highlightButton = findViewById(R.id.scribble_highlight_button); + textButton = findViewById(R.id.scribble_text_button); + stickerButton = findViewById(R.id.scribble_sticker_button); + undoButton = findViewById(R.id.scribble_undo_button); + deleteButton = findViewById(R.id.scribble_delete_button); + saveButton = findViewById(R.id.scribble_save_button); + colorPicker = findViewById(R.id.scribble_color_picker); + colorPalette = findViewById(R.id.scribble_color_palette); + + undoButton.setOnClickListener(v -> { + if (eventListener != null) { + eventListener.onUndo(); + } + }); + + deleteButton.setOnClickListener(v -> { + if (eventListener != null) { + eventListener.onDelete(); + } + setMode(Mode.NONE); + }); + + saveButton.setOnClickListener(v -> { + if (eventListener != null) { + eventListener.onSave(); + } + setMode(Mode.NONE); + }); + + colorPaletteAdapter = new ColorPaletteAdapter(); + colorPaletteAdapter.setEventListener(colorPicker::setActiveColor); + + colorPalette.setLayoutManager(new LinearLayoutManager(getContext())); + colorPalette.setAdapter(colorPaletteAdapter); + + setMode(Mode.NONE); + } + + public void setColorPalette(@NonNull Set colors) { + colorPaletteAdapter.setColors(colors); + } + + public void enterMode(@NonNull Mode mode) { + setMode(mode, false); + } + + private void setMode(@NonNull Mode mode) { + setMode(mode, true); + } + + private void setMode(@NonNull Mode mode, boolean notify) { + switch (mode) { + case NONE: presentModeNone(); break; + case DRAW: presentModeDraw(); break; + case HIGHLIGHT: presentModeHighlight(); break; + case TEXT: presentModeText(); break; + case STICKER: presentModeSticker(); break; + } + + if (notify && eventListener != null) { + eventListener.onModeStarted(mode); + } + } + + private void presentModeNone() { + drawButton.setVisibility(VISIBLE); + highlightButton.setVisibility(VISIBLE); + textButton.setVisibility(VISIBLE); + stickerButton.setVisibility(VISIBLE); + + undoButton.setVisibility(GONE); + deleteButton.setVisibility(GONE); + colorPicker.setVisibility(GONE); + colorPalette.setVisibility(GONE); + + drawButton.setOnClickListener(v -> setMode(Mode.DRAW)); + highlightButton.setOnClickListener(v -> setMode(Mode.HIGHLIGHT)); + textButton.setOnClickListener(v -> setMode(Mode.TEXT)); + stickerButton.setOnClickListener(v -> setMode(Mode.STICKER)); + } + + private void presentModeDraw() { + drawButton.setVisibility(VISIBLE); + undoButton.setVisibility(VISIBLE); + colorPicker.setVisibility(VISIBLE); + colorPalette.setVisibility(VISIBLE); + + highlightButton.setVisibility(GONE); + textButton.setVisibility(GONE); + stickerButton.setVisibility(GONE); + deleteButton.setVisibility(GONE); + + drawButton.setOnClickListener(v -> setMode(Mode.NONE)); + + colorPicker.setOnColorChangeListener(standardOnColorChangeListener); + colorPicker.setActiveColor(Color.RED); + } + + private void presentModeHighlight() { + highlightButton.setVisibility(VISIBLE); + undoButton.setVisibility(VISIBLE); + colorPicker.setVisibility(VISIBLE); + colorPalette.setVisibility(VISIBLE); + + drawButton.setVisibility(GONE); + textButton.setVisibility(GONE); + stickerButton.setVisibility(GONE); + deleteButton.setVisibility(GONE); + + highlightButton.setOnClickListener(v -> setMode(Mode.NONE)); + + colorPicker.setOnColorChangeListener(highlightOnColorChangeListener); + colorPicker.setActiveColor(Color.YELLOW); + } + + private void presentModeText() { + textButton.setVisibility(VISIBLE); + deleteButton.setVisibility(VISIBLE); + colorPicker.setVisibility(VISIBLE); + colorPalette.setVisibility(VISIBLE); + + drawButton.setVisibility(GONE); + highlightButton.setVisibility(GONE); + stickerButton.setVisibility(GONE); + undoButton.setVisibility(GONE); + + textButton.setOnClickListener(v -> setMode(Mode.NONE)); + + colorPicker.setOnColorChangeListener(standardOnColorChangeListener); + colorPicker.setActiveColor(Color.WHITE); + } + + private void presentModeSticker() { + stickerButton.setVisibility(VISIBLE); + deleteButton.setVisibility(VISIBLE); + + drawButton.setVisibility(GONE); + highlightButton.setVisibility(GONE); + textButton.setVisibility(GONE); + undoButton.setVisibility(GONE); + colorPicker.setVisibility(GONE); + colorPalette.setVisibility(GONE); + + stickerButton.setOnClickListener(v -> setMode(Mode.NONE)); + } + + public int getActiveColor() { + return colorPicker.getActiveColor(); + } + + public void setActiveColor(int color) { + colorPicker.setActiveColor(color); + } + + public void setEventListener(@Nullable EventListener eventListener) { + this.eventListener = eventListener; + } + + private final VerticalSlideColorPicker.OnColorChangeListener standardOnColorChangeListener = new VerticalSlideColorPicker.OnColorChangeListener() { + @Override + public void onColorChange(int selectedColor) { + if (eventListener != null) { + eventListener.onColorChange(selectedColor); + } + } + }; + + private final VerticalSlideColorPicker.OnColorChangeListener highlightOnColorChangeListener = new VerticalSlideColorPicker.OnColorChangeListener() { + @Override + public void onColorChange(int selectedColor) { + if (eventListener != null) { + int r = Color.red(selectedColor); + int g = Color.green(selectedColor); + int b = Color.blue(selectedColor); + int a = 128; + + eventListener.onColorChange(Color.argb(a, r, g, b)); + } + } + }; + + public enum Mode { + NONE, DRAW, HIGHLIGHT, TEXT, STICKER + } + + public interface EventListener { + void onModeStarted(@NonNull Mode mode); + void onColorChange(int color); + void onUndo(); + void onDelete(); + void onSave(); + } +} diff --git a/src/org/thoughtcrime/securesms/scribbles/ScribbleToolbar.java b/src/org/thoughtcrime/securesms/scribbles/ScribbleToolbar.java deleted file mode 100644 index 75718b0acb..0000000000 --- a/src/org/thoughtcrime/securesms/scribbles/ScribbleToolbar.java +++ /dev/null @@ -1,240 +0,0 @@ -/** - * Copyright (C) 2016 Open Whisper Systems - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.thoughtcrime.securesms.scribbles; - -import android.animation.LayoutTransition; -import android.annotation.TargetApi; -import android.content.Context; -import android.graphics.Color; -import android.graphics.PorterDuff; -import android.graphics.PorterDuffColorFilter; -import android.graphics.drawable.Drawable; -import android.os.Build; -import android.support.annotation.Nullable; -import android.support.v7.widget.Toolbar; -import android.util.AttributeSet; -import android.util.Log; -import android.view.View; -import android.widget.ImageView; -import android.widget.LinearLayout; - -import org.thoughtcrime.securesms.R; - -@TargetApi(Build.VERSION_CODES.JELLY_BEAN) -public class ScribbleToolbar extends Toolbar implements View.OnClickListener { - - private enum Selected { - NONE, - STICKER, - TEXT, - BRUSH - } - - private int foregroundSelectedTint; - private int foregroundUnselectedTint; - - private LinearLayout toolsView; - - private ImageView saveView; - private ImageView brushView; - private ImageView textView; - private ImageView stickerView; - - private ImageView separatorView; - - private ImageView undoView; - private ImageView deleteView; - - private Drawable background; - - @Nullable - private ScribbleToolbarListener listener; - - private int toolColor = Color.RED; - private Selected selected = Selected.NONE; - - public ScribbleToolbar(Context context) { - super(context); - init(context); - } - - public ScribbleToolbar(Context context, @Nullable AttributeSet attrs) { - super(context, attrs); - init(context); - } - - public ScribbleToolbar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { - super(context, attrs, defStyleAttr); - init(context); - } - - private void init(Context context) { - inflate(context, R.layout.scribble_toolbar, this); - - this.toolsView = (LinearLayout) findViewById(R.id.tools_view); - this.brushView = (ImageView) findViewById(R.id.brush_button); - this.textView = (ImageView) findViewById(R.id.text_button); - this.stickerView = (ImageView) findViewById(R.id.sticker_button); - this.separatorView = (ImageView) findViewById(R.id.separator); - this.saveView = (ImageView) findViewById(R.id.save); - - this.undoView = (ImageView) findViewById(R.id.undo); - this.deleteView = (ImageView) findViewById(R.id.delete); - - this.background = getResources().getDrawable(R.drawable.circle_tintable); - this.foregroundSelectedTint = getResources().getColor(R.color.white); - this.foregroundUnselectedTint = getResources().getColor(R.color.grey_800); - - this.undoView.setOnClickListener(this); - this.brushView.setOnClickListener(this); - this.textView.setOnClickListener(this); - this.stickerView.setOnClickListener(this); - this.separatorView.setOnClickListener(this); - this.deleteView.setOnClickListener(this); - this.saveView.setOnClickListener(this); - } - - public void setListener(@Nullable ScribbleToolbarListener listener) { - this.listener = listener; - } - - public void setToolColor(int toolColor) { - this.toolColor = toolColor; - this.background.setColorFilter(new PorterDuffColorFilter(toolColor, PorterDuff.Mode.MULTIPLY)); - } - - public int getToolColor() { - return this.toolColor; - } - - @Override - public void onClick(View v) { - this.toolsView.getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING); - - if (v == this.brushView) { - boolean enabled = selected != Selected.BRUSH; - setBrushSelected(enabled); - if (listener != null) listener.onBrushSelected(enabled); - } else if (v == this.stickerView) { - setNoneSelected(); - if (listener != null) listener.onStickerSelected(true); - } else if (v == this.textView) { - boolean enabled = selected != Selected.TEXT; - setTextSelected(enabled); - if (listener != null) listener.onTextSelected(enabled); - } else if (v == this.deleteView) { - setNoneSelected(); - if (listener != null) listener.onDeleteSelected(); - } else if (v == this.undoView) { - if (listener != null) listener.onPaintUndo(); - } else if (v == this.saveView) { - if (listener != null) listener.onSave(); - } - } - - private void setBrushSelected(boolean enabled) { - if (enabled) { - - this.textView.setBackground(null); - this.textView.setColorFilter(new PorterDuffColorFilter(foregroundUnselectedTint, PorterDuff.Mode.MULTIPLY)); - - this.brushView.setBackground(background); - this.brushView.setColorFilter(new PorterDuffColorFilter(foregroundSelectedTint, PorterDuff.Mode.MULTIPLY)); - - this.stickerView.setBackground(null); - this.stickerView.setColorFilter(new PorterDuffColorFilter(foregroundUnselectedTint, PorterDuff.Mode.MULTIPLY)); - - this.separatorView.setVisibility(View.VISIBLE); - this.undoView.setVisibility(View.VISIBLE); - this.deleteView.setVisibility(View.GONE); - - this.selected = Selected.BRUSH; - } else { - this.brushView.setBackground(null); - this.brushView.setColorFilter(new PorterDuffColorFilter(foregroundUnselectedTint, PorterDuff.Mode.MULTIPLY)); - this.separatorView.setVisibility(View.GONE); - this.undoView.setVisibility(View.GONE); - - this.selected = Selected.NONE; - } - } - - public void setTextSelected(boolean enabled) { - if (enabled) { - this.brushView.setBackground(null); - this.brushView.setColorFilter(new PorterDuffColorFilter(foregroundUnselectedTint, PorterDuff.Mode.MULTIPLY)); - - this.textView.setBackground(background); - this.textView.setColorFilter(new PorterDuffColorFilter(foregroundSelectedTint, PorterDuff.Mode.MULTIPLY)); - - this.stickerView.setBackground(null); - this.stickerView.setColorFilter(new PorterDuffColorFilter(foregroundUnselectedTint, PorterDuff.Mode.MULTIPLY)); - - this.separatorView.setVisibility(View.VISIBLE); - this.undoView.setVisibility(View.GONE); - this.deleteView.setVisibility(View.VISIBLE); - - this.selected = Selected.TEXT; - } else { - this.textView.setBackground(null); - this.textView.setColorFilter(new PorterDuffColorFilter(foregroundUnselectedTint, PorterDuff.Mode.MULTIPLY)); - - this.separatorView.setVisibility(View.GONE); - this.deleteView.setVisibility(View.GONE); - - this.selected = Selected.NONE; - } - } - - public void setStickerSelected(boolean enabled) { - if (enabled) { - this.brushView.setBackground(null); - this.brushView.setColorFilter(new PorterDuffColorFilter(foregroundUnselectedTint, PorterDuff.Mode.MULTIPLY)); - - this.textView.setBackground(null); - this.textView.setColorFilter(new PorterDuffColorFilter(foregroundUnselectedTint, PorterDuff.Mode.MULTIPLY)); - - this.separatorView.setVisibility(View.VISIBLE); - this.undoView.setVisibility(View.GONE); - this.deleteView.setVisibility(View.VISIBLE); - - this.selected = Selected.STICKER; - } else { - this.separatorView.setVisibility(View.GONE); - this.deleteView.setVisibility(View.GONE); - - this.selected = Selected.NONE; - } - } - - public void setNoneSelected() { - setBrushSelected(false); - setStickerSelected(false); - setTextSelected(false); - - this.selected = Selected.NONE; - } - - public interface ScribbleToolbarListener { - public void onBrushSelected(boolean enabled); - public void onPaintUndo(); - public void onTextSelected(boolean enabled); - public void onStickerSelected(boolean enabled); - public void onDeleteSelected(); - public void onSave(); - } -} diff --git a/src/org/thoughtcrime/securesms/scribbles/viewmodel/TextLayer.java b/src/org/thoughtcrime/securesms/scribbles/viewmodel/TextLayer.java index c367510827..efe95c4379 100644 --- a/src/org/thoughtcrime/securesms/scribbles/viewmodel/TextLayer.java +++ b/src/org/thoughtcrime/securesms/scribbles/viewmodel/TextLayer.java @@ -88,7 +88,7 @@ public class TextLayer extends Layer { float FONT_SIZE_STEP = 0.008F; - float INITIAL_FONT_SIZE = 0.075F; + float INITIAL_FONT_SIZE = 0.1F; int INITIAL_FONT_COLOR = 0xff000000; float INITIAL_SCALE = 0.8F; // set the same to avoid text scaling diff --git a/src/org/thoughtcrime/securesms/scribbles/widget/CanvasView.java b/src/org/thoughtcrime/securesms/scribbles/widget/CanvasView.java index fde325c36c..1f80c61300 100644 --- a/src/org/thoughtcrime/securesms/scribbles/widget/CanvasView.java +++ b/src/org/thoughtcrime/securesms/scribbles/widget/CanvasView.java @@ -20,15 +20,16 @@ import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.graphics.RectF; -import android.graphics.Typeface; +import android.support.annotation.NonNull; import android.util.AttributeSet; -import android.util.Log; import android.view.MotionEvent; import android.view.View; import java.io.ByteArrayOutputStream; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; /** * This class defines fields and methods for drawing. @@ -37,6 +38,8 @@ public class CanvasView extends View { private static final String TAG = CanvasView.class.getSimpleName(); + public static final int DEFAULT_STROKE_WIDTH = 15; + // Enumeration for Mode public enum Mode { DRAW, @@ -78,7 +81,7 @@ public class CanvasView extends View { private Paint.Style paintStyle = Paint.Style.STROKE; private int paintStrokeColor = Color.BLACK; private int paintFillColor = Color.BLACK; - private float paintStrokeWidth = 15F; + private float paintStrokeWidth = DEFAULT_STROKE_WIDTH; private int opacity = 255; private float blur = 0F; private Paint.Cap lineCap = Paint.Cap.ROUND; @@ -143,7 +146,7 @@ public class CanvasView extends View { paint.setStyle(this.paintStyle); paint.setStrokeWidth(this.paintStrokeWidth); paint.setStrokeCap(this.lineCap); - paint.setStrokeJoin(Paint.Join.MITER); // fixed + paint.setStrokeJoin(Paint.Join.ROUND); // fixed if (this.mode == Mode.ERASER) { // Eraser @@ -275,7 +278,9 @@ public class CanvasView extends View { switch (this.drawer) { case PEN : - path.lineTo(x, y); + for (int i = 0; i < event.getHistorySize(); i++) { + path.lineTo(event.getHistoricalX(i), event.getHistoricalY(i)); + } break; case LINE : path.reset(); @@ -770,4 +775,14 @@ public class CanvasView extends View { return this.getBitmapAsByteArray(CompressFormat.PNG, 100); } + public @NonNull Set getUniqueColors() { + Set colors = new LinkedHashSet<>(); + + for (int i = 1; i < paintLists.size() && i < historyPointer; i++) { + int color = paintLists.get(i).getColor(); + colors.add(Color.rgb(Color.red(color), Color.green(color), Color.blue(color))); + } + + return colors; + } } \ No newline at end of file diff --git a/src/org/thoughtcrime/securesms/scribbles/widget/ColorPaletteAdapter.java b/src/org/thoughtcrime/securesms/scribbles/widget/ColorPaletteAdapter.java new file mode 100644 index 0000000000..401a847f0f --- /dev/null +++ b/src/org/thoughtcrime/securesms/scribbles/widget/ColorPaletteAdapter.java @@ -0,0 +1,73 @@ +package org.thoughtcrime.securesms.scribbles.widget; + +import android.graphics.PorterDuff; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; + +import org.thoughtcrime.securesms.R; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class ColorPaletteAdapter extends RecyclerView.Adapter { + + private final List colors = new ArrayList<>(); + + private EventListener eventListener; + + @Override + public ColorViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + return new ColorViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_color, parent, false)); + } + + @Override + public void onBindViewHolder(ColorViewHolder holder, int position) { + holder.bind(colors.get(position), eventListener); + } + + @Override + public int getItemCount() { + return colors.size(); + } + + public void setColors(@NonNull Collection colors) { + this.colors.clear(); + this.colors.addAll(colors); + + notifyDataSetChanged(); + } + + public void setEventListener(@Nullable EventListener eventListener) { + this.eventListener = eventListener; + + notifyDataSetChanged(); + } + + public interface EventListener { + void onColorSelected(int color); + } + + static class ColorViewHolder extends RecyclerView.ViewHolder { + + ImageView foreground; + + ColorViewHolder(View itemView) { + super(itemView); + foreground = itemView.findViewById(R.id.palette_item_foreground); + } + + void bind(int color, @Nullable EventListener eventListener) { + foreground.setColorFilter(color, PorterDuff.Mode.SRC_IN); + + if (eventListener != null) { + itemView.setOnClickListener(v -> eventListener.onColorSelected(color)); + } + } + } +} diff --git a/src/org/thoughtcrime/securesms/scribbles/widget/MotionView.java b/src/org/thoughtcrime/securesms/scribbles/widget/MotionView.java index 670b861df7..28420bc937 100644 --- a/src/org/thoughtcrime/securesms/scribbles/widget/MotionView.java +++ b/src/org/thoughtcrime/securesms/scribbles/widget/MotionView.java @@ -36,6 +36,7 @@ import android.support.v4.view.ViewCompat; import android.text.Editable; import android.text.InputType; import android.text.Selection; +import android.text.TextUtils; import android.text.TextWatcher; import android.util.AttributeSet; import android.util.Log; @@ -56,7 +57,9 @@ import org.thoughtcrime.securesms.scribbles.widget.entity.MotionEntity; import org.thoughtcrime.securesms.scribbles.widget.entity.TextEntity; import java.util.ArrayList; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; public class MotionView extends FrameLayout implements TextWatcher { @@ -182,6 +185,18 @@ public class MotionView extends FrameLayout implements TextWatcher { } } + public @NonNull Set getUniqueColors() { + Set colors = new LinkedHashSet<>(); + + for (MotionEntity entity : entities) { + if (entity instanceof TextEntity) { + colors.add(((TextEntity) entity).getLayer().getFont().getColor()); + } + } + + return colors; + } + private void initEntityBorder(@NonNull MotionEntity entity ) { // init stroke int strokeSize = getResources().getDimensionPixelSize(R.dimen.scribble_stroke_size); @@ -274,14 +289,17 @@ public class MotionView extends FrameLayout implements TextWatcher { } private void selectEntity(@Nullable MotionEntity entity, boolean updateCallback) { - if (selectedEntity != null) { + if (selectedEntity != null && entity != selectedEntity) { selectedEntity.setIsSelected(false); if (selectedEntity instanceof TextEntity) { - editText.clearComposingText(); - editText.clearFocus(); - - InputMethodManager imm = (InputMethodManager)getContext().getSystemService(Context.INPUT_METHOD_SERVICE); + if (TextUtils.isEmpty(((TextEntity) selectedEntity).getLayer().getText())) { + deletedSelectedEntity(); + } else { + editText.clearComposingText(); + editText.clearFocus(); + } + InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(editText.getWindowToken(), 0); } @@ -413,6 +431,12 @@ public class MotionView extends FrameLayout implements TextWatcher { updateSelectionOnTap(e); return true; } + + @Override + public boolean onDown(MotionEvent e) { + updateSelectionOnTap(e); + return false; + } } private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { diff --git a/src/org/thoughtcrime/securesms/scribbles/widget/ScribbleView.java b/src/org/thoughtcrime/securesms/scribbles/widget/ScribbleView.java index d078de4b2b..d0e04376d5 100644 --- a/src/org/thoughtcrime/securesms/scribbles/widget/ScribbleView.java +++ b/src/org/thoughtcrime/securesms/scribbles/widget/ScribbleView.java @@ -21,18 +21,22 @@ import android.annotation.TargetApi; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.drawable.Drawable; import android.net.Uri; -import android.os.AsyncTask; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.AttributeSet; -import android.util.Log; +import android.view.MotionEvent; +import android.view.View; import android.widget.FrameLayout; import android.widget.ImageView; import com.bumptech.glide.load.engine.DiskCacheStrategy; +import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; +import com.bumptech.glide.request.transition.Transition; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri; @@ -43,12 +47,15 @@ import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; import org.thoughtcrime.securesms.util.concurrent.SettableFuture; -import java.util.concurrent.ExecutionException; +import java.util.LinkedHashSet; +import java.util.Set; public class ScribbleView extends FrameLayout { private static final String TAG = ScribbleView.class.getSimpleName(); + public static final int DEFAULT_BRUSH_WIDTH = CanvasView.DEFAULT_STROKE_WIDTH; + private ImageView imageView; private MotionView motionView; private CanvasView canvasView; @@ -77,7 +84,7 @@ public class ScribbleView extends FrameLayout { } public void setImage(@NonNull GlideRequests glideRequests, @NonNull Uri uri) { - this.imageUri = uri; + this.imageUri = uri; glideRequests.load(new DecryptableUri(uri)) .diskCacheStrategy(DiskCacheStrategy.NONE) @@ -85,7 +92,6 @@ public class ScribbleView extends FrameLayout { .into(imageView); } - @SuppressLint("StaticFieldLeak") public @NonNull ListenableFuture getRenderedImage(@NonNull GlideRequests glideRequests) { final SettableFuture future = new SettableFuture<>(); final Context context = getContext(); @@ -96,43 +102,33 @@ public class ScribbleView extends FrameLayout { return future; } - new AsyncTask() { - @Override - protected @Nullable Bitmap doInBackground(Void... params) { - try { - int width = Target.SIZE_ORIGINAL; - int height = Target.SIZE_ORIGINAL; + int width = Target.SIZE_ORIGINAL; + int height = Target.SIZE_ORIGINAL; - if (isLowMemory) { - width = 768; - height = 768; - } + if (isLowMemory) { + width = 768; + height = 768; + } - return glideRequests.asBitmap() - .load(new DecryptableUri(imageUri)) - .diskCacheStrategy(DiskCacheStrategy.NONE) - .skipMemoryCache(true) - .into(width, height) - .get(); - } catch (InterruptedException | ExecutionException e) { - Log.w(TAG, e); - return null; - } - } + glideRequests.asBitmap() + .load(new DecryptableUri(imageUri)) + .diskCacheStrategy(DiskCacheStrategy.NONE) + .skipMemoryCache(true) + .override(width, height) + .into(new SimpleTarget() { + @Override + public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition transition) { + Canvas canvas = new Canvas(bitmap); + motionView.render(canvas); + canvasView.render(canvas); + future.set(bitmap); + } - @Override - protected void onPostExecute(@Nullable Bitmap bitmap) { - if (bitmap == null) { - future.set(null); - return; - } - - Canvas canvas = new Canvas(bitmap); - motionView.render(canvas); - canvasView.render(canvas); - future.set(bitmap); - } - }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); + @Override + public void onLoadFailed(@Nullable Drawable errorDrawable) { + future.set(null); + } + }); return future; } @@ -149,6 +145,18 @@ public class ScribbleView extends FrameLayout { this.motionView.setMotionViewCallback(callback); } + @SuppressLint("ClickableViewAccessibility") + public void setDrawingChangedListener(@Nullable DrawingChangedListener listener) { + this.canvasView.setOnTouchListener((v, event) -> { + if (event.getAction() == MotionEvent.ACTION_UP || event.getAction() == MotionEvent.ACTION_CANCEL) { + if (listener != null) { + listener.onDrawingChanged(); + } + } + return false; + }); + } + public void setDrawingMode(boolean enabled) { this.canvasView.setActive(enabled); if (enabled) this.motionView.unselectEntity(); @@ -157,6 +165,11 @@ public class ScribbleView extends FrameLayout { public void setDrawingBrushColor(int color) { this.canvasView.setPaintFillColor(color); this.canvasView.setPaintStrokeColor(color); + this.canvasView.setOpacity(Color.alpha(color)); + } + + public void setDrawingBrushWidth(int width) { + this.canvasView.setPaintStrokeWidth(width); } public void addEntityAndPosition(MotionEntity entity) { @@ -183,6 +196,15 @@ public class ScribbleView extends FrameLayout { this.motionView.startEditing(entity); } + public @NonNull Set getUniqueColors() { + Set colors = new LinkedHashSet<>(); + + colors.addAll(motionView.getUniqueColors()); + colors.addAll(canvasView.getUniqueColors()); + + return colors; + } + @Override public void onMeasure(int width, int height) { super.onMeasure(width, height); @@ -196,4 +218,7 @@ public class ScribbleView extends FrameLayout { MeasureSpec.makeMeasureSpec(imageView.getMeasuredHeight(), MeasureSpec.EXACTLY)); } + public interface DrawingChangedListener { + void onDrawingChanged(); + } } diff --git a/src/org/thoughtcrime/securesms/scribbles/widget/VerticalSlideColorPicker.java b/src/org/thoughtcrime/securesms/scribbles/widget/VerticalSlideColorPicker.java index ab6f0d5da5..497a830b1c 100644 --- a/src/org/thoughtcrime/securesms/scribbles/widget/VerticalSlideColorPicker.java +++ b/src/org/thoughtcrime/securesms/scribbles/widget/VerticalSlideColorPicker.java @@ -43,8 +43,12 @@ import org.thoughtcrime.securesms.R; public class VerticalSlideColorPicker extends View { + private static final float INDICATOR_TO_BAR_WIDTH_RATIO = 0.8f; + private Paint paint; private Paint strokePaint; + private Paint indicatorStrokePaint; + private Paint indicatorFillPaint; private Path path; private Bitmap bitmap; private Canvas bitmapCanvas; @@ -59,8 +63,12 @@ public class VerticalSlideColorPicker extends View { private int borderColor; private float borderWidth; + private float indicatorRadius; private int[] colors; + private int touchY; + private int activeColor; + public VerticalSlideColorPicker(Context context) { super(context); init(); @@ -74,9 +82,9 @@ public class VerticalSlideColorPicker extends View { try { int colorsResourceId = a.getResourceId(R.styleable.VerticalSlideColorPicker_pickerColors, R.array.scribble_colors); - colors = a.getResources().getIntArray(colorsResourceId); - borderColor = a.getColor(R.styleable.VerticalSlideColorPicker_pickerBorderColor, Color.WHITE); - borderWidth = a.getDimension(R.styleable.VerticalSlideColorPicker_pickerBorderWidth, 10f); + colors = a.getResources().getIntArray(colorsResourceId); + borderColor = a.getColor(R.styleable.VerticalSlideColorPicker_pickerBorderColor, Color.WHITE); + borderWidth = a.getDimension(R.styleable.VerticalSlideColorPicker_pickerBorderWidth, 10f); } finally { a.recycle(); @@ -110,6 +118,13 @@ public class VerticalSlideColorPicker extends View { strokePaint.setColor(borderColor); strokePaint.setAntiAlias(true); strokePaint.setStrokeWidth(borderWidth); + + indicatorStrokePaint = new Paint(strokePaint); + indicatorStrokePaint.setStrokeWidth(borderWidth / 2); + + indicatorFillPaint = new Paint(); + indicatorFillPaint.setStyle(Paint.Style.FILL); + indicatorFillPaint.setAntiAlias(true); } @Override @@ -126,20 +141,27 @@ public class VerticalSlideColorPicker extends View { bitmapCanvas.drawPath(path, paint); canvas.drawBitmap(bitmap, 0, 0, null); + + touchY = Math.max((int) colorPickerBody.top, touchY); + + indicatorFillPaint.setColor(activeColor); + canvas.drawCircle(centerX, touchY, indicatorRadius, indicatorFillPaint); + canvas.drawCircle(centerX, touchY, indicatorRadius, indicatorStrokePaint); } @Override public boolean onTouchEvent(MotionEvent event) { + touchY = (int) Math.min(event.getY(), colorPickerBody.bottom); + touchY = (int) Math.max(colorPickerBody.top, touchY); - float yPos = Math.min(event.getY(), colorPickerBody.bottom); - yPos = Math.max(colorPickerBody.top, yPos); - - int selectedColor = bitmap.getPixel(viewWidth/2, (int) yPos); + activeColor = bitmap.getPixel(viewWidth/2, touchY); if (onColorChangeListener != null) { - onColorChangeListener.onColorChange(selectedColor); + onColorChangeListener.onColorChange(activeColor); } + invalidate(); + return true; } @@ -147,13 +169,16 @@ public class VerticalSlideColorPicker extends View { protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); - viewWidth = w; + viewWidth = w; viewHeight = h; - centerX = viewWidth / 2; - colorPickerRadius = (viewWidth / 2) - borderWidth; + int barWidth = (int) (viewWidth * INDICATOR_TO_BAR_WIDTH_RATIO); - colorPickerBody = new RectF(centerX - colorPickerRadius, borderWidth + colorPickerRadius, centerX + colorPickerRadius, viewHeight - (borderWidth + colorPickerRadius)); + centerX = viewWidth / 2; + indicatorRadius = (viewWidth / 2) - borderWidth; + colorPickerRadius = (barWidth / 2) - borderWidth; + + colorPickerBody = new RectF(centerX - colorPickerRadius, borderWidth + colorPickerRadius, centerX + colorPickerRadius, viewHeight - (borderWidth + colorPickerRadius)); LinearGradient gradient = new LinearGradient(0, colorPickerBody.top, 0, colorPickerBody.bottom, colors, null, Shader.TileMode.CLAMP); paint.setShader(gradient); @@ -164,8 +189,6 @@ public class VerticalSlideColorPicker extends View { bitmap = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.ARGB_8888); bitmapCanvas = new Canvas(bitmap); - - resetToDefault(); } public void setBorderColor(int borderColor) { @@ -183,20 +206,29 @@ public class VerticalSlideColorPicker extends View { invalidate(); } - public void resetToDefault() { + public void setActiveColor(int color) { + activeColor = color; + + if (colorPickerBody != null) { + touchY = (int) colorPickerBody.top; + } + if (onColorChangeListener != null) { - onColorChangeListener.onColorChange(Color.RED); + onColorChangeListener.onColorChange(color); } invalidate(); } + public int getActiveColor() { + return activeColor; + } + public void setOnColorChangeListener(OnColorChangeListener onColorChangeListener) { this.onColorChangeListener = onColorChangeListener; } public interface OnColorChangeListener { - void onColorChange(int selectedColor); } } \ No newline at end of file