From 5df2366e60fdf09e7a14ca7e055f92102518c241 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Fri, 10 Aug 2018 12:44:01 -0700 Subject: [PATCH 1/6] Bump SDK versions and update deps Signed-off-by: Alex Saveau --- build.gradle | 10 +++++----- gradle/wrapper/gradle-wrapper.jar | Bin 54731 -> 54413 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index 7a4cb42..ad34e20 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.2.0-beta05' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4' classpath 'com.dicedmelon.gradle:jacoco-android:0.1.3' } @@ -34,8 +34,8 @@ ext { bintrayOrg = 'easygoogle' - support_library_version = '27.1.1' + support_library_version = '28.0.0-rc01' - compileSdk = 27 - targetSdk = 27 -} \ No newline at end of file + compileSdk = 28 + targetSdk = 28 +} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 6b6ea3ab4ff4f69d55c5fd9c0a6ac70f47d41008..0d4a9516871afd710a9d84d89e31ba77745607bd 100644 GIT binary patch delta 23079 zcmZ6SV|ON87o=meW81cE+qP}qv2EM7la6iMwmQZD?t-D zpx-ysyaj-OfK(F&RUowE+<7+)i${yw*|%$ab=)7o5Td44Y&pFBPQi+mP_@6U}hAlpHM z^a2bnD_N^JndEeHVE{Hw+ze;ofhjK2IyU)H#8C(w?z^)IrQ|O{qUR!N=|d^i2veMj zQ_g56=4{k4QDP5En8!qt$JhgYj|S?r{9@ z1GF!5oW#fmCqLPY3HI#B{RJjJ%8-T0n=Y>2TaPR+{c0c5833Y;mACL98oRG#-hHxx z$Bx5hU7~hyC(VwUb}ENa9?NPHSw|{^SJ*j~tC=oC{;ZGqEc;S9U$G)%@3ZFo>sqz5U(v$Mc*sJx*_EV~ zav`6iIgUI(A3zwKVh&shFi7ogud2B;JyoFc48Mimo113x-i?MYPhZ9<05v1t+N=Lm zhF)~bU4wM%;S%%l7;};#Qaa(Z#A6yGgTKj=lr|J*G0{N{H${(DP=Lsdz_%{mXsPTx zMVx)HJ?s~56%%PKoYD4OyqC|?H?*!a$?7}|@Y!tCBN+>on8+(~+Qzjsjlb;k8U+(K9ew`O3(lTRvP|XfQqdlDkE>Z5I6RX{T>ih?OSB10PV#)p_Z#8Xw~h(s{La zx)lp&0f-y9bY6KEZx{Zf>H(}SJcnsLHCQ2{_2wlK%Nfsp@~iIAC4>G;`Hn8weMLvr zZ&`6Wp2=}^>s2P%tPaEOcz)}JCKT=$>%sL)>b*30d;QsH_SPlqdSp|xnR#&zhdSJS zv3HC^e790~XJ$Q+dn*roz6N86C0@#=0>kmF0N&CgkUaH>XH>YkwTBqlUrdaP)-(m| zJEZ6(>`88VBk?ga-s*#>xcvQc?!2KVZvU`+o43$7jC&dQzl#q=>+fuFiBOdE2B9I$8GT4#vSMHKtFw)=3omcx*(l+sLsEMm z4rSVd7lmo3$X*#66<)JOgS4)!>o?Tv-M%;8vDrH4m(sF!y*@#G<0m{W4 zN5=J;UlOJyL_r%vnAz5|e>twhMqnLM&7R1f?bPnL^w}orPG1c^g{in$j8Ma;Sy++X zsrBGbb3vLvy$zk?uj(6Nz|P8kxNE!j&oryn;?D}~kS$*gKwG>|b*H52xz?!>+`snb zYNDua9R%#K-n&HFZn{jUQ<*4R03xSW$c4d(2Q$9nJCT+;+1o8ZpLQ#GuXd$psX7;4 zSL)vSQ(vJ-hrjsOCzsuCZb)?V>-92r8DY{pOtERIudKqAqMq0Xs>IB(lGMn#;;e4a zn@h{KLIPWqYoItx{p$6;^+WvIuwL5_{zd4u?O*W7jdl9nLFX7ymU zV4Y9u=AM>M;>dBc?J~wtfZpRj?-2~q8ivjNV|Q*T(av-rxfLa1?%>(Rr(dr=YcAzc zoXKgJ?}z;4t7;Uwz^!91-gOKs#@wO_ph8TCJtR1hl>@vd+*P_ObWzuJmgy*C>!f5iGnlo(}QqC?sotZ==fcV5%E@r17U0w-t zetCL*QWOJH3 zBK=XKf7A#X9UeJ7BmVFPz@Cj5MeTbE_$*&8!|xkq*Z`|C6fn>UWc&1Ax@IiXFV~%QZh(XL=a?H z5Y67)J_)vYn8$-qsCqR>^Tv2byM^9Oghs6~slcfkwzbZ#HM_Mn`mUG%bMtKLWB2Nc z<~!fVf;{<{nDDPb-{(ww&OgAcM_>Hf&&#umC~H0drvQI8eUu`WIMyI52n4_iY$ZOS zz$RGAt9`(Pf9PQVr5G?axy@-c3fYlBA<4qjFUCtH*#2N@RYr*mH!qq;eN|4yyEDfE z!kcVCg$pyU%1_eY{4R@?Ng~%cXaR1C9*=OZOAoC`mp(biY&BV0i8+$0Tk6=Fe@4Y? zpiT=lud7da6#dns*(W2qT?%0Ka1S7VVis5%_wWL)-**A&Nt%N%@W>l%1=fbq&(I;0 z%Vqs1Tqs0Y^YZl0+$4S=9?Ee46zXrE6xa&P9iLsQg|Yw7H*pXL)jsid6o~Dy45;>C z2BsatvR2Vx2;;L;&fhk%O!%M{*!p0O(pM^ged2WysP)lOz#;k0-3mYrQsdN}Kja@5 z(clg2;aFa=d}1Ne$0M4Q3nKwqG8AKJT+BHOZPkU=M=QwFp^vSCPL9@wDi2OcWOLLb z!+woU=L51m<#T+7f1yW@uu*)ECOcfhK6=!pg|U((#W#Uk~6WNK)- zk}tKCg=}c;SXn1l==W|dcXhipcTMCC%L7OodGO^dk;^jeVR5dOo(4;Gn!ButjBEI) zQ!KjeH1oS5vdb>{4lJpyt`{|MlzQ25SCc1NwRM}#s@;p{9RY*zgl9TN!|*m_OQmG_ z1#1*G&d!Z894uZ}e~@#nY?G1KvQ--0ceX2xlz9`NY!+s+tj6!23)U`~_d74@az;27 zC`%ASZjTCt{dmodDxwZq?pPVdAt@lX{DbrF5D-C1hwO*aT=RS1#meeSe1JhQc$^bC)Mw z#IHdt#5mV*%+)J|a@Dfm(TjEbhtm2Zcj>l}Tr~#hGT_RK7#-sJn`Oe3sobLR71DQy zh9Q2i4<-<@ef8mpn1;0SmWQa88oaC5K%#++dlxDx=l~lVMDh%ikCrhW<+SrFt(fMC zMB{6Dm*+?oXLfp_mNs{xuWT|V)Icf{AZ1h}CE8|pAh8#@U1~V-wySc*#T;wuIDeoG zEq58e#j7|#xRYJ{bm}RF$`)=qrg4~LD_CYX0^cp&l8vsotSFCtx>*_!;dQ!=Dce(< zJkm*gxB(xRUC;NkC2!_V6OvX6Rq!AxkzD!#@U0E0i$!haut||ASgUrt@ryoP{~Agq zuCV~ifvBpmokK(#YW3z>E=Z(0;af8}D@PgQEc2)>n7K|f(wQHU7;xnm#z|CCJJ#pG z6|{|q-a9c^6D2@cg{(Q7=0=&*#$ZPX?9by6dVpw7E+#9nKU6fZqS^m0L$H=;r}Xz@ ziNgcsJ$N3S;*{31p(pC9mBp6}hj(OA#OV{T{Gevn%z_=f(7|5fMmaUJD(x`^Jf!-i zz-<07&12nsRmcn*YvU@F8A}Z6X8)^7v}HTwOfP6HFL8xMl_kw)+t5N4N<>dkf>a}k-18wqfQYl`rqEj34Onna((o;zz(`Y=a2JWAeLMa02V zbosbABdMrG+Sog%PYz($oHQ;RM@F51WC83JxSmdDOst*xnwZbFtjdde^1K$O)6EA6 ztKSDFzg?#rocZpW#N@)}L5NxopP^6C`LMKM738l|(A66dRU@w9ayI2h7qFmeY^ zmu9NH_+TMBX_4ut6t;Fc7m|otpIcf}XXxCyJ&@|l*3>4LQ}v6|)jrVt3Ko$sRR9;| z&n&4B=UA!y5^EK%XnM7a#m^bipYPU;{IxJD?0)j4ey+9B`Q^PZ2E~tOUiFioZ`z@+ zQ}I`-KOhG6kMO>Hac3wrY!-b;pGA`fhYTX2y70&|bT-yBN+pzEXsHgz^~6;!7{|lZ z5%W_pdnJ!EzR{EIk9O36*uQbhhX8#RN?*Z~t#^dfzXKjsz8HISGknwl71j=olh5-p zPH+eg2gwmSk}`{CwxyRRyHMfIP+?1ZCue)gr1|7R&q0{NuNGDk{KdmwP4mMBIZ5_v z7`76H-Go#qH^S)fXMEhnh28nD>#kkuWz68Owbr}-hRN3_P~!$jHU4oAW`LfvFwtU9 zvSA|B2!AdZwZJf9wJXK|_uip|DnD4YW4fL>mJttd_#ZqX4lHg~PD*ESrykB-h?uUr zNUPpLdb@Od>$QKLqSmQ$J#U|iA=zPJ?Qv!msm62_ zLA6NZ!fk1mkgO_l)g0P5i$!C}Nuf;Vux50`a+_}KEhR#fs#e$*WE5(E&iq@&WcG3)VEgAOZ>#*ohvk7;~gCMi1c+6mcuQ5X(dzTz5A3ACgDa$MF=y2rU8P0FUE<5$KLO5<0K`w=gMhoEt*0TX{v@Bnmt+ngah-p@=@ojZBk&Lz}UWB<*4$D#9!jX1FMhLna)=A zBLPr!ub}pm+3|Ds_1|Dd0>hXJ0ET@01c|vA@@un~G-D^@0PLO0M|S&D?S7_86D$y* z{s^8JJgrdwhB=5F@;VJl7-eH6dWu`M??2b~V*#zpPdm}U7*PqzVB?(dyrMdMQbIcc zaHRpdQWy7EKPg7h&h+yrGP?ECg~?W!M*ui zWmwj&D(bVnfb~bKi)iWEtJ)!Pc7!fRmT;|uAm5L-lC!bSe(GDDm}D%Yu$3o; zISIbe9yVRTAUwDC24@oLQb(d|Of8?7W8!#$$?7@~n$K|q%EWZ%W{E)rMjoL!$%x|B z>@4eA6kzAWj4Y?sHM}&B(tt6>|8+hfmE_ZDfM^B5P=%r!W)x@tj+QDx(mU3`ckPM$ z_j*|aKp0OCV)-do>^f{SNlBuWUpYz`gdWH;$NO%At{D?7@21U*ERl=umXf7<=-k`> zM5gGlnKsRKyk9-~h8*n7XcZQUf=$=}N&)$h?BYB%U*1P``)ZqLG`O$&F(NMh{fAfX zrFlAPX>cK83~$1Iqdj?2Mb!6nfWmXore*sVfRZc!qM2VOk~zyw_A$l6=>j6D+|Dat zXFc)rDmFXp%mc|v=1$^NG>>_l*gcvW9t0zNr?uu346 z<_=7_Tuib-DceO_F&Uo*ny%>BH7Nxk2rxD?Rrklt;-oROEqPhMBY>C;v&g#D!H4kz zm~x>4QFbh)yl~_ql%70Dny*|T{wY!+pQt3zm(xUCG{2=vXebxz<}5Iz=(K!~e6Rf+ zGRNG3)$Ay&6@G*G>%qh5`<|uzQxVz#0^fv@h%MLnl;RUEo|=qLP*!&e@ij}8u$(r^ z9{Oilo`iT~dkwcB%8kN2U6`pFv#aF_05zY)&3YF5_>;JUlDU2xsp{pfaQtZaJoStg z6TvD$B?!|;GxceCt<8FrHI-MwbRJXx0MYBGs+r7?56#9O6OZr#VQH+RHIFe}Pg#Fm zUc{gE3?k?6n~_sG-w2mNLuf-LS4=I*KbPhbJ48owCf$|T2NU^dg|#Ef5iA`5KwqG1 zsE72KI#>VTX3d7+L!7_SWXmpF!aILI$63D_ndNDOOjnX1upib0V)=wA$1UC81kT!2 z-&I)3;*;q)8e3rb$@(I8*xh06WzN`>SW5Sd?(x9;?I6y$qY6r5LBRiQD2g{<6`azt z`$nx&;+6Rl`zg5V^s(CYvnpuJ=0d!@`)P(h(TFWBDku~JvWWUonBv_YU@Wi55B z%|XWhMN|E#@SLZuw&LBCA$%!iO=|JkE`YUU@=LxY`%9V2cE#U?C@wr~xc2=F04l+h={^_Y zhH6GvPQo8VV6YUuF#15B?)sxkAT$?#C(SLo7nbb||3%4{1~JW&fn33sK2Y~Qld7@+8QTWQ{0h>N z4$7~ghzDYabUvdcmu+VVXxQ<=y?ShLfyXPO5WM5TRI{TQA5X@dSh;}uSL)`Cj*e6Z zpE_1iS5uTK-8G|bMV65dFZ4+S@aI>j7g5zWs@_OY zYYxn7a*2Be`}K0av*M9=PQ?xg#x3=as2|q80ipv>n@ii*cMm{6R9Vt}-~Ll?A?1%; zbf6EThJM0O@c{1U*YX8ai6*qC(n1`s{dx*IL7)ovVO}P8547Bc*Vh>=-S3URPA~GS zTfm62PbT>3=bj)BC~?+&<+{!X$q{fUw#WAU0P%h&)>R+aY$5nAAm5#u@}9%;`a`nU zD)&kJ^WWf<>pCehPzrQ37Es}WknnmBBxg^2&2Ca^S+WEDJDTXKz*xeM* zjhh~jo#Tetiv>)&EgJ(I%H*sV?FywV2?E>*Ld5U~3m+NPd4*w-YuO^!)FKwtMK9df zttqZO&}iELh(MhPlz;K(yO6)LfopVtOL%~iyMa?I_Omti(H?X-0@k7=eL~{~ing3u zeB<@O+v&4}_8_Of_FDq=i`NbYu)7j=3pfr2t{PwHym3t0H+u=z8~D=xT{876_HYC5 zekHDE8_)-NdPaS=G3dBb14Nf8=ce+rP~ZT~`m_9Cb|0G&GwnmQ2i^~Re1K+pwP6E71t z(2Q0A@|S#&eBcTgCN_ilEEX8f{dA5?wOr^*4K`0FlQ}+~BUcgRLGH65B-5K~hJ@70 zOLpm{dLg(WNJ`u}6?eS?$fL>89!X&IJ}4nV`d9>=`gs=EP3!WzJ};PYZ-wgNGKCBT z$iOdGg|Ke|c44UJ2zdRY8RaGl_HMzy=Lo_8;_3T_%tX0TY2WZbo}Ujph#RknJU_cb z*PpBiUEqZ~xF7Je|8%&+{ljhF;tQUA=0BjqcL)S8NIGr}1g{jvbAMr^0m7;Gjdlz0 z4P&@n8UC@~@9S)^tp1SgaYKaQN^V%Xom`=v0^9Tul@}CVZ3@b-9)K6r* zohfR$VR0ANzbwvqoSW~K*?$qg9lTxSxbfbuiHH2!QEvNc)cGZ7=HFpsZiL5t&RH+M zQhx;OPX9H;k>UwV$5gGktfwZaWW6<~d=(t$Z1}Hla5aBFw-;Klzu{UqyIJJX@MJ5v zpWSfXf~jY4&COt5%YTB67Vx6yd0m(CxkJo~47&X6jEX(89sUJv21u$>z_;8i0S|!# z0dXJz0g)#Yh2SNBJ0Jo)P}ER=$l)_tu{Qr$E;(bslt9}pYYS=%QMOw%NZQbdg;+6{ z1uw~F$aX|TyHc;rrGY$rjfbI>#I0aY(&-K zY-r8kr_S?NV?5>cvm}yGEcl6U3x5wvNU^aqE zPvPmZS)Q*uI-82npOU?mvYmoBeNDV-O|7_ARv-Tmn|Ld=$4g0;`5sW%&M2qD*|{3( z3wv%)+YqaTWY*QtTCL`+qlC=lSWj1{(VyNL54+Z*EPeudqj}))6t`L=iEJ6JrhoD* zQ0nG#$7F;R{2a@6$>y)|>8R7SUbPa#HHDfjRzsSp*pL!t`$k*QjgF?Q-$Sagph+qN z3?WvN(@B5@h^pK=U&>eAWFH=mQ+YgpRs09+wYnX8O-a(!>o9w?3=CgQ#W)_b6#KaaE1>?@D=#*7h^5+zan_WD|&7la4gVc|g)S5t~X9(+car*Z(0O=VEq z{@UGDRENrRxET-81*w8ny&UY=8aJA;L&}hnY z7sQ^P!Q|ngRly;hf{W_KILp)0vBU=Cualfq2Iv6SY7G)_pvEU{L9b2{qmVHC!zn@W zjvB%mCQPQjHTx*OlZz__6#tkK|f*9K_Cd=A>2e9x_X9v}fIi8UKoJZDeq`sq^xBJbYQDQNGnl zMqC1JVaIvbQg>gO$%Cp@IoKx4+0k9(w@atiQ~&-WY2L#tBbEv;Gn|gI|4V{vcG} zsD;rA^Dj^b&vWbdP>GvSIa*?>gUbVIEixV9cC5yKzK@nJ43O}3Lk9^MUw_}Ph!!>z zPC6i!;&>wSMJc=&g6)obVT+Gl!&bo*c;`^8@-W46{)W9Qv5e$mFv| z8wd%@TZoe5d%i|-O@X?~^Cy|01>abQGhIJegF6P0j_M`w)C9Y{P;qNM&q|rsUm;RrJ^01Q!CD!S z{mITZj5cwn@U}F^C((j!Pt}5eMKP1&)=JXXcVlqj7OiVFh3`HnMm?d*ArDOOtkNZ3 z<3cIA-ttG38hrJS*DSMnHF>5pg#b?s*YChr2M&QkA(f8+%Wu}VHj&c+d$m{Q4HLL!@YNtpRe|H$DY`EL4}B*0s)BJ}u9d}jLNikN2IBH1IB3hq zR`nXt$f2+2T$*vxJSNcDpXL~u@RY`KayoW>L;e#uMfd2O?u*m}=~Tca>H%~JLsZ8e zn(<(N(nmIvFI^pY3NrR~7I`juSk_6fd@z`f0z zTqTWTO3DjRl7wsq3R-{+fmP`fvr8BFAHA}a}ctG<7+5<&_ zr;dEckBmPQ!92T0r$z4yO?W$-&dKE3%goHpz~C4+A5hq4{N{6YeF4O^~SoVd7V<>M$c%|1oN<1lY1Bebp0RrR4J1 zS~@WU1)Hv}k_@sH*`$9VWj3p%L$-gr-~XbwdG-#{b2SX^=d!P=g|X9*U)$DJp1PRT zN+!j%Bx*#_L{&ccX`P?kGP{=PYgKU-XOhvhH>-!4-p^fiS<7RjDoc@7D`^mjP#h=% za{9gurcjhs@SsJa3(sgrTAH@f%+HC-ur~2_JEKz2je4&Y94H-7J1fq?xhyiX^d;40 zAh!AH2gwO|qqO!Ts|Sl2EY@F+RmChfnrc?tJ#3SR^B4n+o`m^(d_1AMIYZi=`bgiH zhmoqzaD!7=+^2iEiyxw()i>ZCpWhY$finJJ^Yn+61S}b7OlM=fc}&k8X2C|=D~T8% zW%k#X6e)tQR@4G@2izXEiT|Ovpiq_l;BqQsx78FCmSwqAom=%V2Cc9}msT}CCN7RL zcQh3~{3WZX!sb`#)NUWN6v3Gn|<#`OTSyU6EyiINu73QfXqqwc#;mc z`+|(U<1K;{2soYul*a+IW6Docv=&TkKI%=z#$E=_yAitzFg<=?G$x@2r@4y}kM*n= zQfo7IGZTbU=sBucL8`v)4r!;o*+FxuQp3SfPknVlLgZ$k{!J10LZ>j6QU@l$od(&ZQNBmwHHx`68GJ2!hcdl zQ3L`ACOz#nB+PVRMp-ZT&bD0uXE{D|c7UIc7f?ZD8EjQqYe|!;bW**MmM~Itwu}rF zB~_-mgvyS8-2Yv_=xD+oUMz3F`?d|pRebqSYMNNMed z_u@muE4`;Y5;4HNNOL@aU~iyY4oM+E`mh6881w z$k*5>=Fg&_gh$xI0?W2zq?7qq01YdF+eGTV$ac1!zxEk`Q8b&nHx;?ldbl*66?6gy zY^f192*w)xql}}8kpi@oUaog)<`_H+=-{^7TW_?hLOLCjju{Je^h_}bt@o}(F$PvN zSh(oMXZQ#0jyuutC7cU(GLvmpCz@!nZSxE+B}8V~eA7>?Q-xhT*We=$K&nyEjc9kS z2GMN%fk?UjFCsjO-3UOgosNFTP`{Rc{fSTibhd8gghWw1urI@E{DmNePfQsRb;H8+ zg5(C-3MLjS7f)~@mO=75xvC(4_giv)^6cCwdww0=*%ZgVizHq}kWh-Y_>477_#7m5 zQAWzwwoy4D{a!4jumuwapfw8?gPeni6>kMDCUMJ?lpXei1)XU$S5DF|4MfYTr_-+s zm9hw)gqp-~=p3Ps@Sn}CyhWw>ORgNlZ3$& zd_(-NTvf{0FD^lWfP7(-1!E|Z@#k=o{r&y`EK7t48A5=lr4(V8+y6w`rLb4naTv*I zBk-?2|MFh?6oS%T;ZFoE?2%!{ii1-$A@0pIWiKkQJ06{_7z z6Rd*m4l8G$A*R!qJ*{@j#M-LsPvS>!R#l}qn_3IqPQ_^#9n0==w=W9hUu(5cSG}L} ztxSYGQD?|o5INY-vPyr@cD#63Nj1w6PTFi;*|_3yps=w!($pTU@?6&^zHAhLoHpwd z+=BlL)3{i(l^Ug-C_mn z;wu(&Ug9lwJp5DT0tuD^UQ5Y7Ejd`V1Lh$lq-JB)Oqcn(M!s6hYPrCcGnQ4USd(~1 zM7B#}<;3VRt%xIo0PKl`_Q)yVO+7HGDMHhz4)RN&83h)$aVsa zf||^h!g)dHd$ECIm&Wdex8-36Vc5UED8;|&(&{v5wF?pSGYco$=STc=9gSIS`Z7Dp z`4NYmbAq8YRU2?;+*VzgkKPXDR`EjOj2YMA1L%+!SnK7th`p*_kfr5-X7Sf*t9v)dY=J>-k%8Uu2@>s6R-xjZ9^oxS zSJG_Z2#$28uJ$kof&Og*=u4D&2izGOkUz2dFfe6%z+Mj!;mk^zE)+`io*D^|H$!!! zmRONUdLDf-hDzt1F3{vtz9tS~!8{lrKk0?Z8cDdwd&T=+d*ohOITvP-R%l1H5KwHf zpxvRl+(UPxs}a7%(lxXD!l-0X?3l6&6A^)JiNe6}{Bn+^jM0?=NTga_ZXF=ClFKd< zbZzCU1&%|fxr|I0iwHwZ3YRPvE&JzW;?bOUzVWbe@zIlWh%PYn2BMrNF!5=c^jL;2+R{rWf9svI{ka-0BuLt~XgRbKHFS1s_fPlpR>(Mwk zCr1Q|1Gem!1d;fzbhjbG!&=}KRkfuHI+Zy5geaB3M1`YJft9QJ9Fk%;CL3wCD&Nq4 zh!}cMBO!-b03jW-o9ak%gp!n#v)6CanOsK?<#%@iKov)npm-y2>dT3Pd~VxojrD_M zcxZTPcx+*=D%{MLOr+8$C}E~scranDb*{rtfQb%<9+Ta6s-(LvQ2TsGg(@FhS%~_Q zxrU|FzH`n#M_;UQmjzhf3r#x@-%&pN4*cK+C)|TpyW7v8KY8wYbIf${h;~K@wpM@K zr*jLdK9YR;?xSQVao|1(dz5fKOK+(J&dO%+reYFe-z7UmxNfxw^~&p>r-9Am<0Ur~ z0deARH7=3gV!x_zL8HDU+Y1i?z(oF)UEU(_IzE2mieDJ4L)Hq~2#Dm;4o?d3av)aO zf5Vn@*4BxuWan}{K_6tRG&D14JPMNFOdUu1fn`C%8L^zxE8%MXYXiqVKK%Ag@2!&v z!Qn)sGF{W$qFmE7G?^v zrPA1eDkpg?9VQkMN?B@yu374m97KU?h!9(8SO+=1M9)b#d|TZEMQuLemA6z*D9TyN zdW0JoB%ABU8ypzd;}cr{n2pvQ;evR)4K!*7cczlK=bkFXIC3keYFXjJ-( zR*C<@mXrgmcyUt4163WyNaM$?8?DM_e zt84+L3qorr!de<|Et{3y45FdF<%vjH0TE$1rR|) z3wV>B1Ji~f2gK;-@m+^&fx)t~kbzbR5-@y{T|*i2<3AiN09oH_0>vLe?|Lx@=y^tA z<-Z(Zm0i;hHhac}pON+SZ!tW+$cTAjb(8fB7S&68$_-wDG%eWJgzZ{oXW^&clPj^u z6wf!wt*JG$6>6qgLoc`EnD_A81E?EAvb;PiQ=L(It7s`8~%r|q}N3j>tJ(bkt(Kct~mYOTNR{8-&00zwo>^^ z`K@dsKip@UtQ^G4(bv#;tdb6!q_(Pe+=Lg7{_S>VYvu0LYMH@f2y|Wn16=A?U1#jk zISn$i{j!wCV}0!l$|22H%z+K6kx5$UP0}QrEV8ZbmD|W7{@8L9NgFpCTlc&~@QceB z?t1T>uj$p3i@KQELpDYKX#*BS8E4fRW%Q*w(hDt)L8ro%De9DR>sbQLX0?<_7x+91r^+KmAQ8_BB6DrW4Wbn{4Y}u};+6J>!k2iFy zxddy3IoG3XE;EyCFcaUIMTGQ%AiaJ5CggQ?;^d;v;#lq%CWe#ar#&{rgxkF1X9Qux zXqG3k7GKg~m%sPG<#8iq#h7nXny}gLZ|H!yj0$fUXH6pXS$Nvy17fZkl*QRD%~%VR z#8J{FHN()DHy4N${fzRJGh5sVtGo{kF74LHEd`GCR|=z?tBFxrRB1|Z+{e}Nl|`cP zrOkZtcH&L2{u*t$vq|Um#(rP#7Q}#ZQZ{snAy)GBzQna?Rv0u2_m(Y`k1T7R3k|`E zF&K8q4-#R8JBf;e0j|t&#lmAe=7|pU0#CSz?&fKunk9=>Nsoxk#lgw zG>z+|7b#fQa6*?Dbdezo`Sw`L3S=|dQ*NFM!;W)Q4Q?=orY~!iAetqj#Z_jhZ1gq- zI<0P#ZHs)|0NA8t#MA}M^Aquc(ykppt$?{5KW6UNP;b&+V_G|k4P9n7VCOjFwhbRQ z2%2iqn-EZ+L}pOY6LA>_LrZ8 ziF6$~l8tV$Bhp;H0n_qH5Ecp~$zfHWn7(JHDF*as0P1EoauI=m(T9^-1R)1^7I^0x zmw~m%Y&v(|Q>ndVebSXxUbx!G$hI)v1n+G{iwjEa3sF9$pj?MHl$Q}x(APcITbH;Z zW5}T63{r{X4bs`rI; zauN{$U-`sJk0bQ(x-yiJyNO_Kztq#_sI#?OCeqmkdln{%P0+@H2EUVq+p1|GH2+I5$y9m z5m{#O@Gycg?DmJ~q0~g)9nI?$?5`d#iCmnLBC9S*e%U`%=G^D_iO;3S#FS)X6yOQM z-vL2{BIBHJdh1dxrR;&LCCz5Dl~Ve#%@FJhtKv zK-Ns!{4sVQK?A3<9#2fu(eKYm6%|1#W6XnI-eGk_gUGP9*Vmqa6*lHjQ=~kC6S~WA zdy21sA{1cw`;g)}+T~gB7c2OX7a`KXN&PF#<I-I&Cl zBG&?Xh$jb(Pbl(s5sC+K&AcZ{-ZqF5aQcqUAWVLd#0hb5nYF2GU^M_WTq&ird8Da# z_E?%MJ*uagH<;<>1x|cqUoU8C`wvERluthJ{#t+gEamAtE)-JntUysxj5RwX)4(yRTiIP+*OX*S$k7~NAxhU!MFeCm5J^1w6GmYd> z(-71DV2YvBRjw0o>ojM|mz2=`SM zC!|g}Sw%*BhcCjlg-F;wfK<)NHfbS=Rd>VQCi@=cu;I$A?AF%VJ5XBse9w5=+e*2! zaF%wZU4&0~H|4FlqI^f&<*iJ00rA^mmPFpWk0&;vzV`s&({Jglz*ysxvZv{k3!_YT zOWkWshYOB77qoR3at(Z0`%WQQ#dX4@USZmU+;P6cD`OGdM7AT37mc-^J7quYm;nmo z@PqGdSC}w}84u@jqhXTG9S#*T@NhqAdtX6=?OhsOB!SI4e+U*pibBlj$D{jS=c4hWen|BE?0d>mkAa3OM)!sWLN} zFJ2n3VZWq^#K+-uH0&frX{R}BoEJinaPvy0pi z>mxP{qw2J!B2&4sz6b~`HM&{~W|CX`%Aq`<*p`c2r0qJ&yphUth&|eEi<lPh072Z>}Y+@3# z_SqY1jI`(A0^%*RabDj8ox0|SsA$33Lzn!=kG7)>LRziiPRXQ{6$Bg6WSEFy|LIxRUBIl3vDR11Mfe%Ml|nOs@I2ktbO9+X{?ur zNq_j~1dHB;czo$C3%Fa34)4&;^Na;J#t8ZwINv$Qdk^H~` zpbWl1#QzLg{KhK%#h%l{$+1T-DDR0HHnz3t_Xse2f$$HZz~1 zN@i$`w-K5sjV1+^tWz}7nuzu1k87qjl8acJYn=huUpX)jz1-4;sJTALhXg~nPTiXu zExH_H_@Y@w(8|p>~SA0NL_$XX!W9i?=HsdxUl+w_Lk<-*M5q3EsgOm>UchT-iM; z4s#w;jc)UU5Z#u9Wlgux{h6t4SwrXUeB(uS>xf@~na4yylu#K{ zBJx0Abp?!mO7ZLN;`ho>=nPZ5t2GXS%bT{s&20%WXxBJUqT&AK{K&>k8;h z$lw>dCV^&xTWXe|+~9~w$bkXE9FdE#k)(sk6+qGoT0O}`8J;8TH7l3&6`tcdzS%%n z$#M-VS${6zfcDREkB@1$U+VFivybN{<}w+(HRt3!l+xdr<6wI6Jp!Q#(>E(Vt#S7*l0EF z*tugA#~-4+Vf+acMIq?_@7QC}ML16$D&TS3%W}5say$L?^Ld030F(E61QUggr6K}B zhCExMw8{u8Gm-;=MrK4kI9=|fkfW#gAUGlt28M_Yw~>nX6RAW0iVaxxM&;BuNi3Xm z5R1D@Y(DmsZ<%J)JLg@?q_Srut@htB$JBM=^>J(OG=sc*OS6fV_mAzy;dKJO1YF?V$(EgbmKxL{A7av0H!PO%;_2AJUPwPz59 ze9esF_E!eURy@$EYCpS$X8cbg3gg{XGtiLmG>p#2jU_Y2xFL*?o}9HtQ1GHPjWKx) zK1S+}R&NByRA{d{BB3GFSDipnsPmXo7{qc1-V6YCHe+>SZ~&EF3vq`|!cn^%3yH3w z2uP*3-N-g9@h)Ba2hd*UUF!|~+;exH`NSx;B~_Q+4k8HwdXc|sg^`P#6H`%COIb;s zMBXk#sCLRJ1#a`a!h^JUgjTcvp?{h4h!C<1zr}DPm=7%wth8au6Bj$oQAfOlJjLK?U3&jixynr&#;H1*gzH>ABvn0QMxi| zeD7}i>EOt6q}LWpG#{!bqz|tKf0!KWV0a>SjNmm%eCTlNH1oKE>-^B8_>k-y5(*YY zCagKZk(8XkdwY`jki=2E?Hfb!!A}{Fw<6~+%h^e`^mKDbC=EG@N(52pAVeUXl;Vj%x>GONvWC9Y-Fs@ z5Kl*YZkH4nDh6v7b{zJo+A?8?8r2PFzOt7NN8)xeaaIc`=ELei^`Z9?zw#I9=q6U& zyyc!b7Yv2lxH*!1-<3zDtk?P%A16jgEMO?P!m9wGrV&y|y6wG#m?h7G^jYVMUFQtt zL)zn~cO42PjCEW;r)t!I-6$qz0sBwHi5OSIQ?5L?=Gi-nE$ZRO)@-H^(y_BwR1OO9 zi;x)C=X(gC*`;jhbEn8&Bwb&w*(_){{ML6yqv4wVo-G#k^|t^E!b5clMM;Lh??@p; zJJC5e|9kVC@0Pr@$>U3XK4C7UuiI9k6C5u^80G>stERdr1Rr<7JenoDy@65J&%PJB3TX%UeP*5oNk%Djhu=PHFV=q5Cc`Kbn7t)U~uZl}A=Y{&e8PJH~n zk?;n1B>V+D@r@3kOQE28RFm)cZca(hYV6wNIZTS1i+UEXpW?#BH_(~6X5$+eFi4?; zPQE1+;&qtn$+B2QPyO&!(+tOf(|fzC6fMzX)nCu0HA7N;|JR66Bk`rkx!4)zP#kfvf&Vv;e~l8pU%1+{(%;9T`PuB-}R?l;7$zNb6|n1ARB2AT93uua-wi zXj2aqD&*9l52|}@ds^jRZ5i$beJRs9grYCKA9mZ^u@lJf4NWS1&WNQqz z8q#KX#JpmLsb z^WPE4&wnUO}KQGlsTM-ExN1c?DG#*D~PDJM3QY;3k=B5+E+F-i8^621Q|>6ccz z8S)}uVmtCnyrr8d|7OtBk|~~NNwSMc{oisE-eGK;bq4|ML~Ie#n&6&6{IorSG&YKi zFWDjrD>e2>>kKcvl-okh9p7TRYS@(f1Aj0dev`BxbI$_`Y5wS}e9eS5bG5^|m9uHZ zNZ5^9wi+;81cXwi|4oUc1=2q70&JaY?_Kd_YFNz^N$jReqd1Vt$5Nw(33`233KA zMiGUqlK@2FePs@8Y+XMqnIg&<#-=vv;k*|5u}HaQf(UBGJB(8Lx)sSc%3d zgeOi)Y01v?#G0TV`ckxl4{x5*o|iANyq3UHJ^@`8uoga^Tiw&9O4z8FV_>p)(y=N$ zGi@F0JgZrilfkOrkvv|@F#8C+7Ymjscgw6UP4UOclJ(I+(9kH+Ojus3Lu!pK~0Ev71RjvEP~Vs>p5r+Ag$IB_v1JBw^~ zU+u$RonjhRl=oSmD=cr`zsNOF;!A4E?y<&pmh6A68&1e;a#-S|(`J(0Fo9cUAi+JM zJxdN2YE!kAn5a=yYmroq+x8tw>F5vWIN3LEr{g!85=VvI9Yi|74z2Irv zT?zY25v$=4=v{1v6jS+!C1zIBn5Ny#l(>;J#_F?u%Nhes{ET!viK;d%TOLE|^Hi-f z1`qKV;Xj6B&dKt|-c1$^{7qI}Zk~NzGG)_(;58+2ovtm`0ef5tbqnDk{T$^@@s^4T ztOABkS>~5@t5}-L*`|;3bjD1o&XW zvxY3_0vUJ{;%^V8F3Mi2WyeJ$-pZzyOlWIGqRW@LtJB4 zoBdtp02|0nQQ_W^57EiHUf&7S~nJZbpk)ZduW@$IxlnX@Hf-XZ40( zZkJed2}-F8k;ai?#2n`YG18<)NEEAn!pbu#ElLKBY&BJ}+561xnc(;(Mw@T#8wUzO z-rPRV)KC|sCEcwu$ft2ojs4KXRoM6BjYSTXL@{t6aEep#kz?yt)9icqyj zYmCChx~MgmO#)|8TVg%8+bQwXULK~J1(STMVDp1&bA!GK?gcmGRAH)L2j8)DCrW)Q z_kJ3{G*`*Dx~&v0;+GMuxgFQGxG*`MWAMUrPRw$j+*vFB*N`bRMDkHdky2o>eT|g0 z!U*)MqSo-X^4P%VC#)2l8uez;=~Y$+I82*)f}1}w-whgvo{sg{eYWIOrio+4^^G-h zY~Jy(tm2$#p^(lv?6?175d%W5Ss_H`TVX&>dtb@9#4A3sg=?C0OhJ*=V4{Y~0*AQ9GNVNVc7?z(0Q9G=)8!wTO__byr!4dsC5ESJj!4caROlEAk zvMwD8;UNgr;!tDCR3vf8(RyQ5bvgcRreo6{(-XG#;k*QfVFG<@k>gR_sm?|UUbBGa zoE05+;9|HI)Z@-LM`&4gJ3BN{r>TCf72^P}fgQ4_`FbFMUW7Fy4wYUCfF@QQM4F83 zhrP6Q_vSk0UX_-fGJTJ0B~l~3i3V1g-Z9-x_V7)>$$|BbeFL>?cM7u*Fhw$L>C6C* zS{IOBHnimloTGO&O&q}qOZ<(I$OFBmd6rc$^+R+y4O`$V$W7{iYfaXnhT)R*s@!Wj z>ZY?SuVp6c2GZ#+yP6YS)b5x*6jdrU7S(nFp-{Gv+_sd{YHDFUbj zzY#or!&QURC#(af-(T#n@^Q@{R&?0Qaq6g(>Z*f6iISERj9o5>Tu(H~%AtamF@(Bm zHa^`^K@gs?QZQ|_S?1K<9@}S=BiLF*wyGcq=GGccA9@*tC(?mgNHjrQiiMAQ54d3F*qfv{ii?DOlW+pFkC=S1RX9o9Cv5 zLI@34gvQ(BTRSey16Hf`!ti7kw9$PuHjL-YF}q6f1U&oQ!knq}|LC%q5iAxoN3^yA)4|sjo2uE>F@oQ!&e0RTkl#1A}*`D z00A|XiM1I(;hlM+ek;_4=-FMI<=5S(gx5W7F~B}02ci6mj_}4^X#h>i1fsLp#Yi>- z!7796s1w=iJqNrZXUqXc5h2cNNJv^?NuKArbj0Ww+JMj%J}@!#rm4D58j}*R=Tvgi|rhVA5EhR2%5HP|8Z2r%gx-BB9IZ z`Z7^`&lq{w#kmb;z9S|$Lu~#xWPv@o_5>gie5|3Y3-kQ8O>2vm=d%Yrl=D`+v94Y$)FkmAe^-8z zf3|e2nL}s)+?}R5&z2HlugG1m*COG+m_wLQBI;4$ zs}ub=5^|>ex}Ln^4LdR=djUoJ3QMdag-}}RD}uBnuB3o6gkrNFgvoxV*K-)pX3L0( z(kZQL@n$ui2qm}*9V56bGiwEZZ?m~2CR!%S_JShsyHS$!2Pz~Y$(m%yZlr654%4nr z(dHSJR?)Btl__3Ou{3SPvf7o;`6mbm*9x~@=9TL&IbV zL=D~7UsEo0@#OpA=m=CgH2R}T=e;(OJ%(1tL1YZhgCN1x%}w|V%f(f zcN|}hQX;Q!JjS2LVSFecf8J8GLl-y3?4M8C zzKz_qP((b?bA86U6_4QkBL1p6*pS??ERk!WGr`&vE4EpPq_nOdnUO^h>>hlzNj(LP zTSnV%ObAr&+T{?(Nlj=qf*{&qCE9ODHQXTa^%>`+#EHU z#o}xP!d%hc8$6SpFba9Ao_V98?^-T(V3-IpZv7p;eJ-2Znv}*cHerwR`46@76- zKKyqPq0PJ#-5yNO3&&ro zEgc_ZuIbr_m^YnioE~q@p4r+trQfNcOe3Z)f3$ikl2!Eb!?c#OQ+3{;=30s)@l9c9 zqwJ11Z^f@KO;UC!4YL@WGK3#X&(Zp+t18>xy;+E!IRrKQL19}@ED?h`QOb;*h3C`_ z%Km7!M{%|;I0uP;t?PZ9CU={vnZjXQS{z@)5`bW<65*q>GewVVtN(a`A^UsV;3ePL zfbFzWV-UwJMZDu7>1_ywM_TNK>BJvhbrH(!4DZJtR%Vy)79hM;n|3|{*!vW}u9eAV zn$}VbHmlMwZ1ue$@@x1gN48g&Ym?=1S)t)4Wt-7l-WMa`hnY|R zWT1Sx7S(WAO?2$!-9G65v+hwLw_*glUEF4sOld++eopTBxIEr&kNo50DIFnxV5Ht6 zP)1QR`*Ha2Ryo(5-1LuO+S&K5YJD4)46Ddub>yxvcid3>a7V2cF|L;K$W{87^0ZY% zhYQEXvBK3CpW_|93AAqN2IcvKqo0$RWT(JqQ3|2MBOzXZ_pT707LWj|c;PwR0gh z18g1qh}-u~<~%!CkU)q4l@=c8mj%f~1FnJq zJ&k9;HC$EIf~zcmVjl~Vp)tU2Ob?{@u^_ereSN}6$HqW|F&Gf;XF>8ZgNr19t{EL% z#R01ONs*|nf#H5_q#7H**M{|-50>Y zOCNgC5fFqP@EEQD*PuM;Zz&G~0{8)t<^czofYw2B(BA?I1O(v+P>lDzD~g}2p#Ps? z{g<2ay@!H-@__!P$RZ$!{3YO$yZ=3O`;!gyZvqj*B|Mk*p}Wekd&qQ%6?C7Z0S{vr zz@dkh%0J&j=8+&^e+UP3e=-gSi{T*O1D83`_n`1F1L&V4#yms>gk1Qu;(q`&#N0y` zu|)UQ?hhW}){^0+;}4%#ZQMO51H%HIjSzzF4}Rbv1P(r2UrOS?AP6Y_i355NkAL9W zB^eHK-@E-MWV;NvW&>}r{7(nwzt=$Oy*1A?ihJ-u4EHYumoPKoAPqdE`y6Sz5*Qv; zMrvsQ#Hwikp(ZT&w!r}m$4HU7ngQsT2~yGzU~>$<#ajV|aW2q*e=mq1*!+qRvKF?Y>8{qtJS-`cxsS5(dglrb>bJmaYBgbi&8xwAS%d}y;{*{h(gXc4 zv;cuhPplJ`K`6S;de(E2tMrKQMarVoA?V$9AP}YQiLv6a%8w-}kpg2wpxL4!6>X_0lf^}_7Vga{oMn#}NSiD&llznV z6-?2}$ORFYf}5rNlhx6<$tbNr+>sBYKE>!n{ZbNpX3hT1=tQGbymvDGvJpyD<qv zGW#tr`e+3i#-JC`A4(Lrt^9&ygV@7gax$V{%@I}{{1tn2a0XTg-J_ll5x{@}S^?{| z@`0F5nuECHUz@eHUUcp;iv6_jgXtBGU48epRWVMT(;Zebcs%6=1VH;R$r^En8(yk9 z(_uDor6R5q-(mYXHn_GdfeS!c%9#b#fKR1P+Edjsv)O{=cS4?78X)|dIn#lA_!0** zmlSdTt5xHAt-7(^AQiRZ5{TEv;2WB5_UebpSel`#pBd&^^JeJes}`&BOsE!x)Cpx7 zU@`4FIX6C;dPcxeUW&BELo>lL*kW#gE@_bgr#vf#ABk#TqR&awX%{{9Xn)XG;yxnk zQRb(2k@ILJ`>>RVQTmraGjYJ7h_uDYO3EM9?JS^Dz|yl&j$O^<1(a`5CiI-)ZL`C` zScGLQwa;ab)B_a1JJML?vp6(Id3R^$o>bDo2(0|WT&CZAepL;)!PAw8#&$GsFy?b+ zbV?_;)EU(341aSBttHCmwK%4jZ)T}E#R(iPSqX^6%-&Dxe~mfGN+=*O{eqP4ZZvZo zp2#tgebilUkHUrb1O6G?aLhUqG=E!Q)Ei!L=TB_7!1?2t_gQ8%>It|WL?YmG`JM1= zoRJ{nAKI5KcJ@L^sII*sTk?rH!I+t!5bG^6+J5Vx=@RRwJL+XF5QXjGkG->S7XSz( zZqB$BLlm07V`ZcnYD-0!S-CUw`9%LnRk`?A`hd89XN4PB4?MtrDN8WgYmU%z|G@n{ z=K|HjTisD@qBzRYQ@z)fuoF|T6TE0BV833@q$o{Gx%_W>Vav|jU=WWtFj2_*r6fUU zZ)S40;~`9gHkvWIvEQreh4QQTput;ibYuTM$UbmOm7c0b*RHBDaLg3Ve9%0fAI@u& z8>#@)Y6i1UMvJZa=#C5u_xeEZz_Q2Ss*9n)5M z1wGo*i^yQuO$2GU-~5%YuASR?>-gZmc_`;spV2zkC^rh1>m1r{&ta}aoG*5Cv%?3= zECX-4cjxQ$ce@-1c2^H8JgfM=5}6smGd<_P5omgJB45e9^?|d#6z^4!Z!24oeniqdHH4pLf3ZYNqyjSk={XojNi5 z4z?xo8z%u!_QS3 zaL?}@trAPE=N(tvGC)MH$09!+sr_yM$Hd08=1_OnVIw5BQ^OQLYiL%5CG*2Bf@OYf zPnXmS-VmYg&Cvp?yYN8|ON$Q{t=kPfFKa+c6wq9CPDh-rYL(tJOWhyqZc@X#LAeD2 z**R{3Fz(wh!S}WY^_>}^GxScn7^~NdKRnZ0i^)i8-}@Mjw_4kiVC+C^4p9F{o9@-H zt2{hj)AOl}TV=W=QM;or@hnkWBpl7`-{gzbZh*wlZ4`vn8)j{eyfVkLDcE&Qs>lSe z0#5no23ynW4zI)B2}XJ?s&}iYpVsUn(Q3F@y}0IeC`mM!1VC0+oI2uK-|BdXXXOdlfLx#u#V9B-c($faTrG2jNt51Q>e&}bU!5*jfzG<8znb# zrB@Z-+@n1vEEP_6?{TA^{ze`ReTCd6>d6`UnF)6b)EJ&&e|cw8mV);)Op-}A&wpc7ZrXLkUQk4#)bAN>&Xo}VpoWS)Tm3Hi+9K|zfgJW0|#XMs~}=XM=(Xg8@VFWA~*Fd_PRNhA!|mHi!i6?m^6|eO%v`#vx#2p zn3c0@s546yV~Djs^Kf+U)7fJ{BG{?FN0${P;}AEBSi@LN1(Hmm(cfw8@>E+GA@~>1 zfXBsNzuwy9V(^gg?-w3$g&C9Gp!jCKro^|WrE9ot()$Fi+{Gi>dw%)g$x zH|4B2MQQG0frF=SwJay=!y`JXpS@@-4sWVTJIBOfk%gL2y7gjis>@>Bt82l@E9-Vs zUTJzi#~Ncka-Bh}J>HkihAnTesvqkaHqtXQk4CP2O59(f>cX8(g@F@QtJNxzEiIp! z#u@|MZ^B+~?3ofsH_pCILBw@=u7HQjQpW5jE0@t{eb$_=9%rMfuHG<%tNvo^&J}-c zsq3mwH-py#my5Zl@1zSTitx}RIM$nTe2riTMlaDzr@;LBu^H0;q>gbsh34%zCQVyr zICpTt>YKGXWJJclwwE*$O+s$jxd4*%8)v=hJOA~EG)Noh_K6i%_&)}F-<$0xn{Ha>+Y}RAS>Tn zv%@cvWUvUVxOt~qU$a8B)T<3&vNgx7t@?=%)P)dU^es%BL`|-&gnTtA(Y^*hn5Xs1 zPOF5&Hq~X|wX21al#xNkTpt@vpN=l8=K6tc=pS{{dTe8{-Yvy5mC*&CG4XL*E`0tI zyxuLzZU^z)WaGtf4E2Scy`;KoqxM=Km=uSStK&pm7lgx1>wDeF=?=#Vdb3)1$%RMe zvDQ)(uE!thZQ3rqCc~5FszGtexC#y}jq;YvA%WOHJW2D=BB{;X%vQ4K)I9LwL0^x7 zn6tJk`CF;vLE(yS#8>W#%8R-%^A!ymwsX~id`Zx#ViKwu|X^)J2aMAz)9dDg(-_b0<~HbsY%_G_maFL%fV_!;je~LcRCDt@*EGHENqtI zh(jgd#Gq%QqTO=^Im5~;jSuM-&25MJlTsCGX2&DuXsncW66U0vIH5!AfflksnT7T!c(~h4R z5KoEPU?H~XQrGr)jgn~QzZ;ZS0!Uk>Ve)+L!v`a;C~h7=h|}!anFYrRsrHiNZUHF2%Af_qu^@jlT5X zmG>S!QhQ8eqZt}~`A*8Obp8-+CuVdUPDLp1)#FA74PxQ;h^SKxcD8gXrPTf<<6L)K zC`)VT&8C>*r%>Teny*-W8b=#1o@v0FUA|=99y{pp8`amG4~Ddx<6hdG!Dm^wg7N2A zXynQd;@(gLWAD2N^-WGQNlHC71ONJxq;vyn>xWp-!!PLpY1_N7x}uL(54QTVJ3;xD z#x+Xv91R=9vplU9blsoL9hQ%#poAwIc(#YPYGpHo2cs2F*e;F0sORYZryAgg!}dh$ zXQpVW4^=;D(Xe0+B(2coj*1P_R>?j1SN-@-s7A*GP0OSw6}VkA(v(~T5&=?7t|~rL zLi>-Bd^c0yg5|Os)>h8JD7!Yoi*!W23zn<;>irJ2Bt4d?>v;$E2+p0B&HM%rJy`nI zcXsVACGSq@8hNrhS^=bA95g^(4mQ{W?P4-~^kj-`N0C-{P6$bS&$A=l$h0V%E=#?t z($xuu!fJ6AhVJ=AWwj;i;j#S}W!=S6{8W;5KC`g!7^u1_crsm_v4N=TGiw6Gm2jP1wU-^CPM~d{nX7+}-M&~UbjMC)3CVIxc05{2qq6#Dtt0d-WJZ@}U#D1=Qxu^$cO%u70b z>CC)ZGU^aLf^iJ`uL2^YOs}6La*0)Q>R*`tlfSVpC-H$-aUNtb?KW#PJbuz2 zx4|7ydb31l=;1=@uU!7|#zKu=s(w1;WyO&zPNOEAq~icC3GA(b7@g? zAE+_1IvYp4B?R7ip8lRaFgEnf%}E*~JcB=jNsKaf-Kd_Iv`#%wIBiQ6I(0U|jVhJ6 z%}5>UlvJ96hKDRsR3nEaF-Zu0n- zP1uSq<{C$&vn@u$wuW-i<|2sT&TX^CGZa_U=TPg%|BvP|MgE!sbZo&~gv^L%78lnI zF;XVoKc=D{u{xH#E+ErAXS9(nFRs=`a>wopx)iej6MAcuFfaIC5zF3dxin97%q-FC zD|T%#f6N9ZL>eR>OvnWIxH6FidDaWaj_P+D=8U}+g&>liqH;eh9_)Ap4~w6wSB#>& zq`InTRaH?Ca)BxKL7p>=rmRKa_q}AYm#cA7ZnZZ3;~mXL51E;Tl6%P<)#P!ag49%` zwj5Sg(QL!@`OQ7`?#!gCKu9QSgf8QxJkT`O3C|0BC{5xymXx`-I3AE}9({AK8h2lZ z%`zWGncf6TS!Cc+&(UT5-usKIy>}Q?E{=>w1s88ZxaP+1LtRN6x9veN3R59@;z)ni zwet`|t)Jo$lKjjTo(}<2#VF9pX#zl0A&Zzq_;WZKZ^-w_<2yJxRQrRiYeheJRq>gY zlm8Mp!otO|w8n|!0`EcJBY#&+f$7XnA~|&>V##%iabBWII$p+Xps0nikoGcOR8uKD zz3k1D6x#MMgu3Rl-xGIYKDi}kB>HaQZ-59F$bXWCsBE}K9Igw0Pc=6IQA$|sVsR8H zO;f`y9^5=G#{N|}xaZrtKojK2sAdaNjzZ&IPk&PZYd0rv&*&F2a$unvFLZfR5t6O%BVP|&2-N3h zmR8f97zlQDl<+wM!+cs;JgGdLQ*lif9c5Ln52{UL53MGC{UJ5Y!Pp*`OLr#O1&ane zng={0b^+8yTf-cK0|K=5B-`f+X6>OLdqCF%wVmvszUX$a0Qj0uZ6B`X-JbLF!T3{n zlf(58n@E}-&!qD9bmZAM%N^G5(&$I`M#}ctf|d+R%?P)5n`2gB(f4%;upZ{*4X)_0 zHb6?K`m|z=W7bvi0?dXZ#!07<83%~O??=RtDK0e_Jg~b@hrB?;;j`Bhn0@g(@_ul9 z2AtVTDJ(6JmXLG8HaqO;N7R-qx;0&46Cz_z(($Zkwi0%~GT*7Y zZ72_^J0qYqnD^B5oE+43s@erP%Ldk(X*PgF?aiXO15b7|=hK>cUGh#tEeo`o^konL zBO@_wJQwkWQI#(=Xia@2P1HX#yC93Iaa0<_Hfn|k({dui8LE0T<#>x9phTHS!QltCn%bVlr z%fhQn)r*IMl5&tra-WelYtEC?9=WbiIEE6hQKK|bf0>K#++l!7Lk+;6PfpIJ#6g0X zP2NzDV^ZY&XSE^101muU8mg1OIlDrmK6vi?Xim5*)$Kg$0_MBDNCTx8!+QVtSq@KgNjE5#BA^#BMDs zJ>dP_=+b5#U@kUDZtH;VoI|*9w`hf*;8fBT$~*#cQjLMQ&R@BqU4YxO=eu;e0Sk;; zg?APh+x_0$xaZA$vD4RJvvs2V8z0|(g^CZsj>DpFGvagl!`$j7P54YTQ49D>2z#^^5X_6f-<6WQuWdus=O;y&1|! z0&M_l>fO3}!jsPMVQU3G2fTaU{&+)*Eu%jq_SO}p3!Aj~nJn?|gUcZ*wmr5A>bjrt zr=LmFd(#2%!@p@ow)z$qWy+q zYKG#>|AV*>dG`~k5pBm4B3B@41pACa`_tB5h-ratwc zpD^ftXIA>Grl;m3;wL2GN?54>4ZagBe~QV?p8zH_GpAnYfU8V~EAK&5>Qlp>zwI$V zE9E$`;7=Hq8Zvcsq{y$nXHxsGE>|O1VK#=?XS`iJB3sE)l(kqX#xrHPp5YFi z*Y14#SH!xN059{1++)KhA_=*Su?vY~&ZDI5uNTW3p+eZUiM1dyucq)s%c+?8WTNny z+3cGD#VK;(qu-**H;isUVf`yQbwG&!n^J-V*B`=%#;ri<-@y*;W;ve>nm>ixe;R+` zw1orfSh0Gezesw+HzBis{K30BnuZ781cG4$DJR-YKN5G3EY~jPsEldy52ZZj^bMn{ zi#@Ww8F7tN&K5BQ-V?rH8&4(pDmviZWl zIHr_~fN~q+!BNe1mYx8VZ}?9sUhV3;RGrS0;vSirYsd_CtZyoJf^KeS)7Wn~h|XBM z`7`2O4ASkIEoWr&R=5t`;OXz#Z{N8)B5oPpZz-T$j*mbsnG6*STM6qE!DH!RI+J8S zLK!i2=esY8r|0uOVgiEB1|@_6#mlp4d?(I=>*?<1P1sszr1ze<{_WO86NGUS6^2N+ zvj;`!X^{appyNSRCECk3c*~r$Iu#r|?ucU<6d2eMA_%+{6SNx(4^nbQ2D&Y1qI{*| zOf*TLAq?#i5(k-~Z({vORi+NpBPJJ~FD02RUad%|GzF|3&%b}(qkEs}O~?^hSA@xA zojpcJPCqI=Mz($?)c$R@$dIQ(&l9K-=-#;w^g9&#`ufKO#&obj-DV;?jHl9SQVpTU zvK0*Ip()dO?I0Y)cN}s?2Re<7ZqPao7n&JLXi6}~OrO(`lzEk=X3U59>5a2sO` zgJ9@uH~3-Dy@5nT)TfU2$uYzFK|Y7FOnnIekx_>NlKGDSZmFL$!D0G)3G)a z#F(OLEn3sfQvEq1B16tM%vfFZ&wbqtgp2nRVqJ-`@4z@*T5h?|OLdaF+jU+zl#+bV zr989)#qUAiCTci#9D82=x(X)y7*RvkOb#54Mh>2Pqvhmg4UMs=PJF7EmMg1^D2wbN za+by0kjWTzpgCi@InOu9=XwH!zQ)#wv5!7+ zO8tYfcYt#VC@Zm570RkJvz+f3S4t?dpK%;YDD^grkF2C{j5kJ-ks*<*q9oO~{`UO; z;6+0xX4jb?P78hq7PotvzifuX6l|Oc^;hR zWcqxdenux&I>U$skvWW-kP3A@u+z=-nL`7DS$n!hUPfB9`7!K7EpzRxe(#Rxa^}S;J79q)@g;*p8y8U*`g1 zbTUD1+&AT(^E(sQ!X6`Q6VX_`scIB?20&t?n(2hj;cLqTlj*T%WwAsQ+wZ1eYfzuB zm*2m>)lKC0Coy;-Hib`p+kAcgq)mKK_Z(?wfTOESqKp_LH3z0|i1?p12Hu4LZ*}CE z%u%xM$6>q*CH5>qLpnp1k4W_RH0Esl^esEiXIrzw;dD14a35F$mpqvET-dX)cKU70 zZ97$Y1~d5K_0Q!o%#OjF2}>KfJ~S$Rd)VjY`Yk9`(9?BDO=>;Q{2_?I^BqdE4dz(@ zMBpU@R9#R;`BKz_DFv5>8samxC}e1bLT&V>(O^`i)|QwvDjLG2h6O?2VfusZKv=me zXSsZw#3k;FabL^8VaVkSFdr1O_<272TY0r~^Zfque@7yYkU*V^VxLFDoC}GPZWdvR zaF+Yi7__0!Ml1R!Gl=iUh=jL`Qdrdc4?-AeAoF65)1oNx_-x*Mygs?r-x?o^l&PBJ z(!M4VyBZn|H7xUzLL8T7LM@J^o>Atd3;VBza0)|)rr2i&7Vng|>Veq-s0Tefx|ln4 z!!giM!F-ErpbV#a9}}Fwra?s8kewO}rACRdWt(P962g33IgKPM6E+;2PCWM;4mVOH zaR1Q~nITa|!G|0{p(~xmVo=^GySg4$nzePkCjgU1VZe7SM;Ej+p4?M=L<(3?{-xie zKYw!R1K@n!O^?S{(gzR*@N6|xRmh6UVOuQq^*W$q-zI@0Tv*-j($G)fis`cvh%u77< zjpic!_^K4s+rt3SqicN$jo3e&#k`;voib&ZILRv6NL%YT!EUy8c@Cm15Z5bkk(;y- zX_|&oOzA91x}lav$L-s`O8U=__-eAEULnVxToJzX=`7tGueNd(ExPp^HH7?gOv9-j z?tfoe=L1wC64;+ddZz+^`~?MPqud6EPw=KLIM)>xwiVRjA_NC95yHLpzNG!I*KHh* zdE26RpCAp>MShO)N=rR)C&mT=hv&>m0fU%bQ<9%S(B4s$AqBf{Ka^hR&h=k{-(J58 zZf``ik&??v{(8=JwET3*+PLcP#)kt*pYLdKUg3A_p9Ed<=&r%Hwpc)}(oN(Q2FwNX z!RkwKb@q4S4RunVQvc|HZBHzD#4?aqv;HVG9-c%pt3Qcc6NT+?24gJLPTb8LhN`RN z!4_Q|xBVT?5(Frup&%liUSU`9Y&$*%{VoMxFdTp z@F$6uEsiGogKWXyUQ^PX9KxdDJHzw5xx;g^?Y2?yyYCZBc_aoJa{;$G^NdPHi=~Dn z-UpEqOFdPCp7roNuw_i3X5X80(0dpgv4y1LXx(zlW0Fe0)!xoy$10q}ZQ?F>mvivY zy&3o}pGMMqt_R5^J^1F?Vi{Y}bDUz)vA@!(cQlafYcBs&PcfDRcw%83JL>df^trU_ z*r!d~!>7gqWJ?%_9}A!)q1?ZqxiAI&Zdk(u#}?W6%gk!vGrZ%vaAY{R2@`g}p=rqp zP}OHQcQpVZK=fgYRdx(8FQ#v(*svDjasvI5{Dx#1i(?s{cM|VsUbnk$KC397wV=KH zmeTQ=2xW#fpqXn4_A)_ZM~#@Nc~GykZ1VUPu%T^xPO)8|f0FB1){oejVkgNWd;AS1 zN{F&!C?bx;-`H+`o&0|A&D~x#QDYtPz~s8u9#M$sH2X(9c1eCBnt+qXh(% zcPTzLKG0IUviP4aU3?dr?AN_CoOuqH;Y~7Jd?^xpr*&^Ukq`yb%03QHine_>Uectz z75)_@n*g&xmQk~wJhMlRar76l%}|F5eIyi*(OjM#J)g}C|FI^yaZSAsi6V*o!mE zfQ7+4*1y63msqhmtmAVCFff03Ffe{laxOV&cM1=59e@U0l@1j)gb}F`MuA67LW_1t zu7&|X+FUs?MHJuhswfL=EN9%Tt zntC08DARd_BNI!llJB6A6!-BKr@p0aj>vd+H|`+7WYu<2HrqprL1PSUJj>!&SDkKG zCRcn);RK4|+;vWRTe+S`_bfF>04p_KM3K%~wJxy14l?I~9B_3WrHD&SB-|af;DZ$* zvOv9BZE-@h)@9@DKh1oYu%+E<4Qj|6+l2V{lS4xzUbfm;uS;djUAMfa%Ik#^DR8M8 z=8X4auAPm5Kl%`96Ds={SwXEA+L4FQ7DT%f=c3QqnTa43432=jBTMVkqR4l4?8i!$ z-3qj}1QhpPnkB(o4$`V+N8#gN|B;99#LOLx3Nh)KaET=GAq5N{cf+;aL5*g>#jKh{ zdCOGp684#9KF7JQcw1*C#xst2UsqB8U9c$4 z!WyI9BXyjXpd7hCUqI*&{g})kw6@4O-~&R@%95I9?Ny&7b0%`nIzL10WtqZREnq}5@__~k3W%O#d^p^E(MGakRx z_|Nt{{Y@HUMhu$P9COODV^wisDpkvGL*XaFF;wWCA|_ z(BhtjzsLoZPmj;OiI!Y8*A<4*!@zJRETzl-Z?>rb?}GIO(|7|hB0bR{gVCSnc;y@e zW~u&z0F_@9c!N?MtB-G7(6ds#ZOFhX9HmBqM~C6S;2Xdj`b>Yo3j_rGeAFY=eEsX9 z63mqt zT(d@869@S!FROj%b}UcimqmtlY+nSdJemVbc5yN?_$6@!Btbyxp^Pc6DhiNXr^}~< zzfOA5O^U&@Q1iF*AXXkT3-&zRAdB2No0a?6oLn5^f!T?lzKg&9aO7e`lBd-fkAFVB z%K0e8oxY)PuHi7vIVygTH=`8^;UIj6L zNE#irCDkS6CDTccGFlN15#pV$(@B@!V*QPCY4zTGdBDeT;K)0Y1e}4>pFFo~IgiB9 zvD;n*oF`s>lr}sVuB4(KwBFf_>y85j#?BeB87pRo70kfVJrQE+J&%=#(dE?>F)3{b zDc!IEuqBkAFC{2SKP{0(K_bgs<|rhj)zS(~C62-wFnzTa7a zW(Dx3tGZ=Td&ZxwIGhJd+z*#c7q6mAR;z|hlt5dWW_b3&FJ9m52t^`Hi#e#%_ikeE<|JSkHz{~n1e&qB9J-!uQv{~tF1)otLfB& zT!u_IxFUO$wzFLix?X0P_2W%40?S2OhLX2-l@` zF7?v$$KR5^PZ=X_4`@C~=UbVFP&y2nQ<^o5)8MgRs@_oozWILw!+>F-e+5VKDy`xr z^^0ivyoIq|CzbveFd=N~@6n%NV3Fvc})GZacP7wo_t*Ex`~%OG#A@O)*9sHu&mzImf5BZPjVjeZZ`Ye-lwmJzw?3M!hG9lO;BF-g%l(u=w@g@ zc>sxaoXq{bkDsoZ!qi(c zfJfuN3oMYz$A>zu;QrYJkhp6l|Na1k`}pxJ_d-$Qqdw3;o{OSfTWY6$9At-g92Eu% zTgwP9a%iwQ_f!&f!{0)+zG}HlUPjf6rFvY}9F$+yJgH}>yW?Er1=yFTbbpe~%4q&UAsPQ?y|(Al!$Z%FVY(J> zf?(+?KmgDvm?5RkqU(;U8 znZT2JH9C>zRJ1)r1Ob+v(NT>Tj(BMBNrk9pdp^1nRd< z)@9|98Xgi>|=)AGS;HFKb2U7pE6*KPGaU)rz74Wzp6#~^Uhgzl<$bap; z5l7Hw_Vd8Dz)hPe_PcpY4m`ja{)vSP9PK|{&ynqbUb2>7AhBoM9_=x`eXHSmo#^?Ca>%YL zD{3+fGd2Mcv%36!L40))hIudol3USX9LYY3r%mYyR$SPx7U+Y&EB^FTaFc!C8CFBk zwQ9?It%%!W9bpKjIcE|^yW&6l1*Uk;D{Z@qdzTVZ52%Gdm-P?4&)e?>*jyLB-uQ;d zHFh_rL}Dhkgjr$pzLH-Niqn_`m0KTR$QGMIm(2lr!Xm7cIm7R*7cfe#A20^y&Sx<+ z#cN>c3hv0a#V^v5tcUo)b@*dw?{GL{KpnEVqIKT*@%ylks0vi$+JaA}M7tvPUeQ0B zj>-s!+9LU*>X^tbo(|Licod0!LcH-Yk&QM;RORe+f~PM9`E#|0ocx?P#$*6=N-nz zs6^+dfR^RuFDtZuk z3!n2%m+RlFJyG$T2QJZ5&`h{usZ*c@?+-1^gg^9K=zcktcc_|r5`UILEF0|J@Nz0t z+|ECNuco$4g`tHhZmax}yt1Qj(u3^9^bWZ3$&^Hvq9NrXJq%xc9#{@KaGa%>tQ&lIgx&bGIi=~KDCedB%_1zh(PSq~TQu}S8wz3J_zDPLDY$%+X zbEK9DLcHgTh6&gIz=TFK6;dGku7!rhM ztU=K>B4I}mNwcK}b%BUYN1xWl@>PZZMk#2o`Pbl-f+L>>l*A@)<_4%;17UJIA`Sq}b_&ynst=5lso|E*AY|<(8wOZv{5^&=;}2RdL85 zc{&x>lZHc?a4=BlsO|TZ5IB<*%j!F1srw{0NUVC#*&s3uiwKXi&=`e>3!L8TiJ*v+ z5~+RtdWtfs&cI@ueA*U{kbm}MmM1jh4lFT?aO)7O=DIad%P_HQ7GR1y|7F@x4xd4? zH3hJF3mPWTve8xyC5Iy6A>jp(UJ2Te_)^|qf))AiQ4PG8M*PJ$C#0P5!ZE%nYDVUk zu`21~QA~zZO3{{Fv5AA41(tzTAHsWx_i=c`9jXHD_o)#RLfE)3T&(4OOpC=R0f@7{ zgPjQ=!mD^wZyY+52pO;NIGxA9s3_7(QO2;D34@%VVMi!3UE|usgt(4yoP-bJ@fSKU z3bFVFgjEt|zS@=2t}o$DFKZ$f{Kbeeekhob25pi|H10G)G=8?3OBix#tZp_=7#@_l zLxBt>bY|G3I3NJx*4z}(o!PsslZblaasx6J>5u7>`vgQWu9 zCJ+Lz6w&`1kJ=5ot~{GCivo9lnxb}Lz;XPofJ0*;N6cPi?+3PD>0-BcA73vgO5MSJ z93U%*$CC>NAzS3?rR&aTOY9d+PfupKm3tjue|`M>{2Am^OO-T)h{)S~ZzEb#kb_If zQbzJqY`7H~la1DrgPgg-)KDUsM8_>h;d&7$mu|)ym!UsL%?{bHVOeCU7e1=*Z5i-@ zY?(%KEY#j}sZZpNU2i~5?mOj5|IIi!Smo^9;a@*cXy4^w%Si#jS7*6|q2#?({#SXd z&ZT=GoZ^$X@~ z^wcZ1bkw=`W)(QqsVXE3Z%t^?o@I$*<8?GsA1+Ryps&%MYl`8B2vi?PlTJfeI*M-TK_eyHl0NB&16-zPY8iSIjF_Qw_~`~aYTUV zNpHUbfcEMA+Kp%O4&PvSV46@rD?3-I$a>J7dhEFzz&F^8M%S0>rl?((D%_)g6 zRHon4Bgan>4_mT`HX$5UMqEl1ev)&L4*9^AfIq;!qG7U?{}z6o-HR2e*Jz5RTHcG^ zW35-t-=iJ*kuQMIsv>c~RxHjToE{){Nx=G3*{h6-ZPDjLK=r5eC3O8$Q%RK!bXyd+ z-uXO(r+aL$Bjm~k$3chiGVu{7d4SP09V+hxem%`S9Y`!61-2P#zgGh5?8WJS*(H~# zRqgzb-Mat8nCt(he76bEpz~xjpq&Oz}ce3Y7|aVmI-vbeKki#a$5 zfF_haHfr=xKnE9gK_gjXh%E18Do%HhG9Q9;8tt=%LfXRB(k;U@> zLO)o7d|=^O#p%aO^->z?O(Y~^9%yQ1wGVDH(3UCerDp+eoD8FIZ8&H^D31aW`tC@| zLFFaa$t}%?KaYaAKRIQZHQF6l-y^JC1kqypttPDgUK0FFzewFWZrTF`U$9VPj*OMaI{8P;jfo#wll;xDh%=*nh4_LJNdrm2vT!ZZ68z5z7H@UiOLBO7HR&i z*eI7nSh#~;xuxi`TiDkGuAL{lm|C~(vA62(>L`jKdq8H6_FuZ+IuKWDbj=G)qZ*4Xmd&3=Vzw&gA8EN1XZm@3V*5Y#sXP-7 zy&erj*Yj@B9HOwLUHX1=ljMsC_9k#fK~k}h&gMZD5qMBM;!7MYLh##LHOEMayG&Gg z$H_G36~!u`QdoLYcT=f&+Le<0mY$h5Fg4EqvQk!b>NMq5L`dKJ?SE*Vr$|zbd|^;< zhvJ-PgEn)U`^e9fz$ENY(9$7w!oEZwPpWei#i&|~ArrG0g&*J=;~l*D|1q9xuRjBt zN_Bz!F8N*BBAONk4ka~bd6@#5NS6dIAh)IdG8oUG&JNL7XRx5zr-~ZEMJEGCM}YoD zywXm$_sZECJ}r5H{7Mrio*VjkTNLM2PA9qn`Qmo6&F6M4a56o4BP0|EUb(+UTwj<< zX;z*rq7&gpqduP*S!P0lh-hI`Jx^cmtd(yt?`$*(5yAbOgV6a);44`V$twrAYnccOM;VdNg4+M6YoLLL9|rPD*DimjHCxb$d!U-HP2)kA;hNJtmTMC^%!oUl z3OuVE#%NV!W3OPvC-yB4OYRdGRxa9bVCVf8EMf(F-bb*YI$Pp$A%tDS1`7a(-Oqw> z=W75dQq7s0o-oe6e?>w-?|`OO zYBL!J#hV^3IEXt4R^kA)S$>lx%MqIF!j}h%ZU{=sMuetXwc?X}VuHRoBc|>B`S#d} z?V3!6#cmeky_sJziu1ART$yYLMQ)%I3w}`X8H>eCN$n!0NDUNa9d()wA$9F$hveju zQL)W36HEyY#$^XTIu-?WBo8=jo|#DQcV*dFWh&InvrN+J4V991rQmE`3+PMWa@m9@ zzrp{nI^%pg90Ea&St`ITi!2hDHU*8`jbu_s6nje-EyAo zLqI6SZT{6*Y-x6u{Lhj&r#8&AVh%#j?Znq@znvbR7Ng$*9|(nE9`LY}dX0~!q)w*& zA;A*8{G3gt?K10>=?bYh&~2$T0}c_|eT_55>OEp(%&Kbj{@XxXLh0`^Zs)&jx)0|A zYuJ7Bo+~zCQnbd>H~C@XZqK4do$)a%{HT2}0tF;G9tLMx_^6O6&N=_5i?0levg_I& z2I=k^LP|n%=x&e^5a|>ZhDMOik%oa0VU%u3X$k3Y=o~^oxT`}%P!AMHAH9Md5zD;l%0LM{6k(_B2U^!aC}1QFpV0rLik4oAWz+ zUsKsj@h|-I80JEVRSc-Td_*LfT%>w@I*PWB@Rm7g^}fbFL4#<_nd*tkhVUxY#&Bq;VH08FdJo|^p584pV0-=u(Qd~fDH%ZEHlXNUEu(a(wr zPY>rhtkQWsoZu6|O)<(m&YcR=Z*fx+lwu-)WTytSpbhLuohc>v3dfh?aZy-l~wlaX`~*TypuXvTkpCpz}fb_JI=I9;i_ z62irKNwiSt4j<%hs?VTv+IUB>_MD}nw>4vGWXv6ZO}|%KvIfom=1GY_gp}QmGecGu z#iu_MT9y7C;q>(fvMuL`l;lJgE)oKh5Ca&6*r}NofxqwWN4p%=X){=X?Ee1Zo41#n z`z)-@#zDWr%DRT;xe}d1{b^(DTnhwTZOB4QmfLtSZ;S>gR#oM zi|zCqT7&HGt;*B^8kYk(!HPoIJXMbsX3}l!wxHZ6j2lyCf@wm7YUBy+oip_N!L+W7 zBrldCxs;#1RiD~Ttr~(HI76lN2DySC+Vu`ST7e{X=ar?b{i4h|7R?gL%qB0CMXY{t zO|qfmmMebVRU`Q^;_4xDwaWb~n!o=;YcIY%KrUv6;r&_ap8ASl5O1t@$|?imhv(PO z*pdSP-8^@!&nIIvunZFdAN_B&mb^z2NF*kEJRnqtm89=w0zm1_Phl1P_xA*GBO-k? zv=f5+9w(;&bc=E)cusUna;*Z5ipvaDA4TbwmL0rsE(x5Mb2`{NSumURf8{^x=V-Rw zcAAnh_?VdUbai!C*1w`k{R9% zk>OthuYpZhSu==#(lW<=vzLh*pRO2ZXF6B~ub7Q+^a($BF33JFMCjvA>r&jvGCPaj*sfCA@nnOHLo4<<+Bj^KvuFHUZLmW(n=ayukXAYP zgH75G$ zr|Q8rZ)Pl@6aDXEWO@f^+k+4ujzSq#4kt5IuoC(@k%>ux#m|jido$}vB7zr2E@1Ce z1B*keA|8iYlco~GG&egc%U%(l7rafS(tR)W={;M%EoucC+q- z=L~JY#`VJF&Ls{pseJcKK1ouRYVJDQ2s(Z5=QjstVnMkmzZ)>mIoGlec6BmTVv1%i z!vqE?>x?sWOTO#3zMmQ`eZ2E*u6)g(6X3W z{ES+T2EYG`2NN2i8>1h`wjrtaDRU(d#@@FKM#I@xjUFCkx4sF3QVe~a(NL-zpd^;; zu3bQg09 zczwx{%|Z1LNFQq4DLh&>3V+!lnZgzm5&6uo&}ukesG3OoxX{0#u9||(#g>YEG0K|d zcuS+E3(kq`WumGDyejLb>WjY?fz=vfzsxOmZ2CqtJ#8P+$TIOVd{y_NWzHo=INmpv zKG7h)y#8MH$B15qbY;dL61~=LL9b~=*ud{2UT2b)22Xx_z7I`Jbyn>8nUPqVGyaax zVyrs|c z1L|H)6{D3V?an!VoRFiKO^Ky2yq|)}yE)MB9#Q@J$!LOgm4fjaN6_HYPY-G3P>NmQ zugJFcl$2h@dZ?!9qVV3v(RIRdpVHEL(9Aod6&uI11<=me^NQZW2%TS+->43D;i!Vd z@6Th<5-w*+OY2y6oPu^tO#%_!SA?yJ72`f_9a-x;M89F6ML_z%TfWd& zYnV}?aQsmD5pf{{LT-_kAJit|tF%Q$(>@m~L+jX!UvUUqKeSo>biP&%eYGhKu;YNd z%*TUweXzk^?86D);txI8PzE@Q3XBUwB0KGUqpRRUA8a%RL?pBf(*{0{YD_Gla*wAw zOc)4jHI%@oo+PloC4bn3T<8IfvP`=-?KO+M^-okl?~=f{EVlgDIER4Fr3&0HPB_H< zVxi2d6`Yu?6m1+qtr^QpwYmc#p(#+J>NgDa+R>hEoLN0YK_P9KbGE<<)NEOzzUwdp z=g}@Cy+h}h9-Ub+LT$)JQdlI2KA4P4Y%A%QH#828k+p0~BnRu(v7dX1)@hhpS~VHa zD~#$0BzN22uG(IXZLb!ZS=v0u4!yeY#Z4)1J_Z804b2}C5X#-Rm*}QLhz99ywFR?s zl&N9P)TP{~Y_edKDAfy>a1ij{=>iw@Kq+xvc0qA*(PI{KA*?J;wfb;sf#{Sr`=4Lf z8618Lx=N4>h{4QE;cWJfTBSq})Ki^Pjpt&!W4y6e_quM2g!=Rz1oNK`2e8||RybUz zT6dm2W{B*ok{~Dcq!CyD>ISBb$j#V;(#}R>r^TerE>}Urj0q39KkHZ9sI5Q1F5L@2 zJQF`B(zRCVE6Dd3^RzTz04}yL=(WK4(grk%f{elRJ0LYM@R6dpyr1 zd?@SZT)OE?=iN@SLmNjK4dvC6-b+y}UNAz>3>#Y1SNmqIb)%I{niLlvczLAc7*i{b zS+E!j^*a1%))Gk{9ok!&n=_u8G-l0>(KM7uT!FE%Z;jVgc04EeGq^WYG7Xh-mskuq1fE~J*TXmaq53qP0&F#YZu4d(T#noDgdXgmg5 zfPAwGOpzh-OpoU0As_?h@6ayY6T+g3St`9=a*?BmQdhHPi*RnjcQkn7DqkPrZ1DE4 ziNO+Mg385;2Zz1jvW4y1m;?r64X&AN$uqg}<-;e6@n*@yM8DSVyNSQt8q`s-qyEf3 zqA9u=UODq*i((09JNKn>ab##nEa(ffl^T>a+ZlaSYV0nO9I&_Z{z2>ou^3&!hvwNb z7n{s@Oyo&{aSs~?UfcPEBRuy|@mlH%(FKbsXOuhT?Q18v9qA;**x44~rbrj|XPK5M z%PFU=q2IIC0_CA%=R2?3Lv->Tp--f9+04sJeh5P&4NVWT4!y%E%T;f?^>1_;dAik> zN~m1wgq^GfD!$P0c`TV{t%>s>(yoValgD0kh3J-Wc#=@u+xi+d8S85BZ95Zck<0E z$J6|{4`>_EqN)A!Eg~zlhk#Wj4NjP8!~w9f771m!J14mj0lQX&b_dcUX=`Fd4k% z*Tqlt6!pGWul@L_RA4FfF-dLeOix$O-Es zdY$maab;Vkl?T_EU-4u`4oTO~#`8E$q#BlS7h{%Jn51?{5jgpam@C|}BDLK+XQyZp z(p`)W57j5zXKMocIn^aCVm4%4P~5VOsq6FgR;4n&j$DGuB7Ht7$Y`T1-qXqx|7PyS zKK0^VL8{x4OjG1=yq5!FUa9^S!mOYQkz1I-bKS^?Rh=*z!qA39uy`TRfZ}i46=~DV{)wR zrW!;L_NOy073QZn8M%US*|>4}+L;>C^~t&Bnr@lu7IPZXzHECd&J#l!9vlbxCFg*> zWp#T2`L~NbcFgiRQ-`pUnykeFhI7ouc$kj(5%ad;Z{GQC=J7qrgx};>vKo~x)+nQG z$Mc0p$Za=2V2k=YC*cA`Fe)>gUn~RLUToFtpTUw>IajsMO9H>~a61Y+zQ>r1phQ`C#_Ved_D* zqS-)S-Y|6@2moP$HBrSmU$H6Z&Ene=xEQybLQ(TMUxmo$Es%P{YsibT8;l!FixI?YR1hl~))i$zvT_nZO^qZ55Tv5@jKj zMU|%0t(v|t_}TL@{3)yUy^)ihK#yq1mMtsGTDIML*%&WNJnZ~=_HB-uakxx~&bJfQC~Y&)3+oTThuK$ll7ZRH zRrhA@J#o3=yfi3xVHk`Tek&Nx^iY-{^WW*&2;Ilex z`wQMX=SUmtsR#W#m=6-`Kh3M|N0W?}E5!SIA=K}eJkX6fzbdXRuH=gcWOlDkEI<_X zB@)(V6OLx9H{+gaJRBcYUPj@iYKRR5i36^>gG}ex^KAt@Cvhmx^H$ID;QBmGA1wD3 z$T1cO2tfkhM1YI(qjr~ImK)_%9au2TSuS^A>lGL4Z*6};Z@$>q1Yp@=3887#k=3F{ zN>_I8Y1O|8rG*lb+Kni}Dnh(yb_4Q5yu^va$au=Z0WUb8+} zjC_1?(7A0KZYaY>?IoXSU~5#E5yN!J{5-1b52Vf8c(fND=a(UdK-;jrZl0T&BSKhP2Y!hqheDHJ|Qd!^0fbdS#A(m$C;& zl~TuoR4wW&qF>PD&LgDF#AkR%`IY^tW@PQoLV9e`mSxxVp{EU=jnsRdv{_+Z@-rj3 zElfwMcJh&@*frvf?puJFkjP5D67{5`6ELf`Wsa45QYg zx}`AR9t8+M#-l(;5ftyghvp*fP}J8?jt5oy)O1LQKf zQ%g+fkxjSiJ@Y&Dx=$WRW`l&;a3Ejw^I*6l5&bg2EE^;d6pZ}c&jaMKyA|n>$^+WK z5hr9vJP27apon3EJRFb#{W~TO0C4`B=dINB>JF;oN_e{$DKdDF9$4;qYhpvT57L0{ z#u9IbQTp)!0O`NtQoZg#upum@wl@`0aEKK2@2nL70R9Us==UEmE9kHBmcKykfp?&# zAzrLI@;j1rm3{m1ap>DLlJ0g89K}X{LsMh@zs}OnTL(eve;k|)|J3$zZpi>mw_JbWzgAsGx{a!W z{wV`5-}+r{>Duyt`DL Date: Tue, 14 Aug 2018 11:17:35 -0700 Subject: [PATCH 2/6] Remove all APIs that use framework fragments (#206) --- build.gradle | 10 +- .../easypermissions/AppSettingsDialog.java | 15 -- .../easypermissions/EasyPermissions.java | 58 ----- .../easypermissions/PermissionRequest.java | 10 - .../RationaleDialogClickListener.java | 11 +- .../helper/ActivityPermissionHelper.java | 34 ++- .../BaseFrameworkPermissionsHelper.java | 44 ---- ... => FragmentActivityPermissionHelper.java} | 5 +- .../FrameworkFragmentPermissionHelper.java | 42 ---- .../helper/LowApiPermissionsHelper.java | 2 - .../helper/PermissionHelper.java | 15 +- .../AppSettingsDialogTest.java | 78 +----- .../EasyPermissionsLowApiTest.java | 30 +-- .../easypermissions/EasyPermissionsTest.java | 223 ++---------------- .../RationaleDialogClickListenerTest.java | 19 +- .../testhelper/TestFragment.java | 19 +- .../testhelper/TestSupportFragment.java | 54 ----- gradle/wrapper/gradle-wrapper.jar | Bin 54731 -> 54413 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- 19 files changed, 96 insertions(+), 575 deletions(-) delete mode 100644 easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseFrameworkPermissionsHelper.java rename easypermissions/src/main/java/pub/devrel/easypermissions/helper/{AppCompatActivityPermissionHelper.java => FragmentActivityPermissionHelper.java} (81%) delete mode 100644 easypermissions/src/main/java/pub/devrel/easypermissions/helper/FrameworkFragmentPermissionHelper.java delete mode 100644 easypermissions/src/test/java/pub/devrel/easypermissions/testhelper/TestSupportFragment.java diff --git a/build.gradle b/build.gradle index 7a4cb42..ad34e20 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.0.1' + classpath 'com.android.tools.build:gradle:3.2.0-beta05' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4' classpath 'com.dicedmelon.gradle:jacoco-android:0.1.3' } @@ -34,8 +34,8 @@ ext { bintrayOrg = 'easygoogle' - support_library_version = '27.1.1' + support_library_version = '28.0.0-rc01' - compileSdk = 27 - targetSdk = 27 -} \ No newline at end of file + compileSdk = 28 + targetSdk = 28 +} diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/AppSettingsDialog.java b/easypermissions/src/main/java/pub/devrel/easypermissions/AppSettingsDialog.java index 3749145..985f5b2 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/AppSettingsDialog.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/AppSettingsDialog.java @@ -93,8 +93,6 @@ private void setActivityOrFragment(Object activityOrFragment) { mContext = (Activity) activityOrFragment; } else if (activityOrFragment instanceof Fragment) { mContext = ((Fragment) activityOrFragment).getContext(); - } else if (activityOrFragment instanceof android.app.Fragment) { - mContext = ((android.app.Fragment) activityOrFragment).getActivity(); } else { throw new IllegalStateException("Unknown object: " + activityOrFragment); } @@ -105,9 +103,6 @@ private void startForResult(Intent intent) { ((Activity) mActivityOrFragment).startActivityForResult(intent, mRequestCode); } else if (mActivityOrFragment instanceof Fragment) { ((Fragment) mActivityOrFragment).startActivityForResult(intent, mRequestCode); - } else if (mActivityOrFragment instanceof android.app.Fragment) { - ((android.app.Fragment) mActivityOrFragment).startActivityForResult(intent, - mRequestCode); } } @@ -194,16 +189,6 @@ public Builder(@NonNull Fragment fragment) { mContext = fragment.getContext(); } - /** - * Create a new Builder for an {@link AppSettingsDialog}. - * - * @param fragment the {@link android.app.Fragment} in which to display the dialog. - */ - public Builder(@NonNull android.app.Fragment fragment) { - mActivityOrFragment = fragment; - mContext = fragment.getActivity(); - } - /** * Set the dialog theme. */ diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java b/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java index b9885ab..89f8f8c 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java @@ -17,9 +17,7 @@ import android.Manifest; import android.app.Activity; -import android.app.Dialog; import android.content.Context; -import android.content.DialogInterface; import android.content.pm.PackageManager; import android.os.Build; import android.support.annotation.NonNull; @@ -132,20 +130,6 @@ public static void requestPermissions( .build()); } - /** - * Request permissions from a standard Fragment with standard OK/Cancel buttons. - * - * @see #requestPermissions(Activity, String, int, String...) - */ - public static void requestPermissions( - @NonNull android.app.Fragment host, @NonNull String rationale, - int requestCode, @Size(min = 1) @NonNull String... perms) { - requestPermissions( - new PermissionRequest.Builder(host, requestCode, perms) - .setRationale(rationale) - .build()); - } - /** * Request a set of permissions, showing rationale if the system requests it. * @@ -191,23 +175,6 @@ public static void requestPermissions( .build()); } - /** - * @see #requestPermissions(Activity, String, int, int, int, String...) - * @deprecated use {@link #requestPermissions(PermissionRequest)} instead - */ - @Deprecated - public static void requestPermissions( - @NonNull android.app.Fragment host, @NonNull String rationale, - @StringRes int positiveButton, @StringRes int negativeButton, - int requestCode, @Size(min = 1) @NonNull String... perms) { - requestPermissions( - new PermissionRequest.Builder(host, requestCode, perms) - .setRationale(rationale) - .setPositiveButtonText(positiveButton) - .setNegativeButtonText(negativeButton) - .build()); - } - /** * Request a set of permissions. * @@ -317,15 +284,6 @@ public static boolean somePermissionPermanentlyDenied(@NonNull Fragment host, .somePermissionPermanentlyDenied(deniedPermissions); } - /** - * @see #somePermissionPermanentlyDenied(Activity, List). - */ - public static boolean somePermissionPermanentlyDenied(@NonNull android.app.Fragment host, - @NonNull List deniedPermissions) { - return PermissionHelper.newInstance(host) - .somePermissionPermanentlyDenied(deniedPermissions); - } - /** * Check if a permission has been permanently denied (user clicked "Never ask again"). * @@ -346,14 +304,6 @@ public static boolean permissionPermanentlyDenied(@NonNull Fragment host, return PermissionHelper.newInstance(host).permissionPermanentlyDenied(deniedPermission); } - /** - * @see #permissionPermanentlyDenied(Activity, String). - */ - public static boolean permissionPermanentlyDenied(@NonNull android.app.Fragment host, - @NonNull String deniedPermission) { - return PermissionHelper.newInstance(host).permissionPermanentlyDenied(deniedPermission); - } - /** * See if some denied permission has been permanently denied. * @@ -375,14 +325,6 @@ public static boolean somePermissionDenied(@NonNull Fragment host, return PermissionHelper.newInstance(host).somePermissionDenied(perms); } - /** - * @see #somePermissionDenied(Activity, String...) - */ - public static boolean somePermissionDenied(@NonNull android.app.Fragment host, - @NonNull String... perms) { - return PermissionHelper.newInstance(host).somePermissionDenied(perms); - } - /** * Run permission callbacks on an object that requested permissions but already has them by * simulating {@link PackageManager#PERMISSION_GRANTED}. diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java b/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java index a9e4b1a..343d7c6 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/PermissionRequest.java @@ -150,16 +150,6 @@ public Builder(@NonNull Fragment fragment, int requestCode, mPerms = perms; } - /** - * @see #Builder(Activity, int, String...) - */ - public Builder(@NonNull android.app.Fragment fragment, int requestCode, - @NonNull @Size(min = 1) String... perms) { - mHelper = PermissionHelper.newInstance(fragment); - mRequestCode = requestCode; - mPerms = perms; - } - /** * Set the rationale to display to the user if they don't allow your permissions on the * first try. This rationale will be shown as long as the user has denied your permissions diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogClickListener.java b/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogClickListener.java index aadb56e..831f3fa 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogClickListener.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/RationaleDialogClickListener.java @@ -3,7 +3,6 @@ import android.app.Activity; import android.app.Dialog; import android.content.DialogInterface; -import android.os.Build; import android.support.v4.app.Fragment; import java.util.Arrays; @@ -40,13 +39,7 @@ class RationaleDialogClickListener implements Dialog.OnClickListener { EasyPermissions.PermissionCallbacks callbacks, EasyPermissions.RationaleCallbacks dialogCallback) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - mHost = dialogFragment.getParentFragment() != null ? - dialogFragment.getParentFragment() : - dialogFragment.getActivity(); - } else { - mHost = dialogFragment.getActivity(); - } + mHost = dialogFragment.getActivity(); mConfig = config; mCallbacks = callbacks; @@ -63,8 +56,6 @@ public void onClick(DialogInterface dialog, int which) { } if (mHost instanceof Fragment) { PermissionHelper.newInstance((Fragment) mHost).directRequestPermissions(requestCode, permissions); - } else if (mHost instanceof android.app.Fragment) { - PermissionHelper.newInstance((android.app.Fragment) mHost).directRequestPermissions(requestCode, permissions); } else if (mHost instanceof Activity) { PermissionHelper.newInstance((Activity) mHost).directRequestPermissions(requestCode, permissions); } else { diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/ActivityPermissionHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/ActivityPermissionHelper.java index 7be70ff..82442ca 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/ActivityPermissionHelper.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/ActivityPermissionHelper.java @@ -1,25 +1,26 @@ package pub.devrel.easypermissions.helper; import android.app.Activity; +import android.app.Fragment; import android.app.FragmentManager; import android.content.Context; import android.support.annotation.NonNull; +import android.support.annotation.StyleRes; import android.support.v4.app.ActivityCompat; +import android.util.Log; + +import pub.devrel.easypermissions.RationaleDialogFragment; /** * Permissions helper for {@link Activity}. */ -class ActivityPermissionHelper extends BaseFrameworkPermissionsHelper { +class ActivityPermissionHelper extends PermissionHelper { + private static final String TAG = "ActPermissionHelper"; public ActivityPermissionHelper(Activity host) { super(host); } - @Override - public FragmentManager getFragmentManager() { - return getHost().getFragmentManager(); - } - @Override public void directRequestPermissions(int requestCode, @NonNull String... perms) { ActivityCompat.requestPermissions(getHost(), perms, requestCode); @@ -34,4 +35,25 @@ public boolean shouldShowRequestPermissionRationale(@NonNull String perm) { public Context getContext() { return getHost(); } + + @Override + public void showRequestPermissionRationale(@NonNull String rationale, + @NonNull String positiveButton, + @NonNull String negativeButton, + @StyleRes int theme, + int requestCode, + @NonNull String... perms) { + FragmentManager fm = getHost().getFragmentManager(); + + // Check if fragment is already showing + Fragment fragment = fm.findFragmentByTag(RationaleDialogFragment.TAG); + if (fragment instanceof RationaleDialogFragment) { + Log.d(TAG, "Found existing fragment, not showing rationale."); + return; + } + + RationaleDialogFragment + .newInstance(positiveButton, negativeButton, rationale, theme, requestCode, perms) + .showAllowingStateLoss(fm, RationaleDialogFragment.TAG); + } } diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseFrameworkPermissionsHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseFrameworkPermissionsHelper.java deleted file mode 100644 index 243bb74..0000000 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/BaseFrameworkPermissionsHelper.java +++ /dev/null @@ -1,44 +0,0 @@ -package pub.devrel.easypermissions.helper; - -import android.app.FragmentManager; -import android.support.annotation.NonNull; -import android.support.annotation.StyleRes; -import android.app.Fragment; -import android.util.Log; - -import pub.devrel.easypermissions.RationaleDialogFragment; - -/** - * Implementation of {@link PermissionHelper} for framework host classes. - */ -public abstract class BaseFrameworkPermissionsHelper extends PermissionHelper { - - private static final String TAG = "BFPermissionsHelper"; - - public BaseFrameworkPermissionsHelper(@NonNull T host) { - super(host); - } - - public abstract FragmentManager getFragmentManager(); - - @Override - public void showRequestPermissionRationale(@NonNull String rationale, - @NonNull String positiveButton, - @NonNull String negativeButton, - @StyleRes int theme, - int requestCode, - @NonNull String... perms) { - FragmentManager fm = getFragmentManager(); - - // Check if fragment is already showing - Fragment fragment = fm.findFragmentByTag(RationaleDialogFragment.TAG); - if (fragment instanceof RationaleDialogFragment) { - Log.d(TAG, "Found existing fragment, not showing rationale."); - return; - } - - RationaleDialogFragment - .newInstance(positiveButton, negativeButton, rationale, theme, requestCode, perms) - .showAllowingStateLoss(fm, RationaleDialogFragment.TAG); - } -} diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/AppCompatActivityPermissionHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/FragmentActivityPermissionHelper.java similarity index 81% rename from easypermissions/src/main/java/pub/devrel/easypermissions/helper/AppCompatActivityPermissionHelper.java rename to easypermissions/src/main/java/pub/devrel/easypermissions/helper/FragmentActivityPermissionHelper.java index f0a4c62..eb8f4a5 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/AppCompatActivityPermissionHelper.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/FragmentActivityPermissionHelper.java @@ -3,15 +3,16 @@ import android.content.Context; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; +import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; /** * Permissions helper for {@link AppCompatActivity}. */ -class AppCompatActivityPermissionHelper extends BaseSupportPermissionsHelper { +class FragmentActivityPermissionHelper extends BaseSupportPermissionsHelper { - public AppCompatActivityPermissionHelper(AppCompatActivity host) { + public FragmentActivityPermissionHelper(FragmentActivity host) { super(host); } diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/FrameworkFragmentPermissionHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/FrameworkFragmentPermissionHelper.java deleted file mode 100644 index 501a2e9..0000000 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/FrameworkFragmentPermissionHelper.java +++ /dev/null @@ -1,42 +0,0 @@ -package pub.devrel.easypermissions.helper; - -import android.annotation.SuppressLint; -import android.app.Fragment; -import android.app.FragmentManager; -import android.content.Context; -import android.os.Build; -import android.support.annotation.NonNull; -import android.support.annotation.RequiresApi; - -/** - * Permissions helper for {@link Fragment} from the framework. - */ -class FrameworkFragmentPermissionHelper extends BaseFrameworkPermissionsHelper { - - public FrameworkFragmentPermissionHelper(@NonNull Fragment host) { - super(host); - } - - @Override - @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR1) - public FragmentManager getFragmentManager() { - return getHost().getChildFragmentManager(); - } - - @Override - @SuppressLint("NewApi") - public void directRequestPermissions(int requestCode, @NonNull String... perms) { - getHost().requestPermissions(perms, requestCode); - } - - @Override - @SuppressLint("NewApi") - public boolean shouldShowRequestPermissionRationale(@NonNull String perm) { - return getHost().shouldShowRequestPermissionRationale(perm); - } - - @Override - public Context getContext() { - return getHost().getActivity(); - } -} diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/LowApiPermissionsHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/LowApiPermissionsHelper.java index c76ff9f..4d44835 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/LowApiPermissionsHelper.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/LowApiPermissionsHelper.java @@ -40,8 +40,6 @@ public Context getContext() { return (Context) getHost(); } else if (getHost() instanceof Fragment) { return ((Fragment) getHost()).getContext(); - } else if (getHost() instanceof android.app.Fragment) { - return ((android.app.Fragment) getHost()).getActivity(); } else { throw new IllegalStateException("Unknown host: " + getHost()); } diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java index e278120..36875d1 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/helper/PermissionHelper.java @@ -6,7 +6,7 @@ import android.support.annotation.NonNull; import android.support.annotation.StyleRes; import android.support.v4.app.Fragment; -import android.support.v7.app.AppCompatActivity; +import android.support.v4.app.FragmentActivity; import java.util.List; @@ -23,8 +23,8 @@ public static PermissionHelper newInstance(Activity host) { return new LowApiPermissionsHelper<>(host); } - if (host instanceof AppCompatActivity) - return new AppCompatActivityPermissionHelper((AppCompatActivity) host); + if (host instanceof FragmentActivity) + return new FragmentActivityPermissionHelper((FragmentActivity) host); else { return new ActivityPermissionHelper(host); } @@ -39,15 +39,6 @@ public static PermissionHelper newInstance(Fragment host) { return new SupportFragmentPermissionHelper(host); } - @NonNull - public static PermissionHelper newInstance(android.app.Fragment host) { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { - return new LowApiPermissionsHelper<>(host); - } - - return new FrameworkFragmentPermissionHelper(host); - } - // ============================================================================ // Public concrete methods // ============================================================================ diff --git a/easypermissions/src/test/java/pub/devrel/easypermissions/AppSettingsDialogTest.java b/easypermissions/src/test/java/pub/devrel/easypermissions/AppSettingsDialogTest.java index 6d78add..d36a2b3 100644 --- a/easypermissions/src/test/java/pub/devrel/easypermissions/AppSettingsDialogTest.java +++ b/easypermissions/src/test/java/pub/devrel/easypermissions/AppSettingsDialogTest.java @@ -18,7 +18,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.android.controller.ActivityController; -import org.robolectric.android.controller.FragmentController; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; import org.robolectric.shadows.ShadowIntent; @@ -28,7 +27,6 @@ import pub.devrel.easypermissions.testhelper.TestActivity; import pub.devrel.easypermissions.testhelper.TestFragment; -import pub.devrel.easypermissions.testhelper.TestSupportFragment; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -49,10 +47,8 @@ public class AppSettingsDialogTest { private ShadowApplication shadowApp; private TestActivity spyActivity; private TestFragment spyFragment; - private TestSupportFragment spySupportFragment; private ActivityController activityController; - private FragmentController fragmentController; - private SupportFragmentController supportFragmentController; + private SupportFragmentController fragmentController; @Mock private DialogInterface.OnClickListener positiveListener; @Mock @@ -132,10 +128,8 @@ public void shouldNegativeListener_whenClickingPositiveButtonFromActivity() { .onClick(any(DialogInterface.class), anyInt()); } - // ------ From Fragment ------ - @Test - public void shouldShowExpectedSettingsDialog_whenBuildingFromFragment() { + public void shouldShowExpectedSettingsDialog_whenBuildingFromSupportFragment() { new AppSettingsDialog.Builder(spyFragment) .setTitle(android.R.string.dialog_alert_title) .setRationale(android.R.string.unknownName) @@ -156,67 +150,9 @@ public void shouldShowExpectedSettingsDialog_whenBuildingFromFragment() { assertThat(shadowIntent.getIntentClass()).isEqualTo(AppSettingsDialogHolderActivity.class); } - @Test - public void shouldPositiveListener_whenClickingPositiveButtonFromFragment() { - AlertDialog alertDialog = new AppSettingsDialog.Builder(spyFragment) - .setTitle(TITLE) - .setRationale(RATIONALE) - .setPositiveButton(POSITIVE) - .setNegativeButton(NEGATIVE) - .setThemeResId(R.style.Theme_AppCompat) - .build() - .showDialog(positiveListener, negativeListener); - Button positive = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE); - positive.performClick(); - - verify(positiveListener, times(1)) - .onClick(any(DialogInterface.class), anyInt()); - } - - @Test - public void shouldNegativeListener_whenClickingPositiveButtonFromFragment() { - AlertDialog alertDialog = new AppSettingsDialog.Builder(spyFragment) - .setTitle(TITLE) - .setRationale(RATIONALE) - .setPositiveButton(POSITIVE) - .setNegativeButton(NEGATIVE) - .setThemeResId(R.style.Theme_AppCompat) - .build() - .showDialog(positiveListener, negativeListener); - Button positive = alertDialog.getButton(AlertDialog.BUTTON_NEGATIVE); - positive.performClick(); - - verify(negativeListener, times(1)) - .onClick(any(DialogInterface.class), anyInt()); - } - - // ------ From Support Fragment ------ - - @Test - public void shouldShowExpectedSettingsDialog_whenBuildingFromSupportFragment() { - new AppSettingsDialog.Builder(spySupportFragment) - .setTitle(android.R.string.dialog_alert_title) - .setRationale(android.R.string.unknownName) - .setPositiveButton(android.R.string.ok) - .setNegativeButton(android.R.string.cancel) - .setThemeResId(R.style.Theme_AppCompat) - .build() - .show(); - - verify(spySupportFragment, times(1)) - .startActivityForResult(intentCaptor.capture(), integerCaptor.capture()); - assertThat(integerCaptor.getValue()).isEqualTo(DEFAULT_SETTINGS_REQ_CODE); - assertThat(Objects.requireNonNull(intentCaptor.getValue().getComponent()).getClassName()) - .isEqualTo(AppSettingsDialogHolderActivity.class.getName()); - - Intent startedIntent = shadowApp.getNextStartedActivity(); - ShadowIntent shadowIntent = shadowOf(startedIntent); - assertThat(shadowIntent.getIntentClass()).isEqualTo(AppSettingsDialogHolderActivity.class); - } - @Test public void shouldPositiveListener_whenClickingPositiveButtonFromSupportFragment() { - AlertDialog alertDialog = new AppSettingsDialog.Builder(spySupportFragment) + AlertDialog alertDialog = new AppSettingsDialog.Builder(spyFragment) .setTitle(TITLE) .setRationale(RATIONALE) .setPositiveButton(POSITIVE) @@ -233,7 +169,7 @@ public void shouldPositiveListener_whenClickingPositiveButtonFromSupportFragment @Test public void shouldNegativeListener_whenClickingPositiveButtonFromSupportFragment() { - AlertDialog alertDialog = new AppSettingsDialog.Builder(spySupportFragment) + AlertDialog alertDialog = new AppSettingsDialog.Builder(spyFragment) .setTitle(TITLE) .setRationale(RATIONALE) .setPositiveButton(POSITIVE) @@ -251,19 +187,15 @@ public void shouldNegativeListener_whenClickingPositiveButtonFromSupportFragment private void setUpActivityAndFragment() { activityController = Robolectric.buildActivity(TestActivity.class) .create().start().resume(); - fragmentController = Robolectric.buildFragment(TestFragment.class) - .create().start().resume(); - supportFragmentController = SupportFragmentController.of(new TestSupportFragment()) + fragmentController = SupportFragmentController.of(new TestFragment()) .create().start().resume(); spyActivity = Mockito.spy(activityController.get()); spyFragment = Mockito.spy(fragmentController.get()); - spySupportFragment = Mockito.spy(supportFragmentController.get()); } private void tearDownActivityAndFragment() { activityController.pause().stop().destroy(); fragmentController.pause().stop().destroy(); - supportFragmentController.pause().stop().destroy(); } } diff --git a/easypermissions/src/test/java/pub/devrel/easypermissions/EasyPermissionsLowApiTest.java b/easypermissions/src/test/java/pub/devrel/easypermissions/EasyPermissionsLowApiTest.java index 6d161a3..7fd93c4 100644 --- a/easypermissions/src/test/java/pub/devrel/easypermissions/EasyPermissionsLowApiTest.java +++ b/easypermissions/src/test/java/pub/devrel/easypermissions/EasyPermissionsLowApiTest.java @@ -14,7 +14,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.android.controller.ActivityController; -import org.robolectric.android.controller.FragmentController; import org.robolectric.annotation.Config; import org.robolectric.shadows.support.v4.SupportFragmentController; @@ -23,7 +22,6 @@ import pub.devrel.easypermissions.testhelper.TestActivity; import pub.devrel.easypermissions.testhelper.TestFragment; import pub.devrel.easypermissions.testhelper.TestSupportActivity; -import pub.devrel.easypermissions.testhelper.TestSupportFragment; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.times; @@ -43,11 +41,9 @@ public class EasyPermissionsLowApiTest { private TestActivity spyActivity; private TestSupportActivity spySupportActivity; private TestFragment spyFragment; - private TestSupportFragment spySupportFragment; private ActivityController activityController; private ActivityController supportActivityController; - private FragmentController fragmentController; - private SupportFragmentController supportFragmentController; + private SupportFragmentController supportController; @Captor private ArgumentCaptor integerCaptor; @Captor @@ -96,8 +92,6 @@ public void shouldCallbackOnPermissionGranted_whenRequestFromSupportActivity() { assertThat(listCaptor.getValue()).containsAllIn(ALL_PERMS); } - // ------ From Fragment ------ - @Test public void shouldCallbackOnPermissionGranted_whenRequestFromFragment() { EasyPermissions.requestPermissions(spyFragment, RATIONALE, TestFragment.REQUEST_CODE, ALL_PERMS); @@ -108,38 +102,22 @@ public void shouldCallbackOnPermissionGranted_whenRequestFromFragment() { assertThat(listCaptor.getValue()).containsAllIn(ALL_PERMS); } - // ------ From Support Fragment ------ - - @Test - public void shouldCallbackOnPermissionGranted_whenRequestFromSupportedFragment() { - EasyPermissions.requestPermissions(spySupportFragment, RATIONALE, TestSupportFragment.REQUEST_CODE, ALL_PERMS); - - verify(spySupportFragment, times(1)) - .onPermissionsGranted(integerCaptor.capture(), listCaptor.capture()); - assertThat(integerCaptor.getValue()).isEqualTo(TestSupportFragment.REQUEST_CODE); - assertThat(listCaptor.getValue()).containsAllIn(ALL_PERMS); - } - private void setUpActivityAndFragment() { activityController = Robolectric.buildActivity(TestActivity.class) .create().start().resume(); supportActivityController = Robolectric.buildActivity(TestSupportActivity.class) .create().start().resume(); - fragmentController = Robolectric.buildFragment(TestFragment.class) - .create().start().resume(); - supportFragmentController = SupportFragmentController.of(new TestSupportFragment()) + supportController = SupportFragmentController.of(new TestFragment()) .create().start().resume(); spyActivity = Mockito.spy(activityController.get()); spySupportActivity = Mockito.spy(supportActivityController.get()); - spyFragment = Mockito.spy(fragmentController.get()); - spySupportFragment = Mockito.spy(supportFragmentController.get()); + spyFragment = Mockito.spy(supportController.get()); } private void tearDownActivityAndFragment() { activityController.pause().stop().destroy(); supportActivityController.pause().stop().destroy(); - fragmentController.pause().stop().destroy(); - supportFragmentController.pause().stop().destroy(); + supportController.pause().stop().destroy(); } } diff --git a/easypermissions/src/test/java/pub/devrel/easypermissions/EasyPermissionsTest.java b/easypermissions/src/test/java/pub/devrel/easypermissions/EasyPermissionsTest.java index e610e00..6339757 100644 --- a/easypermissions/src/test/java/pub/devrel/easypermissions/EasyPermissionsTest.java +++ b/easypermissions/src/test/java/pub/devrel/easypermissions/EasyPermissionsTest.java @@ -19,7 +19,6 @@ import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.android.controller.ActivityController; -import org.robolectric.android.controller.FragmentController; import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowApplication; import org.robolectric.shadows.support.v4.SupportFragmentController; @@ -31,7 +30,6 @@ import pub.devrel.easypermissions.testhelper.TestActivity; import pub.devrel.easypermissions.testhelper.TestFragment; import pub.devrel.easypermissions.testhelper.TestSupportActivity; -import pub.devrel.easypermissions.testhelper.TestSupportFragment; import static com.google.common.truth.Truth.assertThat; import static junit.framework.Assert.fail; @@ -61,11 +59,9 @@ public class EasyPermissionsTest { private TestActivity spyActivity; private TestSupportActivity spySupportActivity; private TestFragment spyFragment; - private TestSupportFragment spySupportFragment; private ActivityController activityController; private ActivityController supportActivityController; - private FragmentController fragmentController; - private SupportFragmentController supportFragmentController; + private SupportFragmentController fragmentController; @Captor private ArgumentCaptor integerCaptor; @Captor @@ -434,11 +430,10 @@ public void shouldNotHavePermissionPermanentlyDenied_whenShowRationaleFromSuppor assertThat(EasyPermissions.permissionPermanentlyDenied(spySupportActivity, Manifest.permission.READ_SMS)).isFalse(); } - // ------ From Fragment ------ - @Test public void shouldCorrectlyCallback_whenOnRequestPermissionResultCalledFromFragment() { - EasyPermissions.onRequestPermissionsResult(TestFragment.REQUEST_CODE, ALL_PERMS, SMS_DENIED_RESULT, spyFragment); + EasyPermissions.onRequestPermissionsResult(TestFragment.REQUEST_CODE, ALL_PERMS, SMS_DENIED_RESULT, + spyFragment); verify(spyFragment, times(1)) .onPermissionsGranted(integerCaptor.capture(), listCaptor.capture()); @@ -459,7 +454,8 @@ public void shouldCorrectlyCallback_whenOnRequestPermissionResultCalledFromFragm public void shouldCallbackOnPermissionGranted_whenRequestAlreadyGrantedPermissionsFromFragment() { grantPermissions(ALL_PERMS); - EasyPermissions.requestPermissions(spyFragment, RATIONALE, TestFragment.REQUEST_CODE, ALL_PERMS); + EasyPermissions.requestPermissions(spyFragment, RATIONALE, + TestFragment.REQUEST_CODE, ALL_PERMS); verify(spyFragment, times(1)) .onPermissionsGranted(integerCaptor.capture(), listCaptor.capture()); @@ -469,7 +465,7 @@ public void shouldCallbackOnPermissionGranted_whenRequestAlreadyGrantedPermissio } @Test - public void shouldCallbackAfterPermissionGranted_whenRequestAlreadyGrantedPermissionsFromFragment() { + public void shouldCallbackAfterPermissionGranted_whenRequestAlreadyGrantedPermissionsFragment() { grantPermissions(ALL_PERMS); EasyPermissions.requestPermissions(spyFragment, RATIONALE, TestFragment.REQUEST_CODE, ALL_PERMS); @@ -498,21 +494,6 @@ public void shouldRequestPermissions_whenMissingPermissionsAndNotShowRationaleFr .requestPermissions(ALL_PERMS, TestFragment.REQUEST_CODE); } - @Test - public void shouldShowCorrectDialog_whenMissingPermissionsAndShowRationaleFromFragment() { - grantPermissions(ONE_PERM); - showRationale(true, ALL_PERMS); - - EasyPermissions.requestPermissions(spyFragment, RATIONALE, TestFragment.REQUEST_CODE, ALL_PERMS); - - Fragment dialogFragment = spyFragment.getChildFragmentManager() - .findFragmentByTag(RationaleDialogFragment.TAG); - assertThat(dialogFragment).isInstanceOf(RationaleDialogFragment.class); - - Dialog dialog = ((RationaleDialogFragment) dialogFragment).getDialog(); - assertThatHasExpectedRationale(dialog, RATIONALE); - } - @SuppressWarnings("deprecation") @Test public void shouldShowCorrectDialogUsingDeprecated_whenMissingPermissionsAndShowRationaleFromFragment() { @@ -522,154 +503,7 @@ public void shouldShowCorrectDialogUsingDeprecated_whenMissingPermissionsAndShow EasyPermissions.requestPermissions(spyFragment, RATIONALE, android.R.string.ok, android.R.string.cancel, TestFragment.REQUEST_CODE, ALL_PERMS); - Fragment dialogFragment = spyFragment.getChildFragmentManager() - .findFragmentByTag(RationaleDialogFragment.TAG); - assertThat(dialogFragment).isInstanceOf(RationaleDialogFragment.class); - - Dialog dialog = ((RationaleDialogFragment) dialogFragment).getDialog(); - assertThatHasExpectedButtonsAndRationale(dialog, RATIONALE, - android.R.string.ok, android.R.string.cancel); - } - - @Test - public void shouldShowCorrectDialogUsingRequest_whenMissingPermissionsAndShowRationaleFromFragment() { - grantPermissions(ONE_PERM); - showRationale(true, ALL_PERMS); - - PermissionRequest request = new PermissionRequest.Builder(spyFragment, TestFragment.REQUEST_CODE, ALL_PERMS) - .setPositiveButtonText(android.R.string.ok) - .setNegativeButtonText(android.R.string.cancel) - .setRationale(android.R.string.unknownName) - .setTheme(R.style.Theme_AppCompat) - .build(); - EasyPermissions.requestPermissions(request); - - Fragment dialogFragment = spyFragment.getChildFragmentManager() - .findFragmentByTag(RationaleDialogFragment.TAG); - assertThat(dialogFragment).isInstanceOf(RationaleDialogFragment.class); - - Dialog dialog = ((RationaleDialogFragment) dialogFragment).getDialog(); - assertThatHasExpectedButtonsAndRationale(dialog, android.R.string.unknownName, - android.R.string.ok, android.R.string.cancel); - } - - @Test - public void shouldHaveSomePermissionDenied_whenShowRationaleFromFragment() { - showRationale(true, ALL_PERMS); - - assertThat(EasyPermissions.somePermissionDenied(spyFragment, ALL_PERMS)).isTrue(); - } - - @Test - public void shouldNotHaveSomePermissionDenied_whenNotShowRationaleFromFragment() { - showRationale(false, ALL_PERMS); - - assertThat(EasyPermissions.somePermissionDenied(spyFragment, ALL_PERMS)).isFalse(); - } - - @Test - public void shouldHaveSomePermissionPermanentlyDenied_whenNotShowRationaleFromFragment() { - showRationale(false, ALL_PERMS); - - assertThat(EasyPermissions.somePermissionPermanentlyDenied(spyFragment, Arrays.asList(ALL_PERMS))).isTrue(); - } - - @Test - public void shouldNotHaveSomePermissionPermanentlyDenied_whenShowRationaleFromFragment() { - showRationale(true, ALL_PERMS); - - assertThat(EasyPermissions.somePermissionPermanentlyDenied(spyFragment, Arrays.asList(ALL_PERMS))).isFalse(); - } - - @Test - public void shouldHavePermissionPermanentlyDenied_whenNotShowRationaleFromFragment() { - showRationale(false, Manifest.permission.READ_SMS); - - assertThat(EasyPermissions.permissionPermanentlyDenied(spyFragment, Manifest.permission.READ_SMS)).isTrue(); - } - - @Test - public void shouldNotHavePermissionPermanentlyDenied_whenShowRationaleFromFragment() { - showRationale(true, Manifest.permission.READ_SMS); - - assertThat(EasyPermissions.permissionPermanentlyDenied(spyFragment, Manifest.permission.READ_SMS)).isFalse(); - } - - // ------ From Support Fragment ------ - - @Test - public void shouldCorrectlyCallback_whenOnRequestPermissionResultCalledFromSupportFragment() { - EasyPermissions.onRequestPermissionsResult(TestSupportFragment.REQUEST_CODE, ALL_PERMS, SMS_DENIED_RESULT, spySupportFragment); - - verify(spySupportFragment, times(1)) - .onPermissionsGranted(integerCaptor.capture(), listCaptor.capture()); - assertThat(integerCaptor.getValue()).isEqualTo(TestSupportFragment.REQUEST_CODE); - assertThat(listCaptor.getValue()) - .containsAllIn(new ArrayList<>(Collections.singletonList(Manifest.permission.ACCESS_FINE_LOCATION))); - - verify(spySupportFragment, times(1)) - .onPermissionsDenied(integerCaptor.capture(), listCaptor.capture()); - assertThat(integerCaptor.getValue()).isEqualTo(TestSupportFragment.REQUEST_CODE); - assertThat(listCaptor.getValue()) - .containsAllIn(new ArrayList<>(Collections.singletonList(Manifest.permission.READ_SMS))); - - verify(spySupportFragment, never()).afterPermissionGranted(); - } - - @Test - public void shouldCallbackOnPermissionGranted_whenRequestAlreadyGrantedPermissionsFromSupportFragment() { - grantPermissions(ALL_PERMS); - - EasyPermissions.requestPermissions(spySupportFragment, RATIONALE, - TestSupportFragment.REQUEST_CODE, ALL_PERMS); - - verify(spySupportFragment, times(1)) - .onPermissionsGranted(integerCaptor.capture(), listCaptor.capture()); - verify(spySupportFragment, never()).requestPermissions(any(String[].class), anyInt()); - assertThat(integerCaptor.getValue()).isEqualTo(TestSupportFragment.REQUEST_CODE); - assertThat(listCaptor.getValue()).containsAllIn(ALL_PERMS); - } - - @Test - public void shouldCallbackAfterPermissionGranted_whenRequestAlreadyGrantedPermissionsSupportFragment() { - grantPermissions(ALL_PERMS); - - EasyPermissions.requestPermissions(spySupportFragment, RATIONALE, TestSupportFragment.REQUEST_CODE, ALL_PERMS); - - // Called 2 times because this is a spy and library implementation invokes super classes annotated methods as well - verify(spySupportFragment, times(2)).afterPermissionGranted(); - } - - @Test - public void shouldNotCallbackAfterPermissionGranted_whenRequestNotGrantedPermissionsFromSupportFragment() { - grantPermissions(ONE_PERM); - - EasyPermissions.requestPermissions(spySupportFragment, RATIONALE, TestSupportFragment.REQUEST_CODE, ALL_PERMS); - - verify(spySupportFragment, never()).afterPermissionGranted(); - } - - @Test - public void shouldRequestPermissions_whenMissingPermissionsAndNotShowRationaleFromSupportFragment() { - grantPermissions(ONE_PERM); - showRationale(false, ALL_PERMS); - - EasyPermissions.requestPermissions(spySupportFragment, RATIONALE, TestSupportFragment.REQUEST_CODE, ALL_PERMS); - - verify(spySupportFragment, times(1)) - .requestPermissions(ALL_PERMS, TestSupportFragment.REQUEST_CODE); - } - - @SuppressWarnings("deprecation") - @Test - public void shouldShowCorrectDialogUsingDeprecated_whenMissingPermissionsAndShowRationaleFromSupportFragment() { - grantPermissions(ONE_PERM); - showRationale(true, ALL_PERMS); - - EasyPermissions.requestPermissions(spySupportFragment, RATIONALE, android.R.string.ok, - android.R.string.cancel, TestSupportFragment.REQUEST_CODE, ALL_PERMS); - - android.support.v4.app.Fragment dialogFragment = spySupportFragment.getChildFragmentManager() + android.support.v4.app.Fragment dialogFragment = spyFragment.getChildFragmentManager() .findFragmentByTag(RationaleDialogFragmentCompat.TAG); assertThat(dialogFragment).isInstanceOf(RationaleDialogFragmentCompat.class); @@ -679,13 +513,13 @@ public void shouldShowCorrectDialogUsingDeprecated_whenMissingPermissionsAndShow } @Test - public void shouldShowCorrectDialog_whenMissingPermissionsAndShowRationaleFromSupportFragment() { + public void shouldShowCorrectDialog_whenMissingPermissionsAndShowRationaleFromFragment() { grantPermissions(ONE_PERM); showRationale(true, ALL_PERMS); - EasyPermissions.requestPermissions(spySupportFragment, RATIONALE, TestSupportFragment.REQUEST_CODE, ALL_PERMS); + EasyPermissions.requestPermissions(spyFragment, RATIONALE, TestFragment.REQUEST_CODE, ALL_PERMS); - android.support.v4.app.Fragment dialogFragment = spySupportFragment.getChildFragmentManager() + android.support.v4.app.Fragment dialogFragment = spyFragment.getChildFragmentManager() .findFragmentByTag(RationaleDialogFragmentCompat.TAG); assertThat(dialogFragment).isInstanceOf(RationaleDialogFragmentCompat.class); @@ -694,11 +528,11 @@ public void shouldShowCorrectDialog_whenMissingPermissionsAndShowRationaleFromSu } @Test - public void shouldShowCorrectDialogUsingRequest_whenMissingPermissionsAndShowRationaleFromSupportFragment() { + public void shouldShowCorrectDialogUsingRequest_whenMissingPermissionsAndShowRationaleFromFragment() { grantPermissions(ONE_PERM); showRationale(true, ALL_PERMS); - PermissionRequest request = new PermissionRequest.Builder(spySupportFragment, TestSupportFragment.REQUEST_CODE, ALL_PERMS) + PermissionRequest request = new PermissionRequest.Builder(spyFragment, TestFragment.REQUEST_CODE, ALL_PERMS) .setPositiveButtonText(POSITIVE) .setNegativeButtonText(NEGATIVE) .setRationale(RATIONALE) @@ -706,7 +540,7 @@ public void shouldShowCorrectDialogUsingRequest_whenMissingPermissionsAndShowRat .build(); EasyPermissions.requestPermissions(request); - android.support.v4.app.Fragment dialogFragment = spySupportFragment.getChildFragmentManager() + android.support.v4.app.Fragment dialogFragment = spyFragment.getChildFragmentManager() .findFragmentByTag(RationaleDialogFragmentCompat.TAG); assertThat(dialogFragment).isInstanceOf(RationaleDialogFragmentCompat.class); @@ -715,46 +549,46 @@ public void shouldShowCorrectDialogUsingRequest_whenMissingPermissionsAndShowRat } @Test - public void shouldHaveSomePermissionDenied_whenShowRationaleFromSupportFragment() { + public void shouldHaveSomePermissionDenied_whenShowRationaleFromFragment() { showRationale(true, ALL_PERMS); - assertThat(EasyPermissions.somePermissionDenied(spySupportFragment, ALL_PERMS)).isTrue(); + assertThat(EasyPermissions.somePermissionDenied(spyFragment, ALL_PERMS)).isTrue(); } @Test - public void shouldNotHaveSomePermissionDenied_whenNotShowRationaleFromSupportFragment() { + public void shouldNotHaveSomePermissionDenied_whenNotShowRationaleFromFragment() { showRationale(false, ALL_PERMS); - assertThat(EasyPermissions.somePermissionDenied(spySupportFragment, ALL_PERMS)).isFalse(); + assertThat(EasyPermissions.somePermissionDenied(spyFragment, ALL_PERMS)).isFalse(); } @Test - public void shouldHaveSomePermissionPermanentlyDenied_whenNotShowRationaleFromSupportFragment() { + public void shouldHaveSomePermissionPermanentlyDenied_whenNotShowRationaleFromFragment() { showRationale(false, ALL_PERMS); - assertThat(EasyPermissions.somePermissionPermanentlyDenied(spySupportFragment, Arrays.asList(ALL_PERMS))).isTrue(); + assertThat(EasyPermissions.somePermissionPermanentlyDenied(spyFragment, Arrays.asList(ALL_PERMS))).isTrue(); } @Test - public void shouldNotHaveSomePermissionPermanentlyDenied_whenShowRationaleFromSupportFragment() { + public void shouldNotHaveSomePermissionPermanentlyDenied_whenShowRationaleFromFragment() { showRationale(true, ALL_PERMS); - assertThat(EasyPermissions.somePermissionPermanentlyDenied(spySupportFragment, Arrays.asList(ALL_PERMS))).isFalse(); + assertThat(EasyPermissions.somePermissionPermanentlyDenied(spyFragment, Arrays.asList(ALL_PERMS))).isFalse(); } @Test - public void shouldHavePermissionPermanentlyDenied_whenNotShowRationaleFromSupportFragment() { + public void shouldHavePermissionPermanentlyDenied_whenNotShowRationaleFromFragment() { showRationale(false, Manifest.permission.READ_SMS); - assertThat(EasyPermissions.permissionPermanentlyDenied(spySupportFragment, Manifest.permission.READ_SMS)).isTrue(); + assertThat(EasyPermissions.permissionPermanentlyDenied(spyFragment, Manifest.permission.READ_SMS)).isTrue(); } @Test - public void shouldNotHavePermissionPermanentlyDenied_whenShowRationaleFromSupportFragment() { + public void shouldNotHavePermissionPermanentlyDenied_whenShowRationaleFromFragment() { showRationale(true, Manifest.permission.READ_SMS); - assertThat(EasyPermissions.permissionPermanentlyDenied(spySupportFragment, Manifest.permission.READ_SMS)).isFalse(); + assertThat(EasyPermissions.permissionPermanentlyDenied(spyFragment, Manifest.permission.READ_SMS)).isFalse(); } private void assertThatHasExpectedButtonsAndRationale(Dialog dialog, int rationale, @@ -797,22 +631,18 @@ private void setUpActivityAndFragment() { .create().start().resume(); supportActivityController = Robolectric.buildActivity(TestSupportActivity.class) .create().start().resume(); - fragmentController = Robolectric.buildFragment(TestFragment.class) - .create().start().resume(); - supportFragmentController = SupportFragmentController.of(new TestSupportFragment()) + fragmentController = SupportFragmentController.of(new TestFragment()) .create().start().resume(); spyActivity = Mockito.spy(activityController.get()); spySupportActivity = Mockito.spy(supportActivityController.get()); spyFragment = Mockito.spy(fragmentController.get()); - spySupportFragment = Mockito.spy(supportFragmentController.get()); } private void tearDownActivityAndFragment() { activityController.pause().stop().destroy(); supportActivityController.pause().stop().destroy(); fragmentController.pause().stop().destroy(); - supportFragmentController.pause().stop().destroy(); } private void grantPermissions(String[] perms) { @@ -824,7 +654,6 @@ private void showRationale(boolean show, String... perms) { when(spyActivity.shouldShowRequestPermissionRationale(perm)).thenReturn(show); when(spySupportActivity.shouldShowRequestPermissionRationale(perm)).thenReturn(show); when(spyFragment.shouldShowRequestPermissionRationale(perm)).thenReturn(show); - when(spySupportFragment.shouldShowRequestPermissionRationale(perm)).thenReturn(show); } } } diff --git a/easypermissions/src/test/java/pub/devrel/easypermissions/RationaleDialogClickListenerTest.java b/easypermissions/src/test/java/pub/devrel/easypermissions/RationaleDialogClickListenerTest.java index a6f1b1c..4eadd9f 100644 --- a/easypermissions/src/test/java/pub/devrel/easypermissions/RationaleDialogClickListenerTest.java +++ b/easypermissions/src/test/java/pub/devrel/easypermissions/RationaleDialogClickListenerTest.java @@ -3,8 +3,8 @@ import android.Manifest; import android.app.Activity; import android.app.Dialog; -import android.app.Fragment; import android.content.DialogInterface; +import android.support.v4.app.Fragment; import org.junit.Before; import org.junit.Test; @@ -46,8 +46,6 @@ public class RationaleDialogClickListenerTest { private Activity activity; @Mock private Fragment fragment; - @Mock - private android.support.v4.app.Fragment supportFragment; @Before public void setUp() { @@ -87,24 +85,13 @@ public void shouldRequestPermissions_whenPositiveButtonFromActivity() { @Test public void shouldRequestPermissions_whenPositiveButtonFromFragment() { - when(dialogFragment.getParentFragment()).thenReturn(fragment); - - RationaleDialogClickListener listener = new RationaleDialogClickListener(dialogFragment, dialogConfig, - permissionCallbacks, rationaleCallbacks); - listener.onClick(dialogInterface, Dialog.BUTTON_POSITIVE); - - verify(fragment, times(1)).requestPermissions(PERMS, REQUEST_CODE); - } - - @Test - public void shouldRequestPermissions_whenPositiveButtonFromSupportFragment() { - when(dialogFragmentCompat.getParentFragment()).thenReturn(supportFragment); + when(dialogFragmentCompat.getParentFragment()).thenReturn(fragment); RationaleDialogClickListener listener = new RationaleDialogClickListener(dialogFragmentCompat, dialogConfig, permissionCallbacks, rationaleCallbacks); listener.onClick(dialogInterface, Dialog.BUTTON_POSITIVE); - verify(supportFragment, times(1)).requestPermissions(PERMS, REQUEST_CODE); + verify(fragment, times(1)).requestPermissions(PERMS, REQUEST_CODE); } @Test diff --git a/easypermissions/src/test/java/pub/devrel/easypermissions/testhelper/TestFragment.java b/easypermissions/src/test/java/pub/devrel/easypermissions/testhelper/TestFragment.java index 4953c0b..e6bfed7 100644 --- a/easypermissions/src/test/java/pub/devrel/easypermissions/testhelper/TestFragment.java +++ b/easypermissions/src/test/java/pub/devrel/easypermissions/testhelper/TestFragment.java @@ -1,17 +1,32 @@ package pub.devrel.easypermissions.testhelper; -import android.app.Fragment; +import android.os.Bundle; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; import java.util.List; import pub.devrel.easypermissions.AfterPermissionGranted; import pub.devrel.easypermissions.EasyPermissions; +import pub.devrel.easypermissions.R; public class TestFragment extends Fragment implements EasyPermissions.PermissionCallbacks, EasyPermissions.RationaleCallbacks { - public static final int REQUEST_CODE = 2; + public static final int REQUEST_CODE = 4; + + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, + @Nullable ViewGroup container, + @Nullable Bundle savedInstanceState) { + getContext().getTheme().applyStyle(R.style.Theme_AppCompat, true); + return super.onCreateView(inflater, container, savedInstanceState); + } @Override public void onPermissionsGranted(int requestCode, @NonNull List perms) { diff --git a/easypermissions/src/test/java/pub/devrel/easypermissions/testhelper/TestSupportFragment.java b/easypermissions/src/test/java/pub/devrel/easypermissions/testhelper/TestSupportFragment.java deleted file mode 100644 index a9d9633..0000000 --- a/easypermissions/src/test/java/pub/devrel/easypermissions/testhelper/TestSupportFragment.java +++ /dev/null @@ -1,54 +0,0 @@ -package pub.devrel.easypermissions.testhelper; - - -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import java.util.List; - -import pub.devrel.easypermissions.AfterPermissionGranted; -import pub.devrel.easypermissions.EasyPermissions; -import pub.devrel.easypermissions.R; - -public class TestSupportFragment extends Fragment - implements EasyPermissions.PermissionCallbacks, EasyPermissions.RationaleCallbacks { - - public static final int REQUEST_CODE = 4; - - @Nullable - @Override - public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - getContext().getTheme().applyStyle(R.style.Theme_AppCompat, true); - return super.onCreateView(inflater, container, savedInstanceState); - } - - @Override - public void onPermissionsGranted(int requestCode, @NonNull List perms) { - - } - - @Override - public void onPermissionsDenied(int requestCode, @NonNull List perms) { - - } - - @AfterPermissionGranted(REQUEST_CODE) - public void afterPermissionGranted() { - - } - - @Override - public void onRationaleAccepted(int requestCode) { - - } - - @Override - public void onRationaleDenied(int requestCode) { - - } -} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 6b6ea3ab4ff4f69d55c5fd9c0a6ac70f47d41008..0d4a9516871afd710a9d84d89e31ba77745607bd 100644 GIT binary patch delta 23079 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 Date: Tue, 14 Aug 2018 11:36:27 -0700 Subject: [PATCH 3/6] Remove last deprecated methods Signed-off-by: Alex Saveau --- .../easypermissions/EasyPermissions.java | 46 ------------------- 1 file changed, 46 deletions(-) diff --git a/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java b/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java index 89f8f8c..26fb945 100644 --- a/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java +++ b/easypermissions/src/main/java/pub/devrel/easypermissions/EasyPermissions.java @@ -22,7 +22,6 @@ import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Size; -import android.support.annotation.StringRes; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.content.ContextCompat; @@ -130,51 +129,6 @@ public static void requestPermissions( .build()); } - /** - * Request a set of permissions, showing rationale if the system requests it. - * - * @param host requesting context. - * @param rationale a message explaining why the application needs this set of permissions, - * will be displayed if the user rejects the request the first time. - * @param positiveButton custom text for positive button - * @param negativeButton custom text for negative button - * @param requestCode request code to track this request, must be < 256. - * @param perms a set of permissions to be requested. - * @see Manifest.permission - * @deprecated use {@link #requestPermissions(PermissionRequest)} instead - */ - @Deprecated - public static void requestPermissions( - @NonNull Activity host, @NonNull String rationale, - @StringRes int positiveButton, @StringRes int negativeButton, - int requestCode, @Size(min = 1) @NonNull String... perms) { - requestPermissions( - new PermissionRequest.Builder(host, requestCode, perms) - .setRationale(rationale) - .setPositiveButtonText(positiveButton) - .setNegativeButtonText(negativeButton) - .build()); - } - - /** - * Request permissions from a Support Fragment. - * - * @see #requestPermissions(Activity, String, int, int, int, String...) - * @deprecated use {@link #requestPermissions(PermissionRequest)} instead - */ - @Deprecated - public static void requestPermissions( - @NonNull Fragment host, @NonNull String rationale, - @StringRes int positiveButton, @StringRes int negativeButton, - int requestCode, @Size(min = 1) @NonNull String... perms) { - requestPermissions( - new PermissionRequest.Builder(host, requestCode, perms) - .setRationale(rationale) - .setPositiveButtonText(positiveButton) - .setNegativeButtonText(negativeButton) - .build()); - } - /** * Request a set of permissions. * From f54b27fff33693087ade2dbd09b5d828129aaa31 Mon Sep 17 00:00:00 2001 From: Alex Saveau Date: Tue, 14 Aug 2018 12:04:03 -0700 Subject: [PATCH 4/6] Fix broken tests (#243) Signed-off-by: Alex Saveau --- .../easypermissions/EasyPermissionsTest.java | 54 ------------------- 1 file changed, 54 deletions(-) diff --git a/easypermissions/src/test/java/pub/devrel/easypermissions/EasyPermissionsTest.java b/easypermissions/src/test/java/pub/devrel/easypermissions/EasyPermissionsTest.java index 6339757..342f2a5 100644 --- a/easypermissions/src/test/java/pub/devrel/easypermissions/EasyPermissionsTest.java +++ b/easypermissions/src/test/java/pub/devrel/easypermissions/EasyPermissionsTest.java @@ -189,24 +189,6 @@ public void shouldShowCorrectDialog_whenMissingPermissionsAndShowRationaleFromAc assertThatHasExpectedRationale(dialog, RATIONALE); } - @SuppressWarnings("deprecation") - @Test - public void shouldShowCorrectDialogUsingDeprecated_whenMissingPermissionsAndShowRationaleFromActivity() { - grantPermissions(ONE_PERM); - showRationale(true, ALL_PERMS); - - EasyPermissions.requestPermissions(spyActivity, RATIONALE, android.R.string.ok, - android.R.string.cancel, TestActivity.REQUEST_CODE, ALL_PERMS); - - Fragment dialogFragment = spyActivity.getFragmentManager() - .findFragmentByTag(RationaleDialogFragment.TAG); - assertThat(dialogFragment).isInstanceOf(RationaleDialogFragment.class); - - Dialog dialog = ((RationaleDialogFragment) dialogFragment).getDialog(); - assertThatHasExpectedButtonsAndRationale(dialog, RATIONALE, - android.R.string.ok, android.R.string.cancel); - } - @Test public void shouldShowCorrectDialogUsingRequest_whenMissingPermissionsAndShowRationaleFromActivity() { grantPermissions(ONE_PERM); @@ -348,24 +330,6 @@ public void shouldShowCorrectDialog_whenMissingPermissionsAndShowRationaleFromSu assertThatHasExpectedRationale(dialog, RATIONALE); } - @SuppressWarnings("deprecation") - @Test - public void shouldShowCorrectDialogUsingDeprecated_whenMissingPermissionsAndShowRationaleFromSupportActivity() { - grantPermissions(ONE_PERM); - showRationale(true, ALL_PERMS); - - EasyPermissions.requestPermissions(spySupportActivity, RATIONALE, android.R.string.ok, - android.R.string.cancel, TestSupportActivity.REQUEST_CODE, ALL_PERMS); - - android.support.v4.app.Fragment dialogFragment = spySupportActivity.getSupportFragmentManager() - .findFragmentByTag(RationaleDialogFragmentCompat.TAG); - assertThat(dialogFragment).isInstanceOf(RationaleDialogFragmentCompat.class); - - Dialog dialog = ((RationaleDialogFragmentCompat) dialogFragment).getDialog(); - assertThatHasExpectedButtonsAndRationale(dialog, RATIONALE, - android.R.string.ok, android.R.string.cancel); - } - @Test public void shouldShowCorrectDialogUsingRequest_whenMissingPermissionsAndShowRationaleFromSupportActivity() { grantPermissions(ONE_PERM); @@ -494,24 +458,6 @@ public void shouldRequestPermissions_whenMissingPermissionsAndNotShowRationaleFr .requestPermissions(ALL_PERMS, TestFragment.REQUEST_CODE); } - @SuppressWarnings("deprecation") - @Test - public void shouldShowCorrectDialogUsingDeprecated_whenMissingPermissionsAndShowRationaleFromFragment() { - grantPermissions(ONE_PERM); - showRationale(true, ALL_PERMS); - - EasyPermissions.requestPermissions(spyFragment, RATIONALE, android.R.string.ok, - android.R.string.cancel, TestFragment.REQUEST_CODE, ALL_PERMS); - - android.support.v4.app.Fragment dialogFragment = spyFragment.getChildFragmentManager() - .findFragmentByTag(RationaleDialogFragmentCompat.TAG); - assertThat(dialogFragment).isInstanceOf(RationaleDialogFragmentCompat.class); - - Dialog dialog = ((RationaleDialogFragmentCompat) dialogFragment).getDialog(); - assertThatHasExpectedButtonsAndRationale(dialog, RATIONALE, - android.R.string.ok, android.R.string.cancel); - } - @Test public void shouldShowCorrectDialog_whenMissingPermissionsAndShowRationaleFromFragment() { grantPermissions(ONE_PERM); From 8340eced48c449a4cee28981333374e7bddd13a3 Mon Sep 17 00:00:00 2001 From: Sam Stern Date: Mon, 24 Sep 2018 09:36:36 -0700 Subject: [PATCH 5/6] Update versions for 2.0.0 (#246) --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index ad34e20..7ff3a31 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.2.0-beta05' + classpath 'com.android.tools.build:gradle:3.2.0-rc03' classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4' classpath 'com.dicedmelon.gradle:jacoco-android:0.1.3' } @@ -34,7 +34,7 @@ ext { bintrayOrg = 'easygoogle' - support_library_version = '28.0.0-rc01' + support_library_version = '28.0.0' compileSdk = 28 targetSdk = 28 From 488e3ed2a183e9197354a4f4e938544c311e121f Mon Sep 17 00:00:00 2001 From: Sam Stern Date: Mon, 24 Sep 2018 09:39:11 -0700 Subject: [PATCH 6/6] Version 2.0 Change-Id: I6258e18d4733b39d158211127b376ad3a3c4a2e1 --- README.md | 2 +- build.gradle | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e4dbbcf..8cfa352 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ EasyPermissions is installed by adding the following dependency to your `build.g ```groovy dependencies { -    implementation 'pub.devrel:easypermissions:1.3.0' +    implementation 'pub.devrel:easypermissions:2.0.0' } ``` diff --git a/build.gradle b/build.gradle index 7ff3a31..17067c8 100644 --- a/build.gradle +++ b/build.gradle @@ -30,7 +30,7 @@ ext { mavenGroup = 'pub.devrel' mavenArtifactId = 'easypermissions' - mavenVersion = '1.3.0' + mavenVersion = '2.0.0' bintrayOrg = 'easygoogle'