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 2a58f596008..d1a5a86c354 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 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

K7UpUK$>l@ zw`1S}(D?mUXu_C{wupRS-jiX~w=Uqqhf|Vb3Cm9L=T+w91Cu^ z*&Ty%sN?x*h~mJc4g~k{xD4ZmF%FXZNC;oVDwLZ_WvrnzY|{v8hc1nmx4^}Z;yriXsAf+Lp+OFLbR!&Ox?xABwl zu8w&|5pCxmu#$?Cv2_-Vghl2LZ6m7}VLEfR5o2Ou$x02uA-%QB2$c(c1rH3R9hesc zfpn#oqpbKuVsdfV#cv@5pV4^f_!WS+F>SV6N0JQ9E!T90EX((_{bSSFv9ld%I0&}9 zH&Jd4MEX1e0iqDtq~h?DBrxQX1iI0lIs<|kB$Yrh&cpeK0-^K%=FBsCBT46@h#yi!AyDq1V(#V}^;{{V*@T4WJ&U-NTq43w=|K>z8%pr_nC>%C(Wa_l78Ufib$r8Od)IIN=u>417 z`Hl{9A$mI5A(;+-Q&$F&h-@;NR>Z<2U;Y21>>Z;s@0V@SbkMQQj%_;~+qTuQ?c|AV zcWm3XZQHhP&R%QWarS%mJ!9R^&!_)*s(v+VR@I#QrAT}`17Y+l<`b-nvmDNW`De%y zrwTZ9EJrj1AFA>B`1jYDow}~*dfPs}IZMO3=a{Fy#IOILc8F0;JS4x(k-NSpbN@qM z`@aE_e}5{!$v3+qVs7u?sOV(y@1Os*Fgu`fCW9=G@F_#VQ%xf$hj0~wnnP0$hFI+@ zkQj~v#V>xn)u??YutKsX>pxKCl^p!C-o?+9;!Nug^ z{rP!|+KsP5%uF;ZCa5F;O^9TGac=M|=V z_H(PfkV1rz4jl?gJ(ArXMyWT4y(86d3`$iI4^l9`vLdZkzpznSd5Ikfrs8qcSy&>z zTIZgWZGXw0n9ibQxYWE@gI0(3#KA-dAdPcsL_|hg2@~C!VZDM}5;v_Nykfq!*@*Zf zE_wVgx82GMDryKO{U{D>vSzSc%B~|cjDQrt5BN=Ugpsf8H8f1lR4SGo#hCuXPL;QQ z#~b?C4MoepT3X`qdW2dNn& zo8)K}%Lpu>0tQei+{>*VGErz|qjbK#9 zvtd8rcHplw%YyQCKR{kyo6fgg!)6tHUYT(L>B7er5)41iG`j$qe*kSh$fY!PehLcD zWeKZHn<492B34*JUQh=CY1R~jT9Jt=k=jCU2=SL&&y5QI2uAG2?L8qd2U(^AW#{(x zThSy=C#>k+QMo^7caQcpU?Qn}j-`s?1vXuzG#j8(A+RUAY})F@=r&F(8nI&HspAy4 z4>(M>hI9c7?DCW8rw6|23?qQMSq?*Vx?v30U%luBo)B-k2mkL)Ljk5xUha3pK>EEj z@(;tH|M@xkuN?gsz;*bygizwYR!6=(Xgcg^>WlGtRYCozY<rFX2E>kaZo)O<^J7a`MX8Pf`gBd4vrtD|qKn&B)C&wp0O-x*@-|m*0egT=-t@%dD zgP2D+#WPptnc;_ugD6%zN}Z+X4=c61XNLb7L1gWd8;NHrBXwJ7s0ce#lWnnFUMTR& z1_R9Fin4!d17d4jpKcfh?MKRxxQk$@)*hradH2$3)nyXep5Z;B z?yX+-Bd=TqO2!11?MDtG0n(*T^!CIiF@ZQymqq1wPM_X$Iu9-P=^}v7npvvPBu!d$ z7K?@CsA8H38+zjA@{;{kG)#AHME>Ix<711_iQ@WWMObXyVO)a&^qE1GqpP47Q|_AG zP`(AD&r!V^MXQ^e+*n5~Lp9!B+#y3#f8J^5!iC@3Y@P`;FoUH{G*pj*q7MVV)29+j z>BC`a|1@U_v%%o9VH_HsSnM`jZ-&CDvbiqDg)tQEnV>b%Ptm)T|1?TrpIl)Y$LnG_ zzKi5j2Fx^K^PG1=*?GhK;$(UCF-tM~^=Z*+Wp{FSuy7iHt9#4n(sUuHK??@v+6*|10Csdnyg9hAsC5_OrSL;jVkLlf zHXIPukLqbhs~-*oa^gqgvtpgTk_7GypwH><53riYYL*M=Q@F-yEPLqQ&1Sc zZB%w}T~RO|#jFjMWcKMZccxm-SL)s_ig?OC?y_~gLFj{n8D$J_Kw%{r0oB8?@dWzn zB528d-wUBQzrrSSLq?fR!K%59Zv9J4yCQhhDGwhptpA5O5U?Hjqt>8nOD zi{)0CI|&Gu%zunGI*XFZh(ix)q${jT8wnnzbBMPYVJc4HX*9d^mz|21$=R$J$(y7V zo0dxdbX3N#=F$zjstTf*t8vL)2*{XH!+<2IJ1VVFa67|{?LP&P41h$2i2;?N~RA30LV`BsUcj zfO9#Pg1$t}7zpv#&)8`mis3~o+P(DxOMgz-V*(?wWaxi?R=NhtW}<#^Z?(BhSwyar zG|A#Q7wh4OfK<|DAcl9THc-W4*>J4nTevsD%dkj`U~wSUCh15?_N@uMdF^Kw+{agk zJ`im^wDqj`Ev)W3k3stasP`88-M0ZBs7;B6{-tSm3>I@_e-QfT?7|n0D~0RRqDb^G zyHb=is;IwuQ&ITzL4KsP@Z`b$d%B0Wuhioo1CWttW8yhsER1ZUZzA{F*K=wmi-sb#Ju+j z-l@In^IKnb{bQG}Ps>+Vu_W#grNKNGto+yjA)?>0?~X`4I3T@5G1)RqGUZuP^NJCq&^HykuYtMDD8qq+l8RcZNJsvN(10{ zQ1$XcGt}QH-U^WU!-wRR1d--{B$%vY{JLWIV%P4-KQuxxDeJaF#{eu&&r!3Qu{w}0f--8^H|KwE>)ORrcR+2Qf zb})DRcH>k0zWK8@{RX}NYvTF;E~phK{+F;MkIP$)T$93Ba2R2TvKc>`D??#mv9wg$ zd~|-`Qx5LwwsZ2hb*Rt4S9dsF%Cny5<1fscy~)d;0m2r$f=83<->c~!GNyb!U)PA; zq^!`@@)UaG)Ew(9V?5ZBq#c%dCWZrplmuM`o~TyHjAIMh0*#1{B>K4po-dx$Tk-Cq z=WZDkP5x2W&Os`N8KiYHRH#UY*n|nvd(U>yO=MFI-2BEp?x@=N<~CbLJBf6P)}vLS?xJXYJ2^<3KJUdrwKnJnTp{ zjIi|R=L7rn9b*D#Xxr4*R<3T5AuOS+#U8hNlfo&^9JO{VbH!v9^JbK=TCGR-5EWR@ zN8T-_I|&@A}(hKeL4_*eb!1G8p~&_Im8|wc>Cdir+gg90n1dw?QaXcx6Op_W1r=axRw>4;rM*UOpT#Eb9xU1IiWo@h?|5uP zka>-XW0Ikp@dIe;MN8B01a7+5V@h3WN{J=HJ*pe0uwQ3S&MyWFni47X32Q7SyCTNQ z+sR!_9IZa5!>f&V$`q!%H8ci!a|RMx5}5MA_kr+bhtQy{-^)(hCVa@I!^TV4RBi zAFa!Nsi3y37I5EK;0cqu|9MRj<^r&h1lF}u0KpKQD^5Y+LvFEwM zLU@@v4_Na#Axy6tn3P%sD^5P#<7F;sd$f4a7LBMk zGU^RZHBcxSA%kCx*eH&wgA?Qwazm8>9SCSz_!;MqY-QX<1@p$*T8lc?@`ikEqJ>#w zcG``^CoFMAhdEXT9qt47g0IZkaU)4R7wkGs^Ax}usqJ5HfDYAV$!=6?>J6+Ha1I<5 z|6=9soU4>E))tW$<#>F ziZ$6>KJf0bPfbx_)7-}tMINlc=}|H+$uX)mhC6-Hz+XZxsKd^b?RFB6et}O#+>Wmw9Ec9) z{q}XFWp{3@qmyK*Jvzpyqv57LIR;hPXKsrh{G?&dRjF%Zt5&m20Ll?OyfUYC3WRn{cgQ?^V~UAv+5 z&_m#&nIwffgX1*Z2#5^Kl4DbE#NrD&Hi4|7SPqZ}(>_+JMz=s|k77aEL}<=0Zfb)a z%F(*L3zCA<=xO)2U3B|pcTqDbBoFp>QyAEU(jMu8(jLA61-H!ucI804+B!$E^cQQa z)_ERrW3g!B9iLb3nn3dlkvD7KsY?sRvls3QC0qPi>o<)GHx%4Xb$5a3GBTJ(k@`e@ z$RUa^%S15^1oLEmA=sayrP5;9qtf!Z1*?e$ORVPsXpL{jL<6E)0sj&swP3}NPmR%FM?O>SQgN5XfHE< zo(4#Cv11(%Nnw_{_Ro}r6=gKd{k?NebJ~<~Kv0r(r0qe4n3LFx$5%x(BKvrz$m?LG zjLIc;hbj0FMdb9aH9Lpsof#yG$(0sG2%RL;d(n>;#jb!R_+dad+K;Ccw!|RY?uS(a zj~?=&M!4C(5LnlH6k%aYvz@7?xRa^2gml%vn&eKl$R_lJ+e|xsNfXzr#xuh(>`}9g zLHSyiFwK^-p!;p$yt7$F|3*IfO3Mlu9e>Dpx8O`37?fA`cj`C0B-m9uRhJjs^mRp# zWB;Aj6|G^1V6`jg7#7V9UFvnB4((nIwG?k%c7h`?0tS8J3Bn0t#pb#SA}N-|45$-j z$R>%7cc2ebAClXc(&0UtHX<>pd)akR3Kx_cK+n<}FhzmTx!8e9^u2e4%x{>T6pQ`6 zO182bh$-W5A3^wos0SV_TgPmF4WUP-+D25KjbC{y_6W_9I2_vNKwU(^qSdn&>^=*t z&uvp*@c8#2*paD!ZMCi3;K{Na;I4Q35zw$YrW5U@Kk~)&rw;G?d7Q&c9|x<Hg|CNMsxovmfth*|E*GHezPTWa^Hd^F4!B3sF;)? z(NaPyAhocu1jUe(!5Cy|dh|W2=!@fNmuNOzxi^tE_jAtzNJ0JR-avc_H|ve#KO}#S z#a(8secu|^Tx553d4r@3#6^MHbH)vmiBpn0X^29xEv!Vuh1n(Sr5I0V&`jA2;WS|Y zbf0e}X|)wA-Pf5gBZ>r4YX3Mav1kKY(ulAJ0Q*jB)YhviHK)w!TJsi3^dMa$L@^{` z_De`fF4;M87vM3Ph9SzCoCi$#Fsd38u!^0#*sPful^p5oI(xGU?yeYjn;Hq1!wzFk zG&2w}W3`AX4bxoVm03y>ts{KaDf!}b&7$(P4KAMP=vK5?1In^-YYNtx1f#}+2QK@h zeSeAI@E6Z8a?)>sZ`fbq9_snl6LCu6g>o)rO;ijp3|$vig+4t} zylEo7$SEW<_U+qgVcaVhk+4k+C9THI5V10qV*dOV6pPtAI$)QN{!JRBKh-D zk2^{j@bZ}yqW?<#VVuI_27*cI-V~sJiqQv&m07+10XF+#ZnIJdr8t`9s_EE;T2V;B z4UnQUH9EdX%zwh-5&wflY#ve!IWt0UE-My3?L#^Bh%kcgP1q{&26eXLn zTkjJ*w+(|_>Pq0v8{%nX$QZbf)tbJaLY$03;MO=Ic-uqYUmUCuXD>J>o6BCRF=xa% z3R4SK9#t1!K4I_d>tZgE>&+kZ?Q}1qo4&h%U$GfY058s%*=!kac{0Z+4Hwm!)pFLR zJ+5*OpgWUrm0FPI2ib4NPJ+Sk07j(`diti^i#kh&f}i>P4~|d?RFb#!JN)~D@)beox}bw?4VCf^y*`2{4`-@%SFTry2h z>9VBc9#JxEs1+0i2^LR@B1J`B9Ac=#FW=(?2;5;#U$0E0UNag_!jY$&2diQk_n)bT zl5Me_SUvqUjwCqmVcyb`igygB_4YUB*m$h5oeKv3uIF0sk}~es!{D>4r%PC*F~FN3owq5e0|YeUTSG#Vq%&Gk7uwW z0lDo#_wvflqHeRm*}l?}o;EILszBt|EW*zNPmq#?4A+&i0xx^?9obLyY4xx=Y9&^G;xYXYPxG)DOpPg!i_Ccl#3L}6xAAZzNhPK1XaC_~ z!A|mlo?Be*8Nn=a+FhgpOj@G7yYs(Qk(8&|h@_>w8Y^r&5nCqe0V60rRz?b5%J;GYeBqSAjo|K692GxD4` zRZyM2FdI+-jK2}WAZTZ()w_)V{n5tEb@>+JYluDozCb$fA4H)$bzg(Ux{*hXurjO^ zwAxc+UXu=&JV*E59}h3kzQPG4M)X8E*}#_&}w*KEgtX)cU{vm9b$atHa;s>| z+L6&cn8xUL*OSjx4YGjf6{Eq+Q3{!ZyhrL&^6Vz@jGbI%cAM9GkmFlamTbcQGvOlL zmJ?(FI)c86=JEs|*;?h~o)88>12nXlpMR4@yh%qdwFNpct;vMlc=;{FSo*apJ;p}! zAX~t;3tb~VuP|ZW;z$=IHf->F@Ml)&-&Bnb{iQyE#;GZ@C$PzEf6~q}4D>9jic@mTO5x76ulDz@+XAcm35!VSu zT*Gs>;f0b2TNpjU_BjHZ&S6Sqk6V1370+!eppV2H+FY!q*n=GHQ!9Rn6MjY!Jc77A zG7Y!lFp8?TIHN!LXO?gCnsYM-gQxsm=Ek**VmZu7vnuufD7K~GIxfxbsQ@qv2T zPa`tvHB$fFCyZl>3oYg?_wW)C>^_iDOc^B7klnTOoytQH18WkOk)L2BSD0r%xgRSW zQS9elF^?O=_@|58zKLK;(f77l-Zzu}4{fXed2saq!5k#UZAoDBqYQS{sn@j@Vtp|$ zG%gnZ$U|9@u#w1@11Sjl8ze^Co=)7yS(}=;68a3~g;NDe_X^}yJj;~s8xq9ahQ5_r zxAlTMnep*)w1e(TG%tWsjo3RR;yVGPEO4V{Zp?=a_0R#=V^ioQu4YL=BO4r0$$XTX zZfnw#_$V}sDAIDrezGQ+h?q24St0QNug_?{s-pI(^jg`#JRxM1YBV;a@@JQvH8*>> zIJvku74E0NlXkYe_624>znU0J@L<-c=G#F3k4A_)*;ky!C(^uZfj%WB3-*{*B$?9+ zDm$WFp=0(xnt6`vDQV3Jl5f&R(Mp};;q8d3I%Kn>Kx=^;uSVCw0L=gw53%Bp==8Sw zxtx=cs!^-_+i{2OK`Q;913+AXc_&Z5$@z3<)So0CU3;JAv=H?@Zpi~riQ{z-zLtVL z!oF<}@IgJp)Iyz1zVJ42!SPHSkjYNS4%ulVVIXdRuiZ@5Mx8LJS}J#qD^Zi_xQ@>DKDr-_e#>5h3dtje*NcwH_h;i{Sx7}dkdpuW z(yUCjckQsagv*QGMSi9u1`Z|V^}Wjf7B@q%j2DQXyd0nOyqg%m{CK_lAoKlJ7#8M} z%IvR?Vh$6aDWK2W!=i?*<77q&B8O&3?zP(Cs@kapc)&p7En?J;t-TX9abGT#H?TW? ztO5(lPKRuC7fs}zwcUKbRh=7E8wzTsa#Z{a`WR}?UZ%!HohN}d&xJ=JQhpO1PI#>X zHkb>pW04pU%Bj_mf~U}1F1=wxdBZu1790>3Dm44bQ#F=T4V3&HlOLsGH)+AK$cHk6 zia$=$kog?)07HCL*PI6}DRhpM^*%I*kHM<#1Se+AQ!!xyhcy6j7`iDX7Z-2i73_n# zas*?7LkxS-XSqv;YBa zW_n*32D(HTYQ0$feV_Fru1ZxW0g&iwqixPX3=9t4o)o|kOo79V$?$uh?#8Q8e>4e)V6;_(x&ViUVxma+i25qea;d-oK7ouuDsB^ab{ zu1qjQ%`n56VtxBE#0qAzb7lph`Eb-}TYpXB!H-}3Ykqyp`otprp7{VEuW*^IR2n$Fb99*nAtqT&oOFIf z@w*6>YvOGw@Ja?Pp1=whZqydzx@9X4n^2!n83C5{C?G@|E?&$?p*g68)kNvUTJ)I6 z1Q|(#UuP6pj78GUxq11m-GSszc+)X{C2eo-?8ud9sB=3(D47v?`JAa{V(IF zPZQ_0AY*9M97>Jf<o%#O_%Wq}8>YM=q0|tGY+hlXcpE=Z4Od z`NT7Hu2hnvRoqOw@g1f=bv`+nba{GwA$Ak0INlqI1k<9!x_!sL()h?hEWoWrdU3w` zZ%%)VR+Bc@_v!C#koM1p-3v_^L6)_Ktj4HE>aUh%2XZE@JFMOn)J~c`_7VWNb9c-N z2b|SZMR4Z@E7j&q&9(6H3yjEu6HV7{2!1t0lgizD;mZ9$r(r7W5G$ky@w(T_dFnOD z*p#+z$@pKE+>o@%eT(2-p_C}wbQ5s(%Sn_{$HDN@MB+Ev?t@3dPy`%TZ!z}AThZSu zN<1i$siJhXFdjV zP*y|V<`V8t=h#XTRUR~5`c`Z9^-`*BZf?WAehGdg)E2Je)hqFa!k{V(u+(hTf^Yq& zoruUh2(^3pe)2{bvt4&4Y9CY3js)PUHtd4rVG57}uFJL)D(JfSIo^{P=7liFXG zq5yqgof0V8paQcP!gy+;^pp-DA5pj=gbMN0eW=-eY+N8~y+G>t+x}oa!5r>tW$xhI zPQSv=pi;~653Gvf6~*JcQ%t1xOrH2l3Zy@8AoJ+wz@daW@m7?%LXkr!bw9GY@ns3e zSfuWF_gkWnesv?s3I`@}NgE2xwgs&rj?kH-FEy82=O8`+szN ziHch`vvS`zNfap14!&#i9H@wF7}yIPm=UB%(o(}F{wsZ(wA0nJ2aD^@B41>>o-_U6 zUqD~vdo48S8~FTb^+%#zcbQiiYoDKYcj&$#^;Smmb+Ljp(L=1Kt_J!;0s%1|JK}Wi z;={~oL!foo5n8=}rs6MmUW~R&;SIJO3TL4Ky?kh+b2rT9B1Jl4>#Uh-Bec z`Hsp<==#UEW6pGPhNk8H!!DUQR~#F9jEMI6T*OWfN^Ze&X(4nV$wa8QUJ>oTkruH# zm~O<`J7Wxseo@FqaZMl#Y(mrFW9AHM9Kb|XBMqaZ2a)DvJgYipkDD_VUF_PKd~dT7 z#02}bBfPn9a!X!O#83=lbJSK#E}K&yx-HI#T6ua)6o0{|={*HFusCkHzs|Fn&|C3H zBck1cmfcWVUN&i>X$YU^Sn6k2H;r3zuXbJFz)r5~3$d$tUj(l1?o={MM){kjgqXRO zc5R*#{;V7AQh|G|)jLM@wGAK&rm2~@{Pewv#06pHbKn#wL0P6F1!^qw9g&cW3Z=9} zj)POhOlwsh@eF=>z?#sIs*C-Nl(yU!#DaiaxhEs#iJqQ8w%(?+6lU02MYSeDkr!B- zPjMv+on6OLXgGnAtl(ao>|X2Y8*Hb}GRW5}-IzXnoo-d0!m4Vy$GS!XOLy>3_+UGs z2D|YcQx@M#M|}TDOetGi{9lGo9m-=0-^+nKE^*?$^uHkxZh}I{#UTQd;X!L+W@jm( zDg@N4+lUqI92o_rNk{3P>1gxAL=&O;x)ZT=q1mk0kLlE$WeWuY_$0`0jY-Kkt zP*|m3AF}Ubd=`<>(Xg0har*_@x2YH}bn0Wk*OZz3*e5;Zc;2uBdnl8?&XjupbkOeNZsNh6pvsq_ydmJI+*z**{I{0K)-;p1~k8cpJXL$^t!-`E}=*4G^-E8>H!LjTPxSx zcF+cS`ommfKMhNSbas^@YbTpH1*RFrBuATUR zt{oFWSk^$xU&kbFQ;MCX22RAN5F6eq9UfR$ut`Jw--p2YX)A*J69m^!oYfj2y7NYcH6&r+0~_sH^c^nzeN1AU4Ga7=FlR{S|Mm~MpzY0$Z+p2W(a={b-pR9EO1Rs zB%KY|@wLcAA@)KXi!d2_BxrkhDn`DT1=Dec}V!okd{$+wK z4E{n8R*xKyci1(CnNdhf$Dp2(Jpof0-0%-38X=Dd9PQgT+w%Lshx9+loPS~MOm%ZT zt%2B2iL_KU_ita%N>xjB!#71_3=3c}o zgeW~^U_ZTJQ2!PqXulQd=3b=XOQhwATK$y(9$#1jOQ4}4?~l#&nek)H(04f(Sr=s| zWv7Lu1=%WGk4FSw^;;!8&YPM)pQDCY9DhU`hMty1@sq1=Tj7bFsOOBZOFlpR`W>-J$-(kezWJj;`?x-v>ev{*8V z8p|KXJPV$HyQr1A(9LVrM47u-XpcrIyO`yWvx1pVYc&?154aneRpLqgx)EMvRaa#|9?Wwqs2+W8n5~79G z(}iCiLk;?enn}ew`HzhG+tu+Ru@T+K5juvZN)wY;x6HjvqD!&!)$$;1VAh~7fg0K| zEha#aN=Yv|3^~YFH}cc38ovVb%L|g@9W6fo(JtT6$fa?zf@Ct88e}m?i)b*Jgc{fl zExfdvw-BYDmH6>(4QMt#p0;FUIQqkhD}aH?a7)_%JtA~soqj{ppP_82yi9kaxuK>~ ze_)Zt>1?q=ZH*kF{1iq9sr*tVuy=u>Zev}!gEZx@O6-fjyu9X00gpIl-fS_pzjpqJ z1yqBmf9NF!jaF<+YxgH6oXBdK)sH(>VZ)1siyA$P<#KDt;8NT*l_0{xit~5j1P)FN zI8hhYKhQ)i z37^aP13B~u65?sg+_@2Kr^iWHN=U;EDSZ@2W2!5ALhGNWXnFBY%7W?1 z=HI9JzQ-pLKZDYTv<0-lt|6c-RwhxZ)mU2Os{bsX_i^@*fKUj8*aDO5pks=qn3Dv6 zwggpKLuyRCTVPwmw1r}B#AS}?X7b837UlXwp~E2|PJw2SGVueL7){Y&z!jL!XN=0i zU^Eig`S2`{+gU$68aRdWx?BZ{sU_f=8sn~>s~M?GU~`fH5kCc; z8ICp+INM3(3{#k32RZdv6b9MQYdZXNuk7ed8;G?S2nT+NZBG=Tar^KFl2SvhW$bGW#kdWL-I)s_IqVnCDDM9fm8g;P;8 z7t4yZn3^*NQfx7SwmkzP$=fwdC}bafQSEF@pd&P8@H#`swGy_rz;Z?Ty5mkS%>m#% zp_!m9e<()sfKiY(nF<1zBz&&`ZlJf6QLvLhl`_``%RW&{+O>Xhp;lwSsyRqGf=RWd zpftiR`={2(siiPAS|p}@q=NhVc0ELprt%=fMXO3B)4ryC2LT(o=sLM7hJC!}T1@)E zA3^J$3&1*M6Xq>03FX`R&w*NkrZE?FwU+Muut;>qNhj@bX17ZJxnOlPSZ=Zeiz~T_ zOu#yc3t6ONHB;?|r4w+pI)~KGN;HOGC)txxiUN8#mexj+W(cz%9a4sx|IRG=}ia zuEBuba3AHsV2feqw-3MvuL`I+2|`Ud4~7ZkN=JZ;L20|Oxna5vx1qbIh#k2O4$RQF zo`tL()zxaqibg^GbB+BS5#U{@K;WWQj~GcB1zb}zJkPwH|5hZ9iH2308!>_;%msji zJHSL~s)YHBR=Koa1mLEOHos*`gp=s8KA-C zu0aE+W!#iJ*0xqKm3A`fUGy#O+X+5W36myS>Uh2!R*s$aCU^`K&KKLCCDkejX2p=5 z%o7-fl03x`gaSNyr?3_JLv?2RLS3F*8ub>Jd@^Cc17)v8vYEK4aqo?OS@W9mt%ITJ z9=S2%R8M){CugT@k~~0x`}Vl!svYqX=E)c_oU6o}#Hb^%G1l3BudxA{F*tbjG;W_>=xV73pKY53v%>I)@D36I_@&p$h|Aw zonQS`07z_F#@T-%@-Tb|)7;;anoD_WH>9ewFy(ZcEOM$#Y)8>qi7rCnsH9GO-_7zF zu*C87{Df1P4TEOsnzZ@H%&lvV(3V@;Q!%+OYRp`g05PjY^gL$^$-t0Y>H*CDDs?FZly*oZ&dxvsxaUWF!{em4{A>n@vpXg$dwvt@_rgmHF z-MER`ABa8R-t_H*kv>}CzOpz;!>p^^9ztHMsHL|SRnS<-y5Z*r(_}c4=fXF`l^-i}>e7v!qs_jv zqvWhX^F=2sDNWA9c@P0?lUlr6ecrTKM%pNQ^?*Lq?p-0~?_j50xV%^(+H>sMul#Tw zeciF*1=?a7cI(}352%>LO96pD+?9!fNyl^9v3^v&Y4L)mNGK0FN43&Xf8jUlxW1Bw zyiu2;qW-aGNhs=zbuoxnxiwZ3{PFZM#Kw)9H@(hgX23h(`Wm~m4&TvoZoYp{plb^> z_#?vXcxd>r7K+1HKJvhed>gtK`TAbJUazUWQY6T~t2af%#<+Veyr%7-#*A#@&*;@g58{i|E%6yC_InGXCOd{L0;$)z#?n7M`re zh!kO{6=>7I?*}czyF7_frt#)s1CFJ_XE&VrDA?Dp3XbvF{qsEJgb&OLSNz_5g?HpK z9)8rsr4JN!Af3G9!#Qn(6zaUDqLN(g2g8*M)Djap?WMK9NKlkC)E2|-g|#-rp%!Gz zAHd%`iq|81efi93m3yTBw3g0j#;Yb2X{mhRAI?&KDmbGqou(2xiRNb^sV}%%Wu0?< z?($L>(#BO*)^)rSgyNRni$i`R4v;GhlCZ8$@e^ROX(p=2_v6Y!%^As zu022)fHdv_-~Yu_H6WVPLpHQx!W%^6j)cBhS`O3QBW#x(eX54d&I22op(N59b*&$v zFiSRY6rOc^(dgSV1>a7-5C;(5S5MvKcM2Jm-LD9TGqDpP097%52V+0>Xqq!! zq4e3vj53SE6i8J`XcQB|MZPP8j;PAOnpGnllH6#Ku~vS42xP*Nz@~y%db7Xi8s09P z1)e%8ys6&M8D=Dt6&t`iKG_4X=!kgRQoh%Z`dc&mlOUqXk-k`jKv9@(a^2-Upw>?< zt5*^DV~6Zedbec4NVl($2T{&b)zA@b#dUyd>`2JC0=xa_fIm8{5um zr-!ApXZhC8@=vC2WyxO|!@0Km)h8ep*`^he92$@YwP>VcdoS5OC^s38e#7RPsg4j+ zbVGG}WRSET&ZfrcR(x~k8n1rTP%CnfUNKUonD$P?FtNFF#cn!wEIab-;jU=B1dHK@ z(;(yAQJ`O$sMn>h;pf^8{JISW%d+@v6@CnXh9n5TXGC}?FI9i-D0OMaIg&mAg=0Kn zNJ7oz5*ReJukD55fUsMuaP+H4tDN&V9zfqF@ zr=#ecUk9wu{0;!+gl;3Bw=Vn^)z$ahVhhw)io!na&9}LmWurLb0zubxK=UEnU*{5P z+SP}&*(iBKSO4{alBHaY^)5Q=mZ+2OwIooJ7*Q5XJ+2|q`9#f?6myq!&oz?klihLq z4C)$XP!BNS0G_Z1&TM>?Jk{S~{F3n83ioli=IO6f%wkvCl(RFFw~j0tb{GvXTx>*sB0McY0s&SNvj4+^h`9nJ_wM>F!Uc>X}9PifQekn0sKI2SAJP!a4h z5cyGTuCj3ZBM^&{dRelIlT^9zcfaAuL5Y~bl!ppSf`wZbK$z#6U~rdclk``e+!qhe z6Qspo*%<)eu6?C;Bp<^VuW6JI|Ncvyn+LlSl;Mp22Bl7ARQ0Xc24%29(ZrdsIPw&-=yHQ7_Vle|5h>AST0 zUGX2Zk34vp?U~IHT|;$U86T+UUHl_NE4m|}>E~6q``7hccCaT^#y+?wD##Q%HwPd8 zV3x4L4|qqu`B$4(LXqDJngNy-{&@aFBvVsywt@X^}iH7P%>bR?ciC$I^U-4Foa`YKI^qDyGK7k%E%c_P=yzAi`YnxGA%DeNd++j3*h^ z=rn>oBd0|~lZ<6YvmkKY*ZJlJ;Im0tqgWu&E92eqt;+NYdxx`eS(4Hw_Jb5|yVvBg z*tbdY^!AN;luEyN4VRhS@-_DC{({ziH{&Z}iGElSV~qvT>L-8G%+yEL zX#MFOhj{InyKG=mvW-<1B@c-}x$vA(nU?>S>0*eN#!SLzQ)Ex7fvQ)S4D<8|I#N$3 zT5Ei`Z?cxBODHX8(Xp73v`IsAYC@9b;t}z0wxVuQSY1J^GRwDPN@qbM-ZF48T$GZ< z8WU+;Pqo?{ghI-KZ-i*ydXu`Ep0Xw^McH_KE9J0S7G;x8Fe`DVG?j3Pv=0YzJ}yZR z%2=oqHiUjvuk0~Ca>Kol4CFi0_xQT~;_F?=u+!kIDl-9g`#ZNZ9HCy17Ga1v^Jv9# z{T4Kb1-AzUxq*MutfOWWZgD*HnFfyYg0&e9f(5tZ>krPF6{VikNeHoc{linPPt#Si z&*g>(c54V8rT_AX!J&bNm-!umPvOR}vDai#`CX___J#=zeB*{4<&2WpaDncZsOkp* zsg<%@@rbrMkR_ux9?LsQxzoBa1s%$BBn6vk#{&&zUwcfzeCBJUwFYSF$08qDsB;gWQN*g!p8pxjofWbqNSZOEKOaTx@+* zwdt5*Q47@EOZ~EZL9s?1o?A%9TJT=Ob_13yyugvPg*e&ZU(r6^k4=2+D-@n=Hv5vu zSXG|hM(>h9^zn=eQ=$6`JO&70&2|%V5Lsx>)(%#;pcOfu>*nk_3HB_BNaH$`jM<^S zcSftDU1?nL;jy)+sfonQN}(}gUW?d_ikr*3=^{G)=tjBtEPe>TO|0ddVB zTklrSHiW+!#26frPXQQ(YN8DG$PZo?(po(QUCCf_OJC`pw*uey00%gmH!`WJkrKXj2!#6?`T25mTu9OJp2L8z3! z=arrL$ZqxuE{%yV)14Kd>k}j7pxZ6#$Dz8$@WV5p8kTqN<-7W)Q7Gt2{KoOPK_tZ| zf2WG~O5@{qPI+W<4f_;reuFVdO^5`ADC1!JQE|N`s3cq@(0WB!n0uh@*c{=LAd;~} zyGK@hbF-Oo+!nN)@i*O(`@FA#u?o=~e{`4O#5}z&=UkU*50fOrzi11D^&FOqe>wii z?*k+2|EcUs;Gx{!@KBT~>PAwLrIDT7Th=Utu?~?np@t^gFs?zgX=D${RwOY^WGh-+ z+#4$066ISh8eYW#FXWp~S`<*%O^ZuItL1Tyqt8#tZ zY120E;^VG`!lZn&3sPd$RkdHpU#|w+bYV)pJC|SH9g%|5IkxVTQcBA4CL0}$&}ef@ zW^Vtj%M;;_1xxP9x#ex17&4N*{ksO*_4O}xYu(p*JkL#yr}@7b)t5X?%CY<+s5_MJ zuiqt+N_;A(_)%lumoyRFixWa-M7qK_9s6<1X?JDa9fP!+_6u~~M$5L=ipB=7(j#f< zZ34J%=bs549%~_mA(|={uZNs_0?o7;-LBP(ZRnkd{-^|2|=4vUTmtByHL8 zEph`(LSEzQj68a+`d$V<45J7cyv^#|^|%fD#si1Nx!4NW*`l*{->HEWNh6-|g>-=r zXmQ|-i}Ku$ndUeHQ^&ieT!Lf}vf6GaqW9$DJ2NWrqwPY%%4nip$@vK$nRp*_C-v<| zuKz~ZyN&<%!NS26&x?jhy+@awJipMQ-8(X4#Ae5??U<1QMt1l9R=w9fAnEF}NYu$2 z>6}Vkc zIb*A?G*z8^IvibmBKn_u^5&T_1oey0gZS2~obf(#xk=erZGTEdQnt3DMGM+0oPwss zj5zXD;(oWhB_T@~Ig#9@v)AKtXu3>Inmgf@A|-lD-1U>cNyl3h?ADD9)GG4}zUGPk zZzaXe!~Kf?<~@$G?Uql3t8jy9{2!doq4=J}j9ktTxss{p6!9UdjyDERlA*xZ!=Q)KDs5O)phz>Vq3BNGoM(H|=1*Q4$^2fTZw z(%nq1P|5Rt81}SYJpEEzMPl5VJsV5&4e)ZWKDyoZ>1EwpkHx-AQVQc8%JMz;{H~p{=FXV>jIxvm4X*qv52e?Y-f%DJ zxEA165GikEASQ^fH6K#d!Tpu2HP{sFs%E=e$gYd$aj$+xue6N+Wc(rAz~wUsk2`(b z8Kvmyz%bKQxpP}~baG-rwYcYCvkHOi zlkR<=>ZBTU*8RF_d#Bl@zZsRIhx<%~Z@Z=ik z>adw3!DK(8R|q$vy{FTxw%#xliD~6qXmY^7_9kthVPTF~Xy1CfBqbU~?1QmxmU=+k z(ggxvEuA;0e&+ci-zQR{-f7aO{O(Pz_OsEjLh_K>MbvoZ4nxtk5u{g@nPv)cgW_R} z9}EA4K4@z0?7ue}Z(o~R(X&FjejUI2g~08PH1E4w>9o{)S(?1>Z0XMvTb|;&EuyOE zGvWNpYX)Nv<8|a^;1>bh#&znEcl-r!T#pn= z4$?Yudha6F%4b>*8@=BdtXXY4N+`U4Dmx$}>HeVJk-QdTG@t!tVT#0(LeV0gvqyyw z2sEp^9eY0N`u10Tm4n8No&A=)IeEC|gnmEXoNSzu!1<4R<%-9kY_8~5Ej?zRegMn78wuMs#;i&eUA0Zk_RXQ3b&TT} z;SCI=7-FUB@*&;8|n>(_g^HGf3@QODE3LpmX~ELnymQm{Sx9xrKS zK29p~?v@R$0=v6Dr5aW>-!{+h@?Q58|Kz8{{W`%J+lDAdb&M5VHrX_mDY;1-JLnf)ezmPau$)1;=`-FU=-r-83tX=C`S#}GZufju zQ>sXNT0Ny=k@nc%cFnvA_i4SC)?_ORXHq8B4D%el1uPX`c~uG#S1M7C+*MMqLw78E zhY2dI8@+N^qrMI1+;TUda(vGqGSRyU{Fnm`aqrr7bz42c5xsOO-~oZpkzorD1g}Y<6rk&3>PsSGy}W?MtqFky@A(X# zIuNZK0cK?^=;PUAu>j0#HtjbHCV*6?jzA&OoE$*Jlga*}LF`SF?WLhv1O|zqC<>*> zYB;#lsYKx0&kH@BFpW8n*yDcc6?;_zaJs<-jPSkCsSX-!aV=P5kUgF@Nu<{a%#K*F z134Q{9|YX7X(v$62_cY3^G%t~rD>Q0z@)1|zs)vjJ6Jq9;7#Ki`w+eS**En?7;n&7 zu==V3T&eFboN3ZiMx3D8qYc;VjFUk_H-WWCau(VFXSQf~viH0L$gwD$UfFHqNcgN`x}M+YQ6RnN<+@t>JUp#)9YOkqst-Ga?{FsDpEeX0(5v{0J~SEbWiL zXC2}M4?UH@u&|;%0y`eb33ldo4~z-x8zY!oVmV=c+f$m?RfDC35mdQ2E>Pze7KWP- z>!Bh<&57I+O_^s}9Tg^k)h7{xx@0a0IA~GAOt2yy!X%Q$1rt~LbTB6@Du!_0%HV>N zlf)QI1&gvERKwso23mJ!Ou6ZS#zCS5W`gxE5T>C#E|{i<1D35C222I33?Njaz`On7 zi<+VWFP6D{e-{yiN#M|Jgk<44u1TiMI78S5W`Sdb5f+{zu34s{CfWN7a3Cf^@L%!& zN$?|!!9j2c)j$~+R6n#891w-z8(!oBpL2K=+%a$r2|~8-(vQj5_XT`<0Ksf;oP+tz z9CObS!0m)Tgg`K#xBM8B(|Z)Wb&DYL{WTYv`;A=q6~Nnx2+!lTIXtj8J7dZE!P_{z z#f8w6F}^!?^KE#+ZDv+xd5O&3EmomZzsv?>E-~ygGum45fk!SBN&|eo1rKw^?aZJ4 E2O(~oYXATM literal 54712 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

49F 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c02f7cf097b..8cf6eb5ad22 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 cccdd3d517f..4f906e0c811 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 e95643d6a2c..ac1b06f9382 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 7e2ff69b82e..d5d223ff245 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 @@ import android.os.Bundle; -import androidx.annotation.Nullable; import androidx.preference.Preference; import org.schabi.newpipe.R; @@ -11,8 +10,8 @@ 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 void onCreate(@Nullable final Bundle savedInstanceState) { 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 e2ac2c20d97..fe89f62a0ca 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.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 void onCreate(@Nullable final Bundle savedInstanceState) { } } - @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 dbe05bbd2f0..ad8400401ae 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.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 boolean onPreferenceTreeClick(final Preference preference) { 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 8742f093767..abd5436439c 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.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 void onCreate(@Nullable final Bundle savedInstanceState) { }); } - @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 89fabbdde3b..cb6ce263dce 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.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 void onCreate(@Nullable final Bundle savedInstanceState) { 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 f25b25df2f1..0ca15e24592 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 @@ 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 5eca99822f6..c0d274fe035 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.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 @@ private void updateSeekOptions() { } } - @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 c445928c4df..cdac21634d7 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 @@ protected void onCreate(final Bundle savedInstanceBundle) { 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 boolean onPreferenceStartFragment(final PreferenceFragmentCompat caller, 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 b037ca58449..e68ee76d828 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 6d25ed097a0..97ccd199ecb 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 32c6c6b91cf..33237d7b068 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 1b8f3190e63..534d81b0941 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 @@ protected void onCreate(final Bundle savedInstanceState) { 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 e2ac2c20d97..26f67c15fe4 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 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 @@ private void applyThemeChange(final String beginningThemeKey, 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 dcfb7ed1907..ff7dd9b8638 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.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 static int getThemeForService(final Context context, final int serviceId) 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 static boolean isDeviceDarkThemeEnabled(final Context context) { 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 b106e743788..929d55a70d9 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 d7e7ab1dc3f..d0292495864 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 e28cd8cd635..cffbcb51018 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 dfb8ffa34d0..d482d033c03 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 534d81b0941..90db7bead28 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 @@ private void setupDrawer() throws Exception { 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 @@ private void toggleServices() { } 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 void onNothingSelected(final AdapterView parent) { } 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 @@ private void showTabs() throws ExtractionException { 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 179fab8dc4d..13efcb58d03 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 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 @@ private void showUnsupportedUrlDialog(final String url) { 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 @@ private List getChoicesForService(final StreamingService serv 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 @@ private List getChoicesForService(final StreamingService serv 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 484a4649774..4d3726c3888 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 @@ private void initToolbar(final Toolbar toolbar) { } 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 5fb68ba305c..ed6fd18a7dc 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.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 @@ protected void initViews(final View rootView, final Bundle savedInstanceState) { 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 a5dfe205761..1e50a77f0b8 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 @@ private void initTabs() { 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 @@ private void updateOverlayData(@Nullable final String overlayTitle, } 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 11494792319..d0f90ee6b33 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 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 void handleResult(@NonNull final PlaylistInfo result) { 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 @@ private void updateBookmarkButtons() { 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 d4bb4eebde8..8e12680bc9b 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 @@ private SuggestionItemHolder(final View rootView) { 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 1bece369b73..a2107d5e56d 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.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 @@ private void toggleSortMode() { 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 19038be9386..83a90213d53 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 d60d82cb422..016e1e404d0 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 5bd13356d1d..908bea00c67 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 a9731df8a7b..7b78b3d955a 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 74e481c4fe3..9a33de54df3 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 afca7064f98..23d5bdd119d 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 11fc4833a51..1b55d2e85f3 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 cf58c8f76da..6c9858d1bdf 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 @@ private 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 43c1b4405fa..948343be2ba 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 @@ private NotificationCompat.Action getAction( || 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 @@ private NotificationCompat.Action getAction( } 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 d757a926844..08a2762a979 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 @@ private void onStateChanged(final int state) { 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 @@ private void onMaybeMuteChanged() { //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 f8e0732b3b8..53d9a3ef09b 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 @@ private void setupElementsVisibility() { = 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 @@ private void onBlocked() { 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 @@ private void onPlaying() { 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 @@ private void onPaused() { 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 @@ private void onCompleted() { 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 @@ boolean isMuted() { 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 void fastForward() { } 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 void fastRewind() { } 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 @@ private void setupScreenRotationButton() { || 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 a0b2e7eba72..998324c9c66 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 @@ private void onScrollMainVolume(final float distanceX, final float distanceY) { 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 @@ private void onScrollMainBrightness(final float distanceX, final float distanceY 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 bd3cbf79d69..74585e12b0e 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 void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { 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 52e50fbbae5..125b455f4b9 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.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 @@ private static final class DialogListAdapter extends BaseAdapter { 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 572741d03a8..52d128bf046 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 void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { 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 @@ private ChooseTabListItem[] getAvailableTabs(final Context context) { 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 @@ private ChooseTabListItem[] getAvailableTabs(final Context context) { 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 0ffda2261c1..b289009ceba 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.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 String getTabName(final Context context) { @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 String getTabName(final Context context) { @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 String getTabName(final Context context) { @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 String getTabName(final Context context) { @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 String getTabName(final Context context) { @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 String getTabName(final Context context) { @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 String getTabName(final Context context) { @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 2f0b3e1324b..f77aa0fdab9 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 static int getKioskIcon(final String kioskId, final Context c) { 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 3270b2b6f72..b47bc97fd3b 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 @@ private void updateList() { 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 c090c72118a..ab584f0e6c7 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 static int getForegroundForFileType(Context ctx, FileType type) { 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 00000000000..1da8092d46c --- /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 929d55a70d9..7162bc3ece9 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 b037ca58449..02bc169e2a9 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 07f3ae755c4..cbb162407f4 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 b063ec9dbc5..b84c5aa3f82 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 91002e006eb..1dbf8e761a6 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 77b884f4f33..7564296b385 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 14ee19ad48c..882b38870f5 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 33d50f59337..4a0b46692f2 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 b41066226f1..ac6a0f4e50a 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 b68c29bc692..756f49031bd 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 6087e2b2dd3..9945e96c19e 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 28d30ebe809..0b10addf4d4 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 580e8db4d82..1a85b5945f2 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 534dc0ca4a6..b4ddfa6c1d9 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 8d2a226d98f..4b1025fea7a 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 a385f64a82a..7110895f0a3 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 1fd917d1e16..82183e18cbf 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 61a6fca82cb..028a10a2eb6 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 f31ef67f295..fcb7b5f3a0d 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 abbd82a5c1e..46e7419ad00 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 75aef9a9e4c..53b30120a1a 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 ad3a6aad516..b3fa2be53b7 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 f319f8c9aaf..ec040048de8 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 62f5b28ecc8..84c6a913080 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 4364aa84dc6..a5be55c94e8 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 82220ea5b41..0b58f371539 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 6bbb2211610..72b7cd984eb 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 f28d3d0744e..c12a7e768c5 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 d1dd8888c58..1984c0490cb 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 0cc6ec1b02a..fbe3b4e0923 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 7e19d6d423b..af902062659 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 d96b382d04a..31a5219146a 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 237faf41ac3..38473e4d5b6 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 7eff1807742..0efadcb66ac 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 9796dce688a..8e3ea155963 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 f9310dc0747..74f0934520b 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 574fbc7378c..738ac86860c 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 00000000000..7fec3130234 --- /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 42fc7660ecf..65a11cc094d 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 b23a0a50dc8..2b86c295514 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 6093ca8b82a..b005800bce1 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 abb94f4efaa..5a4f9b37fe3 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 725796fd39b..5b3858cf617 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 b005800bce1..d8df7a30ecd 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 c88fca7f94f..cad7ce9040c 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 3c37bd1287b..38fdbccab38 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.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 void onResume() { /** * 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 @@ protected void showStreamDialog(final StreamInfoItem item) { return; } - final ArrayList entries = new ArrayList<>(); + final List entries = new ArrayList<>(); if (PlayerHolder.getType() != null) { entries.add(StreamDialogEntry.enqueue); @@ -361,7 +362,7 @@ protected void showStreamDialog(final StreamInfoItem item) { 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 @@ protected void showStreamDialog(final StreamInfoItem item) { 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 73fee32f7f5..2d59febc22e 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 b372bee7f69..f6c8999194b 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 74585e12b0e..e4da3b14d71 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 @@ 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 void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { 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 33cfde9088f..a4aa1bda587 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 cad7ce9040c..74a173abce4 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 84c6a913080..6bc68cab837 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 ce56d5a30d9..cbbfcad4856 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 a5b115f96eb..275374fcf6b 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 487c93336e9..de1f274b28b 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.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 void onRepeatModeChanged(@RepeatMode final int repeatMode) { Log.d(TAG, "ExoPlayer - onRepeatModeChanged() called with: " + "repeatMode = [" + repeatMode + "]"); } - setRepeatModeButton(binding.repeatButton, repeatMode); + setRepeatModeButton(((AppCompatImageButton) binding.repeatButton), repeatMode); onShuffleOrRepeatModeChanged(); } @@ -2253,7 +2254,7 @@ private void onShuffleOrRepeatModeChanged() { 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 978913289ae..9f4a0166e61 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 61c3d058ff7..c9b018add49 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 5b3858cf617..bdad22174a0 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 275374fcf6b..fafa01310fd 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 e2b0ed4cb02..38128e2c70c 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 2f8d6cfb430..912a2ff6813 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 19f166ddce8..7700239a377 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 f8e0732b3b8..1c11a3948a7 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 @@ && isPlaybackResumeEnabled(this) // 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 void onStopTrackingTouch(final SeekBar seekBar) { } public void saveWasPlaying() { - this.wasPlaying = simpleExoPlayer.getPlayWhenReady(); + this.wasPlaying = getPlayWhenReady(); } //endregion @@ -2686,7 +2682,7 @@ public void playPause() { Log.d(TAG, "onPlayPause() called"); } - if (isPlaying()) { + if (getPlayWhenReady()) { pause(); } else { play(); @@ -4012,6 +4008,10 @@ public boolean isPlaying() { 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 e4da3b14d71..74585e12b0e 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 @@ 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 void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { 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 52d128bf046..bb45c8ff78a 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 void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { 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 ae22bc141f8..00000000000 --- 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 57f96653687..ae22bc141f8 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 1c0d0b63c5d..7c3e0c9b4a7 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 0242dca6e53..3f18c7ce9dc 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 00000000000..89e356a42a0 --- /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 60b1e168c6f..00000000000 --- 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 00000000000..c5b9618fe1e --- /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 129af33883e..2f015a049ec 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 26360137e9c..76d9d6e38ec 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 void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { } @Override - public boolean onOptionsItemSelected(final MenuItem item) { - final List 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 11494792319..e20df67a172 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 void onComplete() { } @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 | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 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 e50c858caf1..045e574be0a 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.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 NotificationActionsPreference(final Context context, final AttributeSet a } - private NotificationSlot[] notificationSlots; - - private List compactSlots; + @Nullable private NotificationSlot[] notificationSlots = null; + @Nullable private List compactSlots = null; //////////////////////////////////////////////////////////////////////////// // Lifecycle @@ -85,19 +85,22 @@ private void setupActions(@NonNull final View view) { //////////////////////////////////////////////////////////////////////////// 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); - } + for (int i = 0; i < 5; i++) { + editor.putInt(getContext().getString(NotificationConstants.SLOT_PREF_KEYS[i]), + notificationSlots[i].selectedAction); + } - editor.apply(); + 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 88ed8998e3b..66de11377f0 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 1c11a3948a7..e83f5c641e5 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 @@ private void initPlayer(final boolean playOnReady) { 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 void handleIntent(@NonNull final Intent intent) { && 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 void handleIntent(@NonNull final Intent intent) { && !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 void onStartTrackingTouch(final SeekBar seekBar) { saveWasPlaying(); if (isPlaying()) { - simpleExoPlayer.setPlayWhenReady(false); + simpleExoPlayer.pause(); } showControls(0); @@ -1665,7 +1662,7 @@ public void onStopTrackingTouch(final SeekBar seekBar) { 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 void onPlayerStateChanged(final boolean playWhenReady, final int playback } @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 void onPlaybackUnblock(final MediaSource mediaSource) { 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 void onPositionDiscontinuity(@DiscontinuityReason final int discontinuity 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 void onPlayerError(@NonNull final ExoPlaybackException error) { 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 void seekToDefault() { 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 void play() { } } - simpleExoPlayer.setPlayWhenReady(true); + simpleExoPlayer.play(); saveStreamProgressState(); } @@ -2673,7 +2665,7 @@ public void pause() { } 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 13ee24e16cf..c4b21f203a1 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 @@ private void onAudioFocusGain() { 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 void onAnimationEnd(final Animator animation) { //////////////////////////////////////////////////////////////////////////*/ @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 ba9a2f1ec4c..fe0233508fc 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.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 @@ private LoadController(final int initialPlaybackBufferMs, final DefaultLoadControl.Builder builder = new DefaultLoadControl.Builder(); builder.setBufferDurationsMs(minimumPlaybackBufferMs, optimalPlaybackBufferMs, initialPlaybackBufferMs, initialPlaybackBufferMs); - internalLoadControl = builder.createDefaultLoadControl(); + internalLoadControl = builder.build(); } /*////////////////////////////////////////////////////////////////////////// @@ -47,9 +47,9 @@ public void onPrepared() { } @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 boolean shouldContinueLoading(final long playbackPositionUs, @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 b0c64143393..c7f1f9c8c84 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 MediaSessionManager(@NonNull final Context context, @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 4324fcd0a0b..aab3a8d491d 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.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 static int getPlaybackOptimalBufferMs() { 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 d70707fdbf1..389be70628e 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.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 void setPreferredTextLanguage(@NonNull final String label) { @Override @Nullable - protected Pair selectTextTrack( + protected Pair selectTextTrack( final TrackGroupArray groups, @NonNull final int[][] formatSupport, @NonNull final Parameters params, @@ -86,7 +86,7 @@ protected Pair selectTextTrack( } } 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 e06c0ff82f6..a6dcadd5eeb 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.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 @@ default MediaSource buildLiveMediaSource(@NonNull final PlayerDataSource dataSou 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 @@ default MediaSource buildMediaSource(@NonNull final PlayerDataSource dataSource, 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 a2b3a1d3de9..245a85e7101 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 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 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 MediaSource resolve(@NonNull final StreamInfo info) { 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 1915ff28323..a84c9840416 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.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.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 989c78c57cb..29ae7c5c318 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 d6a9a51e42b..baaddd814d2 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 e35168bba96..b1d3ec49bf5 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 69b7f0b52d9..6cd04ae345a 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 e83f5c641e5..faaccc9fe4e 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.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 @@ private void initPlayer(final boolean playOnReady) { // 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 52069fd0e7d..0704dad66f3 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 static int spToPx(@Dimension(unit = Dimension.SP) final int sp, 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 89e356a42a0..bdb3edabdc5 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 4f4fd528360..df804136a20 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 static Intent getPlayerEnqueueIntent(@NonNull final Context context, 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 b2593ab42f1..315625a0fc7 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 | 106 ++++++++++++++++++++++++++++------------------- 1 file changed, 63 insertions(+), 43 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 66de11377f0..e8518890c16 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' - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlin_version}" - - implementation "frankiesardo:icepick:${icepickVersion}" - kapt "frankiesardo:icepick-processor:${icepickVersion}" +/** 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" - - debugImplementation "com.facebook.stetho:stetho:${stethoVersion}" - debugImplementation "com.facebook.stetho:stetho-okhttp3:${stethoVersion}" + ktlint 'com.pinterest:ktlint:0.40.0' - debugImplementation "com.squareup.leakcanary:leakcanary-android:${leakCanaryVersion}" - implementation "com.squareup.leakcanary:leakcanary-object-watcher-android:${leakCanaryVersion}" - implementation "com.squareup.leakcanary:plumber-android:${leakCanaryVersion}" +/** Kotlin **/ + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:${kotlin_version}" - implementation "androidx.multidex:multidex:2.0.1" +/** 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.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' - // 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" +/** 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}" - implementation "com.google.android.material:material:1.2.1" - + // Metadata generator for service descriptors 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" - 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.room:room-runtime:${androidxRoomVersion}" - implementation "androidx.room:room-rxjava3:${androidxRoomVersion}" - kapt "androidx.room:room-compiler:${androidxRoomVersion}" - - implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" - + // 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 8736a470fde..12dc132a57b 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 908bea00c67..2918bcd66b9 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 38128e2c70c..ce77af6afbe 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 a5dfe205761..e5cf28bdfaa 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.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 void onCreate(final Bundle savedInstanceState) { 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 void onSharedPreferenceChanged(final SharedPreferences sharedPreferences, 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 @@ private void initTabs() { 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 @@ private void updateTabIconsAndContentDescriptions() { } 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 void handleError() { 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 void showLoading() { 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 void onFullscreenStateChanged(final boolean fullscreen) { 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 902df94bc1d..a66b7d56974 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.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 void onAttach(@NonNull final Context context) { public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) { - return inflater.inflate(R.layout.fragment_related_streams, container, false); + return inflater.inflate(R.layout.fragment_related_items, container, false); } @Override @@ -80,8 +80,8 @@ public void onDestroyView() { @Override protected ViewBinding getListHeader() { - if (relatedStreamInfo != null && relatedStreamInfo.getRelatedItems() != null) { - headerBinding = RelatedStreamsHeaderBinding + if (relatedItemInfo != null && relatedItemInfo.getRelatedItems() != null) { + headerBinding = RelatedItemsHeaderBinding .inflate(activity.getLayoutInflater(), itemsList, false); final SharedPreferences pref = PreferenceManager @@ -107,8 +107,8 @@ protected Single loadMoreItemsLogic() { //////////////////////////////////////////////////////////////////////////*/ @Override - protected Single loadResult(final boolean forceLoad) { - return Single.fromCallable(() -> relatedStreamInfo); + protected Single loadResult(final boolean forceLoad) { + return Single.fromCallable(() -> relatedItemInfo); } @Override @@ -120,7 +120,7 @@ public void showLoading() { } @Override - public void handleResult(@NonNull final RelatedStreamInfo result) { + public void handleResult(@NonNull final RelatedItemInfo result) { super.handleResult(result); if (headerBinding != null) { @@ -145,23 +145,23 @@ public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { private void setInitialData(final StreamInfo info) { super.setInitialData(info.getServiceId(), info.getUrl(), info.getName()); - if (this.relatedStreamInfo == null) { - this.relatedStreamInfo = RelatedStreamInfo.getInfo(info); + if (this.relatedItemInfo == null) { + this.relatedItemInfo = RelatedItemInfo.getInfo(info); } } @Override public void onSaveInstanceState(@NonNull final Bundle outState) { super.onSaveInstanceState(outState); - outState.putSerializable(INFO_KEY, relatedStreamInfo); + outState.putSerializable(INFO_KEY, relatedItemInfo); } @Override protected void onRestoreInstanceState(@NonNull final Bundle savedState) { super.onRestoreInstanceState(savedState); final Serializable serializable = savedState.getSerializable(INFO_KEY); - if (serializable instanceof RelatedStreamInfo) { - this.relatedStreamInfo = (RelatedStreamInfo) serializable; + if (serializable instanceof RelatedItemInfo) { + this.relatedItemInfo = (RelatedItemInfo) serializable; } } diff --git a/app/src/main/java/org/schabi/newpipe/player/event/CustomBottomSheetBehavior.java b/app/src/main/java/org/schabi/newpipe/player/event/CustomBottomSheetBehavior.java index 61023875cda..a5de56e7569 100644 --- a/app/src/main/java/org/schabi/newpipe/player/event/CustomBottomSheetBehavior.java +++ b/app/src/main/java/org/schabi/newpipe/player/event/CustomBottomSheetBehavior.java @@ -26,7 +26,7 @@ public CustomBottomSheetBehavior(final Context context, final AttributeSet attrs 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 aab3a8d491d..0a3ea908a72 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 static String cacheKeyOf(@NonNull final StreamInfo info, * 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 static PlayQueue autoQueueOf(@NonNull final StreamInfo info, 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 81e203b1f3b..f96bb0d549f 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.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 e68ee76d828..b8869862a04 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 3baa4e2be14..54d747ac350 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 2decfb6cc68..00ecdf22b65 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 6f6308f8cf9..248672b7e18 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 dbcdf951e84..03211ab9cc0 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 f7f8cd07218..c6dda6f1c98 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 a4f219d21a3..d964361015a 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 729fec623a5..29f2bf845ea 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 07cdcadf480..a2cc35f2d8d 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 b037623b2e2..57a13288d20 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 90299ef7739..5cef4307651 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 24a5c4d3a7f..a515b8ceffd 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 530af1ea7f5..a21a29b0059 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 5d6fafd8248..1f34ba9346b 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 ec57ea8491b..9a6570d5ed5 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 a62c2bbb27c..9ca1ade5ad2 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 8f83e28f97c..7efaabb909d 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 75ca42bc87d..8f03299b140 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 8025242e48a..944f9b8c832 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 f06a85ff5ba..455a972a862 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 824be52d50b..25391c1ed5c 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 7d0171904e0..d3b6ea93720 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 707bbc62088..a3955388068 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 2d5210f8e7f..ffe008a48f3 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 baac54c18a4..4d9e692d14e 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 3a08e14e39e..0e492831c73 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 7696ffb7cd7..71fda40c85c 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 db26e27ed05..8058d527c26 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 2d0b39153d5..334e68581e2 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 80a564a1e67..99bc917bd7e 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 6f71d69bf04..12500a528be 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 dea8f2be5f3..4041bb3ce84 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 9f1e6922133..98c1ec742f4 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 7e0e3726d46..5302d869586 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 9d2e40dbed4..3c98514528f 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 769994acc42..1cffd2bc018 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 8b2875ad08a..d3c7c888ce2 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 f6c8999194b..6759110b331 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 e8518890c16..500f5c052f9 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 a5dfe205761..72e3300ed1d 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 @@ private boolean shouldShowComments() { } 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 5dbb67cd1d0..66bd341429f 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 cc3105152f5..c543044caef 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 - - - - -