From 8746f39cde46b41ce4d5b804b92c7647913ab519 Mon Sep 17 00:00:00 2001 From: Balazs Toldi Date: Tue, 6 Sep 2022 12:01:34 +0200 Subject: [PATCH] A commit, that was needed... --- .directory | 6 + .idea/codeStyles/Project.xml | 123 ++++++ .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/deploymentTargetDropDown.xml | 12 +- .idea/gradle.xml | 1 - .idea/misc.xml | 37 ++ app/build.gradle | 3 +- app/src/main/AndroidManifest.xml | 29 +- .../main/ic_launcher_adaptive-playstore.png | Bin 0 -> 11285 bytes app/src/main/ic_new_caster-playstore.png | Bin 0 -> 12655 bytes .../ic_new_caster_monochrome-playstore.png | Bin 0 -> 12655 bytes .../toldi/balazs/caster/ChromeCastHelper.kt | 1 + .../caster/ChromecastManagerActivity.kt | 402 +++++++++++++++--- .../toldi/balazs/caster/FolderViewActivity.kt | 201 +++++++++ .../eu/toldi/balazs/caster/MainActivity.kt | 51 ++- .../caster/model/ChromecastManageViewmodel.kt | 10 + .../toldi/balazs/caster/model/SponsorBlock.kt | 32 ++ .../services/ChromecastManagerService.kt | 88 +++- .../balazs/caster/ui/theme/ColorScheme.kt | 35 ++ .../res/drawable/ic_new_caster_foreground.xml | 53 +++ .../ic_new_caster_monochrome_foreground.xml | 53 +++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../res/mipmap-anydpi-v26/ic_new_caster.xml | 6 + .../mipmap-anydpi-v26/ic_new_caster_round.xml | 6 + .../main/res/mipmap-hdpi/ic_new_caster.png | Bin 0 -> 1664 bytes .../res/mipmap-hdpi/ic_new_caster_round.png | Bin 0 -> 3611 bytes .../main/res/mipmap-mdpi/ic_new_caster.png | Bin 0 -> 1146 bytes .../res/mipmap-mdpi/ic_new_caster_round.png | Bin 0 -> 2245 bytes .../main/res/mipmap-xhdpi/ic_new_caster.png | Bin 0 -> 2278 bytes .../res/mipmap-xhdpi/ic_new_caster_round.png | Bin 0 -> 5033 bytes .../main/res/mipmap-xxhdpi/ic_new_caster.png | Bin 0 -> 3463 bytes .../res/mipmap-xxhdpi/ic_new_caster_round.png | Bin 0 -> 8010 bytes .../main/res/mipmap-xxxhdpi/ic_new_caster.png | Bin 0 -> 4718 bytes .../mipmap-xxxhdpi/ic_new_caster_round.png | Bin 0 -> 11646 bytes .../ic_launcher_adaptive_background.xml | 4 + .../res/values/ic_new_caster_background.xml | 4 + .../ic_new_caster_monochrome_background.xml | 4 + app/src/main/res/values/strings.xml | 1 + 38 files changed, 1071 insertions(+), 101 deletions(-) create mode 100644 .directory create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 app/src/main/ic_launcher_adaptive-playstore.png create mode 100644 app/src/main/ic_new_caster-playstore.png create mode 100644 app/src/main/ic_new_caster_monochrome-playstore.png create mode 100644 app/src/main/java/eu/toldi/balazs/caster/FolderViewActivity.kt create mode 100644 app/src/main/java/eu/toldi/balazs/caster/model/SponsorBlock.kt create mode 100644 app/src/main/java/eu/toldi/balazs/caster/ui/theme/ColorScheme.kt create mode 100644 app/src/main/res/drawable/ic_new_caster_foreground.xml create mode 100644 app/src/main/res/drawable/ic_new_caster_monochrome_foreground.xml delete mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_new_caster.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_new_caster_round.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_new_caster.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_new_caster_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_new_caster.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_new_caster_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_new_caster.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_new_caster_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_new_caster.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_new_caster_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_new_caster.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_new_caster_round.png create mode 100644 app/src/main/res/values/ic_launcher_adaptive_background.xml create mode 100644 app/src/main/res/values/ic_new_caster_background.xml create mode 100644 app/src/main/res/values/ic_new_caster_monochrome_background.xml diff --git a/.directory b/.directory new file mode 100644 index 0000000..46de82d --- /dev/null +++ b/.directory @@ -0,0 +1,6 @@ +[Dolphin] +Timestamp=2022,1,4,18,4,55.221 +Version=4 + +[Settings] +HiddenFilesShown=true diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000..7643783 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,123 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000..79ee123 --- /dev/null +++ b/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 76aae83..a55641d 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -1,18 +1,18 @@ - + - + - - + + - - + + diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 526b4c2..a2d7c21 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/.idea/misc.xml b/.idea/misc.xml index 5197594..a43e999 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -51,6 +51,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/build.gradle b/app/build.gradle index 2f7de43..b6ba446 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,7 +8,7 @@ plugins { android { - compileSdk 31 + compileSdk 33 defaultConfig { applicationId "eu.toldi.balazs.caster" @@ -82,6 +82,7 @@ dependencies { implementation 'com.google.android.material:material:1.6.1' implementation "androidx.compose.ui:ui:$compose_version" implementation "androidx.compose.material:material:$compose_version" + implementation "androidx.compose.material3:material3:1.0.0-beta01" implementation "androidx.compose.ui:ui-tooling-preview:$compose_version" implementation "androidx.compose.material:material-icons-extended:$compose_version" implementation "androidx.compose.runtime:runtime-livedata:$compose_version" diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 95a1393..c2d88e0 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,13 +10,18 @@ + + + + + + + @@ -42,11 +53,10 @@ android:name=".ChromecastManagerActivity" android:exported="true" android:label="@string/title_activity_chromecast_manager" - android:theme="@style/Theme.Caster.NoActionBar" > + android:theme="@style/Theme.Caster.NoActionBar"> - + - - + + - \ No newline at end of file + diff --git a/app/src/main/ic_launcher_adaptive-playstore.png b/app/src/main/ic_launcher_adaptive-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..23b94595f31644f78c6557fff53ed058c557c093 GIT binary patch literal 11285 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 OaO$|*vFam%xBnkX;4=IG literal 0 HcmV?d00001 diff --git a/app/src/main/ic_new_caster-playstore.png b/app/src/main/ic_new_caster-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..3075d78d44cede9be0823d91b37d34fc70f21bc6 GIT binary patch literal 12655 zcmeHuXH-*L*Y2h$C`u8eNL9`el%^s@DFLOZsGukyks^q2AoN}ntUxFpJ&1@DV?m|2 z1PBl;fP$1LErbvS!3ZfLkOWfp-5lTZe*f;D`{#~toIg7mV`Z&5*W7c?=b3Y@WV)Po z+`4(kW&i-T9zSMx763${ucCnDM(ATXVR#Jy_M0BJvptvK&7hFT=ekJG7bR>r%E{Vo zw7u*g7a(h2XlE~eED;-0_vy^zC$lpP{kI9&@2x3g zO&}_@Ri=cJx4pU_x4AYXHa3>v#d*d0%)@vIIyxu|-XS9|?{I`p3IOocJ`0oqfT1-> zNRb0}(Bt+_NHx?JIq2)<4CtYCR2+J$?1CQeWJLhL=H|aY{oiGQ+mmR`% zteSzmjU(ECiy13TyOlA9iLS0lNpO~B3_txTp#!*hx8}$dkO~0B9W+1#E)FZOlahA`~-cwSm`i zKt?VUM>|Aha{-$eaR4bU4@}oW(2iG&7vp-{}HPsxSdcQfQWfg>u{i$o1QUI+?Pxx=rxq&ig5jZBtm% z^KAfijp}HA5RyNVB=x!J+uQ=UT3T@q_0(Oo7AZZUg z`FF{GZTYVg{Tn?1>ff{h{C}G-sT(>^fMT9iBb?J?RAIuO!r8lI;PP~y=G4o0>Vfw> z>*u4V`UDV2uIKpRcG02ocz5+AKWBC8W+l|gEfqA%g6`kAq%WWPP4z#}*Xk(-07oLF zwA6k9!wWg!%P(L!mIM5QHUBqk#Dlw%dgO%?>wtSy0>^%b|1Xv?c;&SD;(ST;9&TL%)?1@}KcA#DULubnG2-qw~G_ zpG9phs9WH#f$gexRPJ3+aE%2mQB6P5nRTMrxm4$H#QmUxYN3P*@N%T72w$JToW)dN z-KB*{HX+_c9a4qEG{e-S>}-vxqP5v$?i$Lfn{5y6-`_4Un!&z2>Ii;2x@3`zrSai* zEN|AF3Mt-c@oye=dlDi>rC{xJV31R{^ODSy(DS$w;oz;^oJa7>*#^j&od9qy;HMgB zI0&ra)^PUW|dbUr`#fq$u@^c6?&!j08q?N-34y0~QNF zAMTK#fz2YNn&C^q2~9gHzk)^v**!-?_NoGL&pIN$9HG?tJD%fAM(0UuT2HFh><|aE z#BC~S-|q_-crB0g+NLcSQ3MApP&E{t)~F&{v2&((Jb~6_mRXWqNc*b=6F8tyyw7WS zxM6bU;G6CY=|ii)W9V%tsax1DS6*OJi;}O=w#PT;nBA+E_gZ?X`t50+ms*=p!fc7a z6%MiG0Gp7Vz{GPLIJ^5Tg4blhwHD;k1cPYr=mJ_Jn)0g6-G?acxaO0#pR^=sU(3iX z{O$14UgCnLtQYop%#5?08DxTQti6|hnt_7HjGX{#^a#+nQ$l08bV57n)6smRSrSHP zixOj)1l|dGB0$HCZ@@bYDR*>*h@doaV8~MvwL4HkKtaZFD5VLmF|Q~X z9cKhwYQ8Z44n}1@CU_qrBZF&b=bb3O z3v!G3M)lav+27U2P+9=;T*l>L2wTp5= zhQAcw*x)3Hw=_H)ByKUs2y`|)Y3Uxba=Jt-X!n1{>)I>AlkJwdudwG{f*UrNB}RPp zz%AagvU1_8?=lbtf(*oM{NlQiv}X6a@=zUyac5+q{-%!%deCuQIxo@S}sm( zI16~*5Kq{iy6TQ`-5coag~y9sSnQJ=X-J*Sv+#}?h{X&FhQUv0fnW59glA+&c zUPM!-9lJ`!p5ODbs#mv$2WV{BaSOZ*5(XT@T@Or3VXJ z-fMu3J<4d7imrd}MPiO77a3?HDO%=$Jxi%Sg*oboZy1`E*#4b#-6?r8>XlW$vF%XU zR?=gyF3#q^B6|xl&KB~n2T{|RkxkN}ms|XjCqIUDeZZ5fqTKo61rw^s zZS8b7FjX{Qi&ln8vNtXh z9}gqGZ?F&dm~-3I5E_FMc*am+0uDS}aigi`^i$`(J}2|3{daUIBH{GQIK?B2g7Pb9 z=EKMm+TCP6r$kf)bzc&AYXkh{n-@b_X@oy(;J&IfOU_1cUqBs!c-E_d&Y}PeIUTW4 zs0T&j^eG%=vCFJAaD{?M~B6wRleYbJb z{fOKm$->|&s89EgLd-g9>jdc1?HkzDzSi6@>=Yi`z`+SWQsQ(w@~{JLr!TgSTHOrF zqd%2S{}k9PnQ`d&PnY1WsN;8cf6sUK&Qv@QK4r-uHI#Fxtq?l;X#po{ohF=0ZnH{i zjMDanT;gzaPRh3nZR1Om;^8oI&7BPc1~PcKnpM(MFFk7aMKDaDT{a4MU=f9B%S6YZ zojf+HNfm4d#++TI%%0< zR|8%i5_L7&mb&yW%{^#&H)mV7gtn@({?!ARY)R<<`$-f;x^eb!pcj)gQ7PM;75vLu0nP=6-f zU`u0g5$%savX*;_QBC_!Y z^3ex&i=cLi0yz$Vo!{LaZ$UflXBB2i5uZG!lN$qP<*Ml<3AbbN2xkb#ue8)Yy;1(5 z%5HSOu)y!6tDe6l$F|J{>XrSn`Qf_bSL2?A7cD7(X2ad4YV{X*rkNkHe1o(@-9wMA z6)AA%3xwPN+5eacn0PXlW|TB@G;G7GBzsglyZ%&U*oOZZ)wg&)Ro~j7Dpj183xD`x z6fW}5UQwp~rjGSFcM#z9Bs*0597LliThRWu{(1XAV&4h|^0A&P)zo(Hnu>1llBGBFu`Lr@Qrf>M*Bl0V3Tj9(gE?-!E>>V9&!31q~>A{d__*C6_(FxhXv7 zO0-sqAaXX|VgM`*32=8sux?G?r{4NU)opP6AS0F<=sSB7q|KYko_JNgO^rlsFE8oI z%q`xPL=j`!w0_eR4if2X!6(LVL3t92$Wc#^vi`OcF-u1L{WAYuYMue-%p$+JV#-Tq zrK?R{+eiD>Vn+tNRLox%C5wlBJV`unG2tyazC#3-U@1J2E_SmyQK4&5`hOO9yL+5u zXMqn)nU>^ax2m5*YktL+`3K@oF*mq_f#=&yqmn!4#KzrTyBhsOKJy$uuUb_0hx28H z9!rIP5<|uZ>D(e%?A-+fTS&Bez(){Hu#Ly>b+fyoyS5RPU~DA&%H^HxWjrQTVh!eM zaPwT6j7-Ppym;MzJV^G>)c0g#?&IAVaSSFh2%c_re5k#EcHh`u33idUtz}Q!Dh{07 zoT2Q8HSGM|ER(tR7&i6lpRlkIkGt3MMTfb+qeJK5;M~j*?PF6vq(jN( zgoInkA0Kgz{|Zmd9t2IKcieED9$Wf2W{bGZrewXqRy`bkHkNUwW%`z}qp4XL1m;po z8P@PFkvcg1m*LP0KYTJhigM8*zt1 zq}c0tX+eGRXluhD_b`YQ5;*lxX?$ZW4LsWm!PYK7R!l^;6FZ(7oM+KVQbH~s-PAL> z)%=e(8iZC|30Z_5hx$$FgMvo>+zAQ)Xe~MmV?LS=u>-qxjMD1F`k=j&DvG#ne4A-P z!y!3rm~bRM6(mIl#|2E&rDhoT2n39%nnufuUf1z&Iw1LjW*Cok=kJ^TjM(H2M}un; z_8dM1Of|hj>Ha?1g&YhRAISM+80UOlp@#&uvQPdEu%eSKqs5Hvux#^#7JbarHu%AJ zOo9@!JjX9jeI@K0MYTMbdSL7ky^24bq|O01Lt%G6^k2OmVaty7`8bt&z;9O zl_<0$AFsno1r~q)JCmZ7MAl}O*5za%Znj$StiPxc)8Fjie7$OqVqiE!iXdk~x5zpc zZ`|#%tJxKb&L5AequN&DaoU#`sban6GnT{^*6QE%TMJdZKQ1eV%5_1Q*urP~tUos> zweAnqn=&9oEXXKOKV3?NAJR%?j4t4cH!&2uCsplwoa6WVy2~T>7fmNWSF#u?G4G`y zaXNe3I7RoZHYjdy4ZO1~;duRCdPHrltckHuWv9u5<%M zMx(;V4zofU*^5{A=>Petld}^LwdACe1=Vx0Ah{(oiEWGJamlc7I;qxcGtTI*3T6zM z&!*+?7B{?bP7v3+a(Q93=l;Gwy^I)%)Fp6Y112b&|Czd)0E- z&UL*ieCH61h}!5d(7`ESu3sk+S(I#wKo7}3N8fzC z_!6o2Mi)o1H%{W>&+D*m4v7z8uh1h#kO%aH9Wq^;SN2q0FUe>ff3(n0j||1>QS9`P zKJtYIbuPmj9Bv7lOIMBz7D2}u6;+HBaM4=)c2Kpe>Hrn1h!+lcQ;vaF|<8_-G`28eE4oW zS%q?_lJT`r^2|`6y6f@;50eYQHDCxKiOQgF88w^@6SjbarmIc7Nw;?^t=npY5@*6T zSh5`+rfSf82b=et92OnoO9JAFDLC5o?<*wvS7A?6I2o>DyN^vgzAvB?+pe|MxL{+J zo+;+o09Drjo7!7Ga#pL$Yn9u5owkSbCN+&W6eX(r@A@p9%|+M90R7hio91wPsBL)| zagy&S9{TY~RUs><5XB(K`p4TOZ~I&l$RCqHT{!}jDZmc~k)Aa>X|v*&vbsNPsNKGX zFn%`8+Y~#wh{08|eKdgwn?z6_5tyRTNYxPIVgcgNv_oZV2ltD)lqhM}87b!Ce}3~| z+_Vc@;k&5iftFUE>~?xFwxKqlB(Lg9WI5|nkzm|fqU%3Gce5uuP9-!1IH4t8dp?XW zByVdm_qMWv3gKoEVe+N`^pWEDmUSbZgie4F9G^*39F}-y(bwaiR~AmJ{*<|XuDj8~ zlpMqTje|3fG-n;?^_gG|9F!LYOd2+&8>P_)lF$-w>gkb|@UxtJBmUximtsWL{ujiO zY-QsYEpbWW>y-7(c+@LBY!;g~t0~)8zah3HrBAcMJ5F$X`MR8tr~78~_;_D13V5I_ zf(oLS2$mCtuWI#^cT?FHYOR#A{70@?jrgLu3RFiGsC5qG?+3~*$O2p0{9DY#ByuDR zqiSb#@pE?R?!(gudrW%|ft%Nlw!@Q-#e6?(wrDszyBJJ=q4tA`Jl*)_PoYR%We9Uy z>WUMxGO70W4F3(CQ0JK%d=w57dnY4udwjrX@&W^D5&P>v)-_1t`x3oV?edsACz^_) zKidxP&W}Ch*$8*Wd3P{OgLq@57Z1Jr(0pzgYZA6%X#ptpIL*VM_Db_NE?VMk{XijW z*L&3pX+Me1BIHsJfVyG}{N|h2TSfXl@Y(s$8-wj3gIStqW?Gj_NtH`y!d5Smv&Qe$ zw+qvk^9I#}#xyCTt#$V#t^a5vqn?|ewz88!5!Uf@K|n|OAC-Uf#wp2JDi38?4gY=)O)cJZ#mpc}COIZNnCnqV*V4yHW?J9=x?C6sEm zQSN?DYt7jo^aRxCt<_PU;@*XA1P)4xYV9hj>i8~C3}HnVtXae^%52#~3P>n&j~LY_ z&cgW|xDg(tD{kD|QCg3<;DyebHm_swy?!6R$(t!yr2J+x2LM5S;x@lw!vquU7}qQK z%%m={Bif`3%RgKx8%=6J+xd>x60Z};=~HHjbzJXW^XO-^H4Z=0FL_bhY-fXcnyyrh z>wrS)H>yw>7}AG2V)W19QlsO)wcXF_v_F4HHEtA zg8d$U6_%#UQ@x*1{VN=xslH~3r{y*IGQNScrpJe_J}r@=kN?hVFk0?0dV^KPHpyi9 zzr_aQX^}m=nOpTb##cUYeg&wDcJlDTK>1`r+M>LSC85 zZGfFV88;eMu}`r_Iv~$?s`&#l6@Z$^Hd_%AZTQkf86dQO*~t!8oGNu2xS7nG z$&c(($JCJIw@9ey+*@>=v1}QFO1zIv!UZuKS8zk87qx~IixWF&-KEVf zTf0gdwpjSeXwKxhc5fKV2&?RBZvpa4B{v%bf65I?zY9#e6f9K_Gbhc|@j zWmP*MUo&QP70NaX%rG*+yn7(>G=O=}!sE>WVzNVtIOb{^`2+L9n!g zw8X@ERT&7+S}I?!b?U(;-uAl5r1&&~z7S(nD>@%0aqn^K2(rmG84>>eZX~;&x~R&z zenYA z;JDl>F{ynyug!3689$H}8g@@uxgp*gFUruhG^Yt89-o==&-e_*U1shg|PtFf~& zRndF37$yxIR9(*!D`E1T^r-e5ov%uygQ!#LzK#!fw|?EUUf}zb?+6#1kLhwVn`sN- zm=D%yzPndXS-b%Y8|jD*q}PRA&~L_D>xnSedaEXtW;kO{e^OIMP1Y@*Es1(Z-$F4g z^{Id7HHvfU=a6D@hYimhQUd zdI2jksOQ6-IrnDn=)=ek@Ik2{Z5J6jg0Sw4jxgpVld{XP3VP!0WbcTzCVANTQEu$;(|&=7OU@%Pv+jja%Uhw*#&sM$6*$xa^pW6 zr~;;AuXexL?o(44J=f(U=KJ1tktry8A8i*ec&{n(w+KJe)cM`m?J_O_e{BWG8-^53 z_I7w*P@*Wu>vYBwBK6o^hj}cLBXmSG`^^ck(Ut`ay4|Q2;0aLcyaNgF084^6-ol0a zOA_CU+`Gxo#^Vk*Zo0t^x)fPie;T5`?0lNj|Z$duE>W6ri2AFvB4fMqerYwVSnx_LY`5R0UoG`4EfQ06Q_@@ zPre>)SDMzNIpadt=avM%q{@8Z(FuH?xR$SCr0wGH$4Hka)c!OqWpOQDun3fqpm+9G zx)bZ?ot+bUl1Ad(9B14+ zvQ5@>anMb!k)n+DANGUJ8r7pCA=!G6>{?a`@s=rC;}aR?l5Y~xOdi0QkG`^Oa*tWI z15JW2IUlf8`tlQ8@M$qwL)Z97C1-t}F0%6xeAJWyCN_(fZ5U5oOElw2y!0GzV6cz* zL{{!13z)e&lh>h0`D^4+6w0gZCA$waP5klH*-m21V$bug+r+T_kCgAqiZ4YrXn_yjhsXw7N9s3ZBR-W{#kRJExr-Qrw%lM8R&DX~nXp?& z@9{Sb1+V+NL>RecFz$y`CSbuWjl~$8CStqXutxeO{H(lZ(g<8k~`ia?z`GsbwUO zF=GcmDEZWQ^4uqjqP@nW-kL(#im^Zz%>8WbH>z#fhDDb$wv00+L8}Y0q^iH}>SRr| zmt2FPM(u${Wi(J!88=dldE9;eNLgNy@0bu)@gM2Ku`1c}okmE*_NA;E*PA)X z->Wb^GKcusPE#M>&-;jl?yWi3&#Lh`4R!i=s@vUT_y>t{r%E{Vo zw7u*g7a(h2XlE~eED;-0_vy^zC$lpP{kI9&@2x3g zO&}_@Ri=cJx4pU_x4AYXHa3>v#d*d0%)@vIIyxu|-XS9|?{I`p3IOocJ`0oqfT1-> zNRb0}(Bt+_NHx?JIq2)<4CtYCR2+J$?1CQeWJLhL=H|aY{oiGQ+mmR`% zteSzmjU(ECiy13TyOlA9iLS0lNpO~B3_txTp#!*hx8}$dkO~0B9W+1#E)FZOlahA`~-cwSm`i zKt?VUM>|Aha{-$eaR4bU4@}oW(2iG&7vp-{}HPsxSdcQfQWfg>u{i$o1QUI+?Pxx=rxq&ig5jZBtm% z^KAfijp}HA5RyNVB=x!J+uQ=UT3T@q_0(Oo7AZZUg z`FF{GZTYVg{Tn?1>ff{h{C}G-sT(>^fMT9iBb?J?RAIuO!r8lI;PP~y=G4o0>Vfw> z>*u4V`UDV2uIKpRcG02ocz5+AKWBC8W+l|gEfqA%g6`kAq%WWPP4z#}*Xk(-07oLF zwA6k9!wWg!%P(L!mIM5QHUBqk#Dlw%dgO%?>wtSy0>^%b|1Xv?c;&SD;(ST;9&TL%)?1@}KcA#DULubnG2-qw~G_ zpG9phs9WH#f$gexRPJ3+aE%2mQB6P5nRTMrxm4$H#QmUxYN3P*@N%T72w$JToW)dN z-KB*{HX+_c9a4qEG{e-S>}-vxqP5v$?i$Lfn{5y6-`_4Un!&z2>Ii;2x@3`zrSai* zEN|AF3Mt-c@oye=dlDi>rC{xJV31R{^ODSy(DS$w;oz;^oJa7>*#^j&od9qy;HMgB zI0&ra)^PUW|dbUr`#fq$u@^c6?&!j08q?N-34y0~QNF zAMTK#fz2YNn&C^q2~9gHzk)^v**!-?_NoGL&pIN$9HG?tJD%fAM(0UuT2HFh><|aE z#BC~S-|q_-crB0g+NLcSQ3MApP&E{t)~F&{v2&((Jb~6_mRXWqNc*b=6F8tyyw7WS zxM6bU;G6CY=|ii)W9V%tsax1DS6*OJi;}O=w#PT;nBA+E_gZ?X`t50+ms*=p!fc7a z6%MiG0Gp7Vz{GPLIJ^5Tg4blhwHD;k1cPYr=mJ_Jn)0g6-G?acxaO0#pR^=sU(3iX z{O$14UgCnLtQYop%#5?08DxTQti6|hnt_7HjGX{#^a#+nQ$l08bV57n)6smRSrSHP zixOj)1l|dGB0$HCZ@@bYDR*>*h@doaV8~MvwL4HkKtaZFD5VLmF|Q~X z9cKhwYQ8Z44n}1@CU_qrBZF&b=bb3O z3v!G3M)lav+27U2P+9=;T*l>L2wTp5= zhQAcw*x)3Hw=_H)ByKUs2y`|)Y3Uxba=Jt-X!n1{>)I>AlkJwdudwG{f*UrNB}RPp zz%AagvU1_8?=lbtf(*oM{NlQiv}X6a@=zUyac5+q{-%!%deCuQIxo@S}sm( zI16~*5Kq{iy6TQ`-5coag~y9sSnQJ=X-J*Sv+#}?h{X&FhQUv0fnW59glA+&c zUPM!-9lJ`!p5ODbs#mv$2WV{BaSOZ*5(XT@T@Or3VXJ z-fMu3J<4d7imrd}MPiO77a3?HDO%=$Jxi%Sg*oboZy1`E*#4b#-6?r8>XlW$vF%XU zR?=gyF3#q^B6|xl&KB~n2T{|RkxkN}ms|XjCqIUDeZZ5fqTKo61rw^s zZS8b7FjX{Qi&ln8vNtXh z9}gqGZ?F&dm~-3I5E_FMc*am+0uDS}aigi`^i$`(J}2|3{daUIBH{GQIK?B2g7Pb9 z=EKMm+TCP6r$kf)bzc&AYXkh{n-@b_X@oy(;J&IfOU_1cUqBs!c-E_d&Y}PeIUTW4 zs0T&j^eG%=vCFJAaD{?M~B6wRleYbJb z{fOKm$->|&s89EgLd-g9>jdc1?HkzDzSi6@>=Yi`z`+SWQsQ(w@~{JLr!TgSTHOrF zqd%2S{}k9PnQ`d&PnY1WsN;8cf6sUK&Qv@QK4r-uHI#Fxtq?l;X#po{ohF=0ZnH{i zjMDanT;gzaPRh3nZR1Om;^8oI&7BPc1~PcKnpM(MFFk7aMKDaDT{a4MU=f9B%S6YZ zojf+HNfm4d#++TI%%0< zR|8%i5_L7&mb&yW%{^#&H)mV7gtn@({?!ARY)R<<`$-f;x^eb!pcj)gQ7PM;75vLu0nP=6-f zU`u0g5$%savX*;_QBC_!Y z^3ex&i=cLi0yz$Vo!{LaZ$UflXBB2i5uZG!lN$qP<*Ml<3AbbN2xkb#ue8)Yy;1(5 z%5HSOu)y!6tDe6l$F|J{>XrSn`Qf_bSL2?A7cD7(X2ad4YV{X*rkNkHe1o(@-9wMA z6)AA%3xwPN+5eacn0PXlW|TB@G;G7GBzsglyZ%&U*oOZZ)wg&)Ro~j7Dpj183xD`x z6fW}5UQwp~rjGSFcM#z9Bs*0597LliThRWu{(1XAV&4h|^0A&P)zo(Hnu>1llBGBFu`Lr@Qrf>M*Bl0V3Tj9(gE?-!E>>V9&!31q~>A{d__*C6_(FxhXv7 zO0-sqAaXX|VgM`*32=8sux?G?r{4NU)opP6AS0F<=sSB7q|KYko_JNgO^rlsFE8oI z%q`xPL=j`!w0_eR4if2X!6(LVL3t92$Wc#^vi`OcF-u1L{WAYuYMue-%p$+JV#-Tq zrK?R{+eiD>Vn+tNRLox%C5wlBJV`unG2tyazC#3-U@1J2E_SmyQK4&5`hOO9yL+5u zXMqn)nU>^ax2m5*YktL+`3K@oF*mq_f#=&yqmn!4#KzrTyBhsOKJy$uuUb_0hx28H z9!rIP5<|uZ>D(e%?A-+fTS&Bez(){Hu#Ly>b+fyoyS5RPU~DA&%H^HxWjrQTVh!eM zaPwT6j7-Ppym;MzJV^G>)c0g#?&IAVaSSFh2%c_re5k#EcHh`u33idUtz}Q!Dh{07 zoT2Q8HSGM|ER(tR7&i6lpRlkIkGt3MMTfb+qeJK5;M~j*?PF6vq(jN( zgoInkA0Kgz{|Zmd9t2IKcieED9$Wf2W{bGZrewXqRy`bkHkNUwW%`z}qp4XL1m;po z8P@PFkvcg1m*LP0KYTJhigM8*zt1 zq}c0tX+eGRXluhD_b`YQ5;*lxX?$ZW4LsWm!PYK7R!l^;6FZ(7oM+KVQbH~s-PAL> z)%=e(8iZC|30Z_5hx$$FgMvo>+zAQ)Xe~MmV?LS=u>-qxjMD1F`k=j&DvG#ne4A-P z!y!3rm~bRM6(mIl#|2E&rDhoT2n39%nnufuUf1z&Iw1LjW*Cok=kJ^TjM(H2M}un; z_8dM1Of|hj>Ha?1g&YhRAISM+80UOlp@#&uvQPdEu%eSKqs5Hvux#^#7JbarHu%AJ zOo9@!JjX9jeI@K0MYTMbdSL7ky^24bq|O01Lt%G6^k2OmVaty7`8bt&z;9O zl_<0$AFsno1r~q)JCmZ7MAl}O*5za%Znj$StiPxc)8Fjie7$OqVqiE!iXdk~x5zpc zZ`|#%tJxKb&L5AequN&DaoU#`sban6GnT{^*6QE%TMJdZKQ1eV%5_1Q*urP~tUos> zweAnqn=&9oEXXKOKV3?NAJR%?j4t4cH!&2uCsplwoa6WVy2~T>7fmNWSF#u?G4G`y zaXNe3I7RoZHYjdy4ZO1~;duRCdPHrltckHuWv9u5<%M zMx(;V4zofU*^5{A=>Petld}^LwdACe1=Vx0Ah{(oiEWGJamlc7I;qxcGtTI*3T6zM z&!*+?7B{?bP7v3+a(Q93=l;Gwy^I)%)Fp6Y112b&|Czd)0E- z&UL*ieCH61h}!5d(7`ESu3sk+S(I#wKo7}3N8fzC z_!6o2Mi)o1H%{W>&+D*m4v7z8uh1h#kO%aH9Wq^;SN2q0FUe>ff3(n0j||1>QS9`P zKJtYIbuPmj9Bv7lOIMBz7D2}u6;+HBaM4=)c2Kpe>Hrn1h!+lcQ;vaF|<8_-G`28eE4oW zS%q?_lJT`r^2|`6y6f@;50eYQHDCxKiOQgF88w^@6SjbarmIc7Nw;?^t=npY5@*6T zSh5`+rfSf82b=et92OnoO9JAFDLC5o?<*wvS7A?6I2o>DyN^vgzAvB?+pe|MxL{+J zo+;+o09Drjo7!7Ga#pL$Yn9u5owkSbCN+&W6eX(r@A@p9%|+M90R7hio91wPsBL)| zagy&S9{TY~RUs><5XB(K`p4TOZ~I&l$RCqHT{!}jDZmc~k)Aa>X|v*&vbsNPsNKGX zFn%`8+Y~#wh{08|eKdgwn?z6_5tyRTNYxPIVgcgNv_oZV2ltD)lqhM}87b!Ce}3~| z+_Vc@;k&5iftFUE>~?xFwxKqlB(Lg9WI5|nkzm|fqU%3Gce5uuP9-!1IH4t8dp?XW zByVdm_qMWv3gKoEVe+N`^pWEDmUSbZgie4F9G^*39F}-y(bwaiR~AmJ{*<|XuDj8~ zlpMqTje|3fG-n;?^_gG|9F!LYOd2+&8>P_)lF$-w>gkb|@UxtJBmUximtsWL{ujiO zY-QsYEpbWW>y-7(c+@LBY!;g~t0~)8zah3HrBAcMJ5F$X`MR8tr~78~_;_D13V5I_ zf(oLS2$mCtuWI#^cT?FHYOR#A{70@?jrgLu3RFiGsC5qG?+3~*$O2p0{9DY#ByuDR zqiSb#@pE?R?!(gudrW%|ft%Nlw!@Q-#e6?(wrDszyBJJ=q4tA`Jl*)_PoYR%We9Uy z>WUMxGO70W4F3(CQ0JK%d=w57dnY4udwjrX@&W^D5&P>v)-_1t`x3oV?edsACz^_) zKidxP&W}Ch*$8*Wd3P{OgLq@57Z1Jr(0pzgYZA6%X#ptpIL*VM_Db_NE?VMk{XijW z*L&3pX+Me1BIHsJfVyG}{N|h2TSfXl@Y(s$8-wj3gIStqW?Gj_NtH`y!d5Smv&Qe$ zw+qvk^9I#}#xyCTt#$V#t^a5vqn?|ewz88!5!Uf@K|n|OAC-Uf#wp2JDi38?4gY=)O)cJZ#mpc}COIZNnCnqV*V4yHW?J9=x?C6sEm zQSN?DYt7jo^aRxCt<_PU;@*XA1P)4xYV9hj>i8~C3}HnVtXae^%52#~3P>n&j~LY_ z&cgW|xDg(tD{kD|QCg3<;DyebHm_swy?!6R$(t!yr2J+x2LM5S;x@lw!vquU7}qQK z%%m={Bif`3%RgKx8%=6J+xd>x60Z};=~HHjbzJXW^XO-^H4Z=0FL_bhY-fXcnyyrh z>wrS)H>yw>7}AG2V)W19QlsO)wcXF_v_F4HHEtA zg8d$U6_%#UQ@x*1{VN=xslH~3r{y*IGQNScrpJe_J}r@=kN?hVFk0?0dV^KPHpyi9 zzr_aQX^}m=nOpTb##cUYeg&wDcJlDTK>1`r+M>LSC85 zZGfFV88;eMu}`r_Iv~$?s`&#l6@Z$^Hd_%AZTQkf86dQO*~t!8oGNu2xS7nG z$&c(($JCJIw@9ey+*@>=v1}QFO1zIv!UZuKS8zk87qx~IixWF&-KEVf zTf0gdwpjSeXwKxhc5fKV2&?RBZvpa4B{v%bf65I?zY9#e6f9K_Gbhc|@j zWmP*MUo&QP70NaX%rG*+yn7(>G=O=}!sE>WVzNVtIOb{^`2+L9n!g zw8X@ERT&7+S}I?!b?U(;-uAl5r1&&~z7S(nD>@%0aqn^K2(rmG84>>eZX~;&x~R&z zenYA z;JDl>F{ynyug!3689$H}8g@@uxgp*gFUruhG^Yt89-o==&-e_*U1shg|PtFf~& zRndF37$yxIR9(*!D`E1T^r-e5ov%uygQ!#LzK#!fw|?EUUf}zb?+6#1kLhwVn`sN- zm=D%yzPndXS-b%Y8|jD*q}PRA&~L_D>xnSedaEXtW;kO{e^OIMP1Y@*Es1(Z-$F4g z^{Id7HHvfU=a6D@hYimhQUd zdI2jksOQ6-IrnDn=)=ek@Ik2{Z5J6jg0Sw4jxgpVld{XP3VP!0WbcTzCVANTQEu$;(|&=7OU@%Pv+jja%Uhw*#&sM$6*$xa^pW6 zr~;;AuXexL?o(44J=f(U=KJ1tktry8A8i*ec&{n(w+KJe)cM`m?J_O_e{BWG8-^53 z_I7w*P@*Wu>vYBwBK6o^hj}cLBXmSG`^^ck(Ut`ay4|Q2;0aLcyaNgF084^6-ol0a zOA_CU+`Gxo#^Vk*Zo0t^x)fPie;T5`?0lNj|Z$duE>W6ri2AFvB4fMqerYwVSnx_LY`5R0UoG`4EfQ06Q_@@ zPre>)SDMzNIpadt=avM%q{@8Z(FuH?xR$SCr0wGH$4Hka)c!OqWpOQDun3fqpm+9G zx)bZ?ot+bUl1Ad(9B14+ zvQ5@>anMb!k)n+DANGUJ8r7pCA=!G6>{?a`@s=rC;}aR?l5Y~xOdi0QkG`^Oa*tWI z15JW2IUlf8`tlQ8@M$qwL)Z97C1-t}F0%6xeAJWyCN_(fZ5U5oOElw2y!0GzV6cz* zL{{!13z)e&lh>h0`D^4+6w0gZCA$waP5klH*-m21V$bug+r+T_kCgAqiZ4YrXn_yjhsXw7N9s3ZBR-W{#kRJExr-Qrw%lM8R&DX~nXp?& z@9{Sb1+V+NL>RecFz$y`CSbuWjl~$8CStqXutxeO{H(lZ(g<8k~`ia?z`GsbwUO zF=GcmDEZWQ^4uqjqP@nW-kL(#im^Zz%>8WbH>z#fhDDb$wv00+L8}Y0q^iH}>SRr| zmt2FPM(u${Wi(J!88=dldE9;eNLgNy@0bu)@gM2Ku`1c}okmE*_NA;E*PA)X z->Wb^GKcusPE#M>&-;jl?yWi3&#Lh`4R!i=s@vUT_y>t{]*>|<\\/a>))[?=&+%\\w]*" + + val compiledPattern: Pattern = + Pattern.compile(pattern, Pattern.CASE_INSENSITIVE) + + lateinit var colorScheme: ColorScheme + lateinit var prefs: SharedPreferences + + @Composable + fun BottomNavigationBar(navController: NavHostController) { + + BottomNavigation( + backgroundColor = colorScheme.secondary, + contentColor = colorScheme.onSecondary + ) { + // observe the backstack + val navBackStackEntry by navController.currentBackStackEntryAsState() + + // observe current route to change the icon + // color,label color when navigated + val currentRoute = navBackStackEntry?.destination?.route + + // Bottom nav items we declared + Constants.BottomNavItems.forEach { navItem -> + + // Place the bottom nav items + BottomNavigationItem( + + // it currentRoute is equal then its selected route + selected = currentRoute == navItem.route, + + // navigate on click + onClick = { + navController.navigate(navItem.route) + }, + + // Icon of navItem + icon = { + Icon(imageVector = navItem.icon, contentDescription = navItem.label) + }, + + // label + label = { + Text(text = navItem.label) + }, + alwaysShowLabel = false + ) + } + } + } + private lateinit var chromeCast: ChromeCast - private lateinit var viewModel : ChromecastManageViewmodel + private lateinit var viewModel: ChromecastManageViewmodel + + @RequiresApi(Build.VERSION_CODES.O) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + + prefs = getSharedPreferences( + "eu.toldi.Caster", Context.MODE_PRIVATE + ) if (chromeCast_ == null) finish() chromeCast = chromeCast_ as ChromeCast @@ -73,56 +169,74 @@ class ChromecastManagerActivity : ComponentActivity() { } setContent { CasterTheme { - viewModel = ViewModelProvider(this).get(ChromecastManageViewmodel::class.java) - viewModel.chromeCast = chromeCast - // A surface container using the 'background' color from the theme - Surface(color = MaterialTheme.colors.background) { - Column { - //viewModel.fetchMediaStatus() - MenuBar() - Column( - modifier = Modifier - .padding(6.dp) - .fillMaxWidth() - .fillMaxHeight(), - horizontalAlignment = Alignment.CenterHorizontally - ) { - var text by remember { mutableStateOf("") } + colorScheme = getColorScheme() + // remember navController so it does not + // get recreated on recomposition + val navController = rememberNavController() - OutlinedTextField( - value = text, - onValueChange = { - text = it - }, - label = { Text(stringResource(id = R.string.cast_url)) }, - modifier = Modifier.padding(vertical = 4.dp) - ) - var castEnabled by remember { mutableStateOf(true) } - Button( - enabled = castEnabled, - onClick = { - castEnabled = false - viewModel.castLink(text) { - castEnabled = true - } - }, - modifier = Modifier.padding(vertical = 4.dp) - ) { - Text(text = stringResource(id = R.string.cast)) - } - if (castEnabled.not()) { - CircularProgressIndicator() - } - PlayBackControl() - mediaStatus() + Surface(color = colorScheme.background, contentColor = colorScheme.onBackground) { + + // Scaffold Component + Scaffold( + backgroundColor = colorScheme.background, + contentColor = colorScheme.onBackground, + // Bottom navigation + bottomBar = { + BottomNavigationBar(navController = navController) + }, + content = { padding -> + // Navhost: where screens are placed + NavHostContainer(navController = navController, padding = padding) } - } + ) } } + } } + @Composable + fun NavHostContainer( + navController: NavHostController, + padding: PaddingValues + ) { + + NavHost( + navController = navController, + + // set the start destination as home + startDestination = "home", + + // Set the padding provided by scaffold + modifier = Modifier.padding(paddingValues = padding), + + builder = { + + // route : Home + composable("home") { + Column { + MenuBar() + HomeScreen() + } + } + + // route : search + composable("gallery") { + Column { + MenuBar() + ImageScreen() + } + } + + // route : profile + composable("settings") { + SettingsScreen() + } + }) + + } + @Composable fun mediaStatus() { val mediaStatus = viewModel.mediaStatus.value @@ -157,13 +271,13 @@ class ChromecastManagerActivity : ComponentActivity() { val image = mediaStatus.media.metadata[METADATA_THUMB] as String Log.e("Caster", image) - Image( - painter = rememberImagePainter(image), + AsyncImage( + model = image, contentDescription = null, modifier = Modifier.fillMaxWidth() ) } - if(mediaStatus.media.contentType.startsWith("video/")) { + if (mediaStatus.media.contentType.startsWith("video/")) { Row( Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween @@ -198,13 +312,11 @@ class ChromecastManagerActivity : ComponentActivity() { @Composable fun MenuBar() { val pickPictureLauncher = rememberLauncherForActivityResult( - ActivityResultContracts.OpenDocument() + ActivityResultContracts.OpenDocumentTree() ) { fileUri -> if (fileUri != null) { - val cacheHelper = FileCacheHelper(applicationContext) - cacheHelper.cacheThis(listOf(fileUri)) - viewModel.castFromCache(cacheHelper.tryFileName(fileUri)) - + DocumentFile.fromTreeUri(applicationContext, fileUri) + ?.let { viewModel.addFolder(it) } } } TopAppBar( @@ -222,7 +334,7 @@ class ChromecastManagerActivity : ComponentActivity() { actions = { Row { IconButton(onClick = { - pickPictureLauncher.launch(arrayOf("image/*", "video/*")) + pickPictureLauncher.launch(Uri.EMPTY) }) { Icon( Icons.Filled.Folder, @@ -230,7 +342,9 @@ class ChromecastManagerActivity : ComponentActivity() { ) } } - } + }, + backgroundColor = colorScheme.primary, + contentColor = colorScheme.onPrimary ) } @@ -361,4 +475,172 @@ class ChromecastManagerActivity : ComponentActivity() { } return super.onKeyDown(keyCode, event) } + + @Composable + fun HomeScreen() { + // Column Composable, + Column( + modifier = Modifier + .fillMaxSize(), + // Parameters set to place the items in center + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.Center + ) { + viewModel = + ViewModelProvider(this@ChromecastManagerActivity).get(ChromecastManageViewmodel::class.java) + viewModel.chromeCast = chromeCast + // A surface container using the 'background' color from the theme + //viewModel.fetchMediaStatus() + + Column( + modifier = Modifier + .padding(6.dp) + .fillMaxWidth() + .fillMaxHeight(), + horizontalAlignment = Alignment.CenterHorizontally + ) { + var text by remember { mutableStateOf("") } + + OutlinedTextField( + value = text, + onValueChange = { + text = it + }, + label = { Text(stringResource(id = R.string.cast_url)) }, + modifier = Modifier.padding(vertical = 4.dp), + colors = TextFieldDefaults.outlinedTextFieldColors( + cursorColor = colorScheme.primary, + focusedBorderColor = + colorScheme.primary.copy(alpha = ContentAlpha.high), + focusedLabelColor = colorScheme.primary + ) + ) + var castEnabled by remember { mutableStateOf(true) } + Button( + enabled = castEnabled, + colors = ButtonDefaults.buttonColors( + backgroundColor = colorScheme.primary, + contentColor = colorScheme.onPrimary + ), + onClick = { + castEnabled = false + val link = text + viewModel.castLink(link) { + if (prefs.getBoolean("sponsorblock_enabled", false)) { + val matcher: Matcher = compiledPattern.matcher(link) + if (matcher.find()) { + val id = matcher.group(1) + Log.e("Caster_SB", id) + val intent = Intent( + applicationContext, + ChromecastManagerService::class.java + ).apply { + action = ChromecastManagerService.ACTION_SET_YT_ID + putExtra("yt_id", id) + putExtra("media_url", link) + } + application.startService(intent); + } + } + castEnabled = true + + } + }, + modifier = Modifier.padding(vertical = 4.dp) + ) { + Text(text = stringResource(id = R.string.cast)) + } + if (castEnabled.not()) { + CircularProgressIndicator(color = colorScheme.secondary) + } + PlayBackControl() + mediaStatus() + } + } + } + + + @Composable + fun SettingsScreen() { + // Column Composable, + Column( + modifier = Modifier + .fillMaxSize(), + // parameters set to place the items in center + ) { + Row() { + Text("Enable SponsorBlock") + var switched by remember { + mutableStateOf( + prefs.getBoolean( + "sponsorblock_enabled", + false + ) + ) + } + Switch(checked = switched, onCheckedChange = { + switched = !switched + prefs.edit().putBoolean("sponsorblock_enabled", switched).apply() + }) + } + } + } + + @Composable + fun ImageScreen() { + // Column Composable, + Column( + modifier = Modifier + .fillMaxSize(), + ) { + + val folders = viewModel.folderListState.value + val cacheHelper = FileCacheHelper(applicationContext) + LazyColumn() { + items(folders.size) { index -> + Card(modifier = Modifier + .fillMaxWidth() + .clickable { + val intent = Intent(applicationContext, FolderViewActivity::class.java) + FolderViewActivity.chromecastRecv = chromeCast + FolderViewActivity.folderRecv = folders[index] + startActivity(intent) + }) { + Row( + modifier = Modifier + .fillMaxSize(), + // parameters set to place the items in center + verticalAlignment = Alignment.CenterVertically + ) { + val image = folders[index].listFiles() + .firstOrNull { + it.name?.endsWith(".png") ?: false || it.name?.endsWith( + ".jpg" + ) ?: false + } + if (image != null) { + cacheHelper.cacheThis(listOf(image.uri)) + + val imageFile = File(cacheDir, cacheHelper.tryFileName(image.uri)) + Column( + modifier = Modifier + .height(80.dp) + .width(80.dp) + .padding(10.dp) + ) { + Log.e(null, imageFile.name.toString()) + Image( + painter = rememberImagePainter(imageFile), + contentDescription = null, + modifier = Modifier.fillMaxSize() + ) + } + } + Text(text = folders[index].name!!) + } + } + } + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/eu/toldi/balazs/caster/FolderViewActivity.kt b/app/src/main/java/eu/toldi/balazs/caster/FolderViewActivity.kt new file mode 100644 index 0000000..846064d --- /dev/null +++ b/app/src/main/java/eu/toldi/balazs/caster/FolderViewActivity.kt @@ -0,0 +1,201 @@ +package eu.toldi.balazs.caster + +import android.annotation.SuppressLint +import android.os.Bundle +import android.util.Log +import androidx.activity.ComponentActivity +import androidx.activity.compose.setContent +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.* +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowBack +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.* +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.semantics.Role.Companion.Image +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.documentfile.provider.DocumentFile +import coil.compose.AsyncImage +import coil.compose.SubcomposeAsyncImage +import coil.compose.rememberImagePainter +import coil.size.OriginalSize + +import coil.transform.CircleCropTransformation +import com.google.accompanist.pager.ExperimentalPagerApi +import com.google.accompanist.pager.HorizontalPager +import com.google.accompanist.pager.rememberPagerState +import eu.toldi.balazs.caster.helpers.FileCacheHelper +import eu.toldi.balazs.caster.services.ChromecastManagerService +import eu.toldi.balazs.caster.ui.theme.CasterTheme +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import su.litvak.chromecast.api.v2.ChromeCast +import java.io.File + +class FolderViewActivity : ComponentActivity() { + + companion object { + var chromecastRecv: ChromeCast? = null + var folderRecv: DocumentFile? = null + } + + @SuppressLint("CoroutineCreationDuringComposition") + @OptIn(ExperimentalPagerApi::class) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + if (chromecastRecv == null || folderRecv == null) finish() + val chromeCast: ChromeCast = chromecastRecv!! + val folder: DocumentFile = folderRecv!! + val cacheHelper = FileCacheHelper(applicationContext) + setContent { + CasterTheme { + // A surface container using the 'background' color from the theme + Surface(color = MaterialTheme.colors.background) { + Column(modifier = Modifier.fillMaxSize()) { + MenuBar(title = folder.name!!) + val images = folder.listFiles() + .filter { it.name?.endsWith(".png") ?: false || it.name?.endsWith(".jpg") ?: false } + //cacheHelper.cacheThis(images.map { it.uri }) + Log.e("CastFile", images.size.toString()) + val row_count = images.size / 3 + 1 + /*LazyColumn(modifier = Modifier.fillMaxWidth()) { + items(row_count) { index -> + Row(modifier = Modifier.fillMaxWidth()){ + for (i in 0 until 3){ + if(index+i >= images.size) break + val imageFile = if (images[index+i].exists()) { + cacheHelper.cacheThis(listOf(images[index+i].uri)) + File(cacheDir, cacheHelper.tryFileName(images[index+i].uri)) + } else { + File(cacheDir, cacheHelper.tryFileName(images[index+i].uri)) + } + Card(modifier = Modifier + .padding(all = 5.dp) + .weight(1f)) { + Column { + Column( + modifier = Modifier + .height(100.dp) + .width(100.dp) + .padding(10.dp) + ) { + Image( + painter = rememberImagePainter( + data = imageFile + + ), + contentDescription = null, + modifier = Modifier.fillMaxWidth() + ) + } + //Text(imageFile.name) + } + } + } + } + } + }*/ + val pagerState = rememberPagerState() + if (!pagerState.isScrollInProgress) { + val currentPage = pagerState.currentPage + Log.e("Caster_IMG", currentPage.toString()) + GlobalScope.launch(Dispatchers.IO) { + Thread.sleep(1000) + if (pagerState.currentPage == currentPage && !pagerState.isScrollInProgress) { + val imageFile = if (images[currentPage].exists()) { + cacheHelper.cacheThis(listOf(images[currentPage].uri)) + File(cacheDir, cacheHelper.tryFileName(images[currentPage].uri)) + } else { + File(cacheDir, cacheHelper.tryFileName(images[currentPage].uri)) + } + val link = "http:/${ChromeCastHelper.getIPv4Address()}:${ChromecastManagerService.PORT}/assets/${ + imageFile.name + }" + Log.e("Caster_IMG","Casting image with url: $link") + val result = ChromeCastHelper.castLink( + link + ){ Log.e("Caster_IMG","Casting done")} + } + } + } + HorizontalPager( + modifier = Modifier.fillMaxSize(), + count = images.size, + state = pagerState + + ) { index -> + val imageFile = if (images[index].exists()) { + cacheHelper.cacheThis(listOf(images[index].uri)) + File(cacheDir, cacheHelper.tryFileName(images[index].uri)) + } else { + File(cacheDir, cacheHelper.tryFileName(images[index].uri)) + } + + Card( + modifier = Modifier + .fillMaxWidth() + .padding(all = 5.dp) + ) { + Column(modifier = Modifier.fillMaxWidth()) { + Column( + modifier = Modifier + .fillMaxWidth() + .height(240.dp) + // .padding(10.dp) + ) { + Log.e( + "Caster_IMG", + "http:/${ChromeCastHelper.getIPv4Address()}:${ChromecastManagerService.PORT}/assets/${imageFile.name}" + ) + SubcomposeAsyncImage( + model = imageFile, + contentDescription = imageFile.name, + loading = { + CircularProgressIndicator() + }, + modifier = Modifier.fillMaxWidth() + ) + + } + Text(imageFile.name) + } + + } + } + } + } + } + } + } + + @Composable + fun MenuBar(title: String) { + TopAppBar( + title = { + Text(title) + }, + navigationIcon = { + IconButton(onClick = { finish() }) { + Icon( + Icons.Filled.ArrowBack, + contentDescription = stringResource(id = R.string.back) + ) + } + } + ) + } + + @Preview(showBackground = true) + @Composable + fun DefaultPreview() { + CasterTheme { + + } + } +} + diff --git a/app/src/main/java/eu/toldi/balazs/caster/MainActivity.kt b/app/src/main/java/eu/toldi/balazs/caster/MainActivity.kt index 0f072f8..84e0d2e 100644 --- a/app/src/main/java/eu/toldi/balazs/caster/MainActivity.kt +++ b/app/src/main/java/eu/toldi/balazs/caster/MainActivity.kt @@ -2,24 +2,39 @@ package eu.toldi.balazs.caster import android.annotation.SuppressLint import android.content.Intent +import android.graphics.ColorSpace.adapt import android.net.wifi.WifiManager import android.net.wifi.WifiManager.MulticastLock +import android.os.Build import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.Image +import androidx.compose.foundation.background import androidx.compose.foundation.clickable +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.* +import androidx.compose.material.Button +import androidx.compose.material.ButtonColors +import androidx.compose.material.ButtonDefaults +import androidx.compose.material.Card +import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.OutlinedTextField +import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Refresh +import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.runtime.livedata.observeAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview @@ -29,14 +44,17 @@ import com.google.accompanist.swiperefresh.SwipeRefresh import com.google.accompanist.swiperefresh.rememberSwipeRefreshState import eu.toldi.balazs.caster.model.ChromeCastViewModel import eu.toldi.balazs.caster.ui.theme.CasterTheme +import eu.toldi.balazs.caster.ui.theme.getColorScheme import su.litvak.chromecast.api.v2.ChromeCast + + open class MainActivity : ComponentActivity() { protected lateinit var viewModel: ChromeCastViewModel protected var multicastLock: MulticastLock? = null - + protected lateinit var colorScheme: ColorScheme protected fun isViewModelInitialised() = ::viewModel.isInitialized override fun onStart() { @@ -67,13 +85,13 @@ open class MainActivity : ComponentActivity() { setContent { CasterTheme { - + colorScheme = getColorScheme() viewModel = ViewModelProvider(this).get(ChromeCastViewModel::class.java) val chromeCastState = viewModel.chromeCasts.observeAsState(initial = emptyList()) val chromeCasts = chromeCastState.value Log.e(null, chromeCasts.toString()) // A surface container using the 'background' color from the theme - Surface(color = MaterialTheme.colors.background) { + Surface(color = colorScheme.background, contentColor = colorScheme.onBackground) { Column(modifier = Modifier .fillMaxWidth() .fillMaxHeight()) { @@ -123,14 +141,14 @@ open class MainActivity : ComponentActivity() { ) { item { if (chromeCasts.isNotEmpty()) - Text(text = stringResource(id = R.string.available_chromecasts)) + Text(text = stringResource(id = R.string.available_chromecasts),color =colorScheme.onBackground) else { Column( modifier = Modifier.fillMaxSize(), horizontalAlignment = Alignment.CenterHorizontally ) { - Text(stringResource(id = R.string.looking_for_devices)) - CircularProgressIndicator() + Text(text = stringResource(id = R.string.looking_for_devices),color= colorScheme.onBackground) + CircularProgressIndicator(color = colorScheme.secondary) } } } @@ -152,7 +170,7 @@ open class MainActivity : ComponentActivity() { } AlertDialog(onDismissRequest = dismiss, title = { - Text(text = stringResource(id = R.string.add_chromecast)) + Text(text = stringResource(id = R.string.add_chromecast),color= colorScheme.onBackground) }, text = { OutlinedTextField( @@ -160,7 +178,7 @@ open class MainActivity : ComponentActivity() { onValueChange = { ipaddress = it }, - label = { Text(stringResource(id = R.string.ip_address)) }, + label = { Text(stringResource(id = R.string.ip_address),color= colorScheme.onBackground) }, modifier = Modifier.padding(vertical = 4.dp) ) }, buttons = { @@ -173,11 +191,16 @@ open class MainActivity : ComponentActivity() { add(ipaddress) dismiss() }, - modifier = Modifier.padding(all = 8.dp) + colors = ButtonDefaults.buttonColors(backgroundColor = colorScheme.primary, contentColor = colorScheme.onPrimary), + modifier = Modifier.padding(all = 8.dp), + ) { Text(text = stringResource(id = R.string.add_chromecast)) } - Button(onClick = dismiss, modifier = Modifier.padding(all = 8.dp)) { + Button( + onClick = dismiss, + colors = ButtonDefaults.buttonColors(backgroundColor = colorScheme.primary, contentColor = colorScheme.onPrimary), + modifier = Modifier.padding(all = 8.dp)) { Text(stringResource(id = R.string.cancel)) } } @@ -221,7 +244,9 @@ open class MainActivity : ComponentActivity() { ) } - Column(modifier = Modifier.fillMaxWidth().height(80.dp), + Column(modifier = Modifier + .fillMaxWidth() + .height(80.dp), verticalArrangement = Arrangement.Center) { Text( text = "Name: " + when { @@ -265,7 +290,9 @@ open class MainActivity : ComponentActivity() { ) } } - } + }, + backgroundColor = colorScheme.primary, + contentColor = colorScheme.onPrimary ) } diff --git a/app/src/main/java/eu/toldi/balazs/caster/model/ChromecastManageViewmodel.kt b/app/src/main/java/eu/toldi/balazs/caster/model/ChromecastManageViewmodel.kt index 2850bb1..95950f2 100644 --- a/app/src/main/java/eu/toldi/balazs/caster/model/ChromecastManageViewmodel.kt +++ b/app/src/main/java/eu/toldi/balazs/caster/model/ChromecastManageViewmodel.kt @@ -4,6 +4,7 @@ import android.net.Uri import android.util.Log import androidx.compose.runtime.State import androidx.compose.runtime.mutableStateOf +import androidx.documentfile.provider.DocumentFile import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import eu.toldi.balazs.caster.ChromeCastHelper @@ -20,6 +21,9 @@ class ChromecastManageViewmodel : ViewModel() { private val _mediaState = mutableStateOf(null) val mediaStatus: State get() = _mediaState + private val _folderListState = mutableStateOf>(listOf()) + val folderListState : State> + get() = _folderListState lateinit var chromeCast: ChromeCast @@ -107,6 +111,12 @@ class ChromecastManageViewmodel : ViewModel() { } } + fun addFolder(folder: DocumentFile){ + if(folder.isDirectory){ + _folderListState.value += folder + } + } + fun getIPv4Address(): InetAddress? { NetworkInterface.getNetworkInterfaces().toList().forEach { interf -> interf.inetAddresses.toList().forEach { inetAddress -> diff --git a/app/src/main/java/eu/toldi/balazs/caster/model/SponsorBlock.kt b/app/src/main/java/eu/toldi/balazs/caster/model/SponsorBlock.kt new file mode 100644 index 0000000..ed41f41 --- /dev/null +++ b/app/src/main/java/eu/toldi/balazs/caster/model/SponsorBlock.kt @@ -0,0 +1,32 @@ +package eu.toldi.balazs.caster.model + +import com.beust.klaxon.* +import java.net.URL + +private val klaxon = Klaxon() + +class SponsorBlock(elements: Collection) : ArrayList(elements) { + fun toJson() = klaxon.toJsonString(this) + + + companion object { + fun fromJson(json: String) = SponsorBlock(klaxon.parseArray(json)!!) + fun fromID(id: String) = SponsorBlock(klaxon.parseArray(URL(url+id).readText())!!) + private const val url = "https://sponsor.ajay.app/api/skipSegments?videoID=" + } +} + +data class SponsorBlockElement ( + val category: String, + val actionType: String, + val segment: List, + + @Json(name = "UUID") + val uuid: String, + + val locked: Long, + val votes: Long, + val videoDuration: Double, + val userID: String, + val description: String +) \ No newline at end of file diff --git a/app/src/main/java/eu/toldi/balazs/caster/services/ChromecastManagerService.kt b/app/src/main/java/eu/toldi/balazs/caster/services/ChromecastManagerService.kt index 90db981..26b0335 100644 --- a/app/src/main/java/eu/toldi/balazs/caster/services/ChromecastManagerService.kt +++ b/app/src/main/java/eu/toldi/balazs/caster/services/ChromecastManagerService.kt @@ -4,6 +4,7 @@ import android.app.Notification import android.app.NotificationManager import android.app.PendingIntent import android.app.Service +import android.content.Context import android.content.Intent import android.media.MediaPlayer import android.os.Build @@ -15,7 +16,9 @@ import androidx.annotation.RequiresApi import androidx.core.app.NotificationCompat import eu.toldi.balazs.caster.App.Companion.CHANNEL_ID import eu.toldi.balazs.caster.ChromeCastHelper +import eu.toldi.balazs.caster.ChromecastManagerActivity import eu.toldi.balazs.caster.R +import eu.toldi.balazs.caster.model.SponsorBlock import io.ktor.application.* import io.ktor.features.* import io.ktor.http.* @@ -40,6 +43,7 @@ class ChromecastManagerService : Service() { const val ACTION_PAUSE = "action_pause" const val ACTION_REWIND = "action_rewind" const val ACTION_FAST_FORWARD = "action_fast_foward" + const val ACTION_SET_YT_ID = "action_set_yt_id" const val ACTION_NEXT = "action_next" const val ACTION_PREVIOUS = "action_previous" const val ACTION_STOP = "action_stop" @@ -54,6 +58,7 @@ class ChromecastManagerService : Service() { private lateinit var pendingIntent : PendingIntent private var mediaStatus: MediaStatus? = null private var file : File? = null + private var yt_video :YoutubeVideo? = null override fun onBind(p0: Intent?): IBinder? = null private lateinit var chromeCast: ChromeCast @@ -89,11 +94,25 @@ class ChromecastManagerService : Service() { ACTION_PAUSE -> mController.transportControls.pause() ACTION_FAST_FORWARD -> mController.transportControls.fastForward() ACTION_REWIND -> mController.transportControls.rewind() + ACTION_SET_YT_ID -> setYTID(intent) } return START_REDELIVER_INTENT } + private fun setYTID(intent: Intent) { + CoroutineScope(IO).launch { + try { + val id = intent.getStringExtra("yt_id")!! + val url = intent.getStringExtra("media_url")!! + yt_video = YoutubeVideo(id,url, SponsorBlock.fromID(id)) + Log.e(null,yt_video.toString()) + }catch (e: Exception) { + Log.e("CasterService",e.stackTraceToString()) + } + } + } + private fun initAction(intent: Intent?){ initMediaSessions() @@ -104,42 +123,91 @@ class ChromecastManagerService : Service() { Log.e(null, address) chromeCast = ChromeCast(address) chromeCast.name = name + ChromecastManagerActivity.chromeCast_ = chromeCast val notificationIntent = Intent(this, ChromecastManagerService::class.java) pendingIntent = - PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_MUTABLE) + PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE) val notification: Notification = NotificationCompat.Builder(this, CHANNEL_ID) .setContentTitle("Caster for ${chromeCast.name}@${address}") - .setSmallIcon(R.drawable.ic_caster_logo) + .setSmallIcon(R.drawable.ic_new_caster_monochrome_foreground) .setContentIntent(pendingIntent).build() startForeground(1, notification) CoroutineScope(IO).launch { - server.start(wait = true) + var started = false + while (!started) { + try { + server.start(wait = true) + started = true + Thread.sleep(1000) + } catch (e: Exception) { + Log.e(null,e.stackTraceToString()) + } + } } + val prefs = getSharedPreferences( + "eu.toldi.Caster", Context.MODE_PRIVATE) CoroutineScope(IO).launch { - + var errorCount = 0 while (true) { try { ChromeCastHelper.chromeCast = chromeCast var status = chromeCast.status Log.d(null, status.applications.toString()) - + if(status.runningApp.id == ChromeCastHelper.APP_BACKDROP) + errorCount++ val status_message = if (status.runningApp != null) { ChromeCastHelper.getApplicationDisplayName(status.runningApp.id) } else { "${chromeCast.name} is ready for casting" } mediaStatus = ChromeCastHelper.fetchMediaStatus() + Log.e("Caster_Service","Sb enabled: "+prefs.getBoolean("sponsorblock_enabled",false).toString()+ " yt: ${yt_video.toString()}") + if(prefs.getBoolean("sponsorblock_enabled",false) && yt_video != null){ + try { + if(yt_video!!.url.startsWith("https://youtu.be/")){ + yt_video!!.url = mediaStatus!!.media.url + } + if (mediaStatus!!.media.url != yt_video!!.url) { + yt_video = null + } + checkForSponsorBlock() + } catch (e:Exception){ + //yt_video = null + } + }else { + yt_video = null + } + + errorCount = 0 buildNotification() } catch (e: Exception) { Log.e(null,e.stackTraceToString()) + errorCount++ } - Thread.sleep(10500) + if(errorCount > 120){ + stopForeground(true) + break + } + Thread.sleep(1000) } } } + private fun checkForSponsorBlock() { + try { + + + yt_video!!.sponsorBlock.forEach { + if (mediaStatus!!.currentTime >= it.segment[0] && mediaStatus!!.currentTime <= it.segment[1]) + chromeCast.seek(it.segment[1]) + } + }catch (e: Exception) { + Log.e(null,e.stackTraceToString()) + } + } + private fun generateAction( icon: Int, title: String, @@ -147,7 +215,7 @@ class ChromecastManagerService : Service() { ): NotificationCompat.Action { val intent = Intent(applicationContext, ChromecastManagerService::class.java) intent.action = intentAction - val pendingIntent = PendingIntent.getService(applicationContext, 1, intent, 0) + val pendingIntent = PendingIntent.getService(applicationContext, 1, intent, PendingIntent.FLAG_IMMUTABLE) return NotificationCompat.Action(icon,title,pendingIntent) } @@ -313,4 +381,10 @@ class ChromecastManagerService : Service() { } ) } + + data class YoutubeVideo( + val id: String, + var url: String, + val sponsorBlock: SponsorBlock + ) } \ No newline at end of file diff --git a/app/src/main/java/eu/toldi/balazs/caster/ui/theme/ColorScheme.kt b/app/src/main/java/eu/toldi/balazs/caster/ui/theme/ColorScheme.kt new file mode 100644 index 0000000..4f2478e --- /dev/null +++ b/app/src/main/java/eu/toldi/balazs/caster/ui/theme/ColorScheme.kt @@ -0,0 +1,35 @@ +package eu.toldi.balazs.caster.ui.theme + +import android.os.Build +import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.material.MaterialTheme +import androidx.compose.material3.* + +import androidx.compose.runtime.Composable +import androidx.compose.ui.platform.LocalContext + +@Composable +fun getColorScheme(): ColorScheme { + val LightColorScheme = lightColorScheme( + primary = MaterialTheme.colors.primary, + secondary = MaterialTheme.colors.secondary, + tertiary = MaterialTheme.colors.secondaryVariant, + // error, primaryContainer, onSecondary, etc. + ) + val DarkColorScheme = darkColorScheme( + primary = MaterialTheme.colors.primary, + secondary = MaterialTheme.colors.secondary, + tertiary = MaterialTheme.colors.secondaryVariant, + // error, primaryContainer, onSecondary, etc. + ) + + val darkTheme = isSystemInDarkTheme() + + val dynamicColor = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S + return when { + dynamicColor && darkTheme -> dynamicDarkColorScheme(LocalContext.current) + dynamicColor && !darkTheme -> dynamicLightColorScheme(LocalContext.current) + darkTheme -> DarkColorScheme + else -> LightColorScheme + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_new_caster_foreground.xml b/app/src/main/res/drawable/ic_new_caster_foreground.xml new file mode 100644 index 0000000..d7f2538 --- /dev/null +++ b/app/src/main/res/drawable/ic_new_caster_foreground.xml @@ -0,0 +1,53 @@ + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_new_caster_monochrome_foreground.xml b/app/src/main/res/drawable/ic_new_caster_monochrome_foreground.xml new file mode 100644 index 0000000..0ec7927 --- /dev/null +++ b/app/src/main/res/drawable/ic_new_caster_monochrome_foreground.xml @@ -0,0 +1,53 @@ + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index eca70cf..0000000 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_new_caster.xml b/app/src/main/res/mipmap-anydpi-v26/ic_new_caster.xml new file mode 100644 index 0000000..12d6403 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_new_caster.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_new_caster_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_new_caster_round.xml new file mode 100644 index 0000000..12d6403 --- /dev/null +++ b/app/src/main/res/mipmap-anydpi-v26/ic_new_caster_round.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_new_caster.png b/app/src/main/res/mipmap-hdpi/ic_new_caster.png new file mode 100644 index 0000000000000000000000000000000000000000..d6e561f08cdd609a105dda977aefcdd9a7f843fa GIT binary patch literal 1664 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_new_caster.png b/app/src/main/res/mipmap-mdpi/ic_new_caster.png new file mode 100644 index 0000000000000000000000000000000000000000..47a0b6af11b72f1d0dcdb305721038a4eb31056c GIT binary patch literal 1146 zcmV-=1cm#FP)MShQ?s?Uqt7?1b*qifJ^aYO2Y&?MUz=$*f73S4PRFcIdCCy=p9A3l9n=~0b{aw z$FQvbJbsl%>iU;*f5jIkq;Jt6gZbtte%srJ9JAJdkQp!6_93k9AIBeJKz<~6Bx22! z25sQ-vmJ1nwFZPy*w~9TzHvTnJ#uBrE9W8K~wFZRQK%(A(r}kob?5wo?z z$w!}$v4MgDJAXL4i&uVbjF_5jw4F|yow}b2N2PQMK_>8p4?1`nLnI7>md+s&$~Dmsd6+}*9q+lJIhb|kQ!;QcmA244FFyuBPu&jfG2 z4ZQn4CGHMz$#QT_38sX}@w)RX@4 zSHL^npi7N>Wi8lxLXUdSDX?U{PL~$HHsJAiW~HpGEVc%A?gMYk(z!2lpwJ0sRC?@aR^>OPFmGk%tSrm6vgWx^(NQxXk9;p5)sK)zzt*FE*Cw#Yr5^>mhV_b6 z)1W4`N~8U6&ra*0zN^8aqh{cU%J&CU+N@F|UtXyVwZ9K$E&-d4s1-yRD_RFu*M$n1 zEAwig>oYxBA9_NsAY~i%2+E4m;8AAYlhgsXzZfcHuFR_e1Ic$;|8rJ?b**5=VwDod z^^zzCWVsD)GgqQwz&8#)Tn|3ks0_RcZmyo{fIIgi;21C;M8$w0|J{fYpV~Fw8q;NR zXQV8+ZX`s_K&+UPf&cZNyUkv#P1HM3--2SZ)_^cx8Z>ku&wC!fOQS@2!QsEC_Lwuc zR9%lk(b&`!#(>21>zg#Si~40UN<%Rs*LYy`Eyrthz8X~87R~sINn-j-i?al-<^i1S z8NsC5eg8as2AAa;ON>6%?mnrGFYm4`o=P9ftOg{eD=bp1y5%0YH*Q7chAr_y`Yzsp zO`=6KT~oXfQqi>y3)RPTMP{5y7cKu8q=gm{8}LjV8( M07*qoM6N<$f@~Qer~m)} literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_new_caster_round.png b/app/src/main/res/mipmap-mdpi/ic_new_caster_round.png new file mode 100644 index 0000000000000000000000000000000000000000..6f6914a138fb09a970ba98c314cdbc5da013dc87 GIT binary patch literal 2245 zcmV;$2s-zPP)7F;1$`o|5jS$;+Z z=VD=wbt_}bn(yQUy%D$ka3|*LCvmHWLz4qMNH8t z19@`pB>D1aL0q}I^p}z~I#G(>>cF60_*kJCj1hNi$32?;^PJF$R&5*wmM@wj=e}GS zSAM&Cwq%V-vJ@bO6BIIT(p3GaHf9_gCH60w0yd^s593|fxnQt6 z8$@{{MyRXKaL{+r1H@E!0)p;UdZivu z5VOJVcwpB@*v>(n)qO8t3I$9@pg&9AL4`sNwfLk2P2j_qg97|nb_gFR=8jStC`I3@ zqk81K92C$n-*E(AJhA{+g%o(X4%g}i_K(X&fr=)ao*zJFNP%@hWa&=#@5@C2?NGle z*nm+X1q#bCqRR?2LPm{;-1ftv^3;OcU+nl^)?gXNyIv%A6xjYgzL-1{*Mt;MN>#0nga)}L5!}20q+fr? zm3|GI2^uzcLvkiVuDwC6n-00-UJDGz?`nehzXwT8vp6LclHf~_SN&3{IdVoo>6?WQPc+aZ)kQlM6MzUhxyhnE#QtnhJw(ks(`Whq9FFfVjR z7nLV@d3h2D1fue?Wy{RirA6UjBQddYBYWvjsM2}K2D{x#B&>e}`DP$n2~Ru0UVM2O zWcCus0}CKe6`NWd`j)o_l9;H<%+Y4+eM^Cok`k$}uaC;XU@&$C6cbyCYK@3LY)1hx zpVvw(d;#NiFZd4!yPG*49e;X1q)$J{z+qO{Fq}qc9t0|^_|*nWelpYgURVY3`5@WZ z*^-l!6P3q}8)p=FrX&Jj53A)(GpC9D-`PtsiI@Wc^?<9L?yIfpK{LVCPBUZ}~1TyG4Jte(sja&LMB)u=>3H8Q|xsV@Ci;aKwpo!@)z+r4-D&CJq#hO9D zA?!{btlEWzj4^K*(aL(jmerM3i0~b)pV8j}%il{5Se|(>Kf>ZYWX063)^D#qs@~dY z!YApxW2JLE%eoOmwHlo=lUzqimc6S7DZr~B*JVTgSZnPEciaQ{!EIWXHF3G=@cTtk zz&=uLc@LjwjW*Uw;vR+ew+Hg_m-Yo9vZsyNJn{sSP- zmRj$*LvyEQSq%fxO;%ZFS$Q->zkMhlxx`jh*2%?|L$(tB(u?dGB@Y-Flzb9JI&vvQ}g{BUA0J8pN#o=7D!3yOSeb&vRli!nCi zrHBi-k)^HpH%m77)^Sa)-EHs=F`UMZMT$NS)?N4ESN5Zs-e84tDH8P}IE>ru!r%Z` zS(I6{56!>$4Q6vKuG!_V>5P~>Y6&XAn}E@a*ZWqN9>6KOnt;+P#NCY6G*1==!~mz^SE0u_0~Ia zH<{0T$8Yu+j^!M4stRk&dXwz@ND9;;#m*DQJN*BLD{ba8-_gn`JV|j*JmUQS!>gY3 T9p4%f00000NkvXXu0mjfGjc+y literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_new_caster.png b/app/src/main/res/mipmap-xhdpi/ic_new_caster.png new file mode 100644 index 0000000000000000000000000000000000000000..273aef9473a71bf8424bc16e5617f7280036207b GIT binary patch literal 2278 zcmZ`*X;2c18ilxEiC`*Sw+xq3j52e{>%OFEQHo`nYfE zpZs<4zh^7t*Z%w{>@NUdYw=NgTeonZ*^EfCTaQ|EBXhW3!Czf-H3zW0xSkW3StCR-etS zAkxiKKpmoA_m@a$19p6soXpH^Wf+oYMpZjBD_BrZwc(e=4bWP_)}Nt#TD7pi)#-4U zXaYPm5WVd{m1xXsJxl1aumN3It6f!go^E6q5B00uX5%Gq@iFR8oCbdX8HJqoPnBZKHH9Je0C>lB z?fr`7NyKQ3V#)1Tws8-Q>=@KJK!4uc5x2^|q2fEc1s-+1`l4cPLaSn*fUhTbSx!z! zEIIM|!ZHG(+2rw>W*0^d(+Nos|NPu`_PUT>j!%fM7Wm{YL{V!BRajJG8I*;Td5w{O z6>1FAu-(5&I_WZ}Np$7Od969Zteu~Y{b|tRU@EYeR{*Bg7Rf7k)?t;#iuw}jeuI-Z zsMxY(pKkMRzOyn}!4-1mt^wy-<501xJzes1-){h*b7wffBuss?Fx(P#kS&KPZ-$Om_d(;`+?h|Z9is>7mv9f3veZiK#vOgkV zK@mHiQe}g>(Al#Y*_I?ohh)de>E&e#j!iX9OHIYPx~9~$&)hF=3qS5FknWVEtck?0 zA3%hxn;5ih*j*`@e6=ojrkEiomn}YP)30Tdybo~6RBy2n-*Na$T4na(82!qp$EO}L znV6oQ9ybpU$F#JxUYWiDKdZzn$BmMTElutaA*h&O9*+t;mLn)2>T^#-yUR^;>ZT;C z61dTV26iOKa84$IN}(7L0s~JuJHrVC!iB-`V1Xl)-aIiGx64}zrw~lAc^{zRRD?)$ za8mh0#RTT&w)a)`CHc$BU0K_`oAvLZJDH&q!`Z{6)sFdxQh6!xn}=oiuG){C3;K|L z+{q9|=aC~vE)t#u{4g=c1``0H)_qD$;h4q8ntx3hnVrbRphnc`v;yOaA-#29%l3hd zkh;Oy{A=I%E4hV*w_93To>oTXmJT2b2Ci9=jkqT$riHpE$F@|opw44=mT z4yyJ^9mLhO%~1Q-RI!`8OSiGKX@5&x=el5Hdij-=hNz1~qOO%yG+s5kYZ(}{5{k_U zk~55vx&B!vyAxMC{OEzHF!MW0aL{kzK;D%WnyL{E94+xQl`?^IC8W$c>za2l$olbX z<<_?OY6ghqMdeZ;gTd(T?nWSn2s|DS<^@W(egG<&Pwhg&{oV*ag``hMTJ(w|KHM^b zo1&~=d?Es5i@YM^G!7kdS8bCj0(z~l0FC=$>6LDG!RrL1Zx8C{M4)hcshrm0WNx!b z@~hs7otYw+Obw|knVlo|cdFcnytk%*{Wco20v=T2km(z)2cI74o*R#z8Zg$e0F@Lx zu=YZAX3S@3??0=;DUPozj3Twp=_0;Uy%kz0K23Nu=m&Sz!yzl0iC_>X@60xck~8*- zp5!rl!J%(LAx4iOmX&Zf;o*-}{paLr2KG(dm+s&4h&S0Fvea)T!h3Q4o1w4WA>V%# zPY*Ub`3Ve#`FW9ih_`|FH8e`&{b29Wv~knHq7EMk3g7vt@uUxKOjTpQ;$&2u)YR>?xosq~%gX5Ilb2dq zNaj*Gy2b>b{mTUZr?*f*V(WSMGaylPE|_UB_DWnsdqUJ_R6~=1ghBnnYSpZn1SP1u z69uF)!fRCAM2N~lZI#Px+0m~VCh$4`z$?#+9UHh4bswwbRA#BLtN^;bHqk@rE^sH0 zH-Krm|JBTOl&i?QPCi`)S&>JA>?9;lrWW!-m;_!KuxmCJ>Y}|(0ofG)F{nC9c*$xQbhUli*O03M$?a|^}Fyb;gJwu#ijPRVAzjh)SSN$p#z z*A|6I7u#L@P{v+HOZ@qEh;sK+`RXavhC#~Ymj(v+G_95vb!vC%4c-_(YcA|okHvKD}H6HBP%F5Km(R3$IHt<=X6p&geQ`VH3v)B zMdU+$$neP literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_new_caster_round.png b/app/src/main/res/mipmap-xhdpi/ic_new_caster_round.png new file mode 100644 index 0000000000000000000000000000000000000000..6b11b18825805777dd4e6d251e4bace9c88eb7c7 GIT binary patch literal 5033 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

N56=xF($NpFpc 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 CE*H-L literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_new_caster.png b/app/src/main/res/mipmap-xxxhdpi/ic_new_caster.png new file mode 100644 index 0000000000000000000000000000000000000000..14fb8696f986304ea39f3d702cf7dc97e0fb71f2 GIT binary patch literal 4718 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 + + #AAD400 + \ No newline at end of file diff --git a/app/src/main/res/values/ic_new_caster_background.xml b/app/src/main/res/values/ic_new_caster_background.xml new file mode 100644 index 0000000..478e0e5 --- /dev/null +++ b/app/src/main/res/values/ic_new_caster_background.xml @@ -0,0 +1,4 @@ + + + #AAD400 + \ No newline at end of file diff --git a/app/src/main/res/values/ic_new_caster_monochrome_background.xml b/app/src/main/res/values/ic_new_caster_monochrome_background.xml new file mode 100644 index 0000000..cc62054 --- /dev/null +++ b/app/src/main/res/values/ic_new_caster_monochrome_background.xml @@ -0,0 +1,4 @@ + + + #AAD400 + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f379844..b6c82ef 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -18,5 +18,6 @@ Back Now playing Cast URL + FolderViewActivity \ No newline at end of file