From cae63a7ada6a980add7a64aee306c06322672246 Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Sat, 20 Mar 2021 21:47:19 -0400 Subject: [PATCH 01/91] Add gradle wrapper validation action --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2a58f5960..d1a5a86c3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -5,7 +5,7 @@ on: branches: - dev push: - branches: + branches: - dev - master @@ -14,6 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 + - uses: gradle/wrapper-validation-action@v1 - name: create and checkout branch # push events already checked out the branch From 4c2a6e346df195230807ef189732d3bf8545eb94 Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Sat, 20 Mar 2021 21:48:43 -0400 Subject: [PATCH 02/91] Update gradle wrapper --- gradle/wrapper/gradle-wrapper.jar | Bin 54712 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 3 +- gradlew | 53 ++++++++++++++--------- gradlew.bat | 43 ++++++++++-------- 4 files changed, 58 insertions(+), 41 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index ed88a042a287c140a32e1639edfc91b2a233da8c..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch literal 59203 zcma&O1CT9Y(k9%tZQHhO+qUh#ZQHhO+qmuS+qP|E@9xZO?0h@l{(r>DQ>P;GjjD{w zH}lENr;dU&FbEU?00aa80D$0M0RRB{U*7-#kbjS|qAG&4l5%47zyJ#WrfA#1$1Ctx zf&Z_d{GW=lf^w2#qRJ|CvSJUi(^E3iv~=^Z(zH}F)3Z%V3`@+rNB7gTVU{Bb~90p|f+0(v;nz01EG7yDMX9@S~__vVgv%rS$+?IH+oZ03D5zYrv|^ zC1J)SruYHmCki$jLBlTaE5&dFG9-kq3!^i>^UQL`%gn6)jz54$WDmeYdsBE9;PqZ_ zoGd=P4+|(-u4U1dbAVQrFWoNgNd;0nrghPFbQrJctO>nwDdI`Q^i0XJDUYm|T|RWc zZ3^Qgo_Qk$%Fvjj-G}1NB#ZJqIkh;kX%V{THPqOyiq)d)0+(r9o(qKlSp*hmK#iIY zA^)Vr$-Hz<#SF=0@tL@;dCQsm`V9s1vYNq}K1B)!XSK?=I1)tX+bUV52$YQu*0%fnWEukW>mxkz+%3-S!oguE8u#MGzST8_Dy^#U?fA@S#K$S@9msUiX!gd_ow>08w5)nX{-KxqMOo7d?k2&?Vf z&diGDtZr(0cwPe9z9FAUSD9KC)7(n^lMWuayCfxzy8EZsns%OEblHFSzP=cL6}?J| z0U$H!4S_TVjj<`6dy^2j`V`)mC;cB%* z8{>_%E1^FH!*{>4a7*C1v>~1*@TMcLK{7nEQ!_igZC}ikJ$*<$yHy>7)oy79A~#xE zWavoJOIOC$5b6*q*F_qN1>2#MY)AXVyr$6x4b=$x^*aqF*L?vmj>Mgv+|ITnw_BoW zO?jwHvNy^prH{9$rrik1#fhyU^MpFqF2fYEt(;4`Q&XWOGDH8k6M=%@fics4ajI;st# zCU^r1CK&|jzUhRMv;+W~6N;u<;#DI6cCw-otsc@IsN3MoSD^O`eNflIoR~l4*&-%RBYk@gb^|-JXs&~KuSEmMxB}xSb z@K76cXD=Y|=I&SNC2E+>Zg?R6E%DGCH5J1nU!A|@eX9oS(WPaMm==k2s_ueCqdZw| z&hqHp)47`c{BgwgvY2{xz%OIkY1xDwkw!<0veB#yF4ZKJyabhyyVS`gZepcFIk%e2 zTcrmt2@-8`7i-@5Nz>oQWFuMC_KlroCl(PLSodswHqJ3fn<;gxg9=}~3x_L3P`9Sn zChIf}8vCHvTriz~T2~FamRi?rh?>3bX1j}%bLH+uFX+p&+^aXbOK7clZxdU~6Uxgy z8R=obwO4dL%pmVo*Ktf=lH6hnlz_5k3cG;m8lgaPp~?eD!Yn2kf)tU6PF{kLyn|oI@eQ`F z3IF7~Blqg8-uwUuWZScRKn%c2_}dXB6Dx_&xR*n9M9LXasJhtZdr$vBY!rP{c@=)& z#!?L$2UrkvClwQO>U*fSMs67oSj2mxiJ$t;E|>q%Kh_GzzWWO&3;ufU%2z%ucBU8H z3WIwr$n)cfCXR&>tyB7BcSInK>=ByZA%;cVEJhcg<#6N{aZC4>K41XF>ZgjG`z_u& zGY?;Ad?-sgiOnI`oppF1o1Gurqbi*;#x2>+SSV6|1^G@ooVy@fg?wyf@0Y!UZ4!}nGuLeC^l)6pwkh|oRY`s1Pm$>zZ3u-83T|9 zGaKJIV3_x+u1>cRibsaJpJqhcm%?0-L;2 zitBrdRxNmb0OO2J%Y&Ym(6*`_P3&&5Bw157{o7LFguvxC$4&zTy#U=W*l&(Q2MNO} zfaUwYm{XtILD$3864IA_nn34oVa_g^FRuHL5wdUd)+W-p-iWCKe8m_cMHk+=? zeKX)M?Dt(|{r5t7IenkAXo%&EXIb-i^w+0CX0D=xApC=|Xy(`xy+QG^UyFe z+#J6h_&T5i#sV)hj3D4WN%z;2+jJcZxcI3*CHXGmOF3^)JD5j&wfX)e?-|V0GPuA+ zQFot%aEqGNJJHn$!_}#PaAvQ^{3-Ye7b}rWwrUmX53(|~i0v{}G_sI9uDch_brX&6 zWl5Ndj-AYg(W9CGfQf<6!YmY>Ey)+uYd_JNXH=>|`OH-CDCmcH(0%iD_aLlNHKH z7bcW-^5+QV$jK?R*)wZ>r9t}loM@XN&M-Pw=F#xn(;u3!(3SXXY^@=aoj70;_=QE9 zGghsG3ekq#N||u{4We_25U=y#T*S{4I{++Ku)> zQ!DZW;pVcn>b;&g2;YE#+V`v*Bl&Y-i@X6D*OpNA{G@JAXho&aOk(_j^weW{#3X5Y z%$q_wpb07EYPdmyH(1^09i$ca{O<}7) zRWncXdSPgBE%BM#by!E>tdnc$8RwUJg1*x($6$}ae$e9Knj8gvVZe#bLi!<+&BkFj zg@nOpDneyc+hU9P-;jmOSMN|*H#>^Ez#?;%C3hg_65leSUm;iz)UkW)jX#p)e&S&M z1|a?wDzV5NVnlhRBCd_;F87wp>6c<&nkgvC+!@KGiIqWY4l}=&1w7|r6{oBN8xyzh zG$b#2=RJp_iq6)#t5%yLkKx(0@D=C3w+oiXtSuaQ%I1WIb-eiE$d~!)b@|4XLy!CZ z9p=t=%3ad@Ep+<9003D2KZ5VyP~_n$=;~r&YUg5UZ0KVD&tR1DHy9x)qWtKJp#Kq# zP*8p#W(8JJ_*h_3W}FlvRam?<4Z+-H77^$Lvi+#vmhL9J zJ<1SV45xi;SrO2f=-OB(7#iNA5)x1uNC-yNxUw|!00vcW2PufRm>e~toH;M0Q85MQLWd?3O{i8H+5VkR@l9Dg-ma ze2fZ%>G(u5(k9EHj2L6!;(KZ8%8|*-1V|B#EagbF(rc+5iL_5;Eu)L4Z-V;0HfK4d z*{utLse_rvHZeQ>V5H=f78M3Ntg1BPxFCVD{HbNA6?9*^YIq;B-DJd{Ca2L#)qWP? zvX^NhFmX?CTWw&Ns}lgs;r3i+Bq@y}Ul+U%pzOS0Fcv9~aB(0!>GT0)NO?p=25LjN z2bh>6RhgqD7bQj#k-KOm@JLgMa6>%-ok1WpOe)FS^XOU{c?d5shG(lIn3GiVBxmg`u%-j=)^v&pX1JecJics3&jvPI)mDut52? z3jEA)DM%}BYbxxKrizVYwq?(P&19EXlwD9^-6J+4!}9{ywR9Gk42jjAURAF&EO|~N z)?s>$Da@ikI4|^z0e{r`J8zIs>SpM~Vn^{3fArRu;?+43>lD+^XtUcY1HidJwnR6+ z!;oG2=B6Z_=M%*{z-RaHc(n|1RTKQdNjjV!Pn9lFt^4w|AeN06*j}ZyhqZ^!-=cyGP_ShV1rGxkx8t zB;8`h!S{LD%ot``700d0@Grql(DTt4Awgmi+Yr0@#jbe=2#UkK%rv=OLqF)9D7D1j z!~McAwMYkeaL$~kI~90)5vBhBzWYc3Cj1WI0RS`z000R8-@ET0dA~*r(gSiCJmQMN&4%1D zyVNf0?}sBH8zNbBLn>~(W{d3%@kL_eQ6jEcR{l>C|JK z(R-fA!z|TTRG40|zv}7E@PqCAXP3n`;%|SCQ|ZS%ym$I{`}t3KPL&^l5`3>yah4*6 zifO#{VNz3)?ZL$be;NEaAk9b#{tV?V7 zP|wf5YA*1;s<)9A4~l3BHzG&HH`1xNr#%){4xZ!jq%o=7nN*wMuXlFV{HaiQLJ`5G zBhDi#D(m`Q1pLh@Tq+L;OwuC52RdW7b8}~60WCOK5iYMUad9}7aWBuILb({5=z~YF zt?*Jr5NG+WadM{mDL>GyiByCuR)hd zA=HM?J6l1Xv0Dl+LW@w$OTcEoOda^nFCw*Sy^I@$sSuneMl{4ys)|RY#9&NxW4S)9 zq|%83IpslTLoz~&vTo!Ga@?rj_kw{|k{nv+w&Ku?fyk4Ki4I?);M|5Axm)t+BaE)D zm(`AQ#k^DWrjbuXoJf2{Aj^KT zFb1zMSqxq|vceV+Mf-)$oPflsO$@*A0n0Z!R{&(xh8s}=;t(lIy zv$S8x>m;vQNHuRzoaOo?eiWFe{0;$s`Bc+Osz~}Van${u;g(su`3lJ^TEfo~nERfP z)?aFzpDgnLYiERsKPu|0tq4l2wT)Atr6Qb%m-AUn6HnCue*yWICp7TjW$@sO zm5rm4aTcPQ(rfi7a`xP7cKCFrJD}*&_~xgLyr^-bmsL}y;A5P|al8J3WUoBSjqu%v zxC;mK!g(7r6RRJ852Z~feoC&sD3(6}^5-uLK8o)9{8L_%%rItZK9C){UxB|;G>JbP zsRRtS4-3B*5c+K2kvmgZK8472%l>3cntWUOVHxB|{Ay~aOg5RN;{PJgeVD*H%ac+y!h#wi%o2bF2Ca8IyMyH{>4#{E_8u^@+l-+n=V}Sq?$O z{091@v%Bd*3pk0^2UtiF9Z+(a@wy6 zUdw8J*ze$K#=$48IBi1U%;hmhO>lu!uU;+RS}p&6@rQila7WftH->*A4=5W|Fmtze z)7E}jh@cbmr9iup^i%*(uF%LG&!+Fyl@LFA-}Ca#bxRfDJAiR2dt6644TaYw1Ma79 zt8&DYj31j^5WPNf5P&{)J?WlCe@<3u^78wnd(Ja4^a>{^Tw}W>|Cjt^If|7l^l)^Q zbz|7~CF(k_9~n|h;ysZ+jHzkXf(*O*@5m zLzUmbHp=x!Q|!9NVXyipZ3)^GuIG$k;D)EK!a5=8MFLI_lpf`HPKl=-Ww%z8H_0$j ztJ||IfFG1lE9nmQ0+jPQy zCBdKkjArH@K7jVcMNz);Q(Q^R{d5G?-kk;Uu_IXSyWB)~KGIizZL(^&qF;|1PI7!E zTP`%l)gpX|OFn&)M%txpQ2F!hdA~hX1Cm5)IrdljqzRg!f{mN%G~H1&oqe`5eJCIF zHdD7O;AX-{XEV(a`gBFJ9ews#CVS2y!&>Cm_dm3C8*n3MA*e67(WC?uP@8TXuMroq z{#w$%z@CBIkRM7?}Xib+>hRjy?%G!fiw8! z8(gB+8J~KOU}yO7UGm&1g_MDJ$IXS!`+*b*QW2x)9>K~Y*E&bYMnjl6h!{17_8d!%&9D`a7r&LKZjC<&XOvTRaKJ1 zUY@hl5^R&kZl3lU3njk`3dPzxj$2foOL26r(9zsVF3n_F#v)s5vv3@dgs|lP#eylq62{<-vczqP!RpVBTgI>@O6&sU>W|do17+#OzQ7o5A$ICH z?GqwqnK^n2%LR;$^oZM;)+>$X3s2n}2jZ7CdWIW0lnGK-b#EG01)P@aU`pg}th&J-TrU`tIpb5t((0eu|!u zQz+3ZiOQ^?RxxK4;zs=l8q!-n7X{@jSwK(iqNFiRColuEOg}!7cyZi`iBX4g1pNBj zAPzL?P^Ljhn;1$r8?bc=#n|Ed7wB&oHcw()&*k#SS#h}jO?ZB246EGItsz*;^&tzp zu^YJ0=lwsi`eP_pU8}6JA7MS;9pfD;DsSsLo~ogzMNP70@@;Fm8f0^;>$Z>~}GWRw!W5J3tNX*^2+1f3hz{~rIzJo z6W%J(H!g-eI_J1>0juX$X4Cl6i+3wbc~k146UIX&G22}WE>0ga#WLsn9tY(&29zBvH1$`iWtTe zG2jYl@P!P)eb<5DsR72BdI7-zP&cZNI{7q3e@?N8IKc4DE#UVr->|-ryuJXk^u^>4 z$3wE~=q390;XuOQP~TNoDR?#|NSPJ%sTMInA6*rJ%go|=YjGe!B>z6u$IhgQSwoV* zjy3F2#I>uK{42{&IqP59)Y(1*Z>>#W8rCf4_eVsH)`v!P#^;BgzKDR`ARGEZzkNX+ zJUQu=*-ol=Xqqt5=`=pA@BIn@6a9G8C{c&`i^(i+BxQO9?YZ3iu%$$da&Kb?2kCCo zo7t$UpSFWqmydXf@l3bVJ=%K?SSw)|?srhJ-1ZdFu*5QhL$~-IQS!K1s@XzAtv6*Y zl8@(5BlWYLt1yAWy?rMD&bwze8bC3-GfNH=p zynNFCdxyX?K&G(ZZ)afguQ2|r;XoV^=^(;Cku#qYn4Lus`UeKt6rAlFo_rU`|Rq z&G?~iWMBio<78of-2X(ZYHx~=U0Vz4btyXkctMKdc9UM!vYr~B-(>)(Hc|D zMzkN4!PBg%tZoh+=Gba!0++d193gbMk2&krfDgcbx0jI92cq?FFESVg0D$>F+bil} zY~$)|>1HZsX=5sAZ2WgPB5P=8X#TI+NQ(M~GqyVB53c6IdX=k>Wu@A0Svf5#?uHaF zsYn|koIi3$(%GZ2+G+7Fv^lHTb#5b8sAHSTnL^qWZLM<(1|9|QFw9pnRU{svj}_Al zL)b9>fN{QiA($8peNEJyy`(a{&uh-T4_kdZFIVsKKVM(?05}76EEz?#W za^fiZOAd14IJ4zLX-n7Lq0qlQ^lW8Cvz4UKkV9~P}>sq0?xD3vg+$4vLm~C(+ zM{-3Z#qnZ09bJ>}j?6ry^h+@PfaD7*jZxBEY4)UG&daWb??6)TP+|3#Z&?GL?1i+280CFsE|vIXQbm| zM}Pk!U`U5NsNbyKzkrul-DzwB{X?n3E6?TUHr{M&+R*2%yOiXdW-_2Yd6?38M9Vy^ z*lE%gA{wwoSR~vN0=no}tP2Ul5Gk5M(Xq`$nw#ndFk`tcpd5A=Idue`XZ!FS>Q zG^0w#>P4pPG+*NC9gLP4x2m=cKP}YuS!l^?sHSFftZy{4CoQrb_ z^20(NnG`wAhMI=eq)SsIE~&Gp9Ne0nD4%Xiu|0Fj1UFk?6avDqjdXz{O1nKao*46y zT8~iA%Exu=G#{x=KD;_C&M+Zx4+n`sHT>^>=-1YM;H<72k>$py1?F3#T1*ef9mLZw z5naLQr?n7K;2l+{_uIw*_1nsTn~I|kkCgrn;|G~##hM;9l7Jy$yJfmk+&}W@JeKcF zx@@Woiz8qdi|D%aH3XTx5*wDlbs?dC1_nrFpm^QbG@wM=i2?Zg;$VK!c^Dp8<}BTI zyRhAq@#%2pGV49*Y5_mV4+OICP|%I(dQ7x=6Ob}>EjnB_-_18*xrY?b%-yEDT(wrO z9RY2QT0`_OpGfMObKHV;QLVnrK%mc?$WAdIT`kJQT^n%GuzE7|9@k3ci5fYOh(287 zuIbg!GB3xLg$YN=n)^pHGB0jH+_iIiC=nUcD;G6LuJsjn2VI1cyZx=a?ShCsF==QK z;q~*m&}L<-cb+mDDXzvvrRsybcgQ;Vg21P(uLv5I+eGc7o7tc6`;OA9{soHFOz zT~2?>Ts}gprIX$wRBb4yE>ot<8+*Bv`qbSDv*VtRi|cyWS>)Fjs>fkNOH-+PX&4(~ z&)T8Zam2L6puQl?;5zg9h<}k4#|yH9czHw;1jw-pwBM*O2hUR6yvHATrI%^mvs9q_ z&ccT0>f#eDG<^WG^q@oVqlJrhxH)dcq2cty@l3~|5#UDdExyXUmLQ}f4#;6fI{f^t zDCsgIJ~0`af%YR%Ma5VQq-p21k`vaBu6WE?66+5=XUd%Ay%D$irN>5LhluRWt7 zov-=f>QbMk*G##&DTQyou$s7UqjjW@k6=!I@!k+S{pP8R(2=e@io;N8E`EOB;OGoI zw6Q+{X1_I{OO0HPpBz!X!@`5YQ2)t{+!?M_iH25X(d~-Zx~cXnS9z>u?+If|iNJbx zyFU2d1!ITX64D|lE0Z{dLRqL1Ajj=CCMfC4lD3&mYR_R_VZ>_7_~|<^o*%_&jevU+ zQ4|qzci=0}Jydw|LXLCrOl1_P6Xf@c0$ieK2^7@A9UbF{@V_0p%lqW|L?5k>bVM8|p5v&2g;~r>B8uo<4N+`B zH{J)h;SYiIVx@#jI&p-v3dwL5QNV1oxPr8J%ooezTnLW>i*3Isb49%5i!&ac_dEXv zvXmVUck^QHmyrF8>CGXijC_R-y(Qr{3Zt~EmW)-nC!tiH`wlw5D*W7Pip;T?&j%kX z6DkZX4&}iw>hE(boLyjOoupf6JpvBG8}jIh!!VhnD0>}KSMMo{1#uU6kiFcA04~|7 zVO8eI&x1`g4CZ<2cYUI(n#wz2MtVFHx47yE5eL~8bot~>EHbevSt}LLMQX?odD{Ux zJMnam{d)W4da{l7&y-JrgiU~qY3$~}_F#G7|MxT)e;G{U`In&?`j<5D->}cb{}{T(4DF0BOk-=1195KB-E*o@c?`>y#4=dMtYtSY=&L{!TAjFVcq0y@AH`vH! z$41+u!Ld&}F^COPgL(EE{0X7LY&%D7-(?!kjFF7=qw<;`V{nwWBq<)1QiGJgUc^Vz ztMUlq1bZqKn17|6x6iAHbWc~l1HcmAxr%$Puv!znW)!JiukwIrqQ00|H$Z)OmGG@= zv%A8*4cq}(?qn4rN6o`$Y))(MyXr8R<2S^J+v(wmFmtac!%VOfN?&(8Nr!T@kV`N; z*Q33V3t`^rN&aBiHet)18wy{*wi1=W!B%B-Q6}SCrUl$~Hl{@!95ydml@FK8P=u4s z4e*7gV2s=YxEvskw2Ju!2%{8h01rx-3`NCPc(O zH&J0VH5etNB2KY6k4R@2Wvl^Ck$MoR3=)|SEclT2ccJ!RI9Nuter7u9@;sWf-%um;GfI!=eEIQ2l2p_YWUd{|6EG ze{yO6;lMc>;2tPrsNdi@&1K6(1;|$xe8vLgiouj%QD%gYk`4p{Ktv9|j+!OF-P?@p z;}SV|oIK)iwlBs+`ROXkhd&NK zzo__r!B>tOXpBJMDcv!Mq54P+n4(@dijL^EpO1wdg~q+!DT3lB<>9AANSe!T1XgC=J^)IP0XEZ()_vpu!!3HQyJhwh?r`Ae%Yr~b% zO*NY9t9#qWa@GCPYOF9aron7thfWT`eujS4`t2uG6)~JRTI;f(ZuoRQwjZjp5Pg34 z)rp$)Kr?R+KdJ;IO;pM{$6|2y=k_siqvp%)2||cHTe|b5Ht8&A{wazGNca zX$Ol?H)E_R@SDi~4{d-|8nGFhZPW;Cts1;08TwUvLLv&_2$O6Vt=M)X;g%HUr$&06 zISZb(6)Q3%?;3r~*3~USIg=HcJhFtHhIV(siOwV&QkQe#J%H9&E21!C*d@ln3E@J* zVqRO^<)V^ky-R|%{(9`l-(JXq9J)1r$`uQ8a}$vr9E^nNiI*thK8=&UZ0dsFN_eSl z(q~lnD?EymWLsNa3|1{CRPW60>DSkY9YQ;$4o3W7Ms&@&lv9eH!tk~N&dhqX&>K@} zi1g~GqglxkZ5pEFkllJ)Ta1I^c&Bt6#r(QLQ02yHTaJB~- zCcE=5tmi`UA>@P=1LBfBiqk)HB4t8D?02;9eXj~kVPwv?m{5&!&TFYhu>3=_ zsGmYZ^mo*-j69-42y&Jj0cBLLEulNRZ9vXE)8~mt9C#;tZs;=#M=1*hebkS;7(aGf zcs7zH(I8Eui9UU4L--))yy`&d&$In&VA2?DAEss4LAPCLd>-$i?lpXvn!gu^JJ$(DoUlc6wE98VLZ*z`QGQov5l4Fm_h?V-;mHLYDVOwKz7>e4+%AzeO>P6v}ndPW| zM>m#6Tnp7K?0mbK=>gV}=@k*0Mr_PVAgGMu$j+pWxzq4MAa&jpCDU&-5eH27Iz>m^ zax1?*HhG%pJ((tkR(V(O(L%7v7L%!_X->IjS3H5kuXQT2!ow(;%FDE>16&3r){!ex zhf==oJ!}YU89C9@mfDq!P3S4yx$aGB?rbtVH?sHpg?J5C->!_FHM%Hl3#D4eplxzQ zRA+<@LD%LKSkTk2NyWCg7u=$%F#;SIL44~S_OGR}JqX}X+=bc@swpiClB`Zbz|f!4 z7Ysah7OkR8liXfI`}IIwtEoL}(URrGe;IM8%{>b1SsqXh)~w}P>yiFRaE>}rEnNkT z!HXZUtxUp1NmFm)Dm@-{FI^aRQqpSkz}ZSyKR%Y}YHNzBk)ZIp} zMtS=aMvkgWKm9&oTcU0?S|L~CDqA+sHpOxwnswF-fEG)cXCzUR?ps@tZa$=O)=L+5 zf%m58cq8g_o}3?Bhh+c!w4(7AjxwQ3>WnVi<{{38g7yFboo>q|+7qs<$8CPXUFAN< zG&}BHbbyQ5n|qqSr?U~GY{@GJ{(Jny{bMaOG{|IkUj7tj^9pa9|FB_<+KHLxSxR;@ zHpS$4V)PP+tx}22fWx(Ku9y+}Ap;VZqD0AZW4gCDTPCG=zgJmF{|x;(rvdM|2|9a}cex6xrMkERnkE;}jvU-kmzd%_J50$M`lIPCKf+^*zL=@LW`1SaEc%=m zQ+lT06Gw+wVwvQ9fZ~#qd430v2HndFsBa9WjD0P}K(rZYdAt^5WQIvb%D^Q|pkVE^ zte$&#~zmULFACGfS#g=2OLOnIf2Of-k!(BIHjs77nr!5Q1*I9 z1%?=~#Oss!rV~?-6Gm~BWJiA4mJ5TY&iPm_$)H1_rTltuU1F3I(qTQ^U$S>%$l z)Wx1}R?ij0idp@8w-p!Oz{&*W;v*IA;JFHA9%nUvVDy7Q8woheC#|8QuDZb-L_5@R zOqHwrh|mVL9b=+$nJxM`3eE{O$sCt$UK^2@L$R(r^-_+z?lOo+me-VW=Zw z-Bn>$4ovfWd%SPY`ab-u9{INc*k2h+yH%toDHIyqQ zO68=u`N}RIIs7lsn1D){)~%>ByF<>i@qFb<-axvu(Z+6t7v<^z&gm9McRB~BIaDn$ z#xSGT!rzgad8o>~kyj#h1?7g96tOcCJniQ+*#=b7wPio>|6a1Z?_(TS{)KrPe}(8j z!#&A=k(&Pj^F;r)CI=Z{LVu>uj!_W1q4b`N1}E(i%;BWjbEcnD=mv$FL$l?zS6bW!{$7j1GR5ocn94P2u{ z70tAAcpqtQo<@cXw~@i-@6B23;317|l~S>CB?hR5qJ%J3EFgyBdJd^fHZu7AzHF(BQ!tyAz^L0`X z23S4Fe{2X$W0$zu9gm%rg~A>ijaE#GlYlrF9$ds^QtaszE#4M(OLVP2O-;XdT(XIC zatwzF*)1c+t~c{L=fMG8Z=k5lv>U0;C{caN1NItnuSMp)6G3mbahu>E#sj&oy94KC zpH}8oEw{G@N3pvHhp{^-YaZeH;K+T_1AUv;IKD<=mv^&Ueegrb!yf`4VlRl$M?wsl zZyFol(2|_QM`e_2lYSABpKR{{NlxlDSYQNkS;J66aT#MSiTx~;tUmvs-b*CrR4w=f z8+0;*th6kfZ3|5!Icx3RV11sp=?`0Jy3Fs0N4GZQMN=8HmT6%x9@{Dza)k}UwL6JT zHRDh;%!XwXr6yuuy`4;Xsn0zlR$k%r%9abS1;_v?`HX_hI|+EibVnlyE@3aL5vhQq zlIG?tN^w@0(v9M*&L+{_+RQZw=o|&BRPGB>e5=ys7H`nc8nx)|-g;s7mRc7hg{GJC zAe^vCIJhajmm7C6g! zL&!WAQ~5d_5)00?w_*|*H>3$loHrvFbitw#WvLB!JASO?#5Ig5$Ys10n>e4|3d;tS zELJ0|R4n3Az(Fl3-r^QiV_C;)lQ1_CW{5bKS15U|E9?ZgLec@%kXr84>5jV2a5v=w z?pB1GPdxD$IQL4)G||B_lI+A=08MUFFR4MxfGOu07vfIm+j=z9tp~5i_6jb`tR>qV z$#`=BQ*jpCjm$F0+F)L%xRlnS%#&gro6PiRfu^l!EVan|r3y}AHJQOORGx4~ z&<)3=K-tx518DZyp%|!EqpU!+X3Et7n2AaC5(AtrkW>_57i}$eqs$rupubg0a1+WO zGHZKLN2L0D;ab%{_S1Plm|hx8R?O14*w*f&2&bB050n!R2by zw!@XOQx$SqZ5I<(Qu$V6g>o#A!JVwErWv#(Pjx=KeS0@hxr4?13zj#oWwPS(7Ro|v z>Mp@Kmxo79q|}!5qtX2-O@U&&@6s~!I&)1WQIl?lTnh6UdKT_1R640S4~f=_xoN3- zI+O)$R@RjV$F=>Ti7BlnG1-cFKCC(t|Qjm{SalS~V-tX#+2ekRhwmN zZr`8{QF6y~Z!D|{=1*2D-JUa<(1Z=;!Ei!KiRNH?o{p5o3crFF=_pX9O-YyJchr$~ zRC`+G+8kx~fD2k*ZIiiIGR<8r&M@3H?%JVOfE>)})7ScOd&?OjgAGT@WVNSCZ8N(p zuQG~76GE3%(%h1*vUXg$vH{ua0b`sQ4f0*y=u~lgyb^!#CcPJa2mkSEHGLsnO^kb$ zru5_l#nu=Y{rSMWiYx?nO{8I!gH+?wEj~UM?IrG}E|bRIBUM>UlY<`T1EHpRr36vv zBi&dG8oxS|J$!zoaq{+JpJy+O^W(nt*|#g32bd&K^w-t>!Vu9N!k9eA8r!Xc{utY> zg9aZ(D2E0gL#W0MdjwES-7~Wa8iubPrd?8-$C4BP?*wok&O8+ykOx{P=Izx+G~hM8 z*9?BYz!T8~dzcZr#ux8kS7u7r@A#DogBH8km8Ry4slyie^n|GrTbO|cLhpqgMdsjX zJ_LdmM#I&4LqqsOUIXK8gW;V0B(7^$y#h3h>J0k^WJfAMeYek%Y-Dcb_+0zPJez!GM zAmJ1u;*rK=FNM0Nf}Y!!P9c4)HIkMnq^b;JFd!S3?_Qi2G#LIQ)TF|iHl~WKK6JmK zbv7rPE6VkYr_%_BT}CK8h=?%pk@3cz(UrZ{@h40%XgThP*-Oeo`T0eq9 zA8BnWZKzCy5e&&_GEsU4*;_k}(8l_&al5K-V*BFM=O~;MgRkYsOs%9eOY6s6AtE*<7GQAR2ulC3RAJrG_P1iQK5Z~&B z&f8X<>yJV6)oDGIlS$Y*D^Rj(cszTy5c81a5IwBr`BtnC6_e`ArI8CaTX_%rx7;cn zR-0?J_LFg*?(#n~G8cXut(1nVF0Oka$A$1FGcERU<^ggx;p@CZc?3UB41RY+wLS`LWFNSs~YP zuw1@DNN3lTd|jDL7gjBsd9}wIw}4xT2+8dBQzI00m<@?c2L%>}QLfK5%r!a-iII`p zX@`VEUH)uj^$;7jVUYdADQ2k*!1O3WdfgF?OMtUXNpQ1}QINamBTKDuv19^{$`8A1 zeq%q*O0mi@(%sZU>Xdb0Ru96CFqk9-L3pzLVsMQ`Xpa~N6CR{9Rm2)A|CI21L(%GW zh&)Y$BNHa=FD+=mBw3{qTgw)j0b!Eahs!rZnpu)z!!E$*eXE~##yaXz`KE5(nQM`s zD!$vW9XH)iMxu9R>r$VlLk9oIR%HxpUiW=BK@4U)|1WNQ=mz9a z^!KkO=>GaJ!GBXm{KJj^;kh-MkUlEQ%lza`-G&}C5y1>La1sR6hT=d*NeCnuK%_LV zOXt$}iP6(YJKc9j-Fxq~*ItVUqljQ8?oaysB-EYtFQp9oxZ|5m0^Hq(qV!S+hq#g( z?|i*H2MIr^Kxgz+3vIljQ*Feejy6S4v~jKEPTF~Qhq!(ms5>NGtRgO5vfPPc4Z^AM zTj!`5xEreIN)vaNxa|q6qWdg>+T`Ol0Uz)ckXBXEGvPNEL3R8hB3=C5`@=SYgAju1 z!)UBr{2~=~xa{b8>x2@C7weRAEuatC)3pkRhT#pMPTpSbA|tan%U7NGMvzmF?c!V8 z=pEWxbdXbTAGtWTyI?Fml%lEr-^AE}w#l(<7OIw;ctw}imYax&vR4UYNJZK6P7ZOd zP87XfhnUHxCUHhM@b*NbTi#(-8|wcv%3BGNs#zRCVV(W?1Qj6^PPQa<{yaBwZ`+<`w|;rqUY_C z&AeyKwwf*q#OW-F()lir=T^<^wjK65Lif$puuU5+tk$;e_EJ;Lu+pH>=-8=PDhkBg z8cWt%@$Sc#C6F$Vd+0507;{OOyT7Hs%nKS88q-W!$f~9*WGBpHGgNp}=C*7!RiZ5s zn1L_DbKF@B8kwhDiLKRB@lsXVVLK|ph=w%_`#owlf@s@V(pa`GY$8h%;-#h@TsO|Y8V=n@*!Rog7<7Cid%apR|x zOjhHCyfbIt%+*PCveTEcuiDi%Wx;O;+K=W?OFUV%)%~6;gl?<0%)?snDDqIvkHF{ zyI02)+lI9ov42^hL>ZRrh*HhjF9B$A@=H94iaBESBF=eC_KT$8A@uB^6$~o?3Wm5t1OIaqF^~><2?4e3c&)@wKn9bD? zoeCs;H>b8DL^F&>Xw-xjZEUFFTv>JD^O#1E#)CMBaG4DX9bD(Wtc8Rzq}9soQ8`jf zeSnHOL}<+WVSKp4kkq&?SbETjq6yr@4%SAqOG=9E(3YeLG9dtV+8vmzq+6PFPk{L; z(&d++iu=^F%b+ea$i2UeTC{R*0Isk;vFK!no<;L+(`y`3&H-~VTdKROkdyowo1iqR zbVW(3`+(PQ2>TKY>N!jGmGo7oeoB8O|P_!Ic@ zZ^;3dnuXo;WJ?S+)%P>{Hcg!Jz#2SI(s&dY4QAy_vRlmOh)QHvs_7c&zkJCmJGVvV zX;Mtb>QE+xp`KyciG$Cn*0?AK%-a|=o!+7x&&yzHQOS>8=B*R=niSnta^Pxp1`=md z#;$pS$4WCT?mbiCYU?FcHGZ#)kHVJTTBt^%XE(Q};aaO=Zik0UgLcc0I(tUpt(>|& zcxB_|fxCF7>&~5eJ=Dpn&5Aj{A^cV^^}(7w#p;HG&Q)EaN~~EqrE1qKrMAc&WXIE;>@<&)5;gD2?={Xf@Mvn@OJKw=8Mgn z!JUFMwD+s==JpjhroT&d{$kQAy%+d`a*XxDEVxy3`NHzmITrE`o!;5ClXNPb4t*8P zzAivdr{j_v!=9!^?T3y?gzmqDWX6mkzhIzJ-3S{T5bcCFMr&RPDryMcdwbBuZbsgN zGrp@^i?rcfN7v0NKGzDPGE#4yszxu=I_`MI%Z|10nFjU-UjQXXA?k8Pk|OE<(?ae) zE%vG#eZAlj*E7_3dx#Zz4kMLj>H^;}33UAankJiDy5ZvEhrjr`!9eMD8COp}U*hP+ zF}KIYx@pkccIgyxFm#LNw~G&`;o&5)2`5aogs`1~7cMZQ7zj!%L4E`2yzlQN6REX20&O<9 zKV6fyr)TScJPPzNTC2gL+0x#=u>(({{D7j)c-%tvqls3#Y?Z1m zV5WUE)zdJ{$p>yX;^P!UcXP?UD~YM;IRa#Rs5~l+*$&nO(;Ers`G=0D!twR(0GF@c zHl9E5DQI}Oz74n zfKP>&$q0($T4y$6w(p=ERAFh+>n%iaeRA%!T%<^+pg?M)@ucY<&59$x9M#n+V&>}=nO9wCV{O~lg&v#+jcUj(tQ z`0u1YH)-`U$15a{pBkGyPL0THv1P|4e@pf@3IBZS4dVJPo#H>pWq%Lr0YS-SeWash z8R7=jb28KPMI|_lo#GEO|5B?N_e``H*23{~a!AmUJ+fb4HX-%QI@lSEUxKlGV7z7Q zSKw@-TR>@1RL%w{x}dW#k1NgW+q4yt2Xf1J62Bx*O^WG8OJ|FqI4&@d3_o8Id@*)4 zYrk=>@!wv~mh7YWv*bZhxqSmFh2Xq)o=m;%n$I?GSz49l1$xRpPu_^N(vZ>*>Z<04 z2+rP70oM=NDysd!@fQdM2OcyT?3T^Eb@lIC-UG=Bw{BjQ&P`KCv$AcJ;?`vdZ4){d z&gkoUK{$!$$K`3*O-jyM1~p-7T*qb)Ys>Myt^;#1&a%O@x8A+E>! zY8=eD`ZG)LVagDLBeHg>=atOG?Kr%h4B%E6m@J^C+U|y)XX@f z8oyJDW|9g=<#f<{JRr{y#~euMnv)`7j=%cHWLc}ngjq~7k**6%4u>Px&W%4D94(r* z+akunK}O0DC2A%Xo9jyF;DobX?!1I(7%}@7F>i%&nk*LMO)bMGg2N+1iqtg+r(70q zF5{Msgsm5GS7DT`kBsjMvOrkx&|EU!{{~gL4d2MWrAT=KBQ-^zQCUq{5PD1orxlIL zq;CvlWx#f1NWvh`hg011I%?T_s!e38l*lWVt|~z-PO4~~1g)SrJ|>*tXh=QfXT)%( z+ex+inPvD&O4Ur;JGz>$sUOnWdpSLcm1X%aQDw4{dB!cnj`^muI$CJ2%p&-kULVCE z>$eMR36kN$wCPR+OFDM3-U(VOrp9k3)lI&YVFqd;Kpz~K)@Fa&FRw}L(SoD z9B4a+hQzZT-BnVltst&=kq6Y(f^S4hIGNKYBgMxGJ^;2yrO}P3;r)(-I-CZ)26Y6? z&rzHI_1GCvGkgy-t1E;r^3Le30|%$ebDRu2+gdLG)r=A~Qz`}~&L@aGJ{}vVs_GE* zVUjFnzHiXfKQbpv&bR&}l2bzIjAooB)=-XNcYmrGmBh(&iu@o!^hn0^#}m2yZZUK8 zufVm7Gq0y`Mj;9b>`c?&PZkU0j4>IL=UL&-Lp3j&47B5pAW4JceG{!XCA)kT<%2nqCxj<)uy6XR_uws~>_MEKPOpAQ!H zkn>FKh)<9DwwS*|Y(q?$^N!6(51O0 z^JM~Ax{AI1Oj$fs-S5d4T7Z_i1?{%0SsIuQ&r8#(JA=2iLcTN+?>wOL532%&dMYkT z*T5xepC+V6zxhS@vNbMoi|i)=rpli@R9~P!39tWbSSb904ekv7D#quKbgFEMTb48P zuq(VJ+&L8aWU(_FCD$3^uD!YM%O^K(dvy~Wm2hUuh6bD|#(I39Xt>N1Y{ZqXL`Fg6 zKQ?T2htHN!(Bx;tV2bfTtIj7e)liN-29s1kew>v(D^@)#v;}C4-G=7x#;-dM4yRWm zyY`cS21ulzMK{PoaQ6xChEZ}o_#}X-o}<&0)$1#3we?+QeLt;aVCjeA)hn!}UaKt< zat1fHEx13y-rXNMvpUUmCVzocPmN~-Y4(YJvQ#db)4|%B!rBsgAe+*yor~}FrNH08 z3V!97S}D7d$zbSD{$z;@IYMxM6aHdypIuS*pr_U6;#Y!_?0i|&yU*@16l z*dcMqDQgfNBf}?quiu4e>H)yTVfsp#f+Du0@=Kc41QockXkCkvu>FBd6Q+@FL!(Yx z2`YuX#eMEiLEDhp+9uFqME_E^faV&~9qjBHJkIp~%$x^bN=N)K@kvSVEMdDuzA0sn z88CBG?`RX1@#hQNd`o^V{37)!w|nA)QfiYBE^m=yQKv-fQF+UCMcuEe1d4BH7$?>b zJl-r9@0^Ie=)guO1vOd=i$_4sz>y3x^R7n4ED!5oXL3@5**h(xr%Hv)_gILarO46q+MaDOF%ChaymKoI6JU5Pg;7#2n9-18|S1;AK+ zgsn6;k6-%!QD>D?cFy}8F;r@z8H9xN1jsOBw2vQONVqBVEbkiNUqgw~*!^##ht>w0 zUOykwH=$LwX2j&nLy=@{hr)2O&-wm-NyjW7n~Zs9UlH;P7iP3 zI}S(r0YFVYacnKH(+{*)Tbw)@;6>%=&Th=+Z6NHo_tR|JCI8TJiXv2N7ei7M^Q+RM z?9o`meH$5Yi;@9XaNR#jIK^&{N|DYNNbtdb)XW1Lv2k{E>;?F`#Pq|&_;gm~&~Zc9 zf+6ZE%{x4|{YdtE?a^gKyzr}dA>OxQv+pq|@IXL%WS0CiX!V zm$fCePA%lU{%pTKD7|5NJHeXg=I0jL@$tOF@K*MI$)f?om)D63K*M|r`gb9edD1~Y zc|w7N)Y%do7=0{RC|AziW7#am$)9jciRJ?IWl9PE{G3U+$%FcyKs_0Cgq`=K3@ttV z9g;M!3z~f_?P%y3-ph%vBMeS@p7P&Ea8M@97+%XEj*(1E6vHj==d zjsoviB>j^$_^OI_DEPvFkVo(BGRo%cJeD){6Uckei=~1}>sp299|IRjhXe)%?uP0I zF5+>?0#Ye}T^Y$u_rc4=lPcq4K^D(TZG-w30-YiEM=dcK+4#o*>lJ8&JLi+3UcpZk z!^?95S^C0ja^jwP`|{<+3cBVog$(mRdQmadS+Vh~z zS@|P}=|z3P6uS+&@QsMp0no9Od&27O&14zHXGAOEy zh~OKpymK5C%;LLb467@KgIiVwYbYd6wFxI{0-~MOGfTq$nBTB!{SrWmL9Hs}C&l&l#m?s*{tA?BHS4mVKHAVMqm63H<|c5n0~k)-kbg zXidai&9ZUy0~WFYYKT;oe~rytRk?)r8bptITsWj(@HLI;@=v5|XUnSls7$uaxFRL+ zRVMGuL3w}NbV1`^=Pw*0?>bm8+xfeY(1PikW*PB>>Tq(FR`91N0c2&>lL2sZo5=VD zQY{>7dh_TX98L2)n{2OV=T10~*YzX27i2Q7W86M4$?gZIXZaBq#sA*{PH8){|GUi;oM>e?ua7eF4WFuFYZSG| zze?srg|5Ti8Og{O zeFxuw9!U+zhyk?@w zjsA6(oKD=Ka;A>Ca)oPORxK+kxH#O@zhC!!XS4@=swnuMk>t+JmLmFiE^1aX3f<)D@`%K0FGK^gg1a1j>zi z2KhV>sjU7AX3F$SEqrXSC}fRx64GDoc%!u2Yag68Lw@w9v;xOONf@o)Lc|Uh3<21ctTYu-mFZuHk*+R{GjXHIGq3p)tFtQp%TYqD=j1&y)>@zxoxUJ!G@ zgI0XKmP6MNzw>nRxK$-Gbzs}dyfFzt>#5;f6oR27ql!%+{tr+(`(>%51|k`ML} zY4eE)Lxq|JMas(;JibNQds1bUB&r}ydMQXBY4x(^&fY_&LlQC)3hylc$~8&~|06-D z#T+%66rYbHX%^KuqJED_wuGB+=h`nWA!>1n0)3wZrBG3%`b^Ozv6__dNa@%V14|!D zQ?o$z5u0^8`giv%qE!BzZ!3j;BlDlJDk)h@9{nSQeEk!z9RGW) z${RSF3phEM*ce*>Xdp}585vj$|40=&S{S-GTiE?Op*vY&Lvr9}BO$XWy80IF+6@%n z5*2ueT_g@ofP#u5pxb7n*fv^Xtt7&?SRc{*2Ka-*!BuOpf}neHGCiHy$@Ka1^Dint z;DkmIL$-e)rj4o2WQV%Gy;Xg(_Bh#qeOsTM2f@KEe~4kJ8kNLQ+;(!j^bgJMcNhvklP5Z6I+9Fq@c&D~8Fb-4rmDT!MB5QC{Dsb;BharP*O;SF4& zc$wj-7Oep7#$WZN!1nznc@Vb<_Dn%ga-O#J(l=OGB`dy=Sy&$(5-n3zzu%d7E#^8`T@}V+5B;PP8J14#4cCPw-SQTdGa2gWL0*zKM z#DfSXs_iWOMt)0*+Y>Lkd=LlyoHjublNLefhKBv@JoC>P7N1_#> zv=mLWe96%EY;!ZGSQDbZWb#;tzqAGgx~uk+-$+2_8U`!ypbwXl z^2E-FkM1?lY@yt8=J3%QK+xaZ6ok=-y%=KXCD^0r!5vUneW>95PzCkOPO*t}p$;-> ze5j-BLT_;)cZQzR2CEsm@rU7GZfFtdp*a|g4wDr%8?2QkIGasRfDWT-Dvy*U{?IHT z*}wGnzdlSptl#ZF^sf)KT|BJs&kLG91^A6ls{CzFprZ6-Y!V0Xysh%9p%iMd7HLsS zN+^Un$tDV)T@i!v?3o0Fsx2qI(AX_$dDkBzQ@fRM%n zRXk6hb9Py#JXUs+7)w@eo;g%QQ95Yq!K_d=z{0dGS+pToEI6=Bo8+{k$7&Z zo4>PH(`ce8E-Ps&uv`NQ;U$%t;w~|@E3WVOCi~R4oj5wP?%<*1C%}Jq%a^q~T7u>K zML5AKfQDv6>PuT`{SrKHRAF+^&edg6+5R_#H?Lz3iGoWo#PCEd0DS;)2U({{X#zU^ zw_xv{4x7|t!S)>44J;KfA|DC?;uQ($l+5Vp7oeqf7{GBF9356nx|&B~gs+@N^gSdd zvb*>&W)|u#F{Z_b`f#GVtQ`pYv3#||N{xj1NgB<#=Odt6{eB%#9RLt5v zIi|0u70`#ai}9fJjKv7dE!9ZrOIX!3{$z_K5FBd-Kp-&e4(J$LD-)NMTp^_pB`RT; zftVVlK2g@+1Ahv2$D){@Y#cL#dUj9*&%#6 zd2m9{1NYp>)6=oAvqdCn5#cx{AJ%S8skUgMglu2*IAtd+z1>B&`MuEAS(D(<6X#Lj z?f4CFx$)M&$=7*>9v1ER4b6!SIz-m0e{o0BfkySREchp?WdVPpQCh!q$t>?rL!&Jg zd#heM;&~A}VEm8Dvy&P|J*eAV&w!&Nx6HFV&B8jJFVTmgLaswn!cx$&%JbTsloz!3 zMEz1d`k==`Ueub_JAy_&`!ogbwx27^ZXgFNAbx=g_I~5nO^r)}&myw~+yY*cJl4$I znNJ32M&K=0(2Dj_>@39`3=FX!v3nZHno_@q^!y}%(yw0PqOo=);6Y@&ylVe>nMOZ~ zd>j#QQSBn3oaWd;qy$&5(5H$Ayi)0haAYO6TH>FR?rhqHmNOO+(})NB zLI@B@v0)eq!ug`>G<@htRlp3n!EpU|n+G+AvXFrWSUsLMBfL*ZB`CRsIVHNTR&b?K zxBgsN0BjfB>UVcJ|x%=-zb%OV7lmZc& zxiupadZVF7)6QuhoY;;FK2b*qL0J-Rn-8!X4ZY$-ZSUXV5DFd7`T41c(#lAeLMoeT z4%g655v@7AqT!i@)Edt5JMbN(=Q-6{=L4iG8RA%}w;&pKmtWvI4?G9pVRp|RTw`g0 zD5c12B&A2&P6Ng~8WM2eIW=wxd?r7A*N+&!Be7PX3s|7~z=APxm=A?5 zt>xB4WG|*Td@VX{Rs)PV0|yK`oI3^xn(4c_j&vgxk_Y3o(-`_5o`V zRTghg6%l@(qodXN;dB#+OKJEEvhfcnc#BeO2|E(5df-!fKDZ!%9!^BJ_4)9P+9Dq5 zK1=(v?KmIp34r?z{NEWnLB3Px{XYwy-akun4F7xTRr2^zeYW{gcK9)>aJDdU5;w5@ zak=<+-PLH-|04pelTb%ULpuuuJC7DgyT@D|p{!V!0v3KpDnRjANN12q6SUR3mb9<- z>2r~IApQGhstZ!3*?5V z8#)hJ0TdZg0M-BK#nGFP>$i=qk82DO z7h;Ft!D5E15OgW)&%lej*?^1~2=*Z5$2VX>V{x8SC+{i10BbtUk9@I#Vi&hX)q
Q!LwySI{Bnv%Sm)yh{^sSVJ8&h_D-BJ_YZe5eCaAWU9b$O2c z$T|{vWVRtOL!xC0DTc(Qbe`ItNtt5hr<)VijD0{U;T#bUEp381_y`%ZIav?kuYG{iyYdEBPW=*xNSc;Rlt6~F4M`5G+VtOjc z*0qGzCb@gME5udTjJA-9O<&TWd~}ysBd(eVT1-H82-doyH9RST)|+Pb{o*;$j9Tjs zhU!IlsPsj8=(x3bAKJTopW3^6AKROHR^7wZ185wJGVhA~hEc|LP;k7NEz-@4p5o}F z`AD6naG3(n=NF9HTH81=F+Q|JOz$7wm9I<+#BSmB@o_cLt2GkW9|?7mM;r!JZp89l zbo!Hp8=n!XH1{GwaDU+k)pGp`C|cXkCU5%vcH)+v@0eK>%7gWxmuMu9YLlChA|_D@ zi#5zovN_!a-0?~pUV-Rj*1P)KwdU-LguR>YM&*Nen+ln8Q$?WFCJg%DY%K}2!!1FE zDv-A%Cbwo^p(lzac&_TZ-l#9kq`mhLcY3h9ZTUVCM(Ad&=EriQY5{jJv<5K&g|*Lk zgV%ILnf1%8V2B0E&;Sp4sYbYOvvMebLwYwzkRQ#F8GpTQq#uv=J`uaSJ34OWITeSGo6+-8Xw znCk*n{kdDEi)Hi&u^)~cs@iyCkFWB2SWZU|Uc%^43ZIZQ-vWNExCCtDWjqHs;;tWf$v{}0{p0Rvxkq``)*>+Akq%|Na zA`@~-Vfe|+(AIlqru+7Ceh4nsVmO9p9jc8}HX^W&ViBDXT+uXbT#R#idPn&L>+#b6 zflC-4C5-X;kUnR~L>PSLh*gvL68}RBsu#2l`s_9KjUWRhiqF`j)`y`2`YU(>3bdBj z?>iyjEhe-~$^I5!nn%B6Wh+I`FvLNvauve~eX<+Ipl&04 zT}};W&1a3%W?dJ2=N#0t?e+aK+%t}5q%jSLvp3jZ%?&F}nOOWr>+{GFIa%wO_2`et z=JzoRR~}iKuuR+azPI8;Gf9)z3kyA4EIOSl!sRR$DlW}0>&?GbgPojmjmnln;cTqCt=ADbE zZ8GAnoM+S1(5$i8^O4t`ue;vO4i}z0wz-QEIVe5_u03;}-!G1NyY8;h^}y;tzY}i5 zqQr#Ur3Fy8sSa$Q0ys+f`!`+>9WbvU_I`Sj;$4{S>O3?#inLHCrtLy~!s#WXV=oVP zeE93*Nc`PBi4q@%Ao$x4lw9vLHM!6mn3-b_cebF|n-2vt-zYVF_&sDE--J-P;2WHo z+@n2areE0o$LjvjlV2X7ZU@j+`{*8zq`JR3gKF#EW|#+{nMyo-a>nFFTg&vhyT=b} zDa8+v0(Dgx0yRL@ZXOYIlVSZ0|MFizy0VPW8;AfA5|pe!#j zX}Py^8fl5SyS4g1WSKKtnyP+_PoOwMMwu`(i@Z)diJp~U54*-miOchy7Z35eL>^M z4p<-aIxH4VUZgS783@H%M7P9hX>t{|RU7$n4T(brCG#h9e9p! z+o`i;EGGq3&pF;~5V~eBD}lC)>if$w%Vf}AFxGqO88|ApfHf&Bvu+xdG)@vuF}Yvk z)o;~k-%+0K0g+L`Wala!$=ZV|z$e%>f0%XoLib%)!R^RoS+{!#X?h-6uu zF&&KxORdZU&EwQFITIRLo(7TA3W}y6X{?Y%y2j0It!ekU#<)$qghZtpcS>L3uh`Uj z7GY;6f$9qKynP#oS3$$a{p^{D+0oJQ71`1?OAn_m8)UGZmj3l*ZI)`V-a>MKGGFG< z&^jg#Ok%(hhm>hSrZ5;Qga4u(?^i>GiW_j9%_7M>j(^|Om$#{k+^*ULnEgzW_1gCICtAD^WpC`A z{9&DXkG#01Xo)U$OC(L5Y$DQ|Q4C6CjUKk1UkPj$nXH##J{c8e#K|&{mA*;b$r0E4 zUNo0jthwA(c&N1l=PEe8Rw_8cEl|-eya9z&H3#n`B$t#+aJ03RFMzrV@gowbe8v(c zIFM60^0&lCFO10NU4w@|61xiZ4CVXeaKjd;d?sv52XM*lS8XiVjgWpRB;&U_C0g+`6B5V&w|O6B*_q zsATxL!M}+$He)1eOWECce#eS@2n^xhlB4<_Nn?yCVEQWDs(r`|@2GqLe<#(|&P0U? z$7V5IgpWf09uIf_RazRwC?qEqRaHyL?iiS05UiGesJy%^>-C{{ypTBI&B0-iUYhk> zIk<5xpsuV@g|z(AZD+C-;A!fTG=df1=<%nxy(a(IS+U{ME4ZbDEBtcD_3V=icT6*_ z)>|J?>&6%nvHhZERBtjK+s4xnut*@>GAmA5m*OTp$!^CHTr}vM4n(X1Q*;{e-Rd2BCF-u@1ZGm z!S8hJ6L=Gl4T_SDa7Xx|-{4mxveJg=ctf`BJ*fy!yF6Dz&?w(Q_6B}WQVtNI!BVBC zKfX<>7vd6C96}XAQmF-Jd?1Q4eTfRB3q7hCh0f!(JkdWT5<{iAE#dKy*Jxq&3a1@~ z8C||Dn2mFNyrUV|<-)C^_y7@8c2Fz+2jrae9deBDu;U}tJ{^xAdxCD248(k;dCJ%o z`y3sADe>U%suxwwv~8A1+R$VB=Q?%U?4joI$um;aH+eCrBqpn- z%79D_7rb;R-;-9RTrwi9dPlg8&@tfWhhZ(Vx&1PQ+6(huX`;M9x~LrW~~#3{j0Bh2kDU$}@!fFQej4VGkJv?M4rU^x!RU zEwhu$!CA_iDjFjrJa`aocySDX16?~;+wgav;}Zut6Mg%C4>}8FL?8)Kgwc(Qlj{@#2Pt0?G`$h7P#M+qoXtlV@d}%c&OzO+QYKK`kyXaK{U(O^2DyIXCZlNQjt0^8~8JzNGrIxhj}}M z&~QZlbx%t;MJ(Vux;2tgNKGlAqphLq%pd}JG9uoVHUo?|hN{pLQ6Em%r*+7t^<);X zm~6=qChlNAVXNN*Sow->*4;}T;l;D1I-5T{Bif@4_}=>l`tK;qqDdt5zvisCKhMAH z#r}`)7VW?LZqfdmXQ%zo5bJ00{Xb9^YKrk0Nf|oIW*K@(=`o2Vndz}ZDyk{!u}PVx zzd--+_WC*U{~DH3{?GI64IB+@On&@9X>EUAo&L+G{L^dozaI4C3G#2wr~hseW@K&g zKWs{uHu-9Je!3;4pE>eBltKUXb^*hG8I&413)$J&{D4N%7PcloU6bn%jPxJyQL?g* z9g+YFFEDiE`8rW^laCNzQmi7CTnPfwyg3VDHRAl>h=In6jeaVOP@!-CP60j3+#vpL zEYmh_oP0{-gTe7Or`L6x)6w?77QVi~jD8lWN@3RHcm80iV%M1A!+Y6iHM)05iC64tb$X2lV_%Txk@0l^hZqi^%Z?#- zE;LE0uFx)R08_S-#(wC=dS&}vj6P4>5ZWjhthP=*Hht&TdLtKDR;rXEX4*z0h74FA zMCINqrh3Vq;s%3MC1YL`{WjIAPkVL#3rj^9Pj9Ss7>7duy!9H0vYF%>1jh)EPqvlr6h%R%CxDsk| z!BACz7E%j?bm=pH6Eaw{+suniuY7C9Ut~1cWfOX9KW9=H><&kQlinPV3h9R>3nJvK z4L9(DRM=x;R&d#a@oFY7mB|m8h4692U5eYfcw|QKwqRsshN(q^v$4$)HgPpAJDJ`I zkqjq(8Cd!K!+wCd=d@w%~e$=gdUgD&wj$LQ1r>-E=O@c ze+Z$x{>6(JA-fNVr)X;*)40Eym1TtUZI1Pwwx1hUi+G1Jlk~vCYeXMNYtr)1?qwyg zsX_e*$h?380O00ou?0R@7-Fc59o$UvyVs4cUbujHUA>sH!}L54>`e` zHUx#Q+Hn&Og#YVOuo*niy*GU3rH;%f``nk#NN5-xrZ34NeH$l`4@t);4(+0|Z#I>Y z)~Kzs#exIAaf--65L0UHT_SvV8O2WYeD>Mq^Y6L!Xu8%vnpofG@w!}R7M28?i1*T&zp3X4^OMCY6(Dg<-! zXmcGQrRgHXGYre7GfTJ)rhl|rs%abKT_Nt24_Q``XH{88NVPW+`x4ZdrMuO0iZ0g` z%p}y};~T5gbb9SeL8BSc`SO#ixC$@QhXxZ=B}L`tP}&k?1oSPS=4%{UOHe0<_XWln zwbl5cn(j-qK`)vGHY5B5C|QZd5)W7c@{bNVXqJ!!n$^ufc?N9C-BF2QK1(kv++h!>$QbAjq)_b$$PcJdV+F7hz0Hu@ zqj+}m0qn{t^tD3DfBb~0B36|Q`bs*xs|$i^G4uNUEBl4g;op-;Wl~iThgga?+dL7s zUP(8lMO?g{GcYpDS{NM!UA8Hco?#}eNEioRBHy4`mq!Pd-9@-97|k$hpEX>xoX+dY zDr$wfm^P&}Wu{!%?)U_(%Mn79$(ywvu*kJ9r4u|MyYLI_67U7%6Gd_vb##Nerf@>& z8W11z$$~xEZt$dPG}+*IZky+os5Ju2eRi;1=rUEeIn>t-AzC_IGM-IXWK3^6QNU+2pe=MBn4I*R@A%-iLDCOHTE-O^wo$sL_h{dcPl=^muAQb`_BRm};=cy{qSkui;`WSsj9%c^+bIDQ z0`_?KX0<-=o!t{u(Ln)v>%VGL z0pC=GB7*AQ?N7N{ut*a%MH-tdtNmNC+Yf$|KS)BW(gQJ*z$d{+{j?(e&hgTy^2|AR9vx1Xre2fagGv0YXWqtNkg*v%40v?BJBt|f9wX5 z{QTlCM}b-0{mV?IG>TW_BdviUKhtosrBqdfq&Frdz>cF~yK{P@(w{Vr7z2qKFwLhc zQuogKO@~YwyS9%+d-zD7mJG~@?EFJLSn!a&mhE5$_4xBl&6QHMzL?CdzEnC~C3$X@ zvY!{_GR06ep5;<#cKCSJ%srxX=+pn?ywDwtJ2{TV;0DKBO2t++B(tIO4)Wh`rD13P z4fE$#%zkd=UzOB74gi=-*CuID&Z3zI^-`4U^S?dHxK8fP*;fE|a(KYMgMUo`THIS1f!*6dOI2 zFjC3O=-AL`6=9pp;`CYPTdVX z8(*?V&%QoipuH0>WKlL8A*zTKckD!paN@~hh zmXzm~qZhMGVdQGd=AG8&20HW0RGV8X{$9LldFZYm zE?}`Q3i?xJRz43S?VFMmqRyvWaS#(~Lempg9nTM$EFDP(Gzx#$r)W&lpFKqcAoJh-AxEw$-bjW>`_+gEi z2w`99#UbFZGiQjS8kj~@PGqpsPX`T{YOj`CaEqTFag;$jY z8_{Wzz>HXx&G*Dx<5skhpETxIdhKH?DtY@b9l8$l?UkM#J-Snmts7bd7xayKTFJ(u zyAT&@6cAYcs{PBfpqZa%sxhJ5nSZBPji?Zlf&}#L?t)vC4X5VLp%~fz2Sx<*oN<7` z?ge=k<=X7r<~F7Tvp9#HB{!mA!QWBOf%EiSJ6KIF8QZNjg&x~-%e*tflL(ji_S^sO ztmib1rp09uon}RcsFi#k)oLs@$?vs(i>5k3YN%$T(5Or(TZ5JW9mA6mIMD08=749$ z!d+l*iu{Il7^Yu}H;lgw=En1sJpCKPSqTCHy4(f&NPelr31^*l%KHq^QE>z>Ks_bH zjbD?({~8Din7IvZeJ>8Ey=e;I?thpzD=zE5UHeO|neioJwG;IyLk?xOz(yO&0DTU~ z^#)xcs|s>Flgmp;SmYJ4g(|HMu3v7#;c*Aa8iF#UZo7CvDq4>8#qLJ|YdZ!AsH%^_7N1IQjCro

K7UpUK$>l@ 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 E2O(~oYXATM literal 54712 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

49F z#-T-=dw(N6=)iK%<^NT)|NLJL3jh8D`j3C*KWa?-fBYLO6Rl+Czc)6%nlaB$Kru-} zrXl@!Aro@*Lg?f?z(xfT9YQY zvpsKYvmI~QuV;66ef*Fe3Ij!+$EZs=B@t7hE60m;g(gN(Oi-evKRENMALT0Fb7Agx z8AOGy$7?xUGv0KZAkl2Fv~b)u3Bzs=ZT?muv-dzVba>par{rV;IbbE-EEFYY*s zGiupeZq+#Ki*+-U{HY-wj^}-Bq#Hi`8*uo!pzX-DN!8J{+$i20Cju)RofwaJ@0{#h zKfb$q6%zoJZ+(Q8UdwfG+iw0)yMF^LV4q3Zm>FGOlhM#lD;^4{3ss<`rH^(YXUlf*Zu)hr?fRpX_*n(i*?lnyiv~w*PzjW_0(&+{+ec4qCEeN~15Nk@L2!qM)_6W{S{PB#q2L?Cb>ngOy<5iCik<@f zkRvk7o$8QOP^-b?ul@_$rfj|2mrXtvR#z4DqBiM=ntO7hS2~ZA#q+ORy}inp>Qkq| zLd*%O^H1qtE{W~yPk6Y#m2{%##&C z{2y=x!<3h1hR(1}eeqW-+vV0`7gaFFmZ2%%O9%qz`O zs`HD6%d3`U-nl%vUwu;z{z;`z8YXXrU->+F^Y+dLV8k`OwnaKuj?x_EeXqmbVO`)`}_|_sor&nfM0{RTu*0 zPNWNwipq$9Yht~_YDRy%ynb|Z2-2f8QBPDHly@#yFVkF9P^(u~h}_JuHf>fauTn$j zr#TCudXGqdrSqCJS(RBbSgug)CZ0DAn%q@)xnUZ$(jCO7J!Uerx|7a$ZqmkemE8Xh>NkUmEH7=WK?AM9{*^HyT9Vzu$MUDxv5aWYPfL(iZi>XagCnFv?d z=`H=Y!r6j9jgnQvyMn+a5v=Ia@?v2DE`9|8V|ykXi0NaCpL{RS=9J_1UdT0&?FI2}knVhnDWKqhU4HMmJYV&4j z50ah1WBIsHo8aN}L$(OD&^~61aeGL8u*Chr{Z|z7Aepg{{X1_ieUD3o|1W2VfS$dP zn60uSUsY96!yAMuODmD7betq~ zB7ETz2MiJQrA*(vd?B}tSFN0qhr0K?cLtNwUUWU4M9`0^F(W_*2jH$IGP&%Hr!Fp@ zado-?O?L)-qT+lb*yUaFqKesJlv*nC%kqozr(&$dRD!I61Y7N`PI%P76$%&{{1c zdkydM{UY6UT)rP(S~(UFQ3VoF56HA}E-CBU_xkl`4r7eipF6~QVMwply|=pM(8k$v zGIsJ%bg&5Pnm!?GUDhq>NBA&FfhDO30jTk|F3+V-2;Yikl%gf}G#cFQa+w9=Vof9L zFjS#8AA_O0-Nl_v*+bLk!VF_V)T4!HrBS3+9=+Sv0&WP4d}rUDd@DhsVP6jwqDYM- zR=@tpb^(2DC>1v2Sn}69y|+O&r2dL}VaTrTM*|x3{vzxBMeX@3|Dwr?b}g|vSsf%} z|0la!T97m@veB$bQb5s>AWOV8irU(bg0k#fPka%9sHp}BbF&TN?F^tAU%-W`8L<5W z_}q9y$i_D&gv-rn(aWiX>qM* zeow-?>XIXA&3iV42Ozt}HI{<2hi+lFr{p2~`)?rOY%}EmM2$*$Qn{RZ3LyMb-X(;~ zEvv^Xz&pTygnKBn#3WK!Gnbshg%{;@LgrtilLyuGYxujO3;w42as6MSQ^NY&sr?^S z-9K`kf`gue(Ld_DO;rmQq(fw{Zo_yrVxXYFAHK@PX)%WOumIsR4S0D4LA;of5e;j4 z&XS-k4C|?@z!!t!8kd{eGtA2FwP0&*zTyb{9Shnud5=qZGG9-wZ=9ZQ+u4;|CdN+R zVz4!#JnzTp-@9)cUH0!&SA$lDL+*Pr!`g_|^w&I(Cf8=95AF!Gnm}^yScIG6*Z;!PJ zZ+cmO5xWGh5l-^3q}peCSvxeu$gpLS^5!+^?j6kATFtj}HeU0_DX0aXE`p+a zt2j`P7FsxA%cPQQ6V~F12#SU`Bfqgk>Bj7+DN*o}l;|1UXj{p2h!MKP-EVtpIp{;D zZ*DzC+{*+R<^1*@U>wx|`h2BtdsVW#(4h5s)CD5hIZq4SEV0AyX?tfRoZE67&f(@d zWr>Ca_NZ!mw}dP?myN+uu>P|_0K8A|ts*4}ZNbw28GwFZ3qjR6-b^Z`ONniELwm!g zui`*smA?Hlb|J;O4Y2*}zJIZ1LlN8p-8I(37O;HfIqmZ4TtrizYDT%+61!a3!8!V9 zLPJ}9+os$ZeNU3u;YmC-xeky>II?H0qT|BRQNx~Ussdshd-2kf51m|$rs32|yY5hk zdjt+V8j^Qs`wR9|Eu(EyVmFS!s-xk4u6GN2M3KB{r7?cxfWIZoR27f5YVEWEsLKSEN_jQpE<_iF742n(TzX*^dtjoRQjE zfj!;{H}sV6r5Sj55}aM-L%DKkk=@aJV-9<aS;aPxtQLYftA|hGX0EmaXW1HM2mR zp+%CV=I~pkst04Ic0m({9@UfRjBT&Yrdu`VfH#cG;B?r|^io9a{xUK}QnPwT5J;8S z!3p&RdQ@Mw!`?-#^Bh{cJrvrruVZ&1MXDZr#!Rd+M|QWi)!>$X{Tk^hbM4ciAOE^g z#L44#`BSE*$1xYt4$)?+3QxkGve>BL1GdX~ketS%HP(lKggG#_+!@RWthtz4JmQS* z86%<(AmtJ+3LP3W50(!~ovWbJdT~W-NGpi-S0GnrJ`tp~5jgoXU^XK|`+~qSL#6~5 z`RMc>K8+hKOeQST3#POM78p~Xr>yBu#c&TbR2?rYP+dM0LAO}b@MNVBAAc?=PS8$R z!VDZ&=V|rkE)CR9gX9%k{^-vd<@#y2G9K2L9sSl2xvQ<9y@Qm4`1wq`2!y&?^^J3C z^3^Dt*;iia**HufXcxQnyzkn$STF;odj%J@z!CIM)!X4^#qeZ#X81{VrcDf`Cp0Z+W=^^a-&bEK! z>~=jr#G--EM9|l>4?Ud+d9<%sJmQdm+Sj4rcfIi@ATl#@Qcy7)KyWO<(U z9UV4NMveNf9N*Mms~{P4;85FDO%S8rbxdjh;PwkFIDW`4OOL z;D705t}Jg!6`w3*hm7-#cAAu1u@iC0C7|e32)NGc=)9k_SobhJ&b&SO;459xR23bB z`ss_mF*?^R$q}9irLK3r$tH?awjOxi1gC$X@mscl?O0`tM1Q)cHjS^=+$JVQ1xVtk`*houY2pfBy z&DUyjn`~y1(k@s^F`tb*zNnHje2lYKm=ls|R7jnp#N#T!Rb7R~UmUvk<|ZP%@|F>_A&^a+RUPM!Vo z)&f6!!VwGq%6lw8HrLwIkPBD^HKLtn8QCqx=nPR=L$rOy*Qnh54m+hl-hThl>sHT< zKGQEV+J2rVh)b&PPNIt?o5m6=JcK`u>^Z zZ8}1yBMNvhj4H8qeo2c&r59>l=o|wfAWy&d;2!*!+) zAOZ{48Tj@|)i`U{G0FnMK22RC6Fy-dViO#-fxXB8=EQtl&Khj&RZosn&DMwr4PF#Jds)08b#V{D%yuW1a_b>14dvRtr5E4Dil z)*OdH7O~lxX{G9R72!D+8Orpb+erONxQpQ3ceZlD9w;~%jH!xXY^>4s=0MUgalw+? zr>kJyq69SN;j0yaz&F=U3~%uCIXrXp1MTaDi`Y-K6cTies(9(c_G|RY^I;MQmq##7 z@4R~mRZLZ7{YbzFISIKiiH`V82|tj1KLpBhUnlRp&kgLyF~B1mbH>m)$*Mx&kTlL| z<&=#Am5Wvtn==gq8_xqO+JbQuX=QbR-g@U{u|WYB;mgc%U~3``JSrR_he?q1>|=uq z5>Ut$dtzBHhevmW&1N$IL{1u)`+5MK0nghS9IBTz(Jri3n4f(c!&+c79A~N?B@>N@ zS3o{u?5R#J?)VT!@31&%%3T;g0a!+t$a{%!sA9DOq~fvGK$~4@eyL(edo#}gEJj;Y zZH!r*6$DengoD%s@fMj{7xX*2a;NAd^Mwf2)r-6jwe1!5iGUtZ1n2?3HAnup={xJ% z8UAgKT&i>=iwsz})oC>zIaQ)&d9Fd|AvU5wv-TH2BQcV|B~P<-c-0-Lqt`WkJD&X{ zeg^fhi6A2qPQvF62m;fHSD#E4-N+an9Zs^(cm8(#^l#j_@0QUGt$Pz5{xh76r+N5j&b^x~{H58<%?bvd&D4Mn^L?QV{M^qZt%Amzn(j zw*#fNO`QRxj|89loiLd`Y2U>kSTuhldP{x3RM6ad#F0N=-LRA7uK|C=w3zYn$-Hr3 zRaxe{zgMs>MiSN0nM$*ceStj1eWx8(aYF&DJRMfmdOAsXx1*EhPB4LM$=CbG-A-=4 zm3(CxCWyDrdF0H~t`EHLAS4dK%dRSO3MIj7 zgE=(zCuyA=LVc`2=N4Hv>jh>Bwn;qRk5VIY4dIkgey5HRPJazm1-8*5ine!S{nuq7 ziD=2Y27t+z0!*I$cb0{JnEXpGMVyj3z~PVKDLXeI&xNs>Jq#19psW-7%J;2^jo251 zS237K{P7dR(PgBT;t!ZluUl`x!bk$go+vilX2Ho*P-04VT6j*jn-i|)WtVjzJzW(d+W z1(9{Vov|BURz7dP;KPDoldMvzvzosTG`8hK3h6K&GVVXbg@`|hUH(?Nj_Gs2NP*hN z*ivPA(<&LfU39=&9cYZRkgr@v8(tyP#kr-+hmmgm;WmYjg1vC%8^!p2CoQ~?G%sG3 za(}^MzBKIA8Ti~OX`}hnhVs|_C|f;~+I5y{^))qFVFX9eBuWR0Yxs!a51G!=(;@yc z;MHf9hLn5Fw4Di}fe%{au#c?8>llKebES9X{^~x4=3XH!nD0Yr?P%wg;#JsJ)tYZN zwbs$=&A~8X0a*-bp~^95kLPbH;?sy(Rx~;ucStR$=R2^ITT+g6<|E+L*xbKt+~jX+ z_&Dl0^`(aiQX~o_=~9)M;Uwr&JYHWsJ62ZM!{)T8i~Hg5qfIvkV)_f3;0D2%^ZW|}lLlA3{qUZ7#;!eM1QXF~dX z!m(A`VBs=th)m@TIt_<>MSO9%DdZF&pB?wwn{f%^y|9_Q!9!ds>7Hg9x9|q=2Dwwj zmh**{&_db?l4UTugl%gZ2VuG(UrPjAFeo`A(RdnY7Oo@d1&-+UGzgD{aaD-8i0x2; zOPFL;T2`nGBB_xRMH9KalX)&-o5a|tmYz=flkrjph8*!cA}_br1oS;8WO1Fej+ z*EVUUNMom|7d-S4^a7R{U+TqoSY~L#iPW}(>E4x~NQO)Y<9OJGxcDr+=nbhBnqvik zBWwA8SAqKV*4KaWkHo#x`k?~F`$g@GlZ;Gt@`iI5r5L3Z%6k$b69E)o=qR2WHp#%F zej{Zga?TZ-#nt6rLNWbK z40faeo;Mcr+sZ|u(lwcM8|tOLsJdV4+rahg1^2C0*VneF;Iuh;&<6_Cqd}dTXIn~f z!|oE;^4kg|VW$;cK!MBq21i|u%l^zIjEYY|GU4iH0?s{o)zXx$n>h1O_KAYC!U5|h zcS;N>+JG-4PY4~{ts_uxoGl!}vyL3z4_aBzmEMUyo7 zHY({_lQ!?WKms|gQ(zlvc%Py);GI)ujdmBU?2~lc&4X%pqQB@hIn@s`XdLp+rBGTj zl9*`=GZ@TSsFa-4Ir%@wpKu5{ecxaDy3tCzNs$EUeB>>-`WBAckivbtv9p|$2NLv1 z-8_A@I+@R!qqB&+R_R=w_L$8elzj=o|2;=I`KzRS$oKPti|ZM4uAz5fXwr}V`9kHJ z<}Up}fph4Su6!9q$)bl-zAQ?nXqeFG9gMJNAGAOPvl^=fPSww%_wS))tUug)YBg7H zkN3Gz4NC_{=wfi$VMKk4ilBkj(=Ie|DbdHIhDBb^%Q#t-6~5t0*HP+&d&5`}5^<0? zc^aE#N4XE%3pjbm?Us$lG@Q!M{9#Cx(<&zgcMo3ZIH-f0d&v;vz`h~x`eM+viFOHm z;>bCZ9Mv?x@Y~pCAkSkx?BgtkOl+^DwybQ@Z0=zAcnWr&NlG?HsoFV)?HBi8e@%l4HYIO%=!u7VMEJZB&K4Yjdwh>23a<+i(-qrj zOfof2lqsHM9H!Ff&TWjwSU%>}6vbjU4T!pX5%Z1lXu0JDFmWY-iT{60aDTlsk)}8X z&^JJNGHNv3Q_uXKqf-;Cnw8i8P5_dUFq(`^28*#Ha@Ud~hRL8w+NrMF3ru!}XFe2N zf`u{tF(=Hr7Bw!L70+qq)9s4eYP0K?_iY{zu$lgjFi^u96&HF$)_NVjKB6r=Y?Zln zk_%+AJjMx zvkoyiwwzixtTRg-8Zx?L-nXGRA7O*-1fh0(iBg2JDf(3^*#lwC%q<}KHIA#N1jp4~ zP^Dez_;E*NNzk^oT$Y({d+@2pmg5*lE3sqMd-{U~eUp>q2FynDy zpZAz8uj;Bf{(Zt&Y-^K)Tmva?tO$~@WQpELH*#Qs2dAJHrq0B~vtkXDN+642#cXCUiJ^Y@Io~dE+)C7oiIXY}m9(&EckfGD8mk^8&#XH_g#UtYdeJT%o&S-GU@$Clm zyE_soUw~5jN61pg5GN>8OC$xv0o*0RaO4Ih1Dk|h!>BIa$*^g7#4)Fj*5k5aTjN4! zFvFsEbPV%PLwiA7J?|FM_sG7I3^bMMv)9orztUt3-+X0c${!en$QL9YmD+_d01HrR z)rqY(jh29$v_yR?@{RkigEuXzi7y1evYP;#Z%n^4c>is^7N@ZKLuK?ymJ$WVzI{oN z1(_X(foOXg_KyE{Bb1Eq2I58>bIkIqfgh;pWIFzJ z>WTYK>f)-G=M%6EP@fpqA{*2EXtvoVrW4IHEem9lO8Q0ioWEj=tq=ou$2e(;6Yn0L zcG!K{9mO4=o7A!n!2@y@kEL9yk;AtD|E0>eS;Zfsg6ET-3G#}$S|NoK5Hywr!c(J= zgjXHGTX!6M&s6)f$|ARv3MLo*J5}BHnk));cNMn4qARpd(nF=!Z-gRJwR3qm&Ddq3 z)aaX`C81a+X^b}@seMv~zEnt4kln$p6xfFhQ#RG7VOo5PgxS(1DDQ7gn;V<7hu%`` z=jN;)C-Ht;OdrT)a$t#_k%3(Fj4V^())9bJf5O{x6P}b9Z$*IsqvosRh0J!PAp_&) zdYEI9B|5K>&wG5l>K$>nb4)pSYVAV2UGG;+WaH`5T0t=~zCc8$Im$={N zG#FAChsBVh+q)OAj(sp}a1r#@f+&RFM~KfICRdJ}SQ>FF3{&{fnDmcGZb--X=9VUH zeMiZ-V9j7j&qONV4d1M@Nif8u3dBH)K66Cp5D)Ey>p%6*zAoJ&Ads_h(e^c>)%$67q3%WJ&s4V9#85{fVONk z1YtL!xfmt{i&Gh5I=6Z{Vtq}AMQm9^%wg@mZl>e);0Qk;IuA8AkpaW*gDlQ28-^wf zeMr*P>#+?_UH_h)w*wuYq~Rn*YK5-yMx%T~Y=7+>mhc!0b|B990c=cdiOtSD-FyKY zw+ALjHE=y=m`|=UB7-0bY>KT#6r9&1wUSfNt;cv4vvWu`D&zo-vN&!s|CsMvN<5wR z7D|21sFuQ^pU%9SS+oR*+~H2``J`w4c2dM+LMm;n4N_wIs^RX6hqks|xRhia?>qLi zubCD43V{cu`->~lk#0=^B*`}`~wu1+h~ zRn@$dZ?qFBb@MUB)L%^v&8CKEjGrWBKNjk9B5#CKeV8C0ZVs^`QM@216cS7b(S;SO z%-kSD%c<{SxE`D8V3*i? zF}%0t)l4NdqX>Q{{GDoGBnn)X(!1*Z>uJ*Oh!WWzER~Pd)Dv`XTHotKL{?Yw`d1&~ zbuQfCZQ*i7MiQm?zF~esWV#0p@DO9a_vO1nE!cfijHCl(4CF;hXYeGYNqI{x|0X!w z*p{xIOIq7Na(%AGjfkkT^|smUl4Z@1<5LGv5=>-O?Wg_};ni~ zc7Au8qU5)3QDLD^p@|qL-bPV&-KbEO3DXOrCiwDp-wAVwROjWozm_*fBPl8GOVHCn zXkzCQ?1d(>#pCh=Epon_fxzci7%5aj?TQoF!4LyU)0epC3RUVo3G-*npbeG%-i7i} zAI(hlL4S0EMalIe50ajRku7h@!;4c@0eRKv#z;Uwy;T1zLgkOq_>W0+ni`CY;!KS; z^*KjO3kdXH&lZaw0C{5VZXWWwmAA|;9Gsoh zIIle1G$4zxgvx!JgunB;eGuitAJ{3!dZbNwlEpvR%2MDu(wQv$sJ4ld=3uJDg?Tvp zwM#o`mgUMcHKmVhXHT&`Q1+HbXfuin_3Sgx=#DQB-4^o}v-&1c8vH2+{-+sJo=;Qr zKHsx7S?ZKv%2n;ORx9qQ zdg-pkt|%>CH@h0laJ7lvddxZ&c)^XHf}{f-DjN)VX4Dx7ea7HgWAhwKGibL$%Ww^O zHlZUC1CKOl39uAL9DrYW<&1*~ z8ZuaX9i-C)P6sohK>4bKzhqfMGThURT>-+HzD_@kQmdLKU;I_E)fMu@T~J{>(QNkbTo=2!~_7GhI6QIj<9AaTht3Qd{~rUt8#t5$uYMhH@# zns~&>Bn=a8@T5DFdj-!QOMy?-nWEY`BHDPs;>2q%(0zNUW_A{lUP&Wh6wd8r8Y23 z;K$lN;~^xQDl{jVt=|4d$RnK#5<;~@DDa#eru`Mw!HV~Sv-EG^jIEGu=aO0&A?mm+ zwN+q{U9~wcW|`S}$(V~8xnrWXx8QDcb?G4LK-2?EjWW1? zcAk^;Y8Qo)}mJyXs5LuaV?bO|h^dUFt}<*#Wu#W>cd2u#sST0qg+r=-GZI{{ zOo`7lcKs?abkIOwI?b6RrfX@sV02fJYTwBI3u>rL3b#Gk)J1fbU?vKf!02%j2=&g; zpnc#MySEe329*M;Tcn=D?}}(J___pp0;~~tkA#G*!yH6Y0s?-J%@2RGoD75rxsBAbHEn&ZMt;cGFUbh*i#K+? z>_^8ovWz}BPv5rmC1c>}uEo-LMVnDXZ4idZSx@_EfoVwC{YODFr#-n=wZ(9GeUvT z?=gae9G}!$@+Bg$s8I|-qyL!HW_nsjf^D`xY{P*>&!(XsLTqX-QvydWo@|+{x)jzM z>I}Ad)C1U3Qp9qASuQ#o0&nXqH+x7n=)Qb|9W+qMfdub}&Mw|*%Zw42opxk|vG@@@ zB{XGmz0$~E750p>O7V-K*fu$M$&q{bd-fYRc>|$={5&@{M{Ol+;MEpvg_aQ7lp!fN z<pJg}^XUP54pVXp{aOKQQ4cj%Ddin~mk$G#}Hef;MqDh!DARF-B(>8?M~}z53hK zN1G0m8OF@GO8t^mFILI2?PaE4;{>iUzgR*n7wYOQuF+zK@ zCUrzW2HoxSpAEB7symmH_z=_RB-S411@ z#wY*8(LlX%O)@0uJDU6)X;{hhZIV=1&eBHn~DJlB4Y?*cX@ z^|$~c7^N5jxr8l7d_tDyAWySmD&+&^2}Z*>Yx3Z73(E$^8PKMX1eto^32;Sm4wOSW z5<{<1^lO5ard`6|d2xiP1V&@?w4Bd&LxZ2D`th(X6+=o@_Ufp@m8?RP=y-)b={-T- zRUMVDJ$GGTH24=D5L}FbU_0|~vtKF*Dt!I2wVxxDug#T{AU1ccAg`e2?PmH$*cCs# zXQuDS`FesQU)cTK2hV)#@f$3;fYm8sW4sOWhxAS;UY4`h+t*XMWNKUu>yWFV>l=7n z2d~2+@>W4MD0x|GdJnFz##vq;zUpugeY^B!_9W9P$_Lk zHcZ85MOrTDiAG+icNLdz&6JG;;)RC{s6LH2(?OKw8NjECJ)x?=*;wTkizi1pgE%6? z80*_I5{e5GO;9VW$=TCLvG-JWh0tL}XrudCUxj#@f<~j9%)-Y`4zf6dK98SBTcH$;ukruq<)C@82LQGthNso{~=_1De$queQSD1+=S9$KvIRB(aS#{ zAur+e-k{+*R)jmxm+YW#5G3iEROu1#fL6mKW92Ba~{OOE{| zdbt;W>WDM?3F)3!qQc6cOJ&deW<@e)&-Mdwi+H33Q@$W`S9$;)TN=2j!tTKZ$sUgI zD1QKI!?;;-@};1aRkn&$`P5YARHk3cY*5p)@R$>M6Gbe<7Kzs%j5Gxq+F9Tiple4M3u62w|GB6ePHzAvS%d1ERSm-%(no7 zv{-Azmco$&p`!)Ugh*4{g4MI7S6$j^*Tau~BuxQp%4!I#l<~!Gsm^R|&e{;ESyVcr z{EpIqFC>NLYBc8pGO$!M(BXvsZT#*Luls}^*rPhQFslZfpA9 z5QLEvY?h25386L#v}ssG1CGAL2YmZ)1Fy@)eU9BbJ9MvgE z@^_8L>gvMggi$c}SzzS^)>mK$ANHC9Lr_|;ChQWkGe(2<=sw%3P?%2xbs=4GP`3CB zHnXL`1dKpe$V&u=wNVUg=`pB%9Gmr)7O18pcz5LKoqyvYi!mjBspI5N zhVVuXgU4fEzOB4soukwj<#UDle5;ge$hGby^qfxn(b(mIhr>tdU1K7GtxS_x-cToP zDDb>xl0DMusSqAtxtTsw%NmGvLTNhO=3M3)gEZBwPqW3_Qa4FHokL6XZxv#IO{N>e zd8-kz)n7{-8za}g107$~bZKazlmmB-;qI8w28ihUug4cC5W0{8OAC;pLmi4kCkQot zl~|jBgh4jN7E3-BN|uUWMktjfxOf74b!G2AaSxfWO6bogH17U}T&xS@^b*&4!RVn^0mEFDvu19}4UumQj_-s86N*&QTphQvwd%}Ch4=~NF z5^ZU%!q&t*s|BV&P2`OC-2PYB(;+kCmlU1L(yRu;u@F^oV4hfV?@VoB$LGQ8pZQus zD_Pe*_mX^$G4)wN*bRcb)$~mA6yX;`y17-mgJQ9nuxN!?SP`>2JOsNdlwy`l<}|V7 z^@^W7-vLt6n5AbhI(H%N+2qa5qoW`Cc(;>ak_DkPEvM3+WYpp&d27B!tNEp>bX0>RS%HqHQ?=e?6_&j0F;gUT!1G55nsS1mC5&@O*FF~m~9 zSlV7@`L37WY~URNP?h*z9aN-ckfFgG`QQNvd3=4*vgq+ggo!eNC^x5Yal&G9`OusD z!kWSg+9;s(-p%P1X+cGf=&i-*^TjVapWaE(Oic){cR?jfu#I@K1Ksy}sxOh`8Phw? zLZIB_ZeHhxC{i`WX&(z9y;^~R#i5^J0bb>wFu7wUcoa^S^YXFe%O2XbrXYHfbz^X* z4YPw`<{jl=oEIJ2{46PSZxV|kKEs&e2m9J&Owg;`*9ra5J6h(f4Y*fNobm?dHk=Nn;eohx}QB;rlgskS66_qi#WzUQ$E~<+N z!9)Dbw)%N4o=QkOf=kfCa74B0%RlO&XD^3yYp^c>oNK~vs0+L%*S>wmWf$=Q<~z4H{=W?8FwiR z-6WI2S){a;v{8pfHYbvcG>)C<|EM7)oi!eimj{*{@4+1Elgk1{#vjjqb2f@?-F&L@ zx|N$5OM14Rk)9c#!FSEQ<8ItA$^UfU#}9JDup*a<90<$o^EwP|OFrI~(&uwiMRyKS zmuzOwav@oz|B$3+N0kc?@unJPhIA&X81UkmCQ=4K>2Hku47l}mUno;+;#ws=>3Bqf zfjg&<6^5<5X!HAsP1G|_C6i_{Sx?rF(+WfPqq$UTE+^Nj)$yXnnTpZjX3Er){bR!4i!U2W zvWEE4wfD!GqC$kmt5cZzos)W;+RhZ21VGu_%CkZ%G-jpQ(L{tHaw^qUhZxNtE9Xtz zlo%;&cl4$K`N2o#(I!i)cR)y)s#r+l)`iT7ZrJD4z#B`IL+-X<*Rpj)gaaZKKS}Nm z&r+sVuuAj3pA@?rl?Z;52qxn)c4|}j()A_S;{-78wZfM$YrYKu&#^I!>=x665M+9yKz9vWbXTeM&Vai1c4+D zERz+QW%9Nh0$vx##~-W1Kn?Y!jYWGmYSpN3t}NcaMT(VH0>~DHcjgwtWc$V7J1{Aq zMH;GnhCD8IYA}=DHRH0$ElPk+mMASziP%#PP@m+C`kHwPOzq$>)adh6OY=ESo%g7p z&HQ2_Wfp9vxM9kwAc_DFn?2r~ys63&j9WKeYN5HSj-#c;0Ii^!v~=s*SiGXjUvn); z1{fc*78B>L0Zs&*MWbFaP3t;Togz0@GR0%&EEV61AFdHTsPvrx9c~kDaDqL1%1GTI756 z>S}8N**ZY?DSS4k)Xmli6de8_NXKf=TvlrPRRpRX;-~VMDyYqV&W7$P9oMHGVEpX} zqz1>|*qLitl~Eob`Qy)!*}BD!4IdOc#!l^_AX;oWQuhkCn8VSdn&wgiqy|J@lYzj?4Jb;Xa2DC4zqo(%nWBiZpo$?~fB?%{qG=f$La z)>ySgp}WqY-2{*p2+6sy%@n)y=nfPV!-|{po364n>n>Rg+Ens3()b9cDrV$fBI1!~ zxCl^wngOSTWnXun?g-|B*h+rf5R%;Tg%J*Rd9!#k7#uf8H-S+)V`nvJK&}e->&5CF zf^Ru8%2o#GZGcBVn!hD^volvA)2Wo28yS77Vv*4huDo9jCk}2!)Dq}M0xRB>ovtk= z5utZ)LvzhXq*YngkLBcV>$E-ErhMG&oHpvu*tzqH!rh5^3-_UPRj@FIf5e$-%Z>5l zJwvEgMI|=tFIF4x?zNY1rwp-r;Ja1iKH7G5wESIZ;)MLo$xyQ z(#i=1Uqx(StVw)A6zzl>gkC)!&6V4bluE^Mj}~(GRrZ(lY9ziQcNh(@50h>UNc&=s zNJxguNY!2c`q{h896k(kl6PT~<2ZT$dI|EQ?KdN+=XGvCilN0_vbt+o@m|fRAYxzM zps&J0-xI@+KR|qRziUmIcVx?0Icjdqb}T-fA53f8vEFzx=Ucu{8{8Gf;Uw7=jYmx| zF2yw%?;`O?b#zKak+m~UW+mf612wLM_@oe0H7SO}MBJ&6F+7#48i~0xF!e?#c(?Bi z)D&h8k*0d|1~enDTksIk-Itq4(6Zqvr9Tz*km(LWNcGb64F_~*nmA4$*Ahr8vgPnK z#yUyrJT+zQy0B+vHtzDz3^hzIDR!W`jp4ZLZ_KqWI?bBKw7Bj6=;6?;N+ zNo0R6uzFV+L~@u{-g2RuIEq-E0uSYvZOH7oe06(#v93^Zeb?fBFxpqF0!LuaPHMLy11JpeGx#R+3CSSQsmgtp}mh-=tC%Oh#wW65TjC zaZgFu8@qbzW$AQx8B-@yIbcm0n8eSdu2!xc3Cb-<;zj`oNsPZLFu0zHd%Fa*8%Z80b#p=oz6 zxSzE!w_4zj(_FNOUeIG?tv8t;r6NT<0KvCohje);lI}@qocC!b?yH>4ZO`t{uXGTp zDGlDfm48F%D}->zkdeI|7?L7MlN;%s-b+hEW~$m-ox0-5I$);~*_{T}iDFsFQ+YL$?JSd5dndJ34QOmBJzzpEy)7}E}r z8;8)-dqtn5wrZa+nm_dYYi=O~Ob`4(1@iS>#7V>l->X6`+e8*$vqHt3jGMkfAv|Q< znS_OzK1#f^;sb~1=Z)ygSekW+0`BNdUAyr}oE|bpRCO0IL{pU*l5_Fh@HIzg>Ti)` zoW!kf@v*-TEVCH7V>%cM_r9Z`#=cmK_67M|iD2-cpU`^?AO5wrgA+gQ`Ng@fP(fA; zcfh$;7{Iw!u3z*5J8LsTeTUx>@lA`Cmg^Ki2^a$d6>;Z(+m(IT4vK~BxJfJ@Mx9N9 zaV^Xp&uAG03j*~lr9wvc@aln5=&Djf01eyK;#*~$ zIAzcgjuYfpWJG8WF$ooOXa6?}jj0t&NQ7;8;96x?YIE$P>e5`pZTeCo=kvq6=@_pg z)Ze+*79<|nFP;S~D}VRlUXaM3roG9e^z#m|sy0^$B-Xcce4~1KV{GC+H76A4A8uB9 z*)BGGrMCMOw^U>|X?OI~F6rExnC2pp=Q_a8rRxA0%i26Ism1@ZVS z`0IH|&4gb;q2rd7&WAXBH#*R!lD@8=!G&I}$%j)_S~z6((3=O961=$`KCLgWfRZb|f zJJb-P=BM=w^?h4#S`Xo=_q$TS$?2j)A9u}wlaoZLp+4U_lNVmT2v&&!;!gVUP9FfH z8|UBO>C3!pe_Fe|klRd)9+K)3KnWb1FSe|yoi&>gU1AkN7U>Q^k3>U%NB?%uGZ}9x ziUgT#N@zt&#TN#@JqU^1^mUOot34AhHfPR!naauAaV z`cTUm>FZisRqLthMnP$B^G1i=kgft$TA2p!Mp4yeAUou;E!Ic`OfeHk6gXEr6Q}!a zp9+f4<|`@7G850L(q4QPPQfEHm(rSv3b@iK`z{ke0Hg7AQnuA=j)y+h!bPo2Ix!!V z>F7553JA{2HTfankE7WeRai+>$Z_`f^a6loFO(G3H~mU@LsV*ezd>roR_GbfV-lPE z){AOywzjM!dIwst5t?l7LKDEhblK|AMSSLm>d&Bm{a7J9cd4KNUM1kj#J}=l|67F~ zaP<7273jBL>dr$#LINNJ0oTuh0l3w3G_^3GwKLQ=G_`T~vzEOyE!F7o*g5rxj1+AZ z>jd*8Gbmtz3;|h=I{gk6@E|}m0Py!KU=$!g{r&_Fu)Tj3fPmYJA|t9ONGmBTM*s4$ zGZvJMA2m}3Tt9y7&+8lM#D~@Z*X95Ce|;{i&n^?yc>N|Hk>_ zzx?M3fWpt8N;}~G#}ofn!IJN%IMw~^5`wE{#`{uK3pSvM131EU-O-VER({)r2?Qw0R``~q48An0IW zt!wZf$-tL@gVtR32!Li10MwV|FMvD%&&WRk0=^tBu7ZvZCID$=Q~jUfB`+Bw&k#ou ze&kgK@K-^9jkUUcfAp0m`ZE5(%+S=UF=GRSgP+}I7576vq z0n`+5`sz=Gk?0?wRRD$uNYwem_I{1KbEs-x1VCE^TmYay6@0)i_(hvY{>SQmjh9x8 zaWf5QV>UoqjKAVR(fu0F%HBcO!s5T#a2ia5012R{UI7LZfu`m)9^lPvy3r%?MP`oE3z7bzECLch#$_Y)da^Piyqn(^)> z>dRy?KT#140dnX6>ZAXdI_4$d4}c$5_M`kr5A(Cw0095gseS~Zy?pp(vY4L_XZ-!) z|K#iV@3X;|@Gld9{Dh}6`CHxo1OGcKiI+q#Mf`sfjamGS=uh?kFOvQ*;a{rJ|AaTR z`X~4oljWDNFGbjY!uDAI6YQV;3@hF1 zyDzK%Qa|)35$=cICHkXz{;ekZlHjFS<4*!akKZ8p2kFL_OfMzfeljWf{07r+3B0}J zd@0oRlk?o~H#q-Ew(BL;OT~|$RH$LULG=&%A1|3+Dl7bCLjUv|On;bz;4gI+UQ)e` zX#YtC9sS!>fbqrV&nkQ`NnQpD|0KbP`)!gx`s<%mQ(m&Xj7a^-f|~H#EPswqeM#^# z9`Gl@P164-!T)NpmjPNosU`udwin;HKMn8y9@PG4TfL0b`H4@N@f-O69Jlkb-ChPZ z{3J8Z{@-N3o@Bk;f&Ph!RP#5?e>KP7_oH9d^QHIuC+2?h|Hk~MZ`4bV;!ot$w!b6) zzJKv=zu<+J>nBfl$KQBfPCNf(M*rh8{?haElP00-|E6^R%@6aRI{(M(@@J>X53kG5 fvI_wFZ$6l}(qMpf(2wXvCZP9#QwYM{KmPiEB|XYR diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c02f7cf09..8cf6eb5ad 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,5 @@ -#Thu Oct 15 11:41:05 CEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip diff --git a/gradlew b/gradlew index cccdd3d51..4f906e0c8 100755 --- a/gradlew +++ b/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -66,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -109,10 +126,11 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -138,19 +156,19 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -159,14 +177,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index e95643d6a..ac1b06f93 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -13,15 +29,18 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell From a83106f71743c42b3a9639f3c8a4d8bf8317b98e Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Mon, 22 Mar 2021 16:38:36 -0400 Subject: [PATCH 03/91] Clean up unnecessary onCreate in settings fragments --- .../settings/DebugSettingsFragment.java | 10 +-- .../settings/AppearanceSettingsFragment.java | 10 +-- .../settings/ContentSettingsFragment.java | 63 +++++++++---------- .../settings/DownloadSettingsFragment.java | 10 +-- .../settings/HistorySettingsFragment.java | 11 +--- .../settings/UpdateSettingsFragment.java | 10 +-- .../settings/VideoAudioSettingsFragment.java | 10 +-- 7 files changed, 42 insertions(+), 82 deletions(-) diff --git a/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsFragment.java b/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsFragment.java index 7e2ff69b8..d5d223ff2 100644 --- a/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsFragment.java +++ b/app/src/debug/java/org/schabi/newpipe/settings/DebugSettingsFragment.java @@ -2,7 +2,6 @@ package org.schabi.newpipe.settings; import android.os.Bundle; -import androidx.annotation.Nullable; import androidx.preference.Preference; import org.schabi.newpipe.R; @@ -11,8 +10,8 @@ import leakcanary.LeakCanary; public class DebugSettingsFragment extends BasePreferenceFragment { @Override - public void onCreate(@Nullable final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + addPreferencesFromResource(R.xml.debug_settings); final Preference showMemoryLeaksPreference = findPreference(getString(R.string.show_memory_leaks_key)); @@ -31,9 +30,4 @@ public class DebugSettingsFragment extends BasePreferenceFragment { throw new RuntimeException(); }); } - - @Override - public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.debug_settings); - } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java index e2ac2c20d..fe89f62a0 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java @@ -7,7 +7,6 @@ import android.os.Bundle; import android.provider.Settings; import android.widget.Toast; -import androidx.annotation.Nullable; import androidx.core.app.ActivityCompat; import androidx.preference.Preference; @@ -21,8 +20,8 @@ public class AppearanceSettingsFragment extends BasePreferenceFragment { private String captionSettingsKey; @Override - public void onCreate(@Nullable final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + addPreferencesFromResource(R.xml.appearance_settings); final String themeKey = getString(R.string.theme_key); // the key of the active theme when settings were opened (or recreated after theme change) @@ -58,11 +57,6 @@ public class AppearanceSettingsFragment extends BasePreferenceFragment { } } - @Override - public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.appearance_settings); - } - @Override public boolean onPreferenceTreeClick(final Preference preference) { if (preference.getKey().equals(captionSettingsKey) && CAPTIONING_SETTINGS_ACCESSIBLE) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java index dbe05bbd2..ad8400401 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/ContentSettingsFragment.java @@ -10,7 +10,6 @@ import android.util.Log; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; import androidx.preference.Preference; import androidx.preference.PreferenceManager; @@ -50,8 +49,35 @@ public class ContentSettingsFragment extends BasePreferenceFragment { private String initialLanguage; @Override - public void onCreate(@Nullable final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + final File homeDir = ContextCompat.getDataDir(requireContext()); + manager = new ContentSettingsManager(new NewPipeFileLocator(homeDir)); + manager.deleteSettingsFile(); + + addPreferencesFromResource(R.xml.content_settings); + + final Preference importDataPreference = findPreference(getString(R.string.import_data)); + importDataPreference.setOnPreferenceClickListener(p -> { + final Intent i = new Intent(getActivity(), FilePickerActivityHelper.class) + .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_MULTIPLE, false) + .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_CREATE_DIR, false) + .putExtra(FilePickerActivityHelper.EXTRA_MODE, + FilePickerActivityHelper.MODE_FILE); + startActivityForResult(i, REQUEST_IMPORT_PATH); + return true; + }); + + final Preference exportDataPreference = findPreference(getString(R.string.export_data)); + exportDataPreference.setOnPreferenceClickListener(p -> { + final Intent i = new Intent(getActivity(), FilePickerActivityHelper.class) + .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_MULTIPLE, false) + .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_CREATE_DIR, true) + .putExtra(FilePickerActivityHelper.EXTRA_MODE, + FilePickerActivityHelper.MODE_DIR); + startActivityForResult(i, REQUEST_EXPORT_PATH); + return true; + }); + thumbnailLoadToggleKey = getString(R.string.download_thumbnail_key); youtubeRestrictedModeEnabledKey = getString(R.string.youtube_restricted_mode_enabled); @@ -103,37 +129,6 @@ public class ContentSettingsFragment extends BasePreferenceFragment { return super.onPreferenceTreeClick(preference); } - @Override - public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - final File homeDir = ContextCompat.getDataDir(requireContext()); - manager = new ContentSettingsManager(new NewPipeFileLocator(homeDir)); - manager.deleteSettingsFile(); - - addPreferencesFromResource(R.xml.content_settings); - - final Preference importDataPreference = findPreference(getString(R.string.import_data)); - importDataPreference.setOnPreferenceClickListener(p -> { - final Intent i = new Intent(getActivity(), FilePickerActivityHelper.class) - .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_MULTIPLE, false) - .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_CREATE_DIR, false) - .putExtra(FilePickerActivityHelper.EXTRA_MODE, - FilePickerActivityHelper.MODE_FILE); - startActivityForResult(i, REQUEST_IMPORT_PATH); - return true; - }); - - final Preference exportDataPreference = findPreference(getString(R.string.export_data)); - exportDataPreference.setOnPreferenceClickListener(p -> { - final Intent i = new Intent(getActivity(), FilePickerActivityHelper.class) - .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_MULTIPLE, false) - .putExtra(FilePickerActivityHelper.EXTRA_ALLOW_CREATE_DIR, true) - .putExtra(FilePickerActivityHelper.EXTRA_MODE, - FilePickerActivityHelper.MODE_DIR); - startActivityForResult(i, REQUEST_EXPORT_PATH); - return true; - }); - } - @Override public void onDestroy() { super.onDestroy(); diff --git a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java index 8742f0937..abd543643 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/DownloadSettingsFragment.java @@ -11,7 +11,6 @@ import android.os.Bundle; import android.util.Log; import android.widget.Toast; -import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.preference.Preference; @@ -46,8 +45,8 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { private Context ctx; @Override - public void onCreate(@Nullable final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + addPreferencesFromResource(R.xml.download_settings); downloadPathVideoPreference = getString(R.string.download_path_video_key); downloadPathAudioPreference = getString(R.string.download_path_audio_key); @@ -76,11 +75,6 @@ public class DownloadSettingsFragment extends BasePreferenceFragment { }); } - @Override - public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.download_settings); - } - @Override public void onAttach(final Context context) { super.onAttach(context); diff --git a/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java index 89fabbdde..cb6ce263d 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/HistorySettingsFragment.java @@ -5,7 +5,6 @@ import android.os.Bundle; import android.widget.Toast; import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.preference.Preference; @@ -29,8 +28,9 @@ public class HistorySettingsFragment extends BasePreferenceFragment { private CompositeDisposable disposables; @Override - public void onCreate(@Nullable final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + addPreferencesFromResource(R.xml.history_settings); + cacheWipeKey = getString(R.string.metadata_cache_wipe_key); viewsHistoryClearKey = getString(R.string.clear_views_history_key); playbackStatesClearKey = getString(R.string.clear_playback_states_key); @@ -39,11 +39,6 @@ public class HistorySettingsFragment extends BasePreferenceFragment { disposables = new CompositeDisposable(); } - @Override - public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.history_settings); - } - @Override public boolean onPreferenceTreeClick(final Preference preference) { if (preference.getKey().equals(cacheWipeKey)) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java index f25b25df2..0ca15e245 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/UpdateSettingsFragment.java @@ -2,7 +2,6 @@ package org.schabi.newpipe.settings; import android.os.Bundle; -import androidx.annotation.Nullable; import androidx.preference.Preference; import org.schabi.newpipe.R; @@ -16,15 +15,10 @@ public class UpdateSettingsFragment extends BasePreferenceFragment { }; @Override - public void onCreate(@Nullable final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + addPreferencesFromResource(R.xml.update_settings); final String updateToggleKey = getString(R.string.update_app_key); findPreference(updateToggleKey).setOnPreferenceChangeListener(updatePreferenceChange); } - - @Override - public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.update_settings); - } } diff --git a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java index 5eca99822..c0d274fe0 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/VideoAudioSettingsFragment.java @@ -8,7 +8,6 @@ import android.provider.Settings; import android.text.format.DateUtils; import android.widget.Toast; -import androidx.annotation.Nullable; import androidx.preference.ListPreference; import com.google.android.material.snackbar.Snackbar; @@ -23,8 +22,8 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { private SharedPreferences.OnSharedPreferenceChangeListener listener; @Override - public void onCreate(@Nullable final Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { + addPreferencesFromResource(R.xml.video_audio_settings); updateSeekOptions(); @@ -104,11 +103,6 @@ public class VideoAudioSettingsFragment extends BasePreferenceFragment { } } - @Override - public void onCreatePreferences(final Bundle savedInstanceState, final String rootKey) { - addPreferencesFromResource(R.xml.video_audio_settings); - } - @Override public void onResume() { super.onResume(); From 6a9d5fd4cc9192b484808fc793e20516fd3bd481 Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Mon, 22 Mar 2021 17:46:06 -0400 Subject: [PATCH 04/91] Replace FrameLayout with FragmentContainerView where applicable --- .../java/org/schabi/newpipe/settings/SettingsActivity.java | 6 +++--- .../main/res/layout-large-land/fragment_video_detail.xml | 6 ++---- app/src/main/res/layout/activity_downloader.xml | 2 +- app/src/main/res/layout/activity_main.xml | 6 +++--- app/src/main/res/layout/settings_layout.xml | 6 +++--- 5 files changed, 12 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java index c445928c4..cdac21634 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java +++ b/app/src/main/java/org/schabi/newpipe/settings/SettingsActivity.java @@ -56,11 +56,11 @@ public class SettingsActivity extends AppCompatActivity SettingsLayoutBinding.inflate(getLayoutInflater()); setContentView(settingsLayoutBinding.getRoot()); - setSupportActionBar(settingsLayoutBinding.toolbarLayout.toolbar); + setSupportActionBar(settingsLayoutBinding.settingsToolbarLayout.toolbar); if (savedInstanceBundle == null) { getSupportFragmentManager().beginTransaction() - .replace(R.id.fragment_holder, new MainSettingsFragment()) + .replace(R.id.settings_fragment_holder, new MainSettingsFragment()) .commit(); } @@ -102,7 +102,7 @@ public class SettingsActivity extends AppCompatActivity getSupportFragmentManager().beginTransaction() .setCustomAnimations(R.animator.custom_fade_in, R.animator.custom_fade_out, R.animator.custom_fade_in, R.animator.custom_fade_out) - .replace(R.id.fragment_holder, fragment) + .replace(R.id.settings_fragment_holder, fragment) .addToBackStack(null) .commit(); return true; diff --git a/app/src/main/res/layout-large-land/fragment_video_detail.xml b/app/src/main/res/layout-large-land/fragment_video_detail.xml index b037ca584..e68ee76d8 100644 --- a/app/src/main/res/layout-large-land/fragment_video_detail.xml +++ b/app/src/main/res/layout-large-land/fragment_video_detail.xml @@ -612,14 +612,12 @@ - - - + android:layout_weight="3" /> - diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6d25ed097..97ccd199e 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -8,7 +8,7 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - - + app:layout_behavior="org.schabi.newpipe.player.event.CustomBottomSheetBehavior" /> diff --git a/app/src/main/res/layout/settings_layout.xml b/app/src/main/res/layout/settings_layout.xml index 32c6c6b91..33237d7b0 100644 --- a/app/src/main/res/layout/settings_layout.xml +++ b/app/src/main/res/layout/settings_layout.xml @@ -6,14 +6,14 @@ android:orientation="vertical" tools:context="org.schabi.newpipe.MainActivity"> - + android:id="@+id/settings_toolbar_layout"/> From b3e2418b930900dc537158fdf93decb3a47e4b27 Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Fri, 26 Mar 2021 17:12:20 +0300 Subject: [PATCH 05/91] Migrate to DayNight Theme --- .../java/org/schabi/newpipe/MainActivity.java | 2 ++ .../settings/AppearanceSettingsFragment.java | 3 +++ .../org/schabi/newpipe/util/ThemeHelper.java | 19 +++++++++++++++++++ .../activity_player_queue_control.xml | 4 ++-- app/src/main/res/layout/activity_about.xml | 4 ++-- .../layout/activity_player_queue_control.xml | 4 ++-- .../main/res/layout/activity_recaptcha.xml | 4 ++-- .../res/layout/dialog_feed_group_create.xml | 4 ++-- app/src/main/res/layout/toolbar_layout.xml | 4 ++-- app/src/main/res/values-v29/themes.xml | 2 +- app/src/main/res/values/styles.xml | 16 ++++++++-------- app/src/main/res/values/styles_misc.xml | 4 ++-- 12 files changed, 47 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 1b8f3190e..534d81b09 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -133,6 +133,8 @@ public class MainActivity extends AppCompatActivity { if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { TLSSocketFactoryCompat.setAsDefault(); } + + ThemeHelper.setDayNightMode(this); ThemeHelper.setTheme(this, ServiceHelper.getSelectedServiceId(this)); assureCorrectAppLanguage(this); diff --git a/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java index e2ac2c20d..26f67c15f 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/AppearanceSettingsFragment.java @@ -13,6 +13,7 @@ import androidx.preference.Preference; import org.schabi.newpipe.R; import org.schabi.newpipe.util.Constants; +import org.schabi.newpipe.util.ThemeHelper; public class AppearanceSettingsFragment extends BasePreferenceFragment { private static final boolean CAPTIONING_SETTINGS_ACCESSIBLE = @@ -89,6 +90,8 @@ public class AppearanceSettingsFragment extends BasePreferenceFragment { defaultPreferences.edit().putBoolean(Constants.KEY_THEME_CHANGE, true).apply(); defaultPreferences.edit().putString(themeKey, newValue.toString()).apply(); + ThemeHelper.setDayNightMode(getContext(), newValue.toString()); + if (!newValue.equals(beginningThemeKey) && getActivity() != null) { // if it's not the current theme ActivityCompat.recreate(getActivity()); diff --git a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java index dcfb7ed19..ff7dd9b86 100644 --- a/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/ThemeHelper.java @@ -31,6 +31,7 @@ import androidx.annotation.Nullable; import androidx.annotation.StyleRes; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.app.AppCompatDelegate; import androidx.core.content.ContextCompat; import androidx.preference.PreferenceManager; @@ -120,6 +121,7 @@ public final class ThemeHelper { final String selectedThemeKey = getSelectedThemeKey(context); + int baseTheme = R.style.DarkTheme; // default to dark theme if (selectedThemeKey.equals(lightThemeKey)) { baseTheme = R.style.LightTheme; @@ -288,4 +290,21 @@ public final class ThemeHelper { return false; } } + + public static void setDayNightMode(final Context context) { + setDayNightMode(context, ThemeHelper.getSelectedThemeKey(context)); + } + + public static void setDayNightMode(final Context context, final String selectedThemeKey) { + final Resources res = context.getResources(); + + if (selectedThemeKey.equals(res.getString(R.string.light_theme_key))) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO); + } else if (selectedThemeKey.equals(res.getString(R.string.dark_theme_key)) + || selectedThemeKey.equals(res.getString(R.string.black_theme_key))) { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES); + } else { + AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM); + } + } } diff --git a/app/src/main/res/layout-land/activity_player_queue_control.xml b/app/src/main/res/layout-land/activity_player_queue_control.xml index b106e7437..929d55a70 100644 --- a/app/src/main/res/layout-land/activity_player_queue_control.xml +++ b/app/src/main/res/layout-land/activity_player_queue_control.xml @@ -12,8 +12,8 @@ android:id="@+id/appbar" android:layout_width="match_parent" android:layout_height="wrap_content" - android:theme="@style/ThemeOverlay.AppCompat.ActionBar" - app:popupTheme="@style/ThemeOverlay.AppCompat.ActionBar"> + android:theme="@style/ThemeOverlay.AppCompat.DayNight.ActionBar" + app:popupTheme="@style/ThemeOverlay.AppCompat.DayNight.ActionBar"> + android:theme="@style/ThemeOverlay.AppCompat.DayNight.ActionBar" + app:popupTheme="@style/ThemeOverlay.AppCompat.DayNight.ActionBar"> + android:theme="@style/ThemeOverlay.AppCompat.DayNight.ActionBar" + app:popupTheme="@style/ThemeOverlay.AppCompat.DayNight.ActionBar"> - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index d7e7ab1dc..d02924958 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,6 +1,6 @@ - - - - - - - - - - + + + + + + + + - - - - - + + From 216da632769420d60167254ae9bcb641e8d185cd Mon Sep 17 00:00:00 2001 From: iamthesenate1 <77978836+iamthesenate1@users.noreply.github.com> Date: Sat, 27 Mar 2021 15:21:41 +0200 Subject: [PATCH 08/91] Update README.ro.md (#5921) Delete old warning about F-Droid not being up to date --- README.ro.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.ro.md b/README.ro.md index e28cd8cd6..cffbcb510 100644 --- a/README.ro.md +++ b/README.ro.md @@ -89,7 +89,7 @@ NewPipe suportă servicii multiple. [Documentele](https://teamnewpipe.github.io/ Puteţi instala NewPipe folosind una dintre următoarele metode: 1. Adăugaţi depozitul nostru F-droid personalizat. Instrucţiunile sunt aici: https://newpipe.schabi.org/FAQ/tutorials/install-add-fdroid-repo/ 2. Descărcaţi APK-ul din [Github Releases](https://github.com/TeamNewPipe/NewPipe/releases) şi instalaţi-l. - 3. Actualizaţi via F-Droid. Aceasta este cea mai lentă metodă de a obţine actualizări, deoarece F-Droid trebuie să recunoască schimbările, să constriască APK-ul, să îl semneze, iar apoi să îl trimită utilizatorilor. (**IMPORTANT**: în momentul scrierii, o problemă împiedică versiunile mai noi de 0.20.1 să fie publicate. Aşa că, dacă doriţi să folosiţi F-droid, până această problemă este rezolvată, vă recomandăm metoda 1.) + 3. Actualizaţi via F-Droid. Aceasta este cea mai lentă metodă de a obţine actualizări, deoarece F-Droid trebuie să recunoască schimbările, să constriască APK-ul, să îl semneze, iar apoi să îl trimită utilizatorilor. 4. Construiţi un APK de depanare. Aceasta este cea mai rapidă metodă de a primi funcţii noi, dar este mult mai complicată, aşa că vă recomandăm să folosiţi una dintre celelalte metode. Recomandăm metoda 1 pentru majoritatea utilizatorilor. APK-urile din metodele 1 şi 2 suntcompatibile una cu cealaltă, dar nu cu cele din metoda 3. Acest lucru se datorează faptului că aceeași cheie de semnare (a noastră) este utilizată pentru 1 și 2, dar o altă cheie de semnare (F-Droid) este utilizată pentru 3. Construirea unui APK de depanare folosind metoda 4 exclude o cheie în întregime. Cheile de semnare vă asigură că un utilizator nu este păcălit să instaleze o actualizare rău intenționată a unei aplicații. From fd14c8cdce0e1ce9a0b28757dfddbaf788d0fac6 Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Sat, 27 Mar 2021 17:45:49 +0300 Subject: [PATCH 09/91] Fix Dark elements in Light Theme --- app/src/debug/res/xml/main_settings.xml | 16 +- .../java/org/schabi/newpipe/MainActivity.java | 32 ++-- .../org/schabi/newpipe/RouterActivity.java | 13 +- .../newpipe/download/DownloadDialog.java | 3 +- .../newpipe/fragments/MainFragment.java | 4 - .../fragments/detail/VideoDetailFragment.java | 15 +- .../list/playlist/PlaylistFragment.java | 9 +- .../list/search/SuggestionListAdapter.java | 4 +- .../history/StatisticsPlaylistFragment.java | 6 +- .../local/subscription/FeedGroupIcon.kt | 87 +++++---- .../subscription/SubscriptionFragment.kt | 3 +- .../subscription/dialog/FeedGroupDialog.kt | 4 +- .../subscription/item/FeedGroupCardItem.kt | 2 +- .../subscription/item/FeedGroupReorderItem.kt | 2 +- .../subscription/item/FeedImportExportItem.kt | 4 +- .../local/subscription/item/PickerIconItem.kt | 2 +- .../newpipe/player/NotificationConstants.java | 6 +- .../newpipe/player/NotificationUtil.java | 6 +- .../newpipe/player/PlayQueueActivity.java | 9 +- .../org/schabi/newpipe/player/Player.java | 20 +- .../player/event/PlayerGestureListener.java | 14 +- .../PeertubeInstanceListFragment.java | 6 +- .../newpipe/settings/tabs/AddTabDialog.java | 3 +- .../settings/tabs/ChooseTabsFragment.java | 10 +- .../org/schabi/newpipe/settings/tabs/Tab.java | 15 +- .../schabi/newpipe/util/KioskTranslator.java | 14 +- .../giga/ui/fragment/MissionsFragment.java | 7 +- .../java/us/shandian/giga/util/Utility.java | 6 +- ..._white_24dp_png.png => ic_close_white.png} | Bin ...4dp_png.png => ic_hourglass_top_white.png} | Bin ...white_24dp_png.png => ic_replay_white.png} | Bin ..._white_24dp_png.png => ic_close_white.png} | Bin ...4dp_png.png => ic_hourglass_top_white.png} | Bin ...white_24dp_png.png => ic_replay_white.png} | Bin .../ic_add.xml} | 0 .../ic_add_circle_outline.xml} | 0 .../ic_apps.xml} | 0 .../ic_arrow_back.xml} | 0 .../ic_asterisk.xml} | 0 .../ic_attach_money.xml} | 0 .../ic_backup.xml} | 0 .../ic_bookmark.xml} | 0 .../ic_bug_report.xml} | 0 .../ic_cast.xml} | 0 .../ic_child_care.xml} | 0 .../ic_close.xml} | 0 .../ic_cloud_download.xml} | 0 .../ic_computer.xml} | 0 .../ic_crop_portrait.xml} | 0 .../ic_delete.xml} | 0 .../ic_directions_bike.xml} | 0 .../ic_directions_car.xml} | 0 .../ic_done.xml} | 0 .../ic_drag_handle.xml} | 0 .../ic_edit.xml} | 0 .../ic_expand_less.xml} | 0 .../ic_expand_more.xml} | 0 .../ic_explore.xml} | 0 .../ic_fastfood.xml} | 0 .../ic_favorite.xml} | 0 .../ic_file_download.xml} | 0 .../ic_filter_list.xml} | 0 .../ic_fitness_center.xml} | 0 .../ic_headset.xml} | 0 .../ic_help.xml} | 0 .../ic_history.xml} | 0 .../ic_home.xml} | 0 .../ic_import_export.xml} | 0 .../ic_info_outline.xml} | 0 .../ic_insert_emoticon.xml} | 0 .../ic_language.xml} | 0 .../ic_list.xml} | 0 .../ic_live_tv.xml} | 0 .../ic_megaphone.xml} | 0 .../ic_mic.xml} | 0 .../ic_more_vert.xml} | 0 .../ic_motorcycle.xml} | 0 .../ic_movie.xml} | 0 .../ic_music_note.xml} | 0 .../ic_palette.xml} | 0 .../ic_pause.xml} | 0 .../ic_people.xml} | 0 .../ic_person.xml} | 0 .../ic_pets.xml} | 0 .../ic_picture_in_picture.xml} | 0 .../ic_play_arrow.xml} | 0 .../ic_playlist_add.xml} | 0 .../ic_playlist_add_check.xml} | 0 .../ic_public.xml} | 0 .../ic_radio.xml} | 0 .../ic_refresh.xml} | 0 .../ic_restaurant.xml} | 0 .../ic_rss_feed.xml} | 0 .../ic_save.xml} | 0 .../ic_school.xml} | 0 .../ic_search.xml} | 0 .../ic_search_add.xml} | 0 .../ic_settings.xml} | 0 .../ic_settings_backup_restore.xml} | 0 .../ic_share.xml} | 0 .../ic_shopping_cart.xml} | 0 .../ic_sort.xml} | 0 .../ic_stars.xml} | 0 .../ic_telescope.xml} | 0 .../ic_thumb_down.xml} | 0 .../ic_thumb_up.xml} | 0 .../ic_trending_up.xml} | 0 .../ic_tv.xml} | 0 .../ic_videogame_asset.xml} | 0 .../ic_volume_off.xml} | 0 .../ic_volume_up.xml} | 0 .../ic_watch_later.xml} | 0 .../ic_wb_sunny.xml} | 0 .../ic_whatshot.xml} | 0 .../ic_work.xml} | 0 ..._white_24dp_png.png => ic_close_white.png} | Bin ...4dp_png.png => ic_hourglass_top_white.png} | Bin ...white_24dp_png.png => ic_replay_white.png} | Bin ..._white_24dp_png.png => ic_close_white.png} | Bin ...4dp_png.png => ic_hourglass_top_white.png} | Bin ...white_24dp_png.png => ic_replay_white.png} | Bin ..._white_24dp_png.png => ic_close_white.png} | Bin ...4dp_png.png => ic_hourglass_top_white.png} | Bin ...white_24dp_png.png => ic_replay_white.png} | Bin .../{ic_add_black_24dp.xml => ic_add.xml} | 0 ...ack_24dp.xml => ic_add_circle_outline.xml} | 0 .../{ic_apps_black_24dp.xml => ic_apps.xml} | 0 ..._back_black_24dp.xml => ic_arrow_back.xml} | 0 ..._white_24dp.xml => ic_arrow_drop_down.xml} | 0 ...up_white_24dp.xml => ic_arrow_drop_up.xml} | 0 ..._track_white_24dp.xml => ic_art_track.xml} | 0 ...sterisk_black_24dp.xml => ic_asterisk.xml} | 0 ...ney_black_24dp.xml => ic_attach_money.xml} | 0 ...ic_backup_black_24dp.xml => ic_backup.xml} | 0 ...ookmark_black_24dp.xml => ic_bookmark.xml} | 0 ..._white_24dp.xml => ic_brightness_high.xml} | 0 ...w_white_24dp.xml => ic_brightness_low.xml} | 0 ...hite_24dp.xml => ic_brightness_medium.xml} | 0 ...eport_black_24dp.xml => ic_bug_report.xml} | 0 .../{ic_cast_black_24dp.xml => ic_cast.xml} | 0 ..._care_black_24dp.xml => ic_child_care.xml} | 0 .../{ic_close_black_24dp.xml => ic_close.xml} | 0 ...d_black_24dp.xml => ic_cloud_download.xml} | 0 ..._comment_white_24dp.xml => ic_comment.xml} | 0 ...omputer_black_24dp.xml => ic_computer.xml} | 0 ...it_black_24dp.xml => ic_crop_portrait.xml} | 0 ...ic_delete_black_24dp.xml => ic_delete.xml} | 0 ...tion_white_24dp.xml => ic_description.xml} | 0 ..._black_24dp.xml => ic_directions_bike.xml} | 0 ...r_black_24dp.xml => ic_directions_car.xml} | 0 .../{ic_done_black_24dp.xml => ic_done.xml} | 0 ...ndle_black_24dp.xml => ic_drag_handle.xml} | 0 .../{ic_edit_black_24dp.xml => ic_edit.xml} | 0 ...less_black_24dp.xml => ic_expand_less.xml} | 0 ...more_black_24dp.xml => ic_expand_more.xml} | 0 ..._explore_black_24dp.xml => ic_explore.xml} | 0 ...ard_white_24dp.xml => ic_fast_forward.xml} | 0 ...wind_white_24dp.xml => ic_fast_rewind.xml} | 0 ...astfood_black_24dp.xml => ic_fastfood.xml} | 0 ...avorite_black_24dp.xml => ic_favorite.xml} | 0 ...ad_black_24dp.xml => ic_file_download.xml} | 0 ...list_black_24dp.xml => ic_filter_list.xml} | 0 ...r_black_24dp.xml => ic_fitness_center.xml} | 0 ...ite_24.xml => ic_format_list_numbered.xml} | 0 ...creen_white_24dp.xml => ic_fullscreen.xml} | 0 ..._white_24dp.xml => ic_fullscreen_exit.xml} | 0 ..._headset_black_24dp.xml => ic_headset.xml} | 0 .../{ic_help_black_24dp.xml => ic_help.xml} | 0 ..._history_black_24dp.xml => ic_history.xml} | 0 .../{ic_home_black_24dp.xml => ic_home.xml} | 0 ...op_white_24dp.xml => ic_hourglass_top.xml} | 0 ...rt_black_24dp.xml => ic_import_export.xml} | 0 ...ine_black_24dp.xml => ic_info_outline.xml} | 0 ..._black_24dp.xml => ic_insert_emoticon.xml} | 0 ...anguage_black_24dp.xml => ic_language.xml} | 0 .../{ic_list_black_24dp.xml => ic_list.xml} | 0 ..._live_tv_black_24dp.xml => ic_live_tv.xml} | 0 ...aphone_black_24dp.xml => ic_megaphone.xml} | 0 .../{ic_mic_black_24dp.xml => ic_mic.xml} | 0 ...e_vert_black_24dp.xml => ic_more_vert.xml} | 0 ...cycle_black_24dp.xml => ic_motorcycle.xml} | 0 .../{ic_movie_black_24dp.xml => ic_movie.xml} | 0 ..._note_black_24dp.xml => ic_music_note.xml} | 0 .../{ic_next_white_24dp.xml => ic_next.xml} | 0 ..._palette_black_24dp.xml => ic_palette.xml} | 0 .../{ic_pause_black_24dp.xml => ic_pause.xml} | 0 ...ic_people_black_24dp.xml => ic_people.xml} | 0 ...ic_person_black_24dp.xml => ic_person.xml} | 0 .../{ic_pets_black_24dp.xml => ic_pets.xml} | 0 ...ack_24dp.xml => ic_picture_in_picture.xml} | 0 ...arrow_black_24dp.xml => ic_play_arrow.xml} | 0 ...add_black_24dp.xml => ic_playlist_add.xml} | 0 ...ack_24dp.xml => ic_playlist_add_check.xml} | 0 ...ay_white_24dp.xml => ic_playlist_play.xml} | 0 ...revious_white_24dp.xml => ic_previous.xml} | 0 ...ic_public_black_24dp.xml => ic_public.xml} | 0 .../{ic_radio_black_24dp.xml => ic_radio.xml} | 0 ..._refresh_black_24dp.xml => ic_refresh.xml} | 0 ...ic_repeat_white_24dp.xml => ic_repeat.xml} | 0 ...ic_replay_white_24dp.xml => ic_replay.xml} | 0 ...urant_black_24dp.xml => ic_restaurant.xml} | 0 ...ss_feed_black_24dp.xml => ic_rss_feed.xml} | 0 .../{ic_save_black_24dp.xml => ic_save.xml} | 0 ...ic_school_black_24dp.xml => ic_school.xml} | 0 ..._white_24dp.xml => ic_screen_rotation.xml} | 0 ...ic_search_black_24dp.xml => ic_search.xml} | 0 ...h_add_black_24dp.xml => ic_search_add.xml} | 0 ...ettings_black_24dp.xml => ic_settings.xml} | 0 ...4dp.xml => ic_settings_backup_restore.xml} | 0 .../{ic_share_black_24dp.xml => ic_share.xml} | 0 ...rt_black_24dp.xml => ic_shopping_cart.xml} | 0 ..._shuffle_white_24dp.xml => ic_shuffle.xml} | 0 .../{ic_sort_black_24dp.xml => ic_sort.xml} | 0 .../{ic_stars_black_24dp.xml => ic_stars.xml} | 0 ...titles_white_24dp.xml => ic_subtitles.xml} | 0 ...escope_black_24dp.xml => ic_telescope.xml} | 0 ..._down_black_24dp.xml => ic_thumb_down.xml} | 0 ...humb_up_black_24dp.xml => ic_thumb_up.xml} | 0 ...g_up_black_24dp.xml => ic_trending_up.xml} | 0 .../{ic_tv_black_24dp.xml => ic_tv.xml} | 0 ..._black_24dp.xml => ic_videogame_asset.xml} | 0 ...down_white_24dp.xml => ic_volume_down.xml} | 0 ...mute_white_24dp.xml => ic_volume_mute.xml} | 0 ...e_off_black_24dp.xml => ic_volume_off.xml} | 0 ...ume_up_black_24dp.xml => ic_volume_up.xml} | 0 ...ater_black_24dp.xml => ic_watch_later.xml} | 0 ...b_sunny_black_24dp.xml => ic_wb_sunny.xml} | 0 ...hatshot_black_24dp.xml => ic_whatshot.xml} | 0 .../{ic_work_black_24dp.xml => ic_work.xml} | 0 .../res/drawable/white_edit_text_cursor.xml | 5 + .../activity_player_queue_control.xml | 10 +- .../fragment_video_detail.xml | 27 +-- app/src/main/res/layout-large-land/player.xml | 36 ++-- app/src/main/res/layout/activity_about.xml | 5 +- .../layout/activity_player_queue_control.xml | 10 +- .../res/layout/dialog_feed_group_create.xml | 4 +- app/src/main/res/layout/dialog_playlists.xml | 2 +- app/src/main/res/layout/drawer_header.xml | 2 +- .../res/layout/feed_group_add_new_item.xml | 2 +- .../main/res/layout/feed_group_card_item.xml | 2 +- .../res/layout/feed_group_reorder_item.xml | 4 +- .../res/layout/feed_import_export_group.xml | 2 +- .../main/res/layout/fragment_choose_tabs.xml | 2 +- app/src/main/res/layout/fragment_feed.xml | 2 +- .../res/layout/fragment_instance_list.xml | 2 +- app/src/main/res/layout/fragment_main.xml | 2 + .../main/res/layout/fragment_video_detail.xml | 30 +-- .../main/res/layout/header_with_menu_item.xml | 2 +- app/src/main/res/layout/item_instance.xml | 2 +- .../res/layout/item_search_suggestion.xml | 7 +- app/src/main/res/layout/list_choose_tabs.xml | 4 +- .../res/layout/list_choose_tabs_dialog.xml | 2 +- .../main/res/layout/list_comments_item.xml | 2 +- .../res/layout/list_comments_mini_item.xml | 2 +- .../res/layout/list_playlist_grid_item.xml | 2 +- .../main/res/layout/list_playlist_item.xml | 2 +- .../res/layout/list_playlist_mini_item.xml | 2 +- .../main/res/layout/list_radio_icon_item.xml | 2 +- .../layout/list_stream_playlist_grid_item.xml | 2 +- .../res/layout/list_stream_playlist_item.xml | 2 +- app/src/main/res/layout/mission_item.xml | 2 +- .../main/res/layout/mission_item_linear.xml | 2 +- app/src/main/res/layout/picker_icon_item.xml | 2 +- .../res/layout/picker_subscription_item.xml | 2 +- app/src/main/res/layout/play_queue_item.xml | 2 +- app/src/main/res/layout/player.xml | 39 ++-- .../res/layout/player_popup_close_overlay.xml | 2 +- app/src/main/res/layout/playlist_control.xml | 8 +- .../layout/settings_notification_action.xml | 2 +- .../res/layout/statistic_playlist_control.xml | 2 +- .../main/res/layout/stream_quality_item.xml | 2 +- .../main/res/layout/toolbar_search_layout.xml | 2 +- app/src/main/res/menu/download_menu.xml | 8 +- app/src/main/res/menu/error_menu.xml | 2 +- app/src/main/res/menu/main_fragment_menu.xml | 2 +- app/src/main/res/menu/menu_channel.xml | 4 +- app/src/main/res/menu/menu_feed_fragment.xml | 2 +- .../main/res/menu/menu_feed_group_dialog.xml | 2 +- app/src/main/res/menu/menu_play_queue.xml | 4 +- app/src/main/res/menu/menu_playlist.xml | 4 +- app/src/main/res/menu/menu_recaptcha.xml | 2 +- app/src/main/res/menu/menu_search.xml | 2 +- app/src/main/res/menu/video_detail_menu.xml | 4 +- app/src/main/res/values-night/colors.xml | 5 + app/src/main/res/values/attrs.xml | 83 +-------- app/src/main/res/values/colors.xml | 4 + app/src/main/res/values/styles.xml | 174 +----------------- app/src/release/res/xml/main_settings.xml | 14 +- 288 files changed, 327 insertions(+), 560 deletions(-) rename app/src/main/res/drawable-hdpi/{ic_close_white_24dp_png.png => ic_close_white.png} (100%) rename app/src/main/res/drawable-hdpi/{ic_hourglass_top_white_24dp_png.png => ic_hourglass_top_white.png} (100%) rename app/src/main/res/drawable-hdpi/{ic_replay_white_24dp_png.png => ic_replay_white.png} (100%) rename app/src/main/res/drawable-mdpi/{ic_close_white_24dp_png.png => ic_close_white.png} (100%) rename app/src/main/res/drawable-mdpi/{ic_hourglass_top_white_24dp_png.png => ic_hourglass_top_white.png} (100%) rename app/src/main/res/drawable-mdpi/{ic_replay_white_24dp_png.png => ic_replay_white.png} (100%) rename app/src/main/res/{drawable/ic_add_white_24dp.xml => drawable-night/ic_add.xml} (100%) rename app/src/main/res/{drawable/ic_add_circle_outline_white_24dp.xml => drawable-night/ic_add_circle_outline.xml} (100%) rename app/src/main/res/{drawable/ic_apps_white_24dp.xml => drawable-night/ic_apps.xml} (100%) rename app/src/main/res/{drawable/ic_arrow_back_white_24dp.xml => drawable-night/ic_arrow_back.xml} (100%) rename app/src/main/res/{drawable/ic_asterisk_white_24dp.xml => drawable-night/ic_asterisk.xml} (100%) rename app/src/main/res/{drawable/ic_attach_money_white_24dp.xml => drawable-night/ic_attach_money.xml} (100%) rename app/src/main/res/{drawable/ic_backup_white_24dp.xml => drawable-night/ic_backup.xml} (100%) rename app/src/main/res/{drawable/ic_bookmark_white_24dp.xml => drawable-night/ic_bookmark.xml} (100%) rename app/src/main/res/{drawable/ic_bug_report_white_24dp.xml => drawable-night/ic_bug_report.xml} (100%) rename app/src/main/res/{drawable/ic_cast_white_24dp.xml => drawable-night/ic_cast.xml} (100%) rename app/src/main/res/{drawable/ic_child_care_white_24dp.xml => drawable-night/ic_child_care.xml} (100%) rename app/src/main/res/{drawable/ic_close_white_24dp.xml => drawable-night/ic_close.xml} (100%) rename app/src/main/res/{drawable/ic_cloud_download_white_24dp.xml => drawable-night/ic_cloud_download.xml} (100%) rename app/src/main/res/{drawable/ic_computer_white_24dp.xml => drawable-night/ic_computer.xml} (100%) rename app/src/main/res/{drawable/ic_crop_portrait_white_24dp.xml => drawable-night/ic_crop_portrait.xml} (100%) rename app/src/main/res/{drawable/ic_delete_white_24dp.xml => drawable-night/ic_delete.xml} (100%) rename app/src/main/res/{drawable/ic_directions_bike_white_24dp.xml => drawable-night/ic_directions_bike.xml} (100%) rename app/src/main/res/{drawable/ic_directions_car_white_24dp.xml => drawable-night/ic_directions_car.xml} (100%) rename app/src/main/res/{drawable/ic_done_white_24dp.xml => drawable-night/ic_done.xml} (100%) rename app/src/main/res/{drawable/ic_drag_handle_white_24dp.xml => drawable-night/ic_drag_handle.xml} (100%) rename app/src/main/res/{drawable/ic_edit_white_24dp.xml => drawable-night/ic_edit.xml} (100%) rename app/src/main/res/{drawable/ic_expand_less_white_24dp.xml => drawable-night/ic_expand_less.xml} (100%) rename app/src/main/res/{drawable/ic_expand_more_white_24dp.xml => drawable-night/ic_expand_more.xml} (100%) rename app/src/main/res/{drawable/ic_explore_white_24dp.xml => drawable-night/ic_explore.xml} (100%) rename app/src/main/res/{drawable/ic_fastfood_white_24dp.xml => drawable-night/ic_fastfood.xml} (100%) rename app/src/main/res/{drawable/ic_favorite_white_24dp.xml => drawable-night/ic_favorite.xml} (100%) rename app/src/main/res/{drawable/ic_file_download_white_24dp.xml => drawable-night/ic_file_download.xml} (100%) rename app/src/main/res/{drawable/ic_filter_list_white_24dp.xml => drawable-night/ic_filter_list.xml} (100%) rename app/src/main/res/{drawable/ic_fitness_center_white_24dp.xml => drawable-night/ic_fitness_center.xml} (100%) rename app/src/main/res/{drawable/ic_headset_white_24dp.xml => drawable-night/ic_headset.xml} (100%) rename app/src/main/res/{drawable/ic_help_white_24dp.xml => drawable-night/ic_help.xml} (100%) rename app/src/main/res/{drawable/ic_history_white_24dp.xml => drawable-night/ic_history.xml} (100%) rename app/src/main/res/{drawable/ic_home_white_24dp.xml => drawable-night/ic_home.xml} (100%) rename app/src/main/res/{drawable/ic_import_export_white_24dp.xml => drawable-night/ic_import_export.xml} (100%) rename app/src/main/res/{drawable/ic_info_outline_white_24dp.xml => drawable-night/ic_info_outline.xml} (100%) rename app/src/main/res/{drawable/ic_insert_emoticon_white_24dp.xml => drawable-night/ic_insert_emoticon.xml} (100%) rename app/src/main/res/{drawable/ic_language_white_24dp.xml => drawable-night/ic_language.xml} (100%) rename app/src/main/res/{drawable/ic_list_white_24dp.xml => drawable-night/ic_list.xml} (100%) rename app/src/main/res/{drawable/ic_live_tv_white_24dp.xml => drawable-night/ic_live_tv.xml} (100%) rename app/src/main/res/{drawable/ic_megaphone_white_24dp.xml => drawable-night/ic_megaphone.xml} (100%) rename app/src/main/res/{drawable/ic_mic_white_24dp.xml => drawable-night/ic_mic.xml} (100%) rename app/src/main/res/{drawable/ic_more_vert_white_24dp.xml => drawable-night/ic_more_vert.xml} (100%) rename app/src/main/res/{drawable/ic_motorcycle_white_24dp.xml => drawable-night/ic_motorcycle.xml} (100%) rename app/src/main/res/{drawable/ic_movie_white_24dp.xml => drawable-night/ic_movie.xml} (100%) rename app/src/main/res/{drawable/ic_music_note_white_24dp.xml => drawable-night/ic_music_note.xml} (100%) rename app/src/main/res/{drawable/ic_palette_white_24dp.xml => drawable-night/ic_palette.xml} (100%) rename app/src/main/res/{drawable/ic_pause_white_24dp.xml => drawable-night/ic_pause.xml} (100%) rename app/src/main/res/{drawable/ic_people_white_24dp.xml => drawable-night/ic_people.xml} (100%) rename app/src/main/res/{drawable/ic_person_white_24dp.xml => drawable-night/ic_person.xml} (100%) rename app/src/main/res/{drawable/ic_pets_white_24dp.xml => drawable-night/ic_pets.xml} (100%) rename app/src/main/res/{drawable/ic_picture_in_picture_white_24dp.xml => drawable-night/ic_picture_in_picture.xml} (100%) rename app/src/main/res/{drawable/ic_play_arrow_white_24dp.xml => drawable-night/ic_play_arrow.xml} (100%) rename app/src/main/res/{drawable/ic_playlist_add_white_24dp.xml => drawable-night/ic_playlist_add.xml} (100%) rename app/src/main/res/{drawable/ic_playlist_add_check_white_24dp.xml => drawable-night/ic_playlist_add_check.xml} (100%) rename app/src/main/res/{drawable/ic_public_white_24dp.xml => drawable-night/ic_public.xml} (100%) rename app/src/main/res/{drawable/ic_radio_white_24dp.xml => drawable-night/ic_radio.xml} (100%) rename app/src/main/res/{drawable/ic_refresh_white_24dp.xml => drawable-night/ic_refresh.xml} (100%) rename app/src/main/res/{drawable/ic_restaurant_white_24dp.xml => drawable-night/ic_restaurant.xml} (100%) rename app/src/main/res/{drawable/ic_rss_feed_white_24dp.xml => drawable-night/ic_rss_feed.xml} (100%) rename app/src/main/res/{drawable/ic_save_white_24dp.xml => drawable-night/ic_save.xml} (100%) rename app/src/main/res/{drawable/ic_school_white_24dp.xml => drawable-night/ic_school.xml} (100%) rename app/src/main/res/{drawable/ic_search_white_24dp.xml => drawable-night/ic_search.xml} (100%) rename app/src/main/res/{drawable/ic_search_add_white_24dp.xml => drawable-night/ic_search_add.xml} (100%) rename app/src/main/res/{drawable/ic_settings_white_24dp.xml => drawable-night/ic_settings.xml} (100%) rename app/src/main/res/{drawable/ic_settings_backup_restore_white_24dp.xml => drawable-night/ic_settings_backup_restore.xml} (100%) rename app/src/main/res/{drawable/ic_share_white_24dp.xml => drawable-night/ic_share.xml} (100%) rename app/src/main/res/{drawable/ic_shopping_cart_white_24dp.xml => drawable-night/ic_shopping_cart.xml} (100%) rename app/src/main/res/{drawable/ic_sort_white_24dp.xml => drawable-night/ic_sort.xml} (100%) rename app/src/main/res/{drawable/ic_stars_white_24dp.xml => drawable-night/ic_stars.xml} (100%) rename app/src/main/res/{drawable/ic_telescope_white_24dp.xml => drawable-night/ic_telescope.xml} (100%) rename app/src/main/res/{drawable/ic_thumb_down_white_24dp.xml => drawable-night/ic_thumb_down.xml} (100%) rename app/src/main/res/{drawable/ic_thumb_up_white_24dp.xml => drawable-night/ic_thumb_up.xml} (100%) rename app/src/main/res/{drawable/ic_trending_up_white_24dp.xml => drawable-night/ic_trending_up.xml} (100%) rename app/src/main/res/{drawable/ic_tv_white_24dp.xml => drawable-night/ic_tv.xml} (100%) rename app/src/main/res/{drawable/ic_videogame_asset_white_24dp.xml => drawable-night/ic_videogame_asset.xml} (100%) rename app/src/main/res/{drawable/ic_volume_off_white_24dp.xml => drawable-night/ic_volume_off.xml} (100%) rename app/src/main/res/{drawable/ic_volume_up_white_24dp.xml => drawable-night/ic_volume_up.xml} (100%) rename app/src/main/res/{drawable/ic_watch_later_white_24dp.xml => drawable-night/ic_watch_later.xml} (100%) rename app/src/main/res/{drawable/ic_wb_sunny_white_24dp.xml => drawable-night/ic_wb_sunny.xml} (100%) rename app/src/main/res/{drawable/ic_whatshot_white_24dp.xml => drawable-night/ic_whatshot.xml} (100%) rename app/src/main/res/{drawable/ic_work_white_24dp.xml => drawable-night/ic_work.xml} (100%) rename app/src/main/res/drawable-xhdpi/{ic_close_white_24dp_png.png => ic_close_white.png} (100%) rename app/src/main/res/drawable-xhdpi/{ic_hourglass_top_white_24dp_png.png => ic_hourglass_top_white.png} (100%) rename app/src/main/res/drawable-xhdpi/{ic_replay_white_24dp_png.png => ic_replay_white.png} (100%) rename app/src/main/res/drawable-xxhdpi/{ic_close_white_24dp_png.png => ic_close_white.png} (100%) rename app/src/main/res/drawable-xxhdpi/{ic_hourglass_top_white_24dp_png.png => ic_hourglass_top_white.png} (100%) rename app/src/main/res/drawable-xxhdpi/{ic_replay_white_24dp_png.png => ic_replay_white.png} (100%) rename app/src/main/res/drawable-xxxhdpi/{ic_close_white_24dp_png.png => ic_close_white.png} (100%) rename app/src/main/res/drawable-xxxhdpi/{ic_hourglass_top_white_24dp_png.png => ic_hourglass_top_white.png} (100%) rename app/src/main/res/drawable-xxxhdpi/{ic_replay_white_24dp_png.png => ic_replay_white.png} (100%) rename app/src/main/res/drawable/{ic_add_black_24dp.xml => ic_add.xml} (100%) rename app/src/main/res/drawable/{ic_add_circle_outline_black_24dp.xml => ic_add_circle_outline.xml} (100%) rename app/src/main/res/drawable/{ic_apps_black_24dp.xml => ic_apps.xml} (100%) rename app/src/main/res/drawable/{ic_arrow_back_black_24dp.xml => ic_arrow_back.xml} (100%) rename app/src/main/res/drawable/{ic_arrow_drop_down_white_24dp.xml => ic_arrow_drop_down.xml} (100%) rename app/src/main/res/drawable/{ic_arrow_drop_up_white_24dp.xml => ic_arrow_drop_up.xml} (100%) rename app/src/main/res/drawable/{ic_art_track_white_24dp.xml => ic_art_track.xml} (100%) rename app/src/main/res/drawable/{ic_asterisk_black_24dp.xml => ic_asterisk.xml} (100%) rename app/src/main/res/drawable/{ic_attach_money_black_24dp.xml => ic_attach_money.xml} (100%) rename app/src/main/res/drawable/{ic_backup_black_24dp.xml => ic_backup.xml} (100%) rename app/src/main/res/drawable/{ic_bookmark_black_24dp.xml => ic_bookmark.xml} (100%) rename app/src/main/res/drawable/{ic_brightness_high_white_24dp.xml => ic_brightness_high.xml} (100%) rename app/src/main/res/drawable/{ic_brightness_low_white_24dp.xml => ic_brightness_low.xml} (100%) rename app/src/main/res/drawable/{ic_brightness_medium_white_24dp.xml => ic_brightness_medium.xml} (100%) rename app/src/main/res/drawable/{ic_bug_report_black_24dp.xml => ic_bug_report.xml} (100%) rename app/src/main/res/drawable/{ic_cast_black_24dp.xml => ic_cast.xml} (100%) rename app/src/main/res/drawable/{ic_child_care_black_24dp.xml => ic_child_care.xml} (100%) rename app/src/main/res/drawable/{ic_close_black_24dp.xml => ic_close.xml} (100%) rename app/src/main/res/drawable/{ic_cloud_download_black_24dp.xml => ic_cloud_download.xml} (100%) rename app/src/main/res/drawable/{ic_comment_white_24dp.xml => ic_comment.xml} (100%) rename app/src/main/res/drawable/{ic_computer_black_24dp.xml => ic_computer.xml} (100%) rename app/src/main/res/drawable/{ic_crop_portrait_black_24dp.xml => ic_crop_portrait.xml} (100%) rename app/src/main/res/drawable/{ic_delete_black_24dp.xml => ic_delete.xml} (100%) rename app/src/main/res/drawable/{ic_description_white_24dp.xml => ic_description.xml} (100%) rename app/src/main/res/drawable/{ic_directions_bike_black_24dp.xml => ic_directions_bike.xml} (100%) rename app/src/main/res/drawable/{ic_directions_car_black_24dp.xml => ic_directions_car.xml} (100%) rename app/src/main/res/drawable/{ic_done_black_24dp.xml => ic_done.xml} (100%) rename app/src/main/res/drawable/{ic_drag_handle_black_24dp.xml => ic_drag_handle.xml} (100%) rename app/src/main/res/drawable/{ic_edit_black_24dp.xml => ic_edit.xml} (100%) rename app/src/main/res/drawable/{ic_expand_less_black_24dp.xml => ic_expand_less.xml} (100%) rename app/src/main/res/drawable/{ic_expand_more_black_24dp.xml => ic_expand_more.xml} (100%) rename app/src/main/res/drawable/{ic_explore_black_24dp.xml => ic_explore.xml} (100%) rename app/src/main/res/drawable/{ic_fast_forward_white_24dp.xml => ic_fast_forward.xml} (100%) rename app/src/main/res/drawable/{ic_fast_rewind_white_24dp.xml => ic_fast_rewind.xml} (100%) rename app/src/main/res/drawable/{ic_fastfood_black_24dp.xml => ic_fastfood.xml} (100%) rename app/src/main/res/drawable/{ic_favorite_black_24dp.xml => ic_favorite.xml} (100%) rename app/src/main/res/drawable/{ic_file_download_black_24dp.xml => ic_file_download.xml} (100%) rename app/src/main/res/drawable/{ic_filter_list_black_24dp.xml => ic_filter_list.xml} (100%) rename app/src/main/res/drawable/{ic_fitness_center_black_24dp.xml => ic_fitness_center.xml} (100%) rename app/src/main/res/drawable/{ic_format_list_numbered_white_24.xml => ic_format_list_numbered.xml} (100%) rename app/src/main/res/drawable/{ic_fullscreen_white_24dp.xml => ic_fullscreen.xml} (100%) rename app/src/main/res/drawable/{ic_fullscreen_exit_white_24dp.xml => ic_fullscreen_exit.xml} (100%) rename app/src/main/res/drawable/{ic_headset_black_24dp.xml => ic_headset.xml} (100%) rename app/src/main/res/drawable/{ic_help_black_24dp.xml => ic_help.xml} (100%) rename app/src/main/res/drawable/{ic_history_black_24dp.xml => ic_history.xml} (100%) rename app/src/main/res/drawable/{ic_home_black_24dp.xml => ic_home.xml} (100%) rename app/src/main/res/drawable/{ic_hourglass_top_white_24dp.xml => ic_hourglass_top.xml} (100%) rename app/src/main/res/drawable/{ic_import_export_black_24dp.xml => ic_import_export.xml} (100%) rename app/src/main/res/drawable/{ic_info_outline_black_24dp.xml => ic_info_outline.xml} (100%) rename app/src/main/res/drawable/{ic_insert_emoticon_black_24dp.xml => ic_insert_emoticon.xml} (100%) rename app/src/main/res/drawable/{ic_language_black_24dp.xml => ic_language.xml} (100%) rename app/src/main/res/drawable/{ic_list_black_24dp.xml => ic_list.xml} (100%) rename app/src/main/res/drawable/{ic_live_tv_black_24dp.xml => ic_live_tv.xml} (100%) rename app/src/main/res/drawable/{ic_megaphone_black_24dp.xml => ic_megaphone.xml} (100%) rename app/src/main/res/drawable/{ic_mic_black_24dp.xml => ic_mic.xml} (100%) rename app/src/main/res/drawable/{ic_more_vert_black_24dp.xml => ic_more_vert.xml} (100%) rename app/src/main/res/drawable/{ic_motorcycle_black_24dp.xml => ic_motorcycle.xml} (100%) rename app/src/main/res/drawable/{ic_movie_black_24dp.xml => ic_movie.xml} (100%) rename app/src/main/res/drawable/{ic_music_note_black_24dp.xml => ic_music_note.xml} (100%) rename app/src/main/res/drawable/{ic_next_white_24dp.xml => ic_next.xml} (100%) rename app/src/main/res/drawable/{ic_palette_black_24dp.xml => ic_palette.xml} (100%) rename app/src/main/res/drawable/{ic_pause_black_24dp.xml => ic_pause.xml} (100%) rename app/src/main/res/drawable/{ic_people_black_24dp.xml => ic_people.xml} (100%) rename app/src/main/res/drawable/{ic_person_black_24dp.xml => ic_person.xml} (100%) rename app/src/main/res/drawable/{ic_pets_black_24dp.xml => ic_pets.xml} (100%) rename app/src/main/res/drawable/{ic_picture_in_picture_black_24dp.xml => ic_picture_in_picture.xml} (100%) rename app/src/main/res/drawable/{ic_play_arrow_black_24dp.xml => ic_play_arrow.xml} (100%) rename app/src/main/res/drawable/{ic_playlist_add_black_24dp.xml => ic_playlist_add.xml} (100%) rename app/src/main/res/drawable/{ic_playlist_add_check_black_24dp.xml => ic_playlist_add_check.xml} (100%) rename app/src/main/res/drawable/{ic_playlist_play_white_24dp.xml => ic_playlist_play.xml} (100%) rename app/src/main/res/drawable/{ic_previous_white_24dp.xml => ic_previous.xml} (100%) rename app/src/main/res/drawable/{ic_public_black_24dp.xml => ic_public.xml} (100%) rename app/src/main/res/drawable/{ic_radio_black_24dp.xml => ic_radio.xml} (100%) rename app/src/main/res/drawable/{ic_refresh_black_24dp.xml => ic_refresh.xml} (100%) rename app/src/main/res/drawable/{ic_repeat_white_24dp.xml => ic_repeat.xml} (100%) rename app/src/main/res/drawable/{ic_replay_white_24dp.xml => ic_replay.xml} (100%) rename app/src/main/res/drawable/{ic_restaurant_black_24dp.xml => ic_restaurant.xml} (100%) rename app/src/main/res/drawable/{ic_rss_feed_black_24dp.xml => ic_rss_feed.xml} (100%) rename app/src/main/res/drawable/{ic_save_black_24dp.xml => ic_save.xml} (100%) rename app/src/main/res/drawable/{ic_school_black_24dp.xml => ic_school.xml} (100%) rename app/src/main/res/drawable/{ic_screen_rotation_white_24dp.xml => ic_screen_rotation.xml} (100%) rename app/src/main/res/drawable/{ic_search_black_24dp.xml => ic_search.xml} (100%) rename app/src/main/res/drawable/{ic_search_add_black_24dp.xml => ic_search_add.xml} (100%) rename app/src/main/res/drawable/{ic_settings_black_24dp.xml => ic_settings.xml} (100%) rename app/src/main/res/drawable/{ic_settings_backup_restore_black_24dp.xml => ic_settings_backup_restore.xml} (100%) rename app/src/main/res/drawable/{ic_share_black_24dp.xml => ic_share.xml} (100%) rename app/src/main/res/drawable/{ic_shopping_cart_black_24dp.xml => ic_shopping_cart.xml} (100%) rename app/src/main/res/drawable/{ic_shuffle_white_24dp.xml => ic_shuffle.xml} (100%) rename app/src/main/res/drawable/{ic_sort_black_24dp.xml => ic_sort.xml} (100%) rename app/src/main/res/drawable/{ic_stars_black_24dp.xml => ic_stars.xml} (100%) rename app/src/main/res/drawable/{ic_subtitles_white_24dp.xml => ic_subtitles.xml} (100%) rename app/src/main/res/drawable/{ic_telescope_black_24dp.xml => ic_telescope.xml} (100%) rename app/src/main/res/drawable/{ic_thumb_down_black_24dp.xml => ic_thumb_down.xml} (100%) rename app/src/main/res/drawable/{ic_thumb_up_black_24dp.xml => ic_thumb_up.xml} (100%) rename app/src/main/res/drawable/{ic_trending_up_black_24dp.xml => ic_trending_up.xml} (100%) rename app/src/main/res/drawable/{ic_tv_black_24dp.xml => ic_tv.xml} (100%) rename app/src/main/res/drawable/{ic_videogame_asset_black_24dp.xml => ic_videogame_asset.xml} (100%) rename app/src/main/res/drawable/{ic_volume_down_white_24dp.xml => ic_volume_down.xml} (100%) rename app/src/main/res/drawable/{ic_volume_mute_white_24dp.xml => ic_volume_mute.xml} (100%) rename app/src/main/res/drawable/{ic_volume_off_black_24dp.xml => ic_volume_off.xml} (100%) rename app/src/main/res/drawable/{ic_volume_up_black_24dp.xml => ic_volume_up.xml} (100%) rename app/src/main/res/drawable/{ic_watch_later_black_24dp.xml => ic_watch_later.xml} (100%) rename app/src/main/res/drawable/{ic_wb_sunny_black_24dp.xml => ic_wb_sunny.xml} (100%) rename app/src/main/res/drawable/{ic_whatshot_black_24dp.xml => ic_whatshot.xml} (100%) rename app/src/main/res/drawable/{ic_work_black_24dp.xml => ic_work.xml} (100%) create mode 100644 app/src/main/res/drawable/white_edit_text_cursor.xml create mode 100644 app/src/main/res/values-night/colors.xml diff --git a/app/src/debug/res/xml/main_settings.xml b/app/src/debug/res/xml/main_settings.xml index dfb8ffa34..d482d033c 100644 --- a/app/src/debug/res/xml/main_settings.xml +++ b/app/src/debug/res/xml/main_settings.xml @@ -6,50 +6,50 @@ diff --git a/app/src/main/java/org/schabi/newpipe/MainActivity.java b/app/src/main/java/org/schabi/newpipe/MainActivity.java index 534d81b09..90db7bead 100644 --- a/app/src/main/java/org/schabi/newpipe/MainActivity.java +++ b/app/src/main/java/org/schabi/newpipe/MainActivity.java @@ -182,27 +182,27 @@ public class MainActivity extends AppCompatActivity { drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_SUBSCRIPTIONS, ORDER, R.string.tab_subscriptions) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_channel)); + .setIcon(R.drawable.ic_tv); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_FEED, ORDER, R.string.fragment_feed_title) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_rss)); + .setIcon(R.drawable.ic_rss_feed); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_BOOKMARKS, ORDER, R.string.tab_bookmarks) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_bookmark)); + .setIcon(R.drawable.ic_bookmark); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_DOWNLOADS, ORDER, R.string.downloads) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_file_download)); + .setIcon(R.drawable.ic_file_download); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_HISTORY, ORDER, R.string.action_history) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_history)); + .setIcon(R.drawable.ic_history); //Settings and About drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_options_about_group, ITEM_ID_SETTINGS, ORDER, R.string.settings) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_settings)); + .setIcon(R.drawable.ic_settings); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_options_about_group, ITEM_ID_ABOUT, ORDER, R.string.tab_about) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_info_outline)); + .setIcon(R.drawable.ic_info_outline); toggle = new ActionBarDrawerToggle(this, mainBinding.getRoot(), toolbarLayoutBinding.toolbar, R.string.drawer_open, R.string.drawer_close); @@ -348,7 +348,7 @@ public class MainActivity extends AppCompatActivity { } private void showServices() { - drawerHeaderBinding.drawerArrow.setImageResource(R.drawable.ic_arrow_drop_up_white_24dp); + drawerHeaderBinding.drawerArrow.setImageResource(R.drawable.ic_arrow_drop_up); for (final StreamingService s : NewPipe.getServices()) { final String title = s.getServiceInfo().getName() @@ -414,7 +414,7 @@ public class MainActivity extends AppCompatActivity { } private void showTabs() throws ExtractionException { - drawerHeaderBinding.drawerArrow.setImageResource(R.drawable.ic_arrow_drop_down_white_24dp); + drawerHeaderBinding.drawerArrow.setImageResource(R.drawable.ic_arrow_drop_down); //Tabs final int currentServiceId = ServiceHelper.getSelectedServiceId(this); @@ -432,27 +432,27 @@ public class MainActivity extends AppCompatActivity { drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_SUBSCRIPTIONS, ORDER, R.string.tab_subscriptions) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_channel)); + .setIcon(R.drawable.ic_tv); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_FEED, ORDER, R.string.fragment_feed_title) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_rss)); + .setIcon(R.drawable.ic_rss_feed); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_BOOKMARKS, ORDER, R.string.tab_bookmarks) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_bookmark)); + .setIcon(R.drawable.ic_bookmark); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_DOWNLOADS, ORDER, R.string.downloads) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_file_download)); + .setIcon(R.drawable.ic_file_download); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_tabs_group, ITEM_ID_HISTORY, ORDER, R.string.action_history) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_history)); + .setIcon(R.drawable.ic_history); //Settings and About drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_options_about_group, ITEM_ID_SETTINGS, ORDER, R.string.settings) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_settings)); + .setIcon(R.drawable.ic_settings); drawerLayoutBinding.navigation.getMenu() .add(R.id.menu_options_about_group, ITEM_ID_ABOUT, ORDER, R.string.tab_about) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(this, R.attr.ic_info_outline)); + .setIcon(R.drawable.ic_info_outline); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/RouterActivity.java b/app/src/main/java/org/schabi/newpipe/RouterActivity.java index 179fab8dc..13efcb58d 100644 --- a/app/src/main/java/org/schabi/newpipe/RouterActivity.java +++ b/app/src/main/java/org/schabi/newpipe/RouterActivity.java @@ -91,7 +91,6 @@ import io.reactivex.rxjava3.schedulers.Schedulers; import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.AUDIO; import static org.schabi.newpipe.extractor.StreamingService.ServiceInfo.MediaCapability.VIDEO; -import static org.schabi.newpipe.util.ThemeHelper.resolveResourceIdFromAttr; /** * Get the url from the intent and open it in the chosen preferred player. @@ -231,7 +230,7 @@ public class RouterActivity extends AppCompatActivity { new AlertDialog.Builder(context) .setTitle(R.string.unsupported_url) .setMessage(R.string.unsupported_url_dialog_message) - .setIcon(ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_share)) + .setIcon(R.drawable.ic_share) .setPositiveButton(R.string.open_in_browser, (dialog, which) -> ShareUtils.openUrlInBrowser(this, url)) .setNegativeButton(R.string.share, @@ -427,16 +426,16 @@ public class RouterActivity extends AppCompatActivity { final AdapterChoiceItem videoPlayer = new AdapterChoiceItem( getString(R.string.video_player_key), getString(R.string.video_player), - resolveResourceIdFromAttr(context, R.attr.ic_play_arrow)); + R.drawable.ic_play_arrow); final AdapterChoiceItem showInfo = new AdapterChoiceItem( getString(R.string.show_info_key), getString(R.string.show_info), - resolveResourceIdFromAttr(context, R.attr.ic_info_outline)); + R.drawable.ic_info_outline); final AdapterChoiceItem popupPlayer = new AdapterChoiceItem( getString(R.string.popup_player_key), getString(R.string.popup_player), - resolveResourceIdFromAttr(context, R.attr.ic_popup)); + R.drawable.ic_picture_in_picture); final AdapterChoiceItem backgroundPlayer = new AdapterChoiceItem( getString(R.string.background_player_key), getString(R.string.background_player), - resolveResourceIdFromAttr(context, R.attr.ic_headset)); + R.drawable.ic_headset); if (linkType == LinkType.STREAM) { if (isExtVideoEnabled) { @@ -481,7 +480,7 @@ public class RouterActivity extends AppCompatActivity { returnList.add(new AdapterChoiceItem(getString(R.string.download_key), getString(R.string.download), - resolveResourceIdFromAttr(context, R.attr.ic_file_download))); + R.drawable.ic_file_download)); return returnList; } diff --git a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java index 484a46497..4d3726c38 100644 --- a/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java +++ b/app/src/main/java/org/schabi/newpipe/download/DownloadDialog.java @@ -394,8 +394,7 @@ public class DownloadDialog extends DialogFragment } toolbar.setTitle(R.string.download_dialog_title); - toolbar.setNavigationIcon( - ThemeHelper.resolveResourceIdFromAttr(requireContext(), R.attr.ic_arrow_back)); + toolbar.setNavigationIcon(R.drawable.ic_arrow_back); toolbar.inflateMenu(R.menu.dialog_url); toolbar.setNavigationOnClickListener(v -> requireDialog().dismiss()); toolbar.setNavigationContentDescription(R.string.cancel); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java index 5fb68ba30..ed6fd18a7 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/MainFragment.java @@ -1,7 +1,6 @@ package org.schabi.newpipe.fragments; import android.content.Context; -import android.content.res.ColorStateList; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -30,7 +29,6 @@ import org.schabi.newpipe.settings.tabs.Tab; import org.schabi.newpipe.settings.tabs.TabsManager; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.ServiceHelper; -import org.schabi.newpipe.util.ThemeHelper; import java.util.ArrayList; import java.util.List; @@ -87,8 +85,6 @@ public class MainFragment extends BaseFragment implements TabLayout.OnTabSelecte binding = FragmentMainBinding.bind(rootView); - binding.mainTabLayout.setTabIconTint(ColorStateList.valueOf( - ThemeHelper.resolveColorFromAttr(requireContext(), R.attr.colorAccent))); binding.mainTabLayout.setupWithViewPager(binding.pager); binding.mainTabLayout.addOnTabSelectedListener(this); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index a5dfe2057..1e50a77f0 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -923,21 +923,21 @@ public final class VideoDetailFragment if (shouldShowComments()) { pageAdapter.addFragment( CommentsFragment.getInstance(serviceId, url, title), COMMENTS_TAB_TAG); - tabIcons.add(R.drawable.ic_comment_white_24dp); + tabIcons.add(R.drawable.ic_comment); tabContentDescriptions.add(R.string.comments_tab_description); } if (showRelatedStreams && binding.relatedStreamsLayout == null) { // temp empty fragment. will be updated in handleResult pageAdapter.addFragment(new EmptyFragment(false), RELATED_TAB_TAG); - tabIcons.add(R.drawable.ic_art_track_white_24dp); + tabIcons.add(R.drawable.ic_art_track); tabContentDescriptions.add(R.string.related_streams_tab_description); } if (showDescription) { // temp empty fragment. will be updated in handleResult pageAdapter.addFragment(new EmptyFragment(false), DESCRIPTION_TAB_TAG); - tabIcons.add(R.drawable.ic_description_white_24dp); + tabIcons.add(R.drawable.ic_description); tabContentDescriptions.add(R.string.description_tab_description); } @@ -2274,11 +2274,10 @@ public final class VideoDetailFragment } private void setOverlayPlayPauseImage(final boolean playerIsPlaying) { - final int attr = playerIsPlaying - ? R.attr.ic_pause - : R.attr.ic_play_arrow; - binding.overlayPlayPauseButton.setImageResource( - ThemeHelper.resolveResourceIdFromAttr(activity, attr)); + final int drawable = playerIsPlaying + ? R.drawable.ic_pause + : R.drawable.ic_play_arrow; + binding.overlayPlayPauseButton.setImageResource(drawable); } private void setOverlayLook(final AppBarLayout appBar, diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 114947923..d0f90ee6b 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -61,7 +61,6 @@ import io.reactivex.rxjava3.disposables.Disposable; import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling; -import static org.schabi.newpipe.util.ThemeHelper.resolveResourceIdFromAttr; public class PlaylistFragment extends BaseListInfoFragment { private CompositeDisposable disposables; @@ -307,7 +306,7 @@ public class PlaylistFragment extends BaseListInfoFragment { getResources().getColor(R.color.transparent_background_color)); headerBinding.uploaderAvatarView.setImageDrawable( AppCompatResources.getDrawable(requireContext(), - resolveResourceIdFromAttr(requireContext(), R.attr.ic_radio)) + R.drawable.ic_radio) ); } else { IMAGE_LOADER.displayImage(avatarUrl, headerBinding.uploaderAvatarView, @@ -459,13 +458,13 @@ public class PlaylistFragment extends BaseListInfoFragment { return; } - final int iconAttr = playlistEntity == null - ? R.attr.ic_playlist_add : R.attr.ic_playlist_check; + final int drawable = playlistEntity == null + ? R.drawable.ic_playlist_add : R.drawable.ic_playlist_add_check; final int titleRes = playlistEntity == null ? R.string.bookmark_playlist : R.string.unbookmark_playlist; - playlistBookmarkButton.setIcon(resolveResourceIdFromAttr(activity, iconAttr)); + playlistBookmarkButton.setIcon(drawable); playlistBookmarkButton.setTitle(titleRes); } } diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java index d4bb4eebd..8e12680bc 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SuggestionListAdapter.java @@ -117,8 +117,8 @@ public class SuggestionListAdapter queryView = rootView.findViewById(R.id.suggestion_search); insertView = rootView.findViewById(R.id.suggestion_insert); - historyResId = resolveResourceIdFromAttr(rootView.getContext(), R.attr.ic_history); - searchResId = resolveResourceIdFromAttr(rootView.getContext(), R.attr.ic_search); + historyResId = R.drawable.ic_history; + searchResId = R.drawable.ic_search; } private static int resolveResourceIdFromAttr(final Context context, diff --git a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java index 1bece369b..a2107d5e5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/history/StatisticsPlaylistFragment.java @@ -40,7 +40,6 @@ import org.schabi.newpipe.util.KoreUtil; import org.schabi.newpipe.util.NavigationHelper; import org.schabi.newpipe.util.OnClickGesture; import org.schabi.newpipe.util.StreamDialogEntry; -import org.schabi.newpipe.util.ThemeHelper; import java.util.ArrayList; import java.util.Arrays; @@ -312,14 +311,13 @@ public class StatisticsPlaylistFragment if (sortMode == StatisticSortMode.LAST_PLAYED) { sortMode = StatisticSortMode.MOST_PLAYED; setTitle(getString(R.string.title_most_played)); - headerBinding.sortButtonIcon.setImageResource( - ThemeHelper.resolveResourceIdFromAttr(requireContext(), R.attr.ic_history)); + headerBinding.sortButtonIcon.setImageResource(R.drawable.ic_history); headerBinding.sortButtonText.setText(R.string.title_last_played); } else { sortMode = StatisticSortMode.LAST_PLAYED; setTitle(getString(R.string.title_last_played)); headerBinding.sortButtonIcon.setImageResource( - ThemeHelper.resolveResourceIdFromAttr(requireContext(), R.attr.ic_filter_list)); + R.drawable.ic_filter_list); headerBinding.sortButtonText.setText(R.string.title_most_played); } startLoading(true); diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt index 19038be93..83a90213d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/FeedGroupIcon.kt @@ -1,10 +1,7 @@ package org.schabi.newpipe.local.subscription -import android.content.Context -import androidx.annotation.AttrRes import androidx.annotation.DrawableRes import org.schabi.newpipe.R -import org.schabi.newpipe.util.ThemeHelper enum class FeedGroupIcon( /** @@ -13,51 +10,51 @@ enum class FeedGroupIcon( val id: Int, /** - * The attribute that points to a drawable resource. "R.attr" is used here to support multiple themes. + * The drawable resource. */ - @AttrRes val drawableResourceAttr: Int + @DrawableRes val drawableResource: Int ) { - ALL(0, R.attr.ic_asterisk), - MUSIC(1, R.attr.ic_music_note), - EDUCATION(2, R.attr.ic_school), - FITNESS(3, R.attr.ic_fitness_center), - SPACE(4, R.attr.ic_telescope), - COMPUTER(5, R.attr.ic_computer), - GAMING(6, R.attr.ic_videogame_asset), - SPORTS(7, R.attr.ic_sports), - NEWS(8, R.attr.ic_megaphone), - FAVORITES(9, R.attr.ic_heart), - CAR(10, R.attr.ic_car), - MOTORCYCLE(11, R.attr.ic_motorcycle), - TREND(12, R.attr.ic_trending_up), - MOVIE(13, R.attr.ic_movie), - BACKUP(14, R.attr.ic_backup), - ART(15, R.attr.ic_palette), - PERSON(16, R.attr.ic_person), - PEOPLE(17, R.attr.ic_people), - MONEY(18, R.attr.ic_money), - KIDS(19, R.attr.ic_child_care), - FOOD(20, R.attr.ic_fastfood), - SMILE(21, R.attr.ic_smile), - EXPLORE(22, R.attr.ic_explore), - RESTAURANT(23, R.attr.ic_restaurant), - MIC(24, R.attr.ic_mic), - HEADSET(25, R.attr.ic_headset), - RADIO(26, R.attr.ic_radio), - SHOPPING_CART(27, R.attr.ic_shopping_cart), - WATCH_LATER(28, R.attr.ic_watch_later), - WORK(29, R.attr.ic_work), - HOT(30, R.attr.ic_kiosk_hot), - CHANNEL(31, R.attr.ic_channel), - BOOKMARK(32, R.attr.ic_bookmark), - PETS(33, R.attr.ic_pets), - WORLD(34, R.attr.ic_world), - STAR(35, R.attr.ic_stars), - SUN(36, R.attr.ic_sunny), - RSS(37, R.attr.ic_rss); + ALL(0, R.drawable.ic_asterisk), + MUSIC(1, R.drawable.ic_music_note), + EDUCATION(2, R.drawable.ic_school), + FITNESS(3, R.drawable.ic_fitness_center), + SPACE(4, R.drawable.ic_telescope), + COMPUTER(5, R.drawable.ic_computer), + GAMING(6, R.drawable.ic_videogame_asset), + SPORTS(7, R.drawable.ic_directions_bike), + NEWS(8, R.drawable.ic_megaphone), + FAVORITES(9, R.drawable.ic_favorite), + CAR(10, R.drawable.ic_directions_car), + MOTORCYCLE(11, R.drawable.ic_motorcycle), + TREND(12, R.drawable.ic_trending_up), + MOVIE(13, R.drawable.ic_movie), + BACKUP(14, R.drawable.ic_backup), + ART(15, R.drawable.ic_palette), + PERSON(16, R.drawable.ic_person), + PEOPLE(17, R.drawable.ic_people), + MONEY(18, R.drawable.ic_attach_money), + KIDS(19, R.drawable.ic_child_care), + FOOD(20, R.drawable.ic_fastfood), + SMILE(21, R.drawable.ic_insert_emoticon), + EXPLORE(22, R.drawable.ic_explore), + RESTAURANT(23, R.drawable.ic_restaurant), + MIC(24, R.drawable.ic_mic), + HEADSET(25, R.drawable.ic_headset), + RADIO(26, R.drawable.ic_radio), + SHOPPING_CART(27, R.drawable.ic_shopping_cart), + WATCH_LATER(28, R.drawable.ic_watch_later), + WORK(29, R.drawable.ic_work), + HOT(30, R.drawable.ic_whatshot), + CHANNEL(31, R.drawable.ic_tv), + BOOKMARK(32, R.drawable.ic_bookmark), + PETS(33, R.drawable.ic_pets), + WORLD(34, R.drawable.ic_public), + STAR(35, R.drawable.ic_stars), + SUN(36, R.drawable.ic_wb_sunny), + RSS(37, R.drawable.ic_rss_feed); @DrawableRes - fun getDrawableRes(context: Context): Int { - return ThemeHelper.resolveResourceIdFromAttr(context, drawableResourceAttr) + fun getDrawableRes(): Int { + return drawableResource } } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt index d60d82cb4..016e1e404 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionFragment.kt @@ -62,7 +62,6 @@ import org.schabi.newpipe.util.FilePickerActivityHelper import org.schabi.newpipe.util.NavigationHelper import org.schabi.newpipe.util.OnClickGesture import org.schabi.newpipe.util.ShareUtils -import org.schabi.newpipe.util.ThemeHelper import java.io.File import java.text.SimpleDateFormat import java.util.Date @@ -257,7 +256,7 @@ class SubscriptionFragment : BaseStateFragment() { feedGroupsCarousel = FeedGroupCarouselItem(requireContext(), carouselAdapter) feedGroupsSortMenuItem = HeaderWithMenuItem( getString(R.string.feed_groups_header_title), - ThemeHelper.resolveResourceIdFromAttr(requireContext(), R.attr.ic_sort), + R.drawable.ic_sort, menuItemOnClickListener = ::openReorderDialog ) add(Section(feedGroupsSortMenuItem, listOf(feedGroupsCarousel))) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt index 5bd13356d..908bea00c 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt @@ -306,7 +306,7 @@ class FeedGroupDialog : DialogFragment(), BackPressable { groupSortOrder = feedGroupEntity?.sortOrder ?: -1 val feedGroupIcon = if (selectedIcon == null) icon else selectedIcon!! - feedGroupCreateBinding.iconPreview.setImageResource(feedGroupIcon.getDrawableRes(requireContext())) + feedGroupCreateBinding.iconPreview.setImageResource(feedGroupIcon.getDrawableRes()) if (feedGroupCreateBinding.groupNameInput.text.isNullOrBlank()) { feedGroupCreateBinding.groupNameInput.setText(name) @@ -404,7 +404,7 @@ class FeedGroupDialog : DialogFragment(), BackPressable { if (groupId == NO_GROUP_SELECTED) { val icon = selectedIcon ?: FeedGroupIcon.ALL - feedGroupCreateBinding.iconPreview.setImageResource(icon.getDrawableRes(requireContext())) + feedGroupCreateBinding.iconPreview.setImageResource(icon.getDrawableRes()) } } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt index a9731df8a..7b78b3d95 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupCardItem.kt @@ -25,7 +25,7 @@ data class FeedGroupCardItem( override fun bind(viewBinding: FeedGroupCardItemBinding, position: Int) { viewBinding.title.text = name - viewBinding.icon.setImageResource(icon.getDrawableRes(viewBinding.root.context)) + viewBinding.icon.setImageResource(icon.getDrawableRes()) } override fun initializeViewBinding(view: View) = FeedGroupCardItemBinding.bind(view) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupReorderItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupReorderItem.kt index 74e481c4f..9a33de54d 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupReorderItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedGroupReorderItem.kt @@ -32,7 +32,7 @@ data class FeedGroupReorderItem( override fun bind(viewBinding: FeedGroupReorderItemBinding, position: Int) { viewBinding.groupName.text = name - viewBinding.groupIcon.setImageResource(icon.getDrawableRes(viewBinding.root.context)) + viewBinding.groupIcon.setImageResource(icon.getDrawableRes()) } override fun bind(viewHolder: GroupieViewHolder, position: Int, payloads: MutableList) { diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedImportExportItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedImportExportItem.kt index afca7064f..23d5bdd11 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedImportExportItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/FeedImportExportItem.kt @@ -86,7 +86,7 @@ class FeedImportExportItem( private fun setupImportFromItems(listHolder: ViewGroup) { val previousBackupItem = addItemView( listHolder.context.getString(R.string.previous_export), - ThemeHelper.resolveResourceIdFromAttr(listHolder.context, R.attr.ic_backup), listHolder + R.drawable.ic_backup, listHolder ) previousBackupItem.setOnClickListener { onImportPreviousSelected() } @@ -115,7 +115,7 @@ class FeedImportExportItem( private fun setupExportToItems(listHolder: ViewGroup) { val previousBackupItem = addItemView( listHolder.context.getString(R.string.file), - ThemeHelper.resolveResourceIdFromAttr(listHolder.context, R.attr.ic_save), + R.drawable.ic_save, listHolder ) previousBackupItem.setOnClickListener { onExportSelected() } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerIconItem.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerIconItem.kt index 11fc4833a..1b55d2e85 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerIconItem.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/item/PickerIconItem.kt @@ -13,7 +13,7 @@ class PickerIconItem( val icon: FeedGroupIcon ) : BindableItem() { @DrawableRes - val iconRes: Int = icon.getDrawableRes(context) + val iconRes: Int = icon.getDrawableRes() override fun getLayout(): Int = R.layout.picker_icon_item diff --git a/app/src/main/java/org/schabi/newpipe/player/NotificationConstants.java b/app/src/main/java/org/schabi/newpipe/player/NotificationConstants.java index cf58c8f76..6c9858d1b 100644 --- a/app/src/main/java/org/schabi/newpipe/player/NotificationConstants.java +++ b/app/src/main/java/org/schabi/newpipe/player/NotificationConstants.java @@ -50,11 +50,11 @@ public final class NotificationConstants { R.drawable.exo_icon_fastforward, R.drawable.exo_icon_previous, R.drawable.exo_icon_next, - R.drawable.ic_pause_white_24dp, - R.drawable.ic_hourglass_top_white_24dp, + R.drawable.ic_pause, + R.drawable.ic_hourglass_top, R.drawable.exo_icon_repeat_all, R.drawable.exo_icon_shuffle_on, - R.drawable.ic_close_white_24dp, + R.drawable.ic_close, }; diff --git a/app/src/main/java/org/schabi/newpipe/player/NotificationUtil.java b/app/src/main/java/org/schabi/newpipe/player/NotificationUtil.java index 43c1b4405..948343be2 100644 --- a/app/src/main/java/org/schabi/newpipe/player/NotificationUtil.java +++ b/app/src/main/java/org/schabi/newpipe/player/NotificationUtil.java @@ -273,14 +273,14 @@ public final class NotificationUtil { || player.getCurrentState() == Player.STATE_BLOCKED || player.getCurrentState() == Player.STATE_BUFFERING) { // null intent -> show hourglass icon that does nothing when clicked - return new NotificationCompat.Action(R.drawable.ic_hourglass_top_white_24dp_png, + return new NotificationCompat.Action(R.drawable.ic_hourglass_top, player.getContext().getString(R.string.notification_action_buffering), null); } case NotificationConstants.PLAY_PAUSE: if (player.getCurrentState() == Player.STATE_COMPLETED) { - return getAction(player, R.drawable.ic_replay_white_24dp_png, + return getAction(player, R.drawable.ic_replay, R.string.exo_controls_pause_description, ACTION_PLAY_PAUSE); } else if (player.isPlaying() || player.getCurrentState() == Player.STATE_PREFLIGHT @@ -315,7 +315,7 @@ public final class NotificationUtil { } case NotificationConstants.CLOSE: - return getAction(player, R.drawable.ic_close_white_24dp_png, + return getAction(player, R.drawable.ic_close, R.string.close, ACTION_CLOSE); case NotificationConstants.NOTHING: diff --git a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java index d757a9268..08a2762a9 100644 --- a/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java +++ b/app/src/main/java/org/schabi/newpipe/player/PlayQueueActivity.java @@ -589,15 +589,15 @@ public final class PlayQueueActivity extends AppCompatActivity switch (state) { case Player.STATE_PAUSED: queueControlBinding.controlPlayPause - .setImageResource(R.drawable.ic_play_arrow_white_24dp); + .setImageResource(R.drawable.ic_play_arrow); break; case Player.STATE_PLAYING: queueControlBinding.controlPlayPause - .setImageResource(R.drawable.ic_pause_white_24dp); + .setImageResource(R.drawable.ic_pause); break; case Player.STATE_COMPLETED: queueControlBinding.controlPlayPause - .setImageResource(R.drawable.ic_replay_white_24dp); + .setImageResource(R.drawable.ic_replay); break; default: break; @@ -670,8 +670,7 @@ public final class PlayQueueActivity extends AppCompatActivity //2) Icon change accordingly to current App Theme // using rootView.getContext() because getApplicationContext() didn't work final Context context = queueControlBinding.getRoot().getContext(); - item.setIcon(ThemeHelper.resolveResourceIdFromAttr(context, - player.isMuted() ? R.attr.ic_volume_off : R.attr.ic_volume_up)); + item.setIcon(player.isMuted() ? R.drawable.ic_volume_off : R.drawable.ic_volume_up); } } } diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index f8e0732b3..53d9a3ef0 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -957,7 +957,7 @@ public final class Player implements = LinearLayout.LayoutParams.MATCH_PARENT; binding.secondaryControls.setVisibility(View.INVISIBLE); binding.moreOptionsButton.setImageDrawable(AppCompatResources.getDrawable(context, - R.drawable.ic_expand_more_white_24dp)); + R.drawable.ic_expand_more)); binding.share.setVisibility(View.VISIBLE); binding.openInBrowser.setVisibility(View.VISIBLE); binding.switchMute.setVisibility(View.VISIBLE); @@ -2020,7 +2020,7 @@ public final class Player implements animate(binding.loadingPanel, true, 0); animate(binding.surfaceForeground, true, 100); - binding.playPauseButton.setImageResource(R.drawable.ic_play_arrow_white_24dp); + binding.playPauseButton.setImageResource(R.drawable.ic_play_arrow); animatePlayButtons(false, 100); binding.getRoot().setKeepScreenOn(false); @@ -2049,7 +2049,7 @@ public final class Player implements animate(binding.playPauseButton, false, 80, AnimationType.SCALE_AND_ALPHA, 0, () -> { - binding.playPauseButton.setImageResource(R.drawable.ic_pause_white_24dp); + binding.playPauseButton.setImageResource(R.drawable.ic_pause); animatePlayButtons(true, 200); if (!isQueueVisible) { binding.playPauseButton.requestFocus(); @@ -2090,7 +2090,7 @@ public final class Player implements animate(binding.playPauseButton, false, 80, AnimationType.SCALE_AND_ALPHA, 0, () -> { - binding.playPauseButton.setImageResource(R.drawable.ic_play_arrow_white_24dp); + binding.playPauseButton.setImageResource(R.drawable.ic_play_arrow); animatePlayButtons(true, 200); if (!isQueueVisible) { binding.playPauseButton.requestFocus(); @@ -2129,7 +2129,7 @@ public final class Player implements animate(binding.playPauseButton, false, 0, AnimationType.SCALE_AND_ALPHA, 0, () -> { - binding.playPauseButton.setImageResource(R.drawable.ic_replay_white_24dp); + binding.playPauseButton.setImageResource(R.drawable.ic_replay); animatePlayButtons(true, DEFAULT_CONTROLS_DURATION); }); @@ -2290,7 +2290,7 @@ public final class Player implements private void setMuteButton(final ImageButton button, final boolean isMuted) { button.setImageDrawable(AppCompatResources.getDrawable(context, isMuted - ? R.drawable.ic_volume_off_white_24dp : R.drawable.ic_volume_up_white_24dp)); + ? R.drawable.ic_volume_off : R.drawable.ic_volume_up)); } //endregion @@ -2734,7 +2734,7 @@ public final class Player implements } seekBy(retrieveSeekDurationFromPreferences(this)); triggerProgressUpdate(); - showAndAnimateControl(R.drawable.ic_fast_forward_white_24dp, true); + showAndAnimateControl(R.drawable.ic_fast_forward, true); } public void fastRewind() { @@ -2743,7 +2743,7 @@ public final class Player implements } seekBy(-retrieveSeekDurationFromPreferences(this)); triggerProgressUpdate(); - showAndAnimateControl(R.drawable.ic_fast_rewind_white_24dp, true); + showAndAnimateControl(R.drawable.ic_fast_rewind, true); } //endregion @@ -3691,8 +3691,8 @@ public final class Player implements || DeviceUtils.isTablet(context)) ? View.VISIBLE : View.GONE); binding.screenRotationButton.setImageDrawable(AppCompatResources.getDrawable(context, - isFullscreen ? R.drawable.ic_fullscreen_exit_white_24dp - : R.drawable.ic_fullscreen_white_24dp)); + isFullscreen ? R.drawable.ic_fullscreen_exit + : R.drawable.ic_fullscreen)); } private void setResizeMode(@AspectRatioFrameLayout.ResizeMode final int resizeMode) { diff --git a/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java b/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java index a0b2e7eba..998324c9c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java +++ b/app/src/main/java/org/schabi/newpipe/player/event/PlayerGestureListener.java @@ -147,10 +147,10 @@ public class PlayerGestureListener player.getVolumeImageView().setImageDrawable( AppCompatResources.getDrawable(service, currentProgressPercent <= 0 - ? R.drawable.ic_volume_off_white_24dp - : currentProgressPercent < 0.25 ? R.drawable.ic_volume_mute_white_24dp - : currentProgressPercent < 0.75 ? R.drawable.ic_volume_down_white_24dp - : R.drawable.ic_volume_up_white_24dp) + ? R.drawable.ic_volume_off + : currentProgressPercent < 0.25 ? R.drawable.ic_volume_mute + : currentProgressPercent < 0.75 ? R.drawable.ic_volume_down + : R.drawable.ic_volume_up) ); if (player.getVolumeRelativeLayout().getVisibility() != View.VISIBLE) { @@ -189,10 +189,10 @@ public class PlayerGestureListener player.getBrightnessImageView().setImageDrawable( AppCompatResources.getDrawable(service, currentProgressPercent < 0.25 - ? R.drawable.ic_brightness_low_white_24dp + ? R.drawable.ic_brightness_low : currentProgressPercent < 0.75 - ? R.drawable.ic_brightness_medium_white_24dp - : R.drawable.ic_brightness_high_white_24dp) + ? R.drawable.ic_brightness_medium + : R.drawable.ic_brightness_high) ); if (player.getBrightnessRelativeLayout().getVisibility() != View.VISIBLE) { diff --git a/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java b/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java index bd3cbf79d..74585e12b 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java @@ -145,10 +145,8 @@ public class PeertubeInstanceListFragment extends Fragment { final MenuItem restoreItem = menu .add(Menu.NONE, MENU_ITEM_RESTORE_ID, Menu.NONE, R.string.restore_defaults); restoreItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); - - final int restoreIcon = ThemeHelper - .resolveResourceIdFromAttr(requireContext(), R.attr.ic_restore_defaults); - restoreItem.setIcon(AppCompatResources.getDrawable(requireContext(), restoreIcon)); + restoreItem.setIcon(AppCompatResources.getDrawable(requireContext(), + R.drawable.ic_settings_backup_restore)); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/AddTabDialog.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/AddTabDialog.java index 52e50fbba..125b455f4 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/AddTabDialog.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/AddTabDialog.java @@ -14,7 +14,6 @@ import androidx.annotation.NonNull; import androidx.appcompat.widget.AppCompatImageView; import org.schabi.newpipe.R; -import org.schabi.newpipe.util.ThemeHelper; public final class AddTabDialog { private final AlertDialog dialog; @@ -60,7 +59,7 @@ public final class AddTabDialog { private DialogListAdapter(final Context context, final ChooseTabListItem[] items) { this.inflater = LayoutInflater.from(context); this.items = items; - this.fallbackIcon = ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_kiosk_hot); + this.fallbackIcon = R.drawable.ic_whatshot; } @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java index 572741d03..52d128bf0 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java @@ -113,9 +113,8 @@ public class ChooseTabsFragment extends Fragment { R.string.restore_defaults); restoreItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); - final int restoreIcon = ThemeHelper.resolveResourceIdFromAttr(requireContext(), - R.attr.ic_restore_defaults); - restoreItem.setIcon(AppCompatResources.getDrawable(requireContext(), restoreIcon)); + restoreItem.setIcon(AppCompatResources.getDrawable(requireContext(), + R.drawable.ic_settings_backup_restore)); } @Override @@ -241,7 +240,7 @@ public class ChooseTabsFragment extends Fragment { case KIOSK: returnList.add(new ChooseTabListItem(tab.getTabId(), getString(R.string.kiosk_page_summary), - ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_kiosk_hot))); + R.drawable.ic_whatshot)); break; case CHANNEL: returnList.add(new ChooseTabListItem(tab.getTabId(), @@ -252,8 +251,7 @@ public class ChooseTabsFragment extends Fragment { if (!tabList.contains(tab)) { returnList.add(new ChooseTabListItem(tab.getTabId(), getString(R.string.default_kiosk_page_summary), - ThemeHelper.resolveResourceIdFromAttr(context, - R.attr.ic_kiosk_hot))); + R.drawable.ic_whatshot)); } break; case PLAYLIST: diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java index 0ffda2261..b289009ce 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/Tab.java @@ -30,7 +30,6 @@ import org.schabi.newpipe.local.playlist.LocalPlaylistFragment; import org.schabi.newpipe.local.subscription.SubscriptionFragment; import org.schabi.newpipe.util.KioskTranslator; import org.schabi.newpipe.util.ServiceHelper; -import org.schabi.newpipe.util.ThemeHelper; import java.util.Objects; @@ -188,7 +187,7 @@ public abstract class Tab { @DrawableRes @Override public int getTabIconRes(final Context context) { - return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_blank_page); + return R.drawable.ic_crop_portrait; } @Override @@ -213,7 +212,7 @@ public abstract class Tab { @DrawableRes @Override public int getTabIconRes(final Context context) { - return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_channel); + return R.drawable.ic_tv; } @Override @@ -239,7 +238,7 @@ public abstract class Tab { @DrawableRes @Override public int getTabIconRes(final Context context) { - return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_rss); + return R.drawable.ic_rss_feed; } @Override @@ -264,7 +263,7 @@ public abstract class Tab { @DrawableRes @Override public int getTabIconRes(final Context context) { - return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_bookmark); + return R.drawable.ic_bookmark; } @Override @@ -289,7 +288,7 @@ public abstract class Tab { @DrawableRes @Override public int getTabIconRes(final Context context) { - return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_history); + return R.drawable.ic_history; } @Override @@ -409,7 +408,7 @@ public abstract class Tab { @DrawableRes @Override public int getTabIconRes(final Context context) { - return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_channel); + return R.drawable.ic_tv; } @Override @@ -541,7 +540,7 @@ public abstract class Tab { @DrawableRes @Override public int getTabIconRes(final Context context) { - return ThemeHelper.resolveResourceIdFromAttr(context, R.attr.ic_bookmark); + return R.drawable.ic_bookmark; } @Override diff --git a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java index 2f0b3e132..f77aa0fda 100644 --- a/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java +++ b/app/src/main/java/org/schabi/newpipe/util/KioskTranslator.java @@ -63,20 +63,20 @@ public final class KioskTranslator { case "Top 50": case "New & hot": case "conferences": - return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_kiosk_hot); + return R.drawable.ic_whatshot; case "Local": - return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_kiosk_local); + return R.drawable.ic_home; case "Recently added": case "recent": - return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_kiosk_recent); + return R.drawable.ic_add_circle_outline; case "Most liked": - return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_thumb_up); + return R.drawable.ic_thumb_up; case "live": - return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_live_tv); + return R.drawable.ic_live_tv; case "Featured": - return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_stars); + return R.drawable.ic_stars; case "Radio": - return ThemeHelper.resolveResourceIdFromAttr(c, R.attr.ic_radio); + return R.drawable.ic_radio; default: return 0; } diff --git a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java index 3270b2b6f..b47bc97fd 100644 --- a/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java +++ b/app/src/main/java/us/shandian/giga/ui/fragment/MissionsFragment.java @@ -224,10 +224,9 @@ public class MissionsFragment extends Fragment { mList.setAdapter(mAdapter); if (mSwitch != null) { - mSwitch.setIcon(ThemeHelper.resolveResourceIdFromAttr( - requireContext(), mLinear - ? R.attr.ic_grid - : R.attr.ic_list)); + mSwitch.setIcon(mLinear + ? R.drawable.ic_apps + : R.drawable.ic_list); mSwitch.setTitle(mLinear ? R.string.grid : R.string.list); mPrefs.edit().putBoolean("linear", mLinear).apply(); } diff --git a/app/src/main/java/us/shandian/giga/util/Utility.java b/app/src/main/java/us/shandian/giga/util/Utility.java index c090c7211..ab584f0e6 100644 --- a/app/src/main/java/us/shandian/giga/util/Utility.java +++ b/app/src/main/java/us/shandian/giga/util/Utility.java @@ -182,12 +182,12 @@ public class Utility { public static int getIconForFileType(FileType type) { switch (type) { case MUSIC: - return R.drawable.ic_headset_white_24dp; + return R.drawable.ic_headset; default: case VIDEO: - return R.drawable.ic_movie_white_24dp; + return R.drawable.ic_movie; case SUBTITLE: - return R.drawable.ic_subtitles_white_24dp; + return R.drawable.ic_subtitles; } } diff --git a/app/src/main/res/drawable-hdpi/ic_close_white_24dp_png.png b/app/src/main/res/drawable-hdpi/ic_close_white.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_close_white_24dp_png.png rename to app/src/main/res/drawable-hdpi/ic_close_white.png diff --git a/app/src/main/res/drawable-hdpi/ic_hourglass_top_white_24dp_png.png b/app/src/main/res/drawable-hdpi/ic_hourglass_top_white.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_hourglass_top_white_24dp_png.png rename to app/src/main/res/drawable-hdpi/ic_hourglass_top_white.png diff --git a/app/src/main/res/drawable-hdpi/ic_replay_white_24dp_png.png b/app/src/main/res/drawable-hdpi/ic_replay_white.png similarity index 100% rename from app/src/main/res/drawable-hdpi/ic_replay_white_24dp_png.png rename to app/src/main/res/drawable-hdpi/ic_replay_white.png diff --git a/app/src/main/res/drawable-mdpi/ic_close_white_24dp_png.png b/app/src/main/res/drawable-mdpi/ic_close_white.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_close_white_24dp_png.png rename to app/src/main/res/drawable-mdpi/ic_close_white.png diff --git a/app/src/main/res/drawable-mdpi/ic_hourglass_top_white_24dp_png.png b/app/src/main/res/drawable-mdpi/ic_hourglass_top_white.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_hourglass_top_white_24dp_png.png rename to app/src/main/res/drawable-mdpi/ic_hourglass_top_white.png diff --git a/app/src/main/res/drawable-mdpi/ic_replay_white_24dp_png.png b/app/src/main/res/drawable-mdpi/ic_replay_white.png similarity index 100% rename from app/src/main/res/drawable-mdpi/ic_replay_white_24dp_png.png rename to app/src/main/res/drawable-mdpi/ic_replay_white.png diff --git a/app/src/main/res/drawable/ic_add_white_24dp.xml b/app/src/main/res/drawable-night/ic_add.xml similarity index 100% rename from app/src/main/res/drawable/ic_add_white_24dp.xml rename to app/src/main/res/drawable-night/ic_add.xml diff --git a/app/src/main/res/drawable/ic_add_circle_outline_white_24dp.xml b/app/src/main/res/drawable-night/ic_add_circle_outline.xml similarity index 100% rename from app/src/main/res/drawable/ic_add_circle_outline_white_24dp.xml rename to app/src/main/res/drawable-night/ic_add_circle_outline.xml diff --git a/app/src/main/res/drawable/ic_apps_white_24dp.xml b/app/src/main/res/drawable-night/ic_apps.xml similarity index 100% rename from app/src/main/res/drawable/ic_apps_white_24dp.xml rename to app/src/main/res/drawable-night/ic_apps.xml diff --git a/app/src/main/res/drawable/ic_arrow_back_white_24dp.xml b/app/src/main/res/drawable-night/ic_arrow_back.xml similarity index 100% rename from app/src/main/res/drawable/ic_arrow_back_white_24dp.xml rename to app/src/main/res/drawable-night/ic_arrow_back.xml diff --git a/app/src/main/res/drawable/ic_asterisk_white_24dp.xml b/app/src/main/res/drawable-night/ic_asterisk.xml similarity index 100% rename from app/src/main/res/drawable/ic_asterisk_white_24dp.xml rename to app/src/main/res/drawable-night/ic_asterisk.xml diff --git a/app/src/main/res/drawable/ic_attach_money_white_24dp.xml b/app/src/main/res/drawable-night/ic_attach_money.xml similarity index 100% rename from app/src/main/res/drawable/ic_attach_money_white_24dp.xml rename to app/src/main/res/drawable-night/ic_attach_money.xml diff --git a/app/src/main/res/drawable/ic_backup_white_24dp.xml b/app/src/main/res/drawable-night/ic_backup.xml similarity index 100% rename from app/src/main/res/drawable/ic_backup_white_24dp.xml rename to app/src/main/res/drawable-night/ic_backup.xml diff --git a/app/src/main/res/drawable/ic_bookmark_white_24dp.xml b/app/src/main/res/drawable-night/ic_bookmark.xml similarity index 100% rename from app/src/main/res/drawable/ic_bookmark_white_24dp.xml rename to app/src/main/res/drawable-night/ic_bookmark.xml diff --git a/app/src/main/res/drawable/ic_bug_report_white_24dp.xml b/app/src/main/res/drawable-night/ic_bug_report.xml similarity index 100% rename from app/src/main/res/drawable/ic_bug_report_white_24dp.xml rename to app/src/main/res/drawable-night/ic_bug_report.xml diff --git a/app/src/main/res/drawable/ic_cast_white_24dp.xml b/app/src/main/res/drawable-night/ic_cast.xml similarity index 100% rename from app/src/main/res/drawable/ic_cast_white_24dp.xml rename to app/src/main/res/drawable-night/ic_cast.xml diff --git a/app/src/main/res/drawable/ic_child_care_white_24dp.xml b/app/src/main/res/drawable-night/ic_child_care.xml similarity index 100% rename from app/src/main/res/drawable/ic_child_care_white_24dp.xml rename to app/src/main/res/drawable-night/ic_child_care.xml diff --git a/app/src/main/res/drawable/ic_close_white_24dp.xml b/app/src/main/res/drawable-night/ic_close.xml similarity index 100% rename from app/src/main/res/drawable/ic_close_white_24dp.xml rename to app/src/main/res/drawable-night/ic_close.xml diff --git a/app/src/main/res/drawable/ic_cloud_download_white_24dp.xml b/app/src/main/res/drawable-night/ic_cloud_download.xml similarity index 100% rename from app/src/main/res/drawable/ic_cloud_download_white_24dp.xml rename to app/src/main/res/drawable-night/ic_cloud_download.xml diff --git a/app/src/main/res/drawable/ic_computer_white_24dp.xml b/app/src/main/res/drawable-night/ic_computer.xml similarity index 100% rename from app/src/main/res/drawable/ic_computer_white_24dp.xml rename to app/src/main/res/drawable-night/ic_computer.xml diff --git a/app/src/main/res/drawable/ic_crop_portrait_white_24dp.xml b/app/src/main/res/drawable-night/ic_crop_portrait.xml similarity index 100% rename from app/src/main/res/drawable/ic_crop_portrait_white_24dp.xml rename to app/src/main/res/drawable-night/ic_crop_portrait.xml diff --git a/app/src/main/res/drawable/ic_delete_white_24dp.xml b/app/src/main/res/drawable-night/ic_delete.xml similarity index 100% rename from app/src/main/res/drawable/ic_delete_white_24dp.xml rename to app/src/main/res/drawable-night/ic_delete.xml diff --git a/app/src/main/res/drawable/ic_directions_bike_white_24dp.xml b/app/src/main/res/drawable-night/ic_directions_bike.xml similarity index 100% rename from app/src/main/res/drawable/ic_directions_bike_white_24dp.xml rename to app/src/main/res/drawable-night/ic_directions_bike.xml diff --git a/app/src/main/res/drawable/ic_directions_car_white_24dp.xml b/app/src/main/res/drawable-night/ic_directions_car.xml similarity index 100% rename from app/src/main/res/drawable/ic_directions_car_white_24dp.xml rename to app/src/main/res/drawable-night/ic_directions_car.xml diff --git a/app/src/main/res/drawable/ic_done_white_24dp.xml b/app/src/main/res/drawable-night/ic_done.xml similarity index 100% rename from app/src/main/res/drawable/ic_done_white_24dp.xml rename to app/src/main/res/drawable-night/ic_done.xml diff --git a/app/src/main/res/drawable/ic_drag_handle_white_24dp.xml b/app/src/main/res/drawable-night/ic_drag_handle.xml similarity index 100% rename from app/src/main/res/drawable/ic_drag_handle_white_24dp.xml rename to app/src/main/res/drawable-night/ic_drag_handle.xml diff --git a/app/src/main/res/drawable/ic_edit_white_24dp.xml b/app/src/main/res/drawable-night/ic_edit.xml similarity index 100% rename from app/src/main/res/drawable/ic_edit_white_24dp.xml rename to app/src/main/res/drawable-night/ic_edit.xml diff --git a/app/src/main/res/drawable/ic_expand_less_white_24dp.xml b/app/src/main/res/drawable-night/ic_expand_less.xml similarity index 100% rename from app/src/main/res/drawable/ic_expand_less_white_24dp.xml rename to app/src/main/res/drawable-night/ic_expand_less.xml diff --git a/app/src/main/res/drawable/ic_expand_more_white_24dp.xml b/app/src/main/res/drawable-night/ic_expand_more.xml similarity index 100% rename from app/src/main/res/drawable/ic_expand_more_white_24dp.xml rename to app/src/main/res/drawable-night/ic_expand_more.xml diff --git a/app/src/main/res/drawable/ic_explore_white_24dp.xml b/app/src/main/res/drawable-night/ic_explore.xml similarity index 100% rename from app/src/main/res/drawable/ic_explore_white_24dp.xml rename to app/src/main/res/drawable-night/ic_explore.xml diff --git a/app/src/main/res/drawable/ic_fastfood_white_24dp.xml b/app/src/main/res/drawable-night/ic_fastfood.xml similarity index 100% rename from app/src/main/res/drawable/ic_fastfood_white_24dp.xml rename to app/src/main/res/drawable-night/ic_fastfood.xml diff --git a/app/src/main/res/drawable/ic_favorite_white_24dp.xml b/app/src/main/res/drawable-night/ic_favorite.xml similarity index 100% rename from app/src/main/res/drawable/ic_favorite_white_24dp.xml rename to app/src/main/res/drawable-night/ic_favorite.xml diff --git a/app/src/main/res/drawable/ic_file_download_white_24dp.xml b/app/src/main/res/drawable-night/ic_file_download.xml similarity index 100% rename from app/src/main/res/drawable/ic_file_download_white_24dp.xml rename to app/src/main/res/drawable-night/ic_file_download.xml diff --git a/app/src/main/res/drawable/ic_filter_list_white_24dp.xml b/app/src/main/res/drawable-night/ic_filter_list.xml similarity index 100% rename from app/src/main/res/drawable/ic_filter_list_white_24dp.xml rename to app/src/main/res/drawable-night/ic_filter_list.xml diff --git a/app/src/main/res/drawable/ic_fitness_center_white_24dp.xml b/app/src/main/res/drawable-night/ic_fitness_center.xml similarity index 100% rename from app/src/main/res/drawable/ic_fitness_center_white_24dp.xml rename to app/src/main/res/drawable-night/ic_fitness_center.xml diff --git a/app/src/main/res/drawable/ic_headset_white_24dp.xml b/app/src/main/res/drawable-night/ic_headset.xml similarity index 100% rename from app/src/main/res/drawable/ic_headset_white_24dp.xml rename to app/src/main/res/drawable-night/ic_headset.xml diff --git a/app/src/main/res/drawable/ic_help_white_24dp.xml b/app/src/main/res/drawable-night/ic_help.xml similarity index 100% rename from app/src/main/res/drawable/ic_help_white_24dp.xml rename to app/src/main/res/drawable-night/ic_help.xml diff --git a/app/src/main/res/drawable/ic_history_white_24dp.xml b/app/src/main/res/drawable-night/ic_history.xml similarity index 100% rename from app/src/main/res/drawable/ic_history_white_24dp.xml rename to app/src/main/res/drawable-night/ic_history.xml diff --git a/app/src/main/res/drawable/ic_home_white_24dp.xml b/app/src/main/res/drawable-night/ic_home.xml similarity index 100% rename from app/src/main/res/drawable/ic_home_white_24dp.xml rename to app/src/main/res/drawable-night/ic_home.xml diff --git a/app/src/main/res/drawable/ic_import_export_white_24dp.xml b/app/src/main/res/drawable-night/ic_import_export.xml similarity index 100% rename from app/src/main/res/drawable/ic_import_export_white_24dp.xml rename to app/src/main/res/drawable-night/ic_import_export.xml diff --git a/app/src/main/res/drawable/ic_info_outline_white_24dp.xml b/app/src/main/res/drawable-night/ic_info_outline.xml similarity index 100% rename from app/src/main/res/drawable/ic_info_outline_white_24dp.xml rename to app/src/main/res/drawable-night/ic_info_outline.xml diff --git a/app/src/main/res/drawable/ic_insert_emoticon_white_24dp.xml b/app/src/main/res/drawable-night/ic_insert_emoticon.xml similarity index 100% rename from app/src/main/res/drawable/ic_insert_emoticon_white_24dp.xml rename to app/src/main/res/drawable-night/ic_insert_emoticon.xml diff --git a/app/src/main/res/drawable/ic_language_white_24dp.xml b/app/src/main/res/drawable-night/ic_language.xml similarity index 100% rename from app/src/main/res/drawable/ic_language_white_24dp.xml rename to app/src/main/res/drawable-night/ic_language.xml diff --git a/app/src/main/res/drawable/ic_list_white_24dp.xml b/app/src/main/res/drawable-night/ic_list.xml similarity index 100% rename from app/src/main/res/drawable/ic_list_white_24dp.xml rename to app/src/main/res/drawable-night/ic_list.xml diff --git a/app/src/main/res/drawable/ic_live_tv_white_24dp.xml b/app/src/main/res/drawable-night/ic_live_tv.xml similarity index 100% rename from app/src/main/res/drawable/ic_live_tv_white_24dp.xml rename to app/src/main/res/drawable-night/ic_live_tv.xml diff --git a/app/src/main/res/drawable/ic_megaphone_white_24dp.xml b/app/src/main/res/drawable-night/ic_megaphone.xml similarity index 100% rename from app/src/main/res/drawable/ic_megaphone_white_24dp.xml rename to app/src/main/res/drawable-night/ic_megaphone.xml diff --git a/app/src/main/res/drawable/ic_mic_white_24dp.xml b/app/src/main/res/drawable-night/ic_mic.xml similarity index 100% rename from app/src/main/res/drawable/ic_mic_white_24dp.xml rename to app/src/main/res/drawable-night/ic_mic.xml diff --git a/app/src/main/res/drawable/ic_more_vert_white_24dp.xml b/app/src/main/res/drawable-night/ic_more_vert.xml similarity index 100% rename from app/src/main/res/drawable/ic_more_vert_white_24dp.xml rename to app/src/main/res/drawable-night/ic_more_vert.xml diff --git a/app/src/main/res/drawable/ic_motorcycle_white_24dp.xml b/app/src/main/res/drawable-night/ic_motorcycle.xml similarity index 100% rename from app/src/main/res/drawable/ic_motorcycle_white_24dp.xml rename to app/src/main/res/drawable-night/ic_motorcycle.xml diff --git a/app/src/main/res/drawable/ic_movie_white_24dp.xml b/app/src/main/res/drawable-night/ic_movie.xml similarity index 100% rename from app/src/main/res/drawable/ic_movie_white_24dp.xml rename to app/src/main/res/drawable-night/ic_movie.xml diff --git a/app/src/main/res/drawable/ic_music_note_white_24dp.xml b/app/src/main/res/drawable-night/ic_music_note.xml similarity index 100% rename from app/src/main/res/drawable/ic_music_note_white_24dp.xml rename to app/src/main/res/drawable-night/ic_music_note.xml diff --git a/app/src/main/res/drawable/ic_palette_white_24dp.xml b/app/src/main/res/drawable-night/ic_palette.xml similarity index 100% rename from app/src/main/res/drawable/ic_palette_white_24dp.xml rename to app/src/main/res/drawable-night/ic_palette.xml diff --git a/app/src/main/res/drawable/ic_pause_white_24dp.xml b/app/src/main/res/drawable-night/ic_pause.xml similarity index 100% rename from app/src/main/res/drawable/ic_pause_white_24dp.xml rename to app/src/main/res/drawable-night/ic_pause.xml diff --git a/app/src/main/res/drawable/ic_people_white_24dp.xml b/app/src/main/res/drawable-night/ic_people.xml similarity index 100% rename from app/src/main/res/drawable/ic_people_white_24dp.xml rename to app/src/main/res/drawable-night/ic_people.xml diff --git a/app/src/main/res/drawable/ic_person_white_24dp.xml b/app/src/main/res/drawable-night/ic_person.xml similarity index 100% rename from app/src/main/res/drawable/ic_person_white_24dp.xml rename to app/src/main/res/drawable-night/ic_person.xml diff --git a/app/src/main/res/drawable/ic_pets_white_24dp.xml b/app/src/main/res/drawable-night/ic_pets.xml similarity index 100% rename from app/src/main/res/drawable/ic_pets_white_24dp.xml rename to app/src/main/res/drawable-night/ic_pets.xml diff --git a/app/src/main/res/drawable/ic_picture_in_picture_white_24dp.xml b/app/src/main/res/drawable-night/ic_picture_in_picture.xml similarity index 100% rename from app/src/main/res/drawable/ic_picture_in_picture_white_24dp.xml rename to app/src/main/res/drawable-night/ic_picture_in_picture.xml diff --git a/app/src/main/res/drawable/ic_play_arrow_white_24dp.xml b/app/src/main/res/drawable-night/ic_play_arrow.xml similarity index 100% rename from app/src/main/res/drawable/ic_play_arrow_white_24dp.xml rename to app/src/main/res/drawable-night/ic_play_arrow.xml diff --git a/app/src/main/res/drawable/ic_playlist_add_white_24dp.xml b/app/src/main/res/drawable-night/ic_playlist_add.xml similarity index 100% rename from app/src/main/res/drawable/ic_playlist_add_white_24dp.xml rename to app/src/main/res/drawable-night/ic_playlist_add.xml diff --git a/app/src/main/res/drawable/ic_playlist_add_check_white_24dp.xml b/app/src/main/res/drawable-night/ic_playlist_add_check.xml similarity index 100% rename from app/src/main/res/drawable/ic_playlist_add_check_white_24dp.xml rename to app/src/main/res/drawable-night/ic_playlist_add_check.xml diff --git a/app/src/main/res/drawable/ic_public_white_24dp.xml b/app/src/main/res/drawable-night/ic_public.xml similarity index 100% rename from app/src/main/res/drawable/ic_public_white_24dp.xml rename to app/src/main/res/drawable-night/ic_public.xml diff --git a/app/src/main/res/drawable/ic_radio_white_24dp.xml b/app/src/main/res/drawable-night/ic_radio.xml similarity index 100% rename from app/src/main/res/drawable/ic_radio_white_24dp.xml rename to app/src/main/res/drawable-night/ic_radio.xml diff --git a/app/src/main/res/drawable/ic_refresh_white_24dp.xml b/app/src/main/res/drawable-night/ic_refresh.xml similarity index 100% rename from app/src/main/res/drawable/ic_refresh_white_24dp.xml rename to app/src/main/res/drawable-night/ic_refresh.xml diff --git a/app/src/main/res/drawable/ic_restaurant_white_24dp.xml b/app/src/main/res/drawable-night/ic_restaurant.xml similarity index 100% rename from app/src/main/res/drawable/ic_restaurant_white_24dp.xml rename to app/src/main/res/drawable-night/ic_restaurant.xml diff --git a/app/src/main/res/drawable/ic_rss_feed_white_24dp.xml b/app/src/main/res/drawable-night/ic_rss_feed.xml similarity index 100% rename from app/src/main/res/drawable/ic_rss_feed_white_24dp.xml rename to app/src/main/res/drawable-night/ic_rss_feed.xml diff --git a/app/src/main/res/drawable/ic_save_white_24dp.xml b/app/src/main/res/drawable-night/ic_save.xml similarity index 100% rename from app/src/main/res/drawable/ic_save_white_24dp.xml rename to app/src/main/res/drawable-night/ic_save.xml diff --git a/app/src/main/res/drawable/ic_school_white_24dp.xml b/app/src/main/res/drawable-night/ic_school.xml similarity index 100% rename from app/src/main/res/drawable/ic_school_white_24dp.xml rename to app/src/main/res/drawable-night/ic_school.xml diff --git a/app/src/main/res/drawable/ic_search_white_24dp.xml b/app/src/main/res/drawable-night/ic_search.xml similarity index 100% rename from app/src/main/res/drawable/ic_search_white_24dp.xml rename to app/src/main/res/drawable-night/ic_search.xml diff --git a/app/src/main/res/drawable/ic_search_add_white_24dp.xml b/app/src/main/res/drawable-night/ic_search_add.xml similarity index 100% rename from app/src/main/res/drawable/ic_search_add_white_24dp.xml rename to app/src/main/res/drawable-night/ic_search_add.xml diff --git a/app/src/main/res/drawable/ic_settings_white_24dp.xml b/app/src/main/res/drawable-night/ic_settings.xml similarity index 100% rename from app/src/main/res/drawable/ic_settings_white_24dp.xml rename to app/src/main/res/drawable-night/ic_settings.xml diff --git a/app/src/main/res/drawable/ic_settings_backup_restore_white_24dp.xml b/app/src/main/res/drawable-night/ic_settings_backup_restore.xml similarity index 100% rename from app/src/main/res/drawable/ic_settings_backup_restore_white_24dp.xml rename to app/src/main/res/drawable-night/ic_settings_backup_restore.xml diff --git a/app/src/main/res/drawable/ic_share_white_24dp.xml b/app/src/main/res/drawable-night/ic_share.xml similarity index 100% rename from app/src/main/res/drawable/ic_share_white_24dp.xml rename to app/src/main/res/drawable-night/ic_share.xml diff --git a/app/src/main/res/drawable/ic_shopping_cart_white_24dp.xml b/app/src/main/res/drawable-night/ic_shopping_cart.xml similarity index 100% rename from app/src/main/res/drawable/ic_shopping_cart_white_24dp.xml rename to app/src/main/res/drawable-night/ic_shopping_cart.xml diff --git a/app/src/main/res/drawable/ic_sort_white_24dp.xml b/app/src/main/res/drawable-night/ic_sort.xml similarity index 100% rename from app/src/main/res/drawable/ic_sort_white_24dp.xml rename to app/src/main/res/drawable-night/ic_sort.xml diff --git a/app/src/main/res/drawable/ic_stars_white_24dp.xml b/app/src/main/res/drawable-night/ic_stars.xml similarity index 100% rename from app/src/main/res/drawable/ic_stars_white_24dp.xml rename to app/src/main/res/drawable-night/ic_stars.xml diff --git a/app/src/main/res/drawable/ic_telescope_white_24dp.xml b/app/src/main/res/drawable-night/ic_telescope.xml similarity index 100% rename from app/src/main/res/drawable/ic_telescope_white_24dp.xml rename to app/src/main/res/drawable-night/ic_telescope.xml diff --git a/app/src/main/res/drawable/ic_thumb_down_white_24dp.xml b/app/src/main/res/drawable-night/ic_thumb_down.xml similarity index 100% rename from app/src/main/res/drawable/ic_thumb_down_white_24dp.xml rename to app/src/main/res/drawable-night/ic_thumb_down.xml diff --git a/app/src/main/res/drawable/ic_thumb_up_white_24dp.xml b/app/src/main/res/drawable-night/ic_thumb_up.xml similarity index 100% rename from app/src/main/res/drawable/ic_thumb_up_white_24dp.xml rename to app/src/main/res/drawable-night/ic_thumb_up.xml diff --git a/app/src/main/res/drawable/ic_trending_up_white_24dp.xml b/app/src/main/res/drawable-night/ic_trending_up.xml similarity index 100% rename from app/src/main/res/drawable/ic_trending_up_white_24dp.xml rename to app/src/main/res/drawable-night/ic_trending_up.xml diff --git a/app/src/main/res/drawable/ic_tv_white_24dp.xml b/app/src/main/res/drawable-night/ic_tv.xml similarity index 100% rename from app/src/main/res/drawable/ic_tv_white_24dp.xml rename to app/src/main/res/drawable-night/ic_tv.xml diff --git a/app/src/main/res/drawable/ic_videogame_asset_white_24dp.xml b/app/src/main/res/drawable-night/ic_videogame_asset.xml similarity index 100% rename from app/src/main/res/drawable/ic_videogame_asset_white_24dp.xml rename to app/src/main/res/drawable-night/ic_videogame_asset.xml diff --git a/app/src/main/res/drawable/ic_volume_off_white_24dp.xml b/app/src/main/res/drawable-night/ic_volume_off.xml similarity index 100% rename from app/src/main/res/drawable/ic_volume_off_white_24dp.xml rename to app/src/main/res/drawable-night/ic_volume_off.xml diff --git a/app/src/main/res/drawable/ic_volume_up_white_24dp.xml b/app/src/main/res/drawable-night/ic_volume_up.xml similarity index 100% rename from app/src/main/res/drawable/ic_volume_up_white_24dp.xml rename to app/src/main/res/drawable-night/ic_volume_up.xml diff --git a/app/src/main/res/drawable/ic_watch_later_white_24dp.xml b/app/src/main/res/drawable-night/ic_watch_later.xml similarity index 100% rename from app/src/main/res/drawable/ic_watch_later_white_24dp.xml rename to app/src/main/res/drawable-night/ic_watch_later.xml diff --git a/app/src/main/res/drawable/ic_wb_sunny_white_24dp.xml b/app/src/main/res/drawable-night/ic_wb_sunny.xml similarity index 100% rename from app/src/main/res/drawable/ic_wb_sunny_white_24dp.xml rename to app/src/main/res/drawable-night/ic_wb_sunny.xml diff --git a/app/src/main/res/drawable/ic_whatshot_white_24dp.xml b/app/src/main/res/drawable-night/ic_whatshot.xml similarity index 100% rename from app/src/main/res/drawable/ic_whatshot_white_24dp.xml rename to app/src/main/res/drawable-night/ic_whatshot.xml diff --git a/app/src/main/res/drawable/ic_work_white_24dp.xml b/app/src/main/res/drawable-night/ic_work.xml similarity index 100% rename from app/src/main/res/drawable/ic_work_white_24dp.xml rename to app/src/main/res/drawable-night/ic_work.xml diff --git a/app/src/main/res/drawable-xhdpi/ic_close_white_24dp_png.png b/app/src/main/res/drawable-xhdpi/ic_close_white.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_close_white_24dp_png.png rename to app/src/main/res/drawable-xhdpi/ic_close_white.png diff --git a/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white_24dp_png.png b/app/src/main/res/drawable-xhdpi/ic_hourglass_top_white.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_hourglass_top_white_24dp_png.png rename to app/src/main/res/drawable-xhdpi/ic_hourglass_top_white.png diff --git a/app/src/main/res/drawable-xhdpi/ic_replay_white_24dp_png.png b/app/src/main/res/drawable-xhdpi/ic_replay_white.png similarity index 100% rename from app/src/main/res/drawable-xhdpi/ic_replay_white_24dp_png.png rename to app/src/main/res/drawable-xhdpi/ic_replay_white.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_close_white_24dp_png.png b/app/src/main/res/drawable-xxhdpi/ic_close_white.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_close_white_24dp_png.png rename to app/src/main/res/drawable-xxhdpi/ic_close_white.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white_24dp_png.png b/app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white_24dp_png.png rename to app/src/main/res/drawable-xxhdpi/ic_hourglass_top_white.png diff --git a/app/src/main/res/drawable-xxhdpi/ic_replay_white_24dp_png.png b/app/src/main/res/drawable-xxhdpi/ic_replay_white.png similarity index 100% rename from app/src/main/res/drawable-xxhdpi/ic_replay_white_24dp_png.png rename to app/src/main/res/drawable-xxhdpi/ic_replay_white.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp_png.png b/app/src/main/res/drawable-xxxhdpi/ic_close_white.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_close_white_24dp_png.png rename to app/src/main/res/drawable-xxxhdpi/ic_close_white.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white_24dp_png.png b/app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white_24dp_png.png rename to app/src/main/res/drawable-xxxhdpi/ic_hourglass_top_white.png diff --git a/app/src/main/res/drawable-xxxhdpi/ic_replay_white_24dp_png.png b/app/src/main/res/drawable-xxxhdpi/ic_replay_white.png similarity index 100% rename from app/src/main/res/drawable-xxxhdpi/ic_replay_white_24dp_png.png rename to app/src/main/res/drawable-xxxhdpi/ic_replay_white.png diff --git a/app/src/main/res/drawable/ic_add_black_24dp.xml b/app/src/main/res/drawable/ic_add.xml similarity index 100% rename from app/src/main/res/drawable/ic_add_black_24dp.xml rename to app/src/main/res/drawable/ic_add.xml diff --git a/app/src/main/res/drawable/ic_add_circle_outline_black_24dp.xml b/app/src/main/res/drawable/ic_add_circle_outline.xml similarity index 100% rename from app/src/main/res/drawable/ic_add_circle_outline_black_24dp.xml rename to app/src/main/res/drawable/ic_add_circle_outline.xml diff --git a/app/src/main/res/drawable/ic_apps_black_24dp.xml b/app/src/main/res/drawable/ic_apps.xml similarity index 100% rename from app/src/main/res/drawable/ic_apps_black_24dp.xml rename to app/src/main/res/drawable/ic_apps.xml diff --git a/app/src/main/res/drawable/ic_arrow_back_black_24dp.xml b/app/src/main/res/drawable/ic_arrow_back.xml similarity index 100% rename from app/src/main/res/drawable/ic_arrow_back_black_24dp.xml rename to app/src/main/res/drawable/ic_arrow_back.xml diff --git a/app/src/main/res/drawable/ic_arrow_drop_down_white_24dp.xml b/app/src/main/res/drawable/ic_arrow_drop_down.xml similarity index 100% rename from app/src/main/res/drawable/ic_arrow_drop_down_white_24dp.xml rename to app/src/main/res/drawable/ic_arrow_drop_down.xml diff --git a/app/src/main/res/drawable/ic_arrow_drop_up_white_24dp.xml b/app/src/main/res/drawable/ic_arrow_drop_up.xml similarity index 100% rename from app/src/main/res/drawable/ic_arrow_drop_up_white_24dp.xml rename to app/src/main/res/drawable/ic_arrow_drop_up.xml diff --git a/app/src/main/res/drawable/ic_art_track_white_24dp.xml b/app/src/main/res/drawable/ic_art_track.xml similarity index 100% rename from app/src/main/res/drawable/ic_art_track_white_24dp.xml rename to app/src/main/res/drawable/ic_art_track.xml diff --git a/app/src/main/res/drawable/ic_asterisk_black_24dp.xml b/app/src/main/res/drawable/ic_asterisk.xml similarity index 100% rename from app/src/main/res/drawable/ic_asterisk_black_24dp.xml rename to app/src/main/res/drawable/ic_asterisk.xml diff --git a/app/src/main/res/drawable/ic_attach_money_black_24dp.xml b/app/src/main/res/drawable/ic_attach_money.xml similarity index 100% rename from app/src/main/res/drawable/ic_attach_money_black_24dp.xml rename to app/src/main/res/drawable/ic_attach_money.xml diff --git a/app/src/main/res/drawable/ic_backup_black_24dp.xml b/app/src/main/res/drawable/ic_backup.xml similarity index 100% rename from app/src/main/res/drawable/ic_backup_black_24dp.xml rename to app/src/main/res/drawable/ic_backup.xml diff --git a/app/src/main/res/drawable/ic_bookmark_black_24dp.xml b/app/src/main/res/drawable/ic_bookmark.xml similarity index 100% rename from app/src/main/res/drawable/ic_bookmark_black_24dp.xml rename to app/src/main/res/drawable/ic_bookmark.xml diff --git a/app/src/main/res/drawable/ic_brightness_high_white_24dp.xml b/app/src/main/res/drawable/ic_brightness_high.xml similarity index 100% rename from app/src/main/res/drawable/ic_brightness_high_white_24dp.xml rename to app/src/main/res/drawable/ic_brightness_high.xml diff --git a/app/src/main/res/drawable/ic_brightness_low_white_24dp.xml b/app/src/main/res/drawable/ic_brightness_low.xml similarity index 100% rename from app/src/main/res/drawable/ic_brightness_low_white_24dp.xml rename to app/src/main/res/drawable/ic_brightness_low.xml diff --git a/app/src/main/res/drawable/ic_brightness_medium_white_24dp.xml b/app/src/main/res/drawable/ic_brightness_medium.xml similarity index 100% rename from app/src/main/res/drawable/ic_brightness_medium_white_24dp.xml rename to app/src/main/res/drawable/ic_brightness_medium.xml diff --git a/app/src/main/res/drawable/ic_bug_report_black_24dp.xml b/app/src/main/res/drawable/ic_bug_report.xml similarity index 100% rename from app/src/main/res/drawable/ic_bug_report_black_24dp.xml rename to app/src/main/res/drawable/ic_bug_report.xml diff --git a/app/src/main/res/drawable/ic_cast_black_24dp.xml b/app/src/main/res/drawable/ic_cast.xml similarity index 100% rename from app/src/main/res/drawable/ic_cast_black_24dp.xml rename to app/src/main/res/drawable/ic_cast.xml diff --git a/app/src/main/res/drawable/ic_child_care_black_24dp.xml b/app/src/main/res/drawable/ic_child_care.xml similarity index 100% rename from app/src/main/res/drawable/ic_child_care_black_24dp.xml rename to app/src/main/res/drawable/ic_child_care.xml diff --git a/app/src/main/res/drawable/ic_close_black_24dp.xml b/app/src/main/res/drawable/ic_close.xml similarity index 100% rename from app/src/main/res/drawable/ic_close_black_24dp.xml rename to app/src/main/res/drawable/ic_close.xml diff --git a/app/src/main/res/drawable/ic_cloud_download_black_24dp.xml b/app/src/main/res/drawable/ic_cloud_download.xml similarity index 100% rename from app/src/main/res/drawable/ic_cloud_download_black_24dp.xml rename to app/src/main/res/drawable/ic_cloud_download.xml diff --git a/app/src/main/res/drawable/ic_comment_white_24dp.xml b/app/src/main/res/drawable/ic_comment.xml similarity index 100% rename from app/src/main/res/drawable/ic_comment_white_24dp.xml rename to app/src/main/res/drawable/ic_comment.xml diff --git a/app/src/main/res/drawable/ic_computer_black_24dp.xml b/app/src/main/res/drawable/ic_computer.xml similarity index 100% rename from app/src/main/res/drawable/ic_computer_black_24dp.xml rename to app/src/main/res/drawable/ic_computer.xml diff --git a/app/src/main/res/drawable/ic_crop_portrait_black_24dp.xml b/app/src/main/res/drawable/ic_crop_portrait.xml similarity index 100% rename from app/src/main/res/drawable/ic_crop_portrait_black_24dp.xml rename to app/src/main/res/drawable/ic_crop_portrait.xml diff --git a/app/src/main/res/drawable/ic_delete_black_24dp.xml b/app/src/main/res/drawable/ic_delete.xml similarity index 100% rename from app/src/main/res/drawable/ic_delete_black_24dp.xml rename to app/src/main/res/drawable/ic_delete.xml diff --git a/app/src/main/res/drawable/ic_description_white_24dp.xml b/app/src/main/res/drawable/ic_description.xml similarity index 100% rename from app/src/main/res/drawable/ic_description_white_24dp.xml rename to app/src/main/res/drawable/ic_description.xml diff --git a/app/src/main/res/drawable/ic_directions_bike_black_24dp.xml b/app/src/main/res/drawable/ic_directions_bike.xml similarity index 100% rename from app/src/main/res/drawable/ic_directions_bike_black_24dp.xml rename to app/src/main/res/drawable/ic_directions_bike.xml diff --git a/app/src/main/res/drawable/ic_directions_car_black_24dp.xml b/app/src/main/res/drawable/ic_directions_car.xml similarity index 100% rename from app/src/main/res/drawable/ic_directions_car_black_24dp.xml rename to app/src/main/res/drawable/ic_directions_car.xml diff --git a/app/src/main/res/drawable/ic_done_black_24dp.xml b/app/src/main/res/drawable/ic_done.xml similarity index 100% rename from app/src/main/res/drawable/ic_done_black_24dp.xml rename to app/src/main/res/drawable/ic_done.xml diff --git a/app/src/main/res/drawable/ic_drag_handle_black_24dp.xml b/app/src/main/res/drawable/ic_drag_handle.xml similarity index 100% rename from app/src/main/res/drawable/ic_drag_handle_black_24dp.xml rename to app/src/main/res/drawable/ic_drag_handle.xml diff --git a/app/src/main/res/drawable/ic_edit_black_24dp.xml b/app/src/main/res/drawable/ic_edit.xml similarity index 100% rename from app/src/main/res/drawable/ic_edit_black_24dp.xml rename to app/src/main/res/drawable/ic_edit.xml diff --git a/app/src/main/res/drawable/ic_expand_less_black_24dp.xml b/app/src/main/res/drawable/ic_expand_less.xml similarity index 100% rename from app/src/main/res/drawable/ic_expand_less_black_24dp.xml rename to app/src/main/res/drawable/ic_expand_less.xml diff --git a/app/src/main/res/drawable/ic_expand_more_black_24dp.xml b/app/src/main/res/drawable/ic_expand_more.xml similarity index 100% rename from app/src/main/res/drawable/ic_expand_more_black_24dp.xml rename to app/src/main/res/drawable/ic_expand_more.xml diff --git a/app/src/main/res/drawable/ic_explore_black_24dp.xml b/app/src/main/res/drawable/ic_explore.xml similarity index 100% rename from app/src/main/res/drawable/ic_explore_black_24dp.xml rename to app/src/main/res/drawable/ic_explore.xml diff --git a/app/src/main/res/drawable/ic_fast_forward_white_24dp.xml b/app/src/main/res/drawable/ic_fast_forward.xml similarity index 100% rename from app/src/main/res/drawable/ic_fast_forward_white_24dp.xml rename to app/src/main/res/drawable/ic_fast_forward.xml diff --git a/app/src/main/res/drawable/ic_fast_rewind_white_24dp.xml b/app/src/main/res/drawable/ic_fast_rewind.xml similarity index 100% rename from app/src/main/res/drawable/ic_fast_rewind_white_24dp.xml rename to app/src/main/res/drawable/ic_fast_rewind.xml diff --git a/app/src/main/res/drawable/ic_fastfood_black_24dp.xml b/app/src/main/res/drawable/ic_fastfood.xml similarity index 100% rename from app/src/main/res/drawable/ic_fastfood_black_24dp.xml rename to app/src/main/res/drawable/ic_fastfood.xml diff --git a/app/src/main/res/drawable/ic_favorite_black_24dp.xml b/app/src/main/res/drawable/ic_favorite.xml similarity index 100% rename from app/src/main/res/drawable/ic_favorite_black_24dp.xml rename to app/src/main/res/drawable/ic_favorite.xml diff --git a/app/src/main/res/drawable/ic_file_download_black_24dp.xml b/app/src/main/res/drawable/ic_file_download.xml similarity index 100% rename from app/src/main/res/drawable/ic_file_download_black_24dp.xml rename to app/src/main/res/drawable/ic_file_download.xml diff --git a/app/src/main/res/drawable/ic_filter_list_black_24dp.xml b/app/src/main/res/drawable/ic_filter_list.xml similarity index 100% rename from app/src/main/res/drawable/ic_filter_list_black_24dp.xml rename to app/src/main/res/drawable/ic_filter_list.xml diff --git a/app/src/main/res/drawable/ic_fitness_center_black_24dp.xml b/app/src/main/res/drawable/ic_fitness_center.xml similarity index 100% rename from app/src/main/res/drawable/ic_fitness_center_black_24dp.xml rename to app/src/main/res/drawable/ic_fitness_center.xml diff --git a/app/src/main/res/drawable/ic_format_list_numbered_white_24.xml b/app/src/main/res/drawable/ic_format_list_numbered.xml similarity index 100% rename from app/src/main/res/drawable/ic_format_list_numbered_white_24.xml rename to app/src/main/res/drawable/ic_format_list_numbered.xml diff --git a/app/src/main/res/drawable/ic_fullscreen_white_24dp.xml b/app/src/main/res/drawable/ic_fullscreen.xml similarity index 100% rename from app/src/main/res/drawable/ic_fullscreen_white_24dp.xml rename to app/src/main/res/drawable/ic_fullscreen.xml diff --git a/app/src/main/res/drawable/ic_fullscreen_exit_white_24dp.xml b/app/src/main/res/drawable/ic_fullscreen_exit.xml similarity index 100% rename from app/src/main/res/drawable/ic_fullscreen_exit_white_24dp.xml rename to app/src/main/res/drawable/ic_fullscreen_exit.xml diff --git a/app/src/main/res/drawable/ic_headset_black_24dp.xml b/app/src/main/res/drawable/ic_headset.xml similarity index 100% rename from app/src/main/res/drawable/ic_headset_black_24dp.xml rename to app/src/main/res/drawable/ic_headset.xml diff --git a/app/src/main/res/drawable/ic_help_black_24dp.xml b/app/src/main/res/drawable/ic_help.xml similarity index 100% rename from app/src/main/res/drawable/ic_help_black_24dp.xml rename to app/src/main/res/drawable/ic_help.xml diff --git a/app/src/main/res/drawable/ic_history_black_24dp.xml b/app/src/main/res/drawable/ic_history.xml similarity index 100% rename from app/src/main/res/drawable/ic_history_black_24dp.xml rename to app/src/main/res/drawable/ic_history.xml diff --git a/app/src/main/res/drawable/ic_home_black_24dp.xml b/app/src/main/res/drawable/ic_home.xml similarity index 100% rename from app/src/main/res/drawable/ic_home_black_24dp.xml rename to app/src/main/res/drawable/ic_home.xml diff --git a/app/src/main/res/drawable/ic_hourglass_top_white_24dp.xml b/app/src/main/res/drawable/ic_hourglass_top.xml similarity index 100% rename from app/src/main/res/drawable/ic_hourglass_top_white_24dp.xml rename to app/src/main/res/drawable/ic_hourglass_top.xml diff --git a/app/src/main/res/drawable/ic_import_export_black_24dp.xml b/app/src/main/res/drawable/ic_import_export.xml similarity index 100% rename from app/src/main/res/drawable/ic_import_export_black_24dp.xml rename to app/src/main/res/drawable/ic_import_export.xml diff --git a/app/src/main/res/drawable/ic_info_outline_black_24dp.xml b/app/src/main/res/drawable/ic_info_outline.xml similarity index 100% rename from app/src/main/res/drawable/ic_info_outline_black_24dp.xml rename to app/src/main/res/drawable/ic_info_outline.xml diff --git a/app/src/main/res/drawable/ic_insert_emoticon_black_24dp.xml b/app/src/main/res/drawable/ic_insert_emoticon.xml similarity index 100% rename from app/src/main/res/drawable/ic_insert_emoticon_black_24dp.xml rename to app/src/main/res/drawable/ic_insert_emoticon.xml diff --git a/app/src/main/res/drawable/ic_language_black_24dp.xml b/app/src/main/res/drawable/ic_language.xml similarity index 100% rename from app/src/main/res/drawable/ic_language_black_24dp.xml rename to app/src/main/res/drawable/ic_language.xml diff --git a/app/src/main/res/drawable/ic_list_black_24dp.xml b/app/src/main/res/drawable/ic_list.xml similarity index 100% rename from app/src/main/res/drawable/ic_list_black_24dp.xml rename to app/src/main/res/drawable/ic_list.xml diff --git a/app/src/main/res/drawable/ic_live_tv_black_24dp.xml b/app/src/main/res/drawable/ic_live_tv.xml similarity index 100% rename from app/src/main/res/drawable/ic_live_tv_black_24dp.xml rename to app/src/main/res/drawable/ic_live_tv.xml diff --git a/app/src/main/res/drawable/ic_megaphone_black_24dp.xml b/app/src/main/res/drawable/ic_megaphone.xml similarity index 100% rename from app/src/main/res/drawable/ic_megaphone_black_24dp.xml rename to app/src/main/res/drawable/ic_megaphone.xml diff --git a/app/src/main/res/drawable/ic_mic_black_24dp.xml b/app/src/main/res/drawable/ic_mic.xml similarity index 100% rename from app/src/main/res/drawable/ic_mic_black_24dp.xml rename to app/src/main/res/drawable/ic_mic.xml diff --git a/app/src/main/res/drawable/ic_more_vert_black_24dp.xml b/app/src/main/res/drawable/ic_more_vert.xml similarity index 100% rename from app/src/main/res/drawable/ic_more_vert_black_24dp.xml rename to app/src/main/res/drawable/ic_more_vert.xml diff --git a/app/src/main/res/drawable/ic_motorcycle_black_24dp.xml b/app/src/main/res/drawable/ic_motorcycle.xml similarity index 100% rename from app/src/main/res/drawable/ic_motorcycle_black_24dp.xml rename to app/src/main/res/drawable/ic_motorcycle.xml diff --git a/app/src/main/res/drawable/ic_movie_black_24dp.xml b/app/src/main/res/drawable/ic_movie.xml similarity index 100% rename from app/src/main/res/drawable/ic_movie_black_24dp.xml rename to app/src/main/res/drawable/ic_movie.xml diff --git a/app/src/main/res/drawable/ic_music_note_black_24dp.xml b/app/src/main/res/drawable/ic_music_note.xml similarity index 100% rename from app/src/main/res/drawable/ic_music_note_black_24dp.xml rename to app/src/main/res/drawable/ic_music_note.xml diff --git a/app/src/main/res/drawable/ic_next_white_24dp.xml b/app/src/main/res/drawable/ic_next.xml similarity index 100% rename from app/src/main/res/drawable/ic_next_white_24dp.xml rename to app/src/main/res/drawable/ic_next.xml diff --git a/app/src/main/res/drawable/ic_palette_black_24dp.xml b/app/src/main/res/drawable/ic_palette.xml similarity index 100% rename from app/src/main/res/drawable/ic_palette_black_24dp.xml rename to app/src/main/res/drawable/ic_palette.xml diff --git a/app/src/main/res/drawable/ic_pause_black_24dp.xml b/app/src/main/res/drawable/ic_pause.xml similarity index 100% rename from app/src/main/res/drawable/ic_pause_black_24dp.xml rename to app/src/main/res/drawable/ic_pause.xml diff --git a/app/src/main/res/drawable/ic_people_black_24dp.xml b/app/src/main/res/drawable/ic_people.xml similarity index 100% rename from app/src/main/res/drawable/ic_people_black_24dp.xml rename to app/src/main/res/drawable/ic_people.xml diff --git a/app/src/main/res/drawable/ic_person_black_24dp.xml b/app/src/main/res/drawable/ic_person.xml similarity index 100% rename from app/src/main/res/drawable/ic_person_black_24dp.xml rename to app/src/main/res/drawable/ic_person.xml diff --git a/app/src/main/res/drawable/ic_pets_black_24dp.xml b/app/src/main/res/drawable/ic_pets.xml similarity index 100% rename from app/src/main/res/drawable/ic_pets_black_24dp.xml rename to app/src/main/res/drawable/ic_pets.xml diff --git a/app/src/main/res/drawable/ic_picture_in_picture_black_24dp.xml b/app/src/main/res/drawable/ic_picture_in_picture.xml similarity index 100% rename from app/src/main/res/drawable/ic_picture_in_picture_black_24dp.xml rename to app/src/main/res/drawable/ic_picture_in_picture.xml diff --git a/app/src/main/res/drawable/ic_play_arrow_black_24dp.xml b/app/src/main/res/drawable/ic_play_arrow.xml similarity index 100% rename from app/src/main/res/drawable/ic_play_arrow_black_24dp.xml rename to app/src/main/res/drawable/ic_play_arrow.xml diff --git a/app/src/main/res/drawable/ic_playlist_add_black_24dp.xml b/app/src/main/res/drawable/ic_playlist_add.xml similarity index 100% rename from app/src/main/res/drawable/ic_playlist_add_black_24dp.xml rename to app/src/main/res/drawable/ic_playlist_add.xml diff --git a/app/src/main/res/drawable/ic_playlist_add_check_black_24dp.xml b/app/src/main/res/drawable/ic_playlist_add_check.xml similarity index 100% rename from app/src/main/res/drawable/ic_playlist_add_check_black_24dp.xml rename to app/src/main/res/drawable/ic_playlist_add_check.xml diff --git a/app/src/main/res/drawable/ic_playlist_play_white_24dp.xml b/app/src/main/res/drawable/ic_playlist_play.xml similarity index 100% rename from app/src/main/res/drawable/ic_playlist_play_white_24dp.xml rename to app/src/main/res/drawable/ic_playlist_play.xml diff --git a/app/src/main/res/drawable/ic_previous_white_24dp.xml b/app/src/main/res/drawable/ic_previous.xml similarity index 100% rename from app/src/main/res/drawable/ic_previous_white_24dp.xml rename to app/src/main/res/drawable/ic_previous.xml diff --git a/app/src/main/res/drawable/ic_public_black_24dp.xml b/app/src/main/res/drawable/ic_public.xml similarity index 100% rename from app/src/main/res/drawable/ic_public_black_24dp.xml rename to app/src/main/res/drawable/ic_public.xml diff --git a/app/src/main/res/drawable/ic_radio_black_24dp.xml b/app/src/main/res/drawable/ic_radio.xml similarity index 100% rename from app/src/main/res/drawable/ic_radio_black_24dp.xml rename to app/src/main/res/drawable/ic_radio.xml diff --git a/app/src/main/res/drawable/ic_refresh_black_24dp.xml b/app/src/main/res/drawable/ic_refresh.xml similarity index 100% rename from app/src/main/res/drawable/ic_refresh_black_24dp.xml rename to app/src/main/res/drawable/ic_refresh.xml diff --git a/app/src/main/res/drawable/ic_repeat_white_24dp.xml b/app/src/main/res/drawable/ic_repeat.xml similarity index 100% rename from app/src/main/res/drawable/ic_repeat_white_24dp.xml rename to app/src/main/res/drawable/ic_repeat.xml diff --git a/app/src/main/res/drawable/ic_replay_white_24dp.xml b/app/src/main/res/drawable/ic_replay.xml similarity index 100% rename from app/src/main/res/drawable/ic_replay_white_24dp.xml rename to app/src/main/res/drawable/ic_replay.xml diff --git a/app/src/main/res/drawable/ic_restaurant_black_24dp.xml b/app/src/main/res/drawable/ic_restaurant.xml similarity index 100% rename from app/src/main/res/drawable/ic_restaurant_black_24dp.xml rename to app/src/main/res/drawable/ic_restaurant.xml diff --git a/app/src/main/res/drawable/ic_rss_feed_black_24dp.xml b/app/src/main/res/drawable/ic_rss_feed.xml similarity index 100% rename from app/src/main/res/drawable/ic_rss_feed_black_24dp.xml rename to app/src/main/res/drawable/ic_rss_feed.xml diff --git a/app/src/main/res/drawable/ic_save_black_24dp.xml b/app/src/main/res/drawable/ic_save.xml similarity index 100% rename from app/src/main/res/drawable/ic_save_black_24dp.xml rename to app/src/main/res/drawable/ic_save.xml diff --git a/app/src/main/res/drawable/ic_school_black_24dp.xml b/app/src/main/res/drawable/ic_school.xml similarity index 100% rename from app/src/main/res/drawable/ic_school_black_24dp.xml rename to app/src/main/res/drawable/ic_school.xml diff --git a/app/src/main/res/drawable/ic_screen_rotation_white_24dp.xml b/app/src/main/res/drawable/ic_screen_rotation.xml similarity index 100% rename from app/src/main/res/drawable/ic_screen_rotation_white_24dp.xml rename to app/src/main/res/drawable/ic_screen_rotation.xml diff --git a/app/src/main/res/drawable/ic_search_black_24dp.xml b/app/src/main/res/drawable/ic_search.xml similarity index 100% rename from app/src/main/res/drawable/ic_search_black_24dp.xml rename to app/src/main/res/drawable/ic_search.xml diff --git a/app/src/main/res/drawable/ic_search_add_black_24dp.xml b/app/src/main/res/drawable/ic_search_add.xml similarity index 100% rename from app/src/main/res/drawable/ic_search_add_black_24dp.xml rename to app/src/main/res/drawable/ic_search_add.xml diff --git a/app/src/main/res/drawable/ic_settings_black_24dp.xml b/app/src/main/res/drawable/ic_settings.xml similarity index 100% rename from app/src/main/res/drawable/ic_settings_black_24dp.xml rename to app/src/main/res/drawable/ic_settings.xml diff --git a/app/src/main/res/drawable/ic_settings_backup_restore_black_24dp.xml b/app/src/main/res/drawable/ic_settings_backup_restore.xml similarity index 100% rename from app/src/main/res/drawable/ic_settings_backup_restore_black_24dp.xml rename to app/src/main/res/drawable/ic_settings_backup_restore.xml diff --git a/app/src/main/res/drawable/ic_share_black_24dp.xml b/app/src/main/res/drawable/ic_share.xml similarity index 100% rename from app/src/main/res/drawable/ic_share_black_24dp.xml rename to app/src/main/res/drawable/ic_share.xml diff --git a/app/src/main/res/drawable/ic_shopping_cart_black_24dp.xml b/app/src/main/res/drawable/ic_shopping_cart.xml similarity index 100% rename from app/src/main/res/drawable/ic_shopping_cart_black_24dp.xml rename to app/src/main/res/drawable/ic_shopping_cart.xml diff --git a/app/src/main/res/drawable/ic_shuffle_white_24dp.xml b/app/src/main/res/drawable/ic_shuffle.xml similarity index 100% rename from app/src/main/res/drawable/ic_shuffle_white_24dp.xml rename to app/src/main/res/drawable/ic_shuffle.xml diff --git a/app/src/main/res/drawable/ic_sort_black_24dp.xml b/app/src/main/res/drawable/ic_sort.xml similarity index 100% rename from app/src/main/res/drawable/ic_sort_black_24dp.xml rename to app/src/main/res/drawable/ic_sort.xml diff --git a/app/src/main/res/drawable/ic_stars_black_24dp.xml b/app/src/main/res/drawable/ic_stars.xml similarity index 100% rename from app/src/main/res/drawable/ic_stars_black_24dp.xml rename to app/src/main/res/drawable/ic_stars.xml diff --git a/app/src/main/res/drawable/ic_subtitles_white_24dp.xml b/app/src/main/res/drawable/ic_subtitles.xml similarity index 100% rename from app/src/main/res/drawable/ic_subtitles_white_24dp.xml rename to app/src/main/res/drawable/ic_subtitles.xml diff --git a/app/src/main/res/drawable/ic_telescope_black_24dp.xml b/app/src/main/res/drawable/ic_telescope.xml similarity index 100% rename from app/src/main/res/drawable/ic_telescope_black_24dp.xml rename to app/src/main/res/drawable/ic_telescope.xml diff --git a/app/src/main/res/drawable/ic_thumb_down_black_24dp.xml b/app/src/main/res/drawable/ic_thumb_down.xml similarity index 100% rename from app/src/main/res/drawable/ic_thumb_down_black_24dp.xml rename to app/src/main/res/drawable/ic_thumb_down.xml diff --git a/app/src/main/res/drawable/ic_thumb_up_black_24dp.xml b/app/src/main/res/drawable/ic_thumb_up.xml similarity index 100% rename from app/src/main/res/drawable/ic_thumb_up_black_24dp.xml rename to app/src/main/res/drawable/ic_thumb_up.xml diff --git a/app/src/main/res/drawable/ic_trending_up_black_24dp.xml b/app/src/main/res/drawable/ic_trending_up.xml similarity index 100% rename from app/src/main/res/drawable/ic_trending_up_black_24dp.xml rename to app/src/main/res/drawable/ic_trending_up.xml diff --git a/app/src/main/res/drawable/ic_tv_black_24dp.xml b/app/src/main/res/drawable/ic_tv.xml similarity index 100% rename from app/src/main/res/drawable/ic_tv_black_24dp.xml rename to app/src/main/res/drawable/ic_tv.xml diff --git a/app/src/main/res/drawable/ic_videogame_asset_black_24dp.xml b/app/src/main/res/drawable/ic_videogame_asset.xml similarity index 100% rename from app/src/main/res/drawable/ic_videogame_asset_black_24dp.xml rename to app/src/main/res/drawable/ic_videogame_asset.xml diff --git a/app/src/main/res/drawable/ic_volume_down_white_24dp.xml b/app/src/main/res/drawable/ic_volume_down.xml similarity index 100% rename from app/src/main/res/drawable/ic_volume_down_white_24dp.xml rename to app/src/main/res/drawable/ic_volume_down.xml diff --git a/app/src/main/res/drawable/ic_volume_mute_white_24dp.xml b/app/src/main/res/drawable/ic_volume_mute.xml similarity index 100% rename from app/src/main/res/drawable/ic_volume_mute_white_24dp.xml rename to app/src/main/res/drawable/ic_volume_mute.xml diff --git a/app/src/main/res/drawable/ic_volume_off_black_24dp.xml b/app/src/main/res/drawable/ic_volume_off.xml similarity index 100% rename from app/src/main/res/drawable/ic_volume_off_black_24dp.xml rename to app/src/main/res/drawable/ic_volume_off.xml diff --git a/app/src/main/res/drawable/ic_volume_up_black_24dp.xml b/app/src/main/res/drawable/ic_volume_up.xml similarity index 100% rename from app/src/main/res/drawable/ic_volume_up_black_24dp.xml rename to app/src/main/res/drawable/ic_volume_up.xml diff --git a/app/src/main/res/drawable/ic_watch_later_black_24dp.xml b/app/src/main/res/drawable/ic_watch_later.xml similarity index 100% rename from app/src/main/res/drawable/ic_watch_later_black_24dp.xml rename to app/src/main/res/drawable/ic_watch_later.xml diff --git a/app/src/main/res/drawable/ic_wb_sunny_black_24dp.xml b/app/src/main/res/drawable/ic_wb_sunny.xml similarity index 100% rename from app/src/main/res/drawable/ic_wb_sunny_black_24dp.xml rename to app/src/main/res/drawable/ic_wb_sunny.xml diff --git a/app/src/main/res/drawable/ic_whatshot_black_24dp.xml b/app/src/main/res/drawable/ic_whatshot.xml similarity index 100% rename from app/src/main/res/drawable/ic_whatshot_black_24dp.xml rename to app/src/main/res/drawable/ic_whatshot.xml diff --git a/app/src/main/res/drawable/ic_work_black_24dp.xml b/app/src/main/res/drawable/ic_work.xml similarity index 100% rename from app/src/main/res/drawable/ic_work_black_24dp.xml rename to app/src/main/res/drawable/ic_work.xml diff --git a/app/src/main/res/drawable/white_edit_text_cursor.xml b/app/src/main/res/drawable/white_edit_text_cursor.xml new file mode 100644 index 000000000..1da8092d4 --- /dev/null +++ b/app/src/main/res/drawable/white_edit_text_cursor.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_player_queue_control.xml b/app/src/main/res/layout-land/activity_player_queue_control.xml index 929d55a70..7162bc3ec 100644 --- a/app/src/main/res/layout-land/activity_player_queue_control.xml +++ b/app/src/main/res/layout-land/activity_player_queue_control.xml @@ -138,7 +138,7 @@ android:focusable="true" android:scaleType="fitCenter" android:tint="?attr/colorAccent" - app:srcCompat="@drawable/ic_pause_white_24dp" + app:srcCompat="@drawable/ic_pause" tools:ignore="ContentDescription" /> diff --git a/app/src/main/res/layout-large-land/fragment_video_detail.xml b/app/src/main/res/layout-large-land/fragment_video_detail.xml index b037ca584..02bc169e2 100644 --- a/app/src/main/res/layout-large-land/fragment_video_detail.xml +++ b/app/src/main/res/layout-large-land/fragment_video_detail.xml @@ -199,7 +199,7 @@ android:layout_gravity="top|end" android:layout_marginTop="11dp" android:layout_marginEnd="10dp" - app:srcCompat="@drawable/ic_expand_more_white_24dp" + app:srcCompat="@drawable/ic_expand_more" tools:ignore="ContentDescription" /> @@ -333,7 +333,7 @@ android:text="@string/rss_button_title" android:textSize="12sp" android:theme="@style/RedButton" - app:drawableLeftCompat="@drawable/ic_rss_feed_white_24dp" + app:drawableLeftCompat="@drawable/ic_rss_feed" tools:ignore="RtlHardcoded" android:visibility="gone"/>--> @@ -367,7 +367,7 @@ android:layout_height="@dimen/video_item_detail_like_image_height" android:layout_below="@id/detail_view_count_view" android:contentDescription="@string/detail_likes_img_view_description" - app:srcCompat="?attr/ic_thumb_up" /> + app:srcCompat="@drawable/ic_thumb_up" /> + app:drawableTopCompat="@drawable/ic_playlist_add" /> + app:drawableTopCompat="@drawable/ic_headset" /> + app:drawableTopCompat="@drawable/ic_picture_in_picture" /> + app:drawableTopCompat="@drawable/ic_file_download" /> @@ -529,7 +529,7 @@ android:paddingVertical="@dimen/detail_control_padding" android:text="@string/share" android:textSize="@dimen/detail_control_text_size" - app:drawableTopCompat="?attr/ic_share" /> + app:drawableTopCompat="@drawable/ic_share" /> + app:drawableTopCompat="@drawable/ic_language" /> + app:drawableTopCompat="@drawable/ic_cast" /> @@ -605,6 +605,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom|center" + app:tabIndicatorGravity="top" app:tabIconTint="?attr/colorAccent" app:tabBackground="?attr/windowBackground" app:tabGravity="fill" @@ -705,7 +706,7 @@ android:scaleType="center" android:focusable="true" android:focusedByDefault="true" - app:srcCompat="?attr/ic_play_arrow" + app:srcCompat="@drawable/ic_play_arrow" tools:ignore="ContentDescription,RtlHardcoded" /> diff --git a/app/src/main/res/layout-large-land/player.xml b/app/src/main/res/layout-large-land/player.xml index 07f3ae755..cbb162407 100644 --- a/app/src/main/res/layout-large-land/player.xml +++ b/app/src/main/res/layout-large-land/player.xml @@ -102,7 +102,7 @@ android:padding="@dimen/player_main_buttons_padding" android:scaleType="fitXY" android:visibility="gone" - app:srcCompat="@drawable/ic_close_white_24dp" + app:srcCompat="@drawable/ic_close" tools:ignore="ContentDescription,RtlHardcoded" /> @@ -205,7 +205,7 @@ android:paddingBottom="3dp" android:scaleType="fitCenter" android:visibility="gone" - app:srcCompat="@drawable/ic_format_list_numbered_white_24" + app:srcCompat="@drawable/ic_format_list_numbered" tools:ignore="ContentDescription,RtlHardcoded" tools:visibility="visible" /> @@ -218,7 +218,7 @@ android:focusable="true" android:padding="@dimen/player_main_buttons_padding" android:scaleType="fitXY" - app:srcCompat="@drawable/ic_expand_more_white_24dp" + app:srcCompat="@drawable/ic_expand_more" tools:ignore="ContentDescription,RtlHardcoded" /> @@ -282,7 +282,7 @@ android:focusable="true" android:padding="@dimen/player_main_buttons_padding" android:scaleType="fitXY" - app:srcCompat="@drawable/ic_cast_white_24dp" + app:srcCompat="@drawable/ic_cast" tools:ignore="RtlHardcoded" /> @@ -415,7 +415,7 @@ android:padding="@dimen/player_main_buttons_padding" android:scaleType="fitCenter" android:visibility="gone" - app:srcCompat="@drawable/ic_fullscreen_white_24dp" + app:srcCompat="@drawable/ic_fullscreen" tools:ignore="ContentDescription,RtlHardcoded" tools:visibility="visible" /> @@ -438,7 +438,7 @@ android:clickable="true" android:focusable="true" android:scaleType="fitCenter" - app:srcCompat="@drawable/ic_previous_white_24dp" + app:srcCompat="@drawable/ic_previous" tools:ignore="ContentDescription" /> @@ -449,7 +449,7 @@ android:layout_weight="1" android:background="?attr/selectableItemBackgroundBorderless" android:scaleType="fitCenter" - app:srcCompat="@drawable/ic_pause_white_24dp" + app:srcCompat="@drawable/ic_pause" tools:ignore="ContentDescription" /> @@ -514,7 +514,7 @@ android:focusable="true" android:padding="10dp" android:scaleType="fitXY" - app:srcCompat="?attr/ic_close" /> + app:srcCompat="@drawable/ic_close" /> @@ -580,7 +580,7 @@ android:padding="15dp" android:visibility="gone" tools:ignore="ContentDescription" - tools:src="@drawable/ic_fast_rewind_white_24dp" + tools:src="@drawable/ic_fast_rewind" tools:visibility="visible" /> @@ -629,7 +629,7 @@ android:layout_height="70dp" android:layout_centerInParent="true" tools:ignore="ContentDescription" - tools:src="@drawable/ic_volume_up_white_24dp" /> + tools:src="@drawable/ic_volume_up" /> + tools:src="@drawable/ic_brightness_high" /> + android:layout_height="wrap_content" + app:tabTextColor="@color/modeColor" + app:tabIndicatorColor="@color/modeColor" /> diff --git a/app/src/main/res/layout/activity_player_queue_control.xml b/app/src/main/res/layout/activity_player_queue_control.xml index b063ec9db..b84c5aa3f 100644 --- a/app/src/main/res/layout/activity_player_queue_control.xml +++ b/app/src/main/res/layout/activity_player_queue_control.xml @@ -180,7 +180,7 @@ android:focusable="true" android:scaleType="fitXY" android:tint="?attr/colorAccent" - app:srcCompat="@drawable/ic_repeat_white_24dp" + app:srcCompat="@drawable/ic_repeat" tools:ignore="ContentDescription" /> diff --git a/app/src/main/res/layout/dialog_feed_group_create.xml b/app/src/main/res/layout/dialog_feed_group_create.xml index 91002e006..1dbf8e761 100644 --- a/app/src/main/res/layout/dialog_feed_group_create.xml +++ b/app/src/main/res/layout/dialog_feed_group_create.xml @@ -30,7 +30,7 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" tools:ignore="ContentDescription" - tools:src="?attr/ic_asterisk" /> + tools:src="@drawable/ic_asterisk" /> diff --git a/app/src/main/res/layout/dialog_playlists.xml b/app/src/main/res/layout/dialog_playlists.xml index 77b884f4f..7564296b3 100644 --- a/app/src/main/res/layout/dialog_playlists.xml +++ b/app/src/main/res/layout/dialog_playlists.xml @@ -20,7 +20,7 @@ android:layout_centerVertical="true" android:layout_marginLeft="12dp" android:layout_marginRight="12dp" - app:srcCompat="?attr/ic_playlist_add" + app:srcCompat="@drawable/ic_playlist_add" tools:ignore="ContentDescription,RtlHardcoded" /> diff --git a/app/src/main/res/layout/feed_group_add_new_item.xml b/app/src/main/res/layout/feed_group_add_new_item.xml index 14ee19ad4..882b38870 100644 --- a/app/src/main/res/layout/feed_group_add_new_item.xml +++ b/app/src/main/res/layout/feed_group_add_new_item.xml @@ -24,7 +24,7 @@ android:layout_height="14dp" android:layout_gravity="center" android:scaleType="centerInside" - app:srcCompat="?attr/ic_add" + app:srcCompat="@drawable/ic_add" tools:ignore="ContentDescription" /> + tools:src="@drawable/ic_fastfood" /> + tools:src="@drawable/ic_kiosk_hot" /> \ No newline at end of file diff --git a/app/src/main/res/layout/feed_import_export_group.xml b/app/src/main/res/layout/feed_import_export_group.xml index 33d50f593..4a0b46692 100644 --- a/app/src/main/res/layout/feed_import_export_group.xml +++ b/app/src/main/res/layout/feed_import_export_group.xml @@ -53,7 +53,7 @@ android:layout_width="24dp" android:layout_height="24dp" android:layout_marginRight="16dp" - app:srcCompat="?attr/ic_expand_more" + app:srcCompat="@drawable/ic_expand_more" tools:ignore="ContentDescription,RtlHardcoded" /> diff --git a/app/src/main/res/layout/fragment_choose_tabs.xml b/app/src/main/res/layout/fragment_choose_tabs.xml index b41066226..ac6a0f4e5 100644 --- a/app/src/main/res/layout/fragment_choose_tabs.xml +++ b/app/src/main/res/layout/fragment_choose_tabs.xml @@ -26,6 +26,6 @@ android:focusable="true" app:backgroundTint="?attr/colorPrimary" app:fabSize="auto" - app:srcCompat="?attr/ic_add" /> + app:srcCompat="@drawable/ic_add" /> diff --git a/app/src/main/res/layout/fragment_feed.xml b/app/src/main/res/layout/fragment_feed.xml index b68c29bc6..756f49031 100644 --- a/app/src/main/res/layout/fragment_feed.xml +++ b/app/src/main/res/layout/fragment_feed.xml @@ -57,7 +57,7 @@ android:layout_alignParentEnd="true" android:layout_marginStart="6dp" android:layout_marginEnd="12dp" - app:srcCompat="?attr/ic_refresh" + app:srcCompat="@drawable/ic_refresh" tools:ignore="ContentDescription" /> + app:srcCompat="@drawable/ic_add" /> diff --git a/app/src/main/res/layout/fragment_main.xml b/app/src/main/res/layout/fragment_main.xml index 6087e2b2d..9945e96c1 100644 --- a/app/src/main/res/layout/fragment_main.xml +++ b/app/src/main/res/layout/fragment_main.xml @@ -11,6 +11,8 @@ android:layout_height="wrap_content" android:layout_alignParentTop="true" android:background="?attr/colorPrimary" + app:tabIconTint="@color/modeColor" + app:tabIndicatorColor="@color/modeColor" app:tabGravity="fill" app:tabMinWidth="60dp" /> diff --git a/app/src/main/res/layout/fragment_video_detail.xml b/app/src/main/res/layout/fragment_video_detail.xml index 28d30ebe8..0b10addf4 100644 --- a/app/src/main/res/layout/fragment_video_detail.xml +++ b/app/src/main/res/layout/fragment_video_detail.xml @@ -187,7 +187,7 @@ android:layout_gravity="top|end" android:layout_marginTop="11dp" android:layout_marginEnd="10dp" - app:srcCompat="@drawable/ic_expand_more_white_24dp" + app:srcCompat="@drawable/ic_expand_more" tools:ignore="ContentDescription" /> @@ -321,7 +321,7 @@ android:text="@string/rss_button_title" android:textSize="12sp" android:theme="@style/RedButton" - app:drawableLeftCompat="@drawable/ic_rss_feed_white_24dp" + app:drawableLeftCompat="@drawable/ic_rss_feed" tools:ignore="RtlHardcoded" android:visibility="gone"/>--> @@ -355,7 +355,7 @@ android:layout_height="@dimen/video_item_detail_like_image_height" android:layout_below="@id/detail_view_count_view" android:contentDescription="@string/detail_likes_img_view_description" - app:srcCompat="?attr/ic_thumb_up" /> + app:srcCompat="@drawable/ic_thumb_up" /> + app:drawableTopCompat="@drawable/ic_playlist_add" /> + app:drawableTopCompat="@drawable/ic_headset" /> + app:drawableTopCompat="@drawable/ic_picture_in_picture" /> + app:drawableTopCompat="@drawable/ic_file_download" /> @@ -513,7 +513,7 @@ android:paddingVertical="@dimen/detail_control_padding" android:text="@string/share" android:textSize="@dimen/detail_control_text_size" - app:drawableTopCompat="?attr/ic_share" /> + app:drawableTopCompat="@drawable/ic_share" /> + app:drawableTopCompat="@drawable/ic_language" /> + app:drawableTopCompat="@drawable/ic_cast" /> @@ -589,6 +589,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom|center" + app:tabIndicatorGravity="top" app:tabIconTint="?attr/colorAccent" app:tabBackground="?attr/windowBackground" app:tabGravity="fill" @@ -601,7 +602,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:alpha="0.9" - android:background="?attr/windowBackground"> + android:background="?attr/windowBackground" + android:theme="@style/ContrastTintTheme"> diff --git a/app/src/main/res/layout/header_with_menu_item.xml b/app/src/main/res/layout/header_with_menu_item.xml index 580e8db4d..1a85b5945 100644 --- a/app/src/main/res/layout/header_with_menu_item.xml +++ b/app/src/main/res/layout/header_with_menu_item.xml @@ -28,5 +28,5 @@ android:layout_height="24dp" android:layout_marginStart="16dp" android:background="?attr/selectableItemBackgroundBorderless" - tools:src="?attr/ic_bookmark" /> + tools:src="@drawable/ic_bookmark" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_instance.xml b/app/src/main/res/layout/item_instance.xml index 534dc0ca4..b4ddfa6c1 100644 --- a/app/src/main/res/layout/item_instance.xml +++ b/app/src/main/res/layout/item_instance.xml @@ -76,7 +76,7 @@ android:paddingTop="12dp" android:paddingRight="10dp" android:paddingBottom="12dp" - app:srcCompat="?attr/ic_drag_handle" + app:srcCompat="@drawable/ic_drag_handle" tools:ignore="ContentDescription,RtlHardcoded" /> diff --git a/app/src/main/res/layout/item_search_suggestion.xml b/app/src/main/res/layout/item_search_suggestion.xml index 8d2a226d9..4b1025fea 100644 --- a/app/src/main/res/layout/item_search_suggestion.xml +++ b/app/src/main/res/layout/item_search_suggestion.xml @@ -4,7 +4,8 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:orientation="horizontal"> + android:orientation="horizontal" + android:theme="@style/ContrastTintTheme"> + tools:src="@drawable/ic_history" /> diff --git a/app/src/main/res/layout/list_choose_tabs.xml b/app/src/main/res/layout/list_choose_tabs.xml index a385f64a8..7110895f0 100644 --- a/app/src/main/res/layout/list_choose_tabs.xml +++ b/app/src/main/res/layout/list_choose_tabs.xml @@ -28,7 +28,7 @@ android:layout_centerVertical="true" android:layout_marginLeft="16dp" tools:ignore="ContentDescription,RtlHardcoded" - tools:src="?attr/ic_kiosk_hot" /> + tools:src="@drawable/ic_kiosk_hot" /> diff --git a/app/src/main/res/layout/list_choose_tabs_dialog.xml b/app/src/main/res/layout/list_choose_tabs_dialog.xml index 1fd917d1e..82183e18c 100644 --- a/app/src/main/res/layout/list_choose_tabs_dialog.xml +++ b/app/src/main/res/layout/list_choose_tabs_dialog.xml @@ -14,7 +14,7 @@ android:layout_centerVertical="true" android:layout_marginLeft="?dialogPreferredPadding" tools:ignore="ContentDescription,RtlHardcoded" - tools:src="?attr/ic_kiosk_hot" /> + tools:src="@drawable/ic_kiosk_hot" /> + app:srcCompat="@drawable/ic_thumb_up" /> + app:srcCompat="@drawable/ic_thumb_up" /> diff --git a/app/src/main/res/layout/list_playlist_item.xml b/app/src/main/res/layout/list_playlist_item.xml index 61a6fca82..028a10a2e 100644 --- a/app/src/main/res/layout/list_playlist_item.xml +++ b/app/src/main/res/layout/list_playlist_item.xml @@ -38,7 +38,7 @@ android:textColor="@color/duration_text_color" android:textSize="@dimen/video_item_search_duration_text_size" android:textStyle="bold" - app:drawableTopCompat="@drawable/ic_playlist_play_white_24dp" + app:drawableTopCompat="@drawable/ic_playlist_play" tools:ignore="RtlHardcoded" tools:text="314159" /> diff --git a/app/src/main/res/layout/list_playlist_mini_item.xml b/app/src/main/res/layout/list_playlist_mini_item.xml index f31ef67f2..fcb7b5f3a 100644 --- a/app/src/main/res/layout/list_playlist_mini_item.xml +++ b/app/src/main/res/layout/list_playlist_mini_item.xml @@ -38,7 +38,7 @@ android:textColor="@color/duration_text_color" android:textSize="@dimen/video_item_search_duration_text_size" android:textStyle="bold" - app:drawableTopCompat="@drawable/ic_playlist_play_white_24dp" + app:drawableTopCompat="@drawable/ic_playlist_play" tools:ignore="RtlHardcoded" tools:text="3141" /> diff --git a/app/src/main/res/layout/list_radio_icon_item.xml b/app/src/main/res/layout/list_radio_icon_item.xml index abbd82a5c..46e7419ad 100644 --- a/app/src/main/res/layout/list_radio_icon_item.xml +++ b/app/src/main/res/layout/list_radio_icon_item.xml @@ -13,5 +13,5 @@ android:paddingStart="?attr/listPreferredItemPaddingLeft" android:paddingEnd="?attr/listPreferredItemPaddingRight" android:textColor="?attr/textColorAlertDialogListItem" - tools:drawableLeft="?attr/ic_play_arrow" + tools:drawableLeft="@drawable/ic_play_arrow" tools:text="Lorem ipsum dolor sit amet" /> diff --git a/app/src/main/res/layout/list_stream_playlist_grid_item.xml b/app/src/main/res/layout/list_stream_playlist_grid_item.xml index 75aef9a9e..53b30120a 100644 --- a/app/src/main/res/layout/list_stream_playlist_grid_item.xml +++ b/app/src/main/res/layout/list_stream_playlist_grid_item.xml @@ -50,7 +50,7 @@ android:contentDescription="@string/detail_drag_description" android:paddingLeft="@dimen/video_item_search_image_right_margin" android:scaleType="center" - app:srcCompat="?attr/ic_drag_handle" + app:srcCompat="@drawable/ic_drag_handle" tools:ignore="RtlHardcoded,RtlSymmetry" /> + app:srcCompat="@drawable/ic_more_vert" /> diff --git a/app/src/main/res/layout/mission_item_linear.xml b/app/src/main/res/layout/mission_item_linear.xml index ad3a6aad5..b3fa2be53 100644 --- a/app/src/main/res/layout/mission_item_linear.xml +++ b/app/src/main/res/layout/mission_item_linear.xml @@ -71,7 +71,7 @@ android:layout_marginRight="4dp" android:contentDescription="TODO" android:scaleType="centerInside" - app:srcCompat="@drawable/ic_more_vert_white_24dp" /> + app:srcCompat="@drawable/ic_more_vert" /> diff --git a/app/src/main/res/layout/picker_icon_item.xml b/app/src/main/res/layout/picker_icon_item.xml index f319f8c9a..ec040048d 100644 --- a/app/src/main/res/layout/picker_icon_item.xml +++ b/app/src/main/res/layout/picker_icon_item.xml @@ -11,4 +11,4 @@ android:padding="8dp" android:scaleType="centerInside" tools:ignore="ContentDescription" - tools:src="?attr/ic_rss" /> + tools:src="@drawable/ic_rss_feed" /> diff --git a/app/src/main/res/layout/picker_subscription_item.xml b/app/src/main/res/layout/picker_subscription_item.xml index 62f5b28ec..84c6a9130 100644 --- a/app/src/main/res/layout/picker_subscription_item.xml +++ b/app/src/main/res/layout/picker_subscription_item.xml @@ -52,7 +52,7 @@ android:layout_gravity="top|center_horizontal" android:layout_marginTop="4dp" android:scaleType="centerInside" - app:srcCompat="@drawable/ic_done_white_24dp" + app:srcCompat="@drawable/ic_done" tools:ignore="ContentDescription" /> diff --git a/app/src/main/res/layout/play_queue_item.xml b/app/src/main/res/layout/play_queue_item.xml index 4364aa84d..a5be55c94 100644 --- a/app/src/main/res/layout/play_queue_item.xml +++ b/app/src/main/res/layout/play_queue_item.xml @@ -46,7 +46,7 @@ android:layout_gravity="center_vertical" android:padding="@dimen/video_item_search_image_right_margin" android:scaleType="center" - app:srcCompat="?attr/ic_drag_handle" + app:srcCompat="@drawable/ic_drag_handle" tools:ignore="ContentDescription,RtlHardcoded" /> + android:gravity="center" + android:theme="@style/WhiteTintTheme" > @@ -281,7 +282,7 @@ android:focusable="true" android:padding="@dimen/player_main_buttons_padding" android:scaleType="fitXY" - app:srcCompat="@drawable/ic_cast_white_24dp" + app:srcCompat="@drawable/ic_cast" tools:ignore="RtlHardcoded" /> @@ -412,7 +413,7 @@ android:padding="@dimen/player_main_buttons_padding" android:scaleType="fitCenter" android:visibility="gone" - app:srcCompat="@drawable/ic_fullscreen_white_24dp" + app:srcCompat="@drawable/ic_fullscreen" tools:ignore="ContentDescription,RtlHardcoded" tools:visibility="visible" /> @@ -435,7 +436,7 @@ android:clickable="true" android:focusable="true" android:scaleType="fitCenter" - app:srcCompat="@drawable/ic_previous_white_24dp" + app:srcCompat="@drawable/ic_previous" tools:ignore="ContentDescription" /> @@ -446,7 +447,7 @@ android:layout_weight="1" android:background="?attr/selectableItemBackgroundBorderless" android:scaleType="fitCenter" - app:srcCompat="@drawable/ic_pause_white_24dp" + app:srcCompat="@drawable/ic_pause" tools:ignore="ContentDescription" /> @@ -510,7 +511,7 @@ android:focusable="true" android:padding="10dp" android:scaleType="fitXY" - app:srcCompat="?attr/ic_close" /> + app:srcCompat="@drawable/ic_close" /> @@ -576,7 +577,7 @@ android:padding="15dp" android:visibility="gone" tools:ignore="ContentDescription" - tools:src="@drawable/ic_fast_rewind_white_24dp" + tools:src="@drawable/ic_fast_rewind" tools:visibility="visible" /> @@ -625,7 +626,7 @@ android:layout_height="70dp" android:layout_centerInParent="true" tools:ignore="ContentDescription" - tools:src="@drawable/ic_volume_up_white_24dp" /> + tools:src="@drawable/ic_volume_up" /> + tools:src="@drawable/ic_brightness" /> + app:srcCompat="@drawable/ic_close" /> diff --git a/app/src/main/res/layout/playlist_control.xml b/app/src/main/res/layout/playlist_control.xml index 82220ea5b..0b58f3715 100644 --- a/app/src/main/res/layout/playlist_control.xml +++ b/app/src/main/res/layout/playlist_control.xml @@ -27,8 +27,8 @@ android:text="@string/controls_background_title" android:textColor="?attr/colorAccent" android:textSize="@dimen/channel_rss_title_size" - app:drawableLeftCompat="?attr/ic_headset" - app:drawableStartCompat="?attr/ic_headset" /> + app:drawableLeftCompat="@drawable/ic_headset" + app:drawableStartCompat="@drawable/ic_headset" /> + app:drawableLeftCompat="@drawable/ic_picture_in_picture" + app:drawableStartCompat="@drawable/ic_picture_in_picture" /> diff --git a/app/src/main/res/layout/settings_notification_action.xml b/app/src/main/res/layout/settings_notification_action.xml index 6bbb22116..72b7cd984 100644 --- a/app/src/main/res/layout/settings_notification_action.xml +++ b/app/src/main/res/layout/settings_notification_action.xml @@ -19,7 +19,7 @@ app:layout_constraintTop_toTopOf="parent" app:tint="?android:textColorPrimary" tools:ignore="ContentDescription" - tools:src="@drawable/ic_previous_white_24dp" /> + tools:src="@drawable/ic_previous" /> diff --git a/app/src/main/res/menu/download_menu.xml b/app/src/main/res/menu/download_menu.xml index f28d3d074..c12a7e768 100644 --- a/app/src/main/res/menu/download_menu.xml +++ b/app/src/main/res/menu/download_menu.xml @@ -5,28 +5,28 @@ diff --git a/app/src/main/res/menu/error_menu.xml b/app/src/main/res/menu/error_menu.xml index d1dd8888c..1984c0490 100644 --- a/app/src/main/res/menu/error_menu.xml +++ b/app/src/main/res/menu/error_menu.xml @@ -4,7 +4,7 @@ diff --git a/app/src/main/res/menu/main_fragment_menu.xml b/app/src/main/res/menu/main_fragment_menu.xml index 0cc6ec1b0..fbe3b4e09 100644 --- a/app/src/main/res/menu/main_fragment_menu.xml +++ b/app/src/main/res/menu/main_fragment_menu.xml @@ -4,7 +4,7 @@ diff --git a/app/src/main/res/menu/menu_channel.xml b/app/src/main/res/menu/menu_channel.xml index 7e19d6d42..af9020626 100644 --- a/app/src/main/res/menu/menu_channel.xml +++ b/app/src/main/res/menu/menu_channel.xml @@ -5,7 +5,7 @@ diff --git a/app/src/main/res/menu/menu_feed_fragment.xml b/app/src/main/res/menu/menu_feed_fragment.xml index d96b382d0..31a521914 100644 --- a/app/src/main/res/menu/menu_feed_fragment.xml +++ b/app/src/main/res/menu/menu_feed_fragment.xml @@ -4,7 +4,7 @@ diff --git a/app/src/main/res/menu/menu_feed_group_dialog.xml b/app/src/main/res/menu/menu_feed_group_dialog.xml index 237faf41a..38473e4d5 100644 --- a/app/src/main/res/menu/menu_feed_group_dialog.xml +++ b/app/src/main/res/menu/menu_feed_group_dialog.xml @@ -5,7 +5,7 @@ diff --git a/app/src/main/res/menu/menu_play_queue.xml b/app/src/main/res/menu/menu_play_queue.xml index 7eff18077..0efadcb66 100644 --- a/app/src/main/res/menu/menu_play_queue.xml +++ b/app/src/main/res/menu/menu_play_queue.xml @@ -5,7 +5,7 @@ @@ -20,7 +20,7 @@ diff --git a/app/src/main/res/menu/menu_playlist.xml b/app/src/main/res/menu/menu_playlist.xml index 9796dce68..8e3ea1559 100644 --- a/app/src/main/res/menu/menu_playlist.xml +++ b/app/src/main/res/menu/menu_playlist.xml @@ -5,13 +5,13 @@ diff --git a/app/src/main/res/menu/menu_search.xml b/app/src/main/res/menu/menu_search.xml index f9310dc07..74f093452 100644 --- a/app/src/main/res/menu/menu_search.xml +++ b/app/src/main/res/menu/menu_search.xml @@ -4,7 +4,7 @@

diff --git a/app/src/main/res/menu/video_detail_menu.xml b/app/src/main/res/menu/video_detail_menu.xml index 574fbc737..738ac8686 100644 --- a/app/src/main/res/menu/video_detail_menu.xml +++ b/app/src/main/res/menu/video_detail_menu.xml @@ -4,13 +4,13 @@ diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml new file mode 100644 index 000000000..7fec31302 --- /dev/null +++ b/app/src/main/res/values-night/colors.xml @@ -0,0 +1,5 @@ + + + @color/black + @color/white + \ No newline at end of file diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml index 42fc7660e..65a11cc09 100644 --- a/app/src/main/res/values/attrs.xml +++ b/app/src/main/res/values/attrs.xml @@ -1,88 +1,7 @@ - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index b23a0a50d..2b86c2955 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -1,5 +1,9 @@ + + @color/white + @color/black + #CD201F diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 6093ca8b8..b005800bc 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -24,88 +24,6 @@ @color/light_background_color @color/light_background_color - @drawable/ic_thumb_up_black_24dp - @drawable/ic_thumb_down_black_24dp - @drawable/ic_info_outline_black_24dp - @drawable/ic_bug_report_black_24dp - @drawable/ic_headset_black_24dp - @drawable/ic_file_download_black_24dp - @drawable/ic_share_black_24dp - @drawable/ic_cast_black_24dp - @drawable/ic_rss_feed_black_24dp - @drawable/ic_search_black_24dp - @drawable/ic_close_black_24dp - @drawable/ic_filter_list_black_24dp - @drawable/ic_picture_in_picture_black_24dp - @drawable/ic_expand_more_black_24dp - @drawable/ic_expand_less_black_24dp - @drawable/ic_volume_off_black_24dp - @drawable/ic_volume_up_black_24dp - @drawable/ic_palette_black_24dp - @drawable/ic_language_black_24dp - @drawable/ic_history_black_24dp - @drawable/ic_drag_handle_black_24dp - @drawable/ic_search_add_black_24dp - @drawable/ic_more_vert_black_24dp - @drawable/ic_play_arrow_black_24dp - @drawable/ic_pause_black_24dp - @drawable/ic_settings_black_24dp - @drawable/ic_whatshot_black_24dp - @drawable/ic_home_black_24dp - @drawable/ic_add_circle_outline_black_24dp - @drawable/ic_tv_black_24dp - @drawable/ic_live_tv_black_24dp - @drawable/ic_bookmark_black_24dp - @drawable/ic_playlist_add_black_24dp - @drawable/ic_playlist_add_check_black_24dp - @drawable/ic_import_export_black_24dp - @drawable/ic_save_black_24dp - @drawable/ic_backup_black_24dp - @drawable/ic_add_black_24dp - @drawable/ic_settings_backup_restore_black_24dp - @drawable/ic_crop_portrait_black_24dp - @drawable/ic_list_black_24dp - @drawable/ic_apps_black_24dp - @drawable/ic_delete_black_24dp - @drawable/ic_cloud_download_black_24dp - @drawable/ic_done_black_24dp - @drawable/ic_refresh_black_24dp - @drawable/ic_computer_black_24dp - @drawable/ic_videogame_asset_black_24dp - @drawable/ic_music_note_black_24dp - @drawable/ic_stars_black_24dp - @drawable/ic_directions_bike_black_24dp - @drawable/ic_attach_money_black_24dp - @drawable/ic_person_black_24dp - @drawable/ic_people_black_24dp - @drawable/ic_favorite_black_24dp - @drawable/ic_child_care_black_24dp - @drawable/ic_fastfood_black_24dp - @drawable/ic_directions_car_black_24dp - @drawable/ic_motorcycle_black_24dp - @drawable/ic_trending_up_black_24dp - @drawable/ic_school_black_24dp - @drawable/ic_asterisk_black_24dp - @drawable/ic_insert_emoticon_black_24dp - @drawable/ic_edit_black_24dp - @drawable/ic_explore_black_24dp - @drawable/ic_fitness_center_black_24dp - @drawable/ic_restaurant_black_24dp - @drawable/ic_mic_black_24dp - @drawable/ic_radio_black_24dp - @drawable/ic_shopping_cart_black_24dp - @drawable/ic_watch_later_black_24dp - @drawable/ic_work_black_24dp - @drawable/ic_movie_black_24dp - @drawable/ic_pets_black_24dp - @drawable/ic_public_black_24dp - @drawable/ic_wb_sunny_black_24dp - @drawable/ic_telescope_black_24dp - @drawable/ic_megaphone_black_24dp - @drawable/ic_sort_black_24dp - @drawable/ic_help_black_24dp - @drawable/ic_arrow_back_black_24dp - @color/light_separator_color @color/light_contrast_background_color @drawable/selector_checked_light @@ -134,88 +52,6 @@ @color/dark_background_color @color/dark_background_color - @drawable/ic_thumb_up_white_24dp - @drawable/ic_thumb_down_white_24dp - @drawable/ic_headset_white_24dp - @drawable/ic_info_outline_white_24dp - @drawable/ic_bug_report_white_24dp - @drawable/ic_file_download_white_24dp - @drawable/ic_share_white_24dp - @drawable/ic_cast_white_24dp - @drawable/ic_rss_feed_white_24dp - @drawable/ic_search_white_24dp - @drawable/ic_close_white_24dp - @drawable/ic_filter_list_white_24dp - @drawable/ic_picture_in_picture_white_24dp - @drawable/ic_expand_more_white_24dp - @drawable/ic_expand_less_white_24dp - @drawable/ic_volume_off_white_24dp - @drawable/ic_volume_up_white_24dp - @drawable/ic_palette_white_24dp - @drawable/ic_language_white_24dp - @drawable/ic_history_white_24dp - @drawable/ic_drag_handle_white_24dp - @drawable/ic_search_add_white_24dp - @drawable/ic_more_vert_white_24dp - @drawable/ic_play_arrow_white_24dp - @drawable/ic_settings_white_24dp - @drawable/ic_whatshot_white_24dp - @drawable/ic_home_white_24dp - @drawable/ic_add_circle_outline_white_24dp - @drawable/ic_tv_white_24dp - @drawable/ic_live_tv_white_24dp - @drawable/ic_bookmark_white_24dp - @drawable/ic_playlist_add_white_24dp - @drawable/ic_playlist_add_check_white_24dp - @drawable/ic_import_export_white_24dp - @drawable/ic_save_white_24dp - @drawable/ic_backup_white_24dp - @drawable/ic_add_white_24dp - @drawable/ic_settings_backup_restore_white_24dp - @drawable/ic_crop_portrait_white_24dp - @drawable/ic_list_white_24dp - @drawable/ic_apps_white_24dp - @drawable/ic_delete_white_24dp - @drawable/ic_pause_white_24dp - @drawable/ic_cloud_download_white_24dp - @drawable/ic_done_white_24dp - @drawable/ic_refresh_white_24dp - @drawable/ic_computer_white_24dp - @drawable/ic_videogame_asset_white_24dp - @drawable/ic_music_note_white_24dp - @drawable/ic_stars_white_24dp - @drawable/ic_directions_bike_white_24dp - @drawable/ic_attach_money_white_24dp - @drawable/ic_person_white_24dp - @drawable/ic_people_white_24dp - @drawable/ic_favorite_white_24dp - @drawable/ic_child_care_white_24dp - @drawable/ic_fastfood_white_24dp - @drawable/ic_directions_car_white_24dp - @drawable/ic_motorcycle_white_24dp - @drawable/ic_trending_up_white_24dp - @drawable/ic_school_white_24dp - @drawable/ic_asterisk_white_24dp - @drawable/ic_insert_emoticon_white_24dp - @drawable/ic_edit_white_24dp - @drawable/ic_explore_white_24dp - @drawable/ic_fitness_center_white_24dp - @drawable/ic_restaurant_white_24dp - @drawable/ic_mic_white_24dp - @drawable/ic_radio_white_24dp - @drawable/ic_shopping_cart_white_24dp - @drawable/ic_watch_later_white_24dp - @drawable/ic_work_white_24dp - @drawable/ic_movie_white_24dp - @drawable/ic_pets_white_24dp - @drawable/ic_public_white_24dp - @drawable/ic_wb_sunny_white_24dp - @drawable/ic_telescope_white_24dp - @drawable/ic_megaphone_white_24dp - @drawable/ic_sort_white_24dp - @drawable/ic_help_white_24dp - @drawable/ic_arrow_back_white_24dp - @color/dark_separator_color @color/dark_contrast_background_color @drawable/selector_checked_dark @@ -343,6 +179,16 @@ @android:color/white @android:color/white @style/ThemeOverlay.AppCompat.DayNight.ActionBar + @color/white + @color/white + @drawable/white_edit_text_cursor + + + + diff --git a/app/src/release/res/xml/main_settings.xml b/app/src/release/res/xml/main_settings.xml index abb94f4ef..5a4f9b37f 100644 --- a/app/src/release/res/xml/main_settings.xml +++ b/app/src/release/res/xml/main_settings.xml @@ -6,43 +6,43 @@ From 38eb8e40ea248eea8fe3c8030b2e880471564aae Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Sat, 27 Mar 2021 17:51:02 +0300 Subject: [PATCH 10/91] Colored Navigation Bar in Splash Screen --- app/src/main/res/values-v21/styles.xml | 6 ++++++ app/src/main/res/values/styles.xml | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml index 725796fd3..5b3858cf6 100644 --- a/app/src/main/res/values-v21/styles.xml +++ b/app/src/main/res/values-v21/styles.xml @@ -1,6 +1,12 @@ + + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index b005800bc..d8df7a30e 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,6 +1,10 @@ - + + - - - - - diff --git a/app/src/main/res/values/styles_misc.xml b/app/src/main/res/values/styles_misc.xml index c88fca7f9..cad7ce904 100644 --- a/app/src/main/res/values/styles_misc.xml +++ b/app/src/main/res/values/styles_misc.xml @@ -41,4 +41,28 @@ @color/dark_youtube_dark_color @color/dark_settings_accent_color + + + + + + + + + + From 6a9cae3de8cb11e60072d5aa376de00343e7c222 Mon Sep 17 00:00:00 2001 From: Mohammed Anas <6daf084a-8eaf-40fb-86c7-8500077c3b69@anonaddy.me> Date: Sun, 28 Mar 2021 16:32:40 +0000 Subject: [PATCH 25/91] Add channel details option to long-press menu (#5851) Add dialog item to open channel details Use `List` as type of `entries` Put channel details item last Only show channel option when channel is present --- .../newpipe/fragments/list/BaseListFragment.java | 12 +++++++++--- .../org/schabi/newpipe/util/StreamDialogEntry.java | 6 ++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java index 3c37bd128..38fdbccab 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/BaseListFragment.java @@ -45,6 +45,7 @@ import java.util.Arrays; import java.util.List; import java.util.Queue; +import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty; import static org.schabi.newpipe.ktx.ViewUtils.animate; import static org.schabi.newpipe.ktx.ViewUtils.animateHideRecyclerViewAllowingScrolling; @@ -124,8 +125,8 @@ public abstract class BaseListFragment extends BaseStateFragment /** * If the default implementation of {@link StateSaver.WriteRead} should be used. * - * @see StateSaver * @param useDefaultStateSaving Whether the default implementation should be used + * @see StateSaver */ public void setUseDefaultStateSaving(final boolean useDefaultStateSaving) { this.useDefaultStateSaving = useDefaultStateSaving; @@ -350,7 +351,7 @@ public abstract class BaseListFragment extends BaseStateFragment return; } - final ArrayList entries = new ArrayList<>(); + final List entries = new ArrayList<>(); if (PlayerHolder.getType() != null) { entries.add(StreamDialogEntry.enqueue); @@ -361,7 +362,7 @@ public abstract class BaseListFragment extends BaseStateFragment StreamDialogEntry.append_playlist, StreamDialogEntry.share )); - } else { + } else { entries.addAll(Arrays.asList( StreamDialogEntry.start_here_on_background, StreamDialogEntry.start_here_on_popup, @@ -372,6 +373,11 @@ public abstract class BaseListFragment extends BaseStateFragment if (KoreUtil.shouldShowPlayWithKodi(context, item.getServiceId())) { entries.add(StreamDialogEntry.play_with_kodi); } + + if (!isNullOrEmpty(item.getUploaderUrl())) { + entries.add(StreamDialogEntry.show_channel_details); + } + StreamDialogEntry.setEnabledEntries(entries); new InfoItemDialog(activity, item, StreamDialogEntry.getCommands(context), diff --git a/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java b/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java index 73fee32f7..2d59febc2 100644 --- a/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java +++ b/app/src/main/java/org/schabi/newpipe/util/StreamDialogEntry.java @@ -24,6 +24,12 @@ public enum StreamDialogEntry { // enum values with DEFAULT actions // ////////////////////////////////////// + show_channel_details(R.string.show_channel_details, (fragment, item) -> + // For some reason `getParentFragmentManager()` doesn't work, but this does. + NavigationHelper.openChannelFragment(fragment.getActivity().getSupportFragmentManager(), + item.getServiceId(), item.getUploaderUrl(), item.getUploaderName()) + ), + /** * Enqueues the stream automatically to the current PlayerType.
*
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b372bee7f..f6c899919 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -466,6 +466,7 @@ Details Audio Settings Hold to enqueue + Show channel details Enqueue Enqueued Start playing here From 67942a906ab422511d3343579e58548d5c529379 Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Sun, 28 Mar 2021 19:36:07 +0300 Subject: [PATCH 26/91] Fix colors in PeerTube Settings Fragment --- .../settings/PeertubeInstanceListFragment.java | 12 ++++++++++-- app/src/main/res/layout/fragment_instance_list.xml | 1 + app/src/main/res/values/styles_misc.xml | 3 +++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java b/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java index 74585e12b..e4da3b14d 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java @@ -3,6 +3,9 @@ package org.schabi.newpipe.settings; import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; +import android.graphics.Color; +import android.graphics.PorterDuff; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.text.InputType; import android.view.LayoutInflater; @@ -145,8 +148,13 @@ public class PeertubeInstanceListFragment extends Fragment { final MenuItem restoreItem = menu .add(Menu.NONE, MENU_ITEM_RESTORE_ID, Menu.NONE, R.string.restore_defaults); restoreItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); - restoreItem.setIcon(AppCompatResources.getDrawable(requireContext(), - R.drawable.ic_settings_backup_restore)); + final Drawable icon = AppCompatResources.getDrawable(requireContext(), + R.drawable.ic_settings_backup_restore); + if (icon != null) { + icon.mutate(); + icon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP); + } + restoreItem.setIcon(icon); } @Override diff --git a/app/src/main/res/layout/fragment_instance_list.xml b/app/src/main/res/layout/fragment_instance_list.xml index 33cfde908..a4aa1bda5 100644 --- a/app/src/main/res/layout/fragment_instance_list.xml +++ b/app/src/main/res/layout/fragment_instance_list.xml @@ -44,6 +44,7 @@ android:layout_marginBottom="16dp" android:clickable="true" android:focusable="true" + android:tint="@color/white" app:backgroundTint="?attr/colorPrimary" app:fabSize="auto" app:srcCompat="@drawable/ic_add" /> diff --git a/app/src/main/res/values/styles_misc.xml b/app/src/main/res/values/styles_misc.xml index cad7ce904..74a173abc 100644 --- a/app/src/main/res/values/styles_misc.xml +++ b/app/src/main/res/values/styles_misc.xml @@ -57,12 +57,15 @@
From 69793049c3d02ea70b9653636e8b3d767d096c2c Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Sun, 28 Mar 2021 19:50:45 +0300 Subject: [PATCH 27/91] Fix subscription selector V overlay color, add ripples --- app/src/main/res/layout/picker_subscription_item.xml | 5 +++-- app/src/main/res/values/styles.xml | 8 +++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/app/src/main/res/layout/picker_subscription_item.xml b/app/src/main/res/layout/picker_subscription_item.xml index 84c6a9130..6bc68cab8 100644 --- a/app/src/main/res/layout/picker_subscription_item.xml +++ b/app/src/main/res/layout/picker_subscription_item.xml @@ -5,7 +5,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="2dp" - android:background="?attr/focused_selector" + android:background="?attr/selectableItemBackground" android:clickable="true" android:focusable="true"> @@ -42,7 +42,7 @@ android:id="@+id/selected_highlight" android:layout_width="match_parent" android:layout_height="match_parent" - android:background="#9A000000" + android:background="?attr/colorControlHighlight" android:visibility="gone" tools:visibility="visible"> @@ -52,6 +52,7 @@ android:layout_gravity="top|center_horizontal" android:layout_marginTop="4dp" android:scaleType="centerInside" + android:tint="@color/white" app:srcCompat="@drawable/ic_done" tools:ignore="ContentDescription" /> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index ce56d5a30..cbbfcad48 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -13,7 +13,9 @@ - - + + - From 7175f27da809229f648bb1e3cf4fb4b81b72befb Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Sun, 28 Mar 2021 21:49:41 +0300 Subject: [PATCH 32/91] Fix File Picker Toolbar colors --- app/src/main/res/values/styles_misc.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/res/values/styles_misc.xml b/app/src/main/res/values/styles_misc.xml index a5b115f96..275374fcf 100644 --- a/app/src/main/res/values/styles_misc.xml +++ b/app/src/main/res/values/styles_misc.xml @@ -14,6 +14,9 @@ @color/light_youtube_primary_color @color/light_youtube_dark_color @color/light_settings_accent_color + + @style/ToolbarTheme + @color/light_background_color @color/light_separator_color @@ -30,6 +33,9 @@ @color/dark_youtube_primary_color @color/dark_youtube_dark_color @color/dark_settings_accent_color + + @style/ToolbarTheme + @color/dark_background_color @color/black_separator_color From 80d1c5b9f5ee70c695e50b96ab93610dce5bda4d Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Sun, 28 Mar 2021 22:04:54 +0300 Subject: [PATCH 33/91] Fix Repeat Button color in Player --- app/src/main/java/org/schabi/newpipe/player/Player.java | 5 +++-- app/src/main/res/layout/player.xml | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 487c93336..de1f274b2 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -52,6 +52,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.content.res.AppCompatResources; +import androidx.appcompat.widget.AppCompatImageButton; import androidx.core.content.ContextCompat; import androidx.core.view.DisplayCutoutCompat; import androidx.core.view.ViewCompat; @@ -2225,7 +2226,7 @@ public final class Player implements Log.d(TAG, "ExoPlayer - onRepeatModeChanged() called with: " + "repeatMode = [" + repeatMode + "]"); } - setRepeatModeButton(binding.repeatButton, repeatMode); + setRepeatModeButton(((AppCompatImageButton) binding.repeatButton), repeatMode); onShuffleOrRepeatModeChanged(); } @@ -2253,7 +2254,7 @@ public final class Player implements NotificationUtil.getInstance().createNotificationIfNeededAndUpdate(this, false); } - private void setRepeatModeButton(final ImageButton imageButton, final int repeatMode) { + private void setRepeatModeButton(final AppCompatImageButton imageButton, final int repeatMode) { switch (repeatMode) { case REPEAT_MODE_OFF: imageButton.setImageResource(R.drawable.exo_controls_repeat_off); diff --git a/app/src/main/res/layout/player.xml b/app/src/main/res/layout/player.xml index 978913289..9f4a0166e 100644 --- a/app/src/main/res/layout/player.xml +++ b/app/src/main/res/layout/player.xml @@ -513,7 +513,7 @@ android:scaleType="fitXY" app:srcCompat="@drawable/ic_close" /> - Date: Sun, 28 Mar 2021 22:35:03 +0300 Subject: [PATCH 34/91] Red Splash Screen for API < 23 --- app/src/main/res/drawable/splash_background.xml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/drawable/splash_background.xml b/app/src/main/res/drawable/splash_background.xml index 61c3d058f..c9b018add 100644 --- a/app/src/main/res/drawable/splash_background.xml +++ b/app/src/main/res/drawable/splash_background.xml @@ -1,6 +1,12 @@ - + - + + + + \ No newline at end of file From 8002cc277167379fedcdfbb1aac29ae7c856b30e Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Sun, 28 Mar 2021 22:51:44 +0300 Subject: [PATCH 35/91] Refactor Styles, disable colored navigation bar when we can't be sure that navigation bar buttons will have enough contrast (API < 27) --- app/src/main/res/values-v21/styles.xml | 26 +++++++++------- app/src/main/res/values-v27/styles.xml | 14 ++++++--- app/src/main/res/values-v29/styles.xml | 15 ++++++---- app/src/main/res/values/styles.xml | 41 +++++++++++--------------- 4 files changed, 53 insertions(+), 43 deletions(-) diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml index 5b3858cf6..bdad22174 100644 --- a/app/src/main/res/values-v21/styles.xml +++ b/app/src/main/res/values-v21/styles.xml @@ -1,28 +1,32 @@ - - + + + + + + + - - - + + + - - + + + + - - diff --git a/app/src/main/res/values/styles_misc.xml b/app/src/main/res/values/styles_misc.xml index 275374fcf..fafa01310 100644 --- a/app/src/main/res/values/styles_misc.xml +++ b/app/src/main/res/values/styles_misc.xml @@ -62,6 +62,22 @@ + + @@ -79,4 +95,9 @@ @color/contrastColor + + + From 62c3c7ac211dc6dde92855de8d0d335336daf8ed Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Mon, 29 Mar 2021 14:47:46 +0300 Subject: [PATCH 38/91] Fix Toolbar Search input pointer and cursor color --- app/src/main/res/layout/toolbar_search_layout.xml | 1 + app/src/main/res/values/styles_misc.xml | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/res/layout/toolbar_search_layout.xml b/app/src/main/res/layout/toolbar_search_layout.xml index e2b0ed4cb..38128e2c7 100644 --- a/app/src/main/res/layout/toolbar_search_layout.xml +++ b/app/src/main/res/layout/toolbar_search_layout.xml @@ -23,6 +23,7 @@ android:inputType="textFilter|textNoSuggestions" android:maxLines="1" android:nextFocusDown="@+id/suggestions_list" + android:theme="@style/ToolbarSearchInputTheme" tools:ignore="RtlHardcoded" /> @color/contrastColor
- - From 24a264d78cef8e3f559a325ebaff0f0d4136448a Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Mon, 29 Mar 2021 16:10:56 +0300 Subject: [PATCH 39/91] Fix Volume Off gesture overlay --- app/src/main/res/drawable-night/ic_volume_off.xml | 2 +- app/src/main/res/drawable/ic_volume_off.xml | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/drawable-night/ic_volume_off.xml b/app/src/main/res/drawable-night/ic_volume_off.xml index 2f8d6cfb4..912a2ff68 100644 --- a/app/src/main/res/drawable-night/ic_volume_off.xml +++ b/app/src/main/res/drawable-night/ic_volume_off.xml @@ -1,10 +1,10 @@ + diff --git a/app/src/main/res/drawable/ic_volume_off.xml b/app/src/main/res/drawable/ic_volume_off.xml index 19f166ddc..7700239a3 100644 --- a/app/src/main/res/drawable/ic_volume_off.xml +++ b/app/src/main/res/drawable/ic_volume_off.xml @@ -1,9 +1,10 @@ - + \ No newline at end of file From 84de865daf689852fb8bc781f2ce5be74eaed6b3 Mon Sep 17 00:00:00 2001 From: Tom <25043847+Douile@users.noreply.github.com> Date: Mon, 29 Mar 2021 16:00:00 +0000 Subject: [PATCH 40/91] Allow the user to pause while a video is buffering (#5929) Fix pause while buffering Use getPlayWhenReady wrapper everywhere playWhenReady is checked Remove duplicate `playPause()` code --- .../java/org/schabi/newpipe/player/Player.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index f8e0732b3..1c11a3948 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -706,11 +706,7 @@ public final class Player implements // Android TV: without it focus will frame the whole player binding.playPauseButton.requestFocus(); - if (simpleExoPlayer.getPlayWhenReady()) { - play(); - } else { - pause(); - } + playPause(); } NavigationHelper.sendPlayerStartedEvent(context); } @@ -1687,7 +1683,7 @@ public final class Player implements } public void saveWasPlaying() { - this.wasPlaying = simpleExoPlayer.getPlayWhenReady(); + this.wasPlaying = getPlayWhenReady(); } //endregion @@ -2686,7 +2682,7 @@ public final class Player implements Log.d(TAG, "onPlayPause() called"); } - if (isPlaying()) { + if (getPlayWhenReady()) { pause(); } else { play(); @@ -4012,6 +4008,10 @@ public final class Player implements return !exoPlayerIsNull() && simpleExoPlayer.isPlaying(); } + public boolean getPlayWhenReady() { + return !exoPlayerIsNull() && simpleExoPlayer.getPlayWhenReady(); + } + private boolean isLoading() { return !exoPlayerIsNull() && simpleExoPlayer.isLoading(); } From c906cb57eefb20f864f6835f2a182dec06fb0612 Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Mon, 29 Mar 2021 21:19:17 +0300 Subject: [PATCH 41/91] Fix colors in setting fragments, cleanup --- .../settings/PeertubeInstanceListFragment.java | 12 ++---------- .../newpipe/settings/tabs/ChooseTabsFragment.java | 1 - .../drawable-night/ic_settings_backup_restore.xml | 10 ---------- .../main/res/drawable/ic_settings_backup_restore.xml | 1 + app/src/main/res/layout/fragment_instance_list.xml | 1 - app/src/main/res/values/styles.xml | 1 + app/src/main/res/values/styles_misc.xml | 4 ++++ 7 files changed, 8 insertions(+), 22 deletions(-) delete mode 100644 app/src/main/res/drawable-night/ic_settings_backup_restore.xml diff --git a/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java b/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java index e4da3b14d..74585e12b 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/PeertubeInstanceListFragment.java @@ -3,9 +3,6 @@ package org.schabi.newpipe.settings; import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; -import android.graphics.Color; -import android.graphics.PorterDuff; -import android.graphics.drawable.Drawable; import android.os.Bundle; import android.text.InputType; import android.view.LayoutInflater; @@ -148,13 +145,8 @@ public class PeertubeInstanceListFragment extends Fragment { final MenuItem restoreItem = menu .add(Menu.NONE, MENU_ITEM_RESTORE_ID, Menu.NONE, R.string.restore_defaults); restoreItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); - final Drawable icon = AppCompatResources.getDrawable(requireContext(), - R.drawable.ic_settings_backup_restore); - if (icon != null) { - icon.mutate(); - icon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP); - } - restoreItem.setIcon(icon); + restoreItem.setIcon(AppCompatResources.getDrawable(requireContext(), + R.drawable.ic_settings_backup_restore)); } @Override diff --git a/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java b/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java index 52d128bf0..bb45c8ff7 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java +++ b/app/src/main/java/org/schabi/newpipe/settings/tabs/ChooseTabsFragment.java @@ -112,7 +112,6 @@ public class ChooseTabsFragment extends Fragment { final MenuItem restoreItem = menu.add(Menu.NONE, MENU_ITEM_RESTORE_ID, Menu.NONE, R.string.restore_defaults); restoreItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); - restoreItem.setIcon(AppCompatResources.getDrawable(requireContext(), R.drawable.ic_settings_backup_restore)); } diff --git a/app/src/main/res/drawable-night/ic_settings_backup_restore.xml b/app/src/main/res/drawable-night/ic_settings_backup_restore.xml deleted file mode 100644 index ae22bc141..000000000 --- a/app/src/main/res/drawable-night/ic_settings_backup_restore.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/drawable/ic_settings_backup_restore.xml b/app/src/main/res/drawable/ic_settings_backup_restore.xml index 57f966536..ae22bc141 100644 --- a/app/src/main/res/drawable/ic_settings_backup_restore.xml +++ b/app/src/main/res/drawable/ic_settings_backup_restore.xml @@ -1,6 +1,7 @@ diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 1c0d0b63c..7c3e0c9b4 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -13,6 +13,7 @@ diff --git a/app/src/main/res/values/styles_misc.xml b/app/src/main/res/values/styles_misc.xml index 0242dca6e..3f18c7ce9 100644 --- a/app/src/main/res/values/styles_misc.xml +++ b/app/src/main/res/values/styles_misc.xml @@ -60,6 +60,10 @@ @color/white_secondary + + - - - - - + + "); - } catch (final IOException e) { - throw new IllegalArgumentException( - "Could not get license file: " + license.getFilename(), e); - } - return webViewData; - } - - /** - * @param context the Android context - * @return String which is a CSS stylesheet according to the context's theme - */ - private static String getLicenseStylesheet(@NonNull final Context context) { - final boolean isLightTheme = ThemeHelper.isLightThemeSelected(context); - return "body{padding:12px 15px;margin:0;" - + "background:#" + getHexRGBColor(context, isLightTheme - ? R.color.light_license_background_color - : R.color.dark_license_background_color) + ";" - + "color:#" + getHexRGBColor(context, isLightTheme - ? R.color.light_license_text_color - : R.color.dark_license_text_color) + "}" - + "a[href]{color:#" + getHexRGBColor(context, isLightTheme - ? R.color.light_youtube_primary_color - : R.color.dark_youtube_primary_color) + "}" - + "pre{white-space:pre-wrap}"; - } - - /** - * Cast R.color to a hexadecimal color value. - * - * @param context the context to use - * @param color the color number from R.color - * @return a six characters long String with hexadecimal RGB values - */ - private static String getHexRGBColor(@NonNull final Context context, final int color) { - return context.getResources().getString(color).substring(3); - } - - static Disposable showLicense(@Nullable final Context context, @NonNull final License license) { - if (context == null) { - return Disposable.empty(); - } - - return Observable.fromCallable(() -> getFormattedLicense(context, license)) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(formattedLicense -> { - final String webViewData = Base64.encodeToString(formattedLicense - .getBytes(StandardCharsets.UTF_8), Base64.NO_PADDING); - final WebView webView = new WebView(context); - webView.loadData(webViewData, "text/html; charset=UTF-8", "base64"); - - final AlertDialog.Builder alert = new AlertDialog.Builder(context); - alert.setTitle(license.getName()); - alert.setView(webView); - assureCorrectAppLanguage(context); - alert.setNegativeButton(context.getString(R.string.finish), - (dialog, which) -> dialog.dismiss()); - alert.show(); - }); - } -} diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt new file mode 100644 index 000000000..89e356a42 --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt @@ -0,0 +1,114 @@ +package org.schabi.newpipe.about + +import android.content.Context +import android.util.Base64 +import android.webkit.WebView +import androidx.appcompat.app.AlertDialog +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.core.Observable +import io.reactivex.rxjava3.disposables.Disposable +import io.reactivex.rxjava3.schedulers.Schedulers +import org.schabi.newpipe.R +import org.schabi.newpipe.util.Localization +import org.schabi.newpipe.util.ThemeHelper +import java.io.BufferedReader +import java.io.IOException +import java.io.InputStreamReader +import java.nio.charset.StandardCharsets + +object LicenseFragmentHelper { + /** + * @param context the context to use + * @param license the license + * @return String which contains a HTML formatted license page + * styled according to the context's theme + */ + private fun getFormattedLicense(context: Context, license: License): String { + val licenseContent = StringBuilder() + val webViewData: String + try { + BufferedReader( + InputStreamReader( + context.assets.open(license.filename), + StandardCharsets.UTF_8 + ) + ).use { `in` -> + var str: String? + while (`in`.readLine().also { str = it } != null) { + licenseContent.append(str) + } + + // split the HTML file and insert the stylesheet into the HEAD of the file + webViewData = "$licenseContent".replace( + "", + "" + ) + } + } catch (e: IOException) { + throw IllegalArgumentException( + "Could not get license file: " + license.filename, e + ) + } + return webViewData + } + + /** + * @param context the Android context + * @return String which is a CSS stylesheet according to the context's theme + */ + private fun getLicenseStylesheet(context: Context): String { + val isLightTheme = ThemeHelper.isLightThemeSelected(context) + return ("body{padding:12px 15px;margin:0;" + "background:#" + getHexRGBColor( + context, + if (isLightTheme) R.color.light_license_background_color + else R.color.dark_license_background_color + ) + ";" + "color:#" + getHexRGBColor( + context, + if (isLightTheme) R.color.light_license_text_color + else R.color.dark_license_text_color + ) + "}" + "a[href]{color:#" + getHexRGBColor( + context, + if (isLightTheme) R.color.light_youtube_primary_color + else R.color.dark_youtube_primary_color + ) + "}" + "pre{white-space:pre-wrap}") + } + + /** + * Cast R.color to a hexadecimal color value. + * + * @param context the context to use + * @param color the color number from R.color + * @return a six characters long String with hexadecimal RGB values + */ + private fun getHexRGBColor(context: Context, color: Int): String { + return context.getString(color).substring(3) + } + + @JvmStatic + fun showLicense(context: Context?, license: License): Disposable { + return if (context == null) { + Disposable.empty() + } else { + Observable.fromCallable { getFormattedLicense(context, license) } + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { formattedLicense: String -> + val webViewData = Base64.encodeToString( + formattedLicense + .toByteArray(StandardCharsets.UTF_8), + Base64.NO_PADDING + ) + val webView = WebView(context) + webView.loadData(webViewData, "text/html; charset=UTF-8", "base64") + val alert = AlertDialog.Builder(context) + alert.setTitle(license.name) + alert.setView(webView) + Localization.assureCorrectAppLanguage(context) + alert.setNegativeButton( + context.getString(R.string.finish) + ) { dialog, _ -> dialog.dismiss() } + alert.show() + } + } + } +} diff --git a/app/src/main/java/org/schabi/newpipe/about/StandardLicenses.java b/app/src/main/java/org/schabi/newpipe/about/StandardLicenses.java deleted file mode 100644 index 60b1e168c..000000000 --- a/app/src/main/java/org/schabi/newpipe/about/StandardLicenses.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.schabi.newpipe.about; - -/** - * Class containing information about standard software licenses. - */ -public final class StandardLicenses { - public static final License GPL3 - = new License("GNU General Public License, Version 3.0", "GPLv3", "gpl_3.html"); - public static final License APACHE2 - = new License("Apache License, Version 2.0", "ALv2", "apache2.html"); - public static final License MPL2 - = new License("Mozilla Public License, Version 2.0", "MPL 2.0", "mpl2.html"); - public static final License MIT - = new License("MIT License", "MIT", "mit.html"); - public static final License EPL1 - = new License("Eclipse Public License, Version 1.0", "EPL 1.0", "epl1.html"); - - private StandardLicenses() { } -} diff --git a/app/src/main/java/org/schabi/newpipe/about/StandardLicenses.kt b/app/src/main/java/org/schabi/newpipe/about/StandardLicenses.kt new file mode 100644 index 000000000..c5b9618fe --- /dev/null +++ b/app/src/main/java/org/schabi/newpipe/about/StandardLicenses.kt @@ -0,0 +1,21 @@ +package org.schabi.newpipe.about + +/** + * Class containing information about standard software licenses. + */ +object StandardLicenses { + @JvmField + val GPL3 = License("GNU General Public License, Version 3.0", "GPLv3", "gpl_3.html") + + @JvmField + val APACHE2 = License("Apache License, Version 2.0", "ALv2", "apache2.html") + + @JvmField + val MPL2 = License("Mozilla Public License, Version 2.0", "MPL 2.0", "mpl2.html") + + @JvmField + val MIT = License("MIT License", "MIT", "mit.html") + + @JvmField + val EPL1 = License("Eclipse Public License, Version 1.0", "EPL 1.0", "epl1.html") +} From 27d0f7f2772329e5a240d27175a4ac1610af2193 Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Mon, 29 Mar 2021 19:07:12 -0400 Subject: [PATCH 48/91] Convert AboutFragment clickListeners to a function extension --- .../org/schabi/newpipe/about/AboutActivity.kt | 43 +++++++------------ 1 file changed, 15 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt index 129af3388..2f015a049 100644 --- a/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt +++ b/app/src/main/java/org/schabi/newpipe/about/AboutActivity.kt @@ -5,6 +5,7 @@ import android.view.LayoutInflater import android.view.MenuItem import android.view.View import android.view.ViewGroup +import android.widget.Button import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentActivity @@ -59,41 +60,27 @@ class AboutActivity : AppCompatActivity() { * A placeholder fragment containing a simple view. */ class AboutFragment : Fragment() { + private fun Button.openLink(url: Int) { + setOnClickListener { + ShareUtils.openUrlInBrowser( + context, + requireContext().getString(url), + false + ) + } + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View { val aboutBinding = FragmentAboutBinding.inflate(inflater, container, false) - val context = context aboutBinding.aboutAppVersion.text = BuildConfig.VERSION_NAME - aboutBinding.aboutGithubLink.setOnClickListener { - ShareUtils.openUrlInBrowser( - context, - context!!.getString(R.string.github_url), - false - ) - } - aboutBinding.aboutDonationLink.setOnClickListener { - ShareUtils.openUrlInBrowser( - context, - context!!.getString(R.string.donation_url), - false - ) - } - aboutBinding.aboutWebsiteLink.setOnClickListener { - ShareUtils.openUrlInBrowser( - context, - context!!.getString(R.string.website_url), - false - ) - } - aboutBinding.aboutPrivacyPolicyLink.setOnClickListener { - ShareUtils.openUrlInBrowser( - context, context!!.getString(R.string.privacy_policy_url), - false - ) - } + aboutBinding.aboutGithubLink.openLink(R.string.github_url) + aboutBinding.aboutDonationLink.openLink(R.string.donation_url) + aboutBinding.aboutWebsiteLink.openLink(R.string.website_url) + aboutBinding.aboutPrivacyPolicyLink.openLink(R.string.privacy_policy_url) return aboutBinding.root } } From be4d12789dee709bca2a76304cfc574fa074abf0 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 28 Mar 2021 22:18:23 +0200 Subject: [PATCH 49/91] Fix random NullPointerException in SearchFragment --- .../fragments/list/search/SearchFragment.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java index 26360137e..76d9d6e38 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/search/SearchFragment.java @@ -139,7 +139,7 @@ public class SearchFragment extends BaseListFragment menuItemToFilterName; + @Nullable private Map menuItemToFilterName = null; private StreamingService service; private Page nextPage; private boolean isSuggestionsEnabled = true; @@ -455,11 +455,12 @@ public class SearchFragment extends BaseListFragment cf = new ArrayList<>(1); - cf.add(menuItemToFilterName.get(item.getItemId())); - changeContentFilter(item, cf); - + public boolean onOptionsItemSelected(@NonNull final MenuItem item) { + if (menuItemToFilterName != null) { + final List cf = new ArrayList<>(1); + cf.add(menuItemToFilterName.get(item.getItemId())); + changeContentFilter(item, cf); + } return true; } From 3e8cba745a5b003abd449909528a45a818133c6f Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 28 Mar 2021 22:25:51 +0200 Subject: [PATCH 50/91] Fix random NullPointerException in PlaylistFragment --- .../newpipe/fragments/list/playlist/PlaylistFragment.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java index 114947923..e20df67a1 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/playlist/PlaylistFragment.java @@ -423,7 +423,9 @@ public class PlaylistFragment extends BaseListInfoFragment { @Override public void setTitle(final String title) { super.setTitle(title); - headerBinding.playlistTitleView.setText(title); + if (headerBinding != null) { + headerBinding.playlistTitleView.setText(title); + } } private void onBookmarkClicked() { From 5d6a568308409a6a72fb0dff14fe027800f019c8 Mon Sep 17 00:00:00 2001 From: Stypox Date: Sun, 28 Mar 2021 22:31:03 +0200 Subject: [PATCH 51/91] Fix random NullPointerException in NotificationActionsPreference --- .../custom/NotificationActionsPreference.java | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java b/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java index e50c858ca..045e574be 100644 --- a/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java +++ b/app/src/main/java/org/schabi/newpipe/settings/custom/NotificationActionsPreference.java @@ -17,6 +17,7 @@ import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.content.res.AppCompatResources; import androidx.core.graphics.drawable.DrawableCompat; @@ -41,9 +42,8 @@ public class NotificationActionsPreference extends Preference { } - private NotificationSlot[] notificationSlots; - - private List compactSlots; + @Nullable private NotificationSlot[] notificationSlots = null; + @Nullable private List compactSlots = null; //////////////////////////////////////////////////////////////////////////// // Lifecycle @@ -85,19 +85,22 @@ public class NotificationActionsPreference extends Preference { //////////////////////////////////////////////////////////////////////////// private void saveChanges() { - final SharedPreferences.Editor editor = getSharedPreferences().edit(); + if (compactSlots != null && notificationSlots != null) { + final SharedPreferences.Editor editor = getSharedPreferences().edit(); - for (int i = 0; i < 3; i++) { - editor.putInt(getContext().getString(NotificationConstants.SLOT_COMPACT_PREF_KEYS[i]), - (i < compactSlots.size() ? compactSlots.get(i) : -1)); + for (int i = 0; i < 3; i++) { + editor.putInt(getContext().getString( + NotificationConstants.SLOT_COMPACT_PREF_KEYS[i]), + (i < compactSlots.size() ? compactSlots.get(i) : -1)); + } + + for (int i = 0; i < 5; i++) { + editor.putInt(getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]), + notificationSlots[i].selectedAction); + } + + editor.apply(); } - - for (int i = 0; i < 5; i++) { - editor.putInt(getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]), - notificationSlots[i].selectedAction); - } - - editor.apply(); } From 83d16932a470ffc9ce88374532733698dc80657b Mon Sep 17 00:00:00 2001 From: Robin Date: Wed, 31 Mar 2021 10:05:44 +0200 Subject: [PATCH 52/91] Update to ExoPlayer 2.13.2 --- app/build.gradle | 2 +- .../org/schabi/newpipe/player/Player.java | 44 ++++++++----------- .../newpipe/player/helper/AudioReactor.java | 6 +-- .../newpipe/player/helper/LoadController.java | 15 ++++--- .../player/helper/MediaSessionManager.java | 2 - .../newpipe/player/helper/PlayerHelper.java | 4 +- .../player/playback/CustomTrackSelector.java | 8 ++-- .../player/resolver/PlaybackResolver.java | 15 ++++--- .../resolver/VideoPlaybackResolver.java | 13 +++--- 9 files changed, 50 insertions(+), 59 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 88ed8998e..66de11377 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -100,7 +100,7 @@ ext { checkstyleVersion = '8.38' stethoVersion = '1.5.1' leakCanaryVersion = '2.5' - exoPlayerVersion = '2.12.3' + exoPlayerVersion = '2.13.2' androidxLifecycleVersion = '2.2.0' androidxRoomVersion = '2.3.0-alpha03' groupieVersion = '2.8.1' diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index 1c11a3948..e83f5c641 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -489,10 +489,7 @@ public final class Player implements simpleExoPlayer.addTextOutput(binding.subtitleView); // Setup audio session with onboard equalizer - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - trackSelector.setParameters(trackSelector.buildUponParameters() - .setTunnelingAudioSessionId(C.generateAudioSessionIdV21(context))); - } + trackSelector.setParameters(trackSelector.buildUponParameters().setTunnelingEnabled(true)); } private void initListeners() { @@ -624,10 +621,10 @@ public final class Player implements && newQueue.getItem().getUrl().equals(playQueue.getItem().getUrl()) && newQueue.getItem().getRecoveryPosition() != PlayQueueItem.RECOVERY_UNSET) { // Player can have state = IDLE when playback is stopped or failed - // and we should retry() in this case + // and we should retry in this case if (simpleExoPlayer.getPlaybackState() == com.google.android.exoplayer2.Player.STATE_IDLE) { - simpleExoPlayer.retry(); + simpleExoPlayer.prepare(); } simpleExoPlayer.seekTo(playQueue.getIndex(), newQueue.getItem().getRecoveryPosition()); simpleExoPlayer.setPlayWhenReady(playWhenReady); @@ -638,10 +635,10 @@ public final class Player implements && !playQueue.isDisposed()) { // Do not re-init the same PlayQueue. Save time // Player can have state = IDLE when playback is stopped or failed - // and we should retry() in this case + // and we should retry in this case if (simpleExoPlayer.getPlaybackState() == com.google.android.exoplayer2.Player.STATE_IDLE) { - simpleExoPlayer.retry(); + simpleExoPlayer.prepare(); } simpleExoPlayer.setPlayWhenReady(playWhenReady); @@ -1649,7 +1646,7 @@ public final class Player implements saveWasPlaying(); if (isPlaying()) { - simpleExoPlayer.setPlayWhenReady(false); + simpleExoPlayer.pause(); } showControls(0); @@ -1665,7 +1662,7 @@ public final class Player implements seekTo(seekBar.getProgress()); if (wasPlaying || simpleExoPlayer.getDuration() == seekBar.getProgress()) { - simpleExoPlayer.setPlayWhenReady(true); + simpleExoPlayer.play(); } binding.playbackCurrentTime.setText(getTimeString(seekBar.getProgress())); @@ -1908,7 +1905,7 @@ public final class Player implements } @Override // exoplayer listener - public void onLoadingChanged(final boolean isLoading) { + public void onIsLoadingChanged(final boolean isLoading) { if (DEBUG) { Log.d(TAG, "ExoPlayer - onLoadingChanged() called with: " + "isLoading = [" + isLoading + "]"); @@ -1952,7 +1949,8 @@ public final class Player implements if (currentState == STATE_BLOCKED) { changeState(STATE_BUFFERING); } - simpleExoPlayer.prepare(mediaSource); + simpleExoPlayer.setMediaSource(mediaSource); + simpleExoPlayer.prepare(); } public void changeState(final int state) { @@ -2351,6 +2349,12 @@ public final class Player implements break; } case DISCONTINUITY_REASON_SEEK: + if (DEBUG) { + Log.d(TAG, "ExoPlayer - onSeekProcessed() called"); + } + if (isPrepared) { + saveStreamProgressState(); + } case DISCONTINUITY_REASON_SEEK_ADJUSTMENT: case DISCONTINUITY_REASON_INTERNAL: if (playQueue.getIndex() != newWindowIndex) { @@ -2415,10 +2419,8 @@ public final class Player implements setRecovery(); reloadPlayQueueManager(); break; - case ExoPlaybackException.TYPE_OUT_OF_MEMORY: case ExoPlaybackException.TYPE_REMOTE: case ExoPlaybackException.TYPE_RENDERER: - case ExoPlaybackException.TYPE_TIMEOUT: default: showUnrecoverableError(error); onPlaybackShutdown(); @@ -2623,16 +2625,6 @@ public final class Player implements simpleExoPlayer.seekToDefaultPosition(); } } - - @Override // exoplayer override - public void onSeekProcessed() { - if (DEBUG) { - Log.d(TAG, "ExoPlayer - onSeekProcessed() called"); - } - if (isPrepared) { - saveStreamProgressState(); - } - } //endregion @@ -2660,7 +2652,7 @@ public final class Player implements } } - simpleExoPlayer.setPlayWhenReady(true); + simpleExoPlayer.play(); saveStreamProgressState(); } @@ -2673,7 +2665,7 @@ public final class Player implements } audioReactor.abandonAudioFocus(); - simpleExoPlayer.setPlayWhenReady(false); + simpleExoPlayer.pause(); saveStreamProgressState(); } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java index 13ee24e16..c4b21f203 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/AudioReactor.java @@ -103,13 +103,13 @@ public class AudioReactor implements AudioManager.OnAudioFocusChangeListener, An animateAudio(DUCK_AUDIO_TO, 1.0f); if (PlayerHelper.isResumeAfterAudioFocusGain(context)) { - player.setPlayWhenReady(true); + player.play(); } } private void onAudioFocusLoss() { Log.d(TAG, "onAudioFocusLoss() called"); - player.setPlayWhenReady(false); + player.pause(); } private void onAudioFocusLossCanDuck() { @@ -148,7 +148,7 @@ public class AudioReactor implements AudioManager.OnAudioFocusChangeListener, An //////////////////////////////////////////////////////////////////////////*/ @Override - public void onAudioSessionId(final EventTime eventTime, final int audioSessionId) { + public void onAudioSessionIdChanged(final EventTime eventTime, final int audioSessionId) { if (!PlayerHelper.isUsingDSP()) { return; } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java b/app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java index ba9a2f1ec..fe0233508 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/LoadController.java @@ -4,7 +4,7 @@ import com.google.android.exoplayer2.DefaultLoadControl; import com.google.android.exoplayer2.LoadControl; import com.google.android.exoplayer2.Renderer; import com.google.android.exoplayer2.source.TrackGroupArray; -import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.upstream.Allocator; public class LoadController implements LoadControl { @@ -33,7 +33,7 @@ public class LoadController implements LoadControl { final DefaultLoadControl.Builder builder = new DefaultLoadControl.Builder(); builder.setBufferDurationsMs(minimumPlaybackBufferMs, optimalPlaybackBufferMs, initialPlaybackBufferMs, initialPlaybackBufferMs); - internalLoadControl = builder.createDefaultLoadControl(); + internalLoadControl = builder.build(); } /*////////////////////////////////////////////////////////////////////////// @@ -47,9 +47,9 @@ public class LoadController implements LoadControl { } @Override - public void onTracksSelected(final Renderer[] renderers, final TrackGroupArray trackGroupArray, - final TrackSelectionArray trackSelectionArray) { - internalLoadControl.onTracksSelected(renderers, trackGroupArray, trackSelectionArray); + public void onTracksSelected(final Renderer[] renderers, final TrackGroupArray trackGroups, + final ExoTrackSelection[] trackSelections) { + internalLoadControl.onTracksSelected(renderers, trackGroups, trackSelections); } @Override @@ -92,11 +92,12 @@ public class LoadController implements LoadControl { @Override public boolean shouldStartPlayback(final long bufferedDurationUs, final float playbackSpeed, - final boolean rebuffering) { + final boolean rebuffering, final long targetLiveOffsetUs) { final boolean isInitialPlaybackBufferFilled = bufferedDurationUs >= this.initialPlaybackBufferUs * playbackSpeed; final boolean isInternalStartingPlayback = internalLoadControl - .shouldStartPlayback(bufferedDurationUs, playbackSpeed, rebuffering); + .shouldStartPlayback(bufferedDurationUs, playbackSpeed, rebuffering, + targetLiveOffsetUs); return isInitialPlaybackBufferFilled || isInternalStartingPlayback; } diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/MediaSessionManager.java b/app/src/main/java/org/schabi/newpipe/player/helper/MediaSessionManager.java index b0c641433..c7f1f9c8c 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/MediaSessionManager.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/MediaSessionManager.java @@ -36,8 +36,6 @@ public class MediaSessionManager { @NonNull final Player player, @NonNull final MediaSessionCallback callback) { mediaSession = new MediaSessionCompat(context, TAG); - mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS - | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS); mediaSession.setActive(true); mediaSession.setPlaybackState(new PlaybackStateCompat.Builder() diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index 4324fcd0a..aab3a8d49 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -23,7 +23,7 @@ import com.google.android.exoplayer2.Player.RepeatMode; import com.google.android.exoplayer2.SeekParameters; import com.google.android.exoplayer2.text.CaptionStyleCompat; import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; -import com.google.android.exoplayer2.trackselection.TrackSelection; +import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout.ResizeMode; import com.google.android.exoplayer2.util.MimeTypes; @@ -323,7 +323,7 @@ public final class PlayerHelper { return 60000; } - public static TrackSelection.Factory getQualitySelector() { + public static ExoTrackSelection.Factory getQualitySelector() { return new AdaptiveTrackSelection.Factory( 1000, AdaptiveTrackSelection.DEFAULT_MAX_DURATION_FOR_QUALITY_DECREASE_MS, diff --git a/app/src/main/java/org/schabi/newpipe/player/playback/CustomTrackSelector.java b/app/src/main/java/org/schabi/newpipe/player/playback/CustomTrackSelector.java index d70707fdb..389be7062 100644 --- a/app/src/main/java/org/schabi/newpipe/player/playback/CustomTrackSelector.java +++ b/app/src/main/java/org/schabi/newpipe/player/playback/CustomTrackSelector.java @@ -13,7 +13,7 @@ import com.google.android.exoplayer2.RendererCapabilities.Capabilities; import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelection; +import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.util.Assertions; /** @@ -28,7 +28,7 @@ public class CustomTrackSelector extends DefaultTrackSelector { private String preferredTextLanguage; public CustomTrackSelector(final Context context, - final TrackSelection.Factory adaptiveTrackSelectionFactory) { + final ExoTrackSelection.Factory adaptiveTrackSelectionFactory) { super(context, adaptiveTrackSelectionFactory); } @@ -50,7 +50,7 @@ public class CustomTrackSelector extends DefaultTrackSelector { @Override @Nullable - protected Pair selectTextTrack( + protected Pair selectTextTrack( final TrackGroupArray groups, @NonNull final int[][] formatSupport, @NonNull final Parameters params, @@ -86,7 +86,7 @@ public class CustomTrackSelector extends DefaultTrackSelector { } } return selectedGroup == null ? null - : Pair.create(new TrackSelection.Definition(selectedGroup, selectedTrackIndex), + : Pair.create(new ExoTrackSelection.Definition(selectedGroup, selectedTrackIndex), Assertions.checkNotNull(selectedTrackScore)); } } diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java index e06c0ff82..a6dcadd5e 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/PlaybackResolver.java @@ -7,6 +7,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.google.android.exoplayer2.C; +import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.util.Util; @@ -43,13 +44,13 @@ public interface PlaybackResolver extends Resolver { switch (type) { case C.TYPE_SS: return dataSource.getLiveSsMediaSourceFactory().setTag(metadata) - .createMediaSource(uri); + .createMediaSource(MediaItem.fromUri(uri)); case C.TYPE_DASH: return dataSource.getLiveDashMediaSourceFactory().setTag(metadata) - .createMediaSource(uri); + .createMediaSource(MediaItem.fromUri(uri)); case C.TYPE_HLS: return dataSource.getLiveHlsMediaSourceFactory().setTag(metadata) - .createMediaSource(uri); + .createMediaSource(MediaItem.fromUri(uri)); default: throw new IllegalStateException("Unsupported type: " + type); } @@ -68,16 +69,16 @@ public interface PlaybackResolver extends Resolver { switch (type) { case C.TYPE_SS: return dataSource.getLiveSsMediaSourceFactory().setTag(metadata) - .createMediaSource(uri); + .createMediaSource(MediaItem.fromUri(uri)); case C.TYPE_DASH: return dataSource.getDashMediaSourceFactory().setTag(metadata) - .createMediaSource(uri); + .createMediaSource(MediaItem.fromUri(uri)); case C.TYPE_HLS: return dataSource.getHlsMediaSourceFactory().setTag(metadata) - .createMediaSource(uri); + .createMediaSource(MediaItem.fromUri(uri)); case C.TYPE_OTHER: return dataSource.getExtractorMediaSourceFactory(cacheKey).setTag(metadata) - .createMediaSource(uri); + .createMediaSource(MediaItem.fromUri(uri)); default: throw new IllegalStateException("Unsupported type: " + type); } diff --git a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java index a2b3a1d3d..245a85e71 100644 --- a/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java +++ b/app/src/main/java/org/schabi/newpipe/player/resolver/VideoPlaybackResolver.java @@ -6,7 +6,7 @@ import android.net.Uri; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.google.android.exoplayer2.Format; +import com.google.android.exoplayer2.MediaItem; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MergingMediaSource; @@ -22,7 +22,6 @@ import org.schabi.newpipe.util.ListHelper; import java.util.ArrayList; import java.util.List; -import static com.google.android.exoplayer2.C.SELECTION_FLAG_AUTOSELECT; import static com.google.android.exoplayer2.C.TIME_UNSET; public class VideoPlaybackResolver implements PlaybackResolver { @@ -101,12 +100,12 @@ public class VideoPlaybackResolver implements PlaybackResolver { if (mimeType == null) { continue; } - - final Format textFormat = Format.createTextSampleFormat(null, mimeType, - SELECTION_FLAG_AUTOSELECT, - PlayerHelper.captionLanguageOf(context, subtitle)); final MediaSource textSource = dataSource.getSampleMediaSourceFactory() - .createMediaSource(Uri.parse(subtitle.getUrl()), textFormat, TIME_UNSET); + .createMediaSource( + new MediaItem.Subtitle(Uri.parse(subtitle.getUrl()), + mimeType, + PlayerHelper.captionLanguageOf(context, subtitle)), + TIME_UNSET); mediaSources.add(textSource); } } From 73cfa5499dfd4479e35b9d1172ff059e143d6c1c Mon Sep 17 00:00:00 2001 From: wangear Date: Wed, 31 Mar 2021 17:10:14 +0900 Subject: [PATCH 53/91] Fix overlapping fonts and crash on tapping anywhere on video after long-pressing 'Popup' button (#5813) * Overlapping fonts #5096 issue : #5096 * Overlapping fonts #5096 issue : #5096 changed : - If additional textView is overlapped, only title view shows. * Overlapping fonts #5096 issue : #5096 changed : - Remove treeObserve and hiding logic. - RelativeLayout -> ConstraintLayout. - layout size fixed -> wrap_content. - if text size is bigger, layout height bigger too. * Overlapping fonts #5096 issue : #5096 changed : - remove unusable variable * Crash on tapping anywhere on video after long-pressing 'Popup' button #5804 issue : #5804 changed : - checked null - fixed NullPointerException. --- .../holder/StreamInfoItemHolder.java | 4 +- .../player/event/BasePlayerGestureListener.kt | 8 +-- app/src/main/res/layout/list_channel_item.xml | 52 +++++++++++-------- app/src/main/res/layout/list_stream_item.xml | 51 ++++++++++-------- 4 files changed, 67 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java index 1915ff283..a84c98404 100644 --- a/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java +++ b/app/src/main/java/org/schabi/newpipe/info_list/holder/StreamInfoItemHolder.java @@ -4,8 +4,6 @@ import android.text.TextUtils; import android.view.ViewGroup; import android.widget.TextView; -import androidx.preference.PreferenceManager; - import org.schabi.newpipe.R; import org.schabi.newpipe.extractor.InfoItem; import org.schabi.newpipe.extractor.stream.StreamInfoItem; @@ -14,6 +12,8 @@ import org.schabi.newpipe.info_list.InfoItemBuilder; import org.schabi.newpipe.local.history.HistoryRecordManager; import org.schabi.newpipe.util.Localization; +import androidx.preference.PreferenceManager; + import static org.schabi.newpipe.MainActivity.DEBUG; /* diff --git a/app/src/main/java/org/schabi/newpipe/player/event/BasePlayerGestureListener.kt b/app/src/main/java/org/schabi/newpipe/player/event/BasePlayerGestureListener.kt index 989c78c57..29ae7c5c3 100644 --- a/app/src/main/java/org/schabi/newpipe/player/event/BasePlayerGestureListener.kt +++ b/app/src/main/java/org/schabi/newpipe/player/event/BasePlayerGestureListener.kt @@ -229,8 +229,10 @@ abstract class BasePlayerGestureListener( // because the soft input is visible (the draggable area is currently resized). player.updateScreenSize() player.checkPopupPositionBounds() - initialPopupX = player.popupLayoutParams!!.x - initialPopupY = player.popupLayoutParams!!.y + player.popupLayoutParams?.let { + initialPopupX = it.x + initialPopupY = it.y + } return super.onDown(e) } @@ -466,7 +468,7 @@ abstract class BasePlayerGestureListener( // /////////////////////////////////////////////////////////////////// private fun getDisplayPortion(e: MotionEvent): DisplayPortion { - return if (player.playerType == MainPlayer.PlayerType.POPUP) { + return if (player.playerType == MainPlayer.PlayerType.POPUP && player.popupLayoutParams != null) { when { e.x < player.popupLayoutParams!!.width / 3.0 -> DisplayPortion.LEFT e.x > player.popupLayoutParams!!.width * 2.0 / 3.0 -> DisplayPortion.RIGHT diff --git a/app/src/main/res/layout/list_channel_item.xml b/app/src/main/res/layout/list_channel_item.xml index d6a9a51e4..baaddd814 100644 --- a/app/src/main/res/layout/list_channel_item.xml +++ b/app/src/main/res/layout/list_channel_item.xml @@ -1,31 +1,19 @@ - - - - + + + diff --git a/app/src/main/res/layout/list_stream_item.xml b/app/src/main/res/layout/list_stream_item.xml index e35168bba..b1d3ec49b 100644 --- a/app/src/main/res/layout/list_stream_item.xml +++ b/app/src/main/res/layout/list_stream_item.xml @@ -1,9 +1,10 @@ - + android:progressDrawable="?progress_horizontal_drawable" + app:layout_constraintEnd_toEndOf="@+id/itemThumbnailView" + app:layout_constraintStart_toStartOf="@+id/itemThumbnailView" + app:layout_constraintTop_toBottomOf="@+id/itemThumbnailView" /> - + From ad8f3aa6c9f0cbaf4fea499779fcbde326c979f5 Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Wed, 31 Mar 2021 16:49:28 +0300 Subject: [PATCH 54/91] Fix Kiosk Selector colors in Light theme --- app/src/main/res/layout/select_kiosk_item.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/res/layout/select_kiosk_item.xml b/app/src/main/res/layout/select_kiosk_item.xml index 69b7f0b52..6cd04ae34 100644 --- a/app/src/main/res/layout/select_kiosk_item.xml +++ b/app/src/main/res/layout/select_kiosk_item.xml @@ -1,5 +1,6 @@ Date: Wed, 31 Mar 2021 16:38:50 +0200 Subject: [PATCH 55/91] Disabled tunneling on Hi3798MV200 --- .../java/org/schabi/newpipe/player/Player.java | 10 ++++++++-- .../org/schabi/newpipe/util/DeviceUtils.java | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/player/Player.java b/app/src/main/java/org/schabi/newpipe/player/Player.java index e83f5c641..faaccc9fe 100644 --- a/app/src/main/java/org/schabi/newpipe/player/Player.java +++ b/app/src/main/java/org/schabi/newpipe/player/Player.java @@ -74,6 +74,7 @@ import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.ui.AspectRatioFrameLayout; import com.google.android.exoplayer2.ui.SubtitleView; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; +import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.video.VideoListener; import com.google.android.material.floatingactionbutton.FloatingActionButton; import com.nostra13.universalimageloader.core.ImageLoader; @@ -488,8 +489,13 @@ public final class Player implements // Setup subtitle view simpleExoPlayer.addTextOutput(binding.subtitleView); - // Setup audio session with onboard equalizer - trackSelector.setParameters(trackSelector.buildUponParameters().setTunnelingEnabled(true)); + // enable media tunneling + if (DeviceUtils.shouldSupportMediaTunneling()) { + trackSelector.setParameters( + trackSelector.buildUponParameters().setTunnelingEnabled(true)); + } else if (DEBUG) { + Log.d(TAG, "[" + Util.DEVICE_DEBUG_INFO + "] does not support media tunneling"); + } } private void initListeners() { diff --git a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java index 52069fd0e..0704dad66 100644 --- a/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java +++ b/app/src/main/java/org/schabi/newpipe/util/DeviceUtils.java @@ -20,6 +20,13 @@ public final class DeviceUtils { private static final String AMAZON_FEATURE_FIRE_TV = "amazon.hardware.fire_tv"; private static Boolean isTV = null; + /* + * Devices that do not support media tunneling + */ + // Formuler Z8 Pro, Z8, CC, Z Alpha, Z+ Neo + private static final boolean HI3798MV200 = Build.VERSION.SDK_INT == 24 + && Build.DEVICE.equals("Hi3798MV200"); + private DeviceUtils() { } @@ -88,4 +95,15 @@ public final class DeviceUtils { sp, context.getResources().getDisplayMetrics()); } + + /** + * Some devices have broken tunneled video playback but claim to support it. + * See https://github.com/TeamNewPipe/NewPipe/issues/5911 + * @return false if Kitkat (does not support tunneling) or affected device + */ + public static boolean shouldSupportMediaTunneling() { + return Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP + && !HI3798MV200; + } + } From 856a39855e8ddd6b2eea956aebd0247eadf1308d Mon Sep 17 00:00:00 2001 From: camo0112 <56369484+camo0112@users.noreply.github.com> Date: Wed, 31 Mar 2021 20:48:02 +0530 Subject: [PATCH 56/91] IssueFixed#5968 --- .../newpipe/about/LicenseFragmentHelper.kt | 28 ++++++++++--------- .../schabi/newpipe/util/NavigationHelper.java | 19 ++++++++----- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt index 89e356a42..bdb3edabd 100644 --- a/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt +++ b/app/src/main/java/org/schabi/newpipe/about/LicenseFragmentHelper.kt @@ -58,19 +58,21 @@ object LicenseFragmentHelper { */ private fun getLicenseStylesheet(context: Context): String { val isLightTheme = ThemeHelper.isLightThemeSelected(context) - return ("body{padding:12px 15px;margin:0;" + "background:#" + getHexRGBColor( - context, - if (isLightTheme) R.color.light_license_background_color - else R.color.dark_license_background_color - ) + ";" + "color:#" + getHexRGBColor( - context, - if (isLightTheme) R.color.light_license_text_color - else R.color.dark_license_text_color - ) + "}" + "a[href]{color:#" + getHexRGBColor( - context, - if (isLightTheme) R.color.light_youtube_primary_color - else R.color.dark_youtube_primary_color - ) + "}" + "pre{white-space:pre-wrap}") + return ( + "body{padding:12px 15px;margin:0;" + "background:#" + getHexRGBColor( + context, + if (isLightTheme) R.color.light_license_background_color + else R.color.dark_license_background_color + ) + ";" + "color:#" + getHexRGBColor( + context, + if (isLightTheme) R.color.light_license_text_color + else R.color.dark_license_text_color + ) + "}" + "a[href]{color:#" + getHexRGBColor( + context, + if (isLightTheme) R.color.light_youtube_primary_color + else R.color.dark_youtube_primary_color + ) + "}" + "pre{white-space:pre-wrap}" + ) } /** diff --git a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java index 4f4fd5283..df804136a 100644 --- a/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java +++ b/app/src/main/java/org/schabi/newpipe/util/NavigationHelper.java @@ -62,7 +62,8 @@ public final class NavigationHelper { public static final String MAIN_FRAGMENT_TAG = "main_fragment_tag"; public static final String SEARCH_FRAGMENT_TAG = "search_fragment_tag"; - private NavigationHelper() { } + private NavigationHelper() { + } /*////////////////////////////////////////////////////////////////////////// // Players @@ -111,18 +112,22 @@ public final class NavigationHelper { public static void playOnMainPlayer(final AppCompatActivity activity, @NonNull final PlayQueue playQueue) { final PlayQueueItem item = playQueue.getItem(); - assert item != null; - openVideoDetailFragment(activity, activity.getSupportFragmentManager(), - item.getServiceId(), item.getUrl(), item.getTitle(), playQueue, false); + if (item != null) { + openVideoDetailFragment(activity, activity.getSupportFragmentManager(), + item.getServiceId(), item.getUrl(), item.getTitle(), playQueue, + false); + } } public static void playOnMainPlayer(final Context context, @NonNull final PlayQueue playQueue, final boolean switchingPlayers) { final PlayQueueItem item = playQueue.getItem(); - assert item != null; - openVideoDetail(context, - item.getServiceId(), item.getUrl(), item.getTitle(), playQueue, switchingPlayers); + if (item != null) { + openVideoDetail(context, + item.getServiceId(), item.getUrl(), item.getTitle(), playQueue, + switchingPlayers); + } } public static void playOnPopupPlayer(final Context context, From 279e4c2fa861244388ef6f4352965c567d9b5191 Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Wed, 31 Mar 2021 11:44:43 -0400 Subject: [PATCH 57/91] Update Android Studio --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index b2593ab42..315625a0f 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:4.1.2' + classpath 'com.android.tools.build:gradle:4.1.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // NOTE: Do not place your application dependencies here; they belong From e17bfa029c7ce14ed78ed4de543b893937c26c52 Mon Sep 17 00:00:00 2001 From: TacoTheDank Date: Wed, 31 Mar 2021 11:49:55 -0400 Subject: [PATCH 58/91] Make the dependencies block much easier to read --- app/build.gradle | 118 +++++++++++++++++++++++++++-------------------- 1 file changed, 69 insertions(+), 49 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 66de11377..e8518890c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -96,16 +96,19 @@ android { } ext { - icepickVersion = '3.2.0' checkstyleVersion = '8.38' - stethoVersion = '1.5.1' - leakCanaryVersion = '2.5' - exoPlayerVersion = '2.13.2' + androidxLifecycleVersion = '2.2.0' androidxRoomVersion = '2.3.0-alpha03' + + icepickVersion = '3.2.0' + exoPlayerVersion = '2.13.2' + googleAutoServiceVersion = '1.0-rc7' groupieVersion = '2.8.1' markwonVersion = '4.6.0' - googleAutoServiceVersion = '1.0-rc7' + + leakCanaryVersion = '2.5' + stethoVersion = '1.5.1' mockitoVersion = '3.6.0' } @@ -171,82 +174,99 @@ sonarqube { } dependencies { +/** Desugaring **/ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.1' +/** NewPipe libraries **/ + // You can use a local version by uncommenting a few lines in settings.gradle + implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' + implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.21.0' + +/** Checkstyle **/ + checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}" + ktlint 'com.pinterest:ktlint:0.40.0' + +/** Kotlin **/ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlin_version}" - implementation "frankiesardo:icepick:${icepickVersion}" - kapt "frankiesardo:icepick-processor:${icepickVersion}" - - checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}" - ktlint "com.pinterest:ktlint:0.40.0" - - debugImplementation "com.facebook.stetho:stetho:${stethoVersion}" - debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoVersion}" - - debugImplementation "com.squareup.leakcanary:leakcanary-android:${leakCanaryVersion}" - implementation "com.squareup.leakcanary:leakcanary-object-watcher-android:${leakCanaryVersion}" - implementation "com.squareup.leakcanary:plumber-android:${leakCanaryVersion}" - - implementation "androidx.multidex:multidex:2.0.1" - - // NewPipe dependencies - // You can use a local version by uncommenting a few lines in settings.gradle - implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.21.0' - implementation "com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751" - - implementation "org.jsoup:jsoup:1.13.1" - - //noinspection GradleDependency --> do not update okhttp to keep supporting Android 4.4 users - implementation "com.squareup.okhttp3:okhttp:3.12.13" - - implementation "com.google.android.exoplayer:exoplayer:${exoPlayerVersion}" - implementation "com.google.android.exoplayer:extension-mediasession:${exoPlayerVersion}" - - implementation "com.google.android.material:material:1.2.1" - - compileOnly "com.google.auto.service:auto-service-annotations:${googleAutoServiceVersion}" - kapt "com.google.auto.service:auto-service:${googleAutoServiceVersion}" - - implementation "androidx.appcompat:appcompat:1.2.0" - implementation "androidx.preference:preference:1.1.1" - implementation "androidx.recyclerview:recyclerview:1.1.0" - implementation "androidx.cardview:cardview:1.0.0" - implementation "androidx.constraintlayout:constraintlayout:2.0.4" +/** AndroidX **/ + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.cardview:cardview:1.0.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' implementation 'androidx.core:core-ktx:1.3.2' implementation 'androidx.documentfile:documentfile:1.0.1' - implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' - implementation 'androidx.media:media:1.2.1' - implementation 'androidx.webkit:webkit:1.4.0' - implementation "androidx.lifecycle:lifecycle-livedata:${androidxLifecycleVersion}" implementation "androidx.lifecycle:lifecycle-viewmodel:${androidxLifecycleVersion}" - + implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' + implementation 'androidx.media:media:1.2.1' + implementation 'androidx.multidex:multidex:2.0.1' + implementation 'androidx.preference:preference:1.1.1' + implementation 'androidx.recyclerview:recyclerview:1.1.0' implementation "androidx.room:room-runtime:${androidxRoomVersion}" implementation "androidx.room:room-rxjava3:${androidxRoomVersion}" kapt "androidx.room:room-compiler:${androidxRoomVersion}" + implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' + implementation 'androidx.webkit:webkit:1.4.0' + implementation 'com.google.android.material:material:1.2.1' - implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" +/** Third-party libraries **/ + // Instance state boilerplate elimination + implementation "frankiesardo:icepick:${icepickVersion}" + kapt "frankiesardo:icepick-processor:${icepickVersion}" + // HTML parser + implementation "org.jsoup:jsoup:1.13.1" + + // HTTP client + //noinspection GradleDependency --> do not update okhttp to keep supporting Android 4.4 users + implementation "com.squareup.okhttp3:okhttp:3.12.13" + + // Media player + implementation "com.google.android.exoplayer:exoplayer:${exoPlayerVersion}" + implementation "com.google.android.exoplayer:extension-mediasession:${exoPlayerVersion}" + + // Metadata generator for service descriptors + compileOnly "com.google.auto.service:auto-service-annotations:${googleAutoServiceVersion}" + kapt "com.google.auto.service:auto-service:${googleAutoServiceVersion}" + + // Manager for complex RecyclerView layouts implementation "com.xwray:groupie:${groupieVersion}" implementation "com.xwray:groupie-viewbinding:${groupieVersion}" + // Circular ImageView implementation "de.hdodenhof:circleimageview:3.1.0" + // Image loading implementation "com.nostra13.universalimageloader:universal-image-loader:1.9.5" + // Markdown library for Android implementation "io.noties.markwon:core:${markwonVersion}" implementation "io.noties.markwon:linkify:${markwonVersion}" + // File picker implementation "com.nononsenseapps:filepicker:4.2.1" + // Crash reporting implementation "ch.acra:acra-core:5.7.0" + // Reactive extensions for Java VM implementation "io.reactivex.rxjava3:rxjava:3.0.7" implementation "io.reactivex.rxjava3:rxandroid:3.0.0" + // RxJava binding APIs for Android UI widgets implementation "com.jakewharton.rxbinding4:rxbinding:4.0.0" + // Date and time formatting implementation "org.ocpsoft.prettytime:prettytime:5.0.0.Final" +/** Debugging **/ + // Memory leak detection + implementation "com.squareup.leakcanary:leakcanary-object-watcher-android:${leakCanaryVersion}" + implementation "com.squareup.leakcanary:plumber-android:${leakCanaryVersion}" + debugImplementation "com.squareup.leakcanary:leakcanary-android:${leakCanaryVersion}" + // Debug bridge for Android + debugImplementation "com.facebook.stetho:stetho:${stethoVersion}" + debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoVersion}" + +/** Testing **/ testImplementation 'junit:junit:4.13.1' testImplementation "org.mockito:mockito-core:${mockitoVersion}" testImplementation "org.mockito:mockito-inline:${mockitoVersion}" From 4fdc5ea646840127ca8aeccab1f95f5bf8701e0c Mon Sep 17 00:00:00 2001 From: krlvm <51774833+krlvm@users.noreply.github.com> Date: Wed, 31 Mar 2021 19:07:27 +0300 Subject: [PATCH 59/91] Fix player controls colors on large screens --- app/src/main/res/layout-large-land/player.xml | 3 ++- app/src/main/res/layout/player.xml | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/layout-large-land/player.xml b/app/src/main/res/layout-large-land/player.xml index 8736a470f..12dc132a5 100644 --- a/app/src/main/res/layout-large-land/player.xml +++ b/app/src/main/res/layout-large-land/player.xml @@ -5,7 +5,8 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/black" - android:gravity="center"> + android:gravity="center" + android:theme="@style/WhiteTintTheme"> + android:theme="@style/WhiteTintTheme"> Date: Wed, 31 Mar 2021 20:17:58 +0300 Subject: [PATCH 60/91] Fix subscription picker colors on API 19 --- .../local/subscription/dialog/FeedGroupDialog.kt | 10 ++++++++++ app/src/main/res/layout/toolbar_search_layout.xml | 1 + 2 files changed, 11 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt index 908bea00c..2918bcd66 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/dialog/FeedGroupDialog.kt @@ -1,6 +1,7 @@ package org.schabi.newpipe.local.subscription.dialog import android.app.Dialog +import android.content.res.ColorStateList import android.os.Bundle import android.os.Parcelable import android.view.LayoutInflater @@ -12,6 +13,7 @@ import androidx.core.content.getSystemService import androidx.core.os.bundleOf import androidx.core.view.isGone import androidx.core.view.isVisible +import androidx.core.widget.ImageViewCompat import androidx.core.widget.doOnTextChanged import androidx.fragment.app.DialogFragment import androidx.lifecycle.Observer @@ -123,6 +125,14 @@ class FeedGroupDialog : DialogFragment(), BackPressable { _feedGroupCreateBinding = DialogFeedGroupCreateBinding.bind(view) _searchLayoutBinding = feedGroupCreateBinding.subscriptionsHeaderSearchContainer + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.LOLLIPOP) { + // KitKat doesn't apply container's theme to content + val contrastColor = ColorStateList.valueOf(resources.getColor(R.color.contrastColor)) + searchLayoutBinding.toolbarSearchEditText.setTextColor(contrastColor) + searchLayoutBinding.toolbarSearchEditText.setHintTextColor(contrastColor.withAlpha(128)) + ImageViewCompat.setImageTintList(searchLayoutBinding.toolbarSearchClearIcon, contrastColor) + } + viewModel = ViewModelProvider( this, FeedGroupDialogViewModel.Factory( diff --git a/app/src/main/res/layout/toolbar_search_layout.xml b/app/src/main/res/layout/toolbar_search_layout.xml index 38128e2c7..ce77af6af 100644 --- a/app/src/main/res/layout/toolbar_search_layout.xml +++ b/app/src/main/res/layout/toolbar_search_layout.xml @@ -42,6 +42,7 @@ android:background="?attr/selectableItemBackgroundBorderless" /> Date: Wed, 31 Mar 2021 20:16:08 +0200 Subject: [PATCH 61/91] Rename related streams to related items --- .../fragments/detail/VideoDetailFragment.java | 38 +++++++++---------- ...ragment.java => RelatedItemsFragment.java} | 38 +++++++++---------- .../event/CustomBottomSheetBehavior.java | 2 +- .../newpipe/player/helper/PlayerHelper.java | 8 ++-- ...edStreamInfo.java => RelatedItemInfo.java} | 16 ++++---- .../fragment_video_detail.xml | 2 +- ...streams.xml => fragment_related_items.xml} | 0 ...ms_header.xml => related_items_header.xml} | 0 app/src/main/res/values-ar/strings.xml | 2 +- .../main/res/values-b+zh+HANS+CN/strings.xml | 2 +- app/src/main/res/values-bn/strings.xml | 2 +- app/src/main/res/values-ca/strings.xml | 2 +- app/src/main/res/values-cs/strings.xml | 2 +- app/src/main/res/values-de/strings.xml | 2 +- app/src/main/res/values-el/strings.xml | 2 +- app/src/main/res/values-es/strings.xml | 2 +- app/src/main/res/values-eu/strings.xml | 2 +- app/src/main/res/values-fi/strings.xml | 2 +- app/src/main/res/values-fr/strings.xml | 2 +- app/src/main/res/values-he/strings.xml | 2 +- app/src/main/res/values-hi/strings.xml | 2 +- app/src/main/res/values-hr/strings.xml | 2 +- app/src/main/res/values-in/strings.xml | 2 +- app/src/main/res/values-it/strings.xml | 2 +- app/src/main/res/values-ja/strings.xml | 2 +- app/src/main/res/values-kmr/strings.xml | 2 +- app/src/main/res/values-ku/strings.xml | 2 +- app/src/main/res/values-lv/strings.xml | 2 +- app/src/main/res/values-nb-rNO/strings.xml | 2 +- app/src/main/res/values-nl/strings.xml | 2 +- app/src/main/res/values-pl/strings.xml | 2 +- app/src/main/res/values-pt-rBR/strings.xml | 2 +- app/src/main/res/values-pt-rPT/strings.xml | 2 +- app/src/main/res/values-pt/strings.xml | 2 +- app/src/main/res/values-ro/strings.xml | 2 +- app/src/main/res/values-ru/strings.xml | 2 +- app/src/main/res/values-sc/strings.xml | 2 +- app/src/main/res/values-sk/strings.xml | 2 +- app/src/main/res/values-sl/strings.xml | 2 +- app/src/main/res/values-so/strings.xml | 2 +- app/src/main/res/values-sq/strings.xml | 2 +- app/src/main/res/values-tr/strings.xml | 2 +- app/src/main/res/values-ur/strings.xml | 2 +- app/src/main/res/values-vi/strings.xml | 2 +- app/src/main/res/values-zh-rTW/strings.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 46 files changed, 90 insertions(+), 90 deletions(-) rename app/src/main/java/org/schabi/newpipe/fragments/list/videos/{RelatedVideosFragment.java => RelatedItemsFragment.java} (80%) rename app/src/main/java/org/schabi/newpipe/util/{RelatedStreamInfo.java => RelatedItemInfo.java} (54%) rename app/src/main/res/layout/{fragment_related_streams.xml => fragment_related_items.xml} (100%) rename app/src/main/res/layout/{related_streams_header.xml => related_items_header.xml} (100%) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index a5dfe2057..e5cf28bdf 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -73,7 +73,7 @@ import org.schabi.newpipe.fragments.BackPressable; import org.schabi.newpipe.fragments.BaseStateFragment; import org.schabi.newpipe.fragments.EmptyFragment; import org.schabi.newpipe.fragments.list.comments.CommentsFragment; -import org.schabi.newpipe.fragments.list.videos.RelatedVideosFragment; +import org.schabi.newpipe.fragments.list.videos.RelatedItemsFragment; import org.schabi.newpipe.ktx.AnimationType; import org.schabi.newpipe.local.dialog.PlaylistAppendDialog; import org.schabi.newpipe.local.dialog.PlaylistCreationDialog; @@ -153,7 +153,7 @@ public final class VideoDetailFragment // tabs private boolean showComments; - private boolean showRelatedStreams; + private boolean showRelatedItems; private boolean showDescription; private String selectedTabTag; @AttrRes @NonNull final List tabIcons = new ArrayList<>(); @@ -280,7 +280,7 @@ public final class VideoDetailFragment final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity); showComments = prefs.getBoolean(getString(R.string.show_comments_key), true); - showRelatedStreams = prefs.getBoolean(getString(R.string.show_next_video_key), true); + showRelatedItems = prefs.getBoolean(getString(R.string.show_next_video_key), true); showDescription = prefs.getBoolean(getString(R.string.show_description_key), true); selectedTabTag = prefs.getString( getString(R.string.stream_info_selected_tab_key), COMMENTS_TAB_TAG); @@ -413,7 +413,7 @@ public final class VideoDetailFragment showComments = sharedPreferences.getBoolean(key, true); tabSettingsChanged = true; } else if (key.equals(getString(R.string.show_next_video_key))) { - showRelatedStreams = sharedPreferences.getBoolean(key, true); + showRelatedItems = sharedPreferences.getBoolean(key, true); tabSettingsChanged = true; } else if (key.equals(getString(R.string.show_description_key))) { showComments = sharedPreferences.getBoolean(key, true); @@ -927,11 +927,11 @@ public final class VideoDetailFragment tabContentDescriptions.add(R.string.comments_tab_description); } - if (showRelatedStreams && binding.relatedStreamsLayout == null) { + if (showRelatedItems && binding.relatedItemsLayout == null) { // temp empty fragment. will be updated in handleResult pageAdapter.addFragment(new EmptyFragment(false), RELATED_TAB_TAG); tabIcons.add(R.drawable.ic_art_track_white_24dp); - tabContentDescriptions.add(R.string.related_streams_tab_description); + tabContentDescriptions.add(R.string.related_items_tab_description); } if (showDescription) { @@ -974,14 +974,14 @@ public final class VideoDetailFragment } private void updateTabs(@NonNull final StreamInfo info) { - if (showRelatedStreams) { - if (binding.relatedStreamsLayout == null) { // phone - pageAdapter.updateItem(RELATED_TAB_TAG, RelatedVideosFragment.getInstance(info)); + if (showRelatedItems) { + if (binding.relatedItemsLayout == null) { // phone + pageAdapter.updateItem(RELATED_TAB_TAG, RelatedItemsFragment.getInstance(info)); } else { // tablet + TV getChildFragmentManager().beginTransaction() - .replace(R.id.relatedStreamsLayout, RelatedVideosFragment.getInstance(info)) + .replace(R.id.relatedItemsLayout, RelatedItemsFragment.getInstance(info)) .commitAllowingStateLoss(); - binding.relatedStreamsLayout.setVisibility( + binding.relatedItemsLayout.setVisibility( player != null && player.isFullscreen() ? View.GONE : View.VISIBLE); } } @@ -1331,8 +1331,8 @@ public final class VideoDetailFragment super.handleError(); setErrorImage(R.drawable.not_available_monkey); - if (binding.relatedStreamsLayout != null) { // hide related streams for tablets - binding.relatedStreamsLayout.setVisibility(View.INVISIBLE); + if (binding.relatedItemsLayout != null) { // hide related streams for tablets + binding.relatedItemsLayout.setVisibility(View.INVISIBLE); } // hide comments / related streams / description tabs @@ -1426,12 +1426,12 @@ public final class VideoDetailFragment binding.detailTitleRootLayout.setClickable(false); binding.detailSecondaryControlPanel.setVisibility(View.GONE); - if (binding.relatedStreamsLayout != null) { - if (showRelatedStreams) { - binding.relatedStreamsLayout.setVisibility( + if (binding.relatedItemsLayout != null) { + if (showRelatedItems) { + binding.relatedItemsLayout.setVisibility( player != null && player.isFullscreen() ? View.GONE : View.INVISIBLE); } else { - binding.relatedStreamsLayout.setVisibility(View.GONE); + binding.relatedItemsLayout.setVisibility(View.GONE); } } @@ -1843,8 +1843,8 @@ public final class VideoDetailFragment showSystemUi(); } - if (binding.relatedStreamsLayout != null) { - binding.relatedStreamsLayout.setVisibility(fullscreen ? View.GONE : View.VISIBLE); + if (binding.relatedItemsLayout != null) { + binding.relatedItemsLayout.setVisibility(fullscreen ? View.GONE : View.VISIBLE); } scrollToTop(); diff --git a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java similarity index 80% rename from app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java rename to app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java index 902df94bc..a66b7d569 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedVideosFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/list/videos/RelatedItemsFragment.java @@ -15,38 +15,38 @@ import androidx.preference.PreferenceManager; import androidx.viewbinding.ViewBinding; import org.schabi.newpipe.R; -import org.schabi.newpipe.databinding.RelatedStreamsHeaderBinding; +import org.schabi.newpipe.databinding.RelatedItemsHeaderBinding; import org.schabi.newpipe.error.UserAction; import org.schabi.newpipe.extractor.ListExtractor; import org.schabi.newpipe.extractor.stream.StreamInfo; import org.schabi.newpipe.fragments.list.BaseListInfoFragment; import org.schabi.newpipe.ktx.ViewUtils; -import org.schabi.newpipe.util.RelatedStreamInfo; +import org.schabi.newpipe.util.RelatedItemInfo; import java.io.Serializable; import io.reactivex.rxjava3.core.Single; import io.reactivex.rxjava3.disposables.CompositeDisposable; -public class RelatedVideosFragment extends BaseListInfoFragment +public class RelatedItemsFragment extends BaseListInfoFragment implements SharedPreferences.OnSharedPreferenceChangeListener { private static final String INFO_KEY = "related_info_key"; private final CompositeDisposable disposables = new CompositeDisposable(); - private RelatedStreamInfo relatedStreamInfo; + private RelatedItemInfo relatedItemInfo; /*////////////////////////////////////////////////////////////////////////// // Views //////////////////////////////////////////////////////////////////////////*/ - private RelatedStreamsHeaderBinding headerBinding; + private RelatedItemsHeaderBinding headerBinding; - public static RelatedVideosFragment getInstance(final StreamInfo info) { - final RelatedVideosFragment instance = new RelatedVideosFragment(); + public static RelatedItemsFragment getInstance(final StreamInfo info) { + final RelatedItemsFragment instance = new RelatedItemsFragment(); instance.setInitialData(info); return instance; } - public RelatedVideosFragment() { + public RelatedItemsFragment() { super(UserAction.REQUESTED_STREAM); } @@ -63,7 +63,7 @@ public class RelatedVideosFragment extends BaseListInfoFragment loadResult(final boolean forceLoad) { - return Single.fromCallable(() -> relatedStreamInfo); + protected Single loadResult(final boolean forceLoad) { + return Single.fromCallable(() -> relatedItemInfo); } @Override @@ -120,7 +120,7 @@ public class RelatedVideosFragment extends BaseListInfoFragment Rect globalRect = new Rect(); private boolean skippingInterception = false; private final List skipInterceptionOfElements = Arrays.asList( - R.id.detail_content_root_layout, R.id.relatedStreamsLayout, + R.id.detail_content_root_layout, R.id.relatedItemsLayout, R.id.itemsListPanel, R.id.view_pager, R.id.tab_layout, R.id.bottomControls, R.id.playPauseButton, R.id.playPreviousButton, R.id.playNextButton); diff --git a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java index aab3a8d49..0a3ea908a 100644 --- a/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java +++ b/app/src/main/java/org/schabi/newpipe/player/helper/PlayerHelper.java @@ -180,10 +180,10 @@ public final class PlayerHelper { * if a candidate next video's url already exists in the existing items. *

*

- * The first item in {@link StreamInfo#getRelatedStreams()} is checked first. + * The first item in {@link StreamInfo#getRelatedItems()} is checked first. * If it is non-null and is not part of the existing items, it will be used as the next stream. - * Otherwise, a random item with non-repeating url will be selected - * from the {@link StreamInfo#getRelatedStreams()}. + * Otherwise, a random stream with non-repeating url will be selected + * from the {@link StreamInfo#getRelatedItems()}. Non-stream items are ignored. *

* * @param info currently playing stream @@ -198,7 +198,7 @@ public final class PlayerHelper { urls.add(item.getUrl()); } - final List relatedItems = info.getRelatedStreams(); + final List relatedItems = info.getRelatedItems(); if (Utils.isNullOrEmpty(relatedItems)) { return null; } diff --git a/app/src/main/java/org/schabi/newpipe/util/RelatedStreamInfo.java b/app/src/main/java/org/schabi/newpipe/util/RelatedItemInfo.java similarity index 54% rename from app/src/main/java/org/schabi/newpipe/util/RelatedStreamInfo.java rename to app/src/main/java/org/schabi/newpipe/util/RelatedItemInfo.java index 81e203b1f..f96bb0d54 100644 --- a/app/src/main/java/org/schabi/newpipe/util/RelatedStreamInfo.java +++ b/app/src/main/java/org/schabi/newpipe/util/RelatedItemInfo.java @@ -9,19 +9,19 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -public class RelatedStreamInfo extends ListInfo { - public RelatedStreamInfo(final int serviceId, final ListLinkHandler listUrlIdHandler, - final String name) { +public class RelatedItemInfo extends ListInfo { + public RelatedItemInfo(final int serviceId, final ListLinkHandler listUrlIdHandler, + final String name) { super(serviceId, listUrlIdHandler, name); } - public static RelatedStreamInfo getInfo(final StreamInfo info) { + public static RelatedItemInfo getInfo(final StreamInfo info) { final ListLinkHandler handler = new ListLinkHandler( info.getOriginalUrl(), info.getUrl(), info.getId(), Collections.emptyList(), null); - final RelatedStreamInfo relatedStreamInfo = new RelatedStreamInfo( + final RelatedItemInfo relatedItemInfo = new RelatedItemInfo( info.getServiceId(), handler, info.getName()); - final List streams = new ArrayList<>(info.getRelatedStreams()); - relatedStreamInfo.setRelatedItems(streams); - return relatedStreamInfo; + final List relatedItems = new ArrayList<>(info.getRelatedItems()); + relatedItemInfo.setRelatedItems(relatedItems); + return relatedItemInfo; } } diff --git a/app/src/main/res/layout-large-land/fragment_video_detail.xml b/app/src/main/res/layout-large-land/fragment_video_detail.xml index e68ee76d8..b8869862a 100644 --- a/app/src/main/res/layout-large-land/fragment_video_detail.xml +++ b/app/src/main/res/layout-large-land/fragment_video_detail.xml @@ -613,7 +613,7 @@ لا يوجد تطبيق على جهازك يمكنه فتح هذا
فصول وصف - التيارات ذات الصلة + التيارات ذات الصلة تعليقات قم بإيقاف التشغيل لإخفاء وصف الفيديو والمعلومات الإضافية إظهار الوصف diff --git a/app/src/main/res/values-b+zh+HANS+CN/strings.xml b/app/src/main/res/values-b+zh+HANS+CN/strings.xml index 3baa4e2be..54d747ac3 100644 --- a/app/src/main/res/values-b+zh+HANS+CN/strings.xml +++ b/app/src/main/res/values-b+zh+HANS+CN/strings.xml @@ -652,7 +652,7 @@ 显示简介 章节 简介 - 相关视频 + 相关视频 评论 显示视频描述和其他信息 用…打开 diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 2decfb6cc..00ecdf22b 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -491,7 +491,7 @@ সাম্প্রতিক ইন্সট্যান্স ইতোমধ্যে বিদ্যমান ডিফল্ট কন্টেন্টের দেশ - সম্পর্কিত স্ট্রিম + সম্পর্কিত স্ট্রিম বর্ণনা দেখাও হ্যাশ গণনা করা হচ্ছে থাম্বনেইল দেখাও diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 6f6308f8c..248672b7e 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -669,7 +669,7 @@ El vostre dispositiu no té cap aplicació capaç d\'obrir aquest tipus de contingut Força l\'aturada de l\'aplicació Resol - Reproduccions en directe relacionades + Reproduccions en directe relacionades Aquest vídeo té restriccions d\'edat. \nDegut a la nova política d\'edat de YouTube, el NewPipe no pot accedir a aquest contingut i per tant no pot reproduir-lo. Desactiveu per amagar la descripció i la informació addicional del vídeo diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index dbcdf951e..03211ab9c 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -670,7 +670,7 @@ Zobrazit popis Otevřít s Na Vašem zařízení není aplikace, která to umí otevřít - Podobné strýmy + Podobné strýmy Vypnout pro skrytí popisu videa a doplňkové informace Zbořit aplikaci \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index f7f8cd072..c6dda6f1c 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -656,7 +656,7 @@ Deaktiviere diese Option, um Meta-Infofelder mit zusätzlichen Informationen zum Stream-Ersteller, zum Stream-Inhalt oder zu einer Suchanforderung auszublenden. Kapitel Beschreibung - Verwandte Streams + Verwandte Streams Kommentare Ausschalten, um Videobeschreibung und Zusatzinformationen auszublenden Beschreibung anzeigen diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index a4f219d21..d96436101 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -656,7 +656,7 @@ Εμφάνιση μεταδεδομένων Κεφάλαια Περιγραφή - Σχετιζόμενες ροές + Σχετιζόμενες ροές Σχόλια Απενεργοποιήστε για απόκρυψη περιγραφής και πρόσθετων πληροφοριών Εμφάνιση περιγραφής diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 729fec623..29f2bf845 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -658,7 +658,7 @@ Recientes Calculando el hash Descripción - Transmisiones relacionadas + Transmisiones relacionadas Comentarios Notificaciones sobre el progreso del hashing del vídeo Notificación del hash de vídeo diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index 07cdcadf4..a2cc35f2d 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -657,7 +657,7 @@ Ez dago zure gailuan hau ireki dezakeen aplikaziorik Kapituluak Deskribapena - Erlazionatutako jarioak + Erlazionatutako jarioak Iruzkinak Desaktibatu bideoaren deskribapena eta informazio gehigarria ezkutatzeko Erakutsi deskribapena diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index b037623b2..57a13288d 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -658,6 +658,6 @@ Mikään sovellus laitteessasi ei voi avata tätä Jaksot Kuvaus - Samankaltaiset striimit + Samankaltaiset striimit Kommentit \ No newline at end of file diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 90299ef77..5cef43076 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -661,7 +661,7 @@ Aucune application sur votre appareil ne peut ouvrir ceci Chapitres Description - Flux associés + Flux associés Commentaires Désactiver pour masquer la description de la vidéo et les informations supplémentaires Afficher la description diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 24a5c4d3a..a515b8cef 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -676,7 +676,7 @@ הצגת מידע על פרקים תיאור - תזרימים קשורים + תזרימים קשורים הערות יש לכבות כדי להסתיר תיאורי סרטונים ומידע נוסף הצגת תיאור diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 530af1ea7..a21a29b00 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -585,7 +585,7 @@ ∞ विडीओ १००+ विडीओ विवरण - संबंधित स्ट्रीमस + संबंधित स्ट्रीमस टिप्पणियाँ कृपया जांचें लें कि क्या आपके क्रैश पर चर्चा करने वाला मुद्दा पहले से मौजूद है। डुप्लिकेट टिकट बनाते समय, आप हमसे समय लेते हैं जो हम वास्तविक बग को ठीक करने के साथ खर्च कर सकते हैं। गिटहब पर रिपोर्ट करें diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 5d6fafd82..1f34ba934 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -664,7 +664,7 @@ Nedavni Isključi za skrivanje polja metapodataka s dodatnim podacima o autoru streama, sadržaju streama ili zahtjevu za pretraživanje. Prikaži metapodatke - Slični videozapisi + Slični videozapisi Nijedna aplikacija na vašem uređaju ne može to otvoriti Poglavlja videozapisa Opis diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index ec57ea849..9a6570d5e 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -647,7 +647,7 @@ Tidak ada apl di perangkat Anda yang bisa membuka ini Chapter Deskripsi - Stream terkait + Stream terkait Komentar Nonaktifkan untuk menyembunyikan deskripsi dan informasi tambahan Tampilkan deskripsi diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a62c2bbb2..9ca1ade5a 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -654,7 +654,7 @@ Recente Disattiva per nascondere i riquadri con informazioni aggiuntive sul contenuto, sul suo creatore o su una richiesta di ricerca. Mostra meta-informazioni - Contenuti correlati + Contenuti correlati Capitoli Descrizione Commenti diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index 8f83e28f9..7efaabb90 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -648,7 +648,7 @@ 最近 開く 説明 - 関連動画 + 関連動画 動画作成者、動画コンテンツ、検索リクエストに関する追加情報を含むメタ情報ボックスを非表示にするにはオフにします。 お使いのデバイス上のアプリでは、これを開くことはできません チャプター diff --git a/app/src/main/res/values-kmr/strings.xml b/app/src/main/res/values-kmr/strings.xml index 75ca42bc8..8f03299b1 100644 --- a/app/src/main/res/values-kmr/strings.xml +++ b/app/src/main/res/values-kmr/strings.xml @@ -73,7 +73,7 @@ (Ceribandî) Ji bo nepeniya zêde trafîka dakêşanê bi rêya Tor bikişîne (vîdyoyên weşanê hîn piştgirî nabin). Tor bikar bînin Terîf - Çemên pêwendîdar + Çemên pêwendîdar Îrove Hejmara nefretan Evîn diff --git a/app/src/main/res/values-ku/strings.xml b/app/src/main/res/values-ku/strings.xml index 8025242e4..944f9b8c8 100644 --- a/app/src/main/res/values-ku/strings.xml +++ b/app/src/main/res/values-ku/strings.xml @@ -630,7 +630,7 @@ دوایین پیشاندانی وێنۆچکە وەسف - پەخشی لێکچوو + پەخشی لێکچوو لێدوانەکان شەکرۆکەکانی reCAPTCHA سڕانەوە سڕینەوەی شەکرۆکەکانی RECAPTCHA diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index f06a85ff5..455a972a8 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -181,7 +181,7 @@ (Eksperimentāls) Piespiediet lejupielādēt saturu caur Tor, lai palielinātu privātumu (tiešraides vēl nav atbalstītas). Izmantojiet Tor Apraksts - Līdzīgi video + Līdzīgi video Komentāri Nepatīk Patīk diff --git a/app/src/main/res/values-nb-rNO/strings.xml b/app/src/main/res/values-nb-rNO/strings.xml index 824be52d5..25391c1ed 100644 --- a/app/src/main/res/values-nb-rNO/strings.xml +++ b/app/src/main/res/values-nb-rNO/strings.xml @@ -657,7 +657,7 @@ Ingen programmer på enheten din kan åpne dette Kapitler Beskrivelse - Relaterte strømmer + Relaterte strømmer Kommentarer Skru av for å skjule videobeskrivelse og ytterligere info Vis beskrivelse diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 7d0171904..d3b6ea937 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -658,7 +658,7 @@ Toon beschrijving Geen app op je apparaat kan dit openen Hoofdstukken - Gerelateerde streams + Gerelateerde streams Commentaar Schakel dit uit om video beschrijvingen en additionele informatie te verbergen Openen met diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 707bbc620..a39553880 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -671,7 +671,7 @@ Pokaż opis Otwórz za pomocą Żadna aplikacja na Twoim urządzeniu nie może tego otworzyć - Powiązane strumienie + Powiązane strumienie Awaria aplikacji Ta zawartość jest płatna, więc jest dostępna tylko dla użytkowników, którzy za nią zapłacili, dlatego nie może być przesyłana strumieniowo lub pobierana przez NewPipe. Ten film jest dostępny tylko dla subskrybentów YouTube Music Premium, więc nie może być przesyłany strumieniowo ani pobierany przez NewPipe. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index 2d5210f8e..ffe008a48 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -656,7 +656,7 @@ Recentes Capítulos Descrição - Transmissões relacionadas + Transmissões relacionadas Comentários Desative para ocultar a descrição do vídeo e informações adicionais Mostrar descrição diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index baac54c18..4d9e692d1 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -657,7 +657,7 @@ Não possui qualquer aplicação para abrir este ficheiro Capítulos Descrição - Emissões relacionadas + Emissões relacionadas Comentários Desative para ocultar a descrição do vídeo e informações adicionais Mostrar descrição diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 3a08e14e3..0e492831c 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -657,7 +657,7 @@ Não possui qualquer aplicação para abrir este ficheiro Capítulos Descrição - Emissões relacionadas + Emissões relacionadas Comentários Desative para ocultar a descrição do vídeo e informações adicionais Mostrar descrição diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 7696ffb7c..71fda40c8 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -664,7 +664,7 @@ Nimeni nu se uită Comutare serviciu, selectat în prezent: Descriere - Fluxuri corelate + Fluxuri corelate Comentarii Vă rugăm să verificați dacă există deja o problemă legată de crash-ul dvs. Când creați bilete duplicat, ne luați timp pe care l-am putea petrece cu remedierea erorii. Copiați raportul formatat diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index db26e27ed..8058d527c 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -665,7 +665,7 @@ Недавнее Отключите, чтобы скрыть поля метаданных (автор потока, содержимое потока или поисковый запрос). Показать метаданные - Похожие потоки + Похожие потоки Главы Описание Комментарии diff --git a/app/src/main/res/values-sc/strings.xml b/app/src/main/res/values-sc/strings.xml index 2d0b39153..334e68581 100644 --- a/app/src/main/res/values-sc/strings.xml +++ b/app/src/main/res/values-sc/strings.xml @@ -657,7 +657,7 @@ Peruna aplicatzione in su dispositivu tuo podet abèrrere custu Capìtulos Descritzione - Flussos ligados + Flussos ligados Cummentos Istuda pro cuare sa descritzione de su vìdeu e sas informatziones additzionales Ammustra sa descritzione diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 80a564a1e..99bc917bd 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -666,7 +666,7 @@ Zobrazovať meta informácie Kapitoly Popis - Súvisiace streamy + Súvisiace streamy Komentáre Vypnutím skryjete popis videa a ďalšie informácie Zobraziť popis diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 6f71d69bf..12500a528 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -451,7 +451,7 @@ odpiranje v pojavnem načinu Vklop/izklop storitve, trenutno izbrana: Povlecite za preureditev Opis - Podobni pretoki + Podobni pretoki Komentarji Prosimo preverite, če težava, ki opisuje vašo zrušitev aplikacije že obstaja. Ko ustvarite dvojne pripombe, vzamete naš čas, ki bi ga lahko porabili z odpravljanjem dejanske napake. Prijavite na GitHub-u diff --git a/app/src/main/res/values-so/strings.xml b/app/src/main/res/values-so/strings.xml index dea8f2be5..4041bb3ce 100644 --- a/app/src/main/res/values-so/strings.xml +++ b/app/src/main/res/values-so/strings.xml @@ -656,7 +656,7 @@ Faahfaahinta dheeraadka ah Cutubyada Faahfaahin - La xidhiidha + La xidhiidha Faallooyin Xidh si aad u qariso faahfaahinta muuqaalka iyo xogaha dheeraadka ah Tus faahfaahinta diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 9f1e69221..98c1ec742 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -643,7 +643,7 @@ Shfaq pamjen miniaturë Duke llogaritur hash Përshkrimi - Streams të ngjashme + Streams të ngjashme Komentet Njoftimet mbi progresin e hash-imit të videove Njoftimi për Hash e Videos diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 7e0e3726d..5302d8695 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -656,7 +656,7 @@ Üst bilgiyi göster Bölümler Açıklama - İlgili akışlar + İlgili akışlar Yorumlar Video açıklamasını ve ek bilgileri gizlemek için kapatın Açıklamayı göster diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 9d2e40dbe..3c9851452 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -524,7 +524,7 @@ ∞ ویڈیوز 100 سے زائد ویڈیو ‪تفصیل - متعلقہ سلسلے + متعلقہ سلسلے تبصرے براہ کرم چیک کریں کہ آیا آپ کے کریش پر بحث کرنے والا مسئلہ پہلے سے موجود ہے۔ جعلی ٹکٹ تیار کرتے وقت، آپ ہم سے وقت نکالتے ہیں جو ہم اصل مسئلے کو ٹھیک کرنے میں گزار سکتے ہیں۔ گِٹ ہب میں اطلاع دیں diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 769994acc..1cffd2bc0 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -643,7 +643,7 @@ Gần đây Đang tính toán hash Mô tả - Stream liên quan + Stream liên quan Bình luận Thông báo cho quá trình hash video Thông báo hash video diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 8b2875ad0..d3c7c888c 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -646,7 +646,7 @@ 顯示詮釋資訊 章節 描述 - 相關的串流 + 相關的串流 留言 關閉以隱藏影片描述與其他資訊 顯示描述 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f6c899919..6759110b3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -283,7 +283,7 @@ Likes Dislikes Comments - Related streams + Related items Description Use Tor (Experimental) Force download traffic through Tor for increased privacy (streaming videos not yet supported). From 04c5acd1d7b79539476ebcf887609a817000d09d Mon Sep 17 00:00:00 2001 From: Fynn Godau Date: Wed, 31 Mar 2021 22:30:39 +0200 Subject: [PATCH 62/91] Use matching NPE version --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index e8518890c..500f5c052 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -180,7 +180,7 @@ dependencies { /** NewPipe libraries **/ // You can use a local version by uncommenting a few lines in settings.gradle implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751' - implementation 'com.github.TeamNewPipe:NewPipeExtractor:v0.21.0' + implementation 'com.github.fynngodau:NewPipeExtractor:14f6f1b7c3d4a98ac0a74a9f6d16b05cb96c0c91' /** Checkstyle **/ checkstyle "com.puppycrawl.tools:checkstyle:${checkstyleVersion}" From 8df935f5fe6e464852a15ea965c5323d249fa661 Mon Sep 17 00:00:00 2001 From: Saurav Rao <56369484+sauravrao637@users.noreply.github.com> Date: Thu, 1 Apr 2021 18:37:21 +0530 Subject: [PATCH 63/91] NullPointerException on screen rotation during exit fix (#5976) --- .../newpipe/fragments/detail/VideoDetailFragment.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java index a5dfe2057..72e3300ed 100644 --- a/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java +++ b/app/src/main/java/org/schabi/newpipe/fragments/detail/VideoDetailFragment.java @@ -1009,6 +1009,12 @@ public final class VideoDetailFragment } public void updateTabLayoutVisibility() { + + if (binding == null) { + //If binding is null we do not need to and should not do anything with its object(s) + return; + } + if (pageAdapter.getCount() < 2 || binding.viewPager.getVisibility() != View.VISIBLE) { // hide tab layout if there is only one tab or if the view pager is also hidden binding.tabLayout.setVisibility(View.GONE); From e1a6b69f9acfb1fd7d883136c2d584093d85a570 Mon Sep 17 00:00:00 2001 From: PulkitGarg67 Date: Fri, 2 Apr 2021 01:00:15 +0530 Subject: [PATCH 64/91] Functionality to rename playlist name from playlist interface --- .../local/playlist/LocalPlaylistFragment.java | 13 ++++++++----- app/src/main/res/menu/menu_local_playlist.xml | 4 ++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java index 5dbb67cd1..66bd34142 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java @@ -72,7 +72,6 @@ public class LocalPlaylistFragment extends BaseLocalListFragment + Date: Fri, 2 Apr 2021 20:25:22 +0300 Subject: [PATCH 65/91] Remove unused themes --- app/src/main/res/values/styles.xml | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index cc3105152..c543044ca 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -130,25 +130,6 @@ @color/black_settings_accent_color - - - - -