From efca0279eb927faebffc38c8382818df67fcd159 Mon Sep 17 00:00:00 2001 From: Adam Cohen Date: Wed, 24 Feb 2016 19:19:06 -0800 Subject: [PATCH] Switch all folder preview rendering to be programmatic (ie. no assets) -> Refactored the preview background rendering to be much more self-contained. This cleans up a lot of code in the CellLayout, and keeps the logic in the right place. -> We switch to software rendering for performance and compatibility reasons. -> Removed all assets. -> FolderIcon accept animation includes animation of the clipped region. -> 1:1 hand-off of drawing of the FolderIcon background between the FolderIcon and the CellLayout. Unfortunately, CellLayout rendering is still required to work around clipping issues (due to use of software layer). We also need this to support folder creation feedback. Change-Id: Ib8f7fa6359dfedff8145f38dd50ba03849ca0d51 --- res/drawable-hdpi/portal_ring_inner.png | Bin 2340 -> 0 bytes res/drawable-hdpi/portal_ring_inner_nolip.png | Bin 2231 -> 0 bytes res/drawable-hdpi/portal_ring_outer.png | Bin 5918 -> 0 bytes res/drawable-hdpi/portal_ring_rest.png | Bin 1512 -> 0 bytes res/drawable-mdpi/portal_ring_inner.png | Bin 1431 -> 0 bytes res/drawable-mdpi/portal_ring_inner_nolip.png | Bin 1382 -> 0 bytes res/drawable-mdpi/portal_ring_outer.png | Bin 3217 -> 0 bytes res/drawable-mdpi/portal_ring_rest.png | Bin 871 -> 0 bytes res/drawable-xhdpi/portal_ring_inner.png | Bin 3275 -> 0 bytes .../portal_ring_inner_nolip.png | Bin 3054 -> 0 bytes res/drawable-xhdpi/portal_ring_outer.png | Bin 8338 -> 0 bytes res/drawable-xhdpi/portal_ring_rest.png | Bin 2056 -> 0 bytes res/drawable-xxhdpi/portal_ring_inner.png | Bin 5663 -> 0 bytes .../portal_ring_inner_nolip.png | Bin 5418 -> 0 bytes res/drawable-xxhdpi/portal_ring_outer.png | Bin 16598 -> 0 bytes res/drawable-xxhdpi/portal_ring_rest.png | Bin 3622 -> 0 bytes res/drawable-xxxhdpi/portal_ring_inner.png | Bin 7927 -> 0 bytes .../portal_ring_inner_nolip.png | Bin 7432 -> 0 bytes res/drawable-xxxhdpi/portal_ring_outer.png | Bin 20634 -> 0 bytes res/drawable-xxxhdpi/portal_ring_rest.png | Bin 4993 -> 0 bytes res/layout/folder_icon.xml | 7 - src/com/android/launcher3/CellLayout.java | 119 ++--- src/com/android/launcher3/DeviceProfile.java | 2 + src/com/android/launcher3/Launcher.java | 6 +- src/com/android/launcher3/Workspace.java | 28 +- .../launcher3/config/FeatureFlags.java | 2 +- .../folder/ClippedFolderIconLayoutRule.java | 16 +- .../android/launcher3/folder/FolderIcon.java | 502 +++++++++++------- .../folder/StackFolderIconLayoutRule.java | 4 +- 29 files changed, 381 insertions(+), 305 deletions(-) delete mode 100644 res/drawable-hdpi/portal_ring_inner.png delete mode 100644 res/drawable-hdpi/portal_ring_inner_nolip.png delete mode 100644 res/drawable-hdpi/portal_ring_outer.png delete mode 100644 res/drawable-hdpi/portal_ring_rest.png delete mode 100644 res/drawable-mdpi/portal_ring_inner.png delete mode 100644 res/drawable-mdpi/portal_ring_inner_nolip.png delete mode 100644 res/drawable-mdpi/portal_ring_outer.png delete mode 100644 res/drawable-mdpi/portal_ring_rest.png delete mode 100644 res/drawable-xhdpi/portal_ring_inner.png delete mode 100644 res/drawable-xhdpi/portal_ring_inner_nolip.png delete mode 100644 res/drawable-xhdpi/portal_ring_outer.png delete mode 100644 res/drawable-xhdpi/portal_ring_rest.png delete mode 100644 res/drawable-xxhdpi/portal_ring_inner.png delete mode 100644 res/drawable-xxhdpi/portal_ring_inner_nolip.png delete mode 100644 res/drawable-xxhdpi/portal_ring_outer.png delete mode 100644 res/drawable-xxhdpi/portal_ring_rest.png delete mode 100644 res/drawable-xxxhdpi/portal_ring_inner.png delete mode 100644 res/drawable-xxxhdpi/portal_ring_inner_nolip.png delete mode 100644 res/drawable-xxxhdpi/portal_ring_outer.png delete mode 100644 res/drawable-xxxhdpi/portal_ring_rest.png diff --git a/res/drawable-hdpi/portal_ring_inner.png b/res/drawable-hdpi/portal_ring_inner.png deleted file mode 100644 index 65f5af2e7a062089bb3896792935d2e83dda035f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2340 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 FV1kzkQ_=tc diff --git a/res/drawable-hdpi/portal_ring_outer.png b/res/drawable-hdpi/portal_ring_outer.png deleted file mode 100644 index 712eeb20ca466a7cf059feb7501be0777d4e46f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5918 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 diff --git a/res/drawable-hdpi/portal_ring_rest.png b/res/drawable-hdpi/portal_ring_rest.png deleted file mode 100644 index 33cec3218cdf3586b8307f9ef955028d5bb22bee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1512 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 diff --git a/res/drawable-mdpi/portal_ring_inner_nolip.png b/res/drawable-mdpi/portal_ring_inner_nolip.png deleted file mode 100644 index 6ccdebbee24d6acc9bc309d44bd4d3583681fbc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1382 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 Dc2`DB diff --git a/res/drawable-mdpi/portal_ring_rest.png b/res/drawable-mdpi/portal_ring_rest.png deleted file mode 100644 index b2c733bddbf10ac3aaf3b66afcdf5a2416bc3bc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 871 zcmV-t1DO1YP)_aN6fdidX3?Y>_dd|INAIE5Db)ke(<>q`_8D1vqMd9@F(5= zY}@fQpZo63XIZO1voI$blT`$X7N`yL(hS?E~;6s}&|eN*3SbImtLdLDmu=Vx%6M}6Uc2=iA`BD*4ffs9!#kax3#4Os z=ewh^n4(~GdWUZcSCI70(>sXtVBnU_Y0Pt!iK8)Z$(%r{K|B6(;YyO@FURUZgIPSd zInPrzp60y8gE1IwLwms@EL9?R&^NUGW>7I*cd!K-Mq@oy;)%uy`~8*==Bqe@)Y9YEXAVu_qGIsGv^449cFe$OKG7zrr9`B0+x@BBF%@PoF(v@}QA@1~qy?5}!DHXxE;NU$6Z6Fgdw!shqj; z^Pv?qfLK`!$mV5pvII~tM>na_eZu@s9>~8=`C-BjoODx6z}lfZY(gRloD)bja0gJ0 x+7=C+0xJjxRQ7)Xg$Y;{P=AG|XVXqQzW}(9buc=G@KXQ)002ovPDHLkV1j`sv1kAQ diff --git a/res/drawable-xhdpi/portal_ring_inner.png b/res/drawable-xhdpi/portal_ring_inner.png deleted file mode 100644 index b088042e7a753e036fb42c3fb519d7bfffa82a97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3275 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 JPDHLkV1i9cBlrLS diff --git a/res/drawable-xhdpi/portal_ring_inner_nolip.png b/res/drawable-xhdpi/portal_ring_inner_nolip.png deleted file mode 100644 index decf76698f5e8ac293994f1efdae67ed215d6bfc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3054 zcmV8{F)Cfls6SJi-pJ`ESU>gW%8lL$f;Js$6`WiRda!=LT<>I6hh5r`q$zC$O`dye!l9Fi`V?n7GjIZz7)!`4p9+Mk5BBooi!1R z>=OU;o=;C}zvria7Hi3-63S{e_`j*LZd$YZE~*MSC&JOnu>{>B%Fw_N*OGAaKo?v&0JLcn4fP>(kaJKShP-uU~;*Y;_D1|lW% zoN!ipL&1P?K=kVqYVOI44#8-xx##N>4v4~l0R@&V-!%%Zk!099UYjxXYHLhqJS>_G z?dxv*?kVqPBtzf~o5R+zW#Fr0%P;4?=p?vr`Q=|7w`IUii2~W<5|w#6ZX2@Ijh?9> zbS7jrPMJC8!ArhFhA5XZq&Z%nRdY43fdYVgl&`n(TPME_%4Ew>?u#@zAMf1jWa@$f zfjpu4+y8p(Q&440$iZL~5*#`B%VT0D6cjig36YDX+4IP0T{l4iVl{19 zdG8&cCi2lCQl-tFJI?j4i2}u}UT?^~H-8$>wGdi-u{?5GLFy2Uq3c#$a@$WXQo?Tb zmS>Oju8RW4yY90`%H3;nvMhw`LnY^(|VQ0I`1I>X=P{af_d7#oj{42)uiYYz)4Cz~%j zsnbX2ds0opanK0w z_%kX%V33=HFw~R{NI@frr)&TPPA?(y4Kby{YeF-^Ybpf-1E6#hqOPm6`a?6U{@2w* zrJoQ^PR$%>Nc9}BJ&qG1FDrwSpdq1&^4v?#6GGsFds|h|5Ucv&-cqaS2$?#X85+Vg zb+mIKq66Hc6`Inc4ZJcXyz;Nn`CFhV{ua?ejuX=0F^57^%pnaPrwNfwceg=oLQ~k> zeJ~j8TnNAehcR@8F>n|dNGBl_u7Jjb%0Uhjk}}7ha%haFBBg_!mMWPsXpGqx1WM~p z)r@E@B=0Pc7_yu{+!3HZ z|8jQ@K(ZuH7|&jxZQEAp5W2wGw)MYzwr$(CZQESi9Bl8Xs;e%xrYC#)^zWY4OjSh> z7H?nv;`=glTE#J1%Vn1ZWCp?lR?Dsu0;u_92BHy^iDGdlGpUss2(7iclbP!q5Qoe_ zh{K51S`Og>seuF>z^#{E4jjN&Dl-s&sUD{VAUyb}7BYEj45)>nIISo|uq&4uNLdl; z!>VP@WXKHUY`P80hzZlPeMD9uJ~Ax}BeiH5mKRX7WCfyT|UhRI*cSQrj&M;!7)BQhY|WE%on>+Pva)EKNTsY_aI7y1ad3%3sh!u!=A zlK%}U$o9q7?m{Tc{@)NC2Q>^6v1J4j8bXp;H>p*bN@FQ|s1sXd)}cBmDkKsh2!#br zQ@>5i-rS{vu^8!1E7+E<)3SsAb0FrAbddou+A~b9t+pQ-Sp_Txa8$vOk$-G6k|`P{ zQp@0Am_-EZk7u4)Py;;LcNM~!1s~50sRJ_zjs{o;dseC&hkh_9b*%$HoD%yzM1002B&q_PliGMR%ou5|w7Dfz&M@bW!~wO#?O3X#*94$PL?w&EjGwV zpj{djh=Q6DuPH3t|E%}o=Tek}sAh0qx|#gber>i+wXWb;mVX2wT=eWke@x_$HB+38rDzq z4rO~lA|Iz*yVg8@S>l69N@9!c?&bQ z;87m}hFu)yq-ry{;vY7eakIw%$cMA}1sDTPzoSwdF)zF_tFFTUz0%nF`PNRsUMV56_j1>WJ z#zBI3F9ac;6|pHVU-Rm-w?28r!x!F_oR9>GkYFr5hFrt;=>2bOcVKxit{Q8aOE$kI#-5tA4Gg~cQSi=GG|7ARC3!(K-s0K+xHtjsMs)|1N|d=EjY=Ai|&YUrv(D+nq`xGyAP5^GBNu zFwn=J$ebu#TR3`tA3_d{0%P1D_*|l7k)-EfalJ^4HTQpVAovC%py$ORP_nD~gh3L9 wlQ0KJ^&VpKAo-0L0iqvG6y*KyKkARS6DxbYS^87T{r~^~07*qoM6N<$f{VVYH~;_u diff --git a/res/drawable-xhdpi/portal_ring_outer.png b/res/drawable-xhdpi/portal_ring_outer.png deleted file mode 100644 index 5ab9a21cf5f515fc320bfc717d48c1040e28f39b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8338 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 SdH(w%!^lc0N!E&+g!~WT)GC1h diff --git a/res/drawable-xhdpi/portal_ring_rest.png b/res/drawable-xhdpi/portal_ring_rest.png deleted file mode 100644 index 7d1c8423675f1d10366e117131285c751922a2ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2056 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 diff --git a/res/drawable-xxhdpi/portal_ring_inner_nolip.png b/res/drawable-xxhdpi/portal_ring_inner_nolip.png deleted file mode 100644 index d82b910e9851b97d35f07dd1f0ef38dd88c36567..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5418 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�|F3lUF4 zWZb;X@$?ZzZ1KIHi-KMd{jfnH9}ub-R6}YU6q!1`<4ySd@WbaN5eexdk2GS4AXz^B z#ZXpI4XPis!Ch8BXb!PO)+udIrsa7BTt&PjB4PHighvA7fBrThsD}0GMnBvG0tYmB zQBCOzy|k)frwTu}8Q%j%#0#g1C38XG>bqwJFzgc$svpY=2+278(xD-RpkC3ueHtb);5AJeueA+VE6K)w`)O3z+=2|oZ26;} zfDkc!=C59ub5PMQZYs@3Iw`pooA>Pl
  • F@{#nKTE5l1|Pm3|mO#H)Dx_SHl|uoJ2t?(Ib?Ak=0kFakEQ@?8JZdn;=UFph_h zdJ%oR%h()`P_+`s&VK(T$Aj5Uet>o_6q5P_LJ^@~;zbcj8RPxW?K0PuI7zBi9wLq_ zIo{R=kwRwj%dZ!TG?tR%;>^9h$ODAh%pFH*xyn%gb6b^-Iv7X8di4+?cU?4o+B8_L zEK*{~LRoz~MSzFtv!VmBkas@sV3m}Lb;_dJM znyClyPPFS)+M>Q89p;)ja8Ggb8hJ1OY^#vB2@SkCo|2 z%z8^UFcR#A03rbq`Px3AOB46i+5I_u?G5+gkZ2%dgGx{Y7 z=|eIg_J3hTP!fVqZ{&Z|>z^q%7Eu9eN#sei8YU!<7*8H46ms3){4(lzm=F#FcJfF9 zL_!jQ9SpIr8A)gQcI{+qG#Fq666FbOYIEFLf(Rjp?Cjw$&xYxg)D}~jWBOo{0g(_^ z>7gPfLKD<`x}RC;-=U#|3YaA}Ptf>`3qc7*q^+hl3JvjVAOA9=5iCsG(IEbVW#T~r zkr`I)533=mex**1+a)TiY#*R(_cojbVllY@i`uleRFOU7uJpvu3~9T!01xCK!n>kDsv=tlY7PC<@Thz2AS`My%zIcn~a@dH`wsTLjfBTY-l(>>G0TAUeGnOO|r9ot%vqalZKU|H_9qpa*py@**Aay{* zDX{=7Rk=FaI=ODQxk^J767pZaKkAS$SQjU)d-;KCC7?lzc7OlX^;DVOZlN|)4?H*^ z^+m+VYJib+Z^u3~?lRQ8^%)Z@FlowtWZ@_xYaKogaAPS}!skExr6&RAe9}Wc9`y(0 zc8Dkf7|M-5aFMl5mHRfXQ8((yL8~bVlL?7@ICvzDb2!4tLPvV&-1ol^6f1&uK$v*k z84t;i0-2BP3WQj~c2502b!Xw@%nd~G7gz{GnVFfHnOW4ouY$H;nVFfH>6pW~IoKy# zyP8#8uCIEUC0~-u`KLFtaJD!O2KVkc`uLmueI2-{qK+C$C?W?J&i`gWiLKZ~=^dt) zbu?IC4VJ%o@`3N;v$`bx;}7An^`8J@1rZRFI3&>f`c?VNz2_cyg%1Nddn066xa;=%d1G)K4Gm-F()*7rON<9C$>eOee{~rP z7@)6ae`=|u5@58k{N@uM&JNWNLioa_UP?&xPyg3=NI+~MqVdovMq(lM{M0=sA9k^K zNCu&o6i}jy@F^<;Z|ZV^7!0Tm+EiDaqz`9)edB>I23ryiiHf|6Y5@-mfJj7iNJVfY z9YhRpb?afro?ALO<7A0Rkt*zj2Y)AAHPFPr?I(K1jX=$pKj6KUE;`f*LD({GfAQUW zkNv7USmPiaL|i$Q0z=|q2M`O0AP$H0kZF({?q7GtK4*IeWQc=NGd;=+qYB%%I6 zFerk-dnzNkMh{)3Fa!T_>uF)BaijV9cb`2y2S_-Q zum~&|HdBk}Fx!Y2(+y0JL`O2I8xJ|^l*-B3N}3pC2}(|dw5 z6NUCj2QexwuAS3xSq$ zjtLb#-Zfh3{k;6c8$bLq5C&vG#2`XqvGTAFi1=LD>C#7-Ze*f~pb}n$XzRq{>4)rn zNZ}CofJ{DqMJ`Pd9pNH~U&^F{#Q4^FIq8iSx-+XYpUiyKiNFwu#5-Fi7rvGBjwDPH z5Bq>vN;L)_VX`qm5@EtfY~j4xQTtc-&F|;#<iK%yFL3*Z6F4M0Ltb6|5>3Wg5`;Y#ocpmDsCGdb5dN1R2rK|S!Z~~(Pzh30#S}M zNYF13HWaRQMu%1g1;%b8HyRwwjsRhf6eK|5`;7zdg^D%m zbEMqB;iu$H#c=T*&rA$N{e?A1L9@reV$avxnMZ*5WK)okikV=`d$TnNwzi~!``sIy zSOP>jf|Ut=k@0g3VpKIa6e^s3%BR~d7KmlZ&Bz|Y{P}|7? z4q$T!907uFdCU^_F5nvMVw@YhO&TU-9077CBquPQneJtlh@j<}`{M`@BQcXQdRHJo zfZ4m_2oQf`FmZd%!$gdwp@DvYJcUW07?ZkJpC~UvBS8G!0l_2l1Thnj5J!N#Km}mY zz~JcWp%{kWB|u)U4xw=06x=74SEdmleLdIBDqaR)7yd@x}Stwt5(4Y@L#ItzY$ zC(o#YJk@*=vbZYCYtflA6y&iYkTLd zZQHhO+qP}n=CdxB*S3Avm{}xGJ-O#gCf^&Rlj@%O>#L;lsZoC))Pjm&{*+8bO!T04 z^QVx}1Vc)VSzCQ=YIS3^IIPo{DtUlJ;U z@rh3J)`)uAu;#sioOVXBD@u|x`j$xwq{=?YHeDOobAsJE!A0MCcnAl0Zp zJpbz1=LsL&|KOc>I($u3(MggFO;jmJ;N{S-bc(Fc+@w-$C2s{+Y0LnYquze@R>Ji= zH~)Bj^e;*2K{W|pNiZnoNa9NGv!i>}jjije&WhOb`Bde@_*d@yp>JGlm( zBp5Vu&`E_Ls~EgoszAf=hVIJX0{eOP^xC7peEyf_Z{Jm^9(rNu6kieyGC7P|_|^DJ zrMzv!+p?VCILddA&V6;J;dMG1{p4hgH;Edm zHIhg{kY4pEg^t2W zj~X9;=JS1(u9!+9bR0q9<)CV?|6Ggl^R2Rua#et!;@QogHnhI*{`3C|p-@f4mITF2 zEL06D$B6K$y<&&4{1B8VU)dyipP3nX428O=1U2Tvc$N z?wfHU%MKxh^24o_?f2e%s%fE6LBvr6#Ying4V@rw)hV!y6@`#Q`QY=ZrT?K9M5l?v zlAv&@h5dFvU$EwUZ%YVi5-z?pyY**85Jjw1!vsk!OdI}nE8mYZ8e9ocJqX^G4X*q+ zqm_?-dTovLdvXR8Dz&i0>uXixHn2EIHz*%}JgWQ^Eq*BCq#6{YEM?l2O^X^oH@qJ( zNMERrcCVhh))jZ0M03bU>BHVYWeT1={db9VlYSu z4|lYm{?ZeFsj8S9#fMA;L32HT?aQ&?xUUUJDB!8ktxk!*o_T2e8Iy0)2Dn3oDN7tz ztJFEqi-G|O%U!fno9jEjBhlA^f|Wa@hhLEo+Z8^Du^>qjjLh1p&!-zdq&nEG2)DiV zVA{ZM$7WpvZjhMcif%I^Vf9t=E!tc^a@+Or&+_g!S4WTizaLV9zPe+x|Mjomt0sz| z{esw_M@!%71K}M(k}N!ByO)0N;z!S&P=wpA2Lm=NV$)G?Ly#mJSK&65?p?U?3=qIx zMYt`erc@7{88hporzS{J1kYc$hWo+`2~-g~>Je_Y9?LV0I_Iefk`%*pSFNA%{GT7& zs|dI8&s-4L%$QMU-DN?NDtPvCwOwakNFX`{ToGo&pSfsy3<#faLh6wg+~p>m7!dwj zJSN|AfD~aiq!{+UYYX4XBc3WCNfVwbE047B0VCfm23Lwf|I~FZaqdg|y^TO(LAlzh zSN-P+&o*9<=rV{>|8!abOt|Pr2d$ zIe=G_6avK-#Ms*Mk2+;tY33u=-%Y>v`uLa~A#8DHSv{LhX@keK`gPZi4PcXO%e-ARc7`1>5hq>IFLAkCvL|?tIt%KCGkTW zM+#>g1ro=|IO<4Yx*uex9P46`HnC5b-CU3%xV;1c~FgvNZjE<6BAm zH&y7=Nh$*b*1?x!GDw6V$K(z^ek(KXkxB&oa+G7Z_ zCVun|&o&k$!jNrD?{JeC5^zCKo0=YgGl#e`gG3lynP(3HB#LOe=0uyz`b1_M2@;{m zGV)*S-L;Y=M-ayG|Chrv3q8lQBwiFVlO<+4KIgy{KaAvvOv%0XI#b|v)IyOiYNJHl!bF_BQcJJslLhBsAzTHEM zwumt1leDD!{?+~lp>?|J-@i&7CCVRS{^EYvwsuXlPY`R@)3cD|W%)fwJu>a)ejduMmd)^x$BP)(e9(KRtwD zXeQn&n+E}HziG5zFt*=BP&5ycFK`%}mjg_wUK`uIiy>^T8H}NC_WP%BA@omudw{S! zmZfGfUegHSZ_`wUSS+lUl z21xo%4a3lt=dFhu!MazTr;c6{(E`<606Y1F;YTn|J&6I7tLCbHGFW;<_z}e9VMxpV zO;2-YR`H)*9o~a0VYq#EHBY#gxnM|VAG8jx1haDwp%NDiDbJ>^J>0>U(BaI(x61(_A%I`I?xO9V7T-tn8AnjZw3C5QFjUBKRXl zTY!~FwWsZ!>8=r6>aJzcY$Q>pn&37r`fEb2C|j*?2Wq0Mj!f_#~>+0H|CwSEC~$cr`kVN>y_O2nLl1K8eA!j$|X% zT;(r&hehy7^bSKF)kdqigF_-X-h&jb=F*vp;FGW^l&R*{t=ls zyy_SLYOYw9eLI^FoDvLXo2eJ*v@9dIWrHG}meb>wCIq)+$^N52H5WwiY=WT4YHsFt zf=_AeN;R=l3=!XcyOqSUK#wxeZ?_0;{q_fYXTjq-mPFxie(cVIU_ms@%*@Qp%hcEf1yye zhSO4%Y&~j`Ixb>#)EFrY*9E7Y2*Wi-rNT&60FCM(o1S7?i?Z3N`&%!yzbZKGMCh-e zbp?o`084X<(@vC?d8=jYHWw5w&I*dtJ`~~H44|>+Ad2DB*#g07A418evsg4nfG8F{ zIv6esPWuqD<)Z@>i^fSY3Mh&K^yUPoeF(idFiL7IT@3Ut3Qj8nSE2m1F z_EEBO3aZLRC{k^LL1#}3iqkF>VfGXnCYiW%kkRX}r*lf2c2Sb^>uD4Ph&u-fe^Ys9 zd9Wrp?Lru=y|WxBsc7u`K@nf0g=;#ta;}@yeAH=TL#u4hl97ZBG&7Ad_>{6eE+p%-pX9Li2Hi zf`wmAn<4SL7%KIz?%Ot?p!qlj1NLk~#}_egIaK>Q_x$w=cLsxR5ezL z5%b#%lIz@eK2L4O40Z0?T#-=0I<~pth(-2&*^VUR31;7yh*1xSzs(gu!$RlQBguS@ z(p(%RCz-$X2#OGDDA5OH#-2t=X8zmekIQ^SHa|`0+q2pU|(a}bMEU1WQ*_)Uh;JRBio>6>i{Rrip%qjohX z!H!%6c7D)jNb_)p^x5$N7_}ta#KgU;J?v(L(euXrYezClnuSx6v3B&v{S&3CcNf<; z2a)l+pod@WlhZ7moIZzNK@qE04Ra8SX^~{|2VeJnXRdhzGarz37Owl={2&Y10yTD< z8y2d9Ou}TXIQ3eOoaW%<^f>j(T46#%#@daD-{yuloXEt!?)^CJ3=o=uBMeA8_kL^= zj2PuK_Mpt7X8A9pcRkuW`$~@?&B6WS+$%?Ws8LBm1#1Zq6B=e|M~U42X1dm(UdH`n z?Y1`&N~EG!K=co9n|B)`dbD@?r7pggX~_JP(=Q$EQQ6^!D%Ry7w%L`*`;BiW%bN(! z)*@_@F5mceRiV*E-6_Vni7_uZmmPbyONQcX9ZE)*W6zz-%=E*$M?hW6I&55yPxAK< z*3b1RaJG(uKI`ZH_C8Y4M-iJ~rr{vi@Icn{U+z!w)!o*v=Td&Te?3Qn5Mde)Vo`L` z!HfrIdhL$IpS@JwI&!)!{(S9@u{xMeMp39YK*A0N6C`63d+Whu*hg@tPf4F-_|}66 ziWp_Is$AU;0!norBIrw(&%Kf|KyjvvG9cyrt1n#+stz?u8R}lv*@z5VDf!!T8yCCe zIMYur8<+m^T&M=}|0W>yI|!8+Eh*8t!B@AY+NZ>sZhA@e>szmEqLh>sZK&NrEENZ_ zm5AJa;PU$kzPy|6a6RG52e<97s$m^u8Udo?r}dE1gbK*bk8CWa-px!2B`0NL@s>vr zFkw+z|1iqc8Xy*10Eu1Q9qfL8Ln=K=>c=VRk;?Zs>`#OBoCJ-8q3!@N>BXE%Wc*ah zoA#W4Ex~s))7iZwoPYhMJ(MV7l&Gr2GubH%_SVn*ev*$&n~^&p}v`j&ptX_diPJCh81AA zYmeUMM!11UDMn|#`hk_h9WPdEDo#89WbZ7a9LKRJeC?!}ahREznc?p;@6PTHGcz+Y zGea{oQ`JyWGjnkzu8y+7-}33( z-fJ5;wzEXAtwkd(ReQI(03=28{F5%%yGId)hQgK-9qgxY&l&~ZYgXDfW+0v&b=&AV;{OC3k{o0Dv7-Uua~YabB^v>rsw#WP zkR?P4i-#f09(uBZX@*pY1o@AUJP1LBvMgY$Y47#p7QJSmH03Sa)YibF*RCJ8#gy6* zM7JpxGCTzVA(P}nNRT0mMt}Zr^>;Cp)@KT|?t<0d{rN-s36lUrb0G97A#4vqcZYb8 z(9DSZ%Tt?Y76y?L9-C+Wh2ilE7!G5NfMqx(ukN^3NEthvNd zJM&++u1*si1kn(x9z47h3m~kovE@6tr4K`lnR4F1E{BPniUb>>QgM(*%-yd(?9UI> zX9*q-B-{NVA((=M4+zr`4ot9$NE6@8I?L*HvZLvUl;$*nS&t-QXq8J|``s(1uM{j> zt<;0T5v~Wx--*zm!|d$viX+wxJllx`8`jc_OA8EZ{{2@Cp(|W8xG*&M;fA6EL}9_l z^&o|ruxjv+dz~q|OXzJ7DIJ80!Dt$D)BSV!VJHZO3|Eej0mJq`#Fgj^@heul{f)fr9Tk4c?lJV)P&^%rHoJmenuIlViu8*|*CPHqhbS zi0}?!qZRAF{l`5O1|-FTPI46-!3na^0NHl4%D|D(RGpUJ&N+Hx|I_WLrz3iYowZ~T zM+}L~50C!sgQT*flI%BiXlP;PRNci52&pM9d{lyz@yqRL2OlE`+R&hPKpm0D=4LGh zT9$l#?UQ8?R6Q6Th1#_q0wCZEbqo>pzNBN7u?eG2>D>KjOB2vKn2tC|=WJJ0jZ~u0+QU+o} zDHzO}G7TwyK&a2i!=W(qT5EkXcToAB$2fg0NFNccUBV%dK>{tVcB~nD+YLi%GwSj4 zvx)?d!e>rH0VEg^4u>SqUn)(RQ#*0QiRgAzHexGC+F@WxA`Sz|?5dBhym$P1stqKx zPz4FbL)|+iARG~n3J4xjjV7F-KV&BEx2wLN1skA{v1+bY#+q0E`RIhT z{v!t*_TwUhR$z7%9u$xe5MezJ2}x+AC6SZ z(zkEE|FbI7QwY$!ME;MHdNds`V`60W{2_-XdmNhWY9b5415S}o zWs@*+VI>`3_Wqsseeh$<&OLl=HMG!6hJptLB=kT7XsjoRZ57ZOvm+`N3^}m5>po6z z6PEw^YVK9Uy5R7$WB0tO5h z4H(OozW?w8FHfAinQ8?O9(lka0iHK)Ux08lcwsn@p4RpQseEhT5zCCJTt;qrj+?v9|kO{$gu zFMT_|tbsgs3Wr1b`N6^QXs>`UL}c3@xizjN92~bLZ7Nhcz(!;pUWGBLI4B?uSMGIiyIgq;TTi?s6r|H z{0zDDHn)Zdc?VwY_1zx%6WW{%KCl0!N9}!NzoWVz678cyT^b_(rTRKGwt+tkN1c+U zBX&HsG*+{=dP4Q|X7bzo7J&qWL;(;0wu%M=gyPZu0SVq)Mgd`n=>98*MDzO~tu~+l zzux_%gLd7&?*ZNR>au%ufcit}ACljfIND9-ru6#Q%Gy;wtoUvtz`y{6>Z=xmgM}Ox zR>BW0;RC`D0oM^$>*QT{HNk^wh)xxX+yM6Na={+^?>=bv9{sxx=+ZyhGulhYfR>qh>0d66cO*8|FmNtx^=@a6hMvs z|2KCgDQz6w2z-0cQ&O}1d~hlC<0=km}M4B&iRWngN2lN|$u9Dxb>0h5hlV@de|MtYHiy#i7HZhA<-43UP}F+j|b zec@Q<$5+qq^QUgbC4UOMq9UeKD!CT348Z)Oqav zWO}-$@yo0lAj=#v6UY!ps~-ytT=FJ~P-J-RzjC25H)J?K`bfZ#X~g+RVQD8wp@{R2 z%tRi290R0}L^A$g2RxzwKs-0+T=i?Y4eI%KR(^N}~?Tq4=KqxNofW;MX3=okB z#k)8%k^Q%sI*pr7i2FNv$h^4MF5y`T|h@)B} z2q>(+U55NXhQ02%{? zRY>zHv4BG+&8s*D$eo!8BH!1`T!E~>JQ9rol3sTMNA(3_KO;$`2FSxhvDJI}Uzy2s z!5APuS7gyFF`3E}!WbZ340-FI86fklqL>eDp8nVNw%czD5(REwy~O_j0000?MMNg27c&(v<%1 z_W#=dG4Q__Kn{%C`X>wU_pd4%Q1#F-uyt?<@JNU#$Y`h-=s&P=vG55=a4^Z}@v5l^ zev(o!5S3HXvT%|UbF=YP*3vL>eEQ7FC_oLU;iqFR<|^gkWiQC95=_sEOBAYbNzEw? zmngA_aRVinTYU7u5`NG!E2| z6%LLt_tlCGO_Fw%j8;?ecmAI84e0gN!!F9wN?b`#$Hzv&$iz_I$sw7dw+0GIIb2>! zT+<8sY(6ykR2?hqI__M0v4#Bgz2Mkmdb?S~nCUMU(?@j%xAOe|9Ipuq-Ai+n`6y)) z^7pT1FIZ|Xw9+9xm?~w!(%R2|gV#O}y_PxJ?w56{t1t)9x!wD0oF7)%aA+kq$iZt` zmSKKk_!!=SZ|yC&6(eKOPfMY}O{!k74PPkJPxapZ5gjEfcxd?>@4UivMa!E>khtjn z{@&uZ`MH|L4tyY%SW!t1+J!?iWlXtlpF$~;^e1fF=9U?hKmH8e*Ne8uRL5w!_3+J< z;pO_!qluSuv~Uc7m>r-QDNsXE?*>r|{w7VIwCOfAlYZx?mjTT68}bR;{$! zrsbvgacT>tpP>6%E^M@<$Xr{oDP&lnxdA=CfGv{qq+Ct`8d+IcqZXEyFYJC0k;_;H z_4R$jisW23!nRit#EqncF9La>Aj()Wec=n&s_NpSU-=4UbC_*&RjC+E(bc~UT$J5{ z@+tRv9Z+%#KNTu-sj#`4(yGQHue*|mlc=Gz zqqs>eFqUfHWcMH&JOkf)MBnT8XBSd`R#F{~IMdoop&O;lw9Up&e9$)#yQ$+S=+_ef z0kAQC(zQV->8{Yf3p~5K1lBf;Cq9%XH-9&KthZ`F$*v)hR%mNu*0@-^?*m9MWwYYA zcwZ6Q=ss^1)8RF>HDiUs)r{(_A1Pt6WK>gn`I!xDWk$Ydpj>!)?j5yopOp*Pz9Czg z@zlzwu>7DeQRi1E7+vQNRZ_@Sl%c*)FAQG{Y0mDV4uLmYkZNwLb`pMG5|S@`*~DM- zb(lVdjYg^KvkgM1@Xj%9DsvCXTB8zMv5!cH3{Fb3z;@AFo0@7CHTK7m5pZ7JMS=_m z&;By2zNU}{%1EGCn|{~F_dwz(u`flZNu10RPfrWyL=m?G7w*G<)@9jd(5<=;B##G^ z+05TN6@0&Fl7fx>lu1nr7MJ2y$RQrLMujpbE!v#mhTtnVfqKsD%(SXGfTlAQkPpmXdoxD@>YaA)_U2a_m^ zIPX5QT9V+`eI#k~*mBX)j@jd65k2$Paq1cETqLi<|NCI`A~6!3?mAM7Pa5V&`8Wv( zfG=v6DP64=EF!oei-lZSs&VoLltN|`zfZh^vHXLnLW>uAX|_~C;wLed{rE2WvW7L%N5ct+n+#9HSJ8}U|DgkdRg z-y^c+3P<91PZV3pNt(sFYV@>2KR>fX6!q(?uS^#G!tK`tS==~Hi`1BiYiiI6#Hb0K z3EjpHa!_$ zUzQ75a+kGz6t|T3IlCo+j`LA&%pov+l#b(6)FH}+@eH4NAT{9>wqydqcBL3%m%Gg= zDyj`?w_edr?c6)3KM!}PbR;$9odvjZ%p83?PW#k&_5k>a{;R9B3rBsaosYtjwE0}I z&wK%pl^e4dD{V$LH;)h}>Bz1uurg*}_AuOU{@c85^yvXGR1Ck1Wmn<|KSaG^x0|9j zVR?gACY>^?oK7C2y+gm7xF}=OSie+7VJS(!lrowvF}X~k9V0y&a}u*ioiKo(<^^(H zY@1ro9kgdswTf2KzDxs0HCqz{T^(n@tULcgBe!O}SjVntPxsW!!Z~0P$D}iHO8Q^B zGwuTNeFO_ubm1@YCpUx6se#uOw0{IUt;xTV0Ug%94cPxgjWpmScveiKk0L%m_%~ot zl;r*(V`GKK=?p%eNOtN3S-BLhtl4RVhU4G;)%~}1Jt~cXtWLjwQP?FB5-Vd05YThDO`{ta zSF$U6f19|GgAZhkhr%aj<5a>V`6n2V_qP6l8|=ON1;#j+gB*yan9kD3C^M3q z@2btEIZrvp(xNKUPCI?M>4-PFwhs~L&P}l2$pAdayZsOJyYYR#AKCsOMOZDdCWvKZ zKlmU8Y5RL3>FWi~eCSXyF=m6kksk%nkud|sRS_jO3TJr!AVN@3kU0Q5;5gz>6xET7 zYx_R0PmC&NtaSEcIj!Xu{ef_|f0~w=qi|jtmv&h67i|Wd9 zE6dq#x3tl9E@pGNVK{2;D(m^EYj+AtPgf3eOl^ZERUb!h)XR&G05gJ!DMcnmYN}=_ zH=h7HO(F0O&iHEYaldW@|f==efn_aDj5*QmR6#Fv}u&T=8Fq z_F!r7BaY%(`5WkUO294byu%8?DR;HFC+~IJd*jf58lVAR`1|B$=#yTI?WlRS8sjhh zeOGUqA~7Qn+*@(8Vo@d_OS76lPs6)iAAPGDid436; z&^ALox4==J@H5=0#rrAW7nCp1<=X8=PTbj(B+8d<<2(k4r?5sx(*tZvUUf2Nyrgk2 zVV(Fh&}~Bq_oQmyuH8)@SVbl*e<@Nzfl2Q`>Id-Wgpg;FleXk0EY_^CQfuW2qRDI{ zlf6vL3q5Uz7G3*U6M&KyMIF}!3!YcJ80?>V9cfg&@H=ud<8>0N~-Q)L{axQ3s!G++nNylMTj(w53`6d%mQ zu56P1*gZ<{}NVsR+MygRalvPrYOj3=Ct$R zr7$KvI<|4TT)r0Ux#O$z`~CbD+zr3ga#(rFGd+SoJi%{QDxilJgG%uZ&*5=!4SV%M zTT%DgYgZW3($RD>rF^n{YC3ebiM>JAN_kOUcs)UR;q>)R zRA3b-dy)2jr{qddxJiEKEQ^Z4)$z~yrOp#<4X;Dk^TWyeB|~UvvG!uhxyj?Du}cU- zp7}Y1wo!vXaG+Z%Hhx1p;@5dWgL8ig1m%&xj;xnk*ONNudnKg0VOc&FLGWVD6;g-&X0E0gFY?&!Z&#S+i0P z8mBwZnRoneWBhiW)gm0SdKZS1M^@K_aByrTmsokuPL=Hsb&+IRziWRf!*~r-M z=IJje=={vaMWBXrd8v_YO7a@d$0u`w6}~xp!I>|XI@VOgo{6;4m=AWI8N5J7ywN+$ zqEG!7a&FR*1#mL9JDdhrC@y1VQm>j>59G3i4|pSMS*hr-wqAR`vZ)G(65OI5pop~* zVLVw_fLoP%ueBd z!g{TDygUWBHD*%$w6#tm)iT@)PahODzP-u3w{zgj4mKV%{)+Fs^vC%z;bW41wdzrr z!O0w=LyVL;V2H)F9KK}eYvSPf^XUcX>rT=IgU^*cV%t=PX@cW->OmmDaTD=ObB5R! z?v;k2oph@(*!Bq-B`;M(T}&{L`TO%ipw>TONNbY21cqYskvCBE!e~Axgv?ZbH887AxL=yG5V=%7jw_`Yr!|i3^w=d zoV&=L<6uX{tcRzH+iemJ$F8SkfIPgBFEc@mn8*R@b|Pnq=48T&?O z2-hFzEKdtc>Kt{bhL@e_R&E8oFE=PrV03QND=MTYHR$DGgF>~=4Q;$0ID_acBg9Hn zXZOVj2xjtN_Jh!u2{b1*#4HZe)-QiV+R;Z6$GEX>NdFjV&&yHv*rpdJ$#Smka(V#a zW09lUpi?N`qeDm~xHZS|e9)!PF?7^LAKuZh2rcyGEr&VBfhX6n91<;P&Gz>LQ2`R= z~V}D(g2zo}Jj*SG54u%+8rdkZsj7Gy0-&pDnu+tbM~t_F~i zUZOhDfO{2RtjJz#C}Sy_U1s9H45Fz!TYVj|*m!_UIq|KdCtPTDUb2wRyX@!X$Aqci zDVwsR*@X&$y*8wzB7Kib+al{qkB;H0)7QNjy2KGGHk_56eTPq8Uv5N_I3v(Fnt6K| zne$jb?f&BuegSn)>-f~kQ#C>XwO~zhG?9#unA1z@Np7Rl815L>&!xu|6I5H?O|(J- z4My-q&Q{;%Ot;k7yJ24q7KdiRWny@`?e{?1R@;q&7vAvVr}20GYq{a@bT>O79i#;H zqX|o4<*?3foU$j-HFLi@VrdZH9O7dtlg4VM3q0nNGU%lvpfLhuAPVKWoO9e%Yjyju zb|&S~7e>ZxiTBBE3Aj=F3&R+Hzod9Z?=$ME>O2=QrCyB$AtrFjm_%76e%k}UPsro& z75XhKjo^{Gw}`I03fmKAhy?GrZ?oP!P?`?Vk7+ad2eB*A8YAZZa!NPdmBM8wMgH+GWM6zG3;!m;%Gs{;rj+diM_( z7s=a2GF%;pwxgox@u=Tbid&pLqkB|7`JT}qE8kg%A(3Z(6(`^`;;Y2z>SNk8o$j-; zSy`y~JKb*T<9z+*7s7t9)?rLH>(TP~ihfJdu3#8mj2H-HYa!h=jebMJrhoC(G2Qzn z4?*3DkiTqT4I;;gkV*)rs%x}5B4pqB8sT^SfNpA9B_h1FR!w%U%$g*VfPXZk)}mU$ z^l^S9L-sdItgdy*xP?cBDAK_{pWN<8!`4R^867(epAso&DxtVJ->osav{jedh=I}_ z6}5*|eJXL+zU2)-S~MaG$6wwP-N|S=XesAY6lnp>WXGz0{Q%2K1{=_Oc3AplnX17} zZ$&2`ud62S^vbVwftZ0rU3X7asR$4MqnW9E1j!wm^b*zuYT~hH7r5l9MSCkBXgiO5gXh0V5mH^{6S!a(|81kKKqd! zt5bupQ^Z9<9&(eG=gzU~*;B;M9*s;{?HNIZiju{MN5Q|wH<8mZ64hLqNs}Qo$7M1Q z!LJI4udcI6vI|Me8E;G(Lsb1~Zk7K&a2cRzY}Dj%Ju#@bqIyY)CcUe&sp(v*r7bB@ zi^(vk^irOQr#pwW8aQZdd~dtOqhEEaZ$~e!<75D9)Kf7X)BU+v0%3MH*wxj;yN0up zn)ac#u_?-~KtQ83kN*noI>1!^k@Tw(s^H~XQ|TEsB(C7YtD%cioLX{rmpM$j#uGPc z^qX9iawn`tSk?}GpX%sCN(;4RKN|KqTw~Jp$@;gM^S0(WiKxhsSdHEo7W2Tj{uds3R8kI9Bd7 zE`dVD;Rr}eDWex7q0_#cc-Iy29dcc&cIOB}sgs>{YnbBbR3Rf2zZ=2Y+kgT7X(wNY z`83oTN)eg0v)~&z8#}8?W?iuVNj(2Ai;KSFb5aL-D1NR&M{dNR(9gC$cl7A!b=ShydLnXB^(p{Zho;vCv)xYO_0N18@MwM z*zAfui2T7g9ZH$6Vk8eF)B`el!^xT)KsWjtT^82RCJJ43h9*Pmdy~21Jy8NWnS*o) zC-}Y#iBYh_0CP0N8;h&r*uf&mT$jB#W>MJ@23rM@+u<4`GELra66Uf3NmhvdKM9{7@s^af&<@^)He!o34*=Y=9~wntB61UWvj zNFbiy5t9vpT&ad?$Q3)yO8gH5nAf>leUH%WrObP%>!(;|HkkqpMZw#Er}Q85a}pD% z34AI7V7%4!6lu+l8c5bfaZIxrQ^#`Oejq9tXd{Y(+0kg#)Wn2^ad?o{(jNa zy92O4Hr?(-6}9gyAWCk74@4E~a-G@&$%`4lrM**)Fr@p0SeqkzUFqEi;H#O?8f($O zKi)1}m{cCS^5T!;9fzw&aylBM(b0jHm%>lQBk8=|1OCdrC3PiVj zlNL@ML|sQ)gQ<)L9b(kmvh?v`Sj?}Yb=>^(MS|tu~lpwcfeG} zYFso)3%Z|<=m|=@ zAqJtA3fSP@KWsOo#r(Y&pV2+h;u&N@p>J#x=9(#(DXvOEqdN@a0O!Z`==&WGB>DI*#`Jd9fw~1B%KK z1FJbC+G=X`&yZk5fpBs*O^#4CK>d3MTkQt-fGz3J9c=p>OsE|5;rQ!bbv}V`Z#<5( zwGszh0t@vdOBeABp2md?-E|J|bHqb@d*&~{Xr)GOYYgyW6?mdms6bq@wu&_ljUOEs zFsG;y4efOnZZ^UBh>^W>>qRFm>iK(lfNc{p+t|b0z%bA1;JQ`Vo~=yg>FP8{&rbrp zy6#;U>e>&gq`wM+?5>rmeOomdcGfUex%bCk!*+`4^pQ3cl@3X=>Gl?wFe(Y*@8z`0 z=<}9yKp|xV9d1L`!Y{v6Jv$) zDXN6}!&~0p+rnG#_3f|RD& z>wmX}$tr#!vw0X7f5o(EqMj>g<%6SG3LP+xcdzC1A5~BB)D#-|pjw~Oaj7G0Z8Y`% zo!$4jo|JITslq(o(gMmQS1dGLuLeCyZZ>dwo7QyFA9eE&rRYFss3B1G99Z=`octt- z)>1($c>VRMz0+$71`?dESK_0taVPMd=BVM_{qM-oTnV8I^UO!Sas;{c;BV?-`Y-X_ zpWk4{6}>gm4epyJ34D%osW8q@=nvx|>4UMXQoaG8^~8F~Qu5e*xlc+80&uQ==7hRz zVNsIw_w#9G2SEd}`;a1=3x5AePMuEX8PPOj;5ZiJ*FV7_Ep374CvCEF2lYhe5~*xUH){NXyPuTqZ_tl+6kWgEmE+UNx+-}Y>nQy-%S z11>Qv8tN_&kmMA3fGqrC@xrBML{FftgSms(T)gU0D;->#S;AC1ZFQYs?D)^Imn}n?^0#QpK`J zl3+2OVi}lXKT$Z7zpuVGL`5z5xDsNdP_gXb0oqs5-4mG|S5%gL8^REvllrX_ysc^k zWEKbOEaDzx?RrQZkfBM&pK(e_@%M3Sn7nD&b904LdR88T=1zkkQ9lTunRY^{?@WAH z0L&b4gE!Mep7pqccaV`8mZiK6y&{uTTA*xGBawP`C@Ab>@X_^xH53H*@7M9lm~t!}{Vr%s;q-HcGNzW55u zC_gGhJ|*qFLMq-Xl3|%#*I}I13!bB^<*Sqo=p3UHk7Rx>h2t3@`k>9$$e`VEBNgsu zmCX|~8r_vKdMA&)z>X3_qO+NnT}QU47pxA-L$5FGA}1y&v9c6xE~6jgFjGf)h>vg6 znaGyxFQ`{`vws_qC*od}s6#xd?yZDSHAS{B>pL0xO6zqC1tcClsDoZg2{qcF-NHOB&o zc?Fy?9&)Av0ED+9-*>#~@o%bhzC5fOG+esF`of1)MfgZzn7k+Py)So0Vp%jB5$_7@!JRytc|U30JIBl%aW^C zEW23$y{_SH`Zq~$eSqb@xkvJVQQlqF+B-V-^bo`Na?=Xrl2pkI`Upt^(?LOJe}y}# zp?s)Gh#bJ8#arD_wsh^0Z~Y?-e*liiQ>dQdrt`LKUs%_w7y~mzeyM+km(P_Lo556d z)tNL&Df6c`#$v3qVnS3+w`C{&vNM8fZa zNAqg1NWF+bIJoz_i0*KUGjaqQHAYnRkw^BllXho%5L82|+P&ACEh1ab*Mep7dz)b4 zTQ)l<0}Ez;;7bdmL1O{CyA=7ORP5OjK{|)(9y#zaNf1!~$eL*%&Rv~3K!$WbZSw7( zk@%Zu8ND#RayLI}W98+>W{7S|*DEp;>8xyl2{UB2A8(H=L2rT@h!OPi^)^W(llDZL z{REWAfFLzRz1)Ziu4odZuN=Uo+p&kIIAq*L@}MSUgiE95qDRK;5W(KER=Oosd49)}_%O9@%?xudmiNMHiA)1dXtWd+;tLwpE$<&!Z zqqY&OvtZU-iJyPVOs4$fk%yY`5#7wSCd>6^!uzl-kq*w;abCqsF`A~(`hJ{#U{&M*8l9=0P>1akkPg$mBSSQ+69$ArH<(v?7MeJT&(o)wWdFp&h#U)fr? zEoZ@wkohd3R>A&ole4)_z_f4@bULKib$(aCD+4iR%2p2_?^|gD_QRwMdR9(57Ebvj z!RMm&=9tfyC(gJRD&V&6HHsfWr|VT8$g%*Wa-%PrJu|=#X7OU`%q8v3uHYb$|2(jO zJ8$s5V7=W){q8kf_TB|qlHNUrXyNh}H_;lYWk3~;gK#TEFyl0a@#DSO@nt_8JX8uM*lo14Tkt#5<|L z0;z%1bYL_shc3fD5^wWp6cgB#A&VD{ZEWgpT6(8T5p;sy7eGi01`q3D?vi@RoOQ27 z6`AA{3Jwtqf%+pX6nK?t6KVd1x#R|FC1ZE=F$TwgP!%C4)X~$`Yb?L-nUwp2q%U%=wG{K6^2Z$i=;mb%O|HhpBZ(y~Q6jVW^EJfh zXbAT)i|||F#Fm?mcZSDz=Jqqh?F-&aq8+{&hPz#qftK0fOL)!!cAUN>+IQ`ipFiEb zd`L!^sPsJ`TEpip?cEr?sortXGaxuCb4|7j26TIftEL81o4oDHeKA}*@p*A z6<4uhi!qi5+DRHCXqB*H@!ie!2Gr_HGL@Nd&*GxZs}WO}%>0f;`!zF^KQoP#=c*T{ zD(ySN;R-pP8~YmR$C;lTX1O_$+yBzKg{$ecR|q!w$(YnEeWHs+1nFpy4a`8c3yZl#BwwTy zgIRGBWO-FiYcMt|*)2%>C|7$q6$hZ4rnH%M*~1UZl{3DlEjmNc3DQl_f3|IunCw6Y zL(GKxAXA!w`lZy%2W|Ne<+>sJgCkC+9})nu3X@MQCj5qdI-ld}javBJd7%zj7>PW) zf!)l66Z8BN{RC*krcU1`bySGw@gJr66tlUpItFoA*KfZ}7}g`Vn3Rl?Q!Qg>naCKh zBlCVMQvr0kl*-kgQt6V|1ssb5B*ngoL3P}P`pU5-^lh(n~San6=|)B%*9eQ13z zTBsgll>i464{42%<3f5)_|^VM3|PUZ)R8;WzX7#;_4(TaG+M-m0qew85iTn46{J>= z*0$qfwAq|+0}GqtvfP8CI2!x2smWJ-2V$fjB-`w?KQe|`+Rr+$dPwSscJU8{YqhIP zxO-#OxO)8@&;WrHCf#As2e*jKh?(3j4{bDw6_(OeVz%?qL0}pvA@X_}z+I5H_?dW{ zo%EL#92HnMI|coI@Tm=Qq)W*qg(q@_+V*1VDS0kjxye&1soA8mtS@M{Yn*b$&avc< zAbw7I?ksQv-)c9R>+f~3>W;iINo*47{`3$^{q|J zoQJmtl=a@!Zp7T88;MQgT?tC$11}C2^CuCMA)k&)<5~2HzbPU-JU=d~n4Z)0cE?yn zc+*x!J9pQ1UQTlQ6_1^~6WX^k1{P&Ewj(P&ggoJ56_20PtJ?!QQ>Xlv?xND9Kfm>ccGf>XAPwPE3U7)iXqAt&v?4bgsho9-?_SF3&XsS1bu}MvVGza%$(Mf`_+}J5nAb}SvK#i5e&bQo% zc8#tOXhq7$lxR8f`fSF2ruD$DE;YMFRTL)iUI(7Rs=Ncv(z6Ws$1teC9SFyTtYRcp zt}7XE88?nr$?sD6kBgb*eNMMb85*w8^QI<5Qc2fpx3SkcNAe13H&7j{hE0d_>Fb-& zm>5L#`(1@zET)s0Y^vxZFG9j%3~el}ZiDaLD@)(MwVR7_QItv40rT{ahyzXiBhSCf z>EUA30aK#e`3Ih#X-x1T?Q@WTc#|Utpq{WmVaZ$d&efl>%RqQ$;`O41$-ynT@=D_v zmoF7HB3R_0=TvN?T>7Mwp;#nYaOYGn>_x>=Gw`(nvy7!Ip0HL@=?)@4i+eu_iXs#B zb@5^n1QLFiN=GH7IZ&g?%oP;P<~O-K1K}`Std+0g+~WMy1MJxD;#SeR!qucaoWQ%u zB_0I}T1V(P0`H}Eq?FFyJ*hm7T4-ND!)A!|GLZNYtlBvTpJP41m>{d$w@eW*0sr+W zjo0Dn>m$v7z#VOowgdR%l2u`u3FXvux%Di`6}j5%QBc27opyQznLydMv)=eN$xc0P z9bwKjIAcTkLyjG;)dSN^oD+UR$VzT;{xUM=&X;`au2@M92*!Fg;He*KFY2mT;p}t1 z-B29U(j&VFa)e$aw`re{>_gorBUL4Q@11^y9q(N5zhsxgc&1gC2uYHF(r zr=xPEN16-{Aq#!4$Rwm5&IXtQ^tRn0gt@e56_U06kOrW9e>6|}DUncpFPv)=L4rNE z|8_QD2wNs(mRe@D)V6+ix)3)Y)8h!-izQ$mMFu}zT9{8wbdks`)^8A*IRGkiP!A;^ z=ShUp_)|2U3hTN#ZJS7ILo>(YpiM(0z~OQ{ve-L}As57PKEtpwkoMWQ2e+OyQH-|) zK|pE6QI-g$d=IO{kk3x2jzO>-xaqTWC;y;p(tF2O!ti37t{CBrGjtYZ%p|AzJ#3cx zKsT>Hi--$)$h|c#X{TL|JXs{$5_CNO5?H(I_(c#`pk;5Iu)MN26#|;mXy7&p)(mwLEVxE5I11Viq$Og>(> zVr1NU@8(RxBgx9m8Get)11Od=a=ezQliq8pEBJ>?apqHOFgoE<#`9xGBYW=*_5fOA zMMeQ(Ol06N{cLt;@NNK^{mK&RZEXoo$wE*`KX)B(KdR%%-M^yWp4)>?D=Ar`Muu#M z1SO>gLN_JAH2aS>=E5AD5|~hns(((09(>!lOXR=N6XraETr2-=3@Tyoh>8Ht>3U{B z&~s{l!UU=+fED0&EW|y@-@ZqU$hIKcC`dyNOkIxDM~Kf_J`kYqVD*+UqaR|dZ>dNy z23atDn$K|@l!|Eh50}Ud0Ff`R{_57l=W4<)rhn!mf zJPsryB?cG7k2K$yL|V&ES%+Z%`e?+MO!6e3e+coEUpSKNmKgkgcnV6l(Wa7j;ds~C z78oL#)i6Q=@jtURv8x!O355Wv6B-)8qrv=^6$y6ui;d&Buxj_|v-j6N*hHEZR!bzz zA@+K&oc|9O?Bbfz6}?hq#ovve-oMnRg*9P2h*4I54L!gW$C~dUU(pRo4881ABInn0 zna0i%QP2LjWczq0GZ3XOpQlc!Bb|RUVe{B3{Nl?VM=OGnJ&>*A(_5%%gg&HQecaWgZUw@!Uv0piDG>i(1PhES1gk`V0`F z*$44^4tb&cAQDp#YhT`5+DJP9I8Q^!Nn~D1u4rz1{gl@$qP=2|+u>W_mHt(OfoVD6 z2Z&Miz!1%UW?J18lRe2r=A`Unt<6O*EoBmg$gPRi&FfiJ2e$kf%(x4esc>KYkfHY3 zCta|40I2UspnGTD6}|XfZwF%%CldB}{8S7>q_Qi`*NU*QSBYy8kb!JQ`D{K&wwx50 zWC)bU_N-{YJ|8yYo+Pi#po-6#1=$7NZDpCJ>>{-Gek9W(dPsGfI4)o38Uj6C`$RTb zYz;okTwr-eBH))qFh-S7CgopdT|dglll{hC_-7ZrpA$HOPmAK8EDWO$d#FV?{UuYxS`67@Y*y{iP8?MpT}$U16QOWZcqp(s8^H zSRxux=^eH3yYfRvrby;KBq8S#?ulPxc(HA;G=rXQ1haTu&7QH_;lId*JP|1{TY3Us zyRLUd=rDNaa$4|KOPKbl_SF8H)a#$p)~=b&T*`>2bwosy1jaTGN>O5O z6~SwkF405tPZ=TSSbGa{z3t8Z)$k-RaQJLYX_Rtr^cd3tr!2{=%Z7fDxCKchy0~Bq zjPB@IN=$gV$U>_~wwTbw5fxW0INJ<($R7nYFy+x>&348brPHWP!%q0bkLm-t@y1cP z8;3vh<={tKV__m_HCc(jjStSVNNo7Sq1zM79DGgxGEq;Un}~}xxqPhG(FqVnrEiHL zlHh2oR;$a|aBy6Mx%P4_s2-UbXQJZPR|o6O&vDf-QPDPvX$1Fak0sRgG6ISq5?Knd zVL+d$Xj36$k?%H1-B;)#agn>YB@&n+Pr|It<~7#_LO)U*r%^kOYe!QIP@@q>EGsuL0U_LT*BYz#IM;dMs&l*_loq1*dYSKaqG35WiX||nQNuo@=a#SB-`D%skn($VVZc0!MAiS1eZ$^_I6XD`ExzHHW1hb zUmGY4sE+nAY;I{E3IllyvT=-^s#=MGbh7>2@5;+6TwzgZQk)BIbm!+k(*y=1)5|Q9 zo7+%k_=I7_ctL?bl@;mxc01|o@B=u4Gh*NnEQxxvJ;jfzs6;82=NIr?F)Y8CbkZXz z`ns~E(-nM)QpQKrPm4HjZXEhdMQ~XOfiud_%&_Uv`{w^E#G3;d@s~zo=m94D5T?>H zV{*wMp$$__77}>ueZ;`Gn?##}Q#XJvPeV8LRKwc=GoLTr%M&nIAy8ruQc z@<8nV60XY0g#}FZ{RWJ0zQtO(8gnWj9i1}4^9g$a&!yCSU4ysmXo|$~&CDkaH2I{B z0UdpEYCF=d03WCH=B)1+a0ddjWiY&MRLh%C9ajwOW16!0y0-70gHtIb)#r+_EZl?iY zeiyk!Ap=NbAh172KQI4jNTynw&u(hz&taR_yYqdO%Q6Ac-@90+G=+N4%7?Zn(_8+{ zO#?0Ip%>9$t|Q}fLxS+70pE`IN18XSM{DIq4`0WyNW$#IRielv#Sb_5OQh=%|KTe| zQJ~wo-6T)Rdi53I-*)f6()Sx1_gAWz89|50^5l7ceII4MIc)7}wO|Ng*pi_s{6)G9 z@<${d;*aWsb68&F-6V7OpraSY#JV#wpZ*0cc)3GN@~L?(UbXp5n>5v+^9pRCo62rP z6XN364%2vz(RoQ#^lxuOdx-A%tg+ilV53`EQD8VuBP_fi3DRk*wezZfEVX*kTp1fY z#e>1_{t@CyroH>rfK2;hy$L-)gfS?HB<;~LZLO8B@|b&vf#Eq?zY*%QY(tAH(!^d- zm{`dzEx&#*p40xdb&gwYY$^thhN6!sb{Cue!G>{zmJO)P@=L*Owa?uUM59awb8^i9 zp<(0njg_=E-f-*&7v6r;xlf5~CVk0;UY6y!ec2|5qap6g{1;&3+J%vM1+=~HA0JTi z;OzP_rdbpXcONA4AVe;6hC=8sQd3}M4Rf?@S>iL?R=X1VE{w>|tq6-PQ!fig6XU5H z$zjJhCA?3Kz>w{mZLu5g6WG)NOOgdyAZJTo)nUL@Va^SK=>mQo5=?N+HZ_>~Y~6dv zH2tRMjqk25i3f8%F2;S2L5+9)42kJS*cb4UZHxR*%dr!Ack~*)KhdNFbDr`Rud+R?kn&tDP;u z5BmgJ`r$A`_4`Jn2ZN5hpKe<<(C(=4hZV_C-Ay&8&&S|Hh1OP576MJEi?HawEXWEH z(}7H~wIcvM;J>-HZC}Wqfi8+B^b@{@%3qP>( z0!RDor0K)SX?&?T!)Z2{BBaZ+^IfofZPEtg^mnJ8C!d@_!kpBa5|!ZZ2wwApYvBh`id0YmoD+#F3J5<^F7Ko%b=}?b3KDT$kjJGClmkhlSoS*8i%ZU$s z0RkY@s;?4a6D<9vFrf$sAA}{dT*B#F|7f{F$Fxb0k0AmN?iJr?ca^vO@mqQe82P;d z?_|_J5+xtZ(I7%JkSJdq8W6Kp?DoB~Rp76)4;$exLN@j&NeZJ8M%57Ck_q(Kp15|O zoid<;4z7d&_$l^#LxgB+fk3;uRO9X`FIQ5~DQ5OvBB^2COy?9sLMsC| zRpd+;|2fvj3&J+{4fd38C|Yl6-VyCkm`<#5O5yx%eB#S;9Jl$I8iEGnUHc>;+o zIovCJ7luRCc`_4WQ~cI;*d{Y{Ke3}z%~S`40AnsskAx_Y^mTllnIfq{oigl6ka$r# zIi`JPtcl^C2acF7z`8J}09QV-E-AJ+a+-3~OVGg5ebOF%qjI&W&I-NVS9xE0R2M^F z9F^X)TqeSFyAYSijjExQLtMBY|1$7jiIy8j7vS|Ts2R1cX+sQS>+q+q$MBM)ho#cN z2~vy6O#SRKu!zyd^HlI`aj@XYUyP8wM}=Z)qXsp1r}GWscDa~}YW@nf@>2lc|rV4%-ghVWzF={AO^zejCSTvDG!Q_HOR`JJ%|%S1kGk zh_}CD{e<5qX|w(=x%UE30Qow{286LEgpLKTVzy~vKUSs_(e-wZ#Boxt3{CBLW?VO%$GJD7DLq{Nbn_(5>6Kp&1zMeDF6WIR87m(?ruxdn?Bd zna=fIZ*>0-evHv1Y&)rDB{JGO!f(sSOW2rVi-Kk)gAQ_uL2PAC-Vf;QQ=?6J8u=cf z+Vc?EVfiN#VKAh@o|TG8-8zmMbA}W-TNVAet|+lav{ooX|JWr<&*mt6Cv@fE`lsn> zssHG-w1rnv)56{>i7!leI4u^3qZY(9VRzXof+WkJpLZzynf`TpzV63SY!2+S8w$#9 zLAlHT>&~`+;d;0CErBU48N(swVW_i85U|R`{q+L&yM%RFsVG|j2wS*Z#P`tl{OGxD zeY4zHuVj4itRXa0NNY})A4XT$5B8M<64oFXQKWA{Ysd1^5}>h*A-KCpJ*K3qDKYVN zj&@*xh9ct2`9;@iC9n1c!r6!S)$Hdl*j2usrua7inoraMnEKY?0-XYQOB2{KIwi*g zCyrg^Eh)@|yF_1ndnHsUs@53L^KM@pfVvl>E=rZ|oJfOui+VLxI;u@X|1TI0=kZj( ztixZHjb~bOjiBsFVf^FFxajoc$nco3h*-D*4sxIa9&(clu3?1SBTf(QLn<~REG9fM zDla8BDXX}!q(~^nU@xWO7t`bV_b&QdWFvc0mrbv_FjFT~msk#_j%jjIO3`Eb`b4>2Wc&gF<-W0G9k) zy;!inEcX!0f*8*xVJMPS<6Ktx2Kxs(Bg$;j+VS1J)o#<8#k~BYg6zVy_!n7ElTuUT z;-aJT(xYI9BqRXP7hK|vQ&V$ubK}_H0xvU@lE9SpA|6mL zvr7ufa`JinIrHX_$4IoSzf>j^*IO?cT@rZ)IVRKNV(R=}>;a5h5CQhv#Zn+vlEXWb zFjUFdVdiY^Mw#tSOfPLW_E|g5yIiC1J+^h(;MiOZpC`!ADJrWdD0z~d{j#vIu(UMI zm(tSG!a^WrKPf4wC@adz7x4Hsb7O;>>o$*Z%hfdntqoJZPO7e7YpNr?kZ?hZ8W+>; z_hJuV6uf91$NnN_t7K@Aal?#sMwHoSuTsA{eX_kV*`xS6^~JrsWo-BSm>tr}4$NZ% zVlkipoW~Oi1o{35ghC$gIlo3cH!x;CkZFf(KRoZ>&A8mHQyqIflPc4aZen*u^qDO# zwii<6Vrp5hEQ($f77tD=ffXa0hm)Ze9~oO_WSWg=95B=Mf3r7E?pPHa!{@DCZrAwM zsImRfb7r&64y|jo+Re>P8G?Vb+V%CJS)1+5)BfH#x;5@{cePFpckG?^O>Wo?{m@dP z6_UwSPPZ3w`{AWm6uc-L!03vF`Ngz#3{^620g+448b>r~?p3Y5hKR@wG#-f7;VG*{HIcPCn?`7St;uXf-=6 z@(lXLg?K4?(SAVjw_*pM8OmhbGQ(f zYTe&cC=`pA!R6k*)q2{q(>M9^BcQfThNTZJx;Cj^z2aDFVztl;=@%D?dQMQr&ac0C zQCR3{9moD6M$TjAdIq6hW|wBpH=W(JO&XD71#An_)i&L9%LmXIzL`whcDw!4Cl#Ad zpX_!RnZ6lLmipl|-?l1U*i|d*9U=|Es;Yz*X@&HQ3z;XkKPh<82m4#GREU)c<|Y_6 z^jjm$UK2D_T6gV8lSU)**4HbQYPBAA(uvj8He{X+xmsPFkV+TyyK1!(P+pPdbJIv~ zT_><4m|G3O(qgWgYT#8&_CtDJ^u@3%l6xMw6I}D{dQiyNI;$pV@>h~dXVshL&bsbi z$boK6BocYO4oAH|4u{t(60K>#)HG7t+YPBVRZdvR%QG?_RR>86`QwzIUqQ<&_+rJ` z75V(0KNy6*8S2c3_NW1D<*!~@B$bc@U2|t=9n#(1-OC0ScnPFtFu|!(Vu4ioYZTU_ zM1mC@E#%qxb39MM{X_a*^u>~i7@lZ8Z%t&7Afd5p&k|X;h72Nyl0z&Oi-ZI^BzTE8 z)Jx zom?h?^{|i9RUUPEpI6UGNew}KLEYeWUhr}UF$ywT{nInoJ>C|7y}*|y3k$FwQk{1^FHQ{W zJyj13GSe3C&+#&^O*@rfGLF+S#uu-LPUmGWi}a=evqkC7B+ugda_?-ZA!~=W_cdHV zj8_i~vI5$Ojzu)%@L%5K_0K$6%i5tezL1w&h+&Y?49#p2hv?NkUgUM?w4|n?9g-d5 z^yPxOk+XVWkdZB7Tf`x{K{sx9cn#N-$0RR2+(0|D$CrDE30n*lzz~hyBdF{@=B@Oa zKN;nP!!or)iZA==q04L$+ah)k5}EvDig$R8-GcJMw!zz>HNM$4XeDoB{K9y>WdgW3~bnBVN!G5N@9S^qySbinmqc)CGTR!zP1rNg3Y5Shi`BRkztfk`ygbPWl-|#qR>CU8I>J}dmJINU(d`t zKwem%psVAWa^pf?K122!U0_%_x}}tyF(}Ea$1VEoCr~ejQC#SSr7bWf6E0zf-VU$a zQ6`WTGh~hAjPynbYBI#cRf(6M28yuA`xKWQ8O>$TKe94QfHg)S&Wr_p8_GZFnnury z)u1gk5{joFxlml_g++hh+~r?f_AL7WPCqEjn9N#`SqzwgHx5s|S@VfH;jZ;-WKJvE z#>GYVLI0E+m%ovbGcuW(%;KRWFq04L>l^sU#~`D+pD!>JyyH~RLU9F1T!8C4YKA_> zC6LivW`-Hb4AP9Oku#&KL|5Iv*fZ+m!0PS3u;J~y)ciE3u_^XOL(Du?#d%G3kX^xG9zzn ztt$ngF=(2k7;Codp0w!K4{$-llH)6m&NdWK7Qq5(LCZiVovIYGULnw=BEJ&S~L-^kH^>r*?>*X3?IF9ab)9!-ZvYt2D`fVo;tj5vH_@cO(jfxxFI<6!gEED;W4rg{!39Lb~!qNGVixf{oCGMqel`%K@iq5%M-7dnVI4K zXHrIWHq?ljUYOf;0>GrhtZ1FQQ!T0z!g)CsVYn)I}@b9OdAzb+`GDyj)vb>>*PR&d>NX0=%wS`*D%8<}8jaueLzD0C|a2hvj; zZi@6+T#Hx}l%x_>ZPmbHT70)2pcOmgf1`$0p%rRrYhsg|;20cqvXfp*`$C$8sW{Ct zBPpoTu98)T^nVotjVx(nQMVb8zaKO;QDwttu=}>tR}9rfdcp z-!!WwHr#-doakgHy)2AS;#QTQkkYCWRcTdYF|EhbilNnNu>FG#H^E6xbh1M)4dCP}&1`lPoawArXCpHS%2K9! zMypUWo8e4H1~d?v$xxPhF{^O1ob_5Vk)d9hRLEW4t9Ob%q)rq?Q4~c{6h%=KMdyhB VpNaMiNxA?4002ovPDHLkV1f+!t8oAT diff --git a/res/drawable-xxxhdpi/portal_ring_rest.png b/res/drawable-xxxhdpi/portal_ring_rest.png deleted file mode 100644 index 2af67b8ee399f85b28eefed35620cc5ede31942d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4993 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 LNkvXXu0mjf2ZnC# diff --git a/res/layout/folder_icon.xml b/res/layout/folder_icon.xml index b8d5c608bc..9eb8c9a674 100644 --- a/res/layout/folder_icon.xml +++ b/res/layout/folder_icon.xml @@ -20,13 +20,6 @@ android:layout_height="match_parent" android:orientation="vertical" android:focusable="true" > - mFolderOuterRings = new ArrayList(); - private int[] mFolderLeaveBehindCell = {-1, -1}; + private ArrayList mFolderBackgrounds = new ArrayList(); + FolderIcon.PreviewBackground mFolderLeaveBehind = new FolderIcon.PreviewBackground(); + Paint mFolderBgPaint = new Paint(); private float mBackgroundAlpha; @@ -209,6 +209,9 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { mPreviousReorderDirection[0] = INVALID_DIRECTION; mPreviousReorderDirection[1] = INVALID_DIRECTION; + mFolderLeaveBehind.delegateCellX = -1; + mFolderLeaveBehind.delegateCellY = -1; + setAlwaysDrawnWithCacheEnabled(false); final Resources res = getResources(); mHotseatScale = (float) grid.hotseatIconSizePx / grid.iconSizePx; @@ -501,88 +504,62 @@ public class CellLayout extends ViewGroup implements BubbleTextShadowHandler { } } - int previewOffset = FolderRingAnimator.sPreviewSize; - - // The folder outer / inner ring image(s) - DeviceProfile grid = mLauncher.getDeviceProfile(); - for (int i = 0; i < mFolderOuterRings.size(); i++) { - FolderRingAnimator fra = mFolderOuterRings.get(i); - - Drawable d; - int width, height; - cellToPoint(fra.mCellX, fra.mCellY, mTempLocation); - View child = getChildAt(fra.mCellX, fra.mCellY); - - if (child != null) { - int centerX = mTempLocation[0] + mCellWidth / 2; - int centerY = mTempLocation[1] + previewOffset / 2 + - child.getPaddingTop() + grid.folderBackgroundOffset; - - // Draw outer ring, if it exists - if (FolderIcon.HAS_OUTER_RING) { - d = FolderRingAnimator.sSharedOuterRingDrawable; - width = (int) (fra.getOuterRingSize() * getChildrenScale()); - height = width; - canvas.save(); - canvas.translate(centerX - width / 2, centerY - height / 2); - d.setBounds(0, 0, width, height); - d.draw(canvas); - canvas.restore(); - } - - // Draw inner ring - d = FolderRingAnimator.sSharedInnerRingDrawable; - width = (int) (fra.getInnerRingSize() * getChildrenScale()); - height = width; - canvas.save(); - canvas.translate(centerX - width / 2, centerY - width / 2); - d.setBounds(0, 0, width, height); - d.draw(canvas); - canvas.restore(); - } + for (int i = 0; i < mFolderBackgrounds.size(); i++) { + FolderIcon.PreviewBackground bg = mFolderBackgrounds.get(i); + cellToPoint(bg.delegateCellX, bg.delegateCellY, mTempLocation); + canvas.save(); + canvas.translate(mTempLocation[0], mTempLocation[1]); + bg.drawBackground(canvas, mFolderBgPaint); + canvas.restore(); } - if (mFolderLeaveBehindCell[0] >= 0 && mFolderLeaveBehindCell[1] >= 0) { - Drawable d = FolderIcon.sSharedFolderLeaveBehind; - int width = d.getIntrinsicWidth(); - int height = d.getIntrinsicHeight(); - - cellToPoint(mFolderLeaveBehindCell[0], mFolderLeaveBehindCell[1], mTempLocation); - View child = getChildAt(mFolderLeaveBehindCell[0], mFolderLeaveBehindCell[1]); - if (child != null) { - int centerX = mTempLocation[0] + mCellWidth / 2; - int centerY = mTempLocation[1] + previewOffset / 2 + - child.getPaddingTop() + grid.folderBackgroundOffset; - - canvas.save(); - canvas.translate(centerX - width / 2, centerY - width / 2); - d.setBounds(0, 0, width, height); - d.draw(canvas); - canvas.restore(); - } + if (mFolderLeaveBehind.delegateCellX >= 0 && mFolderLeaveBehind.delegateCellY >= 0) { + cellToPoint(mFolderLeaveBehind.delegateCellX, + mFolderLeaveBehind.delegateCellY, mTempLocation); + canvas.save(); + canvas.translate(mTempLocation[0], mTempLocation[1]); + mFolderLeaveBehind.drawLeaveBehind(canvas, mFolderBgPaint); + canvas.restore(); } } - public void showFolderAccept(FolderRingAnimator fra) { - mFolderOuterRings.add(fra); + @Override + protected void dispatchDraw(Canvas canvas) { + super.dispatchDraw(canvas); + + for (int i = 0; i < mFolderBackgrounds.size(); i++) { + FolderIcon.PreviewBackground bg = mFolderBackgrounds.get(i); + cellToPoint(bg.delegateCellX, bg.delegateCellY, mTempLocation); + canvas.save(); + canvas.translate(mTempLocation[0], mTempLocation[1]); + bg.drawBackgroundStroke(canvas, mFolderBgPaint); + canvas.restore(); + } } - public void hideFolderAccept(FolderRingAnimator fra) { - if (mFolderOuterRings.contains(fra)) { - mFolderOuterRings.remove(fra); - } - invalidate(); + public void addFolderBackground(FolderIcon.PreviewBackground bg) { + mFolderBackgrounds.add(bg); + } + public void removeFolderBackground(FolderIcon.PreviewBackground bg) { + mFolderBackgrounds.remove(bg); } public void setFolderLeaveBehindCell(int x, int y) { - mFolderLeaveBehindCell[0] = x; - mFolderLeaveBehindCell[1] = y; + + DeviceProfile grid = mLauncher.getDeviceProfile(); + View child = getChildAt(x, y); + + mFolderLeaveBehind.setup(getResources().getDisplayMetrics(), grid, null, + child.getMeasuredWidth(), child.getPaddingTop()); + + mFolderLeaveBehind.delegateCellX = x; + mFolderLeaveBehind.delegateCellY = y; invalidate(); } public void clearFolderLeaveBehind() { - mFolderLeaveBehindCell[0] = -1; - mFolderLeaveBehindCell[1] = -1; + mFolderLeaveBehind.delegateCellX = -1; + mFolderLeaveBehind.delegateCellY = -1; invalidate(); } diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index b67e07b336..5bfa716eef 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -85,6 +85,7 @@ public class DeviceProfile { // Folder public int folderBackgroundOffset; public int folderIconSizePx; + public int folderIconPreviewPadding; public int folderCellWidthPx; public int folderCellHeightPx; @@ -262,6 +263,7 @@ public class DeviceProfile { folderCellHeightPx = cellHeightPx + edgeMarginPx; folderBackgroundOffset = -edgeMarginPx; folderIconSizePx = iconSizePx + 2 * -folderBackgroundOffset; + folderIconPreviewPadding = res.getDimensionPixelSize(R.dimen.folder_preview_padding); } /** diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index 70d9820819..2d52341a70 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -3029,13 +3029,17 @@ public class Launcher extends Activity // We remove and re-draw the FolderIcon in-case it has changed mDragLayer.removeView(mFolderIconImageView); copyFolderIconToImage(fi); + + if (cl != null) { + cl.clearFolderLeaveBehind(); + } + ObjectAnimator oa = LauncherAnimUtils.ofViewAlphaAndScale(mFolderIconImageView, 1, 1, 1); oa.setDuration(getResources().getInteger(R.integer.config_folderExpandDuration)); oa.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { if (cl != null) { - cl.clearFolderLeaveBehind(); // Remove the ImageView copy of the FolderIcon and make the original visible. mDragLayer.removeView(mFolderIconImageView); fi.setVisibility(View.VISIBLE); diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 7bfb7d58fb..0f8d834da0 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -59,7 +59,6 @@ import android.widget.TextView; import com.android.launcher3.folder.Folder; import com.android.launcher3.folder.FolderIcon; -import com.android.launcher3.folder.FolderIcon.FolderRingAnimator; import com.android.launcher3.Launcher.CustomContentCallbacks; import com.android.launcher3.Launcher.LauncherOverlay; import com.android.launcher3.UninstallDropTarget.UninstallSource; @@ -224,7 +223,7 @@ public class Workspace extends PagedView public static final int REORDER_TIMEOUT = 350; private final Alarm mFolderCreationAlarm = new Alarm(); private final Alarm mReorderAlarm = new Alarm(); - @Thunk FolderRingAnimator mDragFolderRingAnimator = null; + private FolderIcon.PreviewBackground mFolderCreateBg = new FolderIcon.PreviewBackground(); private FolderIcon mDragOverFolderIcon = null; private boolean mCreateUserFolderOnDrop = false; private boolean mAddToExistingFolderOnDrop = false; @@ -2493,6 +2492,10 @@ public class Workspace extends PagedView // If the dragView is null, we can't animate boolean animate = dragView != null; if (animate) { + // In order to keep everything continuous, we hand off the currently rendered + // folder background to the newly created icon. This preserves animation state. + fi.setFolderBackground(mFolderCreateBg); + mFolderCreateBg = new FolderIcon.PreviewBackground(); fi.performCreateAnimation(destInfo, v, sourceInfo, dragView, folderLocation, scale, postAnimationRunnable); } else { @@ -2855,10 +2858,7 @@ public class Workspace extends PagedView } private void cleanupFolderCreation() { - if (mDragFolderRingAnimator != null) { - mDragFolderRingAnimator.animateToNaturalState(); - mDragFolderRingAnimator = null; - } + mFolderCreateBg.animateToRest(); mFolderCreationAlarm.setOnAlarmListener(null); mFolderCreationAlarm.cancelAlarm(); } @@ -3166,18 +3166,16 @@ public class Workspace extends PagedView this.layout = layout; this.cellX = cellX; this.cellY = cellY; + + DeviceProfile grid = mLauncher.getDeviceProfile(); + BubbleTextView cell = (BubbleTextView) layout.getChildAt(cellX, cellY); + + mFolderCreateBg.setup(getResources().getDisplayMetrics(), grid, null, + cell.getMeasuredWidth(), cell.getPaddingTop()); } public void onAlarm(Alarm alarm) { - if (mDragFolderRingAnimator != null) { - // This shouldn't happen ever, but just in case, make sure we clean up the mess. - mDragFolderRingAnimator.animateToNaturalState(); - } - mDragFolderRingAnimator = new FolderRingAnimator(mLauncher, null); - mDragFolderRingAnimator.setCell(cellX, cellY); - mDragFolderRingAnimator.setCellLayout(layout); - mDragFolderRingAnimator.animateToAcceptState(); - layout.showFolderAccept(mDragFolderRingAnimator); + mFolderCreateBg.animateToAccept(layout, cellX, cellY); layout.clearDragOutlines(); setDragMode(DRAG_MODE_CREATE_FOLDER); } diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java index 285f2c1df8..2b3727a8aa 100644 --- a/src/com/android/launcher3/config/FeatureFlags.java +++ b/src/com/android/launcher3/config/FeatureFlags.java @@ -34,7 +34,7 @@ public final class FeatureFlags { // As opposed to the new spring-loaded workspace. public static boolean LAUNCHER3_LEGACY_WORKSPACE_DND = false; public static boolean LAUNCHER3_ICON_NORMALIZATION = true; - public static boolean LAUNCHER3_CLIPPED_FOLDER_ICON = false; + public static boolean LAUNCHER3_LEGACY_FOLDER_ICON = false; public static boolean LAUNCHER3_LEGACY_LOGGING = false; public static boolean LAUNCHER3_USE_SYSTEM_DRAG_DRIVER = false; } diff --git a/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java b/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java index 48988d7f23..68b756b244 100644 --- a/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java +++ b/src/com/android/launcher3/folder/ClippedFolderIconLayoutRule.java @@ -15,6 +15,7 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule final float MIN_SCALE = 0.48f; final float MAX_SCALE = 0.58f; final float MAX_RADIUS_DILATION = 0.15f; + final float ITEM_RADIUS_SCALE_FACTOR = 1.33f; private float[] mTmpPoint = new float[2]; @@ -22,27 +23,19 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule private float mRadius; private float mIconSize; private boolean mIsRtl; - private Path mClipPath = new Path(); @Override public void init(int availableSpace, int intrinsicIconSize, boolean rtl) { mAvailableSpace = availableSpace; - mRadius = 0.66f * availableSpace; + mRadius = ITEM_RADIUS_SCALE_FACTOR * availableSpace / 2f; mIconSize = intrinsicIconSize; mIsRtl = rtl; - - // We make the clip radius just slightly smaller than the background drawable - // TODO(adamcohen): this is hacky, needs cleanup (likely through programmatic drawing). - int clipRadius = (int) mAvailableSpace / 2 - 1; - - mClipPath.addCircle(mAvailableSpace / 2, mAvailableSpace / 2, clipRadius, Path.Direction.CW); } @Override public FolderIcon.PreviewItemDrawingParams computePreviewItemDrawingParams(int index, int curNumItems, FolderIcon.PreviewItemDrawingParams params) { - float totalScale = scaleForNumItems(curNumItems); float transX; float transY; @@ -55,7 +48,6 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule getPosition(index, curNumItems, mTmpPoint); transX = mTmpPoint[0]; transY = mTmpPoint[1]; - totalScale = scaleForNumItems(curNumItems); } if (params == null) { @@ -126,8 +118,8 @@ public class ClippedFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule } @Override - public Path getClipPath() { - return mClipPath; + public boolean clipToBackground() { + return true; } } diff --git a/src/com/android/launcher3/folder/FolderIcon.java b/src/com/android/launcher3/folder/FolderIcon.java index 7b71a36d12..62007f0720 100644 --- a/src/com/android/launcher3/folder/FolderIcon.java +++ b/src/com/android/launcher3/folder/FolderIcon.java @@ -21,16 +21,17 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.animation.ValueAnimator.AnimatorUpdateListener; import android.content.Context; -import android.content.res.Resources; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.Paint; import android.graphics.Path; import android.graphics.PorterDuff; import android.graphics.Rect; +import android.graphics.Region; import android.graphics.drawable.Drawable; -import android.os.Looper; import android.os.Parcelable; import android.util.AttributeSet; +import android.util.DisplayMetrics; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -39,7 +40,6 @@ import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.widget.FrameLayout; -import android.widget.ImageView; import android.widget.TextView; import com.android.launcher3.Alarm; @@ -77,15 +77,14 @@ import java.util.ArrayList; * An icon that can appear on in the workspace representing an {@link Folder}. */ public class FolderIcon extends FrameLayout implements FolderListener { - @Thunk - Launcher mLauncher; + @Thunk Launcher mLauncher; @Thunk Folder mFolder; private FolderInfo mInfo; @Thunk static boolean sStaticValuesDirty = true; - public static final int NUM_ITEMS_IN_PREVIEW = FeatureFlags.LAUNCHER3_CLIPPED_FOLDER_ICON ? - ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW : - StackFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; + public static final int NUM_ITEMS_IN_PREVIEW = FeatureFlags.LAUNCHER3_LEGACY_FOLDER_ICON ? + StackFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW : + ClippedFolderIconLayoutRule.MAX_NUM_ITEMS_IN_PREVIEW; private CheckLongPressHelper mLongPressHelper; private StylusEventHelper mStylusEventHelper; @@ -96,36 +95,19 @@ public class FolderIcon extends FrameLayout implements FolderListener { private static final int INITIAL_ITEM_ANIMATION_DURATION = 350; private static final int FINAL_ITEM_ANIMATION_DURATION = 200; - // The degree to which the inner ring grows when accepting drop - private static final float INNER_RING_GROWTH_FACTOR = 0.15f; - - // The degree to which the outer ring is scaled in its natural state - private static final float OUTER_RING_GROWTH_FACTOR = 0.3f; - - // Flag as to whether or not to draw an outer ring. Currently none is designed. - public static final boolean HAS_OUTER_RING = true; - // Flag whether the folder should open itself when an item is dragged over is enabled. public static final boolean SPRING_LOADING_ENABLED = true; // Delay when drag enters until the folder opens, in miliseconds. private static final int ON_OPEN_DELAY = 800; - public static Drawable sSharedFolderLeaveBehind = null; - - @Thunk ImageView mPreviewBackground; - @Thunk - BubbleTextView mFolderName; - - FolderRingAnimator mFolderRingAnimator = null; + @Thunk BubbleTextView mFolderName; // These variables are all associated with the drawing of the preview; they are stored // as member variables for shared usage and to avoid computation on each frame private int mIntrinsicIconSize; - private int mAvailableSpaceInPreview; - private int mPreviewOffsetX; - private int mPreviewOffsetY; private int mTotalWidth; + PreviewBackground mBackground = new PreviewBackground(); private PreviewLayoutRule mPreviewLayoutRule; @@ -138,6 +120,8 @@ public class FolderIcon extends FrameLayout implements FolderListener { private ArrayList mDrawingParams = new ArrayList(); private Drawable mReferenceDrawable = null; + Paint mBgPaint = new Paint(); + private Alarm mOpenAlarm = new Alarm(); @Thunk ItemInfo mDragInfo; @@ -155,17 +139,11 @@ public class FolderIcon extends FrameLayout implements FolderListener { private void init() { mLongPressHelper = new CheckLongPressHelper(this); mStylusEventHelper = new StylusEventHelper(new SimpleOnStylusPressListener(this), this); - mPreviewLayoutRule = FeatureFlags.LAUNCHER3_CLIPPED_FOLDER_ICON ? - new ClippedFolderIconLayoutRule() : - new StackFolderIconLayoutRule(); - setAccessibilityDelegate(LauncherAppState.getInstance().getAccessibilityDelegate()); - } + mPreviewLayoutRule = FeatureFlags.LAUNCHER3_LEGACY_FOLDER_ICON ? + new StackFolderIconLayoutRule() : + new ClippedFolderIconLayoutRule(); - public boolean isDropEnabled() { - final ViewGroup cellLayoutChildren = (ViewGroup) getParent(); - final ViewGroup cellLayout = (ViewGroup) cellLayoutChildren.getParent(); - final Workspace workspace = (Workspace) cellLayout.getParent(); - return !workspace.workspaceInModalState(); + setAccessibilityDelegate(LauncherAppState.getInstance().getAccessibilityDelegate()); } public static FolderIcon fromXml(int resId, Launcher launcher, ViewGroup group, @@ -179,8 +157,13 @@ public class FolderIcon extends FrameLayout implements FolderListener { } DeviceProfile grid = launcher.getDeviceProfile(); - FolderIcon icon = (FolderIcon) LayoutInflater.from(launcher).inflate(resId, group, false); + + // For performance and compatibility reasons we render the preview using a software layer. + // In particular, hardware path clipping has spotty ecosystem support and bad performance. + // Software rendering also allows us to use shadow layers. + icon.setLayerType(LAYER_TYPE_SOFTWARE, new Paint(Paint.FILTER_BITMAP_FLAG)); + icon.setClipToPadding(false); icon.mFolderName = (BubbleTextView) icon.findViewById(R.id.folder_icon_name); icon.mFolderName.setText(folderInfo.title); @@ -188,13 +171,6 @@ public class FolderIcon extends FrameLayout implements FolderListener { FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) icon.mFolderName.getLayoutParams(); lp.topMargin = grid.iconSizePx + grid.iconDrawablePaddingPx; - // Offset the preview background to center this view accordingly - icon.mPreviewBackground = (ImageView) icon.findViewById(R.id.preview_background); - lp = (FrameLayout.LayoutParams) icon.mPreviewBackground.getLayoutParams(); - lp.topMargin = grid.folderBackgroundOffset; - lp.width = grid.folderIconSizePx; - lp.height = grid.folderIconSizePx; - icon.setTag(folderInfo); icon.setOnClickListener(launcher); icon.mInfo = folderInfo; @@ -206,7 +182,6 @@ public class FolderIcon extends FrameLayout implements FolderListener { folder.bind(folderInfo); icon.setFolder(folder); - icon.mFolderRingAnimator = new FolderRingAnimator(launcher, icon); folderInfo.addListener(icon); icon.setOnFocusChangeListener(launcher.mFocusHandler); @@ -219,129 +194,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { return super.onSaveInstanceState(); } - public static class FolderRingAnimator { - public int mCellX; - public int mCellY; - @Thunk - CellLayout mCellLayout; - public float mOuterRingSize; - public float mInnerRingSize; - public FolderIcon mFolderIcon = null; - public static Drawable sSharedOuterRingDrawable = null; - public static Drawable sSharedInnerRingDrawable = null; - public static int sPreviewSize = -1; - public static int sPreviewPadding = -1; - private ValueAnimator mAcceptAnimator; - private ValueAnimator mNeutralAnimator; - - public FolderRingAnimator(Launcher launcher, FolderIcon folderIcon) { - mFolderIcon = folderIcon; - Resources res = launcher.getResources(); - - // We need to reload the static values when configuration changes in case they are - // different in another configuration - if (sStaticValuesDirty) { - if (Looper.myLooper() != Looper.getMainLooper()) { - throw new RuntimeException("FolderRingAnimator loading drawables on non-UI thread " - + Thread.currentThread()); - } - - DeviceProfile grid = launcher.getDeviceProfile(); - sPreviewSize = grid.folderIconSizePx; - sPreviewPadding = res.getDimensionPixelSize(R.dimen.folder_preview_padding); - sSharedOuterRingDrawable = res.getDrawable(R.drawable.portal_ring_outer); - sSharedInnerRingDrawable = res.getDrawable(R.drawable.portal_ring_inner_nolip); - sSharedFolderLeaveBehind = res.getDrawable(R.drawable.portal_ring_rest); - sStaticValuesDirty = false; - } - } - - public void animateToAcceptState() { - if (mNeutralAnimator != null) { - mNeutralAnimator.cancel(); - } - mAcceptAnimator = LauncherAnimUtils.ofFloat(mCellLayout, 0f, 1f); - mAcceptAnimator.setDuration(CONSUMPTION_ANIMATION_DURATION); - - final int previewSize = sPreviewSize; - mAcceptAnimator.addUpdateListener(new AnimatorUpdateListener() { - public void onAnimationUpdate(ValueAnimator animation) { - final float percent = animation.getAnimatedFraction(); - mOuterRingSize = (1 + percent * OUTER_RING_GROWTH_FACTOR) * previewSize; - mInnerRingSize = (1 + percent * INNER_RING_GROWTH_FACTOR) * previewSize; - if (mCellLayout != null) { - mCellLayout.invalidate(); - } - } - }); - mAcceptAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationStart(Animator animation) { - if (mFolderIcon != null) { - mFolderIcon.mPreviewBackground.setVisibility(INVISIBLE); - } - } - }); - mAcceptAnimator.start(); - } - - public void animateToNaturalState() { - if (mAcceptAnimator != null) { - mAcceptAnimator.cancel(); - } - mNeutralAnimator = LauncherAnimUtils.ofFloat(mCellLayout, 0f, 1f); - mNeutralAnimator.setDuration(CONSUMPTION_ANIMATION_DURATION); - - final int previewSize = sPreviewSize; - mNeutralAnimator.addUpdateListener(new AnimatorUpdateListener() { - public void onAnimationUpdate(ValueAnimator animation) { - final float percent = (Float) animation.getAnimatedValue(); - mOuterRingSize = (1 + (1 - percent) * OUTER_RING_GROWTH_FACTOR) * previewSize; - mInnerRingSize = (1 + (1 - percent) * INNER_RING_GROWTH_FACTOR) * previewSize; - if (mCellLayout != null) { - mCellLayout.invalidate(); - } - } - }); - mNeutralAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - if (mCellLayout != null) { - mCellLayout.hideFolderAccept(FolderRingAnimator.this); - } - if (mFolderIcon != null) { - mFolderIcon.mPreviewBackground.setVisibility(VISIBLE); - } - } - }); - mNeutralAnimator.start(); - } - - // Location is expressed in window coordinates - public void getCell(int[] loc) { - loc[0] = mCellX; - loc[1] = mCellY; - } - - // Location is expressed in window coordinates - public void setCell(int x, int y) { - mCellX = x; - mCellY = y; - } - - public void setCellLayout(CellLayout layout) { - mCellLayout = layout; - } - - public float getOuterRingSize() { - return mOuterRingSize; - } - - public float getInnerRingSize() { - return mInnerRingSize; - } - } public Folder getFolder() { return mFolder; @@ -375,11 +228,9 @@ public class FolderIcon extends FrameLayout implements FolderListener { public void onDragEnter(ItemInfo dragInfo) { if (mFolder.isDestroyed() || !willAcceptItem(dragInfo)) return; CellLayout.LayoutParams lp = (CellLayout.LayoutParams) getLayoutParams(); - CellLayout layout = (CellLayout) getParent().getParent(); - mFolderRingAnimator.setCell(lp.cellX, lp.cellY); - mFolderRingAnimator.setCellLayout(layout); - mFolderRingAnimator.animateToAcceptState(); - layout.showFolderAccept(mFolderRingAnimator); + CellLayout cl = (CellLayout) getParent().getParent(); + + mBackground.animateToAccept(cl, lp.cellX, lp.cellY); mOpenAlarm.setOnAlarmListener(mOnOpenListener); if (SPRING_LOADING_ENABLED && ((dragInfo instanceof AppInfo) || (dragInfo instanceof ShortcutInfo))) { @@ -445,7 +296,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { } public void onDragExit() { - mFolderRingAnimator.animateToNaturalState(); + mBackground.animateToRest(); mOpenAlarm.cancelAlarm(); } @@ -531,16 +382,11 @@ public class FolderIcon extends FrameLayout implements FolderListener { mIntrinsicIconSize = drawableSize; mTotalWidth = totalSize; - final int previewSize = FolderRingAnimator.sPreviewSize; - final int previewPadding = FolderRingAnimator.sPreviewPadding; - - mAvailableSpaceInPreview = (previewSize - 2 * previewPadding); - - mPreviewOffsetX = (mTotalWidth - mAvailableSpaceInPreview) / 2; - mPreviewOffsetY = previewPadding + grid.folderBackgroundOffset + getPaddingTop(); - - mPreviewLayoutRule.init(mAvailableSpaceInPreview, mIntrinsicIconSize, + mBackground.setup(getResources().getDisplayMetrics(), grid, this, mTotalWidth, + getPaddingTop()); + mPreviewLayoutRule.init(mBackground.previewSize, mIntrinsicIconSize, Utilities.isRtl(getResources())); + updateItemDrawingParams(false); } } @@ -586,8 +432,8 @@ public class FolderIcon extends FrameLayout implements FolderListener { mTmpParams = computePreviewItemDrawingParams(Math.min(mPreviewLayoutRule.numItems(), index), curNumItems, mTmpParams); - mTmpParams.transX += mPreviewOffsetX; - mTmpParams.transY += mPreviewOffsetY; + mTmpParams.transX += mBackground.basePreviewOffsetX; + mTmpParams.transY += mBackground.basePreviewOffsetY; float offsetX = mTmpParams.transX + (mTmpParams.scale * mIntrinsicIconSize) / 2; float offsetY = mTmpParams.transY + (mTmpParams.scale * mIntrinsicIconSize) / 2; @@ -610,7 +456,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { float iconSize = mLauncher.getDeviceProfile().iconSizePx; final float scale = iconSize / mReferenceDrawable.getIntrinsicWidth(); - final float trans = (mAvailableSpaceInPreview - iconSize) / 2; + final float trans = (mBackground.previewSize - iconSize) / 2; params.update(trans, trans, scale); return params; @@ -642,24 +488,284 @@ public class FolderIcon extends FrameLayout implements FolderListener { canvas.restore(); } + public static class PreviewBackground { + private float mScale = 1f; + private float mColorMultiplier = 1f; + private Path mClipPath = new Path(); + private int mStrokeWidth; + private View mInvalidateDeligate; + + public int previewSize; + private int basePreviewOffsetX; + private int basePreviewOffsetY; + + private CellLayout mDrawingDelegate; + public int delegateCellX; + public int delegateCellY; + + // Drawing / animation configurations + private static final float ACCEPT_SCALE_FACTOR = 1.25f; + private static final float ACCEPT_COLOR_MULTIPLIER = 1.5f; + + // Expressed on a scale from 0 to 255. + private static final int BG_OPACITY = 160; + private static final int MAX_BG_OPACITY = 225; + private static final int BG_INTENSITY = 245; + private static final int SHADOW_OPACITY = 80; + + ValueAnimator mScaleAnimator; + + public void setup(DisplayMetrics dm, DeviceProfile grid, View invalidateDeligate, + int availableSpace, int topPadding) { + mInvalidateDeligate = invalidateDeligate; + + final int previewSize = grid.folderIconSizePx; + final int previewPadding = grid.folderIconPreviewPadding; + + this.previewSize = (previewSize - 2 * previewPadding); + + basePreviewOffsetX = (availableSpace - this.previewSize) / 2; + basePreviewOffsetY = previewPadding + grid.folderBackgroundOffset + topPadding; + + mStrokeWidth = Utilities.pxFromDp(1, dm); + + invalidate(); + } + + int getRadius() { + return previewSize / 2; + } + + int getScaledRadius() { + return (int) (mScale * getRadius()); + } + + int getOffsetX() { + return basePreviewOffsetX - (getScaledRadius() - getRadius()); + } + + int getOffsetY() { + return basePreviewOffsetY - (getScaledRadius() - getRadius()); + } + + void invalidate() { + int radius = getScaledRadius(); + mClipPath.reset(); + mClipPath.addCircle(radius, radius, radius, Path.Direction.CW); + + if (mInvalidateDeligate != null) { + mInvalidateDeligate.invalidate(); + } + + if (mDrawingDelegate != null) { + mDrawingDelegate.invalidate(); + } + } + + void setInvalidateDeligate(View invalidateDeligate) { + mInvalidateDeligate = invalidateDeligate; + invalidate(); + } + + public void drawBackground(Canvas canvas, Paint paint) { + canvas.save(); + canvas.translate(getOffsetX(), getOffsetY()); + + paint.reset(); + paint.setStyle(Paint.Style.FILL); + paint.setXfermode(null); + paint.setAntiAlias(true); + + int alpha = (int) Math.min(MAX_BG_OPACITY, BG_OPACITY * mColorMultiplier); + paint.setColor(Color.argb(alpha, BG_INTENSITY, BG_INTENSITY, BG_INTENSITY)); + + float radius = getScaledRadius(); + + canvas.drawCircle(radius, radius, radius, paint); + canvas.clipPath(mClipPath, Region.Op.DIFFERENCE); + + paint.setStyle(Paint.Style.STROKE); + paint.setColor(Color.TRANSPARENT); + paint.setShadowLayer(mStrokeWidth, 0, mStrokeWidth, Color.argb(SHADOW_OPACITY, 0, 0, 0)); + canvas.drawCircle(radius, radius, radius, paint); + + canvas.restore(); + } + + public void drawBackgroundStroke(Canvas canvas, Paint paint) { + canvas.save(); + canvas.translate(getOffsetX(), getOffsetY()); + + paint.reset(); + paint.setAntiAlias(true); + paint.setColor(Color.argb(255, BG_INTENSITY, BG_INTENSITY, BG_INTENSITY)); + paint.setStyle(Paint.Style.STROKE); + paint.setStrokeWidth(mStrokeWidth); + + float radius = getScaledRadius(); + canvas.drawCircle(radius, radius, radius - 1, paint); + + canvas.restore(); + } + + public void drawLeaveBehind(Canvas canvas, Paint paint) { + float originalScale = mScale; + mScale = 0.5f; + + canvas.save(); + canvas.translate(getOffsetX(), getOffsetY()); + + paint.reset(); + paint.setAntiAlias(true); + paint.setColor(Color.argb(160, 245, 245, 245)); + + float radius = getScaledRadius(); + canvas.drawCircle(radius, radius, radius, paint); + + canvas.restore(); + mScale = originalScale; + } + + // It is the callers responsibility to save and restore the canvas. + private void clipCanvas(Canvas canvas) { + canvas.translate(getOffsetX(), getOffsetY()); + canvas.clipPath(mClipPath); + canvas.translate(-getOffsetX(), -getOffsetY()); + } + + private void delegateDrawing(CellLayout delegate, int cellX, int cellY) { + if (mDrawingDelegate != delegate) { + delegate.addFolderBackground(this); + } + + mDrawingDelegate = delegate; + delegateCellX = cellX; + delegateCellY = cellY; + + invalidate(); + } + + private void clearDrawingDelegate() { + if (mDrawingDelegate != null) { + mDrawingDelegate.removeFolderBackground(this); + } + + mDrawingDelegate = null; + invalidate(); + } + + private boolean drawingDelegated() { + return mDrawingDelegate != null; + } + + private void animateScale(float finalScale, float finalMultiplier, + final Runnable onStart, final Runnable onEnd) { + final float scale0 = mScale; + final float scale1 = finalScale; + + final float bgMultiplier0 = mColorMultiplier; + final float bgMultiplier1 = finalMultiplier; + + if (mScaleAnimator != null) { + mScaleAnimator.cancel(); + } + + mScaleAnimator = LauncherAnimUtils.ofFloat(null, 0f, 1.0f); + + mScaleAnimator.addUpdateListener(new AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + float prog = animation.getAnimatedFraction(); + mScale = prog * scale1 + (1 - prog) * scale0; + mColorMultiplier = prog * bgMultiplier1 + (1 - prog) * bgMultiplier0; + invalidate(); + } + }); + mScaleAnimator.addListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationStart(Animator animation) { + if (onStart != null) { + onStart.run(); + } + } + + @Override + public void onAnimationEnd(Animator animation) { + if (onEnd != null) { + onEnd.run(); + } + mScaleAnimator = null; + } + }); + + mScaleAnimator.setDuration(CONSUMPTION_ANIMATION_DURATION); + mScaleAnimator.start(); + } + + public void animateToAccept(final CellLayout cl, final int cellX, final int cellY) { + Runnable onStart = new Runnable() { + @Override + public void run() { + delegateDrawing(cl, cellX, cellY); + } + }; + animateScale(ACCEPT_SCALE_FACTOR, ACCEPT_COLOR_MULTIPLIER, onStart, null); + } + + public void animateToRest() { + // This can be called multiple times -- we need to make sure the drawing delegate + // is saved and restored at the beginning of the animation, since cancelling the + // existing animation can clear the delgate. + final CellLayout cl = mDrawingDelegate; + final int cellX = delegateCellX; + final int cellY = delegateCellY; + + Runnable onStart = new Runnable() { + @Override + public void run() { + delegateDrawing(cl, cellX, cellY); + } + }; + Runnable onEnd = new Runnable() { + @Override + public void run() { + clearDrawingDelegate(); + } + }; + animateScale(1f, 1f, onStart, onEnd); + } + } + + public void setFolderBackground(PreviewBackground bg) { + mBackground = bg; + mBackground.setInvalidateDeligate(this); + } + @Override protected void dispatchDraw(Canvas canvas) { super.dispatchDraw(canvas); - if (mFolder == null) return; - if (mFolder.getItemCount() == 0 && !mAnimating) return; - if (mReferenceDrawable != null) { computePreviewDrawingParams(mReferenceDrawable); } - canvas.save(); - canvas.translate(mPreviewOffsetX, mPreviewOffsetY); - Path clipPath = mPreviewLayoutRule.getClipPath(); - if (clipPath != null) { - canvas.clipPath(clipPath); + if (!mBackground.drawingDelegated()) { + mBackground.drawBackground(canvas, mBgPaint); } + if (mFolder == null) return; + if (mFolder.getItemCount() == 0 && !mAnimating) return; + + canvas.save(); + + + if (mPreviewLayoutRule.clipToBackground()) { + mBackground.clipCanvas(canvas); + } + + // The items are drawn in coordinates relative to the preview offset + canvas.translate(mBackground.basePreviewOffsetX, mBackground.basePreviewOffsetY); + // The first item should be drawn last (ie. on top of later items) for (int i = mDrawingParams.size() - 1; i >= 0; i--) { PreviewItemDrawingParams p = mDrawingParams.get(i); @@ -668,6 +774,10 @@ public class FolderIcon extends FrameLayout implements FolderListener { } } canvas.restore(); + + if (mPreviewLayoutRule.clipToBackground() && !mBackground.drawingDelegated()) { + mBackground.drawBackgroundStroke(canvas, mBgPaint); + } } private Drawable getTopDrawable(TextView v) { @@ -793,7 +903,7 @@ public class FolderIcon extends FrameLayout implements FolderListener { PreviewItemDrawingParams p = mDrawingParams.get(i); p.drawable = getTopDrawable((TextView) items.get(i)); - if (!animate || !FeatureFlags.LAUNCHER3_CLIPPED_FOLDER_ICON) { + if (!animate || FeatureFlags.LAUNCHER3_LEGACY_FOLDER_ICON) { computePreviewItemDrawingParams(i, nItemsInPreview, p); if (mReferenceDrawable == null) { mReferenceDrawable = p.drawable; @@ -884,6 +994,6 @@ public class FolderIcon extends FrameLayout implements FolderListener { public void init(int availableSpace, int intrinsicIconSize, boolean rtl); public int numItems(); - public Path getClipPath(); + public boolean clipToBackground(); } } diff --git a/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java b/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java index 0053072097..7fb02e3135 100644 --- a/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java +++ b/src/com/android/launcher3/folder/StackFolderIconLayoutRule.java @@ -85,7 +85,7 @@ public class StackFolderIconLayoutRule implements FolderIcon.PreviewLayoutRule { } @Override - public Path getClipPath() { - return null; + public boolean clipToBackground() { + return false; } }