From 4eb5df4dfac96c65f878e706c6c73719cded4d16 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Wed, 29 Jun 2022 19:19:44 +0530 Subject: [PATCH 001/132] Barebones-AboutScreen. --- .../manager/ui/screens/AboutScreen.kt | 53 +++++++++++++++++++ .../revanced/manager/ui/screens/MainScreen.kt | 16 ++++++ .../mainsubscreens/DashboardSubscreen.kt | 5 +- build.gradle.kts | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 5 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt new file mode 100644 index 0000000000..b4ec19fd55 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -0,0 +1,53 @@ +package app.revanced.manager.ui.screens + +import android.annotation.SuppressLint +import android.app.Application +import android.content.pm.ApplicationInfo +import android.content.pm.PackageManager +import android.graphics.drawable.Drawable +import android.util.Log +import androidx.activity.ComponentActivity +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.ListItem +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.viewmodel.compose.viewModel +import androidx.navigation.NavController +import app.revanced.manager.ui.Resource +import app.revanced.manager.ui.components.placeholders.applist.AppIcon +import app.revanced.manager.ui.screens.mainsubscreens.PatcherViewModel +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootNavGraph + +private const val tag = "AboutScreen" + +@OptIn(ExperimentalMaterialApi::class) +@Destination +@RootNavGraph +@Composable +fun AboutScreen( + //navigator: NavController, +) { + Column() { + Box(modifier = Modifier.fillMaxSize()) { + Text( + text = "ReVanced Manager", + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier.align(Alignment.TopCenter).paddingFromBaseline(12.dp,0.dp) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index c318bf6e4f..6420ad526d 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -20,6 +20,7 @@ import app.revanced.manager.ui.components.BottomNavBar import app.revanced.manager.ui.components.placeholders.Icon import app.revanced.manager.ui.screens.destinations.AppSelectorScreenDestination import app.revanced.manager.ui.screens.destinations.PatchesSelectorScreenDestination +import app.revanced.manager.ui.screens.destinations.AboutScreenDestination import com.ramcosta.composedestinations.DestinationsNavHost @OptIn(ExperimentalMaterial3Api::class) @@ -55,6 +56,19 @@ fun MainScreen() { } ) } + AboutScreenDestination -> { + AppBar( + title = { Text(text = "About")}, + navigationIcon = { + IconButton(onClick = { navController.navigateUp() }) { + androidx.compose.material3.Icon( + imageVector = Icons.Default.ArrowBack, + contentDescription = "Return" + ) + } + } + ) + } else -> { val currentUriHandler = LocalUriHandler.current @@ -84,6 +98,8 @@ fun MainScreen() { navController.appCurrentDestinationAsState().value != AppSelectorScreenDestination && navController.appCurrentDestinationAsState().value != PatchesSelectorScreenDestination + && + navController.appCurrentDestinationAsState().value != AboutScreenDestination ) BottomNavBar(navController) }, content = { innerPadding -> diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt index d49b9d4ca4..608ff8924d 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt @@ -17,7 +17,10 @@ import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import app.revanced.manager.R import app.revanced.manager.ui.models.DashboardViewModel +import app.revanced.manager.ui.screens.AboutScreen import com.ramcosta.composedestinations.annotation.Destination +import app.revanced.manager.ui.screens.destinations.AboutScreenDestination +import app.revanced.manager.ui.screens.destinations.AppSelectorScreenDestination import com.ramcosta.composedestinations.annotation.RootNavGraph @OptIn(ExperimentalMaterial3Api::class) @@ -85,7 +88,7 @@ fun DashboardSubscreen( } } Card( - onClick = { /*TODO*/ }, + onClick = { navigator.navigate(AboutScreenDestination().route) }, modifier = Modifier .padding(4.dp) .weight(1f) diff --git a/build.gradle.kts b/build.gradle.kts index e198210780..212baa260c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,8 +12,8 @@ buildscript { } plugins { - id("com.android.application") version "7.4.0-alpha03" apply false - id("com.android.library") version "7.4.0-alpha03" apply false + id("com.android.application") version "7.4.0-alpha06" apply false + id("com.android.library") version "7.4.0-alpha06" apply false id("org.jetbrains.kotlin.android") version "1.6.21" apply false id("com.google.devtools.ksp") version "1.6.21-+" apply false } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 35e5c3f2c8..af82424a2c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Mon May 09 12:07:41 MSK 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-rc-1-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From 1cc7da7d30e3d9e5b2750bf2e85e33de29cb6f70 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Wed, 29 Jun 2022 20:29:25 +0530 Subject: [PATCH 002/132] Added temp revanced logo. --- .../manager/ui/screens/AboutScreen.kt | 39 ++++++++++++++---- .../main/res/drawable-v24/revancedtext.png | Bin 0 -> 617353 bytes 2 files changed, 31 insertions(+), 8 deletions(-) create mode 100644 app/src/main/res/drawable-v24/revancedtext.png diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index b4ec19fd55..bdb47957c1 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -7,11 +7,14 @@ import android.content.pm.PackageManager import android.graphics.drawable.Drawable import android.util.Log import androidx.activity.ComponentActivity +import androidx.compose.foundation.Image +import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.ListItem +import androidx.compose.material3.Divider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -19,7 +22,12 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.colorResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -31,6 +39,7 @@ import app.revanced.manager.ui.components.placeholders.applist.AppIcon import app.revanced.manager.ui.screens.mainsubscreens.PatcherViewModel import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph +import app.revanced.manager.R private const val tag = "AboutScreen" @@ -41,13 +50,27 @@ private const val tag = "AboutScreen" fun AboutScreen( //navigator: NavController, ) { - Column() { - Box(modifier = Modifier.fillMaxSize()) { - Text( - text = "ReVanced Manager", - style = MaterialTheme.typography.headlineMedium, - modifier = Modifier.align(Alignment.TopCenter).paddingFromBaseline(12.dp,0.dp) - ) - } + Column(Modifier.padding(8.dp)) { +// Box() { +// Text( +// text = "ReVanced Manager", +// style = MaterialTheme.typography.headlineMedium, +// modifier = Modifier +// .fillMaxWidth() +// .align(Alignment.TopCenter) +// .padding(20.dp,0.dp,0.dp,12.dp), +// textAlign = TextAlign.Center +// ) +// } + Image( + painterResource(R.drawable.revancedtext), + contentDescription = "ReVanced Logo", + modifier = Modifier + .fillMaxWidth() + .height(150.dp) + ) + Divider(Modifier.alpha(.5f)) + } + } \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/revancedtext.png b/app/src/main/res/drawable-v24/revancedtext.png new file mode 100644 index 0000000000000000000000000000000000000000..53c25fbe9a2b1c92f599b9d1d751f87cae72e292 GIT binary patch literal 617353 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 z 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 *yN_5S?#-2Ly1 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%0Aq<{mNQ#ErO#PLc5;UTLE;MgPk3Vtrq0T1AJ{w@) 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∨7r@Z+}jNkj8q~z1RZRxhv`i#KDfgb! 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

`nG^n3CCU!}l<+ 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

N6zEw?TO zsQ-HB@Xy}9v?Su^lA%rfXz(HB?NzbV;@OpN>xb-;UmJnGm(oSRJ{8AW3dM zSsbBdB{+#6B`^#`7zuF*>-YYgWr0%3OGu*2Q@>~=*PAgz-JtxGeHjPAFnoMr*3Abm z{7m$i@Mu3jg_L-Q9CEcO7QC#zjsO9du&R3Ro9a-_rnbKGDnMXk{D#rnH_~Rg9A8DR zsbhzcGMEiemlu4?NmNVdhL5r-xzF@T)`!tK_oVfy3@O(EbX$UC{%EgBUf~|^)AP>z z6aq#;g>A}^1S0^6R~}1Lr!AIJ`=F!K9w~8pTAJNpX@B~9l#2|xwo$nc1B0TbhE4&4 z{bq7Njx`6-I_QInoqcb9Wx2-VYnBcK$wCdyS}}aM;Xs=T(oDo!6OFQFc#ixG-s9~o z?!IO)wOi*7yb6lb&8Yy(9M|fgVwY&z5mn)HpLT+GKl!^Xpz};@F5mkjbhT5L!+wmiJ!zSbu)&sr#(2pO+oyz8t!50 z+g9VRn2-fpubsZE&El$u=ic1Qqwsg374x<-LN)yIuL05u7~9be%r?)YdhW}XLg>Lg zC-u-U6mo;%&0xyEq7)lx6P${{Nu&uAUp0NpLKR8XIU+vI6E3r~?HQTfbk!S%J`{2X zH(|{f1TVdl`&N$`m<%Ju($$#%Yn4el@N7vUgd*S5~&B# zrB3gzxv;p4pvD_}E+5r$lIU*!RhiXD^PJiFGunGbclG;=*M2Pn^DgjGe|Th>+Z^Gw z3NIKWvu>&-b0SuC1C;|x-gj(T9Px#_2w;sB1r+mVg0|x20f6#h>%;g@Rp)lHxl;=| z#=ESJ?wI@Y8pvN4%={%#w%x+62z!F`~vuH3#ys!&WP7cV<+l$S1g7MaeoLqT9 z*-JI(5bvrvtZ7}0Ks^?ASe5HO+<9aA)0en|{%j6}@JeU@LPrKE3dgh9lLXn{_vF`Q zJ{)7az>X$2zoE=H;+E?h*_3lCFC)dc-doCt7)Z$C0WWH$g=-T;Bz>qY;uaT1T8vI) zG1SWa`5I|}c_Zh&ILnIKV{P=*WXoJz+=)V7=|9i3rTza@ZH73El3!7U{#5gTc;3@; zGiJb?)kQKZ_f4cog%o;!63iE>t^ows#^;fmWQoJwPdX~X;}oOYXhSj|K7I{lM%zLw zW&MJ-$!J@GOqY@1%|2eWuW_u!Lt0lEpgf#-$p79saO7?;jD8K!3*v|B;Rm8I;pF42 zwIA05==S z8qm2wc?*l55PlP2#ESgksBDZhSB+M2+QyS8Xxww4WT|2&F z1G|9NW=J&l$v#%?3;SAo3IdqfEa$jn7%Bp6U`)~Nq}_hz zNH_Vs#SsY@ueuRp#50H2%7ArwU4RcKPP!!%A574T4G{H0a}4)|4Ky~~DiOIuMZTnEBT%a+754sH0R(rA6bpg`HFFdE-pN~tY4!1d;}b9kB*0+`Vcj= z(Ot*JZJ}et`QAB%oB8>@T79HFijtdQ+AFL_k~=YrB8IR0muG{evs7<_vZB*(mFK|M z(Z%%>yD?1pe_Uqx;1ypO93TFbcadfG6v3x|Jewg7cHD2rS|EiWQdq))n`NY^c%XAM zU?Mn`ahS2TPntftycq%Al@ZsfhzePy*jt!x!l{qizxcYYfUaY5nL! zbH6dd{*ILVT_E>8?`cK;wMSV7*rtNlc_sDS69_RClrJp9ZmJnSy+%OjCs{i7F=@Lk zJ)EcaePc#*{5Ul;9=?16%^v(P!-I_%`fH5^l)sc4!SKA&5=@c&+wH;DB2yAxyrw%B z?Ug_YdQxb6*tpJDuy=O=eBg40GTyCY-%#Bax zk5KSHt?qB-Ul6mp-=`u(>7;K#YT^M8l2!2ubU zJB}HrND(l}FlBU-*Nam@#P4foEL`@=q>1WuObt8`KkbUE1)BsC1Z(zkNBe$s0LdHL zNbfw;Z)Vgr|M{R$fMdojHn#KKB->7k4?Bqyj(T&N!$=u|rdLvqt z5j9(uOr%p~PVaj(|G|^MolZ$H-#Dl(z15f*oPhy$R6|QSv1wpHQF-PItp%7vJ0%Eq zxg&oV>CJSQKm+^q39jKtXpE8d=P zQ~OFZ%4%=fKqI`SXmGdeS&A>)WMSfg+5-o0OFZ-=mdvt1k=ER_wVeY22=gnmD*pUJ zyj5KPLw4NdQQ@J7KxZ%JxSl&pU&cmHm;k8h^zSM%cLM~iHq zY7QsVZ?kUY+pN~h({VZ!_fcJ0u1EP9aY`hw{{A| zPl^`?NVnIG*C0WDHz6>#A`aLnrs>h)5REl{m(HY7GqeUx4iFlDY_FwQR-poL2UXyn z_Xs%#f#z2?X@VLbXv#=t{MChNF@`{Ns09twkqe&6Ls)RGZ`%t_ZK~emoo#t1$MnG{ ztQO@ckH;Z8;!%}nb|Ad^Ob(~*C$_y)hXQWui zpi6?Mf0al>|Ic8~ zLuvknG^!Py`5T=)T-_NNxNC}~JcfHj1bo+*)i6b9U5{WqY?=kiqEJAr zguqQKaw?0$&ti0T)^}iHrhb$7&2}P=J$NA=>1L&Z#=h~rg6mh_^+=*gQr!b|5ZBjj36XHK&BRn}n-0upIX8Scb}Lg6IpwyB@xctg69qe~#pf z0>SX6H_1wFJ)DM-Ld@SH$9* zCS1$b)G`X#cV{18PPuL~-v9Z4BYab&oI(_gA4uEU7#Qrn1^6tPG~;NYUNpsil_;bM zT?_cj90T7C-RtuJX4`|R_a{uez3u(M{J&Tak|H+K14y<`yXw(kW4TqN#shQikd?3P zSsDTU!L=I|Xw3zQh6lYHOM>u$49qh2V36O3`xcRsDiV=EC`N*yN;x~)vbkIxoeqp{B$H9f| zC=9$#aX#Y&F^sIYUqgQis4rx6aVG5YET$T~P!iTYl*AWoQ$kh9szltk{BShK4SVqF zhdxi3ZGx%qH#X}@C9wQ>nX2uBj^`8IQBpSo-P%_Re%}^9{S+K^d`Emt8R1kPw+5SI z%Tq*d-9^|ASam*dTV||Z8Op<<=+-<$4|Vm<4S@ND*3}fd36_>0y&a|eb(av6K9X@x zFGcr3$UKJOh3CC?T=g!H&$~tgmg9o9`zeXK#NNnKw^6Q4v-dO zIVWeI2ZzG=F6X5lS84Yb+&wW!X_{B;jYTUq-A`vgVhbLjXY)yf<`pX%X>Jd{OxC`` zTvYLeEai;Q4xnnXd~S~y++}TivB}Nc&EDc;9wpq&?n+V53bhEEK0#;s`LdSOk&T|D zA3ZCdVk2UsNE3*`-_}qANd}=un)z>Tb$HSGa))iArbJX%e+37=&cLH6UzL;eWyXk? zaFCDJ^J8%EEjlt0r7vG@_~^;*;Ks56D*Efg{$XypB}!`{%MzM)Oe?b#HTH^}xy-RH zKiNFNQofjvxPcqQv|Q+1eGB*nj<;>VJUyx*^}J1Zs$HUa?uh z7lr)&`F3F2tEv7YCj$-6s;$HtDGI+@ObaG><2N!lIt%C!e$w@PD|c&xb4A%E`w9CA zs)?Aalk{5Rahb|jqns92Ir{SV8gG_A+MeaiNJ|JyL24BH&GkzuHzjlw7EjY;A5{h} z&=uY5A1BQ#*MDCwy4V3nnlUgS!rW$`Uz|`9 zRw=XZudVeW4FjCtun-1x_4(r&rTQ5h#7#70Itz3f)WE91QkQAMmDd6u6$YQ^6Qp6f zk&qIB9>ur@Uoxt6q!9&twG35I0c&#VR~WTGz`n21$=ubt%L};vR}h~Gv@^|*yk}cw z>3ghGj*N2=)iH9WK~7dw69Bk0)XY51W<=rh{06ogs6<>EOsbDNK|Dm1%b%R+*E_%PY)r%36S-g-BroQR$w4|MgL8NrnN2%|Wvj%IEAK@p5 zn3*o19iCP>UW;6Q<}O zoU~SYHd2b-6Ip=W8@naAsL=I|dV;ZQ;WOP9=_Kx!kfDmBDaQlz>+J(oyZpG9Uyj7C z5L3>xXbrU}D_C8ppE7C;-{!sJC>wO~7Q?Ul6jElSL-odSjBW7Mjo1X>3ypnjpjG~z z+6i@tIVkEVG4em7acbgLlK|37o)KUnt*Y0wZP=|NnATU}yS0O+tSU>V_s7|oBXffR zYBaKkpgvuhdG4OSf<(7JROc%n#_pp!@$2gZH<^wEcI#KJeP23UR#tb7 zcXiS{YDU|B=Kt8*Os1F6oF$xT@B98SV5LD8Yp5C~Av)fZA&BcvV6hAph`7-n$xpgh z?Biz~pM%~0mt+4Q!g5fh;VyWEAQ>Az8 z_uMmFihqSYevxfi2Wqscex#Qefhhl(-XngCkZ+EQl1=-q6Opv*p*pL1vvvR;8q3-1 z31aSL!2iy0kZXi^YlLsEeCjEggpb02XGEObm-VKg;Tf2&iHrqy?bcohqy}e$PfWs~ zCwr2nrX1pvZy~}$V6^zqT!g)gq|frgn5SGS7W`My69-Ao#&WpYylyxGJR^(H4ONlf z#eyeAEVK@$K1ro_+^(@H1=H@tu3gM|Rf_m0{49@B zi!Lb>j6KH_5`Df%YWr2W!h91yPF#1>W&Pp#+3rlqF}|@G7t3inQt?gLbvPaEK)TcB zMf7Ln(QeH4Q|qG(mBch=e;tHqWd4QVEUW4zdT8@z5FhJ_bR_WsAl9A=2d1mtxHF!k z5$5j~zg&J~5Uw0vzK*^xtS_W1f;>{By`@q@Kqt65zL*3X%H)^m+N;r1SRh3b~K1ttbVZNN_& zGxtwVC(CZ)JZMLkeenH&!RxO1ZMv5WLga;%JOmCp?b_-Ra>OH!I)efrecwoe_USY! zLnKiwXQgaBI7E7brzzbnX2h50IGp{@lN}XKm@l}MD%|&R8h3g8mBZ!t`fLX49#R9A zp5a?LON6&H#f7BNZMDDK7I#UKdKugg2e=}IJt;%@yknPQQ*F_X2<(zs0AFef$peX* zXY`Tr{pmOGuQ(eV0Lpz6c$O-;hWx9;((=gq#|NL9W3!C```SH4Vy!~`$K@ji#)R2h zur@`Mf62fMICJg&xeWqW$L(Kii#nvRYv#dS;6;Fs^nru2w-))8KvD22B zTeU*aBeYX+(71ag&v&E5W;Ts#7x+?}UtW_?s~pr18NM$jE#2+F`N&4=;0Ba;7Ysh=Gf$6aJ<{>}QE zdq`AvX1ct`k}(J@k?X0C5{iYDQFF?@Dhl-YxGt`#8Yi)`M zX7mc@bPz`WM40_M9^nMH;(kyCqDYQ{<8m*3!h^%sAv4Zm3$ zY5-Usvihp17RF!B-&W{IO^Q3Sh>SX4bv`ETMGM-#82G-i85nu;#W#PeK@y)-d2*82 zq7SN5E<+uyYGt(5kV@!txj)2bzOJ;ZZ`b~G!Og+o)kIXrGNl!z|n3PAqez+uaTu>8-b#%`4jWaDVI>3 zY}@B&8pNBBy+IU8HRo5E#`qi!AupG0K)@KlO;>^3n$1m|0^I?0>^^{6UgoY6b=c=G z)i=BRoV&vd^Ua}rAoFp#`So^P!3$H$%0&kG2Aa`jaq8h^MMjOJM_dSf_lds{-6I@} zO)psucAIQ>0K(tP#5^b&5KSoOopmWY3$#iu6qCC|a~pS~i7AdF0%?%uA3qDW!h39D zWSlpJfO(%W^Iwp}KoTNH)nEn76+NG7_7;a!F+%C)5`5(gDk}@@h~}(Hzo!z#_Md-d zMBgHrXQY>>FF-= zvesY^NjFd4ev87?a$BO#V7+w^i-q2d$2AS(xZqDR5{)pL27t`l`m|JO8Ew94iZogl z9_;-sJBTEuaFHhCZt=sB*ENDwSuo$~pEH3wF%eE&`{TD_5XthaR<{k_UE(-2;%YB= zeywDFT$d!Ph1fG^8$gSNy}?;in$&iL&v9-+LI^S?(WpKV+Yg(HJtq5Qma?m_)6= z^TY;O`AmzgyAA4{2Ml((iYr|Zu~`?HHh)Du{udMFIa`S4{2$JbN};!g&fNgiZml3vt~vK&s=4);lYrMq)bgtZRPd3FD> z7X{<(+9U`7CUm&rsMK8KE&5>lf3&getvi*)l&4i{MbeFNhLl7 zi1~&kQkX>oF|mW_zMtT?rdbkxH?b3f1;r=&^dW`5rMaAbfqYg{yWlUAp+w211{q0* zuT)Miq@TZIhr`E_rdlwDaOswpTB!*@IH?3oTf52bTIsY0|N z0selEM>>PnUzSZCvc|mjp0Xm^Cw@MyTqAf23#kUJ>uLJr$veN{Zt)%a_pmRt10r4& zWYEDT!>;6ju!l)U7VnH|1<-FyEPhCKb3g%1AkjgC*HE>MFMnoCt%Lo{k~DTK^%A7N zaiA*@@&5f4)Dj{kwID62 zba#W4pnx>e4bt6lzR&-6&bfHQJ1%NI_sl&rccr}CEfv3ViB#n%3o~ipU^Cr@7;}_G zLQPHlTwv1G9S5e%4%t>FQk^c*q7AL;_m2Koso1BIJZEJeC8UbpX?NZ!T?RNP)7-s- z4>D(k*ZszN(16*ljQfp&sHKUG9xg{3EeGp}>~E<+WB9?;{Lj_WrJDSaQ0C|Nrx`gY zCpI`aZByvnwdctsQ(D!b$2rlfLNu~4F3><1Fi652qh;)Ggp$_+*L)ma+tc<`5DhM@ z6J1Xll?M>@Kx-mag|bDq-N)2rE60RHV((Gw7rpoXK!b@F1@o|=5)Fosh*zdrt6wo%!|YV{cIB;IZbqwlG{k>6i3%y z`0 zfb1}ke936Hm-B|RsXmYyp3=~cVI}VbwddiiP#`%gNT-Yb`Kb!Jw)gtQKhumxxeI8SW8_qZogCQH364+s1X|( zT>5AhqR5JE3wpUET~A)7T(I>xvD5=51tHW;XgDs{5a)AS<0r1am6)GJY62s#Cc1-l z)MkFgaJr}w+)1`K0F2^(hx{O|;Gy)|TIQe+(5}_sB7jdf8(#%37P|UI4Q5+2Lrbvu zeRHa8H2?BHf6I|AJ@Onr$_DzTjd|a^g7n++$KX5I-Pc3Sr$0v1lA;DGkv2&JEGH>A zJ?Ho%9hA7a|)ddsrH+R_O?p6bNLhE<2{B=~)N#x3oh5H3YdH9A31A*OG z+We<;GN486Q_{uQE%pRAM(`D2I?9p}&LsXD+~{0G|pxJ<&uDd{!Wb#POc zGoawx%a6>Sz6d|G@TcVMq{0~?r*>eDY9PLpvaTMMDFK!um7JZ#eK#SZ~G_01a~hnK~p0@Fp7 zUI=p|9k^atk%`9n9=0a_?$o!zy20wtIY`V9CkJC8IP=g#d_zHQU&6{WV3U`utM8%eL{*|8NcRo>IOfw=dQXK6RR!GxPtjlNQ)h@LHiR!N01 z-on2<*a5R6PnP-q*I3p5z#a4=(a168kGyn6iS6O!`uhRUU{z<-QLmVrO7e*l$Uj!?5sJq#o)JX^kG>D^x;c+-> zTOTu8AvRgUo+v*FA+Q#oadFZ26bHU9C6+cT&Y4z-JXX=dgxK$Vgm+AOS4qC@9hpCM zQZ^0{Rr9kyU}fNZGkQ4=YGD0CSQS5?KZStCP}qJC^!k|fqHJhaXGjsJcHX-0OR>bd z>M_ymdIu>PoAK|h%GGUf#xZ-U<-_K{d~E@WOv~9Hgv@Oa2$mmJfmwZrL}OVBXnlLF zHf0f@=C~>T4#wHs`4Xasv_2wK`LCAK`er5OVQtPyA6HUm9bON2l#3hcd@SH>W&LRC zAJZo+np!$VDp`d#9pY*E8jn*}$~-=YZ*FN>*`c%SBaDj1b>5z=+Ynh2)4`+Eb?Vl$<$Q|RuEbXp^Im3raUu~ zNm4U_-9vy4OA@Y-*`PVrLg1JO=w2H{Pkmg<Sld%eBtrcminK7T=Z3FDALxN$O zKBe$PxMF6)W^c;xHZNM8erX(j?>)i5CPJco6`kTu1(sJ6@sn>MvJMizuO%M?gGd*V zet&hoBni#R2j8f{HeCH6J-8wvs}T&adayr-9{b2$S=-W$C?G=2kdAnHE+P$NrrkkG z={X>LY#Jz1!UP(f1mapg_vgroOdhy>;UqR6f%fpL%3@Ekp~B6YO|bBh!8jl^yc#}v z+5L`B+Jl=cKW%V*N|>QUML zlt*o`tu7w{^GKM`avbdr5L*jGuNHnyYmyw@5zp(bM4$9AKqmk?ZO0V#D0Al_d*+tn zJ0gVyUA!P>uPQZbKa6yIdE*3wy3S5f^0hq~a(Bo0Cxczbsy~QZ zm$@n#XGo*uIJ@DWN%YJW)VIaEZC}BY!`v(}C+JAfl9(XbgAp;~+nfZOv+JK@BumZ< z?vA|~uueK%0@?tC{KuM6x$yuLA_bH12IO3iL2?c9<8P0gf0>Xldn?Urw+yH*anEFh zZIVggmGb47%nbtFHgRO`D(&6a%Nf}j5_Htw#py1&D z^#dMip*G28(Hp{Stqg~h)vj#Tm566?D&N_pgwu=h;hwsEC*$0+1c=1fF@5SXMA2UF zzMhEqD9^!3=AtarG<7CdbV!zCY!plpwXwHrIA|E<0r?|_*}0UTtblvCG@IZrup zY>uk}o>JrjwBC~PRV0hP0I>xi;$vC*>O`vWq;ISMiL)=TZTMy3+)zrzGCEF`bXnu! zoO|+Gq81vnalS%VPN%?Q!Er;5$M14o_6r4N#Isq^*|H08nNGF->rHJyR@KYVPFaYe zCoT#lEX_Sf-6U&|C+z6y`nM)NUezqtdpcy6q%3sg& z+(Yy&XLO+r@!8#1lJ-jph+tU<=U7rw`k^H9IK2Rp(31@SMLc;M^*1RFl0Z6V;<~(4 ztnQGwr-IB9aLmk>2?Ci}Q>5jhcu2E;J~u)XXi@Z~*8sw%gp2u++v>uzPP9JE09hbn ze;z^3<-bRDG zs~#+foTK=m!Jy~T*rFX8X727&L9>MWMh^{G>ZSmheh-jzgR>QAD#D1Fpz5%&o4V>Q-#^fcfY&9MCa8#dAL3apQ;{B0^ z4g-QjM^q@T)_U5TJB@HL;A>fUoCjUqi`1how7MoJGK(4vA%e7%;3hrBY%v#pVv2*Y zfE{Tw^S;Qh-1_s&v6k$9VLeOxcBsCVzL!PRo2b>sq?MG@&FpyaL1I+>T#bJ9G;p+( z?SsXSm^OPnmEk?;iZ@fqz(8NH*EqxLKp#D%l=+p0)ft~GqF`SUmY&acQ$R+al{aAa zP)Hky_t6cXRB(JbawBD|FS&cH0ShO2tHKJ>5(yR`($(sJ0Vd>iVfBwA7%O<(41~%5 zpBEslQhe$mWal%*Bv=lksIjO?(D!o{@<3I`($#)5wYCLntR-0HU?pSH-3<~q{eGe7 zN%2Q<-$;NkI$8Z0#XK87nI5J@|DyfFJL|F?pVZSJrbdt7$cdSg>qOn>?Qf2`Q|W!L z|JLtU34}PMt8s8EVWBUi$7W#23+UOtj@9>@6+bFYq{Tb@*PHe zJ!&8ItH(7i2Hi@MPkQ*yd4a6N*|!cG{SR-c9sA-uP=SF4sqq6fe1~O?{j;%dF8n;= z_>9TzZM<^jsX1tKj`c8#X~((}Mme~jQR?`rO0;+vJusxzLN_gZuyv$wr=Y?TxPR?t zR8#SXgyer0A6Q0x1pcQ@8V&)zMEEFC6un8HY1KcC&tke6 zzV`VWS~jtl7G{C+`g$fs6&n%-z;{UwdPqRuiHN~q3xL8b!{+I7nTKSNKR(dNKuF%p z@HuOjB6<9iE)CrUizf*|^0oupMF)m11a}4b6W>o910J1JUjM^4rVSf^F&6wEdaX9% zyJ7Lyv`MiMF?_<`k?~lz`9gj_8Iig!0Gg*SB*YAV*Fcb&rTm8M8)R4j%LP>h%jGK> z_vcVkTvl?1DNohkR7i6^sp{7q$FHedZ2hgvp3&`3zmm+caOh)8zexb2J12kHJ#hSD z$@OHg9#h599%m7sGkfpm|F&kk(L^|Cq@zmr7&@C=Sd~+-TvQd7RPQo$MVI_VAp_Bu z^6)c!rMlCP*xDu5k?oQR`g`c@OVM43{_B?nFndu}@|Mh)V#RzvZypS$7GuN;RBrrO z69G~OHE&g{HBmL*O`E|KLo@I2Uq(fPn*wXN{G^_w06K97#^A?@@%^}qtRn4{q_9lx z`e}6lqH|m2d_0ftRJbH|B=%pj05ax)pe`=@v9#VGBC)*&Y+G++N;1|Mj0`|5aQ1`oi=+D^hOg=Z|ZB(?bL8GR``!U&{Nm zVpAbk9pto9{(s1;8qK9l90+>IqnSR#Uow&BQAU#FG8NyDP3dU&ktxWOM=P^pG=7<{ za9%Ksq+K#l%BtIWteF)CK136%M2txjTed0qm~3($jouzMY-gNju4I+5F4EfFe+nm0 zno2jyeNytuHt_Wc%<;;6hE-$~94P4!FEV`KvkhSWd!-KYpAg&|VI9;eUwLvbY&eE7 zQ4pU97|;0FZe;CgIyU{#KFKwoXGn5V`RU4VpfWij~{-f=g?}zHIr*-Ac$>zkPs*`QC6V@w(iDDUnQ; z474rGyC;E*eCG!~UEA;zagA?Mf$`zesoJ_rQaD=o;3JH2UhsVr`%{1ENC-e>+@E5n zulKYelC*Htq~-`~rU)7iS4)vLB{7nv)`}2ct zuiIvw9q#nmuT)I9Y-elKDmVIK>(9h|28r(bXKh|`B7hCa0SN9)~Kpqe_gaMRS+lp3nLkU+*YE8%b7a zFrI3flWSrGwSK!2RZa={%m@{06(Vy{ZF#}cbc0Q!#exm`_MX;D@Y3n&pF2#0tGQ+m z6ZQ|w1&3i8azFLRlY5`2f9;51P4+yeMa%5)e9#P4s~4_+Zz~%|h+I zjd;z~?4Y%XLYG}`&b}`v=l6zp9D|?7?<-oPoK+{&zdC%mX|+*ZM$!)qMt!OXd89gh z^3&z{U9ItoBWB#fk(wJkpfuW=p8&^~>&k2Csx=-XAMp<2-G`i4_x=-t^g;p(D-JV% zKlb~Xuv@cWh*af+k7_ycLkD`ODeJ=fO9nP!2BO6*900$1q8jpuF0BFaewNd1WN?HZ zxLZAuzPh~;7vjXKHb269KcC_Q{C&ztU~8gH2qUrEii3I2jqIkK(eN79&CJcUR7Yh_ z1KBwce;dx;F_?m+3?*(w##k!2cU3#j&&+18;cS!+p(%z=V?m}y;*5utQE0}}b$fJh!6paO=S1EBS_*DG{b}X~bns-Ril3fO)=S${&+-$c$edvj8^q|WM12W_oF7W$N zM%l9)HL**~osgrVm(1PAOK?XLo|Aid|6PS?LMuJ}?1%*G-qQ5zhxpZ)XbtyF9QW5dn6uki z1ag-1L&@vH{6RW~1Xp&lJ-r=Fe#5<~(?NcfRkvu=K{v&ZDH==e(tjTPbHs(@Rn-a~ ztAXie*%MY^=dhsGr8x#RHmX*pQ=4fEqqB}1!^um zXzwYNoSX9 z4;5n`RLTaciD$c6yi}8I`zU2)?|Rx9i;92m8n)JCxKyQ_=(+dhy!y6GPT%233`J$7 zV7C-@76 ze_?Gxz7gDS(x@n<&!j=A`HQeVA4I1QxdXvHnCdCMtY>12#FYwRL8-=6XDzdN%U z|GPnt$xu+GZu%OATV*ttKUH?Eep0iXKNaGHJE5)JxEljm z&HbZmjnGh>bdL<$Qu6ATFwkB*Iq#ZcqtBCD+1?~8n{xTeQ39(pQf4q!*6Y#tXa*R( zYV+8p$!cC7Wxne_a)J_*z@Cm!J&%D94i=s~EILfaKX_{WtSm$9>2o`VPjQR+eE@hVmmU6Pg_3O+C9vLW<^M{~%8NVop7%2l4oY=Y{1A#ru zTq*isis2GcJ#d-Ob!kC$A=#(IAM?02Rym4a=xQAQXm%LWyNZUkS9oS#T3Lo7Vcnsj zFTU9{J?r=ft0re!0|VkkR2WWjC>tWy(p{*DiycTjI94_};!|(VSt&Cykp7Hc?ZZg0 zs8U=CsFwAdHBpW9v)vi127l8aQX)Msg&_wDTCTvAolt5mA~x;PX3pEs*CB!NhaKm6 zWrzK&Y{uo%spTtvXurP--YF&k#yIsqUu>Bw4Hl3ILK8Jg2_6M#HfvN@KJL8b|A>BF zLR}YFB3|OKC7P7%1V7Fvm`Rfu97ZbP#7L%%ya*t9j`vU*y0wO`aVz!mRjrP$3asuo zAr7a=WR35?5G{%+gf0}`pn@JcINxkI<|c(9t&jycpbGElG3I{Y51oI4W|XVF9v}-e zi2d-fpYPqEA5xeDS44i-TS9&0%|fdD*1lPl*6(u=os#Ap0WvtDV z)mf`Ti90wvbsauI|J2%QhH8iw#G66{ZWVFr5^0RsD%!?!I}Zth+gwUiCch?p-#Ith zN@bVT!B%CjA^iy!zO>wld{R?{dHB?$Bn0s}XZg*liQ)ZYOZa}wDYPy?w5Vcry|?Fe zMi~7Sq+nio4q@oVJ}OB5c;U z>(N;GXqc5vqkQFqbm34HBUGAq^~m~@3|R zi}I)x1m*O(PcK_`bF)oYG_0Ka7SW?`zNH0Wj=iRCqU+5qlcaqk&rkuJ>dm{rJrs&k zZ+lFw>0ArFNVSUmGBzIS>N5Ln(eiewIZ&I0$yb6+l@P5Ve$S42QwZmbn>Q|VZFLgq zo@K%Rlat}xW?}T@LcC&zRM{MfjLIn1oCl}vIA6j+SaZiOH@kHY0`ZEIJl-!+j@xN@ z$HPg(esPDdfB7~VtNw)1a5l-u@Q2%=$7Z8g8`8WKD|n*hLx@q<0GI*IScFYr96%QTsP4kx*0$V$qmBiG`~a9zT=Iev@=tBN{5{g^JY#EuQaKi;%Hkf#rl zgZpNw4m86|ZDPdd0e|ixRX$fP>VVO@5)CSN>Yx+Ix=AG*1&O2uy)|G?Zpp{w3R1@% z{VDbnOpXhCq387ptRCLI@2vQ+{M9pGmblVUf6Ej9>rlrJGecT=n`qGbRtyR44nt#I zl)CAUOQJt`$I3$rwJx8sgBXrwF%!)L$m{V#?Usr@xLM<X7y)~f=pSs_~TWSvq zimuuC?-Ug*R~N-1^_Iujpf&|~vo^I!>56Nq$jN*~BVwO*p3Q#9ifl~KXN z246`$3$T~1>AmUEz(4vM~ zzYB?7pWu_*Ln}wRGiKAQJ^9C0nI3>5)Mvbd!o-o1gj@pIoP4Km;)xfvJjXq!NFhI3 zJ|iwejsUHTwCt4vcPl4qBL|4yfs{^R`SP0Z!OzRIK} zoHpP=gzjw7i(YM(sOP&JAu40;Ucg%&ik(;kot=yUT04*k-xA^!JUL-EwaQkj8r}bj zyFZPWc)D-!#G3}R>z(kutF_g_JiG97U2t@Ako$u&=40PgL=tF2RrVsAWKS4l0-uODTf`p=qd-{)@_ z;!*4a?gCUpKMotc)xjW+TDls$D>qd>{r27OVb(1KfR6t#L(LTPzd2-6DYbPNmw|L~ zxBTr1pWZgh&mK@~Xp5jjRCrvT-K`i56G`DOJeezg3nd$z4@Z_j{}dOJ5S=@{*{34r zwV%`bh9@eQKMZ@4pDuvfFmygWtM8?n>ZX3Rw8$zkCQ&XJg$AaRgfLi6V34BqS}E05 z1^YR1!FE&p*;<$^QU|>*W8LVae%)oiHRSxTr?!c?rl42OfYxFDr;Z2-iRxX&o|ws zhY_r{2315aix&^>#&VdJTCst#jV_p9NGlZLPM;$zm*#!1pc={!uV;JXwRKa=DXXD2 zbw9iLK2W36=LYYtLzRJ1)ySz{t3zW}x36&qGtSxv19Rf#1y9If2F;ka!DI0>#p4H- zmk!-scgrpXY6;_GVfE0JiXc};AqPb^ko`3yi?Hm%IUdMW0a2E4;hzd==13PNDCYf| zbLOgN`z=A5DP#%L1-gjb`uTW$-lcmEcRQ~eX}EKp z9ABzlF5{gJiU`XwrIahub&qVa5RvXhmoS$6OZyK)gc)tYz=b}aE%6SsP*X)6x5vS7 zWK5FGc}|?Tn9j3OC!02r9%m-oZ>k8=X!0qoTJm9EdOQNv==6GhL=&j5kC3u#No@G; zclKoQ4SRL+K&`ZQ?6&OM^P!!xm%zX6-$Ias}*<)fWn0PZI2XQ3j!`Hs{v%x)m zyLlNV9{u}QomuKgOs5@xsA27!E@Eodx6iL5--c4o{)7`2CVBpHqfj|EZ|A8x4Y#;;lWQVcoCEHU zHAkR)6maQE6>?6(+dk}m+WZKwl>!wa!if};@*GQ~YH9`042J=nOxNk;XDexmjc%V!A zd40d=7x=rfNbW!8))HvynPF)mm9iO&dHRXkONeILXy*ctUlHYDG`18wYY9Hl6F1Jt z!}A$Fdm2Qx)U(%b3w4|5R^VlSeNc7_;tHML$XpXNSK`*#{zIRojJ4OYBoH@|uXih! zpSmWY7TC=WurN_pt(L#_&%;pJ~#E zM^U_fx0;q@)U+Y+_mg#2dZVI>UZQ!w!v(V) zzrI|HlBv@rxa8Q~;hQq^L7T^`0;Gqzn-%09XBvDQlH0U;_bl5qaob%HuRqFRHfp1K zOT*R!tF?PtjO}867;ZHFEUXo)1A-wv4LE5vp{8!~%P56Kv@NeP1zODb{AqPss~{V(fQc2pMf8=YF%|z%^E*NM1yy%vdK{mJpax*;W>4$N2v2@=U>V>;J$y&a`C`VgIDyv@IMi(V?$aN9s~lBE zWCQyhFLkcw5%nB4Kk26@6`~Q$%D8?{_jUkGu=tc%UL^Wz6DRsg9jdXEwn2-%Uus=A z>Vsr2lk{6z2o|*tw5m@0fNm#ZCWnpRIZRLs$^g3g7BvBUA&mhqXS|iip6!0t4e`?k z^(XvB=^PF)ujb;gcPeXFt7{>+NsvYZHhJ!lD*EP3Ywkg~T-xWJ^S*8I7!25E*d;Yuc}XpYB$y2d3hQy&o1Teu zGKDVCblcfaFL3<3I7FGa@CSS_Q@s=T1d=;IP~SC36xjS+sK5#=2b+_RZVG&3cO7P> z`<6;#3WGbWB5zK-;kAxQH;>F@t$3c&u8*U(2D5F@xJ&>-5@x=}go_8Z`zBS!3N|I4 zKSvukTddB%imYPZH|-wcr0KmJ(AsVz$}O>_DNFvL?w~WjE5*E%e@FGYb4|i_VhBfN ziJl1>?0qTOE(S;gkGK;T|N6fmF3qBzyxIw4ZO^lJ#lPCdA~3!ddl%l9wM2K(=Jr_> zr{Z?XlY=xha;wbm;a>?l4Fb$ERh=;GaUiVk=4Y9pUzb#l*wg``*$gC&PA&58oGnSF zcjGHf>hS&BkKTLH+zV}sev3m#i;@vnyu*vvga|Kvb}Qzf_^O=OFCykZX11tdZUI)s zqtsg7N(^*v46W$y&J9Os&!zukF+V3%bpLN6=~XA)MC;Q=UYum)o4u7KYGx!@hsT2B zjTl$+Nf$Au^h~Qot;%FMy2GkXD2KQRHs3EpH3|X9d@#)Qmqq%)Qe8RC-I0%^RqE^( zqr)=jwPms*q=TXJWL1(u+bx4epf%t?lpCU7;v0u@hJ1t%QOye=f74Wi32%Wrw=8X- zbWv8P8g&J_=jTAVO#woQ12<&+HpB=P7V+(>jU)rQ}$WAReuqDf3phX78vk|H_eEbfX@^-#h zRa`1J9X5TyB>mc_VND%^0;-ZhlqJ=>?OXP4A9H(Cg)st4;UQCy+BbzDZpSG=x%6hm zbdfU>k6qm+-AV;YWzzIft%#}t24QB&*(^DJcQ|HbEi5F;X!AHKEx)&nkr`-G4qU}$ zf*bXW(0V5KVc$uY#2PlCZc!~EF+zN_1pL^BB;on=ucA~`DJr>k&Tb1A7ZAGPn}_=x zW$;8CroIARa>hF!Ztw4V+qb7I&G-Jz6g|)(Z=eg(|7UCX@w~H}4U2yND-^6AK&e)p zFfU$ZRp6;w9eDcIS&HETC?PrluSb79_#h`$7Lcy>_~7UU@ZJ|l6@9sxi=)P5>@5>S z0j4g|mRhb^IwhF6s!iRo^4_+hG_fg)+Vq>hhY{gcd*my)diPn69R?kfkXDI)DWG5x zkzcmRMx1{@O1!u`soiu&yJ6k^&{QscUBh)e$%z3tQELr-Wb@mrawcAKAW z)AcCG=3K|~2WH-dZsbS_G&$ap58K>!e@>Z*mj5e*v%YjhREJ=X^VNs$p!0dp?H)(# zI^k4r({x85S7$D+w-YrcZwf2MbjjZjDb*~$Xj|xsR?Xi%op?vmRdcm7KLouDo;9_)wftR>fVpI(LG`k(e+I4lV_TIK!JwmrDkGf@=ABlrsmddN(FZOy8~2 z*w*aWrad~Sd_M>G>1{U;N=`*+(JMVV)<{p!loNC4{!kHlOOw=0urgGB!3DC!miPx( z6+#(U8mlOm*9b3?R48{e7)TlE!Y#RfavKa`9W)0}M4<4<(E2=cab|kmC64fC+~`sU zPYC1fFFR*cEl=dZj)8Nnqmi!ki@^r5Au0zMcB_r2&OVG*hZdz{QQpdg*(-vagJBVa z4wWTQmDkCZ^D+L}y!8Krl5#UDlh6aoQK+4tL_3z4>~ zJ8k5psU>cqA!z0$Zh81iHOy_0RL~Eh6&k}!vTq6JGYZ| z^cgk3uvMgKGP2YYd1Sa;viqt?@b*{^5{Gl|wsdPKxAVlN+SZmzc7Hf_((jMud{2xr zFIHDe<9$dvsyvj-3U!gkY51FbOF+qzrQ?j=x6BHuSKB_OI=# zn?niehueoFNo0g?N7b5VIXmtonbl?mi!!x0n@x-%7e-s`BW~ zOq|!znX3fkLNh_DhX1KEv>7zAt-`=FTX%MCPrRs-WugQlHgyARR_%@OGdZ4^vWtVH%TS(Vt+P@a9n_=?kv$G01)=(s-Pn+u&z_#zld1p?8tOc$YKyN@5F{Oto@ zQshF$^CYCLA;}*U7tH#4FDFs`T!P}48y%2OY-e)(*Z2Hehr(DI+x{{_Eh7a2AADsZ z2N((MO$N#q&XW4p+Mpf>ysD14dCi8AnD+DoWuBVn1Z+xqZ37PN0`Wcu*w>Kf*Kqs% z^5Z{>9X0WhDaBRqKnIoeZrkxy#&4^%CQ3}N6DNqHS6+o2Q*94H>yggzo#iVgG=k^A zD@enx!RYQ%8~ly&AC01qh)AlH?$)Q`&qj-d&1Zk6okC8ztEB%v)vs|>uW|4DnBbgJ z05a3FXW@`*_jZv@05s}fR@j4?6Xr^uju(CnT!OVtFnrF8omZtT;sf${BP^D+=@%d5 zvohAezZ#(1vh67|^;|NG%(2TznH{>WE)} z&@GauNH~}NSf}^h^G2>sqcwla7Q5K%mg!!W1tl}0@kn5d?r~5;Ofas9WZt>!usAQ? z;ll&vOPsKqJzUY(39x1QYKS@6?RHF&7`#^fI$Y&5uyzOcQPybKO_MoA<77gBQ`U>W zudj#0)ee|N8Je>DaB%D6JkG{d5N#DJcdMj6UI=tx`TiuVf}lr_7**ZH1~;LE%cO?w z@GsLshLI>O$Rk;3CIyXt$xuge%1NF1{ji#67~3+)DCc~Y;-_L|J`_$ii)^u@|Lq`i za=;mCE$r9LvJ^0A`6FV5dn0wT#>EZKp2+>v|*O)=Z3`ha2RUnWRm0l7@laVvsXv%LixF<+R^leoS0o(y{3wo8}fJ7gJQf% zDeK^=C~5Y?llR#i7P|DhI{xOylU!!dGDiv;#LmBC?XE5`G>-ksAH*#OQ@?F^2fGEh z4QcwOy3Mxg+BkAxMyO2(Ig{R=3oj6vy#d-?7MBiqGTuquYds1EcM&&= z@T%1E&V44w_^OY$e~h?UWaJzBZiaeQ>Sxzg$=z+-{$%c>kya3ljK*Il5+Y02}W^MHNRF z1cG~iqCm~_S}tisj4Tjuk6?beRu>2tl<)FaabwLGX^ zq%9tF@VT+=_LggZgcUy$7-8(YPt*!4J=Tl&Q`*1!O(+EI#ElJ$V5;(8)QD>IT??_2 zy_tCTM>2`xS2%8egV)=X0>VX$ETK^+i(f%d>ZT6V>bE>ZivoGd7b|m^MgZCBlT2>u zkb(Vzj8&r*KW7i`&`GZkMnpzo$qF2l=LOktwlZ7cLuQDnvyr<2+sG5)e$#AKrE(?> zdCij<@cSZkdV(UQzM}P^A?9}p9I*|psx&1MSHq;>-kj_gcFznSWC)_UL>#;!B|6rN zXOKb!C9(DV-s)^c8*Vj(wO=Fu<1m~>;Ku6k%(b2*NW0`*yK%j=w=tA*u4dCdsOZk0fcU<1R?JQ5bToDlu-iSa_sS_>af5 z>+z4{R6jJ10ie))R#l&9+k?}`Uh|H7X~90D1|XV0d>vywU$Fh_{`!=0njS4&Byvw= zMe$GcVY`-A#C~ZCUwnWj*_6A#YRyHgKN@WbANFTIESG&D&HuJI0xjd;D$xETKobfe zLu6XdKdPhC&H*fQpyb>EMXqMA{wPd4uUruh&pC=shSh|S&{HKCI;Y-*-5-k~cBn?} ze*}ms;_okY9dM6ANi-GFi(Mlgz{0x0Nvw!`3jL|sAb&K?hv7?1kZEZ9I?PsvF&^eL zhPA5z4`5)d#_|@~O^|)o*}6IhwJ&)eKkg_WEwbWg7Juf;6=}p&-Mg#Iu{rmuewI;cW1JhOgjvI(QH6F{in%;_39iIGewnnYmI&DJ?P< z-nRg+(SB86m9T?*nkUcYspM09KWK(X5;wVlO;3msQw}4%KBxVMPU*o5#vdS}cf*G! z#gUvnB>1myuVu&a>r37fQGa7XLk;Ee`uz1*Lorq*dcK;X3DOsdoa@^D^T#&%8SBS5 z;~kk%T~q$KV6`-)0O6ExE1COk0YzebP_I&SI^D}IiOE4c(5lqjiI{+B#@qvLf4oTS z>UW6Qy!j_WU{UgKpUCbd^O`qh&*vWb`9g@yyJ-kxbB&EPLvvpFZTT=7Ljuo0_Y^Vk zI&Ttws2sv1*l+42Qt86W%;6-R-_7~`D~)@aDW+>6EoJ?>G4Gl zpz-%tsZ_z(k4IFno~E&;HLuKUy{Xs&1=B7jic{{$Xv=aSwxtFcD#m1GJc7wab}wrhMFQ+xk%Xb zFf1^-cQ681Q1jynlu%Tq_7y77=!n#LM=1^Lr)|(fR==ngMLo$Y!p`rx$6YTDHPZ?| zzj_804n`d3MG2Xd{3T9T`4Ki}0y)LmqSazcWXDhT>86Fq5%FsUd@q;wDk2V+p7JqN zgN2n>J-KKydv&=yUd_@0a+w4JpuLeJUDe45V{UTO7s2%@Z-I9 zwAvrn@{43c-khHuk>j*L^O=O)!yN!^Z;p{7iYn`w@k#xuetRQxcyjbWi8jJsdawYd zGh>!!jw?n5-Tv+Dcf%qxT1WWry7aHfrE4@8F72cTC}WSGGOc^}0R!3zv*&vRy0+8t z0~K#DWce0q*AtHmbt0^5}OHAU0cXvPSUIaGU=(on@2Yes8#XkQ& z&`qHWbi}P+)u-?FQhv=4a=AY?Tq(fMkib;AKiX)n;^$JhNJf0rMx0Mmk3_$h(H%PG23xu0%>&d7gD@Y+s)YXXO|rZ8_@Vi~Yw#e%HqvQK`lrrTLS@&B!KYE2x#*Z=ofC}{4F zn{n}~Qn#imVtPfxyF641M+F~3VGo;$N(G}$rDybHQ!LRDnM=JCcZ0x@PgWH^FA0dI zCwt*o8si>sJo9Yog=s%LkTxs=EwVe z3GM~74_dbD*Yxhwn&@>H8bskgSJ|_JvZ0D@{uygMXKAw?}dqYL@(qW?ZGo z9qtNtzjGuAiN*nT2Q4HeFJ5CA*h+q;SSl&u_QyFLL#J*CiX9Gj6!#@46FmE)@d&Hb zTOYN_tl_^V^Ous~&q-!0`a6V1m8#>c zvnVVa3Yh#jQ!`-Sn!oK6G-1`GYk_&u^+DX5M+xlgjoC5aIKdEXgY2Rmu5snyJsHA* zptED{+@PDMhd81|OZcl~qtxm@^qhG=NN1f`#&}+_UecYl7#`*rUZWoYZ*X!=H-?iY=P$*7rczrodCah z4@@O)WryRegR)M?iy4;-nkXl_)qm@6xGy+7UjlVU4_%e3XyL=b8b61mnh`kXH;3+L zJP6uDP|v_C2G$j|Z{usZSv%LcD@-YKfuqJX@=-iE83CB#Se_CQ$x#?)#OFS4N%JO* z3U@9pY9f1auBbkmXdM(ixcRQYK;tPzOo;%wY?A>PMWIc+_#<%6>DmQbYpwH5eGOpZ=6Ph`y`m4=-4hbvd z$}S@UkZE}szvcKyZivth!KSR$Y6~=o%?mqmhF(q?_kHe|10#xC_dfijQhAITenyJc z>~1);!UVc`(t9yn+T)>#t!?EiL0=AC8k_g{$QG6!nm|ErG-g><=i}Sgg^^ARpcA)s z5vr)aa_kpBB-CJUn9zVzpyQ?{;h|ve%4dM{g=a=(@f7x>0+tuw6}Qnq%XyLe>)Bj& za)@(Q3w$aN7w7yJb8|(E#m{pMOqaAT`(cu@=3l*bWI|1^YLX9*AzrL^t>i`_8s8Hl?Bmz5);g8qC(HC|wx;#u!P>Gz| z*bu}QmI8#FZsKLsSZ>u17T1DE$`x#pGhpA+utbRk2XdlcR$%hbalKww=OYv0at`Sq zleDlnRYcylWfxalpwO(cWe#X03tRgz=DXhA+)=sp;1c>*=zqM(f{I}B|5id;$eA)Y zH#eB55^g(@R)t_H5J_!H0u^Sn@3d7?KREZYf^8?1m}7{!>GL%I!>goNzQ!72c=J#c zz+CtJK>@UIemdiqCR{)LrmnR8*|MXuf|j57M>S_!Y(3dj1hM0sL_NFi&N z@2)~vrF3bZa9|>Q@+v8KPTvI~?I5AxkC&#-Z9T-m(AGgeF<*t^yS@e%4qcXE6i95A ze+W`$ykXTQUrn+h7)P zH>ce%(}2#Yst7TU@2%vJa~Us92w4>xK?3f%Z%6g3b2eK)1%WIaA7}0@19t>PT>!gq z4mh&|wd7uk4VDz}yJ5$jv-xB83z4V(HxF>4KUr$18e7uDj0jV!f?_~7Ju=-St zvM70RR0d~Cs06Bh)<8h@=>Nt>r3nqc81EjoE`}N3D|`A(T5xjwb}(~QgZ?ZUu-h51 z_c#+>GOoxMuX@87G9a@KTLR;$i(agHFm(XaD`Nq#paG}c(b@a33?mi(Jt@%LJWVge z^3U;6vnm!OEjYfX19xlB{fuIrLuNk#LdJfzEKrQVbN97Hs zOP~hKjcuY0PmAY?tkPK2-}^1{y6{d3;YKxSn`JaUMsEf|?2dKBnEf+vLlA+dm}eqX z+!qLv!EB1-2-gLWkT5|8_Mb3o^hl0B~Fi(hn&}RCLJnV&e8^w^KE{rjxkME(``c~g&T6h_A288-?>A9VAA=(g zv)gc0TxBzYEGTotg0u&|ux)J9&u@O^MR1CTI%4( z-h6mlPe5)`jwWT>~$_j*~08zPGScLJ$j~GVJZ1 z&{4pvy~TJ%HP_mp^Ek)9(@;F}eIFO(gA|perc`tFG`s1jKu*V&t<&07gIC+#g82Qj z*Ui~OD>n3wM89B2jE#7aw2O+F76`|PunF(M7v*yU%LANBYczP!WflG>(TMZM|A(i) zjEd@U+xOua7`jVZ8U&P5y1OK#J4L!%Y6$5D0i_#hkZz<=Qo4q27($wXXMgVR@Bh4$ zwOlON?78wd&&$aA{AF_g(*HQOX~_Sh?Nw6sHe@(P7_WPLQ9t5UtbghOpejj_d@>ZB z&4!CD6s=9AMp)BhX$Ir>kX~!%$syUT)9>XgV2OCV3SH%W;s*_nJEP|T*Qf_`iT%kgeOsat)*ruVyYcyNeR1rB%s4Gqmgm5L6xZkH z$=YAG&o3?O0xw_CcA{hi1=6ttRjnny2pw=a>vS(vj&^CfWvMd~wa+2+bI=x-hvrVK-;!ge6ek$-UrV~{}<$4-4V|<0NYLvbD;c^yP#p zgo$mL4&Ij;WX&mB+ooC(i42TV5Z?=kCg0PALRD1yQ)f%B_4d2UAfjkQEi zYP;vR=O3{o!-8UbkpZrMtTt^6aOv*sqw`E@k2(lf{L@1mhGz86fH()ByJ^rFQEtbT zYg&AblZT`d!`~QA{nGIgF3R|nviK76$gKcwna z2(EwO>lrwR>43DpsPH$pIq>0@*^n>zYOf3ZlXLi(SR1io;+4q|_fT1vyRmK-^iP=4 z{mr+AN=s!|PUh7wAF-DJA*Uua1Li-{gQY`*4blG0T7LBQHv>^l`!N*U(d)(Ey=f!5w5>F7KX!wBX2|uR3tDeK zM|qOw&0U38AMdMkg)dmYOj(f?Jl;kne;YyvCjY$=5V`2We@<1peSc_A$IY&Idj3%} zX5uDnsxoDtvMwVN&Y{o|%7xJ3oRG*TQt+)B(h4$e8v;5)RU=T^q2ZS8d6FuxymiAPFDi)B(nDH z6jbaKQ=Cx}F)VmYI^3?HEwVpAOXd#t1+vT~4=;)_qwQ&lc0|N7B^J2YA$WLMyAO4T z;b=;W*mQ0JlRwtQgHjc~QTv0wWF>=szLoe~aV3mXBouDZeiKOdXAOH{2msCv+uny{ zCd<5=#7$MQ;_)ILc0+mz|GmDV9{&?Fo5g9^=h7@MIfATbYBc^amV`Q8+a>dbOJL>t zby0)sHBG`~Bd|4nKYgIKBzL%`5$}SNXeO^xhKfIrK6M^U`=)4KVw?HaPkr~CXS(&r zN$U2!R=hn5f0O;-F4a25 zh@eQs{0vMx#f5Q!c!}A}ua(XsuV>V`+0VBXU%nC3XJ1*d1=*zj7UjE9RZ-mXTHHHd zO}dt`fgGe2YdzW)MNhgMZ*2&F$^?-DMY3YU84c8CA{aR!qz_2= zqPZ7jTV$uvDrHS&<3Be7Q+?mb(?Vt$?R0)#DtR*Ixg$p1^)bTyb2tOELsHjrM_%!5 z*YvS%QxFdhe(kD2lkvAM{Y~5Q2AwPeR&vpN$h?n-#73{D zsXO%5{{97gwz+r<{y-Fw>3)%!8|>T2gqqqv3BPP_;lXE}q15H8(S z-Jg%+v*J4gl}%#l+y+&l`F20h10f-Dps3>V%G=H1Ic>h9P8Z@BwR8(nH{t4 z#~G`yNW0X|J7&O{H&VxFL%!kiyw_IvcG*YMa6b*4BR7-Ki*|#e{s|dG$xNuX163g zsspP;4h_A?UW|HVBe^B^x%U$N6H(;*f=2EAVl;Jb z6Z3zH9m0y7^cuM#!o@ zK>@nUzg5zrPMiYSu${rjKey0cKbA)6f+Fo(;GFhTF6ze?OLz_D{*D&OLXNsi{UP?8 zj80bBebibr-XDbR$m36sYH1Q($9=#jsrrLPKYA|SCf|BK8Q*NUYD7{`MRgZn1H-)k zrowbPMTNHiHx}L=wrCBZ43-4o)>&+@tB8!q(Q5RTDzrby4qp#h+JCJc)9LHw_I9N{ zSOg(fU&JfF*Ou&YIA`2*8Vkb9-c&#M+JUhz!gPaWV z7r{gC$3i*>yVUbsqoMpEu1$S*%z6GZai(-CrA5UqlZCn~ZjBh{)bG9`sMv=y%M%?n ztLX=w$}0SwkA<@wy=7_n&a1R>fjt~ztzzGpU7Ft;fcFZz@(;UD}}^2e)2 zuq7DV=Oxj!az`Gw0_>NWj}t+!+YYYwQW-DBiB{fmm3~Z|bYg0eba;y}!Ow2oUZfz# z1XCLqHpY!>z3x7u^(gCkg{W;XJ!%?Vq6zu@>e)~ILkLtE-pYuP=cL)93S$YyxD_rs zZB%xe+*Ys<*DtpBYa9%9UA8K8 zetpsEb9gavi&a>vpl|$yB34Xp7HEAa z-(v2JvgOUQ%ezWh@PCMx9$|0$?X~tXdK30bx$sf{9sQP0-!kjfOb3Y}TE7n!O8Po> z=s7vByD8$kdQ;xGh^ER@-4Q~0MO9;}0}Q$U**Q8*e`KOB@@%x#WDARsc+b2+9;ryG zRR8gpU^HNH0XiKDKnclQ=nKv=NZL*(SWztl7AvSl&XDOGqCVa_UNe`5n{< z?~Z3I`^?wM13at`peOX&1R8IO5x&L=tL=Oruvi53bMm$xi+27W;3R{@ZWl}8EFVQQ zg22nVqBcyzg>v+Yb%(c^xrIPpEOp%rv~HNNk|YmQAJ-=mpFhzy&G(OQ1lB#L5v*KT zS8KZM97q6mc_#6H=dhdXB5We02$5Nsf)`GxyNFoD`s~h}3{|5krm5RHE{X*_7q($cu)Q$t008a!Y6#HaFO z0p(})bN$HENgqqyC$G%>oTEg+i3RHO9Dh#Ood}6kJ2M;IauwYv2C-?{QJk5cxiziU z9;MWIO|l5$N?~=m64r(|Z2vhj(0@M`b+wlRq$~(F%@Mp0#xO6jR7cp{Lx-5e?Uc!I1s0^B)G~n>nEB zsQX!D?|Yo+dzzAE85Q7rM6cJqTwdLr*@b>~M#6G${Y1D&DCvurhrL-=2vU1`8#UoF zjSA*M=JLmYx&vcn08f+q{5i4zdOUz{dfUY8DNYwSsZI6Tnj{S+#Bk2Dd{04Xo~<5t zm?uwa^4*bn4HZimh%ijbb1dMN?~9@Y2Mg|LUuc(Vk+D2zhWcOjqbRfn*m7!5buz2G zbg0XfJbX$I{b7J1-@I6DY>oGE#~mCt8W=n&mfE_r_kk@Wb8Vt#$j6k>r6D9UxA3DW z-Qh)0C(Yi^W>5N?{Az+u!sMZC-!%?GX_<7}c4SGlVOe6wTq1p+lLqLKXRf;Qop)N} zl3I5ECBkP_498*iqmq71Ut6VPv4_aNt%H9oqUeVGrf`dzaC7lWcSfImVRsFIp%SfH z1HfkKcKcq3XeHyg*gYL^k;RW{1fl`Aq6V-&wDPz6MLutb^?8Sz>w$cE)yUKl#@G7d zzxmIXcb%ks{*)T?tsE8XE#GupG)?9GX;@OQ4i1w^RuUcGnj{ERho}s@V%%n(9lEu; z>8WgQAUd+kiQa-|FhagJq>juU#v~b)2{TT1{p;EgnjUb^PZ$qYQ=824KPz7Q8%nP$ z*Am-_JhH{si3 z2{p$(HuUJ_OK+a-j>n0{wzV%kuA{)%htXG^Qy0>lxS}~mK5xZh2q-%rKq9S-ic_RX zfw)ED)xr{WN&Qalh)@gCVq4~9rDSNbVb($^3S<8#i(jINu)@U1>eTfY=#IR-W1!4u z;f3Ru%bj~~=aOeW*z2Qoj6XndH=oB#+`pQ0+B{xxqxgE6(4j=gfFw(@io*PRU zQ6}ciOQ{hAM6>nAL~QvyCIt}w&2AtmxD&rmaJOXbJ@Ez5V7QQ7&`aZRYjB_F7EEWi zbZa4*tg?On4RCq)%X(Vax*S50lB-)7M*j5(MO~ru{d&ctZ)QRu6qwS&}7-3nII&^!Y>#CFvFFwJE5K?=-nRiGAW21=K=TS z=d7m>CYk$`cT1}E4+bwO8){~C37!YGa-w19Z>#P57X(eBShx3Zd@Z#&-!s=uCw@fr z4PTPFGkRf0v3!>c^1GhBIXh1QmbQMu9@Z;gn=TZ=5W{g8o?|Pf;YB~{QtEpy)8BB{ zZlj?+eD7(!JQigTouImRhO41Yo-7SRtIGQpY`!?N{wPIJkXbY6;0^G}9QT4d#xG+I z+-E0*Y+Uu6VdrHEMNudEVhRLqT^hT9SQ__y>fKpwnzaO)s(<#}iVr2gnS1MmX&EmP ziQ!_g7AbZ^$X3UfaQ~`Y`DMeH7x-}c!Jj5^#=}B6HRpE&n<%kI>@@4!59XeX#yg6$R#oDY` zn-jMe{zdypDS`(ZzB_GAazmaTc9{!{^}i=!YmJ1Hn6~vQgqYL*+^E9^#dYF@BNET z3Q772Y77^uBr)uHZRKlnhtI41i!e;Ez=m}GM+W3`tN}UrD@GAq!!_r)jxa(AL9Now z&&nW!$bF-|cV$(<#T1p-yh%cu52DMJSYJyQ@JRHTR&*8alxp#UT`}~CR!nKLO3D*f zKLs3YN@r4OPY*5z0Vg`%SjOZIXIx7}<6{Bil%wtMfVwH(maaJLuDA<(yETjGyT>mx zOTdAXXy9EG&oa`>e~P}@s;2R&fxY+H5ma@`nMMr2!cY~^_#zdJ!25RbyhZm&RzP?T z8~{ydyvyR=QKs_hNw#b~ZQCCZigad3U~PAQ7%YC6k@8m{8~VuqW^cb5=`@sGKNZ47 zyo#}jOqhX9g5wTK!O){?4Sm9WkS0`U_*}o#8SeJy6OC&l{QUc9K7{}J2jR*`2hdJ- zM0T&o$w_&!K^;kTF5_IvZI9CIX2Sl1HqG2fr$KMk7qah0SV<5nmU{P&sX$_X7kmu@ z$F_H0bj7@Q=sjhdI05U1*BU)rUr!vp0BvH*Cr&Asc8-re1b?3L_TSzU9U`BJj>#rm zHdkUW(z2@_Ycss%I9YJb_EDzCM^wKy{<3Ery*}u5248Y^qgPdNaSwu9Ce1zdT#qB5 zCu`DN#Us4=~`4=(R)uO%+O##{ijAz01@y20vf!}>uq-cFnG8T zL$IR2=sjJ#lyvC;KSzB0kkyOu?n;RI$M4n={W(p}}3BH$&qDw`p1h%+<9pcauB>?-S&87!IWJ ze5!7@@jce?_g^}4qI6lYA;fwvMbLZkMUC2aF6;ybnl$_8ylT~^4kZpsu=E2mmp0Ii zc9Ol~0G5tN(9v?ggr*z-@pwCEFdDxa6&RO%z% zd{ivW=r~)n=RFx!f745Re}=e-wwz-NVX0;OdD#E0>fQR3q;oU>PlrkBUFJp`5&!ll z^ni*$oeGzywuN&Y8y|^+LZCQ95rzNL5$3nTc8vTGO19de&@F7}#BX2K(bCKAFdsmS zsk|hx+_&qU*7N+H%C<^IvQ#KR5G5(|x9K<+ZB1V=ant~_*W=@d#-a*}y z0&;RRAX-VyV$3Tz;tROtV;Z>-s`{jy z7&WhP!?wPCpK-(0v&*Rppktq`ve$}6My<$3hMi17y=mxQmFsPad6|o1pHpdYO3;2F zsj2=MzG1sJda^!KTBf6|TasOq!^mLGUlmWuGXga;;g>q<(>7zZc2~=hEBu>LUZtD2 zdtONHF7ECqNc+0Arl#cf;zDAdbjtm{I_q^IGERp{Cmg3>#Rgu%iBpRm)sjE}DLt zQQ?~BzCN(`!)IaCOzcNg<`P{m=wN;tgo+=r`=@J09NjeZno_dO5+|-8?@{5x5Sr>H z#q12V0*sGcoi$0)A#5hU(9! zibg(!h0!oYVdQf$W?NA@EpYOMu(+hq_W!*UrB-eu?p2A3AqHApUtnrO9SD5-g@DHC z0oV=+Ej<2exeU|dE%C9axW+g~%hPHtc}n&^^6J>9o;3M6@ZgHWD3?!W+LNFNKtSS~ z>^__3DlW*soZ^9rGT|h)j1+cnCVq{(SLt((-?SpSGx!Y9WeaXBQy-|=dx(} zP1tqU{(D;r`)(^t%A=&_+Yk*_`D7OjN2>iIDyK$1NyiUEb+Jq8G7dSH-(+Szq{zLF z@f+*xe+N$xm~CE6z+7hytEe>Lc^1+vGB3T^!YI||=#AbxW}17=)H;R+YQ;fc-EsHh9O1GuIHdpAi$2T02l6Y;(PH9hfczv3CrIZ$ z)0NPIe|Y;}^`Av37NKVO9Fgh6Y`CPaX}|OB`#}=X96|OQHTz;?Cw^BE7ylh@fmf>i z+w8XKn^x6+Zo&urOJ}kYZS(hIoDG3T_gwF3%z#k!>B!pzpVLB8+BU)xAmBa#j_2jhk9a?4YpUS7rR_cOAdRQ-K@9=->Pm}+r{^ak#cQKUWKvN%%fjF=X zd_xbW#dwWoEst&nL@CK7Mpe9COC50G)(~wF4mQ`YWIa(f50gA^YYqTo_=+Z)=#>kz z*2VU0b;PQ~8?y)x0|RoK6cO`F?!|)fA~f|L&o#U|K@G_Xc6T7p+B(>mnXp4}(E6>5 zPo6pjU>Cf7f#4>oM3uX;!=(l<)nJ7xs@atomh zWkA~r2=^XxW$B+~XKCrZI{fvbn8G2GHlF;@d}@NuTnfoGurm(Udm)JHgJHH8%-+4L zmNeaL;wjH>d(ksYnbhVTA5@O>!SYcGcYYfeRl}G#OZFSg^C}H=Xa`ESM?*HhTil>X zweM)f-c@RsR@X%yfPCehoM?2_caWCczrRy@Eg`}QIZYMekwFlI^p?vPJ1Xh@SS~nf zM6Ix&?na&E6+kC`c3Q4rA6gz3vnMj4R}#dIW3S zWP+X!q)_;8i1b{I*;}Y-8Eb{|Q-lH}&ZBH6KA4vB1WKVai>NlbodG-5$D~S56GyFo zrR4rGN2!jIL;<7lIqu0Q3nBy6O&qH!87bF+PznO!+~_H4zEfD=n_Z(wI>N` z=hue6Kw1df`q~zIkA*IaDOI1aqlhg?{u1WGLn>9+JvL- z$?``<@X<$6&)IJ)m1x{m0A?Nx8vhmE4CFn+qvm+qg4q#*La<(<&!?KL0{o9@y&F!_ z@^M2j-P~lOV1shfRAEo@?5Br?zg;%ag8yBcvD}MjtjHWoB(S;$>WKO9zwu&vPz+#E zdp~j;a!5SH7nWL?p)CI(=kmx1$Cv2!!)73ViSAQQBo}prcWywU)^y5ecDaY_^ApI= z4S}Tu?{#0#IU}$@K_TYX7DcD#UDu$2UC&>F-m|>@SIoIv!s!~NT1SyAMQ$p?LPPAN z%5@x?qR5c!!Y|g5_BL)|q;{k8z87qx2xA)h2ebDpd-z-4*SDu?rEx!NI)0ssen?go z-wdMne5P2X5M~eR*(49y!+rRm)=tAFfa5B=x|8sAHrPhE%n3^|09ndtmHXptoLh}q zciuv&L5C`$MZGR_D{L#LJr|D#wP+sX)qJw%zWm|-Rt|XL|M^|KaS*^;ummamd0};O zBlQ}zZ}=)FBLDr~xzug@&96|4QVMR8^SE1N+B1QbY6YGfc5EB)C4sojupVo7g5`Ie zL4&hgpZAzwTB=eI%*hAj?06G9oy3$#E8UTNUjLh31@GKT{{4@)E*hDQa$4OVC#1%~ zVf+SV{v(x^$FlvFg}%-LHFO!f%q_+}B8LmMxk-oq;NSLrs>oH5p8ptnR?e1#L*|2>v9MC-0)9H%OBz6wik#I>A6 zAXTKSD4e2_v>=pFuY*7ujEq!A$eJ*ms9q8*RmJfxAJNkueG4dsUBdL0uoQw zE~P+*P*EkZ-dht9z2N$Qs>3%J{gv_SY4Ey_F&cOwinYwp`bG|>4@wo-+|VH?F0xY= z5#&_wfGL*|ly!Vzt@xqIlpFt3Zgk9aN!|F}u=UF3Z zy5{S>w7{EI1z?G#LeFmYjT)z)iiy1y)98|Nu+r+^TZlERbyAMiVP;)+pi&o`6cz8- zl8j=|m3G;pz`&T~s?{P|xm|f|eNb-INM=zo0@mFV-hO#GG1xgNkzcPSE-;;dV+L@8 z?n}nyRfqmaG(87zcRR%OGtPo28LmmpOu+7KFa#zt{7NWy8*R1%(3>CJ^Ke>9c@~{2 zSiKFS#_q^(P>FEk$UTvv9j7CIrf9&s4Ap*3{_e|)_*dV}*{1%X^TXhRTuPQSqa}%@84R%Y898TsA*84h*$TuS#y6n&Dj!hmw0w?MOmaij$1aUJJTWm~AIS=S zmk*ix#zosCN4u%#iw101wZaw(Nl;h4Uu0`6w?&U&Z>9?;Z36n0M*T}cgZ%j@#VqO9 z>WSipv@K)Bh;;LboY!~eMI$uG5z-#zcH8Gh;S#-HeAT*44{6TT zriqI;ZB48*jPlweK?7aNB)wzZ@+vNwBi1~)NS|rhc+?7LJtTFfn)y5Q zy6*sIF4&hb(-zaKiCUME@l}$J>YELBY&Db~XZ&D^S1J*6a@cljW z=v$`7M+EYN=m=*Pu6>K!I6~J^AHmbxXw^+>HN{1L69k}R-I%uZq~0-tfB~TSi+Ia% zz__GjK>;m6acb^(Zq!qv;cEviXuZF4$;;E?Re#gi1V}wOk7dWNckqFGWYXKRplg4# zbqx)*M+`-w8wWecrajYi=CQR9Fy;ZGFoLpn!^uqG?aLzEyj91Y=9(#Kqnfr%^*R63 z$E3Z&7pCavTI5GqWMrY-|z8xNsVH{tVi z1)pOjp{ER>QF@SDcoZDC5yLlB@mEgxJEmlcN4gHzCc69eP%N%WV{(P8mLE4_fes}- zo~901l{?ukec7y08~N0Jn!2Ig%w+xxA)*pa2J$ckd1N;EO<)01mY%O3x1MakBj<$v zW07dXvc1pWNzpnU>4}q=LJN-N@F`+BJ<^jBJUybG&#mrI+io1*TI7+F>Jz=|7AgE2 zy{|Lw?ytcWn2Se&Rhr$`!nZ6dY?3UX_ZWQLx-?DKq~a%B1DCuR@%f)+Ab;h%5WoN8 z*~)%FKO2fU_5S>?2@f;KdMWbO_>0l!%Jo4@j5ACpe`d0k(!Z$_=Vr1_p=gb~wGw+K zJrm6Hokf3};l1IUkTdTs0&o}gt9RsY@$oZ**})+FsHIQ_2*riKRk^S`h7F+vZL6ih zsdC~dyQ-qZ7$BzeCUn_pRifIx;Ge5UbY& zmGh&xl_k55!xPxE_~?sdjEWx3=XOa%5Npn1)|2g}bs12qMTK=;YT>R>;SkT2}6>2|Z zn#`y8>KGf}!BR@JkX6{W_$#}dVVXym>#ihsDe2vWLpUHLXT>f^brG2||$ z%kFYu^l?-EO#9;IqMtZa*9v#b2=Q`_pC!{n<3tR9r9XiU(rl^ZlDlyMfTJrCF32mo zSKbv{90_k5#TyckrsSdw>(|0DogUB?3B;OYg2JQkfmo(~*iQ-?7$V7BA%c2z6jnBO z=+Zj8`moOxvMhx8?L9D<&kKM>1q^95bPi6nrmcelESD6M}%TC0J9BiraSGF2@Ns6+S^eN zj9#2OYD4`Y?3pC~-s33H)6c8r=QS^WHJTrN&iFuyp8(kKSSOY^gTp6S?bH6aCznd` z$PDhR1SU6*r;H{q5WH%_!B*{1vL6uJB6GPYh~3kQ`yvsoWB6r&)-EKInRi@PJo1?U z!>JwA#pakL*c9U=got#n-I%IfRLA`FnxQ4CiU8ed_(?~_MY>LQ7I)@}5?7`a`)u?u zdWa>p8#$+f3{~C5z#^L*Pf>9$#GfG<<9#&3mFwLbTU+ zh+9rL-Miofsh^QN^~iV4Cy&CuLDC1&wSZ%(2XAzx60J zrP41E#l%f#x`iF@eE!Yu_iziIs|s-zy5gKm9&wb-e?2BMf4xV#7+^XD#5g0EMsPjz zM^jIa4y0P7I%$Yf*2)KDX2O5}Fr5T%sn}XD_7#7%5jLc0ySO8P)Y&ZFwXQK`cOf_@ zs{$~%j9z^$p4}iVKptr_kI{(N1`F{jhB8{AHKVmosGrIrjnIDd(TP_}nWF37eo;)= z?{bELBw|~u3VnxH!UO8-7IglS)dMXUd*;s&MXT+u?Q~ZIUc88^bx)&t3&foK;_0rt z`L!-o6szZ82g1(|A5Fmm1QrYnB^B$uHg zk?eo}9iZuu0*l#Fm8=|rBl}!qnn{F_J z?d(-G>ZGSh$~(H7u8h@!ZHjK18dCcF9ID9WJ9kr>a<5+($vQz%8F0)8HMIZta9bzkYs|`3~RHj)UH!%^T6tfL<|T_y%?=W6}mNPf)UD-EU(mSI@y&z{}%_$wbph1hx>MSLF{Q`b@JhN{EX(?($?D7L_n2iw||?KX)O z&0kyrEFjy9Vub_hIcL#cFSs#}3$PUc8cC!WGV#^%8sb1Z5DV!~wrz zG#N)^jwUsWSM;X9Cv6n|sjtCC!EQ!G_%pfy4>79|$$!R}5NxS3FGZLBD$Vy*uL`<6 zV{NNi4W!xkjtWY&@@PWR8#f>BWgzk_wBpI*nAM5*$rN)vZ@I3V90b}~Vl`yXgIWu;sw6LOKJ zHItZw07YH%;;AUy{p)IgaSULO?1Y%ROl-S^iVFP^4^m^KAhfqMl0K$<GU922f@iGcX0ZDu!f=xcjg17yoU39>8q7|Nfs&sRsEr zZSyGa-*Pd!Q$NK}48Fpls>^S^7V*SDL6~_HHMK73@}SCh$x{}uWcX&u!s~t$bePv_7-G)o*hIeXfjR&S`zV`$!&(wv9e|1$uvnZM1Zpzs=r?~lgkro=z1lEENW zJw`Gd%eC^MzweHcD=EXv&yr3XiUWP)TJ1JoH)ob{X59AOWal0oMG~)T_&2rxSm`4w zMWN&k7+e~w-DvG`SiV2u{290xzMBLz{~JI__Zz6?-`@8$LnZS-SKnxw%)O%w;G39Wcq-m73Hpe;XIo7#$8A`QG~8> zPRwOjW%$5HKIsp6Hq`AFBklw8qL>}5+2)%u|7YOZ_Z!DC=E6{1n;=D zG0~7lC7u%qX_i)*M(4iFLY=4&yEo= zfa+$}nsmiaV#$Y&=40kS_8SYTiGFv+RLPs{od27lJooIgJ_INBn3s0 z>t+PWIy8*9hM67|I>CzI7~a$Aor8csu|OBm%oc)B+YSPn{NR^>Fd?-G$By`@Ssbtt z&kbM91^dvOS zcu?a(%y_HzE-yqQ0%X>IGPgm8U|4^;g&ecK+GwUQvq+f;Jtcd}C>FDcSyxDS)7mmT zQHRXc|5l+L)Rj!0PAvcNn0slW=w?JZ`$<{(6dZQQ*+XYmw@-+NJsqFYjcA`~i?}f} z-SJAH)n!4QL2RB(!wtZX6qQDDPScjEzfx&&wQ7C@R*azk*nhx(M*&S;OLOYlGI{4~ z##p>(Dd6L*|LpO4)aU|)=N%-a&%z0)WqUMD#DP^_a_s)B5}nwzIq<7uqB7omh=fxd zYqVP!4CW-)W(~_`f+@NDUQTa20!;vU#mPU)|A+$QN|--IIN~9Zc|!6~?9UJidpWg| z%U`7$o;5q+@f72Mi8IV*zz;w*NA%55fI}j7yjy3@8#JpbT64?%kjw_ziiI{BscuwX zqg_ncOCK%K(YtqVE)_2PVnN+yE({FO;GO{2>|txEVD_1*zz~Az2(A(T~Q_ zfKTFUCt&;Z`yhcWm_OtW5KbHk68Pk846ubEm#F0CcK)BM^ibC-G@K2N?e@REi6;#0W^^+Ze+c0o@vmXeypT?F4xQy z51L423t86M8>;|T)4El8ziIFlfoOu1=a+wDtDr6d&={RZO}MoRF2AqOrz0?(aHlXf z0txLmpM|Qk-mA6eG%&c976?@Umm~$k;4?>Ht+E`R|tma{sBpc;lojSXmbN|B^Lrupg68Bw&onKN|fgy@% zU${Jjih$%spq97hv3KT>OcVq{GcquEDHLa={JM;z=&R7Van(W|mY6}b~!kkK^(NgWp{dRLz!=vXavRb>}HS*2wT}1{4vzr(`xAX8q>ejy< zG~klDVPsrNn5yy6wZ?qDkuK>S28M4+{U^78qj%gs8aX?+$%CfQ`cTz)XSB!4YwG_^ zLTFlAo=u+`6JUPb$!k_Y<+iq9LTNyL9K_9 z=!c-K3|ZfJ7SU~M#;J4za~pG`kI+ig9pgy`uoI9iWFLo+mHmJ^SMUa@jTTTvMe|gU|D$42= zMYpc!1WJ87s?lAhJ;SI$iT0ut2~YR8$HfuulNyg<*qvZoMRbY+!Gqhu&*@FqAX2-x z8hCbjV3bMIC1yo*z&huhZx7J51>kAih=}8(*CPd0!eV!O9qSFDsEwM$Y zF7Xp^k>}=>^3Mvfjxr0%l+e+j6;SkNHmP zy#&9&hsWzySXFh-4{}fM0Kcl!^0phlEV#(^;zM(gUr=R;c8zW2`lkXzKP0*Als>P_ zAbnWl7JZ_@Jeij6<)Tr%;V4X^vc|2r>W#{FWH-&*UPsVqE(IkFuY1Ot0zkgvWaJS8 zG8m_7|D=O!Ia48nT`%o;yU9x5EFMh`R@JP}5wXv)wb%x6PWgXRWESMeS5wNCT2}GE z_B6g-vg>B;tvW3Pj4D83VlSCm2sB-%V&9}Zr9G)pOqe;x@{>b%!Z&?*1!<=Bop;B) zv9Rd%TpL(+Ch9$r1esp?+&}a&^uc;+5pQw$s}Q;9PHAfA$PSDxC^`l@mIPf%7D(BS zYed_>#Mu?d*iJO7g9ZpS+%!5>6LF%x)Kkkk1SKf*8_EBB3G3Ms;8cc)RjD~??cay{MLOh65IX=h(zLH<_e>L~I{naXH@)QR>I)78z{ zz-Jl?$LcDk@!8IC^}X7Lu^H0BD$TmQi&sl)D0kV{Y=@rYu%yGM{*LePXKPRpZ^vU$ zmpAO@{;AlS`pC>ke)Hi*eD>z_p#u1Oz>uGgYBy@~UOVakKs%jc7Wyvr1ex4yj<%c( zv?B2wk6`1@wTW?i8e8HmDErQMu=s*LpT|E@|H_r|j_JD2>f!YOP9y_9yEbK}K&+Wk zaD~pp>ofGJVy=F}9YR&Ac9X~s|(4M#3H!xMLepAU?<=`|L9T+80<&pe?NxX0=JLK{)46KV*Dbf}GxG zeJ5!Us&Ws4E))I~#ZtS>+!_!3jhxPQ@W4ClNK|U7bx=ivd`}#QvIv3*O6g9v|_{6j}OnHdfPNbJ;NasjJNA`FOWGs#`4!#&^-{M5xO6tB#%&);NT*sI& zpPX-kK{%gT{shi=jX#|?#ty|XcLhDm_xx4{`wKc;x1R0jFci@=ATt0$Zeux#4+^$Q zb5q^MJ<@^lATbbke0#Fu(QO8jfiy}Vhm`*f z@NuM*wZSi^$!&ayZOlE{2&9?6qlJoFS)Z;@irXf$Nclfc%l|@noBt#sR|trZ`2+cG zJRsqHr5%3KM0ylxGYdO_CF6f&r@b~o&CrmwQ-uEYqy}4`PH@ayO?FoQMVI5Q)l5Xz zlA6>sWMKL^E9ht_j`8|A|K#}T(DL+*h_=hS2HZytg?-tWF@B|+Gh42sNXTa@soHKr zLF8wrv8akFkl^MeA)lR}rRk5o(oP$jlgPa8e^xbpp$ZmPt=1E=6V2JnK?ef&`=5zn-9f0PPsD#rs1Q`2^-tcd(kRqY zTyRHc+gzkDKUY*ocgmudx;hOg+c2OC$}38&3|+O&xX;uS6o$sOyt#Q(6(_0pB8a82 zu4yFQ^ALw7gfo!1=?eL5N0d*zxtFfh75F7rk2(#2 zH1ku`80BUDI7>hbGBm9HQvY6*j_DIy8a-LHqhf*dfZmpOT#V%I?lCCv3~)9jtIch? zJ1rdIdOu%vyEc#zyqFHU_%JHFo&`Lq9*twVtX{3@O zDCzF+mZoht!JpXkd>ik^9fZU#f`_I?(S+5jSd7py8*KZ;bllbSHgdX;@RYOu?zG#l zW6Q1ZH(QR+8AI&}XMBkE2lcqmxdBTgcA>L((peF??xuvtHVbK0htbEj7QgpBktqeV z6H2?xj*~8vgc6&=j@9xlJ>igP6RZYL{CUa0L(%*VK6J}>ms}5~!5gKHdrg!%uE&0) z;ut+acQg!`gXmjAO?rui1R)Hf!qlw$ z5|bJVU@K+jYQKhk?hX{JD~ zM0tAx=uQxh1SJ;+LBMMtQh;v4+8gI?Pt+Ti%e`n(flxK8e0_Mw(672|GS-S-`Gzv1 z1e`Z(^psw^Xj-4W?A%6s%*Z1DxBfM_{zC%ja!{!4(MEd?fi|)^X_|>Ei(3VMGU9UV2sE9 zwNkz$-epGt)^`gb&a;4;&~qB2@OW!ef>kVJ1CN4Z$>Z3Rfz6{#Jh5>!m@2=Jn#&Q@@xomXHU=Ar_znd27}eN}dAVta^Q- zpr|K|8$!9)N>{@fc^YU0Y2I5NU!+Vf`}|*IwFY&NpXRP$W_oOMt@7&)Gb%`1I5SBJ zVd(T93mMTT_b6PH-{@Fqth25--*t4I5(t`?KbO5?Wh|+cAQrgwZVZSU1! zAgz#bOF+H0@9R;S-22u<>V2GSP`4h19FQl@%+ed+jXiu-iK%dK`^ z#~3)Lcx^|#b=)RT$ZrzSTP}6RjSR=ZyvozHDOb4!2#_2E^G;@5Zl!=D?=eo*MplTHOG&8Dr1gyLOvVZW-1 z5(*jnv&Ag`F)RQH98CKTT9Vk7Fkvg4i+3~$3@ zLrAq!pvH_#p-e!fYnce-W-cH$|CdFesN2_BTQp^>Es*~eh;>Q3!TK@fgAc~osY&2| zv-qoi)w71)S6f;3MD3ViQ&$GRr651{X5EKCdCan=J6`1eA0(==5lCYMJ&y+hY~Y#D zWJ+!nB6sxlSzir-d#PqSMC7^81CShcNd*(jLho#4CK4tJ>Qip?UQ+Q?u-UjiyhuG7 z$h4_b_*u42HvcToIGW{iygY$t;iIGB9-P;DSdQIA2+HI4QXTTy7`kstS|MuOR!Y1n zk56+VNz79u=9)P2%mTp^PThGNB1vM|LmV$zByJuGqp^g}L3f94AqTCYU%ni6-5Or} z6ScuSzSzL7uF#F^j15nC?1`#kkc0K;Ao`mJfzH}=Mj>IhTMNgO*zEwYD%ZExK+RPc zs8B#CHO>?{e(>9j8UKBDdRf*3IvN34I?6Z*vG|yCWo*8s3cZkA0bMwh-=$a^%Ru&J zOgKQ_G=AFU{`DE$NQB)ma>QZjR27f61tueytz|+TGO5%Jr&eF&N_O*|t@-efj{5qm`cmLyp4<;hcfbS}J>|-|=5i z2yQnW(5q=6KN>z+Rq-TzEIh}CW&DJ#xm2zsjCqALAOTm&^p*ub@{4A&9n_Xs))%8x z?!!sR;I^)S9JRzf55>O7^!P@Q9~E=B>_@0)3Cav+6K<#Meln2x&Gv?~8ztdaTU?pE z_Em#gDXy8Xhd4fKAVA|f>*N_jt37m{7B|D16RmW3H}&6OU=lA9Me?P!!gERed8rfAyWJ;SW$rYm+$I z6*X6<*xTw-zxI+bd6P+Y3+q%}xAY~*#COjM)#O6SzhG}3U2K@?3ebj1=B=lbd|D>F z7{}@p>ZUoLzq#RP{Chhk(E0?VGq>9b5$o+}I+;1wp9(7b7N{A*^0{ka zmpHiXk7-bOO6o}3N3x$A=58ch=Bn4oPjUC)wR6yKny_`|y!Jj{->N``@pHitM%P{J zqX9y25H%w4skB0LLS31+!$YPAiRs_$VHz1HT0Wp)rn456!^ek8R;t2$GY0P|zI4Ry z3o*^g*V{eP4ZPPM&JV(I_xsXmqF94eH|HdQL=&H8ODNp?42r*!jGf+D_6Q@Ev7Xuc z0OypS*ol)BqM*yLtI$Y`4Z1TWPnE8sGt-UPF8jH|=)+3j_@w~ny^k~FGq2VBHo>zr zpFxh?Hi`TG#`xeVfK^Ff8=1qx{6ut}yzTu291%~zcMFIPyjQt|=l2C?xN{uGNuL>+ zUG!?4ZJGN6DRr9)$+JREbAw{wQJlEwJFm0a;H3vH4-up?!R-rA!6 zHaU{Ic}^yOzL+^2aFL4m{TF9uWJe|~Ib`aL?Mi-O#0Gc8?Zlg+C-^^|Hjn{jahvqt zmRrO9)p5tQB|d{?-IcNxrz#@No)GM={~J&G_0G|h$WQBHY2F>zGZhZ$#0|$maeoCb zS}eR5o@kcZ%a)k65Xb;az#w-aV>?~7=vk_du)4+p7(!6O*w0C;0D5&hcQ>diuvgUWtl^54PATs-XXpx?V&r~P*-d%Hpk43nXDZj*;Q ztA#ywI7$@Y4F!;IW_HW3R{WJLvE$q8F4$2hrWwy2P%B_Z0)_!1!pne+QB*Zxf*ftg z!nskB)be~lFtz1JHwwCJNNPN)hof=%gI+cj$bOg!!9BVsl(-h@K4_z}6qVxwsssnP z9q*MNxNi&m+X<)xXZzwtfSrdR`)~$XBK`lT1+b>*5x{N<`&8%xZOVw_-8zWYg?a13 z`WrUS65vt`QvyAfSkbi{j6JtDD6aU3qvY&x?hv{kC2p>UgtPOoWR-K#3dhm$-T*r z6bMVY{@7lOGih`shTJByEnGI@Z`Pqgb3b}zV&Iu8=kJ3wi(=yfDBbP|=B4CKik=Eo zQJKF38Mpbcd2un`n`tu2;Jy18Y6_SH8kg z;{Ot0FPpiKkE9du9jH6LLx8xF_)qOB>{MqVsW6McsW}56H_bTNFcCOLuP-J66i#H; zg(Kt<>2^!4w}QWxee^Fk*Y$D6;i?Bhj)G@A?AqJ9uWo%r2HeKEXJ}hoqdQ^>UOY(; zmlkS$EagRXE>pis7&8z_Rr$5ZdvQ#Z&dg$b&q!y{5Sf`U$AvTtYvGH+ps zrfyPZ5MWu>vGivPQz>scC_KO0|?Y6}ocrtscT{L90HmWlm!>4Z`| z$ee$$sM9~y_GQ$0F{nt6Vzibg1#r+zCEB*{2Y2EN%8Ddpfz&FZyg0Tsq$Q1 zlil{xnGt1tQvS_PY8h|diDkDb#I5P~>d#DPgxb*``MH7As}_{V;0N=ZBa~m?ZM<+B zi{-(f=T69naNrn=(QO7^Bfqs+-7vRcg0-fe+n+WVE39hjajMnN((J;tHR2p1?*gTY z?wdbe1_)>-VL%&iTL(uzrG_dUyxVx+;jYK5W-SO?f~s_Z1P&Yz-wDZM(F#^1+Y`YHJ=Q*f5RWV%F5fM(Q#eqIR#&*-ytFRh6uS3j8|ba z6JEY<_&S&Jf=F>8{JIU?PI%vxEsLAZ##7OAE_*l>k{R&>RZa z%ON4s#r1T#y*2F4C0Y9mq!wiaiy@Xkxh$kTZrcejbAOnIGOBr+Wk0YkL;z>?Hj`qD7Z6|AZOG0k+%2oqkY*t7WpEC1h70 zbOT0+9@}h(fE$+5nWD9sgh6sWkHhK7>!mEhT)!2J;UGB@r(1eXVgOB3oH=- zanlX=scXf5=_$JU{g~fqSP+{*9`qZ&yAfZH4o1{sq*~3@;GPS69~gi*xQ5&fFns+H zr5beTwo1Iz+Lm1CoLeL9$i7Y<=vBVX6BCs1^e~3yCvMvu1f%%x-BeEbN#+*cv$Xx= zrungjm^Jy~nwUeYARKE_X29uUkx}($R3Wr!M7`g5z&{~=O@hHBb$KQ9F<-Mj0C~Ge z=I>{#g*k&@T}i|(fP)&Vek-sjiGl>L8OpQ(s>RLGx&zQTi&0NJ&3bV z9^29vIQWUJfP_C;3QKts;BU7mIEb-bR^ZA`Am7wAJz5lxdd5zFhY$$*rYul5w%D@r z&Z1b*=YJimOK;Hh*Mm)eG$-IB3}0TJao%d|;a zu;Bx9snE#LP66QXy#^5dYmouf$!{ft)rDPJ=K)GjxlU(E`gUY={%M`W%Nxybh#0-J zJT+LN_*ivfsBsE7-zg9>m_~nrPZSps#w-k6QV!HN-I4wN*9HotarKu(uVSzH*))=# zKe2A?Jy>Uv);7Ah8~BN+I0_(Y>P^>;63QiEaDPXvi+f`zWtdA`EKl8eL7A83F4A7< z(Px!(Yk^;&LCUWtC_lCsG_kdMP^ox^T@=6#HlkA3~&{Gg`99KrF9$Cn7FMS+|% zr70yJfjBOSImk<1fG{2wysc{|t=6r(Jn*@mP25!i;HOdVUT#Hb{s2*{2-Ln)5#x1L z3AjFS&du0SCawqV?qx^BzV3{b*NS1N^A(78SC9EqrbQVJGt=0Tq39~_6ldMzkI^{O z&~R?6Sj3PauED@k@2zkw9a&sx zepx4cO=*pJ02&8u!nqz~UVHBS?zk1M?<8n*)53U6{;D4&D#&b&{FeEuM4<@pv8EnP zdDL57uPjTNznRJ#E%WXeh13ElR_y{!H%%AOT8CQ>+b)&jH_iPsDgQGeDON{s{e7c` z!9MrmN*Y-+3ttJ?T_%kRX#+L-!GGqNp7)*9ia#Imf{7t=UM^T5O}u_bCh>$3Nvu&P|Nz(<-F)r+0a>+aY25h`KUw2%lLTeo=f zdL0nflGy}ENS-oj$W)Oy&&isE3Q-y+-Z^D}0{#0`@|G`5gE@9xS@;^XmI&&@UHc6> zN`!jyTb~e>@HGE$5t&3(rTq5V>k~m{{=Ney#v=ZYv*#(8uvudfgkAD{JrxON?9IcX zoXAZ01srL~4PZlZ$2m|1&Yw#%)hku3O9E3{{54gH)my(`@c=QxU<3^1LP&*!e9Zb{ zF)wxbbo+ar&MMk4A3nJV-1H{?R4t&06*YGdjzYU^o`~Cq$yc!*8r+H|F4uM8Vu}1) zFwMmjC!Ae=l|te8s}222G@J4v0R@$3x11yPGROpFH7N`S$P?cb0^*xN-)K#9-OypB>T5AD8872{D zP(8>(9(ryC4x);#U*AXEe%(ihSiDF%?FhVwTelt65;FMO^qDlT;xM>7g<0Wzl*xR8 zlAWT~Z`%Tr<#)nS|C(5Xivo<@8!aHp#bRjYWFR_Yv;B6 zYL|WYQOL#XoYVFdt5m1(P29UNJJ$RS~K`?9Hij*Y}#L+ z=R{Qo+C+d{D$l0Dd}S;w8W9HoxVRg-9qjxc4<0~0mk25@ls*!?w^Fmw8W&(Pn)J1u4#FyUf=;Uo?KXsOHr@%aF*<6Qx;+BDv|+ zR$Q-}QXvG7N|DAS?<}a_?CIN8t(xZbkJ26_tzLf^YZVaJ-mW1B=fcAV02B_UXb*C! zV=5C|Th#El$d5NZi~4r){6|^hJEb={JFo#C)p*P#MlEy=$E-BUQJFYE=Cy zRVXiFv~v)UfzShr4SvLVWXJR%$((Iv_$leNVyfT7U$=&iH&*Em?;*^pi(@Vzr@gBt zS5Q`{-_i|Q#WVN6L;apwpZ^;a4L}Jbhg-08H1tfllby^Li=yT@^`}D5%DK9UkLYz*;(HhE#>s zYp$trN}cTv5f=2OK=cI1LhqelKuW6(j)uU9s%TUMu0tjQ#AJ-m4ynZ*s%p~jR(!aj zp|>554WD-*D`Bh;QHRDZ;^Lz-e7Y!HQ}2`m2+%o@`6mOviU>XdS?haN$VXoqRPluv zg?^p*KqX-r>Yjv2&%-DyTzfjn^B7eBJnawyZ{v0HUOck(E>q{J3nFh^1EKxgW5dr0q0ph%iRmlV66hBOcA`cw8oT>$~00ZtEkFte1Yk(=YQjR zoEp;T;KVR}PI87M7~i)P!84DujM(k1W{G`;9s7zGBi5WtZ$TGn9$2rcYA@ZvpruE< z!2AlU``=URHjD5R*|HqIo_P5V82U<14f6fvG_~Tu6WFwp{%Oc zt0;7%3G$l)B#YQpqZNDAH8IOF5v?lSwT*k)&w)`r^UDf6ujK%uT%Ml0`<4F@99A^j zmq&ZsG3t$@T0L18z{{5M!|*|#m3;&4J^H6JSVX(Pn)qH>-w}ZX3-<4PqUWhZ1Jrwrse8Y zf17`B4qv0uni=CDHe~#Fz-RdP>#BvfK9xlOB;boji%|fZ^geNNrCI=FelEB*bIo=C ze2){=2y8_?`w;H!GMh8LYyK_8cll*^XZN2icg@!_p!qSkgTV6+$SW4Yrg2kLNd>;@ zsd0|(wu_j(u1#thLO|H;4ZPtf3(U^!^M}euznZ?;v?)s zxrx+*2&Q+TvxSZHNp1m)?zJoIG4)kHT>k}1KG8ph?I^H`BF~XMBY<4z3Eb+%@J>Be zACTHOP70#w^^jFKlT3Zix|^;s$e2p<^L@axofY$7KOv;WIX=(MdEuq+=O4obau4{R z92X)7fmK3!k0?$AXSlnuQi?*Pm@f`*slGB&O1H5z?3>v}!+G6yLx*1xIW#{i2bU?Dz>e6XDszqy`+fzg#F|EGESi6_Mqau-a%iJl ztA6ensfXv)`7+!(n)S9sSqzSDagvtR9?`p4)$2fo+O;#ctK3}g^QH9hcWVn%R~4A;+)WLFPB^naPutu5og zrVON<%`+}u@;yd#@y;*k<4WvC${xn7aVe=l(qq=t@)|gZ<0#P3Zphm283~21yPYwB z=P>C{?*gyMcaL)h58W1WYvER}kQ=^z4&gkNkHI4|i*wOOW_jg^cND6qRtun4;nt5d z#aLz)wD$7_^UNj{#LwA>Z`-YJx-%*LRomE3Gt9 zIrZegs4D02T| z0j!MF=L;GrsTQnouqvdirjrS^=Bot1{Mz(dqubqW+550q;Mvm1`=`L}d$y4w_aX+M z-{nQH4LNuuT{@SmO}l{VT6pv?q?`Y;Ll*L(7*zM@$5{8s`)QIU?XhBk3IP4Zuw<+m zCb^!ta5iISD5Ey$OdFov?!^FNO%dYwq632t(tKrWhq?dd4c2E}l#&6hb8{_upGZgicVPBc1QByuIYe(T_TTTku+^ z%1(1Pb6a`ZVXo!JWq~|=B6{aETPm?UIh=jyY3`e$^B38VU#qTX%{4xKI4trVpo0aW z!Ur^H2MzONA7I>nYj#2O3+NEqI2ryIF)8*O7^}E1rfHg+)t!L)u7+A3oL}iK|0o(X^2g45KP)YeQfRdo9TU7Vt-}l2Z zoLM90fHp~N^Wq->-fI2CupT$Xi?_}$;CXG&-D9PUubsv(Hih))+4APeCfZ zHrsjZCo?sgJCy%guW&S7NqSkxt`vuV{AFA;!sdrbE&8#M%>OmGZgzjaGgzi2c>TQJ%&RE6&|^6%9K01)$H&Uj;dAd?zdEd^uMQwKAJ`_~k6^ z#H`ETx#<5<-d1cRMS1CG$p*C=`x($=t6eafs;HxEex5@n@UHrgp4w2QKFc1zETZj9 z`cpWRc%|cLM`LIHavt)%P$xa2^H&zcIvnfn_0mExA=jhY`J1fkl>sBjh2#8@D(aY3 zkRuSPH)!fPFdzCUtGg>L@(TuMPI2|U$;>04&W9w-BCP@$saYJRjQN%P-v*+sE(@cZ zj3VS@HeJF*YQw+kr)FdQB{T^SoB1(8ARNtXd*9!I;L%H3`C~X|cTqf@zmqwomgI|l zFgRY?=0xZfKP&~s(OE;{?WMnfE(RbBI=y`j!7dJ*JKrd(eBhi zBBP=j2>PcD*NPguqTT7~;Opm^han}SnNwr&5lRh#FSfj@N-?dCx`RbRpT7iFVF`qJ zItJ4kC&y{+jffkXT^JJ3`R$zi&sgti{pn=I|9<=orR@csD20MPr*b{DOEPs~Wgq$s z9fR7Nqdq~w5ueBf!23|klXf*O_JwrrcdB|Q z0lo@3t4{y%&e}Ox2xlGn#&}MR9b5Dw=FdE?Ntm^EdLS*F%4G|TIw>e4p3@}WQ0q=( zr913W!FgvfTP~|i_7v|u?IKErEtiz4njN9wGI#zC-Bx+%KT~N=-6 zKR?9{ORXR=wyD;;E(Cnmj75zVg@y6lwH`IeC*qL9GBiMcMP8FkfS%-$YZR=C``0=C znx{ZN?>10WtjcpKT{BLqv#*39%uyd6gk?D@v|4w{bKmitB~0%U!rYe+_GseL`@$~)L9CFd zQOQtqd5L9x;c`@49$_f=FeqV9>AjL9@w+it?2HnowXoOace{;_5_8=h8udI zPlzuJA4;8BJ!;189t7QK9R2nN1%h2MrHU;~2ch&5S>TV<5mrYbWM&Z$bV{C0Mna~^D=~HN`T@u5{Dm|kzB)IhdanTA zhBFOMyS&6O*YuNtk6+~WvAg#q*GC)@Q&zjIs6VNgwn_M=F^oe`K6P73b!UvL+pFtMLbYCa)fqsqegf9;A#s7LnXx zO#B|8coChf&EKz~V+^uSIJwGdJ9F5(otBYaWn0yi`T^HP2$ynk&Y`T@N&*cn7@QRT z+^OCY_IJ8wTas9)++V)QT&kx)5)}moN4fFz2-tv;Y`kh-z5Rc-&ewmRtc~2$z;7Lq zjK`w3cJ+bVG69^HN*Dr8j)9y?e0)tY$U~F%p%9ZTaF^DgL12onp~-X?N}xF6>D{RF zmQ7&FJiPOZ&_E7snItc{*V&4wNnHVtmlw}j6ED33X}sp?d={9*9wt^Cj)zmDMKIOb zvpXnnF_#ZRv&NWlN%(3bl@83tE%>wg#0~eyXj$kAyGJh=_pSvl%NwiAlf{c~%WsSN zD@BkD=Py(07&GcsuY-SJBr@i1ngjrySm(drtH2!oo`GA%b!#tbZKMsc?&EUnYP=vp zF8VyM_O4i7nQ!Hxm<4Ev(Qqj%*L&QxOX&q4pKS+L_!r((x|y#2jzvkv7!N=U+`%CZ(q;(l7Qqdb6AFc0ymP;NzW@H}vTI?D}*}+c|}5bk$h((J0AX{|F?Vk&s-s+TDF;3#UE^Iz9z#96xvv@yi1$t! zF3K^)nFWpcYoz2|mX#Y{v5ucj%cy9m+_JADB9^#>%_UUW)4xAlea0TaQ`K?9A z(=6$#%Mq$ANJE2StkM~;#7hlpMt&TV|I-3EuF_2)AU=D)8IL{@FgmRnP>4h7S$R00 z%7rcaQwMxyZKKd;F{6>2)GA{ya@M7CWU{}-jWIh_WOpP~Cm+{8RLDy4I zKY#M>lc1-fwHnIojQ<#+Ke(@lWKeKWe2T>gL9l3g zqP&H#kSA(L=4X%8@!eg8@ZDiUMvwKN{7{6wL7AhA+bC{ZE%uw=(qKdqJNgz#|fDE}?WKdqacuaN9BD?5%mjvsh8p-; zSW2%Zpd~?<)f$&!fJ_h^wRmd(Fghm=PXYGP9I4qoM+BIAgvEMh-L|* zZp`&P%ZE0(133z6r9C463jZq$dxkWF<`e2w%AO}}1^*j(g;#(AGxZQVF_*AVMkuGW zICl{hPeP_2PZM-0y-_LWKh{aD8jznsbnX-!TsK!H9K%x?!{Lzk)<`8!jsS@5st>eN z#S^8{!|q=+yaJ?a(}7Eb%R#y1lOHGnR6cJ?tt^sT`mmNj5+$PNqpl}L_mU)INWAEy53 zYbgpy)0pgtrl|$go96-8?;{)a6G`*F3%_3eInoU7&C|0_=`(f?z8I9UsnyiO2t^TB z=}5Scp&OT^;KXvI4eH-Y5`5TAri_x#jHulN)oed5 zy6>dobM;G-{j}6qh|VpvHW<$G4Q&X2RFx)1C$Y}^=%Y*Xis)XTOR!U2tI&G^l4y%3 zGP>%?Z-es||D7#>%lY!>8r6L4sUfy#)m!(C1(+Yvp6QM3RSSGCij?cl|HVS3H#^K} z^HHz-iu3qzaON-iU^SVHhv*whl+w5SFn0;MMyw)VtE47HOY1V z$+SgqXGA(sYnMW4Q)OS(WY?vKtqWfKTWOHQI&xDGG3s~F35*~1%66mI*g>)>%@(q- z{)x}8Kt((`vC3ZhP4Kzm*FNCe8Zy(QqvsJ3kJ=6IY@z&8S0OIa}kf!yv2TDkvE`T!mmPujUz}KTZxKJq-u%07{8+C$zf?MTw`4KZjO_T<)8TY zNn>f})4**f(&ayhADWqE$a$#AbhpV(Gm1Vk5nw*95 zWj%-1A8(;wZCG1FkzZt1i7d~L=Jlawguzm^mh3V5`(jlw^0@o-|66H||4xSeA58B4 z-kl8Dg?@)t8}^ps_=3EUUyx=m*k|*^lCswD#E3`32t4(A-0|t(DXVnfe8=&0O3?si z9(Gb&c2ZWW;GXJZHG!?_GtCeZg+c=2u9wFOf71h8>ZzT0pWdTB#%z)2! zS;({tn!jvjR`4(lSZvKH1yACglD{Bl6##Z3s5tSYvK~Vf60+C0sG`o&LR_Gd;AR+G zHj9TJR1(LnAH8)5&=S^;h-~c?V~*xv?jLtwvs>(**QRFS)rk6al3L#7&R8wi`?0=p zMoc-rWgL>`J8d5xe;coYH>BqOr~I>ti3r%z2nOG)cP^(G)JK{i zy9S?ocY#8zyX|}6R6SZX7O2Ge0W(nrs0pEKn83D9<}<9H8@kv)igy6V{3-=n%F3yU zhfXbs1$4}}`9jX3@{wszeAvSVNhcu!a*pKhmjU}SdE{*~5(oS|X;^s6z7=dK+|mb1K{b>F!iW!Qy5=sMqRz zRA22$ec`PTlQN`^AVcq*oA!(*1wH3-eA3OJ z-pcVYr9pmTlTh(b;uWrD&U(k+V)b4RbFDWtNlOXZD z`BcimU(=hOS3X(L!}sr-eROLw;2WhZVXsc$j~~|L0tW$k?z2E_)Yk8tPWm2!KW)B6 z8?nInbs)GUw_3q5eIleFc+f}bR_J;dxN=FB7Dq+uwD1fUlttA7&y<4vW6wfeDK$@u zK#9e%Kn%A{@>n?#X{I?Hc{;o|7`8Ase}j(cUvv#| z$F~aNv|hyq0aQylK;rxyz0MjY*E z?{IyvmcCxsUogx1&AVUqSFuKC^5*Bq_CfFb2wJYrpD#N93-HkO?A*>le%<0&aKM>& z#sASc{ijUIz=Dd7UpAGlGT1g6Sn5dOaA}-wFEf5=F+QiWUpgr~fYWZuZAi zfqGTq^7_h2NWnpn*E32c9N1u`hs(x2qtZ{JLEtcFh_V*A3JQ9^77mSn9tbRASOB9^ zpQC{h>$)dcKmddlfn##?CWPA8rMLA2qP_Mx**lzvBZkFgh6n+AOZVWt5xooyuN)DZ zf<5vQ?)iv0XE$2O1Stod#@3FP;7xvpRM33*eh$Yl$s(-ChVa?&5LMioxF(k0FM4SI z#1%r(9V$tA^KLtwK=FyV1f~NA3|AlYrAq>q%jVu9GqZj%`e9;l$Z^2#7uqo4J^ppL z?ep7}i9gX?>To1O&l`~~<;1$s4?F`QzzY)}-1zassV*q!R!R|25lc1%-CxOz)JDNG zv29rl@U7FOvm4_PlZseVbI~~+>SRXvUxPOcs+IyFm-K9wp}4bqe21M|4Pqer?)vS& zcNYy?unrPdZe=Gcvo_1^6L+HL*8Phue@#w3mT{A>MVA$ZyBb7k?tZE}XuoEP24uHn zh;%UK2{~DuW-Pope}6uN4!P>=yNK&h?9xuE*t3^(d7MvzxjBk|LpK+ zWcrUvqpIz#p9<^Y9<*5&5-gfW{$)N7wc46C2XW!@`bd6Dtom zz~)Tpz$?8Z3Ix@zVNCJeHP8(*D9X7 zZ=7{K!zF7C19Q%?E@T0At1bJ{_e}1aFzN?e#=xdZA@R5a4M4KXlB4<9KxZv>H)(5z z5@hIRt~c>-Fy$#|`W`pJ&h}qB<9GHNTY(SBx&SH85y{X^;$5L7{o)q-;dOB0EyJe3 zL4!dP?cf`;t5lE2WE~=o*i9ot!)QQ|83!Ad&zgqol8Lecnlyzi*SQ(bImAr^LRWpPU%G6L?K9Lvmf*K%99LJ#^g z?Tum-Xr!o)MQnpohQ4(~7S+!OmOcTLerZoTf~lJe7Ol=qI~9KnvzA-DTWfS~XS@e? z7?Z8pe4n2VvYzB_IQF9!1s4q`J$w>1ppu4x21tfE+^R2j9ggQ_9L>WHF>Aiq&$`*v z4ISsW!gOQ20P}`k$tK_S1RFARiJxOEpa$Gp#Ou)+^m})9Cv0uyDlpv`s34VUd-U;Rtwq{H4c8|P`D^~^R|u-3-o9``ugjRM)|CD z`|rHIR%P5$58nyQcOFNB;J67HIrqZe@dk^?87-RK7Nz-@y`#0a4E-T`S$JiKsFj2b zp=mj|e_6bH?H$e3eU=B3O8AkoNJaO_g?3WNx=*u%`X0sWpcjKegn2$osc8!LNT@>YObQ=W`_?i_VHXB|gGue6oNzruu=j z(7=$+Dck4eyvsT=y*34f$3p`l0 zMZIHj-4Dq((~=qgqLchaC0plO+l{!AH|7`l__iDGKz)>eiV{Tg(NL%K_0mM8stnQt zsy$#K)~FHO`-!WjhS^&P;r3|lKcM=awxg&>PCm*Syytyo$a|T3qDAOW=JLofxbp1} z=Z&;)AH>OdFk+pz;dbG&miO(6mj7+B0^|%pA)?vF^NUiEL5_Rh|$s@MPVS7vTx9AO~W@d@3c~uvMFhj5!^7KX)ldc2z!S3H(HC5tLrzdKUBOi(S8ou$FU|Uo% zzaKX}5G?R%I+a39cq;7TDyx*AQ=QSSc$L4$2?ta)0H13B5J_l+P$wQRG5Evvi#`nr z2Q{mCawwU9%RTX)cfY=%2g2CfyzT-rftT}JgZ~Et_xk)2kL_ZEYau>)5mp1YvI&ic ztN+mAT#L2eC1V~5*)<7_7UdSoD-(9ofl6v( z1Qp6FeXfVhgc7HT0as?ifXGmkOy^(J3tC|6RY=U!sXCu#dZq^nLy>$R#BvMOfHu7? z9~JCryyFMFFNhL&fW0NMpv#qpqOW+?-jzU>W~#V|>qtvd%W`5o3@s(mk@$O`uEUkJ z*`Qr%sgb=|?z|-UXfyf;UqD2p@4e5 z`R=dGm}%Se3UJhOzxc3Sa(9;YbsVUlJ{?dXINN3?ft4plpt7j&(>;|aEoZZrP8^`A ziw?;J*j7^Oi`O897YfO82DgH20`GECJ6SGpl#j7BIUT0%c+y`cQl{9EjZPkrW5VOu zCQe;-J^S!_h~>Cm4jJ^kWC?wU=Z*s}aAI#3kTH9|X?Z|C8*G@WCPr7g+9Ux(N5HcH zcNk=*4{#fGg1W*yJZU+a!5M2@n`mGmxGWyG3KOx>rdW4;X%5uS_UvMV7BH|#O(GOJ z?CY*Dx#|0Ubi4)d+7J*9a;pQQ4vT0-Dfpr^jf+>Fx)AB;;u@CGI%ks(uRdnrNZERn zh;*%-V?7RJ+kLl+PtEW)zVTsyOl4dJ$daJH;0)ZkzuUf7LTSv&x3aJ>dW3zin4z*EjdK z=F!3G3=L6=6O#*9yGmTm)yBKcz^gxw`%jx6-Fh5bV2yB_e7e?l@_umHG>yAMlOd~r zE4VM3U>;OFx?*!@)P73Qp8Ip%mM$0j6Dq_?{_zS{w+;F0R{T_#cZCN2uZ+Rgb+;v%vOC23 zo_Xl7!7a>hW|wrSpmK-ypU#V9l|K2Td6%+Jm8~VLo`Vydv7vx~z6+s~;whF;^&^e7 zEmnYD6;EYOEx%EECA>YxT`FFEUOVtZoYD{81Jsx0@yRhQDZDRz#s6D0y&kfS|8LP0 zW2LjE#==S1L@!P}EV>1af-@_!XgHtt?{-jcAhc%MOTHRrXEYGFzxmT2kO2H+T#$$S zg++X}Pa(EFS(fa5B?P(&b_u&DoW_J$-+VdL#VNN>tV%)cab1jXk)`$s-CoxuYy;s5#2b4 z0^P!45>~8ybdKU>prK1w*fbYyMMUg`gSc@XSG8fmGXMn%BXJ<#tGEc+^B&up>3U*4 z)ce*2I30L@;ciws;IK}Gp^cyoSYjo4iDgRN4Y;oR+N=CAs#hL%QyW8a6v>@GovzA*8Yg$8Ab+ZsxiN$1Aj}mp zaptBp4CsyJKnLy;6z3+e=|_X&6Uu>V5J#ZXPFV*g*$o+*nI6EP9tU3f1kp%hzg%J9 zshm@%=wbww)A$av8fkM;JF0+j_j2*?OY?4PnjtYcu>0xRQU(1KE2piZlflz682U|+ z^8`ORy1I4Dlb|An67bUBo4p3g&z=(~X6@q;Pc{o#uzD9lg~1w#6D31OXg@Dw2?i3V zJH5%!QVIkG1#M%bDJ!-L(RX*`{+HeWPruy!ijLWF9Mvf?Q5ML%PBe7a$>mvQ>7()f zH<}EcPpWrfQeaD$Tfr;}{F2qj7-3x33-7rVQr*0A15YzYv&mWb1hTW?G2HE@6KR(8 z=C6Wa66Uxlx5TC7&|V|-~ldO=vhozN5R|D>fW06 z4mh4>|5)_C|4$Q5U-oCjirX#CEM$S?6VX-g8vvE9m6&WCt@N-~%o@(Z5+F*B5%L54 z4Da^v-IIPfHR1P+7I}od8dQl>+-si)QVOyfu3erpj}x+|UVXP!wl&0em&WnM>xpj+ zhoOz-KDZen%^L23-hC|>xiqO3*AmfKyg2b^$@$^*2_ewGcp6eu0JLdzC{24%T6T+a z_Phq5?K<%5Nv{I^VCd2D3UmJXfgdl+=$0Zc-UMFq-eSx}!PBft&3n%lB1_}f7f{W%F_WCFzz^h-~&}uU{7Uo@E|A<~gRPzzoG|A4hL*K|zUe7{Yu z`)~`=Br^EH9c7U~@*BQi6xSXW3dd^XjSl}~#+CXYQ?L7fsnNI>)*Ae;a2};vVxABu`j#5^@n+f2qFAj^TTv&CH(rN@nvy455Xb46>GOQp51f|0sE-_2ij4 z{dK)J{vS;KSh7kgiN_R+iHv-Zz8l^`|N=T=4qjaOBN=iviKv8Oh zblunc^ZnibU4QJcYk6MhoM+{@YgaCxt{S1FpMrlW-xlFin=YFW!+j*=D9F6sxMNx!U+GJ zFhF!h@lsh(e6?HD;vh(8H-gOJK2kX^|0-cZaHs#=>k z*y++oW4pM7%e!c_#ZE?^_tRPT#n{ee9}#X6i0;z5mx zSni&UA#c+tZDmX_FJCVmy#%l&3`yauBtO6d|BaD6-coY;Kau5p+}vbhWL{l~qI^zk zC^q9~Gx_RsW%z-81!n3-7fGIUEgXjB9_Rd`_=TbDGO9KZ3G zo3mQ3owq^C)XpsP>FpO5@tA|RQXP#bV6ig#xVf-4B^S@b#m5^BmdBvWoh*KM63`D0-#k$*cl;2l_MNDPn5M&zPdOZ|cl7<}c zk><|+m|PXq9ks3KbZu3^lBJTjU{vq1P|C zz(W>FIDzYsH>90}`Fx=;+N;>0Lw+>XN4@azI<|N-lI6bsC!dgB*H5;S=Q>8j0fTcbAkN(Dp2VG( zo4DLWF#Mbyqajl6TsO(}ixr*pg&@a4RIg^iXjJFxI=izqM9mqNJDu$0R^RwT9JlK) zk7eyy;}_gKc}b)psDsXDopHji)Hv%Fd9zl0a$4TcU6!%aN3F>v#$IHBDeLJPm2N;! zS)|D#-@!&D=Nl?L3x5l7(54E{Y)%}VL<74}Aual;Vt@SH(AaNmw9xqM$tW%wf_i(# zafx1S_S47b48?4;I`H#v(lb+Tv%hdj;?iF>9=WMzoj)fa$9enFvpWhMqx&AWeUh zC&2B*vOR#v4C}=!zFh;_`*#z3x0ZQDMVKDx`GEk=bkDJL^idOS_EBOaPDsj&MViu* zR<@p@6h3_T`fkUJjUBTob*oCGOD()aW}2RF5nYRM@{tMuZ1L?zW--IOWv#UK&CAN# zn<-Wky%R4&hu!sY;j#gZMP4Gc(Z_1`^IK(}ujuO?aBe~DoiB#`C&f_@Si#4&e+hul zxVHsznJi$DJFQxN_78maGE^|)aEp2R1Ic>Z&TGu8)^W+UFY3oKQAg^-#``36> zQC4%zQbT+}mL(coZO>{T@0S{VJz&Vj=M2;O;9O0mg714QMFXcO@CHi4-G>O&yIXCm z^uZ4RD71VIcxI8UwTt6T2x9}XT|#Oj+JX@N|F{m3rxbJqI5{(gjdVR&1OJJG=G%O3 z?Ao{7&bgnY;ys1oGn%T>_yeWvTG9?I@;MN@eVHUgFC4aNYbk2u&&?mSZg-fzMXta) z^Orhys$8+^buct_=x};B_3e@Fj;-z*c3C^pi=krsw~~a++YiLcXMRN3%qCdN|7}14 z7b|n&-uFJ}T!@EkPy!sSK#RZ{B$8dZXvhTC8B1?%I3NI74HK0a9-{nNEd0Dex0&{O zh+fkP>*T(HV&ikl)|sjm{2pAUmcuFgswLTaIJU~#E(HU4lM1ejTkIXW*49a==eLa< z9T1wQaYp%#X*_91PnWxvW5lzzp78Yc?jF3BL(~RMBD&77nEbWrYwd*yy@`OV1(H8o*2+IOs3wy{J)7;EbdkZTAlj$u1YU#gPrX}QGFyA zS+1G?7(;u8Qu#xIW}U<2}FJKoRhL}S5Bs17BBC6q}6z@p(^%Bxpae1x&uSE zoKAKK&(3`w6HIzDWAal^y0U;<*jR1oXTVq+=)&>r;K!kg;-lpr;-1Jh$ReX3?fCL$ z_oi=3zn2q71oVmH<3L&DWC@UHwWYQlXx3Bes!^kpx)BZid1%c}zY3n*UZZFf=R6@`I> zZ=QmvK9Bn|A=x9U4Ps@u)Ol%5YVB#+aw`X*J9pt#9))y)>&j!lAKMkow>FE5aE+2p zdoibvxxR`dR{~YH_nqlkGf=1VX{Al!ZC`UQo{_? z8#(I-nd^rNYyAD?#IRR@qLHXtBWxi>PN#`9O&2r_8yR*Br8A|l5F!h3MP>cZI6`x^UxsaK_|eBRyG1;!w)^qu=*7bi&$wCor7a62U*8##LYN!VCy*%pe`X?*RVN zUaO+91yFF_*e+k}P6_Imqr)b^B5lSh9=d}`gI@p#tmY~^aWw!mx^(&gjm$g@55sly zubc?jcr*IszQSSe#L9224siPeeAc6#uCDU>-=1JTVo{dzqV-%O(82FZuo{o^CqJ_ICxqx92~^EG}t=2si>LbN@g*W)BNd&&{7h5aZ}Q zNMn!jaL#Lho)X|-oh~{VqN-X!KlnsN+tvqw`^xx`sJ8jSXQZp!kHS|Yg9;C8fhSSr zC8Ui#pt=Ee3lUks84WsWY`!{_8G$QPu87^dz8p+I-LLOYeGfwga=lG=eb={8`uB~u zsoUc;wyXn_vng_)ncX2>uXpEJ?KdF7Sh|A)%{k>3&m2O*r`}>ZjgJMQn>#Ck4%pvJ zy$K?bd)_gG{cZXd%Jkw%4Q*#kFJ9<@cmJE%*w7b@f0loVmpri=U;8C!X3K3fN>aJ( z_=1Y@=?cRM-Q3o-KM$x{$7l&WAMmKH?8%ua>(5h=X65Vdiu3a2<(D}{+%ME`gPbmA z)Xvqah_r3$b0+ zUC0j~d1d}Wc53V`Zwsu0$+*s6JtXOe@t&%6QZPk0hPZEbtGaL{x!gU@G@|J`sOv%g zAIk*z?F9koNjC`OMnM*+N+o1!j##1v~xZ8j94*3 zfDid`MyvENvrknR7p>p?*ytrmh^%D!=U>Ppv^PnM6kC(ZZWyBQmN)nqpyxe68@TAG z4#*WgB(REcAF*{hx?`nB>uG$l*CxNKabI{f>NRbz$~IC72Pbo1&{>lGKmL;9Usm-0 zyHwHDX=`CBFK|g_rT1r&81sS<3C0U)&AMyfC*p@XZ3qNHDOQPd^-c3~1eZV4_#F?^ z-~mAW`*>jQ9Rv`?F?#&ZAQA3(M{+h5EoiczikQ;)p_MMr3Db_R<&i%_7Oix-28_cO zWU&e?myrvTV<%MMiE@-i*!HQ}5$xE7xJG`=fviKvAoea7R^8Tgn+w5q?eQ0n5tZ94 z*sr1a``f+dXvNpF%3IdpFVSO@Dl-U8nAyJd<9{icQ%N1T&O zgasCVdgnVJ5-x`y!GzH+4JDo0)NCK^K?UZ*RvDuBWafYGgaOvrf~u6Xq4-TQE?^K* z3>Gr?D;i(c-25iIE)3hTQ~H@GL0Pz^g=6Yzv`vYe2vg+N^13t>gUN7GJ<6Av;?uMW zy~|4G;i}eRZQT!-nvdHwml1zI60dE@hDx_I&xD9$s;BmLtZ;1o==xeAdwpc4;jQon zaPJ}k1xwqY36OaT=c`=e7k2eYq^me(pit=QrT;rMY22ZaRKJplgOZQc$N^<@#mKjU zo~*J~MXcD$!;}fd1>i5=pz#yG)T|!VWGkd7=A9z~Pm^#SFv_^J+!U5L;DM>rC1pI! zB6V-!ij43Rp__C?2+nfVX~wO*F81<7ZXir%8Fo#6aKY3;L_b&$n<$tH$OlG# z!*}k%;q!L@t2O*Nmr38Z3*OzR2mbiF2$k%5*gV%?0?7HGG|@u|JC<@kMs*tfnI$x^ z>_Nl`@!jTib$faUV17un!s;59rkbqkw($Eu3KWp8V;iRL$X^l$V0{v= zm~^$uRWYlcc)$U#0dgF0P&Dilg&Rn~p*LpqasuLf=1HiM6>2@y^5#JeD{_2zEFmMdIPgGI_ zIRdw3!}CCX#l2Ep)O0@3N79aRo=ddc-KhW#`htqX*2kI&HeqYm4pa}_6w8iRKigmu z_|Ni1#G;p_5Bk4BW*{r<$8V}W+;oeNz}(9BX&qcma9Bd?j$ z^6{MSCPOv9xyYE2Yu&-fFK@Z$uV(MUKf^bC84G<)LYMx;gI7rYjVZy*J*$g-O zWUYI*XWYxbMLr$70fnAe>~#I; z+;1#g}cC0JeBK9kA#a*T;*-xcvzHVlTYlKN;kuEJlsUe|C11zTMfH zM5E5N>hHNK$ph#BZ4v2FNp9T?pj zIoX;NQfnra3lczP75$(!t4HHVj0Mo7n040Xztd3s7}a8qw>i77pTdgk?h28f@BtGn zCSWm22PRg>r8MyW^GH`)Y&+ptkDutnJB zu}X``B^|Lvrn-1#Jqv+deNvZNgVb{bLE2cG1#oJgt(zJ80tO-!?LdD{Qw#`(*MqaT)^0qVj#>ZsRJh7P0~X4bn#5B$voc8r9C@Xs{k1s+Ev-Y zO8SvTgFZJ@Mb*@)O9DxB_EF%-#5%ra`$TbM<;%f|m9p@x%=-nITp`iR_!`c2gV5jv7Dj4*w*$yTC$gTT5EbclAPkfAZC6&`yuSl@C* zVb9dsNIe!r2W~eQ)I{z#zpK^M<%-}_!9VMR*H)IvK$>FQnc8%~jIYqM%cQOmDX7eB zi^z;$#cUJN4{Y#a19#e423UUW1l1ki_UE$3n1$a!Z^R0YQsJ~H?Zs9dQ

7k?om~ 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 Date: Wed, 29 Jun 2022 21:07:07 +0530 Subject: [PATCH 003/132] Added socials. --- .../manager/ui/screens/AboutScreen.kt | 50 ++++++++----------- app/src/main/res/drawable-v24/ic_discord.xml | 8 +++ app/src/main/res/drawable-v24/ic_github.xml | 8 +++ app/src/main/res/drawable-v24/ic_reddit.xml | 8 +++ app/src/main/res/drawable-v24/ic_twitter.xml | 8 +++ app/src/main/res/drawable-v24/ic_web.xml | 8 +++ app/src/main/res/drawable-v24/ic_youtube.xml | 8 +++ 7 files changed, 69 insertions(+), 29 deletions(-) create mode 100644 app/src/main/res/drawable-v24/ic_discord.xml create mode 100644 app/src/main/res/drawable-v24/ic_github.xml create mode 100644 app/src/main/res/drawable-v24/ic_reddit.xml create mode 100644 app/src/main/res/drawable-v24/ic_twitter.xml create mode 100644 app/src/main/res/drawable-v24/ic_web.xml create mode 100644 app/src/main/res/drawable-v24/ic_youtube.xml diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index bdb47957c1..27a607a24c 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -1,48 +1,31 @@ package app.revanced.manager.ui.screens -import android.annotation.SuppressLint -import android.app.Application -import android.content.pm.ApplicationInfo -import android.content.pm.PackageManager -import android.graphics.drawable.Drawable -import android.util.Log -import androidx.activity.ComponentActivity + import androidx.compose.foundation.Image -import androidx.compose.foundation.background -import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* -import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.ListItem -import androidx.compose.material3.Divider -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text +import androidx.compose.material.IconButton +import androidx.compose.material3.* import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import androidx.lifecycle.AndroidViewModel -import androidx.lifecycle.viewmodel.compose.viewModel -import androidx.navigation.NavController -import app.revanced.manager.ui.Resource -import app.revanced.manager.ui.components.placeholders.applist.AppIcon -import app.revanced.manager.ui.screens.mainsubscreens.PatcherViewModel import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph import app.revanced.manager.R private const val tag = "AboutScreen" +val socialLinks = mapOf( + "https://revanced.app/" to R.drawable.ic_web, + "https://revanced.app/discord" to R.drawable.ic_discord_24, + "https://revanced.app/github" to R.drawable.ic_github_24, + "https://twitter.com/@revancedapp" to R.drawable.ic_twitter, + "https://youtube.com/channel/UCLktAUh5Gza9zAJBStwxNdw" to R.drawable.ic_youtube, + "https://reddit.com/r/revancedapp" to R.drawable.ic_reddit, + ) + @OptIn(ExperimentalMaterialApi::class) @Destination @RootNavGraph @@ -71,6 +54,15 @@ fun AboutScreen( ) Divider(Modifier.alpha(.5f)) + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { + for ((_name, drawble_) in socialLinks.entries) { + IconButton(onClick = { /*TODO*/ }) { + Icon(painter = painterResource(drawble_), contentDescription = "Links") + } + } + } } + + } \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_discord.xml b/app/src/main/res/drawable-v24/ic_discord.xml new file mode 100644 index 0000000000..950271bef6 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_discord.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_github.xml b/app/src/main/res/drawable-v24/ic_github.xml new file mode 100644 index 0000000000..224bbf35f3 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_github.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_reddit.xml b/app/src/main/res/drawable-v24/ic_reddit.xml new file mode 100644 index 0000000000..7236b58087 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_reddit.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_twitter.xml b/app/src/main/res/drawable-v24/ic_twitter.xml new file mode 100644 index 0000000000..ae08ca679d --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_twitter.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_web.xml b/app/src/main/res/drawable-v24/ic_web.xml new file mode 100644 index 0000000000..f825149572 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_web.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable-v24/ic_youtube.xml b/app/src/main/res/drawable-v24/ic_youtube.xml new file mode 100644 index 0000000000..e7d7f3975b --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_youtube.xml @@ -0,0 +1,8 @@ + + + + \ No newline at end of file From a857102d5ea4468edbcf91b777bcf79f2d92d9e0 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Wed, 29 Jun 2022 22:13:36 +0530 Subject: [PATCH 004/132] Click on icon works now. --- .../main/java/app/revanced/manager/Global.kt | 11 +++++++++-- .../revanced/manager/backend/utils/Social.kt | 13 ------------- .../revanced/manager/ui/components/AppBar.kt | 6 ------ .../manager/ui/screens/AboutScreen.kt | 18 +++++++----------- .../revanced/manager/ui/screens/MainScreen.kt | 19 ++----------------- 5 files changed, 18 insertions(+), 49 deletions(-) delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/Social.kt diff --git a/app/src/main/java/app/revanced/manager/Global.kt b/app/src/main/java/app/revanced/manager/Global.kt index 8cfd72ec33..999cb91864 100644 --- a/app/src/main/java/app/revanced/manager/Global.kt +++ b/app/src/main/java/app/revanced/manager/Global.kt @@ -3,8 +3,15 @@ package app.revanced.manager class Global { companion object { private const val websiteUrl = "https://revanced.app" - const val githubUrl = "$websiteUrl/github" - const val discordUrl = "$websiteUrl/discord" + + val socialLinks = mapOf( + R.drawable.ic_web to "$websiteUrl", + R.drawable.ic_discord to "$websiteUrl/discord", + R.drawable.ic_github to "$websiteUrl/github", + R.drawable.ic_twitter to "https://twitter.com/revancedapp", + R.drawable.ic_youtube to "https://youtube.com/channel/UCLktAUh5Gza9zAJBStwxNdw", + R.drawable.ic_reddit to "https://reddit.com/r/revancedapp", + ) private const val ghOrg = "revanced" const val ghPatches = "$ghOrg/revanced-patches" diff --git a/app/src/main/java/app/revanced/manager/backend/utils/Social.kt b/app/src/main/java/app/revanced/manager/backend/utils/Social.kt deleted file mode 100644 index 547358eb71..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/Social.kt +++ /dev/null @@ -1,13 +0,0 @@ -package app.revanced.manager.backend.utils - -import androidx.compose.ui.platform.UriHandler -import app.revanced.manager.Global.Companion.discordUrl -import app.revanced.manager.Global.Companion.githubUrl - -fun openDiscord(uriHandle: UriHandler) { - uriHandle.openUri(discordUrl) -} - -fun openGitHub(uriHandle: UriHandler) { - uriHandle.openUri(githubUrl) -} diff --git a/app/src/main/java/app/revanced/manager/ui/components/AppBar.kt b/app/src/main/java/app/revanced/manager/ui/components/AppBar.kt index ecc416d4ea..8a266167ec 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/AppBar.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/AppBar.kt @@ -8,8 +8,6 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.tooling.preview.Preview import app.revanced.manager.R -import app.revanced.manager.backend.utils.openDiscord -import app.revanced.manager.backend.utils.openGitHub import app.revanced.manager.ui.components.placeholders.Icon @@ -27,9 +25,5 @@ fun AppBar(title: @Composable () -> Unit, actions: @Composable RowScope.() -> Un fun AppBarPreview() { AppBar( title = { Text("ReVanced Manager") }, - actions = { - Icon(resourceId = R.drawable.ic_discord_24, contentDescription = "Discord") - Icon(resourceId = R.drawable.ic_github_24, contentDescription = "GitHub") - } ) } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 27a607a24c..0059e2ef10 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -14,17 +14,11 @@ import androidx.compose.ui.unit.dp import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph import app.revanced.manager.R +import app.revanced.manager.Global.Companion.socialLinks +import androidx.compose.ui.platform.LocalUriHandler private const val tag = "AboutScreen" -val socialLinks = mapOf( - "https://revanced.app/" to R.drawable.ic_web, - "https://revanced.app/discord" to R.drawable.ic_discord_24, - "https://revanced.app/github" to R.drawable.ic_github_24, - "https://twitter.com/@revancedapp" to R.drawable.ic_twitter, - "https://youtube.com/channel/UCLktAUh5Gza9zAJBStwxNdw" to R.drawable.ic_youtube, - "https://reddit.com/r/revancedapp" to R.drawable.ic_reddit, - ) @OptIn(ExperimentalMaterialApi::class) @Destination @@ -54,10 +48,12 @@ fun AboutScreen( ) Divider(Modifier.alpha(.5f)) + var currentUriHandler = LocalUriHandler.current + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { - for ((_name, drawble_) in socialLinks.entries) { - IconButton(onClick = { /*TODO*/ }) { - Icon(painter = painterResource(drawble_), contentDescription = "Links") + for ((social_ic, uri) in socialLinks.entries) { + IconButton(onClick = { currentUriHandler.openUri(uri) }) { + Icon(painter = painterResource(social_ic), contentDescription = "Links") } } } diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index 6420ad526d..32e1a45480 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -12,9 +12,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalUriHandler import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController +import app.revanced.manager.Global.Companion.socialLinks import app.revanced.manager.R -import app.revanced.manager.backend.utils.openDiscord -import app.revanced.manager.backend.utils.openGitHub import app.revanced.manager.ui.components.AppBar import app.revanced.manager.ui.components.BottomNavBar import app.revanced.manager.ui.components.placeholders.Icon @@ -73,21 +72,7 @@ fun MainScreen() { val currentUriHandler = LocalUriHandler.current AppBar( - title = { Text("ReVanced Manager") }, - actions = { - IconButton(onClick = { openDiscord(currentUriHandler) }) { - Icon( - resourceId = R.drawable.ic_discord_24, - contentDescription = "Discord" - ) - } - IconButton(onClick = { openGitHub(currentUriHandler) }) { - Icon( - resourceId = R.drawable.ic_github_24, - contentDescription = "GitHub" - ) - } - } + title = { Text("ReVanced Manager") } ) } } From aa91139f63314e198b436d54075254a1f00921aa Mon Sep 17 00:00:00 2001 From: Ushie Date: Wed, 29 Jun 2022 20:50:13 +0300 Subject: [PATCH 005/132] Rough text buttons --- .../manager/ui/screens/AboutScreen.kt | 98 ++++++++++++++++++- app/src/main/res/values/strings.xml | 2 + 2 files changed, 98 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 0059e2ef10..e2b94aa2db 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -1,14 +1,28 @@ package app.revanced.manager.ui.screens +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.gestures.FlingBehavior +import androidx.compose.foundation.gestures.ScrollableDefaults import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyListScope +import androidx.compose.foundation.lazy.LazyListState +import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.IconButton import androidx.compose.material3.* import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.input.nestedscroll.nestedScroll +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.ramcosta.composedestinations.annotation.Destination @@ -16,6 +30,7 @@ import com.ramcosta.composedestinations.annotation.RootNavGraph import app.revanced.manager.R import app.revanced.manager.Global.Companion.socialLinks import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.stringResource private const val tag = "AboutScreen" @@ -47,9 +62,24 @@ fun AboutScreen( .height(150.dp) ) Divider(Modifier.alpha(.5f)) - + var currentUriHandler = LocalUriHandler.current + PreferenceRow( + title = stringResource(R.string.whats_new), + onClick = { currentUriHandler.openUri("https://revanced.app") }, + ) + + PreferenceRow( + title = stringResource(R.string.help_translate), + onClick = { currentUriHandler.openUri("https://revanced.app") }, + ) + + PreferenceRow( + title = stringResource(R.string.help_translate), + onClick = { currentUriHandler.openUri("https://revanced.app") }, + ) + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { for ((social_ic, uri) in socialLinks.entries) { IconButton(onClick = { currentUriHandler.openUri(uri) }) { @@ -58,7 +88,71 @@ fun AboutScreen( } } } - +} +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun PreferenceRow( + modifier: Modifier = Modifier, + title: String, + painter: Painter? = null, + onClick: () -> Unit = {}, + onLongClick: () -> Unit = {}, + subtitle: String? = null, + action: @Composable (() -> Unit)? = null, +) { + val height = if (subtitle != null) 72.dp else 56.dp + val titleTextStyle = MaterialTheme.typography.bodyLarge + val subtitleTextStyle = MaterialTheme.typography.bodyMedium.copy( + color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.75f), + ) + + Row( + modifier = modifier + .fillMaxWidth() + .heightIn(min = height) + .combinedClickable( + onLongClick = onLongClick, + onClick = onClick, + ), + verticalAlignment = Alignment.CenterVertically, + ) { + if (painter != null) { + Icon( + painter = painter, + modifier = Modifier + .padding(start = 16.dp, end = 16.dp) + .size(24.dp), + tint = MaterialTheme.colorScheme.primary, + contentDescription = null, + ) + } + Column( + Modifier + .padding(horizontal = 16.dp) + .weight(1f), + ) { + Text( + text = title, + style = titleTextStyle, + ) + if (subtitle != null) { + Text( + modifier = Modifier.padding(top = 4.dp), + text = subtitle, + style = subtitleTextStyle, + ) + } + } + if (action != null) { + Box( + Modifier + .widthIn(min = 56.dp) + .padding(end = 16.dp), + ) { + action() + } + } + } } \ 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 6e3a289ef1..3981f30fc3 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,4 +42,6 @@ Team Translators Patcher + Help translate! + What\'s New \ No newline at end of file From ee083260c3facaabdeb449ef7dda0c066b6a230c Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Wed, 29 Jun 2022 23:31:34 +0530 Subject: [PATCH 006/132] refactor: moved PreferenceRow to a separate file. --- .../manager/ui/components/PreferenceRow.kt | 81 ++++++++++++++++++ .../manager/ui/screens/AboutScreen.kt | 85 +------------------ 2 files changed, 84 insertions(+), 82 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/components/PreferenceRow.kt diff --git a/app/src/main/java/app/revanced/manager/ui/components/PreferenceRow.kt b/app/src/main/java/app/revanced/manager/ui/components/PreferenceRow.kt new file mode 100644 index 0000000000..1dfe560fb0 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/components/PreferenceRow.kt @@ -0,0 +1,81 @@ +package app.revanced.manager.ui.components + +import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.combinedClickable +import androidx.compose.foundation.layout.* +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.unit.dp + + +@OptIn(ExperimentalFoundationApi::class) +@Composable +fun PreferenceRow( + modifier: Modifier = Modifier, + title: String, + painter: Painter? = null, + onClick: () -> Unit = {}, + onLongClick: () -> Unit = {}, + subtitle: String? = null, + action: @Composable (() -> Unit)? = null, +) { + val height = if (subtitle != null) 72.dp else 56.dp + + val titleTextStyle = MaterialTheme.typography.bodyLarge + val subtitleTextStyle = MaterialTheme.typography.bodyMedium.copy( + color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.75f), + ) + + Row( + modifier = modifier + .fillMaxWidth() + .heightIn(min = height) + .combinedClickable( + onLongClick = onLongClick, + onClick = onClick, + ), + verticalAlignment = Alignment.CenterVertically, + ) { + if (painter != null) { + Icon( + painter = painter, + modifier = Modifier + .padding(start = 16.dp, end = 16.dp) + .size(24.dp), + tint = MaterialTheme.colorScheme.primary, + contentDescription = null, + ) + } + Column( + Modifier + .padding(horizontal = 16.dp) + .weight(1f), + ) { + Text( + text = title, + style = titleTextStyle, + ) + if (subtitle != null) { + Text( + modifier = Modifier.padding(top = 4.dp), + text = subtitle, + style = subtitleTextStyle, + ) + } + } + if (action != null) { + Box( + Modifier + .widthIn(min = 56.dp) + .padding(end = 16.dp), + ) { + action() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index e2b94aa2db..d372e6eb16 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -1,28 +1,14 @@ package app.revanced.manager.ui.screens -import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image -import androidx.compose.foundation.combinedClickable -import androidx.compose.foundation.gestures.FlingBehavior -import androidx.compose.foundation.gestures.ScrollableDefaults import androidx.compose.foundation.layout.* -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.LazyListScope -import androidx.compose.foundation.lazy.LazyListState -import androidx.compose.foundation.lazy.rememberLazyListState -import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material.IconButton import androidx.compose.material3.* import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha -import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.input.nestedscroll.nestedScroll -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.ramcosta.composedestinations.annotation.Destination @@ -31,11 +17,12 @@ import app.revanced.manager.R import app.revanced.manager.Global.Companion.socialLinks import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource +import app.revanced.manager.ui.components.PreferenceRow private const val tag = "AboutScreen" -@OptIn(ExperimentalMaterialApi::class) +@OptIn(ExperimentalMaterial3Api::class) @Destination @RootNavGraph @Composable @@ -90,69 +77,3 @@ fun AboutScreen( } } -@OptIn(ExperimentalFoundationApi::class) -@Composable -fun PreferenceRow( - modifier: Modifier = Modifier, - title: String, - painter: Painter? = null, - onClick: () -> Unit = {}, - onLongClick: () -> Unit = {}, - subtitle: String? = null, - action: @Composable (() -> Unit)? = null, -) { - val height = if (subtitle != null) 72.dp else 56.dp - - val titleTextStyle = MaterialTheme.typography.bodyLarge - val subtitleTextStyle = MaterialTheme.typography.bodyMedium.copy( - color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.75f), - ) - - Row( - modifier = modifier - .fillMaxWidth() - .heightIn(min = height) - .combinedClickable( - onLongClick = onLongClick, - onClick = onClick, - ), - verticalAlignment = Alignment.CenterVertically, - ) { - if (painter != null) { - Icon( - painter = painter, - modifier = Modifier - .padding(start = 16.dp, end = 16.dp) - .size(24.dp), - tint = MaterialTheme.colorScheme.primary, - contentDescription = null, - ) - } - Column( - Modifier - .padding(horizontal = 16.dp) - .weight(1f), - ) { - Text( - text = title, - style = titleTextStyle, - ) - if (subtitle != null) { - Text( - modifier = Modifier.padding(top = 4.dp), - text = subtitle, - style = subtitleTextStyle, - ) - } - } - if (action != null) { - Box( - Modifier - .widthIn(min = 56.dp) - .padding(end = 16.dp), - ) { - action() - } - } - } -} \ No newline at end of file From 96edeb4f965f99c18847bfb5cbc142bf0a3e33fe Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Thu, 30 Jun 2022 00:03:24 +0530 Subject: [PATCH 007/132] updated patcher version. --- app/build.gradle.kts | 2 +- .../app/revanced/manager/ui/screens/PatchesSelectorScreen.kt | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 10a00e47c3..00ffc20ca2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -97,7 +97,7 @@ dependencies { implementation("androidx.navigation:navigation-compose:2.5.0-rc02") // ReVanced - implementation("app.revanced:revanced-patcher:2.0.4") + implementation("app.revanced:revanced-patcher:2.1.1") // Signing & aligning implementation("org.bouncycastle:bcpkix-jdk15on:1.70") diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 433e1a05e7..295c47b8d3 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -101,9 +101,10 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () if (patchClass.unsupported) { Column(Modifier.align(Alignment.CenterVertically)) { Text( - text = "Unsupported!", // TODO: get some yellow warning icon here + text = "⚠️Unsupported!", modifier = Modifier.padding(horizontal = 4.dp), style = Typography.bodySmall, + color = Color.Yellow ) } } From 630765b926cf1f54ae5057ce1b6b87d1c9d74a28 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Thu, 30 Jun 2022 00:06:33 +0530 Subject: [PATCH 008/132] updated patcher version. --- .../app/revanced/manager/ui/screens/PatchesSelectorScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 295c47b8d3..aba986dc70 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -101,7 +101,7 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () if (patchClass.unsupported) { Column(Modifier.align(Alignment.CenterVertically)) { Text( - text = "⚠️Unsupported!", + text = "⚠️ Unsupported!", modifier = Modifier.padding(horizontal = 4.dp), style = Typography.bodySmall, color = Color.Yellow From 2bcdeb8a81b4ae68dd74ac7dea198ace72609ecc Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Thu, 30 Jun 2022 00:08:42 +0530 Subject: [PATCH 009/132] updated patcher version. --- .../app/revanced/manager/ui/screens/PatchesSelectorScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index aba986dc70..295c47b8d3 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -101,7 +101,7 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () if (patchClass.unsupported) { Column(Modifier.align(Alignment.CenterVertically)) { Text( - text = "⚠️ Unsupported!", + text = "⚠️Unsupported!", modifier = Modifier.padding(horizontal = 4.dp), style = Typography.bodySmall, color = Color.Yellow From 2de71dffd128e4bd1c8316fd8daa1e37e8f60da6 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Thu, 30 Jun 2022 00:14:27 +0530 Subject: [PATCH 010/132] improvement: made warning text yellow. --- .idea/codeStyles/Project.xml | 123 ++++++++++++++++++ .idea/codeStyles/codeStyleConfig.xml | 5 + .idea/deploymentTargetDropDown.xml | 17 +++ .../ui/screens/PatchesSelectorScreen.kt | 2 +- 4 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 .idea/codeStyles/Project.xml create mode 100644 .idea/codeStyles/codeStyleConfig.xml create mode 100644 .idea/deploymentTargetDropDown.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml new file mode 100644 index 0000000000..7643783a82 --- /dev/null +++ b/.idea/codeStyles/Project.xml @@ -0,0 +1,123 @@ + + + + + +

+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+ + + + + + + \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 0000000000..79ee123c2b --- /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 new file mode 100644 index 0000000000..844995f28e --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 295c47b8d3..aba986dc70 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -101,7 +101,7 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () if (patchClass.unsupported) { Column(Modifier.align(Alignment.CenterVertically)) { Text( - text = "⚠️Unsupported!", + text = "⚠️ Unsupported!", modifier = Modifier.padding(horizontal = 4.dp), style = Typography.bodySmall, color = Color.Yellow From c28d9aa60a2cc3b37191e78c83a4cdfddc449c61 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Thu, 30 Jun 2022 00:18:09 +0530 Subject: [PATCH 011/132] updated patcher version. --- .../app/revanced/manager/ui/screens/PatchesSelectorScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index aba986dc70..295c47b8d3 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -101,7 +101,7 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () if (patchClass.unsupported) { Column(Modifier.align(Alignment.CenterVertically)) { Text( - text = "⚠️ Unsupported!", + text = "⚠️Unsupported!", modifier = Modifier.padding(horizontal = 4.dp), style = Typography.bodySmall, color = Color.Yellow From ae6a41794887ca51b92a5afa9c1f44e776672dbb Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Thu, 30 Jun 2022 12:19:58 +0530 Subject: [PATCH 012/132] Revert "updated patcher version." This reverts commit 2bcdeb8a81b4ae68dd74ac7dea198ace72609ecc. --- .../app/revanced/manager/ui/screens/PatchesSelectorScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 295c47b8d3..aba986dc70 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -101,7 +101,7 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () if (patchClass.unsupported) { Column(Modifier.align(Alignment.CenterVertically)) { Text( - text = "⚠️Unsupported!", + text = "⚠️ Unsupported!", modifier = Modifier.padding(horizontal = 4.dp), style = Typography.bodySmall, color = Color.Yellow From 22eed9184ac4bd3c1e03e95167f29d8f9240c0d7 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Thu, 30 Jun 2022 12:36:41 +0530 Subject: [PATCH 013/132] Fixed duplicate Help Translate. --- .../main/java/app/revanced/manager/ui/screens/AboutScreen.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index d372e6eb16..df7ef40038 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -57,11 +57,6 @@ fun AboutScreen( onClick = { currentUriHandler.openUri("https://revanced.app") }, ) - PreferenceRow( - title = stringResource(R.string.help_translate), - onClick = { currentUriHandler.openUri("https://revanced.app") }, - ) - PreferenceRow( title = stringResource(R.string.help_translate), onClick = { currentUriHandler.openUri("https://revanced.app") }, From 6a85328273f849ee24558e771adeffd0553c15a5 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Thu, 30 Jun 2022 13:26:45 +0530 Subject: [PATCH 014/132] WIP credits ExpandableCard. --- .idea/deploymentTargetDropDown.xml | 2 +- .../manager/ui/components/ExpandableCard.kt | 89 +++++++++++++++++++ .../manager/ui/screens/AboutScreen.kt | 5 +- 3 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 844995f28e..2a86429dd6 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -12,6 +12,6 @@ - + \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt new file mode 100644 index 0000000000..1d1ce8f719 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt @@ -0,0 +1,89 @@ +package app.revanced.manager.ui.components + +import android.icu.text.CaseMap.Title +import androidx.compose.animation.animateContentSize +import androidx.compose.animation.core.LinearOutSlowInEasing +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ContentAlpha +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.ArrowDropDown +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.rotate +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp + + +@Composable +@ExperimentalMaterial3Api +fun ExpandableCard( + title: String, +) { + var expandedState by remember { mutableStateOf(false) } + val rotateState by animateFloatAsState(targetValue = if (expandedState) 180f else 0f) + + Card( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp) + .animateContentSize( + animationSpec = tween( + durationMillis = 300, + easing = LinearOutSlowInEasing + ) + ), + shape = RoundedCornerShape(8.dp), + onClick = { + expandedState = !expandedState + } + ) { + Column( + modifier = Modifier + .fillMaxWidth() + .padding(12.dp) + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + Text( + text = "$title", + modifier = Modifier.weight(6f), + fontSize = MaterialTheme.typography.bodyLarge.fontSize, + fontWeight = FontWeight.Bold, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + IconButton( + modifier = Modifier + .alpha(ContentAlpha.medium) + .weight(1f) + .rotate(rotateState), + onClick = { + expandedState = !expandedState + }) { + Icon( + imageVector = Icons.Default.ArrowDropDown, + contentDescription = "Dropdown" + ) + } + } + if (expandedState) { + Text( + text = "Me \n" + "Me\n" + "Me", + fontSize = MaterialTheme.typography.bodySmall.fontSize, + fontWeight = FontWeight.Normal, + overflow = TextOverflow.Ellipsis + ) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index df7ef40038..5524af83e6 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -17,6 +17,7 @@ import app.revanced.manager.R import app.revanced.manager.Global.Companion.socialLinks import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource +import app.revanced.manager.ui.components.ExpandableCard import app.revanced.manager.ui.components.PreferenceRow private const val tag = "AboutScreen" @@ -49,7 +50,9 @@ fun AboutScreen( .height(150.dp) ) Divider(Modifier.alpha(.5f)) - + + ExpandableCard("Patcher Credits") + var currentUriHandler = LocalUriHandler.current PreferenceRow( From 0ad6a75d543b8fb9b42ad267dcad3c0b33cec38b Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Thu, 30 Jun 2022 16:02:28 +0530 Subject: [PATCH 015/132] feat: partial fetching contributors using GH Api. --- .../revanced/manager/backend/api/GitHubAPI.kt | 16 ++++++ .../manager/ui/screens/AboutScreen.kt | 55 +++++++++++++++++-- 2 files changed, 67 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt b/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt index e13d259911..5ddd42beb2 100644 --- a/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt +++ b/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt @@ -63,4 +63,20 @@ object GitHubAPI { } } } + + object Contributors { + suspend fun contributors(org: String, repo: String) : Contributor { + Log.d(tag, "Fetching contributors for repo ($repo)") + val res: Contributors.Contributor = client.get("$baseUrl/$org/$repo/contributors") { + parameter("per_page", 1) + }.body() + return res + } + @Serializable + class Contributor( + @SerialName("login") val login: String, + @SerialName("avatar_url") val avatar_url: String, + @SerialName("url") val url: String, + ) + } } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 5524af83e6..7f0c732eaa 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -1,12 +1,13 @@ package app.revanced.manager.ui.screens +import android.util.Log import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material.IconButton import androidx.compose.material3.* -import androidx.compose.runtime.Composable +import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.res.painterResource @@ -17,19 +18,28 @@ import app.revanced.manager.R import app.revanced.manager.Global.Companion.socialLinks import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import androidx.lifecycle.viewmodel.compose.viewModel +import app.revanced.manager.Global +import app.revanced.manager.backend.api.GitHubAPI import app.revanced.manager.ui.components.ExpandableCard import app.revanced.manager.ui.components.PreferenceRow +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext private const val tag = "AboutScreen" - @OptIn(ExperimentalMaterial3Api::class) @Destination @RootNavGraph @Composable fun AboutScreen( - //navigator: NavController, +// navigator: NavController, + vm: AboutViewModel = viewModel() ) { + Column(Modifier.padding(8.dp)) { // Box() { // Text( @@ -62,7 +72,11 @@ fun AboutScreen( PreferenceRow( title = stringResource(R.string.help_translate), - onClick = { currentUriHandler.openUri("https://revanced.app") }, + onClick = { currentUriHandler.openUri("https://revanced.app") } + ) + + Text( + text = vm.contributorName, ) Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { @@ -75,3 +89,36 @@ fun AboutScreen( } } +class AboutViewModel : ViewModel() { + private val tag = "AboutViewModel" + + private var _fetchContributorName : GitHubAPI.Contributors.Contributor? by mutableStateOf(null) + val contributorName: String + get() = _fetchContributorName?.login ?: "Null" + + private var _fetchContributorAvatar : GitHubAPI.Contributors.Contributor? by mutableStateOf(null) + val contributorAvatar: String + get() = _fetchContributorAvatar?.login ?: "Null" + + private var _fetchContributorProfile : GitHubAPI.Contributors.Contributor? by mutableStateOf(null) + val contributorProfile: String + get() = _fetchContributorProfile?.login ?: "Null" + + init { + fetchContributors() + } + private fun fetchContributors() { + viewModelScope.launch { + try { + _fetchContributorName = GitHubAPI.Contributors.contributors("revanced", "revanced-patches") + } catch (e: Exception) { + Log.e(tag, "failed to fetch contributor names", e) + } + try { + _fetchContributorName = GitHubAPI.Contributors.contributors("revanced", "revanced-patches") + } catch (e: Exception) { + Log.e(tag, "failed to fetch latest contributor names", e) + } + } + } +} \ No newline at end of file From a309c1ae9a261654ba21c6ba9bb5bd3605289c82 Mon Sep 17 00:00:00 2001 From: Ushie Date: Thu, 30 Jun 2022 20:27:59 +0300 Subject: [PATCH 016/132] refactor: header image --- .../manager/ui/screens/AboutScreen.kt | 35 +++++++----------- .../main/res/drawable-v24/revancedtext.png | Bin 617353 -> 0 bytes app/src/main/res/drawable/ic_revanced.xml | 20 ++++++++++ app/src/main/res/values/strings.xml | 1 + 4 files changed, 34 insertions(+), 22 deletions(-) delete mode 100644 app/src/main/res/drawable-v24/revancedtext.png create mode 100644 app/src/main/res/drawable/ic_revanced.xml diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 7f0c732eaa..af00ba2090 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -2,12 +2,12 @@ package app.revanced.manager.ui.screens import android.util.Log -import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material.IconButton import androidx.compose.material3.* import androidx.compose.runtime.* +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.res.painterResource @@ -18,16 +18,14 @@ import app.revanced.manager.R import app.revanced.manager.Global.Companion.socialLinks import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel -import app.revanced.manager.Global import app.revanced.manager.backend.api.GitHubAPI import app.revanced.manager.ui.components.ExpandableCard import app.revanced.manager.ui.components.PreferenceRow -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext private const val tag = "AboutScreen" @@ -41,24 +39,17 @@ fun AboutScreen( ) { Column(Modifier.padding(8.dp)) { -// Box() { -// Text( -// text = "ReVanced Manager", -// style = MaterialTheme.typography.headlineMedium, -// modifier = Modifier -// .fillMaxWidth() -// .align(Alignment.TopCenter) -// .padding(20.dp,0.dp,0.dp,12.dp), -// textAlign = TextAlign.Center -// ) -// } - Image( - painterResource(R.drawable.revancedtext), - contentDescription = "ReVanced Logo", - modifier = Modifier - .fillMaxWidth() - .height(150.dp) - ) + Box() { + Icon( + painterResource(id = R.drawable.ic_revanced), + contentDescription = "Header Icon", + modifier = Modifier + .fillMaxWidth() + .align(Alignment.TopCenter) + .padding(32.dp) + .size(100.dp), + ) + } Divider(Modifier.alpha(.5f)) ExpandableCard("Patcher Credits") diff --git a/app/src/main/res/drawable-v24/revancedtext.png b/app/src/main/res/drawable-v24/revancedtext.png deleted file mode 100644 index 53c25fbe9a2b1c92f599b9d1d751f87cae72e292..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 617353 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 z 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
nZ`>j@c#i=1&cBP=w+ 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 *yN_5S?#-2Ly1 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%0Aq<{mNQ#ErO#PLc5;UTLE;MgPk3Vtrq0T1AJ{w@) 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∨7r@Z+}jNkj8q~z1RZRxhv`i#KDfgb! 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

`nG^n3CCU!}l<+ z`;Sgqb_4Pm#0uHPK?8{z5ozv=)>X?kDVvI!&zc9$OIE)D*1ij;Zb>fCmt$wcpo?i_Ak-9sj6kF!42st!sRCuOu8P!t> zXLji5((BYn8u#k(*o+dB=u-vOCipieT^pO1wR>iZ!O0nJ#LI;h5;sntp;gNRHhp@< zpY3VK$jT* zUp{u_&aXiAdl4DqPr8V7mi-R+4FrCK&?-B=g?DOkA-V9%;3pZ;gvGWGRJoAu^tQ{$ zcPd%C#Bp*ee<5HPx%@E*w$;2?vPuP`h8SD?h;9>E=5XN`yv2#%=_kIN(zP z+X)fC`W57(0%yzLzGji+b63CGBmlU zEGjH>n--M`F9|q}2Ou}avmVqLOvj=NMADEFF50;Z>L9?DHQ?m`E;Ds^2v!rtC|tY z9rcFX!{(w`O`_}(;MT&-0_-XO_;hz<*kNr6M+=~2>p-x;h4?}XtFX_b$&KqYMkR>r z-IK~3YykCs&jlRf(WhxM;?HgFK-m@2Q>5fmlM0qHv2h+)mD{9Z+_>D17d&#U-P6l=<$yxP`pwo_iUGT0Y9NS%Q?%} z#-H(nAfD|8wUcHtI{C6M?kXGYdpxG(+3GM!M?&)OJJnc(OFc&s` zwgfz&P>kX-yEhOSCA|&25p$A&2GAdq-SQoRa(BkB0#YH~)W>fQIA7?eYQ(&-sQJ){ zY*~-$@IY9sMZ^TI+K-WX@F9n4z4S!i7GFlR2yd_Tm>ns7C0^Ubsm+yx9^AX3o%em= zxHnd^I@7<-!R$*y60@+}f|nDHsD0h8D}dKB@>Jw9Zf)tvq1*9wNmLG`5^Wua zW{?ucyrYs(D;;P{?R{b5k(ppg)uEJiJxLnI5}XQRUbX=D}-Z9 zWXl$~+S#SuJP|9q?(du*xa}XFszcj8%ZfMm=_wTK{#iXhtt)fnkmLd#20dKB+K%;%@I-j8GUW(SiQ+`*KY06 zmB6BUNY6?`1{EC2F!r8`9u6tC?M^7^bAAKkk&E+*KS$tFdnx)z9+PG*!eX65=n*MF zxexx@|9uwR>zACsNUMK@Bs(Vby1lV4al+Z#`F@;8pU3e&>3;aYcRx?es(;%xnGYpf z+uOq2|M>DfJ1k}Al>XyiWw$T_@CwdU(D#f8gmNq+`DmSLY)_)3w1#gOAbaevkBZFi z0j+_}8ZFBVeVvJ0+djcf%Y?=fq680&s-V>$g}+2Rpf^Zz%fo3vZY1pe8c9DsTRJSB zm0&NnaDx`|Ai0K+;HPXA^mYr{Jnr$|sNKYioDU6bmtR8L32M1BnRC}hKZ6u_DsL=) zrA?!q0UTbUmORSig5-xm6aq4F+hRRMaDLmycOcf7G&|)_W5fgtOqOOi5@s!|y5rWb zxJ9o{=j&9A#&BwPd|dRFC;t@yU>%ChEj!aLkR8gTH<{p^9mb%snls%;&mC_5{MzF6K;<@mvgg-!|!}=KJ>JuP_ zQ=+I2Cvrd3itx*cr*#I5X3J)K1KUa@pE|u;j)(-2>2-wjwZIr7he}qLN8>c2XNmz; z2phlvxwcqD|J63|@j@HB<^p1D<$UaOe?8I!_tmUvr<>-)t&6J*Gh?AQDUO1OrDk9L z_J#Dtv3YC`u8LmAgphZGj98Sm#KKY(voGEiy2HY?f`{A|TM}DB@*JoM{H9)$YvfG|6bZmY%vI*V!|A#@hk_Uu3ob^y?^X-$y0SKpT5&0cBdr{3D&Po+ zn>LjPCA3v*0l<2NL#sTs0C6!PH49jK9bJhkSJxO0!H^9`oTuc86S8YbTh>Y3w}pN( zNIzH6%JBLH2Mj+b3R`^E*Ds}@+a9P#t$Nfbpg({YR{N61{|om^Plt)rykUkAZ$0Ds zYEh=f^Y`kaG=-9L(ZpyguXcKvf(+&0a#WzrS=LeNeEA~9czBA!R|@6VU2ZL{U*^`} z-@2*bHJ5$3kJJSXeF4+X?~85({E_3qXC5}rGM|N1DKNRpBocG4{s~m-hdj*Q^kS7+ z;P(>Mf4z3ryf8DfKdXRubxQhvsn*4?`?wqJ&VKG6Qd~>)oTGgBZcF{dHY3G->A2%m zff?MKNuR8X=Pl|A8GC83B{?%oHRQY^*?zCS{OrOubYo~O=lJ#-{GZ;}?M2>ZL#^x- zHRlp%N|0f=H=KG#UQBR(v+i&E8L_3qGbQC3!R6qoXS^l>b?`jdlX_X_|FEf{W{wXC z{wd%7Cg*?}AJOLZs#7F>`9lI3ga?2yFD_G$RQC1H4)JPI+SPp@8mH`+U?#hD$j_36Bjqf=JWW(6 zDFIx07k6H)Q37S%C(v)cd%px<9(cy2jo4NaxbkwHcFM~*R{s>Hy{XN8WsJyxdp>3Z z4Fe>FHJQhmN1^u99=)o&W`n;;Jnr7>QSnM)BPyg!*|UPgHPFaF)tWhJK0l8#3_k-B zq6#S96`d!k7}a8#qEntuWZ;y5_{jxy)ZHbzGUEBv5CJ;E<1RqH%A4jRh#J`eGz4sn zfh{M1g|LR|zAQ6Hf_|RR=q7B7AT(u38z$%24!8lmwtoXN99;W90ujP8_=VPj2Ku6H zNnUyMUJWt3Qk9n@?XvA*;b!6H1R-?L^G(`=;h-7?W9`-M92bV;EYf@s-PR+}=+uWJ zs(3ct9kwM|+Il$UsCvW{QC0B0AAT=)715urZipQm0y#P_=&<2y4wzlE)< zpvdZ~xY2KeqYs~ifa8H6nH%O)43o5D7Vg%)y8|>ls}cqRa<0~1)uwAk)N{&(4`bsTijmFunt7&;H`Wb}tp<#zjqYKJa$=FX#5-;VVG28EAC z@NVUILPpS^6qg1W2hvmQwjT;qyJu_diqvgf3WARPcWr8t+sQmyRt3(!kV$)>fzj*P zUq!IgjsXzqvX8$5TwKJrPg`B_3=*^dE&_kRut;9}|CZx*VX{iaD@LwgG7 z%SYT)&e?*bZhUDw67ln%uOi@smKp{psRsjQ3Vd@lPQ^1dtXuoT(V^$lYlp`yjd?XW z+o~KR+CC{d3BDf8p^dAM@CTjuw!&?~Me4!lz9xez=Mr1z^m4G_w>YUHHT?VL0e!aU z<8r9Fr9=4A_`WlmMJ`RT;noa?*A8FpcJD5w;XR$Gn5wTUz$RU>!U0O5&zMpgctU)c#y<9J>7hw$2(zW*Y$_lvr#2FZi&^b(lEX`)W6wvUK(12UTdLFGN zsB6QsBdXvn9Q0^gJn@>s^E#JDk3#PBJi(gfGFejj5lbF%bg2Ae?oWl_; zD*6P&9ZG4&miO*4%s)^Te$>EEn@kh z{K$1{UWPPeQ~k-Up>VheAT$Zj=R*>kJ9R=in`v(nikcOw%h@ieSkXCbqij=T1hdGR zv95phfx?<8q-rPPs?*n3{GKyYkW*E^})C@=ZlfB_M0g8 zOq+;Hx1J`_+#L-V%SXoMZ9qR#KiU2Ia02?bhmehKJF@-#&8={1k6_U)6GUG6vhns; zLQQ$7x%x2|pp16XynhHXm>?A`_Yt@UuC$g*#0e!$MM$wlyg#p!Mt9tvYY5`Rn4~h577Bfh5OKVXsKv~&+^bv35H(|KkDn_ckZ^&L`7Icv4%!O4O?T~lgvRb_|}mmAWaenjlzo zXr|AG-#a@9HzM*b)LMC5IOc)dK?2ot@Un%TXrxCFaN4)BypH&+O|RB$K9}y!pw`nB zV6mE3l!>8LOdKRsBbLgAuD(4~?!Mrmzpt9}DcxWlOtulE^jmEcL-q%H=k+J#jC}pR z@%v%pQO47mzOF@oX8qf+_n-Td;M*Z0t2_sA7H%$kosec8KPJ(&haof@-C4bH*&+9J z*kfjHNFt!w4t>uzCMcLX0cVcY(Jv5L-aQ9~T>&&+U{E%@j(qv5;#h+|2ge8KIVfZk z^h?{EFDuA%p)j=+LE(q$E3!Ea;IrZ$F_`xklVcLZltgwsW`<0 z_pp(|pWJ$=jyFqCoZN9v<*S&1I;xJMGsiD_FZkQ3TE85Xy7JpWi-bSjV8^W@!HTUXhld|Lx`Dz9F zias&MX3KqRCP(w(j&fObFRPK)O%X)n^XtI*9=P79%t8@!o;{>Wp~RUbvWX#@?eiEk zX>VxX6kf9`cS1dj0eO#_%9XI|Tt?hw`2Ixgj5){(c+Iv2x3 z%j|+Y*=0e?($)CS_d9z0CIy~jBnOrPFPc=(cI%(VS*;gT5K%JRT6!2-m{H}Bf6;3O z;>%XUB$!3h3#ci1Q*AVnoGYMNE%>kxLEoF6e6Vb38u44iTHmmnah?;Nem@Xq&Z`;E znY7;Tte+s^=A)2pXlv3gmA0=oAdrry^n0kM^gr>5Nw%rYe|BC&#mV z6spukBmVl7fvkEUfsaXNsx$%Z81Yt+B{xwjK`8lJvh#O3=f5HumPv6u-jb0It2P#m zS?84B{*bqc0tp`XvPK3G_3Rz~?R}rB^alK6!YOh^+FV<-#ex=ZzH113 zLuYUp?fr`ds4x?%Z{Z1wpz5wooIc6h&A6vTA{zGgPG^PJM8z*F$M%ngN-_@5xC+BPJl08@;R?Aq{qhVDsD0z zE1C4Yip=8@7zt`bctX~l`H?}k4$YEsKp=sa!}#*)BH;Y``|UcecDP#}y3r8Zf#0X8uZ-s8^c}rQP_fRDw;VqR-4l$PQ@zA zt`Z)PnW2RG`xxdQ23Wq*NVAweNQ_kWnz*&|f3*PZ(DSen=j;fv<9AVbrae=MWeN0d z$PG6t0&R4{VLB?_N5zOU6F+s$cDdIbT8s*gDpLx_f4aKZycV8Y$%#0|Eda9}bz2o8 zk5Bx8&W;;kb?9WGBz;M{;NA?dOUoVpi$tprs+xh=Ufs*z1~_Maf6OD;Qph-zoy=oH zihptj_Xw64@E6}GQlfN*Kex6@bWu}{$mE=-vG)EQY+HZ|-Mi$mdsO=Eac6DjXo02b z7a*FRZ^&2@dPUWB5<=;v+dhJ?0D~)kWFHxpN@&v?dE6N3F7_) zeVig@;b}#`k|}?g?6vzBLLP4v98+k9p)n7@J%p^b zE)`9*Li~9?u%Q04Dl76Mg}y4VtDPI~m$`T@Jc6N@Ll_2p=1p{@Ov;W?;MPE#_XBIJ zVhINT9FCm)5gMmyl-+oJ50~YHd+7I;e{A9;06J)i zHg(;salSMfEVxRU_c?1X>T0i=ZU7_(sXfL3a8kO1$~8^`^VYoe_0!AQSIzIwR z2xcxNL*xy%LZ3DEBx~CLMBL!#txTe2tLqFhdU9D%Bm%N+R&Dx_tK)|Z*RNSLY0-ZdT z1W+{tnYrSKD!RRy=Oz~SQ0kOpPNEr{zmnlZ-MqHwEr%T6*6y1UE}kGDR61>j)|6Q>Ky za((-gctb$+3*(+vf%LqN{#dyuVl+3Pgs$JY_O&lb{1i^pG)r3pg(b>x6|6)EM7ezU z%82~S{s1i2gkz>NAkZYy*O~Wb>%SSdx-mO=eJ_5HNN1#LU@VdNX~lP@s;Q5oCGNhl z*gI@XV^&Jn-w4j?bS%Q?;c%1lmNbE!(C|A{fvOBd$in}_)muhI`F?M_bg6WAk03}% zH`0xWpmc*Ubi>dJNOy;Tbm!0vH8cuJ%@6|8-OYKvzjOX?&i#g2>v_Riv!2=aj%$Ce zx>YOc*xH5o#~8GI_eT`A%vwMI*m>5=<7tR2V(oCPMdVDXEGxAyfK#FAM|6P?#AL|x zWpWg|$Ht0+zulqlM5(wqq)9j`-q=n4>FBgn^v*5RGWlo5F(`?G zL_DO)RuZZu$KZ)^wVAl8*o8CW-Ne_oXXibF||Ujs%lv8)A{nY<83d3=8Rn2&WE6tM|w)<;r!jgjI@9Wb|{`zH_6X;1o9>}tB z0cqj5_6xn#n~qrShiETa%fyCB%Y=8z(v&w#co}JDy z>y>3kHQ8bHz>6|qEuY4d=gRITqeN?5|NBu8uqj(S22}jFqF+`oDH{%x!iNF{kSa%S zh>^&rg8c5^Qg*XS1N^f9elr;9UR#v?+*^C_w>XZIlCdz^#D5X5TS`rQ>0tV&lBP@Y zNxh|uOaJRMMw|fKGLcRpCwd>S}t%?z8 z$sb!~46(+$P3cz9MTcU#Qa4QJFemo0mcOb@?km;gN^0UoUP~@`nKO71H0O%_-27;` z<`t;bj~*xO(x;K>mN`wpqZht*E#8aNfkVrl)c$^f2FC8)qEg)v&?-8_?v2iEz0f?S zibte%4J|TOYj|$Dz%DJJ*(d`cUHD37uXw%UpPQQ7H*izVwf4PVwBEwu|+GK;F^>x=AlO8&ngWN0Cj zn&>^KR+yrpHW-V2<^Kfn*>MY+3)Xf~B|=j*y*i~#bcac>9-}?p9*;&6-)cszY(j%o z#kMhCs6+}hEbXS!3Hxd=k$?+|vN1K$*@72e*l7oc^s?i60D;DqPn)S%;7~6~DaPZ6 z3^zJDRx$ri4!INvLl_ISR#J$NZ|vbzcdJ>;5ca~BW?x9yj#LeXIzH~V)5m>7N%&@P zTp#PsQvA!V%1|2VAV8>sf+pSXFXDoc9d=R!%-~J{MwFq%f7M;c$sm{OlQ^UcG!(Ab`3tmUglAGwm&Lk@_6^%hVFu zancc3sLiLD=N3dL&1UH6O`5;g+P`;O^6IBH+z6`PY z!)T!THXGh-CRuH!7ZNpv^nj?U-n%rSv=37ou>c98v4fQ!F_LuHW>suCS)~g2flD59 zh8j-!lZVpW5tjkw<9%8fB3%lAbI|fkG`n&{i>%{ z^6tC`xqLew6x||8dr^E)`Niz5DWu+)tVi7blb@)g$Oovi_{$KJOM!fnTX0w0&0FJV zGfS^oVlR5cE0ba)&O+1=G2eM-*Q&j{Ia#CD{=lZSi02@s^g!Z%4{Qc9 z=K9Ea19}{n6NuEmeo!DDBbYbO0HAYoUzW+aJY$~!7;4xk*bf==_`WHw?NSLO$G3Hx zJ=(3`Sp76xyA)jNN~emPNaj%j>?%iJZ2OFl z2Xp93SrC`jj0zQLDL;qdIPDn&k=i-!Q1Y#dobJ&5R)xL6C)m==IzEQ)lX2;lpL2`K%8dlP zdcow%yv>wEphU|KGn#VCg}?3cH4XORN9LfjB)afsoZ6G?qyuluyCqs%20Ihz)bc4E zYKo{lmyU{0O!~#&PisqxeI{NvhpLfgec^0kQ1F`NIy7lB67IO)C3u9?{QI=6pB2wp zHGWI>;uJTodnj_Dwqb!(EqY5EbOXT?q7WN!l}`Kvc@!{l9romw80Y18380%=KkL^# zzuArIj(f!(vK(6mAlkJS523?8#58`lde&M9I5J++#P0`cHmGfr?&<@r*!j1L_W0`< z%VV95N>&}Bw?!I%rvc#L{}#+PeE<8q>_H@pibY>NjOX;BUalYt+d1vl7gH&uXa-h6 z{ycJDCnVCT7Y&9+AEY2N_6h`M4CO>k1b8VSX&mvd!M>l+^q*7W?XyR=GRMCJ^Ffrg zh0PLCvLbnheb<$U(XiZzJ=SP3rkNr{hf!C{PthtriwpxRV`$^&pQE!@BoPIpRGKDy zgxyryz0FNn=9#HHO2mfcILqs)&soWChJu6}@S|SrlYUt9a?>d9oRZq`p>NReW7v3j z?;D`tYYKWi_Ky2rQPMSj$2(uh$f3>IKoOj_lKx#3g9}~xmrl}eObms!z-WC?XMMM% zmEn(~su!) zFGXYgMlKaFuPHO=hvGK+f&J%8RRjSb>1q057hk0V(~xIglq)%Nu3QyjPZ&`||GAj& zoPYhxwC4z_j(QvI9Y_qXIFQ!c90jBr6R)0`0d+uM$-XNOrfIpp7%&?FHQnv-|LFUu z)qykI#<`Y@;QAc_bCVgW0N}eicE*Z~h6Y$YU<4ltpx(mo#bZ+sqr#LWB`}7`-96e@{BDiIt z=r7OrqbI_}Qv|{=|7PcM*7kAi(lGE?k`yd=z!~Bv*MQ+!*C0{H<2zvE|iI>czJUzX`+%$#?*g0#r^OrL$w6ZWQ-O<%O ziI0R?{YYFLdPoFl>4Hyba}=S7Z_!6*91K!Ga0G`HX??!!Aw)v2Zsdg-)OKascs;stuHzu<3s=ryFW`o=v2O2a7!g?uejJ zpfp43=dr_(7pNyn#K>6zz$$}g;A76}*P=s+G=?zT)cP3-i|a}+_!9B?6QP=rT-TUe zY6}VVdj&*vH;QsYbC;=a%+2mV?UJ`Sf7v&IivauwY@*XvxR*}|#sS0EU$5+mZaP3D zM$Lib-=M{wS@Nj_-t;>L+awJJ&lGmeXDZ(E&HF^Jwbk3bk7~38J1=u3b?>XR|U)EWeKce7h_FCx`dszpE>AQ%}+ur1& zzzkrq#e61*GK{%Js4lsu(CNAAUKb*;ikW#cJcEK+AAlPhe)%Ft&tCB7K;VVS<6p>* zcJlG23^!~(yYsO46py&~)Kc$RV#bvh|GNa990TrBBu;c7Yk9CJTKC`MXC5pfG-jpx zmaO&=R_yu*$Y6bF9_A+^2t&27y64D^72IzkCz@s( z7Ds!S_ij6F{W z$C&$R?h4-04e%KWH;7>`fX?5Kv4*=Ok9_R@6r7Ou5P~8T$v_%2= z6&PuKgT4*n5c@ulO+N1sz2mot#oGZ3_C}#fVLzUf+LCH6m=vF%I-zQ1$vMU-#y9$? zG7o=+Q`D56Q*ao9#`fdlZ)Q~_h5L8H48zH0%l?GoFaz}Eboj$fGyy}lur5H~+`n}W zIFObrks2h-@gEHNE^MbsUN?rozd~-?&Pn)A_DJ#$X2PITsG)OUi;rY zszUT(+rSv0&fB^-M)uAfz;Mm^(W#x&0%QHptPH11pO&?Z6O+u?w(vUC168Qk3V|s2?%60@>+BQ`s|XAd?gZ9AJMc`uzu^7 z_%~l=(f1cjA!~m(ihQNO_jS*k?k=6E!br_XUQCa%tMB%{zjynxX6i%y?T(lQR*l{O z(|Zy4MYG{oI{+pmcZ*vER{i(V-lg;dTXmAE*MxjZApadjfMbM0tkmkVU(Q`eA0ZSD`t~^MWW=A6$SOBV~qo%0R2Or&b*$hdt<2JI!j4q z7gTm3K2&Dqstpb`oo&&^^to|c2Eb7iEqUfn;}IOJ;6mpTaD;^hYfS_>l#_|K2QLK=aG~t6Z~Q@A!J7n$t7xJQhc% z>ua>45W^1sr%b zMk-MF&`f{V!W7`9R%Xy5I(7Sr@2bzd9Zj(u8%LsBxjU)a~~Z9LDAGM!;a zs5SSYxdPoVwqTPn*eQ?;%Gb0eTX4UME9Ivw0VYuYrFV91E=@uIOZX(Z2?<$I`lM%M z2@?7%H_-?QODz$&jL=4NvjqUPk>uAIiWurX6U8{lG24~-Gb_{UE}O*>4?5`LA7T}L zHE&(uCR+F=^gT-4K!ZaLJ4hth+Kea!@Swn%JQG!X^B02gvl)Zz**YwQ$5Al9dU)CS=` z96#C7^YBq*IIe}iNvw4=_D|4*n+o7GHv9Jm;^(sQvs@8^diu}BwUdr=Fy2)-`|_sl zG3Y&Yq$7O49368_34>(_%!*n9Dl_HlI40L3|=`yRorze{tK|WlJ11V z(w@f&>Dt@4i?zKEpO%#-%au=xXH&L&9A;Ep%pZo7v3^{9pbGwQ9DSFUXzE$`qPFp- zjB~|gVSKoi^WDk{V^rwVXp9%O`+D&k4F)~NvI7wc8 zZoP@ln1XhX?=8M|)S0}X_eVoGAIz3xHnsXsTDItfI6wRJN+kjOjnVfPndF_U#jWDQ zWcTXX0V}bdzh!IBc-PmKtk7-8)os%1quuE;plNo)hG}&Ff#5nd=_pG*Guj3ipjQAF7>KCm9f0Z(ftI`~Wj*?K zLlVap1Mj;*%RMl219t!YxIGTBnW330%%RzTtDNoxmRVzv^$gwp7VZ7@##jAV*_ zv`E_(i$81OF@KO=?&tfnO_RG}K43*2j28FgEVJO=1ghh%H*HoXG_H*Y>m=f|!b0R+ zUQ@cLL0*N{nSY9en)IN`$a$KXs(<>qWjMrO<$ou|n^0xnaY{FzuDUB2q@nOkLTas> z3K9|vncR%Lw_l!n+5&s|`}7XyR_$B)4BEvMFV{3YDV(=LOir+!^^sb4g$T;d$^B<+ z>j!5+fHln}%=WyH`cX6PEtgh-0pSCd7VA~>feQ7mIC~%3X``qTX{$w#Q;3k+C8TST zkMI7&%8Na-r`xOaF{~$U0~yNDS>KZpUwNu5c#WSxwZ<91Gdt^_>4O zPwCuX_gshBE2G;F+&!&c1J1>zkta7Mz5ZNn(ouIIo$;3XaYw>4?hgC@AQjgE#U-!* zPw3oWB=UbkXXDP#!OD0TxUm5M@hnk9u^|rg^k0AhV?JZSALAU%+v?G58&F@ZR&7gfL=8xtRZ}0}tIktC-0F@1CpJaIofxBEoj)O=5Xwhjw@S7G94#5qD{w@S?{3!iUQTeeIQ{ihIua#Zai#>Te&VV%dNYT2 z13tuDk|KSg!=Bc~)Q4kEL(Oa``!^tU;0UGXdlSg zyt{8Zex0y@FeFggycv~|!9%7n$^)eE$toHQbnhSijdrv|SsreL z18MC{6$~F$P+GbHmuojpnFMkP6{3?4N6KfM6b#WVpb?zs{9j^)KPX*pP-7P6Mz%!l zv;&RP1J%Taa`c}LfZd5Pg>Tv{OdE2I8nbD!**+}EfEaRF zSuXEKH>ToR0>~bY;i&i8{(AyX%Kn!-Pi0*fnWlqpi!mq@ExFyWw-~i7+#xCqOH!tf ziqnNVCPazt#tc??lUj4$;D~jV4>mLYXrxgpw~JQNCQUBt6x-n}iJybl7&s!w&G-_$ z#x*Vlz&1Nr+5TTv$){`^b_}XNk*OI@>H>Tz&=$15OVbI6gw2tA?jUF;zRO)ZD+FMA zYKr@i!NBL3-==!oR@^m6Eiw~Fp8>DbYeooCDXFE?TNqaTMT2IJaBljMBIp&+)SDuf zO}u;kKvlW62yxt=>X8WiN;wH6pZ{Y{by@rB1Q>#-R#aTx)||9RNTbOuFSj3mgs3hgp)Z-~g0A#69sB%svgljQFB#amzB*Sto*PZH-m zKT9p$Z$g`GXj+(u7EFtMar9G5{deh-;pHD6_{HKT`IVy-#jNc>Q|k`TZi>>OIC76G zQ4U%-6$B_q^O@+2G5~N^-&K|*Jb?J86T8XOg?#=jvD|#^VwkV#Sv9Gy==>4)-A}~O z1=AgJ%XX}}+35THYtEnMP_neee3bV-#n(S_r0=U>>JU2KyNmXDQxnI+0gTQm4frtq z@l^FCJ?&K9l^ddFAP(F~X?rq&3BeM@dXn}(qObJ#%EOl2yMp-VuS2pj7n>zN%=~tb z%?+KN$6}IYCVXc%CfJp*8dVue$V^Q9Qcmui0Pj6!2nwp4ocw9{d1#d!PsqD+IgQHq zq!@Yi8rp8E{CV}sC#*W{5NuP+D0da`BuLpL6K4LpgYR z>xb6O<{CK#@w%r@syGTlee!`-x@{S!Ct_GEFWMqLtU51tm0c;dm2IVw1$rXd8EVJ` zt2TE2oT>w$19DewSottF5$(Zrp@_28$CqZGx|&%0GtHO^>nE^R6#7*tX!SXw@U?$> zeGZW(V&_6>l~9g3kP1NDT0oKg$@2Z{ zfi=I5cpS8IQ@|<2?RepKGMxcT(=#beFKhqI1yy;{9ZQnTr$L4?tW7ngsh8`ODu;-H z+-ns@0ZOFkqaZmb*_$@n=$U%0HesCKST{bB_#F%2S}<{z z+J>%K!3yqp-iVE*t99Z|d$dJkw=B8=D5OQQt%E2$kV`rPW2x71n7MXlKuRS)Y`x1pr{_E^D;R0ar*?}AK< zLv`%CP{ZV3Ny)66yxXIm-&+-I%BESZYid)|$x?_KC%}_~H}ZH}*tynpaqlS{ z!%LbDW`v@ak|6CUj-?Lf1=J8<%q1vt9UN}xs!77rL&1x>mJ%9EoM@%!2g8A=G zS9D(g8glQ+-n%N%{jtY9xuE4jLx#l0nv6Nfl~^&VU4H8V@MHWNK+qcip;|(xnHwub z)+()Pw1VrzG1TvWi6OjK9}BIC%2tmltGj?rXx!azc?7JR86$9QZ3{u z9L zmmkQrXo>Chpf~Um`Lu;;1AX1bQ|)K^2GJXplm{T1xF&kkJJjo8UK3X6S*D67IC~EC zTMls)u;cl7xSK&t81AoK!&i%_i~-8$7eBEiB1ID{-U=S>1p3|VO|S#fmv*Rh#{$`Y z1gZ0@%SpE7k!SWV%lr3_ND1nWkWV^VlpUi|cMVdS4@q7@Zf(7+1V;p|vg7)_{#W%X zbCOWCwB_8XNv}&*{M)%Kf={%NTMUuetjB>R(4IunG1hBgRng~}efhz&ep;cYKE>ba zf5l_%YXqN&xGjBkB&nztK1XdwTF}-l39$VnknZpO?}RFeUrYWM^jz@kdcV+ezcC7S z3C`4Qa3Wuq#N-&)!SK)&!jh{F&CaP}brNGLOXL{M!*iMm5pB366nZDP77{(^K_eqF zv%QT<7*5h8RT6n-34JbKUQB-yrGz(RTyuUKW#u!toOxWBtb6DCkmvp4tdemGEuEf{$i)l zoyH3LAhj$CQWrvPA%HKTM!lK;jo)19aEzA0n$jPh@ze=*Rh zENik$-NMpa4q)+gNfrjq;h+7GZj5p@?dtAy8*hNH^hK(6Qqv{OF>KUd>k^lMZ|DBl4R9FU%yzqL>3)*{HzE80nA02{o{(`6ZC3%# z^>+%BseYimTtC^PXfeRepjf5rE{qU)|M01USN5Zd@SnxbB~wi8;Gd$v-GK#zn62(Z zbI+MkItGMTpsCY<`_jQq{3^9GM(c*{_j?gQsp!qU2MHdbSUL2ihG{6^7`@g{7Ix2B zQxQvY(5M+}adLReDFSvgIVll!MDI$!QB|4O9PkaaJ@`m9BO@VxgeybVYb}r=kpk}b zE?QcdrRoyN4-v)(cD5SFVG)WI@9*^F84>g9J_6slgG}%5=pmHhZFtNca75> zAY7>Fe1LymhWg!Gz14%ZWbkB*KvK#5o>A?%lSfa=5Q4lOQJy@5I6BYhO)W7 z-&lL5qFG`--nTC;#gJ@}0(JH(xF0$su@P_DN>eX1O}AWFROyyDBYA~Co5wR4QQ|YX z0XIOm7Q{J3Pp9#8=O%M-MMR!j)iT5e?u#OX=+9DfPCOUa)4|}M0hU#X^)$ClJMg2q zj~3T7|G&)7Cu}k+j&d~>%X;Hyrsbpx5uIw|g$myM*D!n2|JsxCLhK<$8S538mAZhh zLc;{^ETC@tewM(ygpUp0OOMjK+kVd}J6l0ZqdA^Ef%8>VlWG7taILK%PplB5o><{m z_cRgm4+ERH&kwDIH$rzV7XYCeK<4PmS=FYLCs#Hw?1m&NrTsidHpXokk9sGCLk*d$ z1PeQIfPLoNmY0HZIpPD!ZxM@X7&`f-vqPH0nVs!}?2EqLB=|C7Ulp|foitwTIfi#{ z{wx!^QrXQpY6*NR5vIT5dYXa52LaFu94$q9VVgqbvN=vu0~HRe(3^}cKqK)nxGWC{ zPZbki?ud{+&SH*gNPXP5j;~twI0FyI%Ox>{wF(Gf2h`I6qK-H9u6GZB3Q-&`bX|G<^^W z=0Us2?*N?eq;!KwtpIhNcARkKyL15Nj3c~s6i9}YXDwMa8^C5CQZ}uer)t$SxZs<| z&Jyi5uE~vB9dcNSU)^lC^M7n4K@y%-?L4Yl?5<$XYF5)3d`yrPn=qFdxM*6=K$7o# zxkNiawAk21&?YZblz30Bvw?6r4Si74Nu;>M^6GBz8erzSE)Yq`JhD*5oMsF zbqMZM!%7q}(iHh#93JpJPJjUcH8EG=Jud##IP&Jud_A906u$4IHGlx**}8yb2FctH zEUZafW~i&ATWEG|2>9XmYi(9&?f`WXz(33u2VR;iS3rs$CD;K7^#?C?ah)h;?OL@! zQ1F2Ot`WMr2fUyO4Y zY&_3%mnb5BT=L=#%GY1BLHuAPbP%Vr-OFA4>IH=dZ?Cwbb=(w7B+eneN|l=k!#?{i z?@({Nn$B6BN9|LDI?R2Mj9!5KSyVk+*{Z!$7A*}Xol_R4b?Ic8b&55-El>q)BWET3 zj9JNSWwvSQrB64A$S7Ql`yBJ=h$RjJEy$N^xW37(@zIdZ(F zV0o)v7ISY|k~}tS8HXChZ~w`^Nh;18#BpL4xD{{L^(Kq6Wdj?Kxg5OfwLKLQu%*w% zarZC%tSOX;*6M|?B67b>OLF*9tC*-VDY-_)wj%NJ*Dz;0ed|l`R4upa(vEXDj#%a$ z=jRbw=hMCwEmqDI&X#74gI7>bOT7@sXR1Dg3Yvy_eSreD8hBZ63c-^0>i{Dlu73u{ zDfW7FOC3Yl9p4_Y2;A{Q@yhm^F6&#*-zT7$J*46|dCZ=gD7xrkCIb(XByu+7%BVL; z&$R!D#7YcaYGMczT;?eLSGh1S-D4JXH#TDO_lx&B!f52>h_XwK!tvbzj23+gSRc#AANX_{KW({`0i3B=JoZrN%5?3+tL^jdaP52L6S_e>tia9NX4cde?E0=6~! z$F8^{6OGW|>XpZwJei77^I5FUO%J=%c+2b{L>6bJ!_k;~+Ex&W^~Ky}(_^Yq*TtW(l@9?YlZs@F;=j@ZdwVB*KR((CnQ#Iq95pj`R{0xX^5mW1_ux!G7z5WSWy2q>eKJkv@i z2)OTgsl@QqGxn>I!g+o-SByEFQ@Eu?gKQVSFkT_c{wPhE#Icd1W^CXco5cL>q|E2c zMfiP=iuu0tWl{AXYG;}8?`qHIeC5S3iTPCdQEIX#EcJEe}GL9cAccy z+Qd6x;_Qq#1M;`vzhP8R!s6Ua{55B`p1vWex@**!vdQ|fK9mMQy3J>dfY2yeqPTPa zK1nlhLzEe+W7{!&GtCLz^UYnIJx@p52SHO4ItbKV)~~uBqgKiHiuWdM*`X)K$99V% z=;$j%DI_VLv2p_E$u6x%eGj*Sn>;1J-MS0sdS{{H%qu#-=l!~LiH9@SpA2KE3jo*r z`kk%5ta??<{l_ZnE&^E^I{A7!F2yEa+eG6WEKHZ*!R2e7nmb?+pPjiBK@A?@+)BRq zvSyDXsV3#x0YX%RZl+uR20oAfe&UO~+Te$t`Ys&`D~l`Kt89t_b%#jTO;;*PoQc0z4pU4IjIzqGLBm>j3M z{^+y7bG`*$FLeyOivbTkS_eePYc*Y2viU9a3SnIbFx!Zi{Cki7t8e#^ zv5(sHC~DH3U9;f6C}Ez+*b*eV%?WjmD~c6TKKYU&@*%@bK zlAD={?CIuG(4Mb<86i1hJT7*N2IDGZEVf-Trg;qB9rU4Y0FC1nl>Xyis*woxxvLvt z>j>X>nG>crqYl?YpIc{jutpp$)}H>~=r`o?^!C5-hehx3`@=8g$%y3<3s#k+GKp)x z6)@}HZhlWw*o#OM6>p!HYTP2P;+g0Mw z5c_j;vzw|GJ{D$fi>k8e{6to-ij8TzyaNdqnX<)>SOySwiKzAgvSw5Xvk>j5V&P#g zV5Qw2o_Ur~{7)VzT8kRzaGfOW(e2LSH>g0!-kLFQmXJme{gm(WD~|BE7_j^CoR3YC z(Rs}#=^ugPc16;6m=N!j40m}ec6Xy*+Hm{m5B{cXxU};Z+dht9rnQ(@^bZ7N9AELN ziH&#c@(LL?XtCe@0J?P9Bu;)nsal-_7^gAzAO4f~5Ut;NUfRh9o3L8Ohs92^WATdM z2OEcG2T{~Ags@C5Tq1#L_nF@T8&rc1HnHWX7H&|{0)vmmD-u*at%FZ*{ zZ)-+E3%#qMR`0cZ>Y5csJdIsG_+b$8e>+QCUqXAS*?>|2{`?@4ZcHy@&Zq~gTG-fN zKdfw%V8L`GmEk%;GC$J5G>*bVrt;NfMNq6Sm_ zvw4@oBZ^L@k*l){h7FZDt6q-$@VRv0f?FU$M?a!T;ofXrT|o{;Ma=^dk=f+81SohD z?zoq{7vAMmy;XNH^cNEY5M;4ym6K#>1ew3|-uK?vfCHDQ%s6Bh@3#^_5l=SS0jAGm zHh1{k_A>!+;LF+B3|p1rby4I}NxJabw*1XkrY4#hyVtGr1xR(o%FV8Qa|Q|gIjb0Zj-@Wu`Cup~Tcn>5wvVdaso*91l`m)3Md z-L=J*4$N!Zzew(wS@h^fe>s%K`O#hDjdTdel0(NV4g=oMLb)uIS43+dj{432=i}*; zjc0t|i|=%>$Bgj^*(c$?5^d&cI2%z*=w7SX*GtEVdgW?o`ck{Vgr;ndJ%*Ng3S(6V z4}YPss+t_C(BY9q#Z!<%@z*41vLDHN( z3z@%jckNTtN@|%V)rk87Mdz{=tJta32Y6aP#qDLz9UMzj@sxDMV*Q7Olf#ixZVx`R@iV zA#?|wB1+u6i8|`J46_H@DL!M^hvGWijF<#vrD~F|4wZ}PEhNo%Bd{+}TTJGH592Uw z_cegq_{yTpub;Fh9qqlCI8mIQBv0&F>cbmm9cE~=?GJYY#cmSE`PYMarCp{KDeu-E zlP9SV7J`6##AJ`yHD$fPN20dQRZ8PYB|GHNN z%SHG<%P83$t?Mo=@*pS=3->hh9m)i2ZM~cVABhS3GJ^s-wA|{>auI@_)xa;9MO3lt zQwKJ+vWq)*7j45K&L^I@wWujXMXNeFQm4mvHE{B%C4Kb+k$mu_$)7Ev-1oy*C*dH1 z4N!#mmf_xAX0Z^KV|%dfZim-fqFi4M7U-bCl0?dA3Hny#DRFR+;0EIz#c&8N7AYR_ z&Z}5K_Dq*abw_wJpW`|;90-yFBWt4ZPNue!5X%CWutz6~9b2zn( z!@W0QTPXyr+b!!` z>;gd9C9_Y+C}xwltxw?;_~1Qu_Q#tK>NF)KXnq)4@I27YU0vc;BkggW0qU z%2YHw{y8hcxKT!uA~Lr~t!%i~fGuO4tyAjiUw2C>$G+GQ>v&a>lJe8)TSZNadlJNn zUw#Cq#c{9WGj=Q#pRC3%c&P=~{rp`+P1S5xEO>8{TPZutPP2K+vu z<{yx^g=nU^tzbb|ct2X5{v1h}VcLMV@%|P!k9Miv&tKTbyNNG;wJ56Sk_?`ieaAzI z%ILMo2&;ZA*6vub;K4j9xXW!bt%Y3@)NHHM(Dyk34&)>l))1O9B@WpfceS&{bv~J4 z9>X~W49`L_Mq{KW_Kszf`MB1EPcVSAs#->Cen>G5dpx-e7}@%JE1_NkttG>u(pZ`f zXl&ZcSp9wX_Ccy?tmK2ItK^u=h+axeMl5liBT_9Y5&a_vK;o8qc188l-YuelNpUvN6S%pG*wX7wYz9 zXtZrM@p~S#`OE zH$~5CfLWn`ZbTfv%ZN_Rzj=&*v2aDB60+ocq1tzH+11#d=m&?4rfmoU09g4H@^V^% zO7Wwg*&b!`+}B!jv;PhuFq#4mDQjU^f#^VmI9JHvut9`QVK5(^u8bFXW|54ZWTzO; zc$BOXJK?~(1=dWs$J2|K|EC4`QijM$8Kt)2oe%vtGV;cyKEoMQq;G}ALNH^e5pGT( z@`=%e2K_?pq2uBBRPZp3%?RY$WT6OCGZcPtIJAukCI)nWsTM zr(C>iXJHf-RdfI5s`+Q%2f_4a&Z+FKYdc&B?E~}6WbMJ;tsm_`WWLlPl5 zL%DRX2$5Vm*6p)E8xa!c3c7ADdLfe%L+SHgTbQS)DiGE4?m-rL8vG?*mUvzSq>_a~ z`W$nM8(ul)o-7`f;K;A4!ucF$k{CS`>9nD`T%=PYtVHq%2w55F3;o zE~Jx8V6AU?T~T<^PUqZSfpB2P7q<_)h3@rV`U44)U2#N5Dv7TP=)(Yr&2ebA`sDDk}3+!vo}(QZ|h$Uw$}R{bAD}8Cuvg- zrK!#@N~lR~aGZB4jZZ(0T3t6b-1Jr)_}?4$r*At{7b!BoWJ@OQtSBN53Q?ZLeD{y{ z3KUt!4{!ACTeMbKD(XiW9tc>hh}|BzOpXtC5BEaD)uJt0G9tgh0Ga~k`co)XM`r6* z1OPSFHYp_JEO?GrS@~W(98JDoDbr(SQ+ia2-Qdw?@z#@8^q5P{9QcPFO7ef>ql+`-D@T zur`da%QWgN)$FZdh|qA%ynXY*XmPmyVi@F9&(IXgQUM}-Wg?f~Gl)o%Zo4^!fVk%# zj6iSs{4ovg*Br4~&Oi*<2Onm5+R|>?*{Ke?c}6{N>p!gtKn_^b-M8MyPyOJt6!JRQ z{|uRAwT$k0`D+nAf{}PfBKE|9JhT!|5lIvO@kcZX^*Yyr3Znkw>`X1f&P(lEG+8lU z%ph14_p}reE!{=rt8XK%&M#oaifk{phat2hwj)T*7smJZ90!f9ZFCY+eX0Vw#+4@k*M4iP(Hx z$ZE#*)z#4SBaTA2lL_%G>Hkmv;zGs;Oj3ZOPlv~E@bjahl4;vBgUD?U394U;U-9eK z0}{eKXu4n2p6k6T^m`}RKSF0j;uX5+QC0RCRA>0hWwlS+RXnl^G;u5$8R)5$o1^XS z{_+=-bsWdTeQS1-$(PGkfjm91D3;u`Xny#+rs3ju%W>lvuPI;giiRGXj>P zdh`B5QS1V_9UR2BW1mwm%H7Z1`Us9 zv8#oKyK3X-IB{iQ$v`XAu$k{gc&BCG7g6Ltk7`$EP=$sG1aP8@?KG(hx^M*SxEXPV z$?jJGt|9zcotjG}x0x&8EaEWr9^6KRlz=v*uMQQ!0OCWP`-iaA$H?yzH<_P+Af<-# zsCFUX8OJIe5ch}jDAi%IMEt9ze>7>q2_vaBgK|NguQqsc+PqSx(z#ykroVpNGt`Pw zW?<}1x+6DH)D*Fq1ml)lm#Oq91{;m4VpaRmGwl+V-#7V~$6p$+CcW`5a(RMqJReJ0 zlW$Qx>b;8}>zp6lL-S_I)vQisIzca#?}am~o2}yZZYkL^OREw?f9I)}*zS2+fOK@` z>ML|jL}OKGr$e-;MWY*9)3g6fHWrA56~4?5s)d}36fXN6B+J}n%RJ1Vj?jl923F?k z+0pA?FI9#j$}w6cW&c3PkY%Nucvi>p>;H$Vw+gGO{i41%-7V4~wdqpnRJuDPC8fI? zQMy~YOS-$eyJ3@?Mq2t^KL7Xq4nB^!@W6e+y4OADn7=V5VN7KGN1rS{i{@6;V2^4$lk<7xC>d6+Po@R!oXb9Z&yKt>qG4@)F*cSjDV|1r{XzY2_q{aWm&2en z<^GhJ%TFwIsx0?x%ia~oZceYj{x-J=JRJ%3`hY7$>3QJOFYy2x35wNEK$LrVPok~9 z0ez3VW@u$BY41cKr)dAZT#+Ea(-Dkpi$Env7f7<5s=EOWB#A-RD+0DD#m{Jdrij2> zcNeBquUnV3&l6Hu9rgBQ>=g#U3%W6|+gn~kp_>GBKI7?vRA&q+O;s25Bdl=%$X;a- z>I1kMC{3V_#hr7Y&Q)W2COD3s^&n@ZKo6V#b=zOW|Qy^%CAjA^M%dt#<9S0L~W<6to;&Cz)j_QEisjwZJ0KdxHiYWRUiRYd%@xY; zyHmj!`wepi9Ac0bU4wt)@Q*r>Iy|K)5+Jw#yc|Ju^+;a}CtzRhefDMqe2P&40izKu z&2;=?2u6IXez_fXzH-CDE2{E}=WZoZe17pv{DaO7IQ|K3=bQz1n_%JpI~M7uY{EiE zN7r?s0aIfTYwXuB;-39!0kWnUA~0jk4k6zV)k=A$JD?2*j+U^^fh2GT<6C^Gc%#E5 zg41r0ZT9l>U56Tr1`DS#z5uJDktBp|{H5I9InoZn05t#fpDrYK3PI$=gES0^937sV ziU#ts#xBo;N{!qu!oFa0pn$xtkF_U((Tn2ql8nW+e!3!d{xxDT#i-B57FbNaNm}RV zNun%+|G2_i$|#CNxtfFU!8=@q_k7Gl7e<{EDK{(wn+~W0&}rgX+nHmzUx1*VL~s#;y`~Hm z4&)>oxZ*#Y3$!DJ6B$Bq%h#mj?}_vtbfOJr;MRL-JT5*59kMxrt)_>Kj+n?JjFmLS z#FEPd8owA&!yZv7-|z?3nL7mvVH;23<@(>sy;suMl*sVAh4I|0mT13O*+has{U6lm z+!LSS8)5s-G-w9`k!{J_xSks;k%zK@MNu<;0z+bYgr`j|LljYD8Z^uW%VKmCw;J|L z?(6_e1pJb?!9rS;CjbdDtcvE$t8Ji8&TGe#!lpOlVhKiHx;g{czeQ;=_gl0_#07$q zz}3cp2Ts%uWI47xh$+Y}DbJiD9+_knF9y9YqBz0N@OXkN8i`CXD{y)D7uYxJmTb{F zxqo)c5rek80Xnl(gr0S}LF(5LwJ1f^eiCDA6>3lA35r!4aiz-nd5jG=RyW8);FGCF zEj$i5hd??W!a$&mM6JsViftygR6F(kkAD;2nE(m^{M?kKFxmd=MbmV1>lvp`5aj3% z*8Fg0L$-3EAd$n&wxsPAZ#Ni{3cKnW6%AlPg%r(xk#{?SXOi}-QAfpaa9BTAs|UFA zb3e$RCm93+T{0wrAR{7?)WUJQ1NgNR-8A6%00?32F>O}Z6FgYtUeficlM3$rfWI|Z z{&*_1jjH`=W6h@~V-buv0`2Qd!!@xx?WrH680A5l8X6W^8BTN!_XdscCv1|tvh)!T zjBF?jXk69~jvu%+J{I~KUY?6y2X|(LseI5DqWJtnd%rd34sP@rd{;l!@KHw_|8@Cw z-wuZU+^Kc=W!GueO+na$sqI7gyxa6C@l>pQp=bo}{&+NiV0D5B$9S!7K{d zT+oMcs}|O5t=ZS$pa%_NyaYi7s=M9zH^;@Uq??VAw8I#FnJddh)>yS=*B;PSDbLJN z+J?u4hfi0&2lQ~sq_g!?D8*<>3)2IRJ^@yEi-s#t@p`i+p}U|HQjyy!=kaZb?zy)O z^kMyU0NSwlhZ}f-q3e1GP?5j>C-|Ykp|q3=VGJz+8(>A|r;pw$WArdJeJqMW0=FGG zJ37`mJ!F?48;VdtJ*&h5><}A@nxduBZA~zA3HNtaIi&=V>9(23*2hcuKC&8@*2zGt zkX8fwLtDZelGAfL#4V^N3xiNnF4hNVG0boR7w(FH zqQq{|t>ZFT8A>553X8DE%$`7+FR`rxT5v`HRqMb|I@0*v!G}BB@F_P|bMYMV(rV02 zMYeg;_){vy#|+*b#ueiNsgQ%XFoH{{ly)c+A4f?C1-mgoBS&|OjRyB*d&867j~jxH zC`t=iIvZab{0*!+)o><46a7~d@pG&mLxN14mb|u#XL$P)n}#V_hpXpT5&}9Z?7Y3- z9AgP3XD0KZR1S+21GhH}W|esZC`}m4uhcR<5=QZh-pb`<0$A9G0Is;Pfj~mJ zBUM*=QZFHW004vvz^>`hGAp?XN4s|bKJzPs+VO9~AijU`njJhgt-98H$1G!$GhJ*Aaw0+uv;V7Zxj4mb&_EyF&87|B>XuR_$m1sOOcR|FLjC{iYf=Qp&B3Vtfu>W_z{5VisPxHKgpUfJK{9=RXug1c`3drV-fTu+ zGJMxKd5aEYlO6~NDj#LSHwFYa1)b}{K{ntUQIwG(lodJk-^E11P09m6zh~7)hx-7K zYdo6LkUUm1_{O8F1odz>)K&h`N8q2G$nutDshWtI!-tHr_X0H>_I;A^DOD!mSuRhnk?S;q2U)NUZ3gZumt{u6Q9cBfw`#^M8Ee#=0-Q_bj zyqF!iT{l_ zfJ$!uog+Vnqgf%`a#b~|?b_uulMzjBQY;GNxhPVBZG@OUuwJy(a4JxnD)G(x6a{Sj z$_z>vlgrtzA347X0$Y(;Re2I!86V;J#l)*9q^0t6tnxW3DZ%D%#_mmru|n&NVO-aZ z@r@Zd;F*^O!f3iwq0?gjeF86~MmCte!KBR$bW0j#aCUgMXnPQWqY+I;Ce3#BOf+82 z0XFS)PylLKVY`5V?&srAP93GWT+&1|YG2|Esd7lZsvQ%xfU59b7p9_+LdE!~85yrO zXh`{*lO~lGyRIccPjk!s`&)S(&wEA6jl%Fa7Bh{bSe0sLyM*cy5-()$sba8>k8u~( zIQ!|&x{qs1iOYOFLD?E4eg_Z88lo5r+)o+jT6vS{DLSYi4ZSk2icPR-m3(@7UzeXK zl{O69SJ2JE@#YWD%Ub$b$v^<1dKXVfnD5Y|F{^3b_&wqp5F6y?7^cB@G)?u{%Df>m zK2N&y$As>*Th6eCt?8htGi`+~fM0^+?6wK7#aUa@j})l9pT}F{*^Gb;jLdj~11}?P zw8ADZu+(lx8j2~6o9woG={NN`L85PDR`t=`xFtO2DlYQ1i$`tPM6RVCMAIKnV@!7c z%7)V2^}gsrhUNFBUMjRs%yB0La=Ki79NMW4-`!C+DQo7OiBmavB^^0M82=2g*sf{3 z@1jOpoSgM8658i~kk|4Ck~gNT`HXq3kJTk-lmcfFOZAV0rajw8dz*I>MYP$)vPfWr z!I{7Gm2&^~{>WzLXL$=wxJtEdPu>`U8t0BX)FnRo;IFLH(L&rW8PGDDe8k&RjuAg0 zHGzRXrsDJ-&0j^xJphB7{mpAC)VVk*q@n7$^2PWBByW zE1f$}-qP>&{`Zs;{A_7&_-pg+YK)_Z5!*^|QRj+bh^@(THW#1aIt9Va5Z?OKRT#+z z^$0V)QcgpExptaB$_GI0|2M&!Aw=)`cb_puH!l-Ou%5%kGf=Nfe?&K|Wt@ChQ~SoD zedTN?5u{iKp)2Yqzf2a6N3sNoiTD!oVIjGcpwk*B!f;eVxFqjNunsAYIQ#I?or9;} zmNF-&U!3|fjFKw3h*F|k;5a`7MIa(x2pqy*NlxYgH4*T2oBi7t)8&P4O>{X~=O;QXP$*%MjkiZce6Ksk5tRg=#>^Y(OXmS% z5541LUYnaWvVcixPK6G|-S^ZH%vQ_cO}p@J3G?Bi>}EB2>aA)dm3MWa>i6oVU+E_6 zWlO`L>5pD!xu3qD4PVS$t04R-0cct{6CWe|UH4nT$9Bb)KNnvDkO!8XLQGD5M!NzJ z#fcZ^A_dslVNzc2F8i>awjWPRCCP5qHPMv(5cmE(#ywLSk;Y>-Tr@`kSI-VW?D00Q zT`TGv2SX%2c^!}5o7|%#d+f9l7UP!U9C+B^UL`_AYD!0i`aUvf>I(Z}2d3@P*$Ci5 z8ZQL>#q9Aoh@~zW5tcBkVqQ-sqLU}Q&IfAXxJ~UY~5wXp|eUOA<;4ZYW3AiUwD$~*^wZM z47Z0C4odD8qlBO?yJAnp_IsHu;T+=G zZ*~8dh>!=%*|*D=Opd0QjzX;1+Blx(?4D4j&%r0&D$4l-wKijS>}8ZEf9TtctWdrc zXRJgExV@iH`Z&4GE{b{f9hE-_sqO`WVOb6?$mU%S|9|HQhu06sV-#n7~KY2yS zj)9eOP=IJJG6`+DAm1L;H*7!6ubA#Z<8NifKmPY%S1|s=&i@r?c@yidHVQLGj7EGKi@r}<~&Xc=Ac(|^GC@IHS^NpR? zf_uY?uPa2Y`#HJ5{RM0N`VG|*ZmFCylJrBef(U0e&SP=7TIX9iyNtWL=u+7)RlnaD zatStqZ|7E|ga;jLY&vc4pinB~+wOZ;`MA&&_*mr7GIv+LC-GYb*NwV^j}~`%m-k4g zX@j`4Tb&pXEDKqSE|bskOg^6?G*4Fmk*h($pNcOH$Wn_&b9yCZFmfS-tus2V0i_W4bf3JE~& z1TL$k)pmBdzwKbJv#7fp5a^mgQ-wRa@A8k?2+)Z#p{$8QERSw_`z8H$1h4TLUa)qMa~rcxm;5a{q`({%EAL-%_? zmB*MHwShkYkG)Rh3oH{Ccr~))NCUlh@$a?}ut-H+>L=gG|0T=*KLN?;ZCQ~Q0yi;+ zYq}5e=}wSu`){U1j+pKNbI2^^_*Cwk~GvCcO%T7x^wOTY~QVv)Jm<8|;97 zCXLdgTy;WxqL_gSoO;&=`hvW$ML45y728YI_d3q2Rrb;PN5X_;P&REIR(m{nhxj z9Lqi$4~1Jfc1gCfdo`MM@yRpwjaK6f@0~u)iXW&C*YMo2+Nd)39H7@jBCox#JF3N3 z;A8`$xduzt87x6;JD*=ez}^=*MRoBnaYm8Z(C#WR0U?y4hqmhKdERT~BuWBlMgJSD z?Iz0|Ms;<&L93!b)}=y_jse4lOObp>Bcm-j$k1iy{yazS_1WtvV-OiA1Uo5Qt|;;i zLr#9EBHQi(5dh1+=P0%dS)M6A@Z4FQa<&&;Wy7G*=#_T3?2C6sSx6Zt%SUek9CJVr z0JnC5-9l0!!oX(n^Qvgb0&-30(g}RyP2<~b&*o50mLS(TgHOEfd8C4ZRC?$5E;`l( zWrTN`2i?1uYDDcB?`vl&Y015MI74MJi?eUazFa;96~xuxq<=$N7^iZgy;87#{*cB| z9-5qCt;f$8h&q~^2na^BmeKu1j61x1TSP;R&$V!PMMEE?zkJW?Pt6>rz*qo-1FoeX3oVc zmD_rqgbQ^dP@whNL>PJaezUNMIXXS7q5Rbl!uhp@oJ$_Y9zYv~;1ro}`?zKIW1=&T z1$aRd^HqKEUy@yXH~OBY62#O>{QOScK98f1QpKSAlpO%pRN$!8;9OY{6%d=Bw{kY3jF2RFmP#NR zEK++xWRytw8R-qc8zi5dFHVaWVDt?42*Hhw)^<2hX%Hl(wj84fE;|!l^8VjRM#u$5 zHU{PA-g|zc>n}nvx+h}JK=7(S_67u=yX=$9^27)qe?G3E`T7A<5=;o{8cngB(vMy- zCGb})>}n<)`v}5;{0cGu`FA46|BnSQ7s;n?!ch=urT`LsOyBCh&AEk$>wXD*d}_X) zC>b%S=CXNCl6p-Np}Z7+oEqNa!fazxW0{Gg(RSd&i6;5FQPu$`l~|xkYY`X4dn=_u zvz*$Bap46PQydD-C4H}YM}*QtmO9N88l3t3<8s&B_gK(*!uY%AaoJ?fgaK$j?txkT z+Z``l2>XKwV9w*m>n@LVRitimNd7${^HnY`TkiMh4dZW4zRLBALEfFv9I8CP+3aGX zXsw{$GWp4VbtR?1W(mhE5xeV(_ngqbP|hikWRJra!}M8}{_4Nh>4@&=$!%nM_VxVx z^>deYb$gU!h#01QU>p)p09V3tr9_{?ur{f=h}xf%{dBM(GL7s4A%RH4^XQw|Vd+>_ zMYmEvJ&A;d+xWkeA5DIU(V2g=JS3+BKinUgI9L9u_&5)@q+tIZ*P5z{_hJWlD*yt8 zm^RBX^^MTsv%K&&A4^Xw&JqKg3ceC9A8455aO>OE?vk@W)H6fWT_9##REQ#z&arOP zvQvWoS%z2My0lf(rlu9o9_(hY6|ZzrCTQxZjWbPdFp;I__EJwIa@U}7dSWKD9hF9| z5h7Ups^}2u$j%7N2n4VTSHmAfw!yE`Zk8xSY^*9)&%>$;Ki~Y}wGB<_(fVbwFcs} zpBXyHUe$HFEI$d0t-e~+L~dxKCG-kfzg)@z#-EKjwtjC-A5K@^eR2(tE+Xca$RTrN z?8e|=y~ADem$Ro9-FX89BoNh8Y$~AJsbeIM7@m^XW+>iEz*3s-kq44|?*qtM8AhQW zkO2pGV3Auqngx~`hy?IWDIb@idH8tYnYOE$RIYZa+6uT8#B-7hX)NxzQD;(j52rMm6#hIL{LSja*F|XRAqJ?sgNt2-H*m!-cc>_gN&5K`3^tv-Q12hxLG~I^ipxzlWMV z1))3pn*M^%2v4mfa7Vu105*L3hIrwu`2%lgT9cmuVsh39Fqjfwe+2|c;uN&e3jeew zyeb)*$lDA+nPGn(H(De&)_`F>a+vdJ%SLe_ZLPrlb719~VS$+zEJTA3tHt)9y40fh z6(G4-nMNM+wj@7LG(4fEX%+3E-7QI6^~(i|w8KHFma+D)rYEBHL|c~k6(`?Mdm5bh z4qd4aJMJeF|HshA5dxNje+mQ^+Wycxi+~Xo|B(onQCsLj461GI_Tn3f4t@q##wMaI z(I|BA&jcP!_M#$$FKtFl{-g)wP4)?gI>Yn|K-L2t++4E4heeLlyF>Q$jUPL}LP=Sj z1Y#H|DEon3fG0QyA24DPo;Yz5VJnn*@QnN;&{)Y|@sv6d<_d_jhIAy{@9GOYAzh^@ znv@G@)DZ#bsDdY~3;|9BH)TgKla;FMZ#g$A0A5zB(k_47xVp>34j_-o&w~Qtg%}7|mi3 z!LnkbY}`aw19z)V*7u>(di^pg+2uJJj&x3RP5sJVK|LkQ#<5-0)csT-Xf9f$r~?tr zf?;q_qJgJH2SOwDHx{2XVg9KQNi@GYg#jtgo+lErU~d2{`66>Fv*d$z0)9c$aKQJM zS+I+&!I!=*bg(?WH@zfb>T6hX>bNxxinDA9qK_4pCO+O(lObOo;4Rf(8X{Fd*VxmjGcK-` zyCrQCK3@+U0#5N4BmhtX+IXBf7oS0?!a>S=zVppg5{EN{^^fRHff$MCN;`ZSb%*n%@I{sg>JdXL1qG6Zlx0(N(8OtGlVFM_3Kz5vD2QWozXt; zWaGngw1;tqT}oFUY;>GFS-6~8GaL!XmAVR3S9V64PebL4a($6gDr$)xEg+YoT4yw1&*F1Dj;Twig;hgNJZC-^d<@9;`PA>*Ll^qjpYe=g z%I(knWnU31Z|@bXvW9Rd-|N9lLm@?>FFp+aDt3K5j($Pe?^-$R=5{?zbyQvj9xe}z z4KxSxc>Ti9H2l)fHu-{QUt(~5BLo)C&H9hk`dY)-hc`XlA;HQEoq2#4rP=X%EIKK#=v9r^^MMWc#;=4_kbmej8NuZWrd(8J z#iFLpHv1?uF8P~qq*!+SIBb^xF#iLQl#o`x56vTgjVN}?7ph^dD0S0Gi8|-pGVq3h z+1Q{IXM2j!l%~f11iDYI4x3IL;>spf*>V(mwh&zLWgU37AY+;yuC(4Mp4O>sst|RQ zKs(VBV%am`tj%&Iahy8*i)=ggv?b8hyZL8~&aJ8yA&RPkw=i<5TC{vHbB;k+dgN4p z(}HSLp_qKU7lA(jkB6yjM2Njx^1;ZAQE6$o+$Ac%nL88AXC;g=htV^xc zb;xbI{#g4lpb9K|RsT&hgh(3d?|D&Ub*vNA%C=hDK+263$jNBqu1b z?P+fwl+bkiBCL~Tb=6+F(sGDD1NWEA1!+?+!1s398|S)=%OKR7?!Up1CcZK4zuSw@ zpET7JBbLP-uOEc_IN@#_|%MD0lu6u<@_DP30qrrdDyS~h4$7fgm7QP zS!9c`EkfZ#_d^U|qpjxdzk@n_GUd7co&G6fUz9FI)|w^UG~DiTL|!AILu7(E7AbGT z#HwG>Woa6wCp^cf9rz9WN*0W@o+p=*1Zp1z3vAt(66SBo${P4NGE4};y&6Yf(D~fp zt-x~{)R|4Tw82iOFG5HOe%M{F9=E>DJadf(%`gzG0v2C!&${|eHw2k{9a(=$j!Ly7PPEYCWw+G<3+@SE&g-9?oU?bso_sE z!+OGwGhRPveK*8Q{LWxn_NqStfCyj~du6AU7}>}nd^XUFAY21rG_#vYMZ8JtArOOZ@Vs$lP1}oAN!&jt!Z3||+3a+bPb@A%U`>UK-nXKDO+cT>W3MB?I78>3< zobld|u5K*kB~nFUWKwe5-8lF81U5kE->uA16i1xR8^=)%Uhp3Ju0i7~~k zn)7FEe&qeo_{2!tuN9X!wEFETvM)k|wIhb; z5l|;H5r>WYUDWCFN&CFqyHVIAL~BxU4}bZdG$gq?<)>HQUSBNuUEtrazZ2m&az5gB%f8$cvf>A{ zU5=PL@n^w!0ZH?P7QyvBIE>_mFX`?)Qb{A4fwAuI?HQCepA+$qZhK=1X9gO!DX&@H z>Wm61C{h?VGSP78g|8nr!DYB6<=GioEf#cag);i&kc5YSBiQ^`AqJF10bZ?t*Ue@2 z^bCUC$Qz0Fcn5b(rk7Bqz7t)yI1ML6o_lZn&Eaeg6>JpSD~B>vOn46q*g_!jKqO}S zfTkT{I1K`2lL|g7_}nGGk^_3C+PDKBe1qE;1R1caM?WK4NN9xVylyGUZvH0K>=7x(B;uHN_rzq@Hf$GO0 zn>F=fdn4!%!3bW~!}$BVVdJ2Ovohe`F~}p;9|h8r*}h=!wd1ahL{K)^oCp8{c|!o> z04sMb2jHZ~)ys(E`o^z4HHcE&l8NB=W+=mEEd2+B>lAlQg%iWS<=Hg*#UdJ%}F%ly!7iQU^Dsq0$5{Em-rMe@nWP=->Tuq!dwWr z{0zaCIV+7+Yw4djBTL52n1~sAmDt|n+DOr1OJ&(5keHc#bp2w^gjvz_Sn$Gxd6jM>Ee46<%T_*A83hk%hJfvphlDfU-B z1qP`fQgu#|jcMRpO6Oz85VG}E6x)>l6v5gZ5>U?>Jht@jYrm99Dx9_S5Q)cti{yVw zD=}5cG>UCU+7Eo*7B*lPfpYCDHP^?G|73NUd-Z!G8oV!}FqDt{DcG7Re^zNZH3o`U z?rHC3vAM9YJ%4Q{%n7bFwuql-N%|BIH{bVp)278JuO!;>T(jl5}ye8l55 z_a~hM^+@`W^0j!QsQ%u%rY&v4Uc3$5WmD?LO!NE0dn}}QL~_PYLGxeBRTicE#q_^H zRWFmdXZBB>pZu{Bi669hy=o|#zmw4XXog+Ys=WF+?xpYI6Nav6jr zdq?eey!CZHeUBxCKCU_TddBrwBJQw}zThf7%ZqY~DLYC1F-lYl%r^B`um2hUccViB zqX8`OcPb9`?1^6Oe+tGQcBKWjA1~dgUv(*dS+gR&H37{mq)_EOv`pjfiuu}kN|#@d zF*nJOea4qvU5PIpI0}emM7vK~X)B7l@~_I8%pz~wYiX`A7eX1V=z6r?)(b25K&N7& z)CDC_l-c2Hy<`($tC*7+1c)LJKY&-G4Ltj%%bVbmuS)aRg6 zZliq87`S;OE7$Y96=jx5Asljg)Hgnn=ixZ_H$p5T*+(wyJ_Aw_LXvHKg^1r^{3nIK zH41Rimrdr9zSzgirI4z$x)w0AU-Cy&qkN}X1r+sI0YMNP3CXtxbm<(L43gMH&H>{O zR9(snsp%ji<^$>xwh=`VH0i~Pi;VLM@jwzeTZR-hUoz7hDCj91)KLUfiFkVhXs=&* zJ}^y-V-=PUIoD(?);MdOnsz#@HmJ z=7s1t;99U>6jTt z;|KEbZcvP>vf$vL=!<(zwiAOfPk**a6J!Mj-QoZj(R2EhtQ89s)<=`ZftdF*{GYGZVPQq%>cyz# zq~1w_dkOGHnd9Cy1M{bbr#TdS7_BNsuBa0x zgvMr5KKizTcGQxaX=E~<*=^nS9ZtofD85ea>rZ~&d1eA7VKuvUU-vB=9zf-upf^bF z#2b1czL&w==Ev_nh{I`qBm>bd%|{NCjj$+=XRD+xs`8#ys?9<2hvt(Js6X_8%9H(%Q8xqb z8lm;C^OY--X({|QL~`Qs7!$&^$DBQMQ8S#@LoCCg?3FAkgk%E1_pSC8zqFp&}@!lsIAG3*LzfEv53idPMw zdrZadcR{NrhZ#z22%z*|5zJ^hnQy{>a|``o&LRCkwMJOI5f9sb-tXgKnb8#II>@i%?~5P#eARynXn_mIb1o^?L7-d;H5ESFdquUA9j1*dHPM0QLD^SvN1Q@;EPqzdLGL_f5aR1Mx_8l_-top%O)%9_ zT2y0jzzUW%AiWDXPRNJdIwWq$_wlI2_TznyzvJE)t5Q2xh;ed1hjB{t=cZGJD0TSi zxH!huH4pGH$h!Ujmrz!?e5KzE$-o8E7!{XRC{AN$dgte2mAi|t$dByCgGUM&|JM3w z1kAgLxu}i2w~Gf9zA;VtK%Modf8w}#zw@8BfD8SpyO}qbR27B_2z$m7b&TVZSG3P- zKgN#(vg?Bsz+R2uCV6w}CR%N*+2lXh&2_VY0Mh$8qm#V9@)z?|1$P3i88s`?Pf}@V zkNweNv(_O=na6lB*SjL}-D4FY6@#)0v}NJVg0bhsaB|)-Qw&{|F~wmw-G%VVU@re_ zA01=WYWypv7FIU?NMH0mH<2`^{T)Q0Z{ExLwidU0M^^-F>%Jt1F4FwhTSe3S?*tiU zqxr7f0ztIASJH%cpq~3sd-^wSfy7(ebEvkqZ){eDoh%)7co0fGqT{3izVSD&`opP+Yxy$7 z{_>c#_f`%^e%rb_mcV^zXvhXsMxIFZFZcGg#5tOM*wpSYIb|_gqC{Dx-*FU(KOfK@ z@_7@29hX10)s%oOZW5JT$&_Hb4 z{E;p91lcFBBBJjQx-*LT-8R!QkMQU4q(k~-G(3!{bkH)($`|iRV}qnq%s&NDtiqm{ zTB+kYrkEKGihpUgqIM*VPo@TL zGAV5Y2Yiri!Nsdt;u){(M^9?NDTz+VGk+~}+-XkR8*tKeBGr30=VqXnv+!Nckds%S zo(89!DXpq`tzq`bK9Fm%OhQaO*PA3uIx4eHC#gx2N{}jQ-V^0SW9#Zhm?bkAYeqZ* zn{U&`v0u6fojExMtN2t)#7b0m>4{UmCfe7V+Q(E^urFKsY@gTZ zMz+Xwto$!EGJ;-mQUkO(#6^7*2*AgMFU}txz8z$*k#*B6L=MlpC1yNcok30x6taSHs?Wj=`YDp0l1 zy?Fy{(jJ!vhx7wiI~cXdx^0Xgww5L!VB2@x=l6Xs>-X^l^Va{JSu#}pm6C~fft;@2 z3#crKQ{~0JQb)Zxaq}J;&%{sSP_-F~AwkV?gyafbPSDteXd=}I8VI5+bPhY9JY1E3^4S3=bpRb$X`rhb(K6Q+iWKC5BOhANSMe$gc>K^9pF5IKDheLU2{ z#qh>X5N>~*i55O8Uj&qm&YCO;qL`o2JrG$23&6(t2uL{xpzn{q-k(1~yBE zu4PRjV7ulAzbMae_$h)Eg%k>G@~}$jM8x|^mM$s_gS&o zVYEK(x$-hRVx(zt{njUE^LXnGRbnI>AMUIeW5*Y*kBH^{>_0U|@%H_AWJY@%=rw~c zfHRvZZL?-_;yiAG@TJwQ<+n8fb%X^0F}Zoo(D2R5$DhwL4-F7<_(ly=&*^Bu_4>SF%B?sQuXCeKy;?^b)_gMcaBiY}eQczh$nERfHwL((1Dg7I_H z*ARm9nb*@6ao^xGul23mRsXkS*2+x%Pp>)?T&+_>``7g+f6*A2#xN6~#e7UqpD{${ zc8cF+>C&CO$+lmw_MW_NT1pcEL;EjNTpy@?Y;aM++e2D*7qz%KC9`( zLMHeBSb&^Zypsb||8bTTMKiDA*GPdyq;unc4bF)1{}Kl(_|)E&BYa;EJ;--VhE92>NJ78ovjE5?gFojQ7CUG!7_IPwsy3v8+^Etmt{UvQ!Q>Mo;*w$jQ z)$>MhZpT%kVy^9L zK=H%K>+i^~&m~+OagGKB8a8s!R@yf)-oM2f3eiGLc6J?Q;iVQOp5$oc<5nJ%osB#V zLSMTw`v=8aC8=I2PrTxAey^|@!uY$sTzdNz2wZsi8Q*o2+W`iBidl9gFshcSv3oO%Iu8oEig2sse%Uc{HOajdZ#6&*W>f@eA#;AMu#3sD%Q@~z- z4%%D($AA~Fxt|q{Oux6ws7^&9mrXckI4r8WC?%^;U$Wil$c>FyE3`6BY&AWN(CceU z`+{JC3AA`ntLL2TZr>QDee>uJlOgp&&%A+bjc~V06&8j{Qx;!AS@zgE*nu^%MI_dBF z4T~auqOe2M$2M2an1}p092~3XOOR3k_PszeVf@fN`~Jwa8MerHQVgc7!Aa;c=3J5V zuDOa`7P3-_s^OrSLoVuL4(U>TdAV3AZ_ra;Nz9Ks2dXBYr>7MQLkMd2@6PJ9Z>J52 zrk`r1fs3RrHjUIoH1AEc1IdQ4xEP{ zpO1nkiXwqo8s2P8tN#zNq`;qR<#C>YgL-4h9XsX+(6Utl@^A<%MliAh^5l-7H#hIw zkz;S#68r6cuuhlyz@F>vKLQS2SDL~}IZgZ4Gz@fv^uMY6tT+R) zjPah3q|sRm_{LryZk)BI#64m-EVRAI0z9o81QDvk(|1>)=~EA$6y4+B&q+zDY!uzn zx4WX^WxF4_gz&l}=T{EbxH)4YM-TrEdS>La2}eIeX)n`f`|3*A3Y0 zS-xvz0A_;c=KCC(5LX%xyA?!>^Zl-Vmk-pu-GH~X`mrr8nlbs$y_S4&-m7Hk2!#grh& zn7M)~TD=SsyIcV(t*_#N!}$-0nHc*fSK~zaF^iUyB5>|0hv2y*sTH+EBG8rvyvT^tC+eRNLgy+t3n5u~!*j=B6aL(VGj+*=?VLgMb(A5ewY&!eS zM7Ye7-&8b<@-xvq?3@TGS{+xtZ!Pl0iW>$X9Gl)Z>6p3MP!0y(eaa|Iy&rLXdd1)gM)I54J!|w6k zfD>i3nVh7_;S}}N5v0zV^|lR-7&%_O$q(0t&2lCl0aN07n6+ZYgs_YT03KPkwpT=A z!X}xe4jkVQ21T0{rnSh3%P>xtUvzCP@UanW<(@&If1d$)kLu2Fb@sqJ) zo`zPWS6n-?D;QcsUZ~z)GiEh~(2)?j8x*HSv-W0MRh1Vo#4dU-Jn^5>S>EGhZBniu3w(y>COT%C8+Rg@0XjTlmX&I#D@G2Gc^~PLwKvsPO+a$IoiV|a( zBXsQqo?GWmECSpe8D-#QtIm_Y(>&|BA3y*yeV&{H81KH+*4=caP2U30U)>nXhf*e8 zXyga#8MNV5i6e~~xES6D!LKtzQRFFir@Ma*XTtr8b8@!skb^n1^2lWVojsIqL~moD&PeNq&kECnlxYZ zOaci8=+qY3y+?2y`qp~8?ir7I&E8{<dUEdf0#MtgH;E z^%?z-f&zI*t(SjY?M3@e3=TO`u|a7 zJFs9+h~d81nmabVvllkwGN{)3TofKI8g46C4ek}>B|@HRFw#En zV@=k&C6bSt5XIwzRB$)HRsUzz z8aEOTg-B!+-isy38GGh!!*i9V&NT^ugsp|gB`R+of$EpFvx6I$9p5*dpU7i$&rGM|$X(CUbkx%Yee!5aN3Z`%W~I49V^BuD#D0 zSzoMUcB+>5(0DF(3{i!4cW!S4GNNsTmeURVkL0Id_qD91;u?Ys; z<5EW`ws2Sork-#jYCrhi7P zWA=e;;(0N95`~g~$2B+z$TaExleQ_UH*SZf7*NQ$b)=|zUrInXRzvr~_2>f8Y@r84`M2d*ttbi2x& z1Y!5h2_CluKf%nQdhbo7WjX5#n4umPH?y!CPaiC5fT3I*$QuKjZ=Gy(*sb1+wREkuTf z;M{9Bi_ocmB_C$?-T+Y-1~@w?rL5l}j&Kj+Bc`)f~U z*X2FkSzBBIItv;#-d;l}UcxR;s=S4%KjVMQ*~h?6=T2MRKgE{$^aXDa+sOvY?w}{W zr@ww)xFx8T+lIg8HVjbzUDpB!h&@;eZ05g?Q-%OkPJKux!wmsLO6SBZ_rzZeUlRh7 zXjL?|ew}`lS)YI4x^iD?FVJ%^W{v;UgN2{@RC$gx{D|TTXPZ%$1(L9?j+S z!~U6oI;6w~;jtlRS0qfzGd7{KjlS?aef#Ozm)lhnbU0^kD@W}Au@BYhT>4F~uu9n9 zew+i?$lH$jc|S4O1k{1F@X-&5qzLwV>@xc^=I17C*^?6B<+;5VK%a{`Z3d0_Hl%DB zJy)Cn6$M2=e)jQrPv!WtG`rlMONkU?c zY8kW)%jJ)eYNFNkjf1^Z00zeZaV<>9a4jw5er*SpUpr5Da)q6!*j&g7NK~8QWIj3 zX}~N8tlUEoff5A^?t4`JCF?TZEwEdmdRrzmV7V!3i|8((apSHSlby5Z+R8_>G%SL7 zV^gpDKUFizF7p%&bSG=h)#!z2)JOpIUlZZ*&kWY4RB)3`DVk3mKe^<$yDE+R!#*(Trc!(W{ei{EV%9%I@*RH>Di} z($wSzeauy;ov;&Q{HrubT&Z5Nu&WI~ZzrqB0W~L!SASRCe>nOw4L`)JY^4kr!^_`w zp*owgYkk(klzxJJ?tlK>Dn$kUgt-;7u`?I?ncDOnpH+JVhtjX%sl_2}NiS+Lk2D8s zK87~Whkf&$@|QSgcAHkpS#hxX=M4WRQNA4~K!SGZ9Ohyu^@ltfu*xckV*YIdQ0w~a zc#L=ssDzQ7!~zCeeD|w>s|xzk_X%yydO6HGUv842>*vO{GoAf+xL%jtU+ z_4bX{h3?(aL-CEJWz{V&$-o;B;unw!b%VIHBeBWpnv@CNTIlq2%iri*DARVO?|vi) zP?k3&UBwk8zF?M1+0uiFN>ycP`I|tMHw-$kP^45)>5#naY=~<4l-9jgNHh0qjn~^J z4%H5)K0YPzGpjQp`UZ3I9_v0i&sp7f-o7@~&+nbiPb=|Eu@ls=z;AMQ`}omnw=J>sK`z-2G>!|!L{%Da_8iBEOXPX zpN=ahh#%e)SN2kzNGON>tG*c;v?HkfpmQchUYHKCt|F<@0sU-817#aF1l8*ucyKkGt#ivI=QEY%KK24M=^Yw)w`@FjdYK*-yY8XUEwsjo zUoI<|=kDfnse@~e%=OsRJ$aZKgHQ(c3f2&^+x`|xv(U!sx%Nq)Es?Y6?76}lT+#w1 znS`HY{&CfXj5W6saRJ*CbC6^c@^+8r)g^ekRvDL+reU&c)|9M;`q_o5eT+_&w597> zD#sSk?GtOLPMY+aN|lr-I#UVNlr2lcI5W6O6l*fmq)d@_v0o zk?#uBHGmCtm8AlK2NMe3)**7Rcm?``OFrt_nb!0;f1;27E>u{AQ{GS5q7uxyf&IPm z1li-|4#vEOiqg>%HXj4yFob!FWB%ymW0i_=?5q9?z8xi~TCqsNhKvqMM9)vI`)Tn< ztI%CU$kR*GGDMGqv-~~w$^oH8yfkQPo~~_Vak;W@I{|}fFdxbzkD%V_#=_Ku@%Zf{ zSgffwZm#x5u&Fo>qgNzm1+F`LO}W zWy?ZqJ{T+MzYESGq4^-FgEQkrp!=#vz%hXSNqi=NHcYLCZj>MjP$IDB6`ec$yx|3Z z+AioU-Mpr4Jg2oFemUM<<31r=#G}zadT6+K%kRaqkw(C1P$R{kj!k@(QQqe|nJ?Dh zXWT5qtZt^urLtpjszNpl-@zPizI<`igS<_D?po$SvFqYNqr9$+osM(yL@U;qD%Cxr zYgx9iynLu=T9V&j18c%J;Cr=8_*NTuRXo zYkO;+L_Mj~!k-`eqb#q6UlK6{MUzw^E3IpYBIM&>f`tMeJOPgo*`or~d>Q}Q&#ijz zcr8XLSkJG53B&wUbSiVh>>_OeIyAJ~yo$Zmm@B_1+h{<~pECluTt``_&E>M#jrYb8 z?D-~vPF(s*x4o(o5Ytjy)-`LxSP5P!ik=(nnOLi-yji9Jc@P|V{;g<&M!5FxV(KCK z#3w>930jwsv`qUBwZM5|z#pD%;O8jo8u9GYq-Jsco*%2$qFcJ#IfXZSY zv1LyN$JRkI#NyJe>sOWD*P-#%iS!5?gGgjAWqd*On_s-?q|HtMU+Ld=zj)r%t~ek( zcn*2?Cf@$V2_fI;Z)j17E-^`|=!U@SRDR)@&=shnzE4xZ+xfshJF^<86$6|cUA6PD z!9&FL#nB|sv|7+>>yJwK$N0%GXttC3p(YE_uE>r%l7|1RaPifi3~5;4EU}TLnuM$# z9E752{6RHMQ<_=F?r*{=<6}+2%ovI$X3w{?*<&fqOLeF=98a=K$&Qr+zGCd7$`#yO z(n?!$VELzy0f8O*qWjs096spDKY0^7C|lm#98u}{`MS;7|QBUS~AnGfz^>hD|XOL&)7r)(Mf9_uU1(s zv&?=^*dnhs#4ix`KqKP&aqptycu~Z0fEb3`?+z$yme6cqxcM{A;d?{mt{7sp)}?E! z+O%-%kS?t6KL?MZ;6qdSIFlp_R6&0q zCRLC&gvy|bL)<(`MX;}MKy0_g>SIjck)EY`d9A80;KnjJNUB1Zdu<|bBMN~jNhLH# zEYJGVjke_a!WQXG-BTgNnzHlQ(^>SFGC4@6;F^eQ)FK4cct=g2y*7-^3vN~~O`HOJ zYFr6%F*?eQ551%)XV?Z`!#!z+a+`sGA3mA9&@LRT16siXzZNhFMW|{@Qg>1X6JRMN z>$h{-RAWxJUP|{jrKQ`0xy|lBl@NgtT<>vAgi;YbK{BgtICIumy*UdJf zKEg}ulw@HZ+L2~v@f+W}&-Z~tTk+ETmnvT5s}vcFF!By@$iI&VjpjkiltxNmy=FSE z-=NHqg#OlDdd%a4TWF4c`cN>E3_JX03-9o>*9L?+u^?wy-by@@Y zdIH&A@RZ*Qo%deONj46s6_Jjv+-5ol(fM?8*leqfarX5xeL|>z545V_*CJ|v4>fj? zquc&l&pKY~w9smVkz%t|*Db_cIz!?>Fo95%cw_#CngZK-QBUMcaGXWcQ0#u3jDt%` zR%qL|v#SroooIymOx7mTFHY{HTsNpRtS$d46`5Q?k9tb9uro9I`15?RKG23a$?{<> zs_SD~j4v6uEZM7=bcrFm8}h;JV_)Hn5*o7Eo9;6#HNWleWM5&9<|LRpbCL{Q2SgYM z0ny|u$s1LQKu%#jz23-j&EC+F&@Ei9e$-uki-C+DYy^85MA3KwAEKGKq=Mo1e`bFaV1AWy>Y?%UnF&+00}g@_o0)?LxQ`K zUdzpcdi#?7I;q@2bKA43W+D`i`d%{>O+%Yu;Kj)pD~u^V@HkR_dhe}pjJdPK32yco z-R=Se)(Lat!_*nv!bQa~XwBYulR6tPiN9tw{FVYic4qiIBV@v@U$dX6Yan}UjF>SN zh?{o!Z5W6JiLF5j#51r2xzluCAj*g_4jv#`cm@ZL8ZW|T!C3^LL zNcQ8AtlQF18`=PxdCu62ulO;960LoqieUedBO3wgJ|D%vEq)*ch)Xa*VV2)eY2e=*3N zn31izcl3Ql=y`08eQqOf^Dx3~Oe&i@D0UImees8K5^U+ZxtgYXE%{VuvS(qCrq$NJ zY-pVVG=DT3qQsSAYex}=VE=*3v+eHG_d7x5_C^B|#tRlR{4a-lpW}*Y?O@0a4Vz`b zqa}S$VcDHyEQm7U79WkRI=*9Q6}9Yr0cK|XPMCz>h2C{AoBckY&h3mi%S7+KyuvkP zA4txIa6XDwGU!kNc=?OcZcjw5gFh6r!fZD3J=CtllkSF+*8(?ah4i`-(1@&~>8mbC zm~-=4$=cwOX8S1_oJkqjV13kfVME-4ndGtDDa;hu@gSajwdQ>O`fkGO7tkP!#S9v- zsqW_{z0>e1jY!oslYpT9Vs!;4BUv@^H*qZ^S^m)qQEsKC>C5+P3B>uAPyP_W8rKX? zUb`-mSh;aNu=h@^6Z35pAo?BI#k6jLEsQE>7~54@%x%Xi-FX!pnR&63;rX7VrdVYOJ=8TVuSeW5dnOFDxGC*)BGS9 ztI4ie9bM*Vlv!K-&Ozh9p2frov zz;lb|GCvKjs{5@mG$JjYhy&(q&L1{uj>d1L(+Z>`T?u&$c;zD2L zLzI@-O!=glax80NZ6+fWn%X}+3A|3-8O?D|$t>`FK=e`ttT2&U1X^I)8ECn5-eVV( z2b)z-f824)%%8sDTdJuxbq}nh-T#EhfSG)vMBW(SaiR^t$1}hVj*0-(*Fsy^AO-|4 zj*42v9Bt0)K`XYzsyR*f9*e2hi677(e7YeQe8cq0TxOJmRxeu54`fT$VNGd zl*AzUWnXjEm?bqbua*u!sNSS+62HTr!-rXVzkR=O0qK;Y11tDXS09{O_CVu0WpS`3bv~KJnZ+5g7{08&PRBcY2$z`u)$MuZ~y@lcvDG00Lt z7M8mW+PONIV1u!xlBBS9qa+l)`p@bYM|S9NN^`PR8|;CeV4W=l72!31St`cF2)rBB z;E4_4g^K2uZ3tt>nZwyu+Av!swyEhK+mDh~*gT1ba8B0E+o;RwP^sTjH=ttVZ6o@q;nvDLNh#V2Lv};L8vU>Tu#%)<;wX&zZngfKVUTs88PwV%$+XU(_n1TWI%c#*OIn}Ss~ zVmYv8kSQ&s&(SAIA#%}#Iqu!Jpmhd|^~;fNxcB174i_V2x0huIQ+xV81!?X47*1b; z%KjRd)^^HKx;{HFu99O?g?Qlcucx<#u;Ca!OeL}Ynx1=Dkw=u#ibZJeK#N*}1xqy2dBcilHPo6Y~UxAuz2;R;1oFYl<=euE6G?S#UFXq(qYv2sJ zT$bHx#w< zU>*J2`i?j{FYMkO+6RkBhv)Pa3I%v}k5$5|#0zcFLr3={<5PEpj!~we$XmD&j3{(D z7KBL;IA#^ZQkFB0IdICXhW_k`p=Oo2@M72$^?NzOp!?T2j#CCRlZaJ2bZ>^Vq0Uyu zbrbh;KR->dwjhTlCF~HZ!#CMMRGL>;&xmslx7b-dfBd9;EBQL&A_Ao%h^eiUXI)o4 ztaS828#Sqj?5JH^)W8i#Gd~d`Ct>f43hshU>jcMc={??C8q27G2!4pd++;ng-q?q~B!b# zKHLoM9bK=^yVn%XCUGCQ`xR7;w@Mb}DXF{`w75qp{-M#NV>MX}ck?1kSlKh9h{~KO z7^#g20T5=lJb|!{B!X?N3KX~(zOTEOB@P`zGjU$h1*d#yb79Xf)^b%wLrQZC)p)X{ zE^6*y$!AoBg*~)P(xkg~l)uDD8AOf_0g$XcR&NZVJ?auZImSxI;H6VgH!zwiMh23b zwtx)sUfwD9Ux&k1CCW3d=+0b(Y?L{N0{{Ma+tRlL-h%UZ=Ze?Hvs48Sd;`a?#y{&c zorI5Mw^eu0cDJjNJT&B+G^dts3ZF_sNa`fE=2bj${9u)Pre7gDdTL67!*9Z%gaYu= zT5A%;^uKieO0=+g9~NMF6%9!9GS5{($J<_k9aK`)jr&*M4}yQ`ZJa3m`z(JT3k>>z z)@NSr-ysFdJr-U%BN}&htw3%@e70hncBP%6-ti0cag)bJ(Lv-0`a^jS`QO)ALP{j_^!o6lU?43Cr>`hem~w2Tkqy zZ8{ywScvJ$=vDkKULklMZ3dRGpneu+MR;RYc2wB6G#R`uQK`r!K~!}V@HBbpCX=*{ zh_?~Fh&bBX%w6TpG(Xon9n4!U6BoeSl256`DL1rHv(o0PVsYt^W>fwUDcJFW=Bcl! zWm$0JWOF93JRjpHT&s;0z^0oWb1Cw#mN@(LaQ}JsNy*_2Pv4lf@yF?;^A8yA-u1Ap zT(yWUI{m)=>Uf{~_a5OK76|3*A!2;es0w|mn*1}{(m#`@ObQV+4) zoU|$#Jk@W7KP->8}7l;82Zag9u_^L*Q^hcUXE!C{n)>Z5*^>5?7F!=Z z$Ci&KeyT_4N z76hN}enFPBLbsrNSmov7xjFB zZB^cMy>Y=@vR+|33!}AzT#nr+5iJ_TERdgYuG}br;Ul~H!wWzZFJA>c;o8{!_%3c* zn`!ONr?jJ{?_v)-3A8oXX{lkjtDj0?P%0TXGYjV(cp_E)OJ{E?XU`pR`M+~6Ha^Sc zA@8V)-Jl@1B<58Np0&gg7e*3Gut?`CYE*v^whNW!`%;jh@4_DktJR|0YBZgbAi?nm z866{n6SLsh@E9nUL&i(Jf9`IXB>?_Z8~)kp_A6MEI^*3os@r*uEWs?Fu0K z1U#qhuIAJp;7A z<7eKfEj(UNVV2PS-(`}Y68#t0B7(bjiB%~dd*PE-cUR#s=1o8_Vs+}$&|#FnBwO}Y z@O3^L$Vn0lObzZBhG1s2!F@pQfU0ww=kp@sOuEq|ld;N#YNqC=U8fTOBRip@j6hZ3 zM!r)I7rbJuJP0+JoJ0Y(m3!bpyO5`}Bj2r|saQY1ps-6mF%74gZMp)7vhJC?zy13W znAPb#?7fu{Tp5;ng{l5Tlwy#IAjFXhDaxGi$E2C|%o;g@PksD;FK;;j2rrZT zyB*lSxCtcyt%L(Q9f`fAl+&ES1cpv@*Y#Dt0Sbfc>q=flX9CY=5!}H*F{I3*|DJ8B z7HP}sBLT8&!fIM#!Pzc!sO#s~tWSy_1s$ch)DuB2um&n0^!jEL<_;KdZMkrg+;}4O zQbe#@0?0rf)8x>7`kTWoF9^18!M-JGBH@TD!L2L#yz=1f*JfUv#<%43IPpYPjuO#q z67d=A)HC@1E-?7l%U&jsb|kinQQb^iWbq`sti#_OWwT%doBMwu^(3<#3~tL5lTet+ zkPbr~LMw+R6IS@h#z!ium|v&vtsu-XL8AB4#NymK<@v_F3)|e}UV~sY+Sj0)%vmmLD6_IQgau4;8f-5NSuRQZ~Dyu|? zd^j%^4prCKV^j{3Ox!qkEn?dk*%*>_MTb)!oU--~O$0yIKGaVQmq~{2eP?~*vPrQ| zk(Qjk`O~8cWdPXNR;z+w_5Pikh09=EGwr-@nnhIcLeOM$1Dyq(c2ID z&tk54-Ft6O1*SAN{9^atEFMIRi!yedPG5HLz-Q@iC2xbr48WQLL!$@D-31ls zSqy(|3+#`l9KKK(TPua%^NCV&K@Va87>oZM6KRL3VuF0&VCf81Wy-H%N}1Vzd$?d~ z5<*KBws6N#pUgAR-T$ucV%A_>myfJW&{u8SCv$Fm9#31^(nfu>TwGq;L(!JOs5xl9 z4g9@#ag=+Aduxd&76HUTTohjja$_>^O>U-kmRmL(sz44q0aiYT!1ul5m@kI<8h0%>rm3FLIAM`agZfn%jMCjjbQwFAPI{u(uKT zfif{t*Dr*T8-H;75%9s5Eu?vD zGNh}t({f|s6XqQILYU_k`bFtOa60~Dal$$Qcx0*n^jk=NcCBqEyGFjEswUCLmSQNC zElXAbp>A;$S;YF)HJWlHi@y3jfiGhD2~pDec(0u7#)Y7L9n$eE)vBBR)8+kbI?ZIZ zD+<&z(O`?fNibBNY3Iy8>;Q{)fH^Pr9ipt%_Z1_U0D_{`1dhT2HnD*iouwfSlP&bX zC`DQ(=ku~Af|;i1GE?tuE}b{}ENj=5ogHc-#Q8`3>|@f9&X99l1XEp?&+zmvJgncj z0U4u;mB|<8%{;`jUW225RH& zie(9va z$*40eI|A?oD`HbZ=<;muCV>GFPyF4F4q}d#+m9VCm)Jll%uG1zNCjd>YVP?-mjQ(! z;~{E}ofmtbmwa8e{U{@88&!n|6b!zQZf=NX?uc$(p=`b%X=ly{US!+v-*D}>Wl7+F z3GZj)--$aycMXggVXa91H3y8-qBvE!>v@!6N9TPKVD2Th><4Im<7&2GyyS?Mup#0) z@&;L^g$9!(^CAxxXuCDo4Z(InOGE`!I;8WJjuJIzc={jXDH!M{Jto;d(FXnqzza#0 zJ|P)c2xIanNsF%)HQ;C`j>e8gc;bEKFL~zH^Rp$gXg=!vxmR4K962(xAkuAubHA6Rx8ql+gtFjOg z<>P&!sx*!ef{Kwoj2AgzZzfA~^aN5=hbLpq4v9ll^+ShN>3%NsNS6zv=IaalGm!VU z*P~X}jE}E5CHa>}*kn%vl6aJ;en}!ydv#*QtW_;!`<%~Fb7{Eqo`RqY<9|STr1ScM zUp_E`$<43v|Kl3h1L|xpIF~=j^+M~R!??jPlmQ}RJ&KKtf zQ3YRSsUFtTSgYl3eXhl9-26dcB=Kvo;;%=x69h~H_)F01ruS|A51k32tCbQ9$I7xv z;YVO{U)hsW(_wR7S>F2GbZO++IfI+^jmP+^;L zSqRHqejogE`3e8z2t4HnyRGb%wf*y$;*)yPizW%3#ky00z_Z(a|8dafF=JrAh_sR; zbRcK2j#S4AbDy2v+A130Cu%nWa?A|JR!QNBu3rCDcbf#y6$zFQ@ye#LWGO@R%0f>^N-?02#pZ2QhYX+4XlF{<=ZcVV-~Z0dzorN| zdJ7a)GN1+=?Zi}!$*R*<%ASm9I)4FbD2Rp~X9dvK(Z5mB1zuk@P5K`ab=CwAEHLz- zClRU4>`S!BpAkE>VSbd}7a>iR?1s-baP}5gVI6KMj|DvxWLDZ9UdIEw8P7T{@ z0pCq_nogU7mV{|w5UnP-{~2RN9sZN&%}?P0pqsZ)&dr*?spfeXxAhFgMYqZu#{wD8 z`WxLxXub@*bVlp3zby!%|CFb6x7-Km!C_>o-HIDteYsxT_5nuo;=HfFqN%9Q5RRHH z%*!h8AHE~qPg*)bE`41RoZXX6*@FGZj_+%5YL9J9*W^Q*%dNNWi+$tc$OL5`r4@vC znE3bkAKXXov=t9L0RMP5bw^<+7!IU_VMz9Rz0xs&9DT{)^)zfENBlG|>Om<&H8Ujg zi}mM$j!@WuYQT^-Tx&OPP$eJeK-#@e4<{ja=k)vR2!I)W7rj{v*#p9ZPw(r2VIpZh z9NRNaF)1R(6m6?D-?)|Vg&&P5_}n=NR^Cf*rqdgT)&cGUJb>Q^oI?5p%=XN3bOaAQ z!i|x;IiXGU!-_3w)LpplfO>jdTxM66PMkkZUpiXv@eQQ~ z#)8SMG?t}yZZjO8<=Y!hM?#aI{5q&%@FAbq5M@aKGWz05#pZjuhhuF#buqv zU&DJTkU?uq3tvS1V|3mu-OuCwd_KlWihzjGW7$ZDT=?mv9`skig)^D}1G~1#sYw&N zgc8%cn6=zK~|l(hcUkvh73ax7;9CsF;zv%ZZQrKsY_RnS~Wp1^eJl^J4*) zVT$56VpCCE>hFBS(eD>kHU+1hrZgdk>Dx6)g|^kyhY1=9b~(fj!OtH7rlSe0To$B6 zOS99S7Tt*ah)e3jP_u*|(@Qr^Ti?)g37~b4^0|U%@@2n_$Q)p5Lb%yqtI3K&9eIgg zZ`Nsd9}`v zktr>V(At|xHw{W+Uo#Q+G_L(&yaKlnPrG2E?i7|j_`HpLk*j13@=hKAdR=Sy6t}w- z9er>UH*(sx@z&V7a}x#n(cq)~EW_59T&XJ!>GT{K9^-~UP=7fr^h5Z1;LNxZ+Qrk# z9t+L{eDLv@^XKL8_R?6Ggitqtc%vP_YL#@v${YpY!W2C>Y^t_Tkg@LPWS|w#Xs5@V z4i_id(n+cej)XR!3z(xTC6=tG2GU6gnCw`+d@J~`S0;^COp_9X<&|IZNKL?C{s`4Iqz$uE^u?~JSOz~`BI9$*t4<>5 zhIwdvHOqYB?17L;nOoKaT~$8`FS-(8?A#E}w1@w~if8SA>1>c3Jb$Ez$O6fNNUBPZ zWIqRUYW7v*Q{%kYhx6L{9q0pPlb%@$goz*&$K+yExg zEoIJJitx4a*Or97=o68M#ICqKj*q4LcCqv=w04SD$}$@C+ZW0)0v0eGAJ+{)C%=1Z zzoJqD>Ff;V=m_91r3DM+gH@KgKhx*m?qIqlF7>Rsha7y=jR=kvGe+I=$C=d|dEB(g zOVH)N@@vBdWl@bx)~F3P5QZS(T}Eikoa9LIaxVyxT}e74C=dP6to1)}Yg3rr&-LXz zdf;YgufEyWh~R;q?ZP2@S>g%_u)puMBNKHdBUIp?)62m4Chp@#hN;D=M|O!frH?Rq zM~w7IpMDnKsY4LHli4ed;V^ElpCG6gM0}HBV@3#3{NezBB0Y|c7MF?Q_(GOXdSzKk zASOf{ow|K1m?%uvNW@%HYbMaf>v+}hLl4NKFY?Lx{Vv; zYM>>^w6AujX!{ysbBnHMWD5Dci6C&tRV;I62MRHlwI7?h`0gvTW4HR*WQDu~o?NV# zG*9?g8lShAs$L%`@{zFVIh;ze+>fTmFeyN=PazScyyo`@;HRu09ZiJ!sEoeWNwAN? zf|fH;8pQ-;f74xgaOZxjdd`Y7(P^A(wR?hsh}MCafE)+_*iWTp+w0;P?^t;+T%#B8 z5X8`<2X`@xeSGNScR16QM9YE)LQOH8RwWc|*x3WdtpKH3W`#yQ!ERftW#v~vPZ3eO zvH{vgzMo(lkX#s)6@}{{!UM1no5*Pt0?NqgC4{ElwbLOO5$Cn#C889S*PK;T-IsM!0NQGJS4Rm$Kn9HzVwlB?f#qLj~gOd&hpj0 zuqBv_$#D-l|I0(|jVE|Fj9x#|ZsvfSbA|~eMVWuIT}3u$s(&DU5*o5I6K3$Nta0f; zLdxK;&nu~>hT|30QD79|YzaaP$5PtKa+vK6TB^&a2{=B@Om+|5-n0g~UuvM0bCjcP zNy>)2B)GM(vJwsK@OidXsAx(+&10>CD*iWRijKGi1Q|VSBE|+}cTcdLlCo_OJKSy+ z_U1)T2yy+tq_#r1dqP2RbTz;_Rb7ctW7>5n{$7ra8`D$)<3*Mi+i-W2^26=*kL;8y zf(=^^pPmLhT`_ET%1L+hbF>^x0T?t8BO*u6nFN7sT<3#x->4`^2|sqL@SF{I^sZJb zbZ6ZqJ-bixjs)=zGHa{#g9@OQ%~4P6)~$t&+Q^-;BF@Q(9l&_U|73NzT;0qQZoA+| zawDzJ{UUVIj`MC*MD4}hzZk{Tzwe+I9bR%C?@6@-*NH|Ih$d1k+&x6$Ia1(%I8zIC z5yOg^c7SM4*>n! z@MI@V8!K26;O!w;3SrEMw`Im3oM?qaGt(2HT?&|u4e3@^uEuY)EZ>!)H3n^@N)vvN zx4zQ|nGrQ3t1dV6l8gKk;sK%z-fKshCcEQ-A)Sq41aBe>a&UlHFMiwpC)es%0kDP4XJS}44Pxr*|cc3E0cuM0fuGFK$Lb|H0pN||Ur^o_m~D5VY6 z;7Sbr6o%<9JTtOY8y$2*2%+rKhMz~ay>tIePC^baFI2|)!P;Zq9+}iiRKJ7D9O{qj zZ#8Nsp-vDG%}bQ-=GMGU19|_JLtA&M&*_QlsGqIV5GJ23{o#GS{Z3$&rwogcovy*u zOfORA{MDBLBDJ?P)DwB}R_5c!6)FCAKxF1ecv3i@KRgRy@VHF~5xoJ|GzqXP&3*zj zN;u{)k$Oo-dccyEw*|g$Jm(bnCe?+eaO(IJQu1G=6hM?DjWvNsD>|wc4NUf=NPy@Z zc}2gtB_`G&!JgnTZ?0{cGj2fT>LIFh3z^RFnZHGyh}gpjOpy0QGc(5EB$mU5a1cI3A|l z71BdYr5B$(!kJd2AY*TGKU&9i|5S8(|ywAfHK~KzG zpmNHeUkzI+tmO%sNI>!}vPCE&w%}`xg->uw(uVure>Pj;w6gby=TvfOSdi^QbTzbL z6poiOP-65hG%9Cw4Vu6TDuf&piNav`*<94$(A7J@g%2Ig4ZW%Qy@4~$QRXX22!JpB zA$lF4Z;$(5={Iv192Uq;@-#fX{7T>tMk)dlgfdc;0xr>^ zmJZksrUZ$OW#|Ou4HRM4b5rDf-ayNSbRw=5T#AJutUe*+428Y=)Hkw5+E;BHvtbV8 zBQb=z9S}tuz@811#!vxd6f}Oup&J5(WoIL$;N=n~^n#@MIVk|Te?J$E(Iu}(1g5SA zV58$oz3}o==!9%a>gIc&dE3XO+CJ-h`$52#toI7I}QwIWgUbCVnueeJ0*{h zy4`*_I&*d*!?;{UU1s6!tLJ>2H4S&$R{xRh+KG4-)uVUYEwfO~cKt0zHjy=$U`r{9 zeJd9blRM`NRgnYe+*dexO;93D6js|Z!Flf14YwL=7D-Z+Zr{4C5JP7x)zQB{zifDk zLy{?|F9Tz}q%)mM(j*53gJo$)ED|^q8A%B>w%3CpRp2*4Uy_q_^y#zP$k_;&1Qy)C z3w(r3b^y41YaU~9tU!>7&aR8;DTr0t_W4>+|FB%QBnv4K)=EnUoTmO3wW8=K1Z?(@ zXELgsCy!BgR$;2quqj*=3+$|GxC&pwe`jLv!g0HO3L&hPFgBnaSTJ1ii#bM^{rM&R zh0)I6imh&fMyC{h-N59uqSof+=QnrhmC$TwZX9guj^IbO@5HS7QafmWgvR>A|A86P zPPjb(5*E2r*`MfpCo)L9>J3SYBVz28MI0U&%24SK6RpQX?9=I*{A8H2P~|U*^lkWL z#dbqT_GZX7p=EMh1vEl8FkBTxjb~q547Deb*^9#UY~OaGxeorLY19YIUJfW$#P^24hJV*{Xc8ESf$P zsS6CH5@Xd`#x!UWYf8|)=@{%I2>!L{-w_vD*XmB_UpwfnUl{K!ZpH!k2jBJ#;W}tT z^QLhD`r+&B)1~+AB}v7kuz!vIYx*ZwAa6ASC?Yq&XbKQ6Ib-}0$mSD5BYmYErb`l; zC@W!c5nI!pz&oNq23^wB4j$LQKkVBno z+(boM8|$uu@tR90wze|)0lZk{6ebe#rm%D+KGcvm=% zu?LnvA`u_Hd}ZWO{&D!aJlf8ErS9~2_-2*$-s>1|1*uOV>5wmYxh_oFQEhz$NQ|T( zIR4nPr}ny01TRys(j@TEvK-bQO5BX4`_D^b`KDDKUHUrkzv5opFC#3w@%23B4yKu| z(rVUV!3EIV^7OhPzm>mDD@eo-Nb$P(XHSIEW&Gqw;C8$3@W@IH0`mh<^a}~}L$;NEYmH}#Lqa;! z)r@g8D1=K##&)K{J?bdj-Mr22^Ls4y9c0;C{Nae>U*M#cp$rq zcztM8OHbtZ_8Ynvyi=_l^;2L_*yNbrj^L?^YQiB*|3HqYg!eb6w=PG3MM(8-;G&20kEIe^0{eG7l+8!qH61CQfJ$)AnY3Iwq=5ix z*$-GkI!ZO_(Eq691{R6^0@Q%RDic{GD&|U_%~Ks~1x+aF6U7F6gSq8>OxY~c+eL2gAe?IWizysd3E9fG52PC~7h*j?P)e3SI!&8N( z2?Xu6E`ST&t>fe?Lf#FdbMi;lGI`_igR(aQ-aFZmCuA8v5LZe-ObJ46d<;~A+Q)=Z9i%;iqAB4hxo@i<{mnk`T zAF@!4=C99>m}=6B>ShgU=pgl%uG<*;xxVZupBRp$9B#m1LGt+OA8K$_Rw;~%vMfZ* z9KHef0BDD{i^_(>D$h$*@Y7>z)& z|05xJB`{23tt1N|rT<=%cBE%21bBDf7rSwRE+iA+d$28L@xaXLwb^?kO$kHGHyF|P z1o#y@CN7S-FSi_yevke*{2_jF&RrzSAn2hxNZP<$>W7?`(XG$%|0C)wxT1`=wm)>Ybi>fyDP2Q1N=rz0OAnxcbVxVSsdS^Xq@?6X%g{*I zdwb4v);k}7wT3nOzw5ewJChN@XG^*8M*gv_J8#hXa@%K&;^1Bh9mvt|gfLwDfNSg^ z))T3QH>zM)1VGP0WqWmO=@i*cM?CFvT;akxaIIT>2y2A8Fs{Aeypr8y35L}Qq%(gy z0gitKnV4*e04`u`N$1;ZfPVN5`_cYP#}PkN>8W(Vu&BXkMli=2cdrPY#|Lv&@2Nhm!{lu2`JMV+|ztot#6zzFM-N|YqjVH4ZKUr$4 zcGQ4li2!Tfpe#yXF%cR<2rr~aP-KV$TU`$L_fhwTPjd!In0@!AG^ze8j2DC2UWdg|hUWObdfY(z)KzPjLI#H#Uu9EL`dr?2c zy{H)oR(Q#Pj|RJ@CPWtXjW}@&e*&g4d!K3ahA%yi>VJ8oKDCCQmM-dVzZ9VEWYj07 z=?p<5T@j=$>%;$Nk>U8>~c7l!mk(R#Kf>lQc8sl()oM1ztYcXvC->XaC|$Qgq~b8D3{&?=S&nFNF_Fu zs3mR0Knff{HKiZ;M0P(ls9Yv&lzjg=PTMR7B0wcwIC?FcpPFKE4M2Ld-@4T;N(F4l z#_2M6eDtT(p3KB4^uT0_$+BqwBbT3xaP6|lR#dt%>HKkBlQvir!97pKo3|MP*nV@` zbGI7x-_L6RYxc8z7<0=xpfZ0zR&p<)EoEs-ZmWtE*XaAbCm{X7Z}9Hoa+#&~P*HLU zD3{6sK53hzQ%5*4chN%ycRAwTjCVCi7@xnnkN#euQ4 zSWZvAo!H-LqZ}Np0NwhQO9rz!l#DiS;Z@^j`wb`0%s)GG-3YT1qDFJdwT*ZmFZGnk zvt56BXGpaa3upY1m1{w>ah-Y$pbRblEPFFW8P`UL|a@!1%pyk_cNom(fv-x zMoo^_;`$mp&2*@BM?u(;UM~7y+LGMvF5ubr!#Y;hTAL?B{eQ=}VK3N6T&5`><7{_x$OWFKARd75+R}O?s{4QJ)Er^-Ct@cLW}$%EphEUSra-%u63Gle@!= zG@i4n9zs#cq+?TKJ^&anrK&E1{&*WxRC!>(Z*tou`y7&L*$eQECSw3`+hY*hR|}5v zso(?rA)aLPipBh_qJ$00`KD>Y^0AiQMT)~#Odnk?y;OHPrz(P90aSG3OoUiNpQ)-X zK9K))-e#6i?p(-k8Whs$^w79C1y~0@wM0;pb_}3C!*@-G2?K@N(QjbMx&N11fij5k zKM|7Iv%=!qBIL6gl}rc8Tqwr$rP9ExB>FRg=};3CjC-!-b1LgSqy*zOkwWA0NZGSv zK_-M$;2EwKxvvuCBg+TB-Myy7OamF(nvLF6Ss)d+dTMBUE)q6&>VDNa^y;e?h}C?N zQn0_c5&?TVzxo0C<?oX{`NE9id{MR@#xYUuS0b zZq43@!uH<8?c_I5lrav~cXF;0zpnHQ7ltVA)6M!_vai&MAe*Rk=)V?npr2WOQqQbB z=J0=;xF9L&+AFqiB%JhZH#`V-+SEk~aA>}lDdT=U8Yl4)@3jNGU}n*EkJW*u`z-&zke!tgZXM^pZ~+&cs%P! zGxITE#;N8D8}_pje(5HD(i|l@Eq3kzzQ~)V>qOne54CG1^9rf$G6o2FGi-{(l2h_f z5YnZ08`kR(2K`{8wf3Z$`+-Jf;0ryyJE{!rJvQy?H4l7yzZ(cBIcRr!>H{fQd)qbL zBhVa>`c>J1ibPbOSMO`4tl5)3G$Tb{)wEotZoW!xq1YsWpvrIRA(Q@<=~m-}gK3b( zirwEMq%4z;+`s8ATrjRh2LOLh`_%!h_X-ivKBqfjTo3l5{60w_tK0Ug)viysT&Oxr zq{L;ic7SBAhFPNr;BF>~Km%4jDO4CgzVkkG8NV?<{B3jMqg#ClM(%G`9l3K3u-KYP z`_A10tg);hLgs#Y4yr|@J9RZa~(jKuFKZ1O2}_PZh-I0^eyQ|B9)+8i!f@6`8m z%EHe!&mI{KWEe0tiaoq)&d64i+}2e61CT-NleMb4mq=1Y!iM&o5%z(Xn`yy~uI)97 z5dA;%5(ZpUp?!Mc?ZIW0+M-!#!F&N(2ipuS)5Y61w6kC%Gf$z>uN`o&sY9HD*uPHA zVv^4E`=xJa$_apK zWv-ELf-#*4m&BPl2Y2}=0ydz?()_SLiO}{&Bn5#R zzXD|(K~0A+Qe&`B`GC$pMfM*+4}rycftCwaCL~{dGj&~3pGFS7bm{f*^R$YxGYhLq z@av0rVAd-X>nBs8>OSukANjx)T2GeQ;6xD|vJ`TO16oIgjeaK|RM@=I0R&!52REUh zC0E%N2<8`1m?71JT--+kmk=tGc0=7Dfwy#EcDun*SmzZ0@Ki>u3jJK4mB3q84zP6Mcp(ek%r`(-gx55dfPq0B`{<)EZ6zK;8DrLi(-%8YrWX6ukBpb-Lte1E zur)Mk`81DRtU@!T4JnLb2FfKxtjtNpTmD?aN6#1)lFx@OR~9>&cp5ZGWXgFCsFv3f zz|y(a^A4f1CRK$>Ano>E$EX)J%Kp9h*!1S*T;uJb2f1x#Nc|jYks0zmXpSt61wN|kor?-0xsT0BCbUeN9<{kit@lflhB)h;cF z(=@c)?9J$~%TYb(ec655%+v?y==Jgq%Yg~z=p`dGbgWM3|ELoG8{2C`H7eFIJXrZ( zmG)0fj=p|R(zg#es==-AH&&r*>X6qpar$75{=0fa2z1Qa;N*soF+i>GxCf$%-lhdv z5>ujLMR{3bVC7v@v=nxUoshTH_qdq#QQbNj94EmE zvRL1D0=ldL52adZD8F+KQB@u0*rAY20FGm@8@N{!p&m%OQyMnco+!3({sTwPvW(yS zLxbtS&?w{huL~0)(SbC==|(ZOooPK?f8C=i9QpZ^C^V&9#E^txjyFyI;*5jph*enxx3)BKgY zMj&Jio7RN+*@tT}TY<{Z0DQ}qFwZBLaK?QF=s=nSAb4#eB$zUIAf@?5(J>tbP4ZPQ zDF)QSnaTo;TEdo{D;m{MzXU9#B+Njo!J_PJIuT{fEkCj`ZjDur4g2*ML>QOx+)d&a zJ;piO5%u zmg1G#ma6@wBZa1U#a!hRLUB!To!VN4f>Tof-5oQgWcd3h#Ygk?z`Vq&i)_56p~wCo zo#C4AmMVTEBHl31Zm@|U%-FG6^NqgY5Qh5F*1T1vwx}*Ne756PdhE*Fo|#^V;_vH_ zG)7EZHW8s~%R2n3uu~5jx(3}eM^FN`Mx_cj5Wpmzpc5AKVbkzLU0C!ucwOU(+sEEI{VkGu>*j{RrlgX4CoVkX4S(Gq)9gd*Gcu+&ggTSeXdp{>h6A%F zDz|ODbrUUjfr8kvcWs(hQqVP}CDN5ZhRz;DpGyr;$n90W7lTK1MK!I!nyqnYYnZ1r z@A`(+ivq;3ScA2ItBvgX9&VnJah?+Hde9F4*r5QRVD1!QH6Bg`U4F3ENqQ@vJvq;= zoKv6lME_J8SDI@Tr{io!2vhb&&r!^aL{U4WDtXqF7VuGn@3Q#%G!z85T~=#noB-De zl|=zdV06dDAzNX{-rqWY67CRqVJImwbw4h{6UsAwTAWU1S34z%~a+bo4 zy}Q3&FA~svXtu&t;tE2{FP#3B%0zlFgV_h7LA=FN(!juWDc|_{!xeN?)K$d5X78g%1;d785x8*$)5* zfLg{??e2{m>iIPJCU`!JsE0{Avd{R;52^M`8Tl|+24PnL*>c{NEU2Nzhl!{n!s*Ej z^mJT=^M=8L@?VEmlGb}1E<~UFC3bmw*UVx2(lQ%(y`ou_PS7PQj~f zYYwrlgvyO=MOP%nk^@w)t%QjB?c6HdzK?ojVMl3n92=Kol)53z%j{j);(|cF_OU$D z)VsVE61bmk^GoD3QqTNjf2SCvBMQ!&Qt-QV>CisM#!-mG%h?eX zNz(d{!^K{vDTHa6u2b&&$K4}7LRN&MvR70PtHL_flrX}tSN=+mUYG^Mpi6nt%8E;u zx{EWj4Zt8hfE#Rt#HUJV28<*L`@oHA5rW`alUCY34A=PRYMWWWyJf!^>36e-8+1q* z(|yLB(XTpbGo2EyMu$wIR$XY2Lp^ybl#8e&j6m3KKWyJZOm<48Ao3X(^EF=fDkln& za`1~l9l|Ab?iaVFN8hZEU+}go{zP{7g02WJV7Qu^L{7i`;>0~w0}M=TT7i@C$luDb zYx*-x02& zoz-eSha=!)tW-VI5R4s`R9yC+dl`|F(pP0aG_++7eCPmrPYOmXCbsoA!0-JtOgoA~JX+?+>t7@uK`uMot zU{J}vuh|Y#99ODa(NL;9LGoFvcg28qO9Fk%?KJSDiPj_J)B{M&nPa2-z{L|kpnOSx z3vAEne95=4HkCbY@5}&W%Vs8!p#2%cu0LSH98+HturPTg2+W;1h5dFyBwxW;wO(t# zA)kvPt(9$u>T+9~nj;+aa`6OST$XgtntW5%c~5-cNz%c)prl~55qrDHE?M4w-TVcK z7|SHat?>l}x%kBBP~`$;R!eQ|{o31>?3%KCm0!$KCLDyr@SI?tf8W!2ZoU=N#S!DBTnLr~Q%?_e^-iQP)&uBEbm%fk+WwSVO#;i8DTy=7VA3XNGS!uHBGP>Wke?`dd?dBxRNM|fV+vvKZ(R4NJZ4@#ir78*~<8XW}CKmNG zRwM~jN!VGlk|1O}TuA`-dK0P4Q7@v`?JA)v!VH6okj(b7zR}=A|IMen!HwY3uEU8$ z>VAJ_!q!+fv{P}=tLg)Fs~Yhcc@z<*Dpi!$chr4{2CUz!!+tGlc`2$4_$YK=&Cw$4 z@N4sEY5pw|oBP1Qy5lMK*f-Be9W|gv>2ph8_z+D*3u1Y3z3q(3ekC{S5SJNC)_@|p z^n$&SSXv>|8h;G}fy!A46N)?tsI`2FU_h<Yap7exPTka=U+A)0rSYB zq##`nYbfR32{SZDpAA?$%wB&DoC2nnU#EINX%=FAvcT#Z`0jsygrCt{d`MHDjJLz!IypeK8Xj)~OfsC;DtcamSfc+t&_0OA_tC*|7n4UtCD)PtE?l%* z>H2YIPpq--03>m3sp`3SVmWfFOj|Wqva)xn33HoA{9dLXax2t#0#IhkK_>rVMb!lc zm2*YAk>G=vpg8BZ^zQ1$Dh6pCC8@v50XnA?mf6|MpzeWQkyI){s`Ugwcn#6m1!r2 zQg&_=zmm-nx|QG9y$Sy3jeR{SdBbuaR0YVYtZruh*nRvMRr<5cO@PKRWRStj|IbC( zV81GP*!jD(TX^`LRQ+7ngwWRorzyz~y8jx^v>%|l!h{S2Qzf=uBLHfEc#IEt&Y#>j4Q$cB!sB;foGCQ1)D!Uk5l;NXtJ)|spD<> z@V78r)f^RroX10xhAq1v@dUt4 zzFwodhN)Uxh$L!8#og3uEnLMCAoTPdd3B}B+JDiXYx7^cuBPNZvc9q%*4wmpN`{I| z_D~0=1VsImp==L6XRYu;2gciB%l&A4&PGgE)fenD=z2f3(95nONl|ltYPquj8_Uol zz))gQG~P22<8&mph$8bd33c&ywKm>E%Uw_T6DmoLJS4(vONCI}>J%q>zJ~HOR}!c+ z>avaSdyiO!pi_|Or8Vej?02F)FvDm4o)~xv*`t9#z^R7G_4s?IbyHZ3?^=TY{KWzL zdo}eE`rN7(c72Z#;obn+7-`glbVJ2m{y1c5b5wVf3JX@dNjn+wMvDih!XUyv`KRQh zmS#Dvnlx;d9>m6P{`YI^a!eCCqzpRpBb3>ZXnjN#_z^t5lJsK~mBx$02P)w6eIMa& z$J#ILa&Lf3Ue zdvb%f6B-H=(8j(iEzKSD13GZi}25yT3Wb|6eX;#|_5zK8k&t(UjxcMiNZv z);DP@RRuItAP+_LImB#rNeA(a(ip1Cj!-M^y}#o`V3CYBclh}D0$ztMuE1)$z^C?wQ}pN#&h;qI?Q?>{b0AcR^wRj zlc3m_4sQ6^SZnK%&DyV281uYqd4Zb@`8pzus8vKaW*{EGl5kc0aLadYCsi1lMpKd# z|9Hj<>1=Xf_ARPClTi`?dG6KXuf|TP zS%v~~z9l4}e95^%YeK@^sbe~-0i_ugkN42_O&wqVVkT4$2aNKw07tLlqeC!t<)V>= zrdp0&_H?xrPskL5E{UF5`va?hMQ^#y79vcjV#`T;EYQj$fmj<0pg~L()d6+=zuzIz z?IXWqw=VF6eEv?Id&bCWvT-OSa+z0!tGuy``WSIX+e%K#y;##B?lU4gl-XfQ`=M+c zNwQAt#`Eco7**dAr`Ex|Kx2f1pjpo z5+&}U???Q+5{i#SfGcU7Jx^?j%iM?-`~&%%9wbG6%etksS|TK?CFpVivpv^M4-9Ti6CL zUFA5T59S7wi4(WDHE6kHU7KBcfqGd&*Czi@?%BYfB zdDAWGJ^$uai}J^bb%=U*gw0EREid}Zf9X=Cj!RB=R`?Ro#WfDTOyx|6z5QO_zm?@i zi|*<|6Ib(!3y{w>1Z`Y{+ZqYkI3yQBgO?&QRmcvGJFPQtn@1h&PJ{^tV>?fqe=O9` zm+CpnWhCS0tZAk^{AH5+b|G^t=2F|ghf1VXp;niC>Srr;byetl{>qtlU4{n4Nv{eN z@jp~xY0bgFn6LvyB2MM!)HHfitAcxH0?^gNV)itK)}sH(#=&t-Y);+{9tf##4zBt5 zE0_BEhmkWFeGo358)m}^**WRcF3@;4MG}$Pj;Xfw&bD%-W?62j=*LcVKpS@AaEf0A z@Nn-N^itnnlPL*w=d|ckZ^T(vGZuQvdrHsOY#=KIaCHBNV1m^iqJQW*@gb2S>}wO! zO3Pk|Gt#NgD&c7duI^ux*<-RCD$lK6rUwTj;W5#=_6XDOHMKiUkQ=l6@~0kP$2N#j zG^_D%8Qy>LrwpL+F|&ucI5W3Z_7(#t7cH!pu7c-T#JHc7fXZ>o*6zc=*|!_ga8KWJ zy(He+6NyLSxlxl=q_5>Fu6B#olZWRzl2iP=aj5H6$A| zQ`5R5?=G<7LoKh*c%h3zyUJSBRl|#2iqH2`#zn|CTFlZ}p+1y-2mc($18<7PpEv=d zNZ%f|eLa$%x;Z9dR$}j;wcWs?E_<)RU9G(WytAQQ5s_!qvVz^z!fw>I@e+%S;r%Ua zE49~O5|%vwvj|K6pCSK+0s|2a5o+QfeY;`52K&9E(3~8waNzw36PPw|Cn78(NQQvO ztx-gT$`JWfFkE9KKAulKk|O|uB!RaRg|4U<4fD`z7h1++j5nP6y_M)(szBp3#KbFT zz24(=;z#|+kA%=jzM$&<^#IS=_N7D={{uQ;e1?4ouvV|q&aHtzG(m~gq}E`+qy#R~ z4sqgmGiH@?YD`xkE9v5(IV>sRqmJevtrAiTDn;aJ1?r9++luN|0C#b)_HtQx_S&LK zf|R=?!3gv~3OGqOfQ+WTYR3AEPxegXxP~eIUd)+%0L7}%>QAr9pa4B9#~U}Iv@|P( zg{zQ@K&o+f}FHfM{%zIx9hbhtT?^3PxIhcz@ z>b1PNtMR8UO@V6VWU6JpisNOw(oonnehQA`jkuIwB@L2g-azZ=M*4V{Qr+I=NFe?Y zsSfvhwcSTGIw{kJQNfvvz+f`aDID;%Xl+Fn15e-&gahk!tSL8hHEv%4IrMO z>hV#BCN-x_h1$b8H+q5Jajp}y-M>zc5O^kE6ow?Sq+!v2gQn~sf(?g>#jpe~fEgi^ z*JuznhO)I^keO5UREz^s@nR1oGnR1B34icY$u(YRetPz1i_&V7$H&5~TswhS;63 z5yCSwl)U<2H-+l{Yk@T*A_%LKT}Z+-(;svlBU+)}S9EP}QYP@Jqs~j}h*rx2OG22h za8cEzwuN^WP|z5zSLg*jyqBOv(D0bBuSq9Y8bH4u_I!Sd%9|_`IAxQEjS`Vv!!PzN zSS2kDvr65+h^ExZo-QtRfc<>H87JLZrYV_jaZr;7gz4hQ93t}Q2wZ{l`9O)kDz}Ld zy#LprrbBG~7OR%hJboB`G}AUk@nt_37}xEMYF`?eJo$P8f1pT;cD5*Ug#;;P7;V8* zp;pbrYeVbu`t{v}u8Y4+(;|t8YBYK#I7b2|aIvYd!g6~S>sf?sNy}ns9~w~KgMmx{ zahUYWTeQJX6<7cSICL)PDnsXeuQ5>Ee`pnyvAq)1<}OOGfTu42lp7o8wksz^$B%HG zD;=J#J>xmMdG3M&hg@Bok0h@e8XY|$AE6Zm?PFhA)7G#+JApv;PynQ_N+eN0vKge+ zkT@<~xn{F}VUw%vO*qMN37;ca|D*NrrC;f1f@Ys!D43+uEX(=$l5Y@R%wdlZhIviv za7g!`3{RYO0KgFmS!lc|5c@F-OV_J#@o>(g`|F6+K#^De&b=l^=;^ED4GhU1%`%!TL)g|V*^13 zSx{A{%dt>^*ea41T@jq4*iYyRu+H4`FP*S{rI`*xer+q+p(BO*m__@D_Q z7lAuBQS9B>_`l5j>IJ?8MjF~#M=iUD&?K&4jIJUE9I%oG*sR%z;zlH@B?Y88ta+JN za#xe*xi4#@;hD#$qM9$5yx|i zJe&htXZcvi6pBEj@IJAbiG1Xuq48^kA6)R##n650>Wgp6xQ>Kan_++aBI^?=W1DTC zm@jMXE&ik;iJl_doC9rCa-4MsCUB<~YKwC)5U z{^in_lc(8ZSt7xxuY!Nt)cz5zm1FxTu75X`Nv0(cF8pXHQkM*CQ3|RrM$2*)x;s-x zjWM6t(%t*%nBaumS{9mdt^&-;I!dT!2QU=KrC=Rhbr~E1T0R;tid%j4`8q8Y-<~Od z*cO7qC4$!-(JD1+0m9Q}9OPCF8#8!{ z;(nnt`c>~<a6;{`!v~pLi{uE5;>DQg&V+;LKdSW7=fRZmz<1k zi9hdD)mPNmFF2&KYEr!3eI3Lh-ScuW+bMKU_@vvb+O_-Z9+|;O{x1CL*M#G4wuu)7 zo7RM|ZI8#eZw2+xb-O%TqE}-f!-XEg*ePP4)Q;iG=aMb((s46&pLy2D9m!qRM`J4% zn$G0rHR}VyEjy}jio4lDtLd=Umdx5kk=tl|EN)h`GoRQza_`7M;|33A|)WBy2 zmr3pmX7{v5C4z#VAUJtjfr#Euv`8%%j7O2=EoT+Y-o_^ObAS&~(mfenEjlcYqYZ=L zj$D<*N09X+Z6clT5z==>e+xnXf?(#O#TkzuWKaBuFhUS`kU)z;z=JtfsY)0QmQD~j zhnAv`;=%)r0w!&F$B}lZ0`yS;@44zTSXCH0m2b8Fx0>BLZ)jJ8~R+RG&<>Emug4L&9&p%Ha(m7Y~eS7V( z>atKVKS#bf*|^HmPe#9O4*3XkB3`80>m;YNh)w}>%AI$zf%vBZ3q%ca=A80OKRMb7 zHU&s-wf1g_wLk6Uz;L%)#1mjGEi(Fk0uoI96Bum8OS>UnW@;u@r`{zVy#Qh!UPpK> zE-sA1Vm%iyRLUcb6DFd>DTnOSaZg4g-g@3dal!I*UFX z>}U4-*7tyfd*-Z1j7xt@G)A9fB1ftIbprLEI`M6|H_|BoEKQkKlX`9->S4JMWZZhI zOt7l@5Df0u*hOBG{V`giMcO|>N#Od!pGxN;lqH#FsJRJ!9rqdf@|J_vJyu~Rb6^pkdS zhB8+^(0ZsqZZ!$IbpYU+*Dse7db-=apPLA~pAQU>l6)d!ZGFxiJ&YEoTy* z=t=zCdkZ~NWowv`bE~O}Z@*Zl1SMYR?cqDE)nDt16{0{?kH15J>PaR;Hwr=OXI^9=cs-)JHX}yc zFyDF5d%6(?;WU{C(QNvt$*4tPg1M7l=|^mC>4{aK`J|D<5Sf1_gV)Vu-^+fd2B$=^ zoP)`;=lmjrbUvBklx>lJI5OkWE6nw(W=*w6Ea+#XrRA5>s)oIl0p}fDrvmrG=iYYV zLr%)+Y8lmA&S+kOgh%`U&46FNnVPR8*4eB~GW5fH*jmb0!ggboWvSs*I^mJV2V-ir z&#q^AX)EBOlxTZXJsawa&~z05KW`De* zja;!BARmjp2oU7u9uDx#EhW_nQddOj(7bqO#WQ(qkor4GEJ65lQUOt<%dsIlIRgu-`+d4qRqq~A-Z)o`$ocfaHOcS-8 z19S+3-yM3;oCF^L`0g+rdR@1^e%91?Rc8@a+f&ga_rj+^TcHi+n9)wl;x+HC6U11T zRTaWg|HG3)t%K2|^T|EFN!7FvGe7aoa;99vxtJ+tngOx@E5wEi4fkFHXbzz|QNM<7 zu{)G<5K~j$UB2eCGT|yk3a>kMe{G3%gk|#Al|J@!!F`?Wt(ISV?KYb!t$ct%VqLP zN}1>q#cv$C_f!1!8Y3MyUm4&RZydZk0e)aW1LXNc4n$-Eu+Pkd#UP7VYPweo&-jOF zTLB!zRI>7qBr=mfUTuNW-e4?c)IJJHi03OUt;g>neVjt0+o~A2$&spfcE`qzrp5s! zzPWMruBIwD^+KXAE%H(qpmEUiaM|&{@@XDu?AeNak$SV|>6Xgnf#z{P{~Z3s{~4U% zL-cFW*(%6a^w*o1Q;Pywzr#oaIf*^udzh+>WMcO+byZffLrq~Mp=A;X!Ld#67TN@;?sKNw~1cNg;yFhCpB1c^gHqDCl77| zcQ0kgi`C3k6--xoWU+uQ7Nf`;K^g@smBe{V4~z9lw6V>-@UzF5zk9ORw&3bA9yQuZ zSxJ`uFVg3JJGYKu`Kspn>Ava6I7-PQSPGl!goxP>xvnpYKK0XOnx>9MS3ZZ99hvn$ zV;eV=Y#E-CvwkEEAgs2BMO(|HEYZw$;9JYgXZ+AEpXZ~+v+>Dl#&pe1beeA4ze1L^ z{+|}$CFpg3E$X7d+Do?FI8Rp#k@d#kEpUI564QWDOy8T}WOQSO)Y>-Oq|z@5VBCRM z1kk0p$YFVv^9mC*jz(ug%X!o4Q{x~mI4o|Jt0gma_j8!yQGxJp0S<~STk!21`%l_R zn6U7XQZXhk<0lprk<^QW-&VBDDUIMbUD;C9f!q3}a0>9X7$lJtF@Yr;bvtsd_?FuR zAEWU8gmLd;&nED|4Ku*S)A`~7H>DT{L^ISB$-^y%lKHkn08tS|RBC2ue`d#!3nH$f@@9}&6)?(EA(YAp?SO3=~|;HRA7+Vx9Z98`#1j~;5e ziNem$$0#Qp+*(NTvt@gMVfZWvpEfd>HuF{A#&e)*FA_qpFGwP^Z{6n2;o@pVFc|COuh`(LD*^+UUQXNlvEPw~NNz5`?dVj~pQ zVi9Mc(U$9Gi^tHja8tp?p*Js;6rMlczL39aPMWGdLrZk|7rx%k0^&#w|Kb<^2Hi)2 zUXsv>coqD58`D*HURuxHS}qOK)d#C5O+i;*IjZV7U$p$9IgDr^_h!TfyP$F_ODW)Z zcn$e|K@6R-{H`uP7rv&;vSS+9t1s0d1lPk=O+)xyO1LbyM^dG5PDO6e-!KQU}Wq`lWw zi);ac#P`n|;ad}0_C1N{eCiES)|mGY+0=M4Vo$Q7%LrCMDz_)3b(CmAwxRE6VZB3( zaZCzjf*=Y)h)2X1%`FO0G&To$S)y4h&54#LE&>>`O>V2q%C`(sWFXz?TPCSQwxPMqWW+Nc;?_K8J$rwxj5JIq$a0XL7{x1K}15}q_tvV+b07PztZK~#;YE9T5 zA6$Se!nJCw?7o#LngY8z5t%clre?7`tEya*8(-A^3&oytCm8<_&z`lp^%BN2t;~zMWJ#U@E~5vE_O}IYPzlKIj<3n}c)8W6{(Sw7 z$Rc$Pl9v$V)+qedrJg1pAkA(~k}(|vd5oGm2YSNEtWfnObNw1hIgojlNr)fZJA|3% z%?&P9@YbD4m~WcQ8TU~<#OIMB-=uoqmQSLn8{Ev*5&T{||GqpwlKSbR%_4=nV1K-I zzA)aNGmrpN+j54eyZREV5;*NQ#lN@L(ogtH2qTM-DpsC#iS^eG?}-cJu5_MBrVW;( zjjF07v(s$DnI5I+Hr?hEVcf-)NqJrrF5w7uVUu3%Z9f=->?|il9WgA^8$O}Ca@asA zH};l8Ui7=5eQnH+)l+{cPX!De&U42!<=cT-fq5`y-(k8%FT%PQ4M$o8li(+hUN`08 z*WZAm1$4U8Xs$}|VOM|cDJhR2%n>i9+wC$mpXD=;@=8>JQ&9}b(o9P`{uL&Ohs?uD z80(poKYt#L%6dG?;@W!W=c8YT!Gwt?AJ^tDA=HdR-sQIksl2poNAmWZhEX`q3d?-i zEjWr;N^IC#13q^K<3=K9m8DW$OhWhO@1U)}z}}Kv36vU<%?#qwQMLaNyWmH6qhKPw6@VPl30F{;g3zJ$HkPKAWPB_ zts2f~<-rU~rCV%z2dfW9EpGe1+V>|Uq*?|pnxil6MLOEzh&#bLR8ovF1Zj}pCYilh z6)gwS9`l}Bqzn$fT9QeGF3sP0&?9>taKDtQ7pu?kgmdb#jb`#dh1H1WPN*-0IYlD7 zGz?ijTtz(kP79jS!~}7I_n7paD3EG^1z5+wNs|lIEsf3Ax98W}23cS*$6#}vlt)64 zOIJ=Dc{^36MU%Hac@!L-IrM0s`^vMb#%6<2YMnaE%+kA}uiD<7eC1NrNN@=aOo_pQ zo^r>DIi%5D56>E1U1yH}LpqZNc{r9hqJqftqu3Q1;V8P3rd);TZXe8Gk z>2&<1w;C}>e;2DTNvFrN;xJAhzmt8ab2b{D^!Iv~7zL+_FclaMR=`Fa85q^Ul*F>E z1`1;qh!NJCG}x}=VL5=%ZEP`lz=gk9CG0-}Y5LAA#ShzMi%tS}Z<_Uhb``TOdhBN(c8`Lr#o8#k!+Xx+5;@P<0HLk#%Z;~! zC7dBu>*!?x<`}L%xHFqlgsb~3IHWLN0#IW0A5DVFB`wT2A*#J%z7TB*V)W51+~}T+Vz^2Pms@rbu97LY0UDNGKz2+0zCLG262o0xP^;bAb@%nuIer$b%q5Z&u?XJd1;@wChnw$F^>|(h4mV% z2Z}^--`j>9NpO4QPk$pyJrfxsLjtWNHcJzqoL&v^oIT_w+#~WlTz}i&kr0`-Jb~6$ zk%3|^d`KI?O~ONxhdmWTu%%CN7l+Xr41A`ELIxIN^~1hZ5`&^_Jp)t;MUx_u8AFMK z1?QWxNMr6i?{_ks3-iQVsIIn&u+q+(r7Zm8Xfp>PK8yN1(=s)12n#{X@tu-i|9>J{6mK8-Isy2&D0}+v*QjWJQ&Ko> zX2*NyS!pnBpR!sp%#6}1-|qToF8fkC^_UTf;kP|PF^oC(R0gcuwcH~izK6DBCJU>I zIg@P>RJVBz$%fm(TUfc|S(*LuHC1Bj)|+G)Y63lb@;5LNR>sZMo5M)wpt6;m4dMSlA zabh|;#H($%ymVaGBV4h;ht!BI?}m3N8@B3X$Z0ga9{-j-)Nb2g6uz4@gtll3yJCd; zn4N!PeZ=iYjs>@*-gVG0AlN_35YOGd>|J0F6*-D4B-;@`dg;mer7#lX!nP+vp=V|w zDEJ5xsAKvX%}6Mtn4j|dlZkS))6w8-kMJJX5Eg@LO&jm!=Aag4(PM=y+2hxHrG$H< zk>23q&e7XP?8HsC2q0Jl{h0q5Vz z8Dn5?MYCXrsmh-tkFxK)7}|WGfy2K_IG;E`5~HmPPy!|v2|m?5y*eJwyTTKc#u>wj zS4mrWg5m>vEzpy9!ZqnM)Cn8!H%T(=!oA2L%Oo$ja5 zT{#b{ZLpbqsMOpUZ{vD77JUhq4ww=c+HM2SUn>tQ^@|~@fO(E9L_V$vqBxs}jZlx+ zUwjI3HDaF^t0aktyT1+5hGyb0D>P*E$vru}8Citz?2y6I;+<0MVqX`fvOsVYMfMgFECRzpVRt{wNUR=FNU`-Bqwk~|Q)q9u*Y7XVsUEEd9AlMB;`n$OW&bIjU50SbwQvejSiXu~PK zUj%5Nkj;b~_|M>b*6(=gUYG+3KX1Q#Qu1FHHA*Iy@RN?5%!F=U#Hu7=A@i|(iMCUB zyhhVWoA_ocQ8U3BLSV4r^C97n$g}uLU>8fH#4)yT4M6_q;U2myklZ2o$_^BJGw!{~Nrd{};Tt zk&H7*_`z98v8L>oxyJqR;V9yl*o2nvLTyez6XxaGTjVvG0FCj^*My5O&p$mDXs7v= zYK;~nE#LB0z-I^qrCS>yhDz>HHPpkEfs85~X1P4k1Gat)jCB)ycCvkn>trJT=)Qc8 zi5GoC_08Q*q34q(wIy4B8`i3?3t>MFs{cqcnSbf!_?3c8%98c*XXn&~oB~RNd4Fv} zHDfF5j(T=1A4^ryV=r6JC5r?MLkV@TTvHm*u1JIWdT(g68hWyPz)Z z&os{|JBtoRh_5p;rK zoY+u~!V=6CF|riWDFR45AO<2z3NiD9PUC`Hh~4UpKs_<__aAMWrbjzd z+LiL|hBE%PlPiWI=~joxxJgzMvo{VjhW9B@`cF4YkcWge$@M#0L|&FQ1VG^7mHw^q z_Gp1%^*~&hu?^BInhe{;Lu7$XVz@p(T~St)Y|Z%_FsOnH-h-L5XxF429|O02B05Qz zWXGFpjXUeokF_w!iw;3sdeLGQa~ET{yrwlQU)%7^QhhYGvkAcUKo)ib@=y$9kC~-y z{v?elh{LUp>nX6&QXf#A=$Sw%c^Us7QE$N(WwgBy4_zYNjf5a6(p}PB(kUP@#7K8Y zcQ;6PNet38gh+^V42^V2*Z=XH^LyX<1ar;owbx#EE$G(<9^Y09V`+-uZ04rawb`i# zN$7_#V$XM@!5|~ilt*Erc2Jx8`@?sloFhq4(4j-0iYbfQMrN?&Jdt)KkNB5aH3=JRe{#N?#yYzfVeIe{@Q6FWD%Ye%X|(ecSAk8oN8aJK=%e?jH)Ig67*o7_0&s8!G@97@l4Q8s`~yVW~d7#pRAaw^M$8L%Vr$FOx2~M zgPSFAaHaAHbBkz?cBG#tR|b!ROCv>#2)#xPupiWjbp(A zXx{MGOR-Pa%CT+bj`H-?xQl*Z>PkkXaNnz;|vnDD5nLYa6bo7qT0s3l^vdcy$!{;O_#t~h7_RrzSAW6Qt zON}J%=}6oWf+QPx1A-Y{MlI&Tg#@@(v%9HU$A?2J)h$)7@PNwk`r1h(1(Lq&$*-px>_~<|SCKR6F>|^ReWPan2U%pd+x3vhC zQT35hA2hxLy*CpW+QcJVp1-P}mA>V_zhJ#%^my)7hl@wZbl!u1kiP1d6*!ZR1m^bf z)c(PGG|`un__(%CQKF;4?u>xbNmX2BmKe_X2Up+(Nal0)VLh}4ft_-~)^r1DYZD1Q zfGONvWMCZCb$!1Ee;GF)z^z_b>>?~2qZXfFn6t3Bj)G;W;p^l^6TC*~*%sB1tVJRQ z@IIKhi6z(B1$XYu%Q?ZPut%EU6)+BStnedV?R04UbU|+QKCzT`zVMP5v3Z+*zpNA4 z47Oy6)b+(@?)^~B&z3?(E;|Fj#wSG}_nX9?jc@!5U@F7d?yS`GPtsKH1GWR~mYh{C zpC%|3sgRn6NQ+e4W3bQs;tjcGC6a{w=tq9$M6K!Wma`l`Npty>O=R-`DA^B7bnv&0 zSJ?#1FStw97@#u{N(JZXjAuN!#(Cb5@o32FA9}eD5RcCexF63hx&7_CsX6-m7$-7Q zJ)Nv~ND{vUry|ef?t3kmlnneUxF{alfn!niuAubMAk} zpa>8}<{@{%wBON~P}6hai(LRkETgUQt<4vce%7;zJ!`rp1W|8pa~Q=;XHjmttO_w# zneygt9h`IkFJ__^k4?3H-2gs^Z9BtCO1ZK-LHaR|Y;RAOr?Gw#13i1rft_h})^U0a<3K6uV3tzS{ON&iX+NMzwE zVuE>ZMc>*+Qyw~(mB>i+QswUd!4WPz4MOkBGw7`m7T6`&%tmM@>rPJ4>y(h9+HwO_ zOj~3rCelD}K^X?X=T8ajidx*^NmHn8x_l!=l^XvDB5C42X zTWWW~;d)SEK94K>zJq+xk6w?62X#kT&ic(N>_%NT@1^qoi($Wd zO1gV}fxb77bSYaaIWvkE*tr>#)wo$J>BWG@{7&!ySue?8Y93p;X@BvRyP{@zSk67y z>cwS2-UNm(TB1lWQ+7$us7J-8q$dB){tx`Agd34I@2*mrRN0RCjrH=0eu{Ezcfqn}@ICQ~iywi@hqU z0ZPkoxP?!=I2sj|8WPa-ftQ16R9mnMl8%lIWxR_gE#VT`0sb%EO3`F@C*w#z@$n&o z(G$>tpwX)|Vv8q$la{ancV)^IL%oQ)EWxic|e5Zq!<7|Ut zeciQjM$q@!Z}U{Aw~QEw#0~sm^%{Xf;m$_(FA89U%Y5Zs@yCB0hA)zaEH#coy=xhw zXwNh+t9<8Beo{^D2%w2+1CW;75Rm=ieDV+EaxV|z)^av9$1I*LsD1<02@cb}d3mj@ z>Knws8JbfaTD~5P>_q15h~ESf0fhtuFl|xjE8X8g2Lhb0)2VNedY;HY3Q{eqthokE zt$&n}@P;evDk=x9+LLa}v(~KWl>>O{k9sA346$fT=6WX~d|uiKso+FRWRPEKECfZ* zfg2x%gyLW~I)R-aP;f`I5DA3Mxhq8?DfuB#-GLY}CMo~j@RsC?kiRtmlvm$?F@E|U z7l-=gDE6voq@mTH8B;iP#I@sYk1F|-k@_Pj7S48e)?tvniF;oy+l=#8(jWnj#^q5W z`juel?V0k%HxhK};bz+BbAJliGq>V|OoI-lqHGA{V1-aV47u#~F5_zQ(#4pxmuQrC zs(Ru#ZW6*67QvUvW5wN{kb~JSe`zxmcf-?oM?|JC`NOvc2chK&9 z09JWcv-e_OJG4v*2_XVEH$mVT=OBe*3{y~F^yeVWXb~d?^_?Zn;4O9cH5B2GERd`u zzUYVcsEf)`Aq>PO{b{g-;+E7{8yN0-=yFtHzg+)nf;R`)W+CAwNsG4}24vtxKIhEZ znThr~mLv0Pv{|pKoZHW&0Zu2SaYu9jrKUhpAYve#N@GsMn)cPMEX*g#u8f@_WJ8Q- z?i}zM@;kFpD7KCI_}F4glfa-kH0a55h$G!`g2F20>=UNJA?}IfeiHz=v0zXm;C`3N zn4i|J&jV`R-)~Xjc7pB+wP1g|ZL6ON zZ)2b6n&53>47dfe?n8J`<;3658j<9zd4q?MIU-}r+7!k`fn8S~IfpH2Ygby^=OL)y z@=-^fluf&7hiVfxu=0lR?p0CDU#!~$Uj=PLOQG6axAhs^ZP3lnx0hsyMtUT_zucv;e7Y9d9*566 zWV<;aIb82!1)h^wF1tEfjR(00-e?}xvQXR9Jo;(h8(6&jZkQ9Ftl|2%@gRFbt;dK| z@{5yQ*T63B;#+cp4ZrD~LVCad6ggiJ!Lsnb4o<~Tsl|=7k#j&iSL>-wPnxVPy;lzU zx-3~%B1B7FPA8ccmzI=raA`c~kqex~hRRV4&(p%><%w6TAPG;@eTF&sYAcHkSJUGHns5q6o+{fO&r@3mtSp7611%6UX`pV3eG;hIR=afT78yYJh9oYB=e z^=t}MItjTPxR#TVZPDLlB3BT5MyM50wX&nEDD>JsZs;W&`kP%C*@~ru-r-t)&{+xk zz-&B)aqcH*^J!wjCjCAKFNh)GC-P?@BlLkM$_KT>UfmgEq9yCPgKvVFnuyz~T)X$b zu09?Ak`dk&>}A^?4`LLD2Z~0;Nw6>y{1h}9WNHGE6O}ut0o11ZG7*`- z%H7yF02uic=skha^NJlea+9q0=vQWwu^bwx#{{V$)RY1FP5%AI@#(EXW&%bG@xy_; z0@m-c$uT)U6h4bc%oi~bRBtUxj9nOzR=5|BuOxBtQccJv)s~oCcf5fjDLneK_txmQ z2i}NUBl8bGMC^Oe0L0e=W9Z!;gG)zU+nd{;YPA1&V?y310qUOntg84~uhIMOu+aU6 zNH$dH(a*L4KO6kF2Lhy3cQ%bbt8T*M(Hg$4yeHep>$tI|gTTqN&oX5eytH&xivu8U zkok#;1$(h;wX+8DawKkNE{RA=VHb>^XvA6H-6uIiT{?i7FHksdACKd_b3;n z&e3U$Jo*Zx$^@M%TNiM|0C%(u8Gcr-ql30NE&@rFx6O=DZX3Y4+`+Ot)z+Qlr9%k1 zp#jPW4Q?m*=MR(!5QIFV^ZBp-wV+Y;cemiPG|hR1iBI=?H`INs;L0s&O=E7Lzy9Mg z>?_q<FWe?iV&&AELP`>!U1ssRQM^J&$_Y)z992sR1)5HAQhG_wD zZZ&$@`5Fn?g~;3fBl*nMcVSAJ>`P-F<>q)aM@$W}E1b=r#?g+59zBrF>Y7&UpKsq& z)NURRIj_%v((rH+&U)NZ{Dg^e>EmrUXOlBZ7EfzOUltpMUc7%fI6)VcgO+hi>hGvL z^zypL^3R?L*|m+o%*Fk`VVY{`|Jt~BLUnHs`iP;nt&_Yw10m0pdedFNg0EaebVu47 z=ox7RA;%9E4WQFc58%<$8th-CQFoBOvYmG6GTWR$xJk{-Dn%_pkm=J5@m0p>dd)og zP9!}){85JBl=oEpkhWrb-ki|lhWI#o&y=-`*^LZ!NCozu(R+;Y@Vt9|^)l^oZmK~r zWt+d}FhsP#u+m#mfA-0Mprc>*hVqk}j};>yH%m^->zc@WKp}F^UAoAw=*PZpj~YT2 zY7-b0^;$yH`NE|tbV|ps&3ns%9C)dR)O68U2Z%hfA4t%D=Y*WLvS%ov_)Aq^U4PoO zlSs3> z!+9s@hmj9GQr_S^u1=Y*zJK8Z!rgMElyBX5xUlO774@$I7aW4#Lvw|k~D(Z<%_l%Jvm3>|q8lxsju1yxGIT^{8|=4URY zmUT{scQx~)61`}BN$IfE^qw0=i<$C4+F7ennI0M&7;9?RK4$`LAU>F9onLK^M>yPGfRp&p z1nz1r+nB3{v=QO2A<$qEx;K!cDfzWtd918Y`VkLjQ1t!Q2gEE>OH;_Lz;4_r&&3&v zAoK4L6Q2~F4QbKA5jJkY*^9)h!GIU@_*dx}IWP(FU9)oIGeS$Ciqgx|eTq+f)E8_Z zz)p1oyShI9Gf(Jn;w`D)H9Iuotnu(V(ub$jig&zsK8zUL+~UcaW4~c+q-Q*U6hVrC z+fK9ZMJ6s7VadxkPnJQKDBDq1Y<8dhQ#wnolcJ&7o2%R?;)LR=tB9d1 zf$-NAX}2Foh)ONYcE}D?3H)CY^E3==U}h&#^?OA^RyKqkPrQo|e@!(|w|G1vaUTbG zp_4juB>3jfh|ms2VUaiDAe!6TPGKKWM9!5zo@^kynJ5TzPw$`=a-DL)Xg|L=yL-jd zkhHV9%wJH~oaFNR-^|_c^UsT(|4>%ptfWGbczB1WYc;PUYIU5ehALe3C=wd7PBltA zbc8M$WJY#FYi_fHFqsVO5`MRq90{nsPN#X7GDs2Ju`19u-Ma4+0oOuuq%PJieE&FJ zUcA_kuE`j@^cA_xZY-krS=;t2a_5dXD%#NFo)|3qRLs~D{tDzn7RV`(3_G0n2L4_g zlrSfB9p*S3IuE8kHEeC+#1-ca;u75n$;Jl*6#h!tw|{C8RUF)ctMb`V-b!RTXpR5un_-2$rYy#Q^$=0+JOV%fveiF-p{!T}Y|M1CFA9Gq6}4 zB@Gn1HcPZD%=gmgJQ8u<9>HFF@8y7A+NIK*03&~}4B~*1!yD+YhPtoPF=}eZ(S-#8 zXlIKOOT(tyV%v6-ZbO*0|{-sF+cT z#KbBe*HGLxv_RfO4h9oWyO3uP)uhWlx06HSvmtEdUo30gHXtB#NJ_HhAfB$c!#I%1U+u_DLr4fz~Na>CkxHo3?z>!c zj$vfw$HnNlDx5^ZwOjt^bJzzDorf^M(XygHXWkk#z&y!qk|wUnvGOcT;m{+Y-+{s> zMl=|nldd~Ot&m|E(c;E?50g7{pQaC@=VOd^vO1pJppfwImORw@WdBUPJKjQ?(e(|1 zR2;9Kb4fedZTaYR09O63>@z}P#K)N!l-gKESP+RTm%A$gH|*0iSIV#2Gki-&$X(u2 zdPl*%@(fJDa;ncn^C=u2V0+$cg{{P`^4M*}(dALKy=n{D%^CJkdOzAcN zKDHXbJv?d)bYotmmR?ab=!eHM$YjTS6=f-CY1-z0~VFHAH zc=JltglINU_F%Ryybq#tA>zujo_J_T zQ1b-cU<1__bM+r_8qNg4fQN&-ehf5^-b2lvPGeQtS+r@DvW^EzVly)>ta;TtCv!u5 zUkqw^6^xr>Bcn%)Kb_zb@j&%VjU{!%G*WlOgTBzt=+_!#T3higl#oj);r{B6eTvp! zU)9D-U#Fokqax!zX4of=6&Vno4EEb8{SqV0P7JkcC18JG^4A;U@K8HFpqmwdE0oi1 z-b2gmcF%JNmhmpq@HGLpd`|>G?xUr2#hEQ?3;?8R(@(`p*hMEJ*J6y56Sth$oXtP>tclWo!T7tnI?~q!z~$aIiTY&+#AMd}_$3zeq;uhm>R1bnEbo#SeZ1WPkuuY_*gLCe; zJXoSR8#^gDmmK<1FI|d zKywFnU=arR?XCcx+9C{Q`-b@V#rI7T4$$_}j^pH%iw!`*A~{@obYv(&%GfF|EC}$c z$f}aPUSXIw@hSHDUa!-2En)JfQr*OPjQw!=`Bxx(uoD_zE*4Jso%!2IaW$~g% zy^Hw%!NWRkRnoSRIbfQ=S^RwOwrpI_obL(hsd@#Qk9j8Kw0)$ewGce_%jbMY(nWJ3 z>FP(VG}+f+J?;XpiBOp^E(^cOJ1HD*lRu;+(Z$V|!t(uB@Io!b|3lb=wtUNz3@F%~ ziPTi`G=Ys53@%X*ou#AvjB>PbiRHNhx16u9K_9h(ee2i3>*pcPrHFtDzu(0?Ml^5oAdqQ>~D}B?&!aZtuEy z*Xhiv;wAN;I#pWC<-$d82Zj(f^}N60tUnsych(NjDqI%lj1P1on^nkf-!}H&wU+ar zd5bXXN|HLumM}SY==L5-1mERZ5uos+-nm!@oyWBkT8raQ1P}!>INCjH$x5o+REy&5 zdMSvoc^f#DeC>Q?n_j5 zj*1nmsFr-0Q0p)CqkP9(NDv#~&*ZM$FZ5T2_m>(8qQ%s{KfjXSC$D!(KHc-oGu+i< zVv=Q_J26dlV2sGW`(SAZ&Ej|5K8xKRl|IOLUW(PsQ{F!UsGR5;ReC79MNBOa+*hGC zj%i72869bIM@#9Ue3%!uR$82L_T?WC4XC<14<;nZo+NKX6%h#=6NxXA9C{JW*(}EP zI6ENp~-P9fM6pP z^yqi(Zrg0)tTA>f9|b*F;yiPP-tW3QWleWb?;+2t^Gw*`Busz}(8HSFoS22{G==&p zJNU}uWe_J%V2Y-^=*C?tU*sn&IlT$~tVK*lOlH|7Y;h^u>Dd571$n8!6*h4}^>=PP zPumZfLmmj*t=7mtWt=U~a8II-UbO_Ck;Zy)QFo_YHA3Tt9K)bn00t7f5dYx~X@Y~! zxEx#g-y0YSP)D3OG|N*i%%t78uW=Z4+&KT1V0YR+ZBtGSuuPL16t2zuek#qSL$vzT zDjOk6KWN{Tc0t~hjcM(#TLB3idf?5ke_pB&$rqSrYM$|6Mu^k&(;HWr_WSKqS|1OS zq!UYnDetwvI1|3*O}q85Q02k^wE6+xmtM?;H)b5$e^BIxBT~~`-ufVqZiImDcfQ$n z#kC`~cy#u_PX3Npw;eOYNvjUVRevGZGmDYfDCmlV3#3%n@z5jpj#uTbyXK>EaPsC#*XjVBxt=|%F#5c)Z9jP>e{mj1`ez`?f8gkM6(CIOm0x(7HumkWy=NY@stWE+I z;8XiX%i?D+tfdp?GSCh}%8Ij5|2kkA#NPjMDpBtbxsdA1$FDba^qDj5>b*Lcx0p{> zBaGqiwi%5W@fBJPy>^2aHla4WE3Z;`N5iifks{BfJU`Q8ujx$S+KJjBl29UJREuFx zxSW&ogWGtnpn1%dme}EVVwcj(+DW>NhV~itC3~8rNwiKP90N6>C6v-ezPnSLrms}~dip`P zbb^oXQ6bsN0?YCz&-wC4^VdK4YrNK8riiLddeafwny%XdxubySEFR#o2F8_<`Qt{? z)?nALMNw!!5e7KS!G88&3>}OGiY9Rc+zl<1+fE4EMPeE;vtD(>zS$|VgA;PidtsGN6?Q&+s(e*AgdM< z_r?)3F?s71>r+ch^@N{hpn^s5QcH~NO6c{4w(_`F%5DKoO#?G+?5jK6$TfGde|&i1 zi+E}^=j1|`mKtJ`#1EwmTFh6ssrvy&A#6|95BgtJp;$SvSih%4(#x1NU604FkAE)c z#E5!!oxVQ`9jpH9WGFB_xkQ>ZcUV1vU!IGZDHcUQ`c-<=*BkE%Zq0Z|yN&6rMfAlf zWyM-{*AY9x@+$CZh6|Metw#X)FxH$C03r+lNMzGj?p}Ih`@7PM?tCC_(n*~=hOF0- zXrc-tjFp3Fk>?gr!*aNLVuM!K+Bx(b;>8Kza&7>2vZI^I$4s#8c04bH|7JVaWG@NJ^xXHt_on_A?*QDI&|U zD*7-b+7lBX@`>;El>RyE(%O3n0r_|>YD`3{R^}d(_7SUIK@4%_y1PW

N6zEw?TO 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

7k?om~ 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 + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3981f30fc3..d4acbaa67b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -44,4 +44,5 @@ Patcher Help translate! What\'s New + No patches are selected! \ No newline at end of file From 8bfc98461db295d15274e17ebfe1fc574983d115 Mon Sep 17 00:00:00 2001 From: Ushie Date: Thu, 30 Jun 2022 20:52:45 +0300 Subject: [PATCH 017/132] feat: material colored socials --- .../main/java/app/revanced/manager/ui/screens/AboutScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index af00ba2090..79d857e62a 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -73,7 +73,7 @@ fun AboutScreen( Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { for ((social_ic, uri) in socialLinks.entries) { IconButton(onClick = { currentUriHandler.openUri(uri) }) { - Icon(painter = painterResource(social_ic), contentDescription = "Links") + Icon(painter = painterResource(social_ic), contentDescription = "Links", tint = MaterialTheme.colorScheme.primary) } } } From 8aa76d8a40c914ea296993e1b7a48a491ac30ea2 Mon Sep 17 00:00:00 2001 From: Ushie Date: Thu, 30 Jun 2022 21:16:54 +0300 Subject: [PATCH 018/132] added telegram icons files --- app/src/main/res/drawable/telegram_filled.xml | 9 +++++++++ app/src/main/res/drawable/telegram_outline.xml | 9 +++++++++ 2 files changed, 18 insertions(+) create mode 100644 app/src/main/res/drawable/telegram_filled.xml create mode 100644 app/src/main/res/drawable/telegram_outline.xml diff --git a/app/src/main/res/drawable/telegram_filled.xml b/app/src/main/res/drawable/telegram_filled.xml new file mode 100644 index 0000000000..fb14043f07 --- /dev/null +++ b/app/src/main/res/drawable/telegram_filled.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/telegram_outline.xml b/app/src/main/res/drawable/telegram_outline.xml new file mode 100644 index 0000000000..719948c89b --- /dev/null +++ b/app/src/main/res/drawable/telegram_outline.xml @@ -0,0 +1,9 @@ + + + From 95b4a9e3da5a65781c8d687b5914d19477ff342f Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Fri, 1 Jul 2022 00:01:58 +0530 Subject: [PATCH 019/132] feat: added telegram logo and commented yt logo. --- app/src/main/java/app/revanced/manager/Global.kt | 4 +++- .../drawable/{telegram_filled.xml => ic_telegram_filled.xml} | 4 ++-- .../{telegram_outline.xml => ic_telegram_outline.xml} | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) rename app/src/main/res/drawable/{telegram_filled.xml => ic_telegram_filled.xml} (89%) rename app/src/main/res/drawable/{telegram_outline.xml => ic_telegram_outline.xml} (94%) diff --git a/app/src/main/java/app/revanced/manager/Global.kt b/app/src/main/java/app/revanced/manager/Global.kt index 999cb91864..8f32aa5f00 100644 --- a/app/src/main/java/app/revanced/manager/Global.kt +++ b/app/src/main/java/app/revanced/manager/Global.kt @@ -9,8 +9,10 @@ class Global { R.drawable.ic_discord to "$websiteUrl/discord", R.drawable.ic_github to "$websiteUrl/github", R.drawable.ic_twitter to "https://twitter.com/revancedapp", - R.drawable.ic_youtube to "https://youtube.com/channel/UCLktAUh5Gza9zAJBStwxNdw", R.drawable.ic_reddit to "https://reddit.com/r/revancedapp", + R.drawable.ic_telegram_filled to "https://t.me/app_revanced", + // R.drawable.ic_youtube to "https://youtube.com/channel/UCLktAUh5Gza9zAJBStwxNdw", + ) private const val ghOrg = "revanced" diff --git a/app/src/main/res/drawable/telegram_filled.xml b/app/src/main/res/drawable/ic_telegram_filled.xml similarity index 89% rename from app/src/main/res/drawable/telegram_filled.xml rename to app/src/main/res/drawable/ic_telegram_filled.xml index fb14043f07..8d49ccded1 100644 --- a/app/src/main/res/drawable/telegram_filled.xml +++ b/app/src/main/res/drawable/ic_telegram_filled.xml @@ -1,6 +1,6 @@ + android:fillColor="#000"/> From 4a06c8abf1b20c5931009982bf812daa5da8f7ed Mon Sep 17 00:00:00 2001 From: Ushie Date: Thu, 30 Jun 2022 21:42:57 +0300 Subject: [PATCH 020/132] tinted header icon --- app/src/main/java/app/revanced/manager/Global.kt | 2 +- .../java/app/revanced/manager/ui/screens/AboutScreen.kt | 7 ++++--- .../drawable/{ic_telegram_filled.xml => ic_telegram.xml} | 0 app/src/main/res/drawable/ic_telegram_outline.xml | 9 --------- 4 files changed, 5 insertions(+), 13 deletions(-) rename app/src/main/res/drawable/{ic_telegram_filled.xml => ic_telegram.xml} (100%) delete mode 100644 app/src/main/res/drawable/ic_telegram_outline.xml diff --git a/app/src/main/java/app/revanced/manager/Global.kt b/app/src/main/java/app/revanced/manager/Global.kt index 8f32aa5f00..b6969620ad 100644 --- a/app/src/main/java/app/revanced/manager/Global.kt +++ b/app/src/main/java/app/revanced/manager/Global.kt @@ -10,7 +10,7 @@ class Global { R.drawable.ic_github to "$websiteUrl/github", R.drawable.ic_twitter to "https://twitter.com/revancedapp", R.drawable.ic_reddit to "https://reddit.com/r/revancedapp", - R.drawable.ic_telegram_filled to "https://t.me/app_revanced", + R.drawable.ic_telegram to "https://t.me/app_revanced", // R.drawable.ic_youtube to "https://youtube.com/channel/UCLktAUh5Gza9zAJBStwxNdw", ) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 79d857e62a..6bdafb972e 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -48,6 +48,7 @@ fun AboutScreen( .align(Alignment.TopCenter) .padding(32.dp) .size(100.dp), + tint = MaterialTheme.colorScheme.primary ) } Divider(Modifier.alpha(.5f)) @@ -66,9 +67,9 @@ fun AboutScreen( onClick = { currentUriHandler.openUri("https://revanced.app") } ) - Text( - text = vm.contributorName, - ) +// Text( +// text = vm.contributorName, +// ) Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { for ((social_ic, uri) in socialLinks.entries) { diff --git a/app/src/main/res/drawable/ic_telegram_filled.xml b/app/src/main/res/drawable/ic_telegram.xml similarity index 100% rename from app/src/main/res/drawable/ic_telegram_filled.xml rename to app/src/main/res/drawable/ic_telegram.xml diff --git a/app/src/main/res/drawable/ic_telegram_outline.xml b/app/src/main/res/drawable/ic_telegram_outline.xml deleted file mode 100644 index f10a93fdae..0000000000 --- a/app/src/main/res/drawable/ic_telegram_outline.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - From c8c73c93ef79367cf53ba808a28f8e1adec31827 Mon Sep 17 00:00:00 2001 From: Can Kolay Date: Wed, 29 Jun 2022 13:14:18 +0300 Subject: [PATCH 021/132] feat: add github workflows --- .github/workflows/build_debug_apk.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/build_debug_apk.yml diff --git a/.github/workflows/build_debug_apk.yml b/.github/workflows/build_debug_apk.yml new file mode 100644 index 0000000000..7b9694936c --- /dev/null +++ b/.github/workflows/build_debug_apk.yml @@ -0,0 +1,19 @@ +name: Build + +on: push + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Clone repository + uses: actions/checkout@v2 + + - name: Build + run: export GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} && chmod +x gradlew && ./gradlew assembleDebug + + - name: Store generated APK file + uses: actions/upload-artifact@v2 + with: + name: revanced-manager + path: ./app/build/outputs/apk/debug/app-debug.apk From 92ae63604e53bd58a34e1b54d9c2a7096508f050 Mon Sep 17 00:00:00 2001 From: Ushie Date: Fri, 1 Jul 2022 14:26:54 +0300 Subject: [PATCH 022/132] make websiteUrl public --- app/src/main/java/app/revanced/manager/Global.kt | 2 +- .../main/java/app/revanced/manager/ui/screens/AboutScreen.kt | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/Global.kt b/app/src/main/java/app/revanced/manager/Global.kt index b6969620ad..58908e9366 100644 --- a/app/src/main/java/app/revanced/manager/Global.kt +++ b/app/src/main/java/app/revanced/manager/Global.kt @@ -2,7 +2,7 @@ package app.revanced.manager class Global { companion object { - private const val websiteUrl = "https://revanced.app" + const val websiteUrl = "https://revanced.app" val socialLinks = mapOf( R.drawable.ic_web to "$websiteUrl", diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 6bdafb972e..5a0eaa3868 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.text.style.TextAlign import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel +import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.backend.api.GitHubAPI import app.revanced.manager.ui.components.ExpandableCard import app.revanced.manager.ui.components.PreferenceRow @@ -59,12 +60,12 @@ fun AboutScreen( PreferenceRow( title = stringResource(R.string.whats_new), - onClick = { currentUriHandler.openUri("https://revanced.app") }, + onClick = { currentUriHandler.openUri(websiteUrl) }, ) PreferenceRow( title = stringResource(R.string.help_translate), - onClick = { currentUriHandler.openUri("https://revanced.app") } + onClick = { currentUriHandler.openUri(websiteUrl) } ) // Text( From 18b98cd1b6bec6c26a7d2866ebccc24a5c7de53e Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Fri, 1 Jul 2022 19:04:45 +0530 Subject: [PATCH 023/132] feat: fetch top contributor of patches. --- .../main/java/app/revanced/manager/backend/api/GitHubAPI.kt | 5 ++--- .../main/java/app/revanced/manager/ui/screens/AboutScreen.kt | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt b/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt index 5ddd42beb2..fa70966d4a 100644 --- a/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt +++ b/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt @@ -65,10 +65,9 @@ object GitHubAPI { } object Contributors { - suspend fun contributors(org: String, repo: String) : Contributor { + suspend fun contributors(org: String, repo: String) : List { Log.d(tag, "Fetching contributors for repo ($repo)") - val res: Contributors.Contributor = client.get("$baseUrl/$org/$repo/contributors") { - parameter("per_page", 1) + val res: List = client.get("$baseUrl/$org/$repo/contributors") { }.body() return res } diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 5a0eaa3868..d2abd062ae 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -103,12 +103,12 @@ class AboutViewModel : ViewModel() { private fun fetchContributors() { viewModelScope.launch { try { - _fetchContributorName = GitHubAPI.Contributors.contributors("revanced", "revanced-patches") + _fetchContributorName = GitHubAPI.Contributors.contributors("revanced", "revanced-patches").first() } catch (e: Exception) { Log.e(tag, "failed to fetch contributor names", e) } try { - _fetchContributorName = GitHubAPI.Contributors.contributors("revanced", "revanced-patches") + _fetchContributorName = GitHubAPI.Contributors.contributors("revanced", "revanced-patches").first() } catch (e: Exception) { Log.e(tag, "failed to fetch latest contributor names", e) } From 5877a85b94b365ed08dbe1970f16832fe7d7835b Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Fri, 1 Jul 2022 21:15:55 +0530 Subject: [PATCH 024/132] refactor: added strings to strings.xml for easier translation. --- .../main/java/app/revanced/manager/ui/screens/AboutScreen.kt | 2 +- app/src/main/res/values/strings.xml | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index d2abd062ae..1b054eba04 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -54,7 +54,7 @@ fun AboutScreen( } Divider(Modifier.alpha(.5f)) - ExpandableCard("Patcher Credits") + ExpandableCard(stringResource(R.string.patcher_credits)) var currentUriHandler = LocalUriHandler.current diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d4acbaa67b..e84d3d5d3e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -45,4 +45,5 @@ Help translate! What\'s New No patches are selected! + Patcher Credits \ No newline at end of file From ee7b66e9bbb2d19e7024530cff427f7c72000695 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Fri, 1 Jul 2022 23:08:13 +0530 Subject: [PATCH 025/132] refactor: moved AboutViewModel.kt to separate file. --- app/build.gradle.kts | 3 + .../manager/ui/components/ExpandableCard.kt | 34 +++++++---- .../manager/ui/models/AboutViewModel.kt | 44 ++++++++++++++ .../manager/ui/screens/AboutScreen.kt | 57 +++++++------------ 4 files changed, 91 insertions(+), 47 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 00ffc20ca2..dea4638b66 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -139,6 +139,9 @@ dependencies { androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0") androidTestImplementation("androidx.compose.ui:ui-test-junit4:$composeVersion") implementation(kotlin("script-runtime")) + + // Coil for network image + implementation("io.coil-kt:coil-compose:2.1.0") } fun org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions.optIn(library: String) { diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt index 1d1ce8f719..8cd630f1c4 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt @@ -1,14 +1,13 @@ package app.revanced.manager.ui.components import android.icu.text.CaseMap.Title +import android.util.Log import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.LinearOutSlowInEasing import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.ContentAlpha import androidx.compose.material.icons.Icons @@ -18,17 +17,25 @@ import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.rotate import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp +import coil.compose.AsyncImage +import app.revanced.manager.ui.models.AboutViewModel +import androidx.lifecycle.viewmodel.compose.viewModel + + +private const val tag = "Expandable Card" @Composable @ExperimentalMaterial3Api fun ExpandableCard( title: String, + vm: AboutViewModel = viewModel() ) { var expandedState by remember { mutableStateOf(false) } val rotateState by animateFloatAsState(targetValue = if (expandedState) 180f else 0f) @@ -77,12 +84,19 @@ fun ExpandableCard( } } if (expandedState) { - Text( - text = "Me \n" + "Me\n" + "Me", - fontSize = MaterialTheme.typography.bodySmall.fontSize, - fontWeight = FontWeight.Normal, - overflow = TextOverflow.Ellipsis - ) + Row(modifier = Modifier.fillMaxWidth()) { + AsyncImage( + model = "${vm.contributorAvatar}", + contentDescription = "image", + modifier = Modifier + .size(40.dp). + clip(CircleShape) + ) + Text( + text = vm.contributorName, + ) + Log.e(tag, vm.contributorAvatar) + } } } } diff --git a/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt b/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt new file mode 100644 index 0000000000..5b4f911b9c --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt @@ -0,0 +1,44 @@ +package app.revanced.manager.ui.models + +import android.util.Log +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import app.revanced.manager.backend.api.GitHubAPI +import kotlinx.coroutines.launch + +class AboutViewModel : ViewModel() { + private val tag = "AboutViewModel" + + private var _fetchContributorName : GitHubAPI.Contributors.Contributor? by mutableStateOf(null) + val contributorName: String + get() = _fetchContributorName?.login ?: "Null" + + private var _fetchContributorAvatar : GitHubAPI.Contributors.Contributor? by mutableStateOf(null) + val contributorAvatar: String + get() = _fetchContributorAvatar?.avatar_url ?: "Null" + + private var _fetchContributorProfile : GitHubAPI.Contributors.Contributor? by mutableStateOf(null) + val contributorProfile: String + get() = _fetchContributorProfile?.url ?: "Null" + + init { + fetchContributors() + } + private fun fetchContributors() { + viewModelScope.launch { + try { + _fetchContributorName = GitHubAPI.Contributors.contributors("revanced", "revanced-manager").elementAt(4) + } catch (e: Exception) { + Log.e(tag, "failed to fetch contributor names", e) + } + try { + _fetchContributorAvatar = GitHubAPI.Contributors.contributors("revanced", "revanced-manager").elementAt(4) + } catch (e: Exception) { + Log.e(tag, "failed to fetch latest contributor avatar", e) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 1b054eba04..70061b4741 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -2,7 +2,9 @@ package app.revanced.manager.ui.screens import android.util.Log +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* +import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material.IconButton import androidx.compose.material3.* @@ -10,6 +12,7 @@ import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.ramcosta.composedestinations.annotation.Destination @@ -26,7 +29,10 @@ import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.backend.api.GitHubAPI import app.revanced.manager.ui.components.ExpandableCard import app.revanced.manager.ui.components.PreferenceRow +import coil.ImageLoader +import coil.compose.AsyncImage import kotlinx.coroutines.launch +import app.revanced.manager.ui.models.AboutViewModel private const val tag = "AboutScreen" @@ -39,6 +45,7 @@ fun AboutScreen( vm: AboutViewModel = viewModel() ) { + Column(Modifier.padding(8.dp)) { Box() { Icon( @@ -68,9 +75,19 @@ fun AboutScreen( onClick = { currentUriHandler.openUri(websiteUrl) } ) -// Text( -// text = vm.contributorName, -// ) +// Row(modifier = Modifier.fillMaxWidth()) { +// AsyncImage( +// model = "${vm.contributorAvatar}", +// contentDescription = "image", +// modifier = Modifier +// .size(40.dp). +// clip(CircleShape) +// ) +// Text( +// text = vm.contributorName, +// ) +// Log.e(tag, vm.contributorAvatar) +// } Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { for ((social_ic, uri) in socialLinks.entries) { @@ -81,37 +98,3 @@ fun AboutScreen( } } } - -class AboutViewModel : ViewModel() { - private val tag = "AboutViewModel" - - private var _fetchContributorName : GitHubAPI.Contributors.Contributor? by mutableStateOf(null) - val contributorName: String - get() = _fetchContributorName?.login ?: "Null" - - private var _fetchContributorAvatar : GitHubAPI.Contributors.Contributor? by mutableStateOf(null) - val contributorAvatar: String - get() = _fetchContributorAvatar?.login ?: "Null" - - private var _fetchContributorProfile : GitHubAPI.Contributors.Contributor? by mutableStateOf(null) - val contributorProfile: String - get() = _fetchContributorProfile?.login ?: "Null" - - init { - fetchContributors() - } - private fun fetchContributors() { - viewModelScope.launch { - try { - _fetchContributorName = GitHubAPI.Contributors.contributors("revanced", "revanced-patches").first() - } catch (e: Exception) { - Log.e(tag, "failed to fetch contributor names", e) - } - try { - _fetchContributorName = GitHubAPI.Contributors.contributors("revanced", "revanced-patches").first() - } catch (e: Exception) { - Log.e(tag, "failed to fetch latest contributor names", e) - } - } - } -} \ No newline at end of file From 2f0ef843ca51be708f4d4705fdb4a6988f3c9f6f Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 2 Jul 2022 01:46:53 +0530 Subject: [PATCH 026/132] feat: patcher credits. and lots of refactoring. --- .../revanced/manager/backend/api/GitHubAPI.kt | 2 +- .../manager/ui/components/ExpandableCard.kt | 49 ++++++++++++------- .../manager/ui/models/AboutViewModel.kt | 39 +++++---------- .../manager/ui/screens/AboutScreen.kt | 25 ---------- app/src/main/res/values/strings.xml | 2 + 5 files changed, 44 insertions(+), 73 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt b/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt index fa70966d4a..13af96cffd 100644 --- a/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt +++ b/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt @@ -75,7 +75,7 @@ object GitHubAPI { class Contributor( @SerialName("login") val login: String, @SerialName("avatar_url") val avatar_url: String, - @SerialName("url") val url: String, + @SerialName("html_url") val url: String, ) } } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt index 8cd630f1c4..0b406ee7cb 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt @@ -1,14 +1,15 @@ package app.revanced.manager.ui.components -import android.icu.text.CaseMap.Title -import android.util.Log import androidx.compose.animation.animateContentSize import androidx.compose.animation.core.LinearOutSlowInEasing import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll import androidx.compose.material.ContentAlpha import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowDropDown @@ -19,13 +20,15 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.rotate +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import coil.compose.AsyncImage import app.revanced.manager.ui.models.AboutViewModel import androidx.lifecycle.viewmodel.compose.viewModel +import app.revanced.manager.R +import coil.compose.AsyncImage private const val tag = "Expandable Card" @@ -43,6 +46,7 @@ fun ExpandableCard( Card( modifier = Modifier .fillMaxWidth() + .verticalScroll(state = rememberScrollState()) .padding(8.dp) .animateContentSize( animationSpec = tween( @@ -51,9 +55,6 @@ fun ExpandableCard( ) ), shape = RoundedCornerShape(8.dp), - onClick = { - expandedState = !expandedState - } ) { Column( modifier = Modifier @@ -84,19 +85,29 @@ fun ExpandableCard( } } if (expandedState) { - Row(modifier = Modifier.fillMaxWidth()) { - AsyncImage( - model = "${vm.contributorAvatar}", - contentDescription = "image", - modifier = Modifier - .size(40.dp). - clip(CircleShape) - ) - Text( - text = vm.contributorName, - ) - Log.e(tag, vm.contributorAvatar) + if(vm.contributorsList.isNotEmpty()) { + var currentUriHandler = LocalUriHandler.current + + for(contributor in vm.contributorsList) { + Row( + Modifier + .fillMaxWidth()) { + AsyncImage( + model = contributor.avatar_url, + contentDescription = stringResource(id = R.string.contributor_image), + Modifier + .size(40.dp) + .clip(CircleShape) + .clickable { + currentUriHandler.openUri(contributor.url) + } + ) + Text(text = contributor.login) + + } + } } + Text(text = stringResource(R.string.no_contributors)) } } } diff --git a/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt b/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt index 5b4f911b9c..06afaf37b5 100644 --- a/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt @@ -1,9 +1,6 @@ package app.revanced.manager.ui.models -import android.util.Log -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.setValue +import androidx.compose.runtime.mutableStateListOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import app.revanced.manager.backend.api.GitHubAPI @@ -12,33 +9,19 @@ import kotlinx.coroutines.launch class AboutViewModel : ViewModel() { private val tag = "AboutViewModel" - private var _fetchContributorName : GitHubAPI.Contributors.Contributor? by mutableStateOf(null) - val contributorName: String - get() = _fetchContributorName?.login ?: "Null" + val contributorsList = mutableStateListOf() - private var _fetchContributorAvatar : GitHubAPI.Contributors.Contributor? by mutableStateOf(null) - val contributorAvatar: String - get() = _fetchContributorAvatar?.avatar_url ?: "Null" - - private var _fetchContributorProfile : GitHubAPI.Contributors.Contributor? by mutableStateOf(null) - val contributorProfile: String - get() = _fetchContributorProfile?.url ?: "Null" - - init { - fetchContributors() - } - private fun fetchContributors() { + fun load() { viewModelScope.launch { - try { - _fetchContributorName = GitHubAPI.Contributors.contributors("revanced", "revanced-manager").elementAt(4) - } catch (e: Exception) { - Log.e(tag, "failed to fetch contributor names", e) - } - try { - _fetchContributorAvatar = GitHubAPI.Contributors.contributors("revanced", "revanced-manager").elementAt(4) - } catch (e: Exception) { - Log.e(tag, "failed to fetch latest contributor avatar", e) + val githubContributors = GitHubAPI.Contributors.contributors("Aunali321","revanced-manager") + githubContributors.sortedByDescending { + contributorsList.add(it) } } } + + init { + load() + } + } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 70061b4741..1ab8cba655 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -1,10 +1,7 @@ package app.revanced.manager.ui.screens -import android.util.Log -import androidx.compose.foundation.Image import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.CircleShape import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material.IconButton import androidx.compose.material3.* @@ -12,7 +9,6 @@ import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha -import androidx.compose.ui.draw.clip import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import com.ramcosta.composedestinations.annotation.Destination @@ -21,17 +17,10 @@ import app.revanced.manager.R import app.revanced.manager.Global.Companion.socialLinks import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.style.TextAlign -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import app.revanced.manager.Global.Companion.websiteUrl -import app.revanced.manager.backend.api.GitHubAPI import app.revanced.manager.ui.components.ExpandableCard import app.revanced.manager.ui.components.PreferenceRow -import coil.ImageLoader -import coil.compose.AsyncImage -import kotlinx.coroutines.launch import app.revanced.manager.ui.models.AboutViewModel private const val tag = "AboutScreen" @@ -75,20 +64,6 @@ fun AboutScreen( onClick = { currentUriHandler.openUri(websiteUrl) } ) -// Row(modifier = Modifier.fillMaxWidth()) { -// AsyncImage( -// model = "${vm.contributorAvatar}", -// contentDescription = "image", -// modifier = Modifier -// .size(40.dp). -// clip(CircleShape) -// ) -// Text( -// text = vm.contributorName, -// ) -// Log.e(tag, vm.contributorAvatar) -// } - Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { for ((social_ic, uri) in socialLinks.entries) { IconButton(onClick = { currentUriHandler.openUri(uri) }) { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e84d3d5d3e..935fc1ab6c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -46,4 +46,6 @@ What\'s New No patches are selected! Patcher Credits + Contributor image + No contributors \ No newline at end of file From f3e2be5854933264b7a886507228b92ac38923a5 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 2 Jul 2022 02:19:26 +0530 Subject: [PATCH 027/132] feat: grid of avatars and fixed duplicate contributors. --- .../manager/ui/components/ExpandableCard.kt | 43 +++++++++++++++---- .../manager/ui/models/AboutViewModel.kt | 3 +- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt index 0b406ee7cb..bbd67656df 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt @@ -6,6 +6,9 @@ import androidx.compose.animation.core.animateFloatAsState import androidx.compose.animation.core.tween import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape @@ -88,11 +91,33 @@ fun ExpandableCard( if(vm.contributorsList.isNotEmpty()) { var currentUriHandler = LocalUriHandler.current - for(contributor in vm.contributorsList) { - Row( - Modifier - .fillMaxWidth()) { - AsyncImage( +// for(contributor in vm.contributorsList) { +// Row( +// Modifier +// .fillMaxWidth()) { +// AsyncImage( +// model = contributor.avatar_url, +// contentDescription = stringResource(id = R.string.contributor_image), +// Modifier +// .size(40.dp) +// .clip(CircleShape) +// .clickable { +// currentUriHandler.openUri(contributor.url) +// } +// ) +// Text(text = contributor.login) +// +// } +// } + + Box(Modifier.height(100.dp)){ + LazyVerticalGrid( + columns = GridCells.Adaptive(48.dp), + verticalArrangement = Arrangement.spacedBy(4.dp), + horizontalArrangement = Arrangement.spacedBy(4.dp) + ) { + items(vm.contributorsList) { + contributor -> AsyncImage( model = contributor.avatar_url, contentDescription = stringResource(id = R.string.contributor_image), Modifier @@ -102,12 +127,12 @@ fun ExpandableCard( currentUriHandler.openUri(contributor.url) } ) - Text(text = contributor.login) - - } + } } + } + } else { + CircularProgressIndicator() } - Text(text = stringResource(R.string.no_contributors)) } } } diff --git a/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt b/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt index 06afaf37b5..705c2ec64e 100644 --- a/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt @@ -15,8 +15,9 @@ class AboutViewModel : ViewModel() { viewModelScope.launch { val githubContributors = GitHubAPI.Contributors.contributors("Aunali321","revanced-manager") githubContributors.sortedByDescending { - contributorsList.add(it) + it.login } + contributorsList.addAll(githubContributors) } } From e579e5d7924f3c6c5ec9fc9568bb2082a45a16af Mon Sep 17 00:00:00 2001 From: Ushie Date: Sat, 2 Jul 2022 05:35:22 +0300 Subject: [PATCH 028/132] UI changes: new navbar tab, added a proper about page, renamed credits to contributors, added placeholder settings page --- .../manager/ui/components/ExpandableCard.kt | 4 +- ...tViewModel.kt => ContributorsViewModel.kt} | 4 +- .../manager/ui/screens/AboutScreen.kt | 35 ++++----- .../manager/ui/screens/ContributorsScreen.kt | 49 +++++++++++++ .../revanced/manager/ui/screens/MainScreen.kt | 42 +++++++++-- .../ui/screens/MainScreenDestinations.kt | 6 ++ .../manager/ui/screens/SettingsScreen.kt | 31 ++++++++ .../mainsubscreens/DashboardSubscreen.kt | 11 +-- .../screens/mainsubscreens/MoreSubscreen.kt | 73 +++++++++++++++++++ .../res/drawable/ic_baseline_favorite_24.xml | 5 ++ .../main/res/drawable/ic_baseline_help_24.xml | 5 ++ .../main/res/drawable/ic_baseline_info_24.xml | 5 ++ .../drawable/ic_baseline_more_horiz_24.xml | 5 ++ .../drawable/ic_baseline_new_releases_24.xml | 5 ++ .../res/drawable/ic_baseline_settings_24.xml | 5 ++ .../res/drawable/ic_translate_black_24dp.xml | 9 +++ app/src/main/res/values/strings.xml | 15 ++-- 17 files changed, 264 insertions(+), 45 deletions(-) rename app/src/main/java/app/revanced/manager/ui/models/{AboutViewModel.kt => ContributorsViewModel.kt} (88%) create mode 100644 app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt create mode 100644 app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt create mode 100644 app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt create mode 100644 app/src/main/res/drawable/ic_baseline_favorite_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_help_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_info_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_more_horiz_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_new_releases_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_settings_24.xml create mode 100644 app/src/main/res/drawable/ic_translate_black_24dp.xml diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt index bbd67656df..f1cb6c4da3 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt @@ -28,7 +28,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import app.revanced.manager.ui.models.AboutViewModel +import app.revanced.manager.ui.models.ContributorsViewModel import androidx.lifecycle.viewmodel.compose.viewModel import app.revanced.manager.R import coil.compose.AsyncImage @@ -41,7 +41,7 @@ private const val tag = "Expandable Card" @ExperimentalMaterial3Api fun ExpandableCard( title: String, - vm: AboutViewModel = viewModel() + vm: ContributorsViewModel = viewModel() ) { var expandedState by remember { mutableStateOf(false) } val rotateState by animateFloatAsState(targetValue = if (expandedState) 180f else 0f) diff --git a/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt b/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt similarity index 88% rename from app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt rename to app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt index 705c2ec64e..9ae521aba0 100644 --- a/app/src/main/java/app/revanced/manager/ui/models/AboutViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt @@ -6,8 +6,8 @@ import androidx.lifecycle.viewModelScope import app.revanced.manager.backend.api.GitHubAPI import kotlinx.coroutines.launch -class AboutViewModel : ViewModel() { - private val tag = "AboutViewModel" +class ContributorsViewModel : ViewModel() { + private val tag = "ContributorsViewModel" val contributorsList = mutableStateListOf() diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 1ab8cba655..6c97797bfa 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -1,27 +1,25 @@ package app.revanced.manager.ui.screens - import androidx.compose.foundation.layout.* -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material.IconButton -import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.material3.Divider +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.ramcosta.composedestinations.annotation.Destination -import com.ramcosta.composedestinations.annotation.RootNavGraph -import app.revanced.manager.R import app.revanced.manager.Global.Companion.socialLinks -import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.stringResource -import androidx.lifecycle.viewmodel.compose.viewModel import app.revanced.manager.Global.Companion.websiteUrl -import app.revanced.manager.ui.components.ExpandableCard +import app.revanced.manager.R import app.revanced.manager.ui.components.PreferenceRow -import app.revanced.manager.ui.models.AboutViewModel +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootNavGraph private const val tag = "AboutScreen" @@ -30,11 +28,8 @@ private const val tag = "AboutScreen" @RootNavGraph @Composable fun AboutScreen( -// navigator: NavController, - vm: AboutViewModel = viewModel() + // navigator: NavController, ) { - - Column(Modifier.padding(8.dp)) { Box() { Icon( @@ -50,17 +45,17 @@ fun AboutScreen( } Divider(Modifier.alpha(.5f)) - ExpandableCard(stringResource(R.string.patcher_credits)) - var currentUriHandler = LocalUriHandler.current PreferenceRow( title = stringResource(R.string.whats_new), + painter = painterResource(id = R.drawable.ic_baseline_new_releases_24 + ), onClick = { currentUriHandler.openUri(websiteUrl) }, ) - PreferenceRow( title = stringResource(R.string.help_translate), + painter = painterResource(id = R.drawable.ic_translate_black_24dp), onClick = { currentUriHandler.openUri(websiteUrl) } ) @@ -72,4 +67,4 @@ fun AboutScreen( } } } -} +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt new file mode 100644 index 0000000000..8c437e79bb --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -0,0 +1,49 @@ +package app.revanced.manager.ui.screens + +import androidx.compose.foundation.layout.* +import androidx.compose.material3.Divider +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import app.revanced.manager.R +import app.revanced.manager.ui.components.ExpandableCard +import app.revanced.manager.ui.models.ContributorsViewModel +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootNavGraph + +private const val tag = "ContributorsScreen" + +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@RootNavGraph +@Composable +fun ContributorsScreen( +// navigator: NavController, + vm: ContributorsViewModel = viewModel() +) { + Column(Modifier.padding(8.dp)) { + Box() { + Icon( + painterResource(id = R.drawable.ic_revanced), + contentDescription = "Header Icon", + modifier = Modifier + .fillMaxWidth() + .align(Alignment.TopCenter) + .padding(32.dp) + .size(100.dp), + tint = MaterialTheme.colorScheme.primary + ) + } + Divider(Modifier.alpha(.5f)) + + ExpandableCard(stringResource(R.string.patcher_contributors)) + } +} diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index 32e1a45480..6483dc4997 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -10,16 +10,12 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalUriHandler -import androidx.navigation.compose.currentBackStackEntryAsState +import androidx.compose.ui.res.stringResource import androidx.navigation.compose.rememberNavController -import app.revanced.manager.Global.Companion.socialLinks import app.revanced.manager.R import app.revanced.manager.ui.components.AppBar import app.revanced.manager.ui.components.BottomNavBar -import app.revanced.manager.ui.components.placeholders.Icon -import app.revanced.manager.ui.screens.destinations.AppSelectorScreenDestination -import app.revanced.manager.ui.screens.destinations.PatchesSelectorScreenDestination -import app.revanced.manager.ui.screens.destinations.AboutScreenDestination +import app.revanced.manager.ui.screens.destinations.* import com.ramcosta.composedestinations.DestinationsNavHost @OptIn(ExperimentalMaterial3Api::class) @@ -55,9 +51,35 @@ fun MainScreen() { } ) } + SettingsScreenDestination -> { + AppBar( + title = { stringResource(id = R.string.screen_settings_title) }, + navigationIcon = { + IconButton(onClick = { navController.navigateUp() }) { + androidx.compose.material3.Icon( + imageVector = Icons.Default.ArrowBack, + contentDescription = "Return" + ) + } + } + ) + } AboutScreenDestination -> { AppBar( - title = { Text(text = "About")}, + title = { stringResource(id = R.string.screen_about_title ) }, + navigationIcon = { + IconButton(onClick = { navController.navigateUp() }) { + androidx.compose.material3.Icon( + imageVector = Icons.Default.ArrowBack, + contentDescription = "Return" + ) + } + } + ) + } + ContributorsScreenDestination -> { + AppBar( + title = { Text(text = "Contributors")}, navigationIcon = { IconButton(onClick = { navController.navigateUp() }) { androidx.compose.material3.Icon( @@ -84,7 +106,11 @@ fun MainScreen() { && navController.appCurrentDestinationAsState().value != PatchesSelectorScreenDestination && - navController.appCurrentDestinationAsState().value != AboutScreenDestination + navController.appCurrentDestinationAsState().value != SettingsScreenDestination + && + navController.appCurrentDestinationAsState().value != AboutScreenDestination + && + navController.appCurrentDestinationAsState().value != ContributorsScreenDestination ) BottomNavBar(navController) }, content = { innerPadding -> diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreenDestinations.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreenDestinations.kt index e14d6e6e18..ddad974058 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreenDestinations.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreenDestinations.kt @@ -4,6 +4,7 @@ import androidx.annotation.StringRes import app.revanced.manager.R import app.revanced.manager.ui.screens.destinations.DashboardSubscreenDestination import app.revanced.manager.ui.screens.destinations.PatcherSubscreenDestination +import app.revanced.manager.ui.screens.destinations.MoreSubscreenDestination import com.ramcosta.composedestinations.spec.DirectionDestinationSpec enum class MainScreenDestinations( @@ -21,4 +22,9 @@ enum class MainScreenDestinations( R.drawable.ic_baseline_build_24, R.string.navigation_patcher ), + More( + MoreSubscreenDestination, + R.drawable.ic_baseline_more_horiz_24, + R.string.navigation_more + ), } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt new file mode 100644 index 0000000000..bb87d13ee9 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt @@ -0,0 +1,31 @@ +package app.revanced.manager.ui.screens + +import androidx.compose.foundation.layout.* +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootNavGraph + +private const val tag = "SettingsScreen" + +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@RootNavGraph +@Composable +fun SettingsScreen( +) { + Column() { + Box(modifier = Modifier.fillMaxSize()) { + Text( + text = "TODO", + style = MaterialTheme.typography.headlineMedium, + modifier = Modifier.align(Alignment.TopCenter).paddingFromBaseline(12.dp,0.dp) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt index 608ff8924d..0fd139afff 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt @@ -6,10 +6,7 @@ import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.currentCompositionLocalContext import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp @@ -17,10 +14,8 @@ import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import app.revanced.manager.R import app.revanced.manager.ui.models.DashboardViewModel -import app.revanced.manager.ui.screens.AboutScreen +import app.revanced.manager.ui.screens.destinations.ContributorsScreenDestination import com.ramcosta.composedestinations.annotation.Destination -import app.revanced.manager.ui.screens.destinations.AboutScreenDestination -import app.revanced.manager.ui.screens.destinations.AppSelectorScreenDestination import com.ramcosta.composedestinations.annotation.RootNavGraph @OptIn(ExperimentalMaterial3Api::class) @@ -88,7 +83,7 @@ fun DashboardSubscreen( } } Card( - onClick = { navigator.navigate(AboutScreenDestination().route) }, + onClick = { navigator.navigate(ContributorsScreenDestination().route) }, modifier = Modifier .padding(4.dp) .weight(1f) @@ -96,7 +91,7 @@ fun DashboardSubscreen( ) { Column(modifier = Modifier.padding(16.dp)) { Text( - text = stringResource(id = R.string.card_credits_header), + text = stringResource(id = R.string.card_contributors_header), style = MaterialTheme.typography.titleMedium ) Text( diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt new file mode 100644 index 0000000000..d5a9d842f0 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt @@ -0,0 +1,73 @@ +package app.revanced.manager.ui.screens.mainsubscreens + +import androidx.compose.foundation.layout.* +import androidx.compose.material3.Divider +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import app.revanced.manager.Global.Companion.websiteUrl +import app.revanced.manager.R +import app.revanced.manager.ui.components.PreferenceRow +import app.revanced.manager.ui.screens.destinations.AboutScreenDestination +import app.revanced.manager.ui.screens.destinations.ContributorsScreenDestination +import app.revanced.manager.ui.screens.destinations.SettingsScreenDestination +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootNavGraph + +private const val tag = "MoreScreen" + +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@Composable +@RootNavGraph +fun MoreSubscreen( + navigator: NavController, +) { + Column(Modifier.padding(8.dp)) { + Box() { + Icon( + painterResource(id = R.drawable.ic_revanced), + contentDescription = "Header Icon", + modifier = Modifier + .fillMaxWidth() + .align(Alignment.TopCenter) + .padding(32.dp) + .size(100.dp), + tint = MaterialTheme.colorScheme.primary + ) + } + Divider(Modifier.alpha(.5f)) + + var currentUriHandler = LocalUriHandler.current + + PreferenceRow( + title = stringResource(R.string.screen_settings_title), + painter = painterResource(id = R.drawable.ic_baseline_settings_24), + onClick = { navigator.navigate(SettingsScreenDestination().route) } + ) + PreferenceRow( + title = stringResource(R.string.screen_contributors_title), + painter = painterResource(id = R.drawable.ic_baseline_favorite_24 ), + onClick = { navigator.navigate(ContributorsScreenDestination().route) } + ) + PreferenceRow( + title = stringResource(R.string.screen_about_title), + painter = painterResource(id = R.drawable.ic_baseline_info_24), + onClick = { navigator.navigate(AboutScreenDestination().route) } + ) + PreferenceRow( + title = stringResource(R.string.help), + painter = painterResource(id = R.drawable.ic_baseline_help_24), + onClick = { currentUriHandler.openUri("$websiteUrl/discord") } + ) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_favorite_24.xml b/app/src/main/res/drawable/ic_baseline_favorite_24.xml new file mode 100644 index 0000000000..52d28592ae --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_favorite_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_help_24.xml b/app/src/main/res/drawable/ic_baseline_help_24.xml new file mode 100644 index 0000000000..0028ebdbfd --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_help_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_info_24.xml b/app/src/main/res/drawable/ic_baseline_info_24.xml new file mode 100644 index 0000000000..e0ecb4046a --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_info_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_more_horiz_24.xml b/app/src/main/res/drawable/ic_baseline_more_horiz_24.xml new file mode 100644 index 0000000000..afbe22da80 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_more_horiz_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_new_releases_24.xml b/app/src/main/res/drawable/ic_baseline_new_releases_24.xml new file mode 100644 index 0000000000..4aa598ba5d --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_new_releases_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_baseline_settings_24.xml b/app/src/main/res/drawable/ic_baseline_settings_24.xml new file mode 100644 index 0000000000..298a5a1ff2 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_settings_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_translate_black_24dp.xml b/app/src/main/res/drawable/ic_translate_black_24dp.xml new file mode 100644 index 0000000000..d2f8eae6b1 --- /dev/null +++ b/app/src/main/res/drawable/ic_translate_black_24dp.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 935fc1ab6c..2188105526 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -11,7 +11,7 @@ Select Application Select Patches Options - Credits + Contributors Patcher: Manager: @@ -23,7 +23,7 @@ No patches selected. Selected: Click here to view patcher logs. - Click here to view ReVanced project credits. + Click here to view people who have contributed to the ReVanced Project. One moment, please... Fetching patches @@ -36,16 +36,21 @@ Patcher Logs - Credits + Contributors ReVanced Manager Website Team Translators Patcher - Help translate! + Help + Help translate What\'s New No patches are selected! - Patcher Credits + Patcher Contributors Contributor image No contributors + Settings + About + About + More \ No newline at end of file From cce98a8afef461c3828afd964ce631923426d9fa Mon Sep 17 00:00:00 2001 From: Ushie Date: Sat, 2 Jul 2022 05:49:09 +0300 Subject: [PATCH 029/132] fix: settings and about page titles --- .../java/app/revanced/manager/ui/screens/MainScreen.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index 6483dc4997..49ac95c04d 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -10,9 +10,7 @@ import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.stringResource import androidx.navigation.compose.rememberNavController -import app.revanced.manager.R import app.revanced.manager.ui.components.AppBar import app.revanced.manager.ui.components.BottomNavBar import app.revanced.manager.ui.screens.destinations.* @@ -53,7 +51,7 @@ fun MainScreen() { } SettingsScreenDestination -> { AppBar( - title = { stringResource(id = R.string.screen_settings_title) }, + title = { Text(text = "Settings") }, navigationIcon = { IconButton(onClick = { navController.navigateUp() }) { androidx.compose.material3.Icon( @@ -66,7 +64,7 @@ fun MainScreen() { } AboutScreenDestination -> { AppBar( - title = { stringResource(id = R.string.screen_about_title ) }, + title = { Text(text = "About") }, navigationIcon = { IconButton(onClick = { navController.navigateUp() }) { androidx.compose.material3.Icon( @@ -79,7 +77,7 @@ fun MainScreen() { } ContributorsScreenDestination -> { AppBar( - title = { Text(text = "Contributors")}, + title = { Text(text = "Contributors") }, navigationIcon = { IconButton(onClick = { navController.navigateUp() }) { androidx.compose.material3.Icon( From 0cd7b02dca1893c96d7e3358330f9611372ebc4d Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 2 Jul 2022 13:23:11 +0530 Subject: [PATCH 030/132] feat: make ExpandableCard reusable. --- .../manager/ui/components/ExpandableCard.kt | 29 +++----------- .../ui/models/ContributorsViewModel.kt | 40 ++++++++++++++++--- .../manager/ui/screens/ContributorsScreen.kt | 2 +- 3 files changed, 40 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt index f1cb6c4da3..2a72d5bae8 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt @@ -18,6 +18,7 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowDropDown import androidx.compose.material3.* import androidx.compose.runtime.* +import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha @@ -28,9 +29,8 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import app.revanced.manager.ui.models.ContributorsViewModel -import androidx.lifecycle.viewmodel.compose.viewModel import app.revanced.manager.R +import app.revanced.manager.backend.api.GitHubAPI import coil.compose.AsyncImage @@ -41,7 +41,7 @@ private const val tag = "Expandable Card" @ExperimentalMaterial3Api fun ExpandableCard( title: String, - vm: ContributorsViewModel = viewModel() + data: SnapshotStateList, ) { var expandedState by remember { mutableStateOf(false) } val rotateState by animateFloatAsState(targetValue = if (expandedState) 180f else 0f) @@ -88,35 +88,16 @@ fun ExpandableCard( } } if (expandedState) { - if(vm.contributorsList.isNotEmpty()) { + if(data.isNotEmpty()) { var currentUriHandler = LocalUriHandler.current -// for(contributor in vm.contributorsList) { -// Row( -// Modifier -// .fillMaxWidth()) { -// AsyncImage( -// model = contributor.avatar_url, -// contentDescription = stringResource(id = R.string.contributor_image), -// Modifier -// .size(40.dp) -// .clip(CircleShape) -// .clickable { -// currentUriHandler.openUri(contributor.url) -// } -// ) -// Text(text = contributor.login) -// -// } -// } - Box(Modifier.height(100.dp)){ LazyVerticalGrid( columns = GridCells.Adaptive(48.dp), verticalArrangement = Arrangement.spacedBy(4.dp), horizontalArrangement = Arrangement.spacedBy(4.dp) ) { - items(vm.contributorsList) { + items(data) { contributor -> AsyncImage( model = contributor.avatar_url, contentDescription = stringResource(id = R.string.contributor_image), diff --git a/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt b/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt index 9ae521aba0..22aa18c30f 100644 --- a/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt @@ -9,20 +9,48 @@ import kotlinx.coroutines.launch class ContributorsViewModel : ViewModel() { private val tag = "ContributorsViewModel" - val contributorsList = mutableStateListOf() + val patcherContributorsList = mutableStateListOf() + val patchesContributorsList = mutableStateListOf() + val cliContributorsList = mutableStateListOf() + val managerContributorsList = mutableStateListOf() + val integrationsContributorsList = mutableStateListOf() - fun load() { + fun loadContributors() { viewModelScope.launch { - val githubContributors = GitHubAPI.Contributors.contributors("Aunali321","revanced-manager") - githubContributors.sortedByDescending { + val cliContributors = GitHubAPI.Contributors.contributors("revanced","revanced-cli") + cliContributors.sortedByDescending { it.login } - contributorsList.addAll(githubContributors) + cliContributorsList.addAll(cliContributors) + + val patcherContributors = GitHubAPI.Contributors.contributors("revanced","revanced-patcher") + patcherContributors.sortedByDescending { + it.login + } + patcherContributorsList.addAll(patcherContributors) + + val patchesContributors = GitHubAPI.Contributors.contributors("revanced","revanced-patches") + patchesContributors.sortedByDescending { + it.login + } + patchesContributorsList.addAll(patchesContributors) + + val managerContributors = GitHubAPI.Contributors.contributors("Aunali321","revanced-manager") + managerContributors.sortedByDescending { + it.login + } + managerContributorsList.addAll(managerContributors) + + val integrationsContributors = GitHubAPI.Contributors.contributors("revanced","revanced-integrations") + integrationsContributors.sortedByDescending { + it.login + } + integrationsContributorsList.addAll(integrationsContributors) } } init { - load() + loadContributors() } } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index 8c437e79bb..a9695ba527 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -44,6 +44,6 @@ fun ContributorsScreen( } Divider(Modifier.alpha(.5f)) - ExpandableCard(stringResource(R.string.patcher_contributors)) + ExpandableCard(stringResource(R.string.patcher_contributors), data = vm.integrationsContributorsList) } } From bdb4f33b86fddb526b3891d62ef2f4b20f8ea887 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 2 Jul 2022 13:43:45 +0530 Subject: [PATCH 031/132] feat: added all other contributors. --- .../revanced/manager/ui/components/ExpandableCard.kt | 3 ++- .../revanced/manager/ui/screens/ContributorsScreen.kt | 11 ++++++++++- app/src/main/res/values/strings.xml | 4 ++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt index 2a72d5bae8..5ac57be7b7 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt @@ -41,6 +41,7 @@ private const val tag = "Expandable Card" @ExperimentalMaterial3Api fun ExpandableCard( title: String, + size: Int, data: SnapshotStateList, ) { var expandedState by remember { mutableStateOf(false) } @@ -91,7 +92,7 @@ fun ExpandableCard( if(data.isNotEmpty()) { var currentUriHandler = LocalUriHandler.current - Box(Modifier.height(100.dp)){ + Box(Modifier.height(size.dp).padding(0.dp,10.dp,0.dp,0.dp)){ LazyVerticalGrid( columns = GridCells.Adaptive(48.dp), verticalArrangement = Arrangement.spacedBy(4.dp), diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index a9695ba527..ad943769ee 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -1,6 +1,8 @@ package app.revanced.manager.ui.screens import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Divider import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon @@ -44,6 +46,13 @@ fun ContributorsScreen( } Divider(Modifier.alpha(.5f)) - ExpandableCard(stringResource(R.string.patcher_contributors), data = vm.integrationsContributorsList) + Column() { + ExpandableCard(stringResource(R.string.cli_contributors), data = vm.cliContributorsList, size = 100) + ExpandableCard(stringResource(R.string.patcher_contributors), data = vm.patcherContributorsList, size = 100) + ExpandableCard(stringResource(R.string.patches_contributors), data = vm.patchesContributorsList, size = 150) + ExpandableCard(stringResource(R.string.manager_contributors), data = vm.managerContributorsList, size = 100) + ExpandableCard(stringResource(R.string.integrations_contrubutors), data = vm.integrationsContributorsList, size = 200) + } + } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2188105526..39cd8e2b8e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -53,4 +53,8 @@ About About More + CLI Contributors + Patches Contributors + Manager Contributors + Integrations Contributors \ No newline at end of file From 44c6f614e4b9b8ea58700a80401952caa0319def Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 2 Jul 2022 19:10:19 +0530 Subject: [PATCH 032/132] feat: fixed scroll but card doesn't expand. --- .../manager/ui/components/ExpandableCard.kt | 20 +++--- .../manager/ui/screens/ContributorsScreen.kt | 64 +++++++++++++++++-- 2 files changed, 71 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt index 5ac57be7b7..850c468493 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt @@ -50,7 +50,7 @@ fun ExpandableCard( Card( modifier = Modifier .fillMaxWidth() - .verticalScroll(state = rememberScrollState()) + .height(100.dp) .padding(8.dp) .animateContentSize( animationSpec = tween( @@ -62,6 +62,7 @@ fun ExpandableCard( ) { Column( modifier = Modifier + .height(80.dp) .fillMaxWidth() .padding(12.dp) ) { @@ -92,7 +93,10 @@ fun ExpandableCard( if(data.isNotEmpty()) { var currentUriHandler = LocalUriHandler.current - Box(Modifier.height(size.dp).padding(0.dp,10.dp,0.dp,0.dp)){ + Box( + Modifier + .height(200.dp) + .padding(0.dp, 10.dp, 0.dp, 0.dp)){ LazyVerticalGrid( columns = GridCells.Adaptive(48.dp), verticalArrangement = Arrangement.spacedBy(4.dp), @@ -102,12 +106,12 @@ fun ExpandableCard( contributor -> AsyncImage( model = contributor.avatar_url, contentDescription = stringResource(id = R.string.contributor_image), - Modifier - .size(40.dp) - .clip(CircleShape) - .clickable { - currentUriHandler.openUri(contributor.url) - } + Modifier + .size(40.dp) + .clip(CircleShape) + .clickable { + currentUriHandler.openUri(contributor.url) + } ) } } diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index ad943769ee..a8d68fdbb0 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -1,6 +1,7 @@ package app.revanced.manager.ui.screens import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Divider @@ -31,9 +32,39 @@ fun ContributorsScreen( // navigator: NavController, vm: ContributorsViewModel = viewModel() ) { - Column(Modifier.padding(8.dp)) { - Box() { - Icon( +// Column(Modifier.padding(8.dp).height(1200.dp)) { +// Box() { +// Icon( +// painterResource(id = R.drawable.ic_revanced), +// contentDescription = "Header Icon", +// modifier = Modifier +// .fillMaxWidth() +// .align(Alignment.TopCenter) +// .padding(32.dp) +// .size(100.dp), +// tint = MaterialTheme.colorScheme.primary +// ) +// } +// Divider(Modifier.alpha(.5f)) +// +// Column( +// Modifier +// .height(1000.dp) +// .verticalScroll(rememberScrollState())) { +// ExpandableCard(stringResource(R.string.cli_contributors), data = vm.cliContributorsList, size = 100) +// ExpandableCard(stringResource(R.string.patcher_contributors), data = vm.patcherContributorsList, size = 100) +// ExpandableCard(stringResource(R.string.patches_contributors), data = vm.patchesContributorsList, size = 150) +// ExpandableCard(stringResource(R.string.manager_contributors), data = vm.managerContributorsList, size = 100) +// ExpandableCard(stringResource(R.string.integrations_contrubutors), data = vm.integrationsContributorsList, size = 200) +// } +// +// } + LazyColumn( + Modifier.height(1200.dp), + contentPadding = PaddingValues(4.dp) + ) { + item{ Box() { + Icon( painterResource(id = R.drawable.ic_revanced), contentDescription = "Header Icon", modifier = Modifier @@ -44,15 +75,38 @@ fun ContributorsScreen( tint = MaterialTheme.colorScheme.primary ) } - Divider(Modifier.alpha(.5f)) + } + item { + Divider(Modifier.alpha(.5f)) + } - Column() { + item { ExpandableCard(stringResource(R.string.cli_contributors), data = vm.cliContributorsList, size = 100) + } + item { ExpandableCard(stringResource(R.string.patcher_contributors), data = vm.patcherContributorsList, size = 100) + } + item { ExpandableCard(stringResource(R.string.patches_contributors), data = vm.patchesContributorsList, size = 150) + } + item { ExpandableCard(stringResource(R.string.manager_contributors), data = vm.managerContributorsList, size = 100) + } + item { ExpandableCard(stringResource(R.string.integrations_contrubutors), data = vm.integrationsContributorsList, size = 200) } + item { + ExpandableCard(stringResource(R.string.patcher_contributors), data = vm.patcherContributorsList, size = 100) + } + item { + ExpandableCard(stringResource(R.string.patches_contributors), data = vm.patchesContributorsList, size = 150) + } + item { + ExpandableCard(stringResource(R.string.manager_contributors), data = vm.managerContributorsList, size = 100) + } + item { + ExpandableCard(stringResource(R.string.integrations_contrubutors), data = vm.integrationsContributorsList, size = 200) + } } } From 537a214a4d8e30909619867c4d41e11844dd34c4 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 2 Jul 2022 18:24:24 +0530 Subject: [PATCH 033/132] feat: added all other contributors. --- .../manager/ui/components/ExpandableCard.kt | 22 ++- .../manager/ui/screens/ContributorsScreen.kt | 163 ++++++++++-------- app/src/main/res/values/strings.xml | 2 +- 3 files changed, 100 insertions(+), 87 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt index 850c468493..3298e1046d 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt @@ -50,7 +50,8 @@ fun ExpandableCard( Card( modifier = Modifier .fillMaxWidth() - .height(100.dp) + .height(40.dp) + .verticalScroll(state = rememberScrollState()) .padding(8.dp) .animateContentSize( animationSpec = tween( @@ -62,8 +63,8 @@ fun ExpandableCard( ) { Column( modifier = Modifier - .height(80.dp) .fillMaxWidth() + .height(300.dp) .padding(12.dp) ) { Row(verticalAlignment = Alignment.CenterVertically) { @@ -93,10 +94,7 @@ fun ExpandableCard( if(data.isNotEmpty()) { var currentUriHandler = LocalUriHandler.current - Box( - Modifier - .height(200.dp) - .padding(0.dp, 10.dp, 0.dp, 0.dp)){ + Box(Modifier.height(size.dp).padding(0.dp,10.dp,0.dp,0.dp)){ LazyVerticalGrid( columns = GridCells.Adaptive(48.dp), verticalArrangement = Arrangement.spacedBy(4.dp), @@ -106,12 +104,12 @@ fun ExpandableCard( contributor -> AsyncImage( model = contributor.avatar_url, contentDescription = stringResource(id = R.string.contributor_image), - Modifier - .size(40.dp) - .clip(CircleShape) - .clickable { - currentUriHandler.openUri(contributor.url) - } + Modifier + .size(40.dp) + .clip(CircleShape) + .clickable { + currentUriHandler.openUri(contributor.url) + } ) } } diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index a8d68fdbb0..d91bbb5d35 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -4,10 +4,7 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Divider -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -32,81 +29,99 @@ fun ContributorsScreen( // navigator: NavController, vm: ContributorsViewModel = viewModel() ) { -// Column(Modifier.padding(8.dp).height(1200.dp)) { -// Box() { -// Icon( -// painterResource(id = R.drawable.ic_revanced), -// contentDescription = "Header Icon", -// modifier = Modifier -// .fillMaxWidth() -// .align(Alignment.TopCenter) -// .padding(32.dp) -// .size(100.dp), -// tint = MaterialTheme.colorScheme.primary -// ) -// } -// Divider(Modifier.alpha(.5f)) -// +// Box( +// Modifier +// .verticalScroll(rememberScrollState()) +// .height(1400.dp) +// ) { // Column( // Modifier -// .height(1000.dp) -// .verticalScroll(rememberScrollState())) { -// ExpandableCard(stringResource(R.string.cli_contributors), data = vm.cliContributorsList, size = 100) -// ExpandableCard(stringResource(R.string.patcher_contributors), data = vm.patcherContributorsList, size = 100) -// ExpandableCard(stringResource(R.string.patches_contributors), data = vm.patchesContributorsList, size = 150) -// ExpandableCard(stringResource(R.string.manager_contributors), data = vm.managerContributorsList, size = 100) -// ExpandableCard(stringResource(R.string.integrations_contrubutors), data = vm.integrationsContributorsList, size = 200) -// } +// .padding(8.dp) +// .height(1400.dp)) { +// Box() { +// Icon( +// painterResource(id = R.drawable.ic_revanced), +// contentDescription = "Header Icon", +// modifier = Modifier +// .fillMaxWidth() +// .align(Alignment.TopCenter) +// .padding(32.dp) +// .size(100.dp), +// tint = MaterialTheme.colorScheme.primary +// ) +// } +// Divider(Modifier.alpha(.5f)) +// +// ExpandableCard( +// stringResource(R.string.cli_contributors), +// data = vm.cliContributorsList, +// size = 100 +// ) +// ExpandableCard( +// stringResource(R.string.patcher_contributors), +// data = vm.patcherContributorsList, +// size = 100 +// ) +// ExpandableCard( +// stringResource(R.string.patches_contributors), +// data = vm.patchesContributorsList, +// size = 150 +// ) +// ExpandableCard( +// stringResource(R.string.manager_contributors), +// data = vm.managerContributorsList, +// size = 100 +// ) +// ExpandableCard( +// stringResource(R.string.integrations_contributors), +// data = vm.integrationsContributorsList, +// size = 200 +// ) +// // +// } // } - LazyColumn( - Modifier.height(1200.dp), - contentPadding = PaddingValues(4.dp) - ) { - item{ Box() { - Icon( - painterResource(id = R.drawable.ic_revanced), - contentDescription = "Header Icon", - modifier = Modifier - .fillMaxWidth() - .align(Alignment.TopCenter) - .padding(32.dp) - .size(100.dp), - tint = MaterialTheme.colorScheme.primary - ) - } - } - item { - Divider(Modifier.alpha(.5f)) - } + Box(Modifier.height(1500.dp)) { + LazyColumn( + Modifier.height(1200.dp), + contentPadding = PaddingValues(4.dp) + ) { + item { + Box() { + Icon( + painterResource(id = R.drawable.ic_revanced), + contentDescription = "Header Icon", + modifier = Modifier + .fillMaxWidth() + .align(Alignment.TopCenter) + .padding(32.dp) + .size(100.dp), + tint = MaterialTheme.colorScheme.primary + ) + } + } + item { + Divider(Modifier.alpha(.5f)) + } + item { + Box(Modifier.padding(12.dp).height(250.dp)) { + ExpandableCard( + stringResource(R.string.cli_contributors), + data = vm.cliContributorsList, + size = 100 + ) + } +// Text(text = "hello") + } + item { +// ExpandableCard( +// stringResource(R.string.cli_contributors), +// data = vm.cliContributorsList, +// size = 100 +// ) + Text(text = "hello") - item { - ExpandableCard(stringResource(R.string.cli_contributors), data = vm.cliContributorsList, size = 100) - } - item { - ExpandableCard(stringResource(R.string.patcher_contributors), data = vm.patcherContributorsList, size = 100) - } - item { - ExpandableCard(stringResource(R.string.patches_contributors), data = vm.patchesContributorsList, size = 150) - } - item { - ExpandableCard(stringResource(R.string.manager_contributors), data = vm.managerContributorsList, size = 100) - } - item { - ExpandableCard(stringResource(R.string.integrations_contrubutors), data = vm.integrationsContributorsList, size = 200) - } - - item { - ExpandableCard(stringResource(R.string.patcher_contributors), data = vm.patcherContributorsList, size = 100) - } - item { - ExpandableCard(stringResource(R.string.patches_contributors), data = vm.patchesContributorsList, size = 150) - } - item { - ExpandableCard(stringResource(R.string.manager_contributors), data = vm.managerContributorsList, size = 100) - } - item { - ExpandableCard(stringResource(R.string.integrations_contrubutors), data = vm.integrationsContributorsList, size = 200) + } } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 39cd8e2b8e..f59549d21d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -56,5 +56,5 @@ CLI Contributors Patches Contributors Manager Contributors - Integrations Contributors + Integrations Contributors \ No newline at end of file From b915fbecc62ff56d4e9192d9e1fa8be428382229 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 2 Jul 2022 19:22:57 +0530 Subject: [PATCH 034/132] feat: fixed scroll but card doesn't expand. --- .../manager/ui/components/ExpandableCard.kt | 3 +- .../manager/ui/screens/ContributorsScreen.kt | 75 ++++++++++++++++--- 2 files changed, 65 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt index 3298e1046d..0801bf346a 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt @@ -50,8 +50,7 @@ fun ExpandableCard( Card( modifier = Modifier .fillMaxWidth() - .height(40.dp) - .verticalScroll(state = rememberScrollState()) + .height(80.dp) .padding(8.dp) .animateContentSize( animationSpec = tween( diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index d91bbb5d35..25aaeba3e4 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -81,7 +81,6 @@ fun ContributorsScreen( // // } // } - Box(Modifier.height(1500.dp)) { LazyColumn( Modifier.height(1200.dp), contentPadding = PaddingValues(4.dp) @@ -104,24 +103,78 @@ fun ContributorsScreen( Divider(Modifier.alpha(.5f)) } item { - Box(Modifier.padding(12.dp).height(250.dp)) { + Box(Modifier.padding(12.dp).height(80.dp)) { ExpandableCard( stringResource(R.string.cli_contributors), data = vm.cliContributorsList, size = 100 ) } -// Text(text = "hello") } item { -// ExpandableCard( -// stringResource(R.string.cli_contributors), -// data = vm.cliContributorsList, -// size = 100 -// ) - Text(text = "hello") - + Box(Modifier.padding(12.dp).height(80.dp)) { + ExpandableCard( + stringResource(R.string.cli_contributors), + data = vm.cliContributorsList, + size = 100 + ) + } + } + item { + Box(Modifier.padding(12.dp).height(80.dp)) { + ExpandableCard( + stringResource(R.string.cli_contributors), + data = vm.cliContributorsList, + size = 100 + ) + } + } + item { + Box(Modifier.padding(12.dp).height(80.dp)) { + ExpandableCard( + stringResource(R.string.cli_contributors), + data = vm.cliContributorsList, + size = 100 + ) + } + } + item { + Box(Modifier.padding(12.dp).height(80.dp)) { + ExpandableCard( + stringResource(R.string.cli_contributors), + data = vm.cliContributorsList, + size = 100 + ) + } + } + item { + Box(Modifier.padding(12.dp).height(80.dp)) { + ExpandableCard( + stringResource(R.string.cli_contributors), + data = vm.cliContributorsList, + size = 100 + ) + } } + item { + Box(Modifier.padding(12.dp).height(80.dp)) { + ExpandableCard( + stringResource(R.string.cli_contributors), + data = vm.cliContributorsList, + size = 100 + ) + } + } + item { + Box(Modifier.padding(12.dp).height(80.dp)) { + ExpandableCard( + stringResource(R.string.cli_contributors), + data = vm.cliContributorsList, + size = 100 + ) + } + } + } } -} + From 95a40cc12de9a4b8cf0c9f5d620f6482376a036a Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 2 Jul 2022 20:12:07 +0530 Subject: [PATCH 035/132] feat: fixed scroll a bit. good enough for now. --- .../manager/ui/components/ExpandableCard.kt | 12 +- .../manager/ui/screens/ContributorsScreen.kt | 270 ++++++++---------- app/src/main/res/values/strings.xml | 1 + 3 files changed, 133 insertions(+), 150 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt index 0801bf346a..498f0bceb8 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt @@ -50,7 +50,6 @@ fun ExpandableCard( Card( modifier = Modifier .fillMaxWidth() - .height(80.dp) .padding(8.dp) .animateContentSize( animationSpec = tween( @@ -63,7 +62,6 @@ fun ExpandableCard( Column( modifier = Modifier .fillMaxWidth() - .height(300.dp) .padding(12.dp) ) { Row(verticalAlignment = Alignment.CenterVertically) { @@ -85,7 +83,7 @@ fun ExpandableCard( }) { Icon( imageVector = Icons.Default.ArrowDropDown, - contentDescription = "Dropdown" + contentDescription = stringResource(R.string.dropdown_button) ) } } @@ -93,12 +91,12 @@ fun ExpandableCard( if(data.isNotEmpty()) { var currentUriHandler = LocalUriHandler.current - Box(Modifier.height(size.dp).padding(0.dp,10.dp,0.dp,0.dp)){ LazyVerticalGrid( columns = GridCells.Adaptive(48.dp), verticalArrangement = Arrangement.spacedBy(4.dp), - horizontalArrangement = Arrangement.spacedBy(4.dp) - ) { + horizontalArrangement = Arrangement.spacedBy(4.dp), + modifier = Modifier.height(size.dp), + ) { items(data) { contributor -> AsyncImage( model = contributor.avatar_url, @@ -112,7 +110,7 @@ fun ExpandableCard( ) } } - } + } else { CircularProgressIndicator() } diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index 25aaeba3e4..d2c53a21c4 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -29,152 +29,136 @@ fun ContributorsScreen( // navigator: NavController, vm: ContributorsViewModel = viewModel() ) { -// Box( -// Modifier -// .verticalScroll(rememberScrollState()) -// .height(1400.dp) -// ) { -// Column( -// Modifier -// .padding(8.dp) -// .height(1400.dp)) { -// Box() { -// Icon( -// painterResource(id = R.drawable.ic_revanced), -// contentDescription = "Header Icon", -// modifier = Modifier -// .fillMaxWidth() -// .align(Alignment.TopCenter) -// .padding(32.dp) -// .size(100.dp), -// tint = MaterialTheme.colorScheme.primary -// ) + + Column( + Modifier + .padding(8.dp) + .height(1400.dp) + .verticalScroll(rememberScrollState()) + ) { + Box() { + Icon( + painterResource(id = R.drawable.ic_revanced), + contentDescription = "Header Icon", + modifier = Modifier + .fillMaxWidth() + .align(Alignment.TopCenter) + .padding(32.dp) + .size(100.dp), + tint = MaterialTheme.colorScheme.primary + ) + } + Divider(Modifier.alpha(.5f)) + + ExpandableCard( + stringResource(R.string.cli_contributors), + data = vm.cliContributorsList, + size = 100 + ) + ExpandableCard( + stringResource(R.string.patcher_contributors), + data = vm.patcherContributorsList, + size = 100 + ) + ExpandableCard( + stringResource(R.string.patches_contributors), + data = vm.patchesContributorsList, + size = 150 + ) + ExpandableCard( + stringResource(R.string.manager_contributors), + data = vm.managerContributorsList, + size = 100 + ) + ExpandableCard( + stringResource(R.string.integrations_contributors), + data = vm.integrationsContributorsList, + size = 200 + ) + + + } + + } +// LazyColumn( +// Modifier.height(1200.dp), +// contentPadding = PaddingValues(4.dp) +// ) { +// item { +// Box() { +// Icon( +// painterResource(id = R.drawable.ic_revanced), +// contentDescription = "Header Icon", +// modifier = Modifier +// .fillMaxWidth() +// .align(Alignment.TopCenter) +// .padding(32.dp) +// .size(100.dp), +// tint = MaterialTheme.colorScheme.primary +// ) +// } // } -// Divider(Modifier.alpha(.5f)) -// -// ExpandableCard( -// stringResource(R.string.cli_contributors), -// data = vm.cliContributorsList, -// size = 100 -// ) -// ExpandableCard( -// stringResource(R.string.patcher_contributors), -// data = vm.patcherContributorsList, -// size = 100 -// ) -// ExpandableCard( -// stringResource(R.string.patches_contributors), -// data = vm.patchesContributorsList, -// size = 150 -// ) -// ExpandableCard( -// stringResource(R.string.manager_contributors), -// data = vm.managerContributorsList, -// size = 100 -// ) -// ExpandableCard( -// stringResource(R.string.integrations_contributors), -// data = vm.integrationsContributorsList, -// size = 200 -// ) +// item { +// Divider(Modifier.alpha(.5f)) +// } +// item { +// ExpandableCard( +// stringResource(R.string.cli_contributors), +// data = vm.cliContributorsList, +// size = 100 +// ) // +// } +// item { +// ExpandableCard( +// stringResource(R.string.cli_contributors), +// data = vm.cliContributorsList, +// size = 100 +// ) +// } +// item { +// ExpandableCard( +// stringResource(R.string.cli_contributors), +// data = vm.cliContributorsList, +// size = 100 +// ) +// } +// item { +// ExpandableCard( +// stringResource(R.string.cli_contributors), +// data = vm.cliContributorsList, +// size = 100 +// ) +// } +// item { +// ExpandableCard( +// stringResource(R.string.cli_contributors), +// data = vm.cliContributorsList, +// size = 100 +// ) +// } +// item { +// ExpandableCard( +// stringResource(R.string.cli_contributors), +// data = vm.cliContributorsList, +// size = 100 +// ) +// } +// item { +// ExpandableCard( +// stringResource(R.string.cli_contributors), +// data = vm.cliContributorsList, +// size = 100 +// ) +// } +// item { +// ExpandableCard( +// stringResource(R.string.cli_contributors), +// data = vm.cliContributorsList, +// size = 100 +// ) +// } // // } // } - LazyColumn( - Modifier.height(1200.dp), - contentPadding = PaddingValues(4.dp) - ) { - item { - Box() { - Icon( - painterResource(id = R.drawable.ic_revanced), - contentDescription = "Header Icon", - modifier = Modifier - .fillMaxWidth() - .align(Alignment.TopCenter) - .padding(32.dp) - .size(100.dp), - tint = MaterialTheme.colorScheme.primary - ) - } - } - item { - Divider(Modifier.alpha(.5f)) - } - item { - Box(Modifier.padding(12.dp).height(80.dp)) { - ExpandableCard( - stringResource(R.string.cli_contributors), - data = vm.cliContributorsList, - size = 100 - ) - } - } - item { - Box(Modifier.padding(12.dp).height(80.dp)) { - ExpandableCard( - stringResource(R.string.cli_contributors), - data = vm.cliContributorsList, - size = 100 - ) - } - } - item { - Box(Modifier.padding(12.dp).height(80.dp)) { - ExpandableCard( - stringResource(R.string.cli_contributors), - data = vm.cliContributorsList, - size = 100 - ) - } - } - item { - Box(Modifier.padding(12.dp).height(80.dp)) { - ExpandableCard( - stringResource(R.string.cli_contributors), - data = vm.cliContributorsList, - size = 100 - ) - } - } - item { - Box(Modifier.padding(12.dp).height(80.dp)) { - ExpandableCard( - stringResource(R.string.cli_contributors), - data = vm.cliContributorsList, - size = 100 - ) - } - } - item { - Box(Modifier.padding(12.dp).height(80.dp)) { - ExpandableCard( - stringResource(R.string.cli_contributors), - data = vm.cliContributorsList, - size = 100 - ) - } - } - item { - Box(Modifier.padding(12.dp).height(80.dp)) { - ExpandableCard( - stringResource(R.string.cli_contributors), - data = vm.cliContributorsList, - size = 100 - ) - } - } - item { - Box(Modifier.padding(12.dp).height(80.dp)) { - ExpandableCard( - stringResource(R.string.cli_contributors), - data = vm.cliContributorsList, - size = 100 - ) - } - } - - } - } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f59549d21d..e3ee850206 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -57,4 +57,5 @@ Patches Contributors Manager Contributors Integrations Contributors + Dropdown Button \ No newline at end of file From 47a42e7292667582b7f264acc45070ab7a166ee5 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 2 Jul 2022 22:27:28 +0530 Subject: [PATCH 036/132] feat: manager app icon. --- app/src/main/ic_launcher-playstore.png | Bin 0 -> 17033 bytes .../drawable-v24/ic_launcher_foreground.xml | 30 ---------- .../res/drawable/ic_launcher_foreground.xml | 53 ++++++++++++++++++ app/src/main/res/drawable/manager.xml | 47 ++++++++++++++++ .../res/mipmap-anydpi-v26/ic_launcher.xml | 4 +- .../mipmap-anydpi-v26/ic_launcher_round.xml | 4 +- app/src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 1818 bytes .../res/mipmap-hdpi/ic_launcher_round.png | Bin 0 -> 3756 bytes app/src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 1272 bytes .../res/mipmap-mdpi/ic_launcher_round.png | Bin 0 -> 2367 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 2494 bytes .../res/mipmap-xhdpi/ic_launcher_round.png | Bin 0 -> 5297 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 3834 bytes .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin 0 -> 8311 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 0 -> 5368 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.webp | Bin 3844 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin 0 -> 11918 bytes .../res/values/ic_launcher_background.xml | 4 ++ 18 files changed, 108 insertions(+), 34 deletions(-) create mode 100644 app/src/main/ic_launcher-playstore.png delete mode 100644 app/src/main/res/drawable-v24/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/manager.xml create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher.webp create mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png create mode 100644 app/src/main/res/values/ic_launcher_background.xml diff --git a/app/src/main/ic_launcher-playstore.png b/app/src/main/ic_launcher-playstore.png new file mode 100644 index 0000000000000000000000000000000000000000..c9b029cedbbcca1521be36fd30c5a483c18313bf GIT binary patch literal 17033 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index 2b068d1146..0000000000 --- a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000000..493f8cda0b --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/manager.xml b/app/src/main/res/drawable/manager.xml new file mode 100644 index 0000000000..21b6fbb04e --- /dev/null +++ b/app/src/main/res/drawable/manager.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml index eca70cfe52..7353dbd1fd 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml index eca70cfe52..7353dbd1fd 100644 --- a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..2140335ce2849be8e6361aa8082816f3d6f0b755 GIT binary patch literal 1818 zcmV+#2j%#QP)mTUwIH`hy^t0!wBi9GRVyf{6+wzH6;T1F z-io5Oj#h0w(0ZZ>RXnE0Kj05f_gTo2WJ8h-5VK*Qna_-q%|6-h$M@aq9e6yhxZ;W{ zu2^4vctJt^EDFrjP1RTP0}HAyXQLX}JIJRA9K3S`67TIoM@62%QJ&8x$YUms9W!7S zZ5f#sxuej{&sHFjUlK|bU`ddfgl@K~S(y|yKZ!<{u_0fqcyCFxWs?5N>yX3XoYZy_ z=g~WLn?X#Z1WP&`s$HIn9J0O2&DMWmk z3`3oLY2WD#k)t;Z^BxCDAqi0YO)gyCTn?FW>D2bM@k`-!RxuPT+5mGV&jE!jfY!rU zOd<#auFJ`Xmv8fl{PJ;|1oZ>jI( z&0kA>{_@9jaC7@1QXondY3a!XlL&Hf^@FPFlawGO=P&&R5mCt?cA-xfM;AXxo4EjP z6&!)L;2~` zNsW6?zy$vg+A$f*2N#6=_4;4<`D8r=PK+d{BY9v1Qm@glD>WPHbITwxBpzJcM$md| zBJ~;r%cD}EVP`EdCC@>|oHP(KINxbv7J`&Kc-jJs(=)-|$%on(g&7kN&p(ON;$f&t zFJmw(K?shfs+v=v7#>9H^C2)hK}v2lJb{>`C5&zddIGZ*ggk401BH9aK{hOq*3(cN zi7TjF=1=18F^aZbA7(8GX=(ij>MmY`@L5UJ37iRda=%+xL$Z6xM%s3Ln7tq+e?EQz z>o(?tyL=3-zb+OT+f9s<6YPWz3{=v9K0+_~QfvBU}7 zkSW(I1tCwKx5C7bDB5pn(rX1F#bs4$HRL!{JM^spF<=9Z64$jze;2qR#zQVU3_?&2M4P zzJuU1ay+enXM_bt5O>hkl$^(VjzLNovpaHD2)cRuAuLQ=4HCEEwBGs%4~m34grvts zgq-Pf8OcG+S`gkj*Bq~dalzrVo=m`z6g4TDu^hx~1wC(h2btM<;Oxo#3A{ToOF>tz z--St`(H#e=rKhPdD?vD=ekeXbjGB?O9!&A{{2W4wsb$QxQpIcp-MsS<5>nFDmVm^> zW5j~+c~F;A3aOFv$E(k|W<&hKM9~9Pc zP?9z|xKfIb19*wX6^iS52cd9r7Q|1DgAu+RZyCMi0T3~MCS)b9AXi;+iAZ^Ae?(l` zCk2Gkj>%9=BFNEwI2=BDh9>9!qb69jb~Ct2N7MGPcl06Gx-JocRoA%?Tu9uQw37NR z{#z+h6Oq&s>_h}qQ$FitYxV)tTn)h``(6#i8 zi-(zUOWCvZjNn_qbM;r@#;phBt5d1U6fp!3;`|dCJPUG@SHYpx1&|S)Mr~W4upBOa zw;zhW-UM+|V?icm_F7gKCKH5+h|%KEg>~}I=*kq*hY1DARnXjKzL-!DJK+TBffJ+$ zPLLirL3-#WLEPVJXfH~T)M7^vnW;@s7eu?z;;3|)j-d47KVH8tp}J_H{T2<${2w{a-8HM9^M+NYP$wSmZJ z-<}mSGb-H4dVrO6ATduH_+lyGki^Dp1~Xum!9tgN1FSw9j~RJ5f{d&I1VRFzK{lc_ zHg-;xHUj5b8@^LDK@H2OCXb!SfLSn8d$y0&5;H6ucApUN30w)J1TvO`88FKbf=_uy zOf7BIpJ#1t%^Nt-mS<&U$7(PGX2DE7P-xo{;EF4*xMD^94|OKv9Ij{|!vFvP07*qo IM6N<$f|uSzzyJUM literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..a3e89a061c39fcca56e8de68b02cc3631e304ca1 GIT binary patch literal 3756 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..286c2e58d2d362e27b1dbd5a50f8e7cd2042189a GIT binary patch literal 2367 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 IM6N<$f_g2SmjD0& literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..ed499b174b7949a0f38ec92decc360f2c8b4863a GIT binary patch literal 5297 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 DK3Os0 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..83d3b2c100e2d27d9583b29040131476857fb141 GIT binary patch literal 3834 zcmbVPS5y<)wpEeP5_<0-pa?+-y@#F{k*0Js#7GCFNHHMNf(U^KqJRk45D;mh_XGk# znrP^~H)*1T94t5I`;B)$?iyq6{juksAFGYEQf#kUf!IaaPn|jig2T-188`l4umTw8 zy5&;isZ*RpxVg!-$QwH^qoN(I3-&Ud0aF~Ci{bE%cDX=bjzE_w`?t=MXI;cyQl&{c ztQVyH!2D;kYa9fXilns2c6LxlBC|zs@`$YIq;mYwz)h9H+^zhkb%n~ed-8!(&s$sH zu16cq+kAhuiFr@|-AJ1`nQL)+^Q!3oHJ^Z5WG&Ula@I1Em-^6uQDDS0>-qTQTkt$n zkC88BxXXiRc!gG)<(t^Zr;4&v{0w*?$4~AlO9zH}s;+9(vOJqTUOU@B?d6C8-2aME zk-EZ7ptiza(%j$YZGVz&CATB~a`<_UbQ^3wiz?5HGEz=S6d7z%p1cg;E-Qu%_k1PRXwA3_xAvFk;zM7%52@GRS5?6I0yM7~m0Qa+H)$y%vJ}G& zUdf)t)dKhu&AWvr{7TWz7wJEKj49`a)~E1nS$)2!A$x$q-I%XWFMgbOPe(XN)w;(# z;Dsd#p(;0C6$Fg0Q&YD?1OU4sE$Vj**0mfbrMl4+=p0LB3ebynjQkSmib^PQ1}9p3 zq%u6msr&?CAag?%ktKI6?K*)w=2zX(&NK^0^W)lZ#QxZMXDN{`-s90sZpV}GOa{e* zU>ifa^U^F#v7}TWf~7Ln^&VU5)i0un6{*0Ld&0_jNgKTWdVno;I|r?c_OCgY0DcnO zqQ3P*VP`}r96Z3cHYJ;%EuQ1@E~2F$@OBIld#*w7Lbv>j9`4VTlv-v{Ez9f0OjYr( z^hGGCrT#@mC5j@C?n-irQ3`=8t1!@t4L~+O8E8(4|1Tg3f!@{~-bsA1Z^6XFZVHe^ zFQx*%+(Vo;yP_9{ySltbHg;k+)NgpQ%FQ><1o`@p$$h_y6?K@s{iUPa0`3%DtMKQ) z+((b|;!xIY$OFRm0`B)-=dKg2D=YPrG74WyDBvxYS?Iyqw`LUJe5YgD{MHh8?A_g2RoYzgLMLg^wrSDY2*M}jHn9GI zwy${RKuzFHlNf9P?14yesCA=WS07~uB=#ko59xZ8v8?Po zzjAw)jl8_RFS^~Fu=IRM(r$yw$4hBt_X;tfvLp2KAyS=0+}xeYnal22cgO#|PDNyxeoE4Jc1vplyx z%MNF>pQS+4iDN#$*Ce>Tcfq<1=k2me`=Fq^KmX}iIL5s9q&#BV;=KyS$K}8Ie)7TA z-L+>Z3*7g{#S9QqfEa%e??jV~f51$Gh4|Lv<3za%)`__s`J%fg2I!*VxQ`>n;1-!W zt9H3cFJ=*#D1y{?Ub1?}S5)z;}*n)b6J7nJ!JwXbzVtJuD>$CQJop$*siwLC`n7D8^c5Ei;*O6;*`=S=T z`3wYqg=v!gwIGws^VnmN@ZCuk!~3AxEW)-lQ=bN2)J^(yKCwq^M&WAiYQ0DR1kc5Y zW%TGhXOH&5Qn4{n4v`WOVOHYU#>RmIULVM;x$U&1BPFsxP=2jG8^8m0G*4uU8eQPzl z*HQncyR(CCdzjc;1zL7~%LqR1srO0$ov|kBtGdu?O&K+g@IkjtK|TqOUuV!d&L2wt zWxU(kvKFR4FU{;AOCDdDNN>8WqB-*F3;VcH-(`UPvl>kSPLUxKdb003X874i#yr1YB*IdxEz@(0k zPxHnc&v3%D6!&5E3>BQmM9<@w_?)eHwq^j7Z}CcP+cQ=-NsEC5#`i8E?_sl%TB~DJ z;gZ3ug}bT3w}Otc^pvW#U`)ep4iT6UW=`j9ZVZPl$nUl-d z^-GD;#vnTce=EHsRy5?Fd9ZHf`_62aPzVPSStyfP7zKpjpO$?vCf2O3BGUpRnQIce z1KJ(K>|gI#f3IL^h$1of2FD%jY45DltW%Abc_`3(^o8Y0WOp0QEb%4iO0Cvj@H~e* zW%I|U=k%rdMtNe|qJy-Gk;8XPNN1qx`8mykVb$rNDBC8_OKFm-J)vC@ry+Re*3q!T zu~~e<&ap4s>HOawkf;Ycj?d0C#{aVFk050&dz;M{FxP~Sz}0ARuZev0XSq%d;+gJy zrd9H!7=52gAeY$2VP!|crn-<$oxH+sE1?6O)djNUZY|%pri<+#kp}mviMr8TpmGnC zgt*lCa|hV!new=3^(HW(aIxjL4&gUn{lmvM+pEYgKxlm$O3ilph@(raeP7S<29fo> z_fw8gED1B*il$v`JXh8r;fbB%ut|FX)|HHRb6MIEY9wb7TBKwfF^g5LJk&Fqv(Sc4 z3@(^Sw;C=Uyi3x&;8Me$S93Sg^)hF9-XH$?Ah@z$Oru|~sq))?sf(*ok22orw4$@z@wif$wc~U4 zc0CMutDn)$Jik8kP-$D_Xvt6u(D?CB*7jlunRvgYzE~8d$|*QHOVxU{sRS^s2?Y?7 z`nBbHO#TG#^70!ZI{?7~x&bTKA&WdlyacCyjWH;x{lM%H+b=rOBybbL4Y~hK~uY)d~rvDTJ#K z#~E!?a3Nt=k|jco*Z!YKv_RD9^6a}}10^}YWGoEPm$cib8(l9#Lth{C3K?1u1Ng0c z}Rp{|6+!2T>I%_+m}Dac5pxrYMQ{xG*2-z?;--GEBa%zE#ZZ zBk!utKB$v32YlBn2e6O!{vCUTfL)?Kjl(5OFKc0ATf%opxxp2#S#*a?=~qGJj0qD} zc|xaKyeSq%EH51S^!fC&0@ZV_B6+7O`eI?ca#WlQo$DhJ80TsCKKGf4qqUt|gB8Ns zXJhA^rmBv?eWOr_jU_`1#h6yN_@t$6JAif6vn&nkQy00x!Vl6;;R*b#Bv8GbagISrY zb6DmHQ!GJy;(B75wSFngwI~1ym8uyP`16~lmbA{&Cbx$;VhFuCq*D&-x?E_>6wBU> z>`z$RhG?>v<$%B6(55$)Ws zv0R)PC+D1nZkk1&I+`UEEJiR2Wm8x%o{u8nwIO@ z5cKjB?2twqzB6CizcH;3n6ZlFEG7z5<9##Jr;02cKZZH(*qT|mNy&V!j<&bE1((a` z8O&6#9!GckDUiBY?>pBK;bv5JO*00K%%BBWQ=jk*bds9I&ZQIc)8TvtOq!jjT>p56 zT1j^A;JHMkY%BNp)mv~*4gxpsUB;-Z$vEF9ndrTe(|&PzVPBjzOg~=pl$25BA;O&T zo*j=JmUEPcT+i*WS@5(+FcvtdwXGOYr%Wv)kTu2A4vVZwT<7^=`!QHN39q{7a^e3N cn*8^)zFbgQ)MTU?W2Zd@x43FvVTz3Z4-cX&(EtDd literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 0000000000000000000000000000000000000000..303ff5855dee00cfe56c6ef2159b23860bdf8dd0 GIT binary patch literal 8311 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 B@fH98 literal 0 HcmV?d00001 diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..7b55f946fc14e525949aebc37ea350f0e4ae7ac7 GIT binary patch literal 5368 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 Tr%sp9(FAnv>1))h*+u^sV5o!9>IaV6aUZ*?W>} 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 + + #1C1B1B + \ No newline at end of file From 6b0b066e7c0f5201a968d46321a19f8a58deb7aa Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 2 Jul 2022 22:32:46 +0530 Subject: [PATCH 037/132] fix: delete duplicate files for manager icon. --- app/src/main/res/mipmap-hdpi/ic_launcher.webp | Bin 1404 -> 0 bytes .../main/res/mipmap-hdpi/ic_launcher_round.webp | Bin 2898 -> 0 bytes app/src/main/res/mipmap-mdpi/ic_launcher.webp | Bin 982 -> 0 bytes .../main/res/mipmap-mdpi/ic_launcher_round.webp | Bin 1772 -> 0 bytes app/src/main/res/mipmap-xhdpi/ic_launcher.webp | Bin 1900 -> 0 bytes .../main/res/mipmap-xhdpi/ic_launcher_round.webp | Bin 3918 -> 0 bytes app/src/main/res/mipmap-xxhdpi/ic_launcher.webp | Bin 2884 -> 0 bytes .../res/mipmap-xxhdpi/ic_launcher_round.webp | Bin 5914 -> 0 bytes .../res/mipmap-xxxhdpi/ic_launcher_round.webp | Bin 7778 -> 0 bytes 9 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-hdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-mdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher.webp delete mode 100644 app/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp delete mode 100644 app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.webp b/app/src/main/res/mipmap-hdpi/ic_launcher.webp deleted file mode 100644 index c209e78ecd372343283f4157dcfd918ec5165bb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1404 zcmV-?1%vuhNk&F=1pok7MM6+kP&il$0000G0000-002h-06|PpNX!5L00Dqw+t%{r zzW2vH!KF=w&cMnnN@{whkTw+#mAh0SV?YL=)3MimFYCWp#fpdtz~8$hD5VPuQgtcN zXl<@<#Cme5f5yr2h%@8TWh?)bSK`O z^Z@d={gn7J{iyxL_y_%J|L>ep{dUxUP8a{byupH&!UNR*OutO~0{*T4q5R6@ApLF! z5{w?Z150gC7#>(VHFJZ-^6O@PYp{t!jH(_Z*nzTK4 zkc{fLE4Q3|mA2`CWQ3{8;gxGizgM!zccbdQoOLZc8hThi-IhN90RFT|zlxh3Ty&VG z?Fe{#9RrRnxzsu|Lg2ddugg7k%>0JeD+{XZ7>Z~{=|M+sh1MF7~ zz>To~`~LVQe1nNoR-gEzkpe{Ak^7{{ZBk2i_<+`Bq<^GB!RYG+z)h;Y3+<{zlMUYd zrd*W4w&jZ0%kBuDZ1EW&KLpyR7r2=}fF2%0VwHM4pUs}ZI2egi#DRMYZPek*^H9YK zay4Iy3WXFG(F14xYsoDA|KXgGc5%2DhmQ1gFCkrgHBm!lXG8I5h*uf{rn48Z!_@ z4Bk6TJAB2CKYqPjiX&mWoW>OPFGd$wqroa($ne7EUK;#3VYkXaew%Kh^3OrMhtjYN?XEoY`tRPQsAkH-DSL^QqyN0>^ zmC>{#F14jz4GeW{pJoRpLFa_*GI{?T93^rX7SPQgT@LbLqpNA}<@2wH;q493)G=1Y z#-sCiRNX~qf3KgiFzB3I>4Z%AfS(3$`-aMIBU+6?gbgDb!)L~A)je+;fR0jWLL-Fu z4)P{c7{B4Hp91&%??2$v9iRSFnuckHUm}or9seH6 z>%NbT+5*@L5(I9j@06@(!{ZI?U0=pKn8uwIg&L{JV14+8s2hnvbRrU|hZCd}IJu7*;;ECgO%8_*W Kmw_-CKmY()leWbG diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-hdpi/ic_launcher_round.webp deleted file mode 100644 index b2dfe3d1ba5cf3ee31b3ecc1ced89044a1f3b7a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2898 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 diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.webp b/app/src/main/res/mipmap-mdpi/ic_launcher.webp deleted file mode 100644 index 4f0f1d64e58ba64d180ce43ee13bf9a17835fbca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 zcmV;{11bDcNk&G_0{{S5MM6+kP&il$0000G0000l001ul06|PpNU8t;00Dqo+t#w^ z^1csucXz7-Qrhzl9HuHB%l>&>1tG2^vb*E&k^T3$FG1eQZ51g$uv4V+kI`0<^1Z@N zk?Jjh$olyC%l>)Xq;7!>{iBj&BjJ`P&$fsCfpve_epJOBkTF?nu-B7D!hO=2ZR}

C%4 zc_9eOXvPbC4kzU8YowIA8cW~Uv|eB&yYwAObSwL2vY~UYI7NXPvf3b+c^?wcs~_t{ ze_m66-0)^{JdOMKPwjpQ@Sna!*?$wTZ~su*tNv7o!gXT!GRgivP}ec?5>l1!7<(rT zds|8x(qGc673zrvYIz;J23FG{9nHMnAuP}NpAED^laz3mAN1sy+NXK)!6v1FxQ;lh zOBLA>$~P3r4b*NcqR;y6pwyhZ3_PiDb|%n1gGjl3ZU}ujInlP{eks-#oA6>rh&g+!f`hv#_%JrgYPu z(U^&XLW^QX7F9Z*SRPpQl{B%x)_AMp^}_v~?j7 zapvHMKxSf*Mtyx8I}-<*UGn3)oHd(nn=)BZ`d$lDBwq_GL($_TPaS{UeevT(AJ`p0 z9%+hQb6z)U9qjbuXjg|dExCLjpS8$VKQ55VsIC%@{N5t{NsW)=hNGI`J=x97_kbz@ E0Of=7!TQj4N+cqN`nQhxvX7dAV-`K|Ub$-q+H-5I?Tx0g9jWxd@A|?POE8`3b8fO$T))xP* z(X?&brZw({`)WU&rdAs1iTa0x6F@PIxJ&&L|dpySV!ID|iUhjCcKz(@mE z!x@~W#3H<)4Ae(4eQJRk`Iz3<1)6^m)0b_4_TRZ+cz#eD3f8V;2r-1fE!F}W zEi0MEkTTx}8i1{`l_6vo0(Vuh0HD$I4SjZ=?^?k82R51bC)2D_{y8mi_?X^=U?2|F{Vr7s!k(AZC$O#ZMyavHhlQ7 zUR~QXuH~#o#>(b$u4?s~HLF*3IcF7023AlwAYudn0FV~|odGH^05AYPEfR)8p`i{n zwg3zPVp{+wOsxKc>)(pMupKF!Y2HoUqQ3|Yu|8lwR=?5zZuhG6J?H`bSNk_wPoM{u zSL{c@pY7+c2kck>`^q1^^gR0QB7Y?KUD{vz-uVX~;V-rW)PDcI)$_UjgVV?S?=oLR zf4}zz{#*R_{LkiJ#0RdQLNC^2Vp%JPEUvG9ra2BVZ92(p9h7Ka@!yf9(lj#}>+|u* z;^_?KWdzkM`6gqPo9;;r6&JEa)}R3X{(CWv?NvgLeOTq$cZXqf7|sPImi-7cS8DCN zGf;DVt3Am`>hH3{4-WzH43Ftx)SofNe^-#|0HdCo<+8Qs!}TZP{HH8~z5n`ExcHuT zDL1m&|DVpIy=xsLO>8k92HcmfSKhflQ0H~9=^-{#!I1g(;+44xw~=* zxvNz35vfsQE)@)Zsp*6_GjYD};Squ83<_?^SbALb{a`j<0Gn%6JY!zhp=Fg}Ga2|8 z52e1WU%^L1}15Ex0fF$e@eCT(()_P zvV?CA%#Sy08_U6VPt4EtmVQraWJX` zh=N|WQ>LgrvF~R&qOfB$!%D3cGv?;Xh_z$z7k&s4N)$WYf*k=|*jCEkO19{h_(%W4 zPuOqbCw`SeAX*R}UUsbVsgtuG?xs(#Ikx9`JZoQFz0n*7ZG@Fv@kZk`gzO$HoA9kN z8U5{-yY zvV{`&WKU2$mZeoBmiJrEdzUZAv1sRxpePdg1)F*X^Y)zp^Y*R;;z~vOv-z&)&G)JQ{m!C9cmziu1^nHA z`#`0c>@PnQ9CJKgC5NjJD8HM3|KC(g5nnCq$n0Gsu_DXk36@ql%npEye|?%RmG)

FJ$wK}0tWNB{uH;AM~i diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher.webp deleted file mode 100644 index 948a3070fe34c611c42c0d3ad3013a0dce358be0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1900 zcmV-y2b1_xNk&Fw2LJ$9MM6+kP&il$0000G0001A003VA06|PpNH75a00DqwTbm-~ zullQTcXxO9ki!OCRx^i?oR|n!<8G0=kI^!JSjFi-LL*`V;ET0H2IXfU0*i>o6o6Gy zRq6Ap5(_{XLdXcL-MzlN`ugSdZY_`jXhcENAu)N_0?GhF))9R;E`!bo9p?g?SRgw_ zEXHhFG$0{qYOqhdX<(wE4N@es3VIo$%il%6xP9gjiBri+2pI6aY4 zJbgh-Ud|V%3O!IcHKQx1FQH(_*TK;1>FQWbt^$K1zNn^cczkBs=QHCYZ8b&l!UV{K z{L0$KCf_&KR^}&2Fe|L&?1I7~pBENnCtCuH3sjcx6$c zwqkNkru);ie``q+_QI;IYLD9OV0ZxkuyBz|5<$1BH|vtey$> z5oto4=l-R-Aaq`Dk0}o9N0VrkqW_#;!u{!bJLDq%0092{Ghe=F;(kn} z+sQ@1=UlX30+2nWjkL$B^b!H2^QYO@iFc0{(-~yXj2TWz?VG{v`Jg zg}WyYnwGgn>{HFaG7E~pt=)sOO}*yd(UU-D(E&x{xKEl6OcU?pl)K%#U$dn1mDF19 zSw@l8G!GNFB3c3VVK0?uyqN&utT-D5%NM4g-3@Sii9tSXKtwce~uF zS&Jn746EW^wV~8zdQ1XC28~kXu8+Yo9p!<8h&(Q({J*4DBglPdpe4M_mD8AguZFn~ ztiuO~{6Bx?SfO~_ZV(GIboeR9~hAym{{fV|VM=77MxDrbW6`ujX z<3HF(>Zr;#*uCvC*bpoSr~C$h?_%nXps@A)=l_;({Fo#6Y1+Zv`!T5HB+)#^-Ud_; zBwftPN=d8Vx)*O1Mj+0oO=mZ+NVH*ptNDC-&zZ7Hwho6UQ#l-yNvc0Cm+2$$6YUk2D2t#vdZX-u3>-Be1u9gtTBiMB^xwWQ_rgvGpZ6(C@e23c!^K=>ai-Rqu zhqT`ZQof;9Bu!AD(i^PCbYV%yha9zuoKMp`U^z;3!+&d@Hud&_iy!O-$b9ZLcSRh? z)R|826w}TU!J#X6P%@Zh=La$I6zXa#h!B;{qfug}O%z@K{EZECu6zl)7CiNi%xti0 zB{OKfAj83~iJvmpTU|&q1^?^cIMn2RQ?jeSB95l}{DrEPTW{_gmU_pqTc)h@4T>~& zluq3)GM=xa(#^VU5}@FNqpc$?#SbVsX!~RH*5p0p@w z;~v{QMX0^bFT1!cXGM8K9FP+=9~-d~#TK#ZE{4umGT=;dfvWi?rYj;^l_Zxywze`W z^Cr{55U@*BalS}K%Czii_80e0#0#Zkhlij4-~I@}`-JFJ7$5{>LnoJSs??J8kWVl6|8A}RCGAu9^rAsfCE=2}tHwl93t0C?#+jMpvr7O3`2=tr{Hg$=HlnjVG^ewm|Js0J*kfPa6*GhtB>`fN!m#9J(sU!?(OSfzY*zS(FJ<-Vb zfAIg+`U)YaXv#sY(c--|X zEB+TVyZ%Ie4L$gi#Fc++`h6%vzsS$pjz9aLt+ZL(g;n$Dzy5=m=_TV(3H8^C{r0xd zp#a%}ht55dOq?yhwYPrtp-m1xXp;4X;)NhxxUpgP%XTLmO zcjaFva^}dP3$&sfFTIR_jC=2pHh9kpI@2(6V*GQo7Ws)`j)hd+tr@P~gR*2gO@+1? zG<`_tB+LJuF|SZ9tIec;h%}}6WClT`L>HSW?E{Hp1h^+mlbf_$9zA>!ug>NALJsO{ mU%z=YwVD?}XMya)Bp;vlyE5&E_6!fzx9pwrdz474!~g(M6R?N? diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.webp deleted file mode 100644 index 1b9a6956b3acdc11f40ce2bb3f6efbd845cc243f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3918 zcmV-U53%r4Nk&FS4*&pHMM6+kP&il$0000G0001A003VA06|PpNSy@$00HoY|G(*G z+qV7x14$dSO^Re!iqt-AAIE9iwr$(CZQJL$blA4B`>;C3fBY6Q8_YSjb2%a=fc}4E zrSzssacq<^nmW|Rs93PJni30R<8w<(bK_$LO4L?!_OxLl$}K$MUEllnMK|rg=f3;y z*?;3j|Nh>)p0JQ3A~rf(MibH2r+)3cyV1qF&;8m{w-S*y+0mM){KTK^M5}ksc`qX3 zy>rf^b>~l>SSHds8(I@hz3&PD@LmEs4&prkT=BjsBCXTMhN$_)+kvnl0bLKW5rEsj z*d#KXGDB4P&>etx0X+`R19yC=LS)j!mgs5M0L~+o-T~Jl!p!AJxnGAhV%~rhYUL4hlWhgES3Kb5oA&X z{}?3OBSS-{!v$nCIGj->(-TAG)8LR{htr41^gxsT8yqt2@DEG6Yl`Uma3Nd4;YUoW zTbkYl3CMU5ypMF3EIkYmWL|*BknM`0+Kq6CpvO(y$#j94e+q{vI{Zp8cV_6RK!`&C zob$*5Q|$IZ09dW=L!V zw@#2wviu|<#3lgGE8GEhcx+zBt`} zOwP8j9X%^f7i_bth4PiJ$LYtFJSCN$3xwDN;8mr*B;CJwBP2G0TMq0uNt7S^DO_wE zepk!Wrn#Z#03j{`c*Rf~y3o7?J}w?tEELRUR2cgxB*Y{LzA#pxHgf}q?u5idu>077 zd^=p)`nA}6e`|@`p?u}YU66PP_MA}Zqqe!c{nK&z%Jwq1N4e_q<#4g^xaz=ao;u|6 zwpRcW2Lax=ZGbx=Q*HhlJ`Ns#Y*r0*%!T?P*TTiX;rb)$CGLz=rSUum$)3Qyv{BL2 zO*=OI2|%(Yz~`pNEOnLp>+?T@glq-DujlIp?hdJeZ7ctP4_OKx|5@EOps3rr(pWzg zK4d3&oN-X2qN(d_MkfwB4I)_)!I_6nj2iA9u^pQ{;GckGLxBGrJUM2Wdda!k)Y>lq zmjws>dVQ*vW9lvEMkiN3wE-__6OWD0txS&Qn0n22cyj4Q*8(nG4!G{6OOwNvsrPIL zCl-$W9UwkEUVuLwyD%|inbOF*xMODZ4VMEVAq_zUxZ+K#Gdqf!DW$5f)?7UNOFMz! zrB~tuu=6X2FE(p^iqgxr+?ZK;=yz`e;C$#_@D9Lj-+TDVOrva>(#*PVbaHO>A)mhl z07OJWCqYC60518$!&c`eNBcBW%GnfaQ*$eazV^2_AW?j)h;J1nUjN(I9=0+!RVx~% z3@Tf!P0TE+98jA?WceK-}A1% zW!K)lyKcGqy#M~})315-A#2NXQ`?6NR#Apo=S!oF=JfpX>iR*49ec{7AN$xxpK{D$ z2d%Fz&rdfSqourN$~Y^NFIMV1CZ?J*bMx~H3k&meGtH@q9ra2vZxmA$S(#jaaj-g4 ztJmxG+DLV<*q<|sDXPp$X>E)#S}Vm&sRaO5P&goh2><}FEdZSXDqsL$06sAkh(e+v zAsBhKSRexgwg6tIy~GFJzaTxXD(}|+0eOwFDA%rn`X;MVwDHT9=4=g%OaJ9s%3b9>9EUTnnp0t;2Zpa{*>mk~hZqItE_!dQ zOtC>8`$l|mV43Jbudf0N6&&X;{=z}Zi}d1`2qmJ}i|0*GsulD3>GgQXHN)pkR6sf1 z?5ZU%&xtL}oH;YiAA)d*^Ndw2T$+Mjuzyzz@-SM`9df7LqTxLuIwC~S0092~+=qYv z@*ja;?Wt!T!{U?c*Z0YtGe)XbI&y-?B&G2$`JDM)(dIV9G`Sc#6?sI60de6kv+)Qb zUW~2|WjvJq3TA8`0+sWA3zRhY9a~ow)O~&StBkG2{*{TGiY~S8ep{V&Vo2l<6LWsu z^#p0-v*t2?3&aA1)ozu|%efSR=XnpX$lvTeRdKlvM!@|pM5p2w3u-6 zU>}t2xiYLS+{|%C65AzX+23Mtlq?BS&YdYcYsVjoiE&rT>;Necn6l^K)T^lmE`5u{ zm1i+-a-gc;Z&v-{;8r)z6NYfBUv+=_L}ef}qa9FX01)+Aaf+;xj(mL6|JUzGJR1|fnanb%?BPPIp>SCjP|8qE5qJ{=n5ZGw?81z3(k;pzH%1CtlX50{E7h)$h{qGKfzC`e2o`*IqA#tjA z`Fz&^%$b9F*N`)U-#6>a)Z`55`$Dd0cfcs0$d13^ONrdCu9xcv_=n#WQo8stcz3jP9|2EvdI-RhJM3%Q%oM&!OlShM|0 z?gz?wHZSnm45njLtsz8PVT1S&jAlbKg5kVam$p16=EK@Sj4EP0OtH zmJDmdc^v)x>56Qg_wmYHz6h)>kl_h$>0@J!ypv%APmjZTAQVLy6Fu50RGY&JAVNhx zrF_qG6`x9MkT;1SFWo$)l{M$;3qUDn9JwE}z zRl#E_bDRJFii61kPgBybIgp8dNW!Cc1b*^YYk-#oWLJvtM_v^hQx~9?8LD4VFFxBF z3MlrsSC%f9Oupn*ctPL0U1fwfX?`tRhPD{PSLFPQOmIt$mDy0SgpNVvHS+f#Do>h1Gn?LZU9(KaN>Q_=Y*_T zvtD7%_u^^+{g`0VGzg(VZrpVQ6Ub5M=tI_p7T93R8@3Zulu3|#{iNcu!oiHxZ4Rf*( zfmiN$$ru(*_Zqn=`Gq#OuHRTSwp7uH_SokR&|)RuW5yo=Z|_4?qU-JU+tpt>!B&Is z@N(=SG;bpVc;AO@zbmMM zScqq1)b-ZQIrs={oD}|?6y{$HNB1U0^LsBh8JI&3!GBZxOXI<}&5-$lgkAaYqhOTb z?2vEnZ$-kk;*M_17(upJF3%+iH*s0-r{vttXVB2OUwI1s^+G(Ft(U8gYFXC}#P&E^ z>T@C^tS`Z7{6HT4_nF~n>JlZtk5&qDBl6r|^kzQYe`wq!C)n@$c>WOPA61NDFj<<6 zGW71NMMhwAl!U-yqrq2xrSFqRCI8acw7?}3j;ynxo*-b7Co;g5r%^j=H@9({PXXBf z@r>U>>N;E)81wx`B4f%{PB~MHka_);%kBCb(d|Jy5!MqJ%2p`t&@L)4$T2j&-WHvG zv3(uyA_gwqNu(k?jQTtv3dgPKRZoH8prxe7>pQBW5L&dpumS&5Ld2?(sCpJjvc4L5 zEnh&?91WVm)ZdTj=fjJ$pPDdgAttLXuke+?KdKxu*;kTC(r!tQk6;gxj4h%FdHAt(^M3YvYj(!tOeN)+Hvj6+< zzyJRG?^lZfWuR#t!tUKP&(?%3v&Zd$R2YN>lB(Lq`OInY48%4%yTv2 zYe1{G`3)(PDEio5Y@-I5tUf`c%%OCJMtSW56g3iEg%3`$7XSJJHyA z<|7&N)5Xrlgv~%BO24eFd;Hd;uiK%D`EdK|quUeRZDqbh9l)%j%J#0lfrZumvA<_w zu&=AVvdChf6}eqh(bUz`(`Ue*p01{fBAcTgKyDYLs_I+YyJEk+rM@avU~>fB$n)HS zM7pfJydu`i%gfS<{PF94kZDv$t>06sAkheDzu40NJ$5CMW%n^Lls?8^p^QGWURbKu3ZduZQZ((s2? zzE`}<{;Zt7<$C|9R8A~DJ~@%x>TfP zF>TX8)@v|t)q4GjRt<}5s6hLHwRel7>V@&r-O|Av(yh;Q1A{E>Ir>p+%dHD|=l+lT zpr(Dg&>#Nu=!)6bCLr-ZS%|;h)Ij$+e@r8_{qO19QvDe=&1tmpY*0lcA^Cc-#{9fQ z<~$*<&P$Q<_jy#<$40PMofM7aQ}C=jphI`4kLg}Z7CIN#26D{-4v-_CA-LiE@(%{y!BzsU%gG`Q?sjLUf%qFSl0y)2#ae*+EI>s|i`d^V$Dn)qmzqRq6VJRY|{4ujsIU%#bnqU6MR&-1I_43=|5(6Jr;Jvert) zE?S|Tmn}Tv<-??sxV5@9t}3D=>YZ0JrQe$CO~|EY=Lj9RM&4svQHPQL6%pV5fPFiH zfXDx;l@~et{*{U*#c#Dvzu)|znDO7$#CRx)Z&yp-}SrD{&|(MQtfUz~n35@RLfUy=aqrhCX0M}J_r5QsK~NmRCR|Nm&L z41UdsLjWxSUlL41r^0K&nCCK>fdR-!MYjFg(z9_mF^C|#ZQw?`)f6uVzF^`bRnVY& zo}@M06J&_+>w9@jpaO4snmU;0t-(zYW1qVBHtuD!d?%?AtN7Plp><-1Y8Rqb20ZaP zTCgn*-Sri4Q8Xn>=gNaWQ57%!D35UkA@ksOlPB*Dvw}t02ENAqw|kFhn%ZyyW%+t{ zNdM!uqEM^;2}f+tECHbwLmH*!nZVrb$-az%t50Y2pg(HqhvY-^-lb}>^6l{$jOI6} zo_kBzj%8aX|6H5M0Y<)7pzz_wLkIpRm!;PzY)9+24wk2&TT{w--phDGDCOz{cN_ca zpnm7`$oDy=HX%0i-`769*0M6(e5j-?(?24%)<)&46y0e&6@HCDZAm9W6Ib#Y#BF6- z=30crHGg+RRTe%VBC>T00OV6F+gQDAK38Ne3N9bm|62tPccBJi)5{B z4zc^Db72XiBd}v$CF|yU{Z=M|DZ%-(XarYNclODlb1Kz1_EKLy(NSLCN`eUl(rBCL zT*jx@wNvze0|TSqgE(QArOZU)_?qH(sj#TwzElLs9q)(0u!_P|R%Cy_0JFQxgGV>1 zz4?_uq<8_gM0`c*Hh|;UMz~vrg1gQXp{ufg`hM_qU;U>+zmvc5blCLSq@PrEBSGR# z&8=2Z4uXN`F3p73ueD1l{s{k$WipAvSh5W7ABe?4)t;r@V?y`bNB5FvBuE|0VRTb< zM1Hn^?DSsJY+sX@T5xW=#>T9VEV|?<(=6|ge$X6Sb05!LFdjDcoq*gM(Zq=t;_)Le&jyt(&9jzR73noru`a# zN*<`KwGa^gZU3-)MSLF0aFag#f0<>E(bYTeHmtdbns#|I)-$)mJ`q9ctQ8g0=ET?| zdO}eZ*b_p>ygRTtR^5Ggdam=Zb5wmd{}np+Jn1d_=M`~P=M67jj})fH4ztb5yQqQW z^C|C&^LHAK-u+ooIK)yM)QM?t;|<{P;;{`p=BclzAN#JzL4jCwXkQB1Dy{=^KR`=~ zTrr)y7eiYBzSNs_DvO=4A6#EgGS-zY%Vi)N*Yb`U;6o}KR}dq{r9pT5wqZ@3NOE8- z9-(}D|Nc5732CSYQbL)!gPQ#RbD8BhK3dl{sUuPvei0tkvnJBxDEAYTesU8H$)g(Plra{VH(v3u^CO1~(+ zU0O7#)jaS4{NcwA+LuSm&VBcX2#Im3xg)W}ySNw%->orn1taZ&+d)}8gJTqA!u|5P z{yv?zol_3|(1(%M(EVU=cp?L`{Pi|ixk{U)*guFML3P!OSlz;zGA#T+E@8@cgQ_mv1o7RSU=Zo_82F?&&2r;WE z@wk}JHYEZ9nYUc(Vv~iTCa3u8e4q(yq<29VoNbKk|`mq%I6u)My=gPIDuUb&lzf4`MEA9^g8u z)vp8|$$HE9m_BTV?lOosIGa4jud=jIbw)O2eCMfyw2*S8?hjWw^nqws$O*M$3I1)x zR0PWFb3$ySOcGTe1dz%N0l;RPc`x%05FtT^f^j{YCP}*Q=lvp4$ZXrTZQHhO+w%wJn3c8j%+5C3UAFD&%8dBl_qi9D5g8fry}6Ev z2_Q~)5^N$!IU`BPh1O|=BxQ#*C5*}`lluC515$lxc-vNC)IgW=K|=z7o%cWFpndn= zX}f{`!VK02_kU+Q5a3m37J;c} zTzbxteE{GNf?yLt5X=Bzc-mio^Up0nunMCgp*ZJ;%MJvPM3QK)BryP(_v@ei4UvHr z6+sbCifQaOkL6-;5fL8$W($zZ_;CZp305C;~$hhRquZr-r)jjd1z z31%ZK{-(`P#|Um_Sivn@p$-vz46uqT>QG0B1w9znfS9A8PB2LaHdzA|_)yjXVR*l{ zkcu3@vEf7bxH0nkh`q?8FmoO_Ucui*>_a~P?qQrlZ9@+D7%MTpSnztpylXrt5!-k8_QPB?YL8Kx_On8WD zgT+111d(Op$^$&KLAN5+@?>f7F4~wFi(8TL8+szgVmcMDTp5l&k6~=rA{Dt}!gb^r zSWY<)M7D|Z2P0cEodj6E42PV>&>DFmQpgt)E-|#sSUU@uKed+F680H@<;-x{p|nuH4!_mn85rx>wz;0mPi2ZkL#k6;sznu?cXh!T0S>{w6 zL^gvR05NY64l*<+_L>On$rjx9!US;l;LX6@z}yi#2XHh)F@Oo+l)h%fq$v}DNmF2> zfs^_t0)3N-W<9-N?uedVv{)-J0W5mh#29QM5R5h&KuiRM=0Zvnf#lF=K#WlCgc#9c zS;qvh(P$!_a8JwyhI^ZJV2k+B6Z^64?w|1?5gyo6y{}923CRZfYVe1#?F% z7h2SUiNO3;T#JUOyovSs@@C1GtwipycA=*x5{BpIZ_#GCMuV8XK=x;qCNy{d7?wA~ zC+=vjls;ci&zW=6$H~4^K%v{p}Ab?U%C6Z4p%eC<3ExqU$XR<}LLF67A$Sr20DR_pJ3yeBa~ z^sw{V0FI5;UpwXsScYuhbqGQ`YQ25;6p6W^+tgL&;Ml;>S3CGpSZ>VrTn0m1$y$HU z&65)I!c?oREz};c=nLCliriqQX->4uivHTgd${GqeAlf*!P^B|jkU|*IdNP(&6C>4 zqOW$)Nw9nvjy^&`?E|gotDV{JmJ9Q~vuhy<`^C4XIUDt|j4o6rK^e8_(=YqC zuaR6TRVf@tUFHB079o4MBIh{M~4>WwnGgesQH*3?w(RA%hCZ*7)b!aNV=yOQ%o_Y=Lt0Sl*(9^jfRnC210Om$=y>*o|3z} zAR&vAdrB#mWoaB0fJSw9xw|Am$fzK>rx-~R#7IFSAwdu_EI|SRfB*yl0w8oX09H^q zAjl2?0I)v*odGJ40FVGaF&2qJq9Gv`>V>2r0|c`GX8h>CX8eHcOy>S0@<;M3<_6UM z7yCEpug5NZL!H_0>Hg_HasQGxR`rY&Z{geOy?N92Z z{lER^um|$*?*G63*njwc(R?NT)Bei*3jVzR>FWUDb^gKhtL4A=kE_1p-%Fo2`!8M} z(0AjuCiS;G{?*^1tB-uY%=)SRx&D)pK4u@>f6@KPe3}2j_har$>HqzH;UCR^ssFD0 z7h+VLO4o@_Yt>>AeaZKUxqyvxWCAjKB>qjQ30UA)#w z&=RmdwlT`7a8J8Yae=7*c8XL|{@%wA8uvCqfsNX^?UZsS>wX}QD{K}ad4y~iO*p%4 z_cS{u7Ek%?WV6em2(U9#d8(&JDirb^u~7wK4+xP$iiI6IlD|a&S)6o=kG;59N|>K1 zn(0mUqbG3YIY7dQd+*4~)`!S9m7H6HP6YcKHhBc#b%1L}VIisp%;TckEkcu0>lo@u995$<*Em;XNodjTiCdC%R+TX|_ZR#|1`RR|`^@Teh zl#w@8fI1FTx2Dy+{blUT{`^kY*V-AZUd?ZZqCS4gW(kY5?retkLbF=>p=59Nl|=sf zo1Pc|{{N4>5nt#627ylGF`3n>X%`w%bw-Y~zWM_{Si$dc82|=YhISal{N7OY?O`C4 zD|qb}6nLWJ`hUyL+E>-;ricg9J@ZNYP(x(Sct&OI$Y!QWr*=^VN;G3#i>^1n4e#Je zOVhbFbLpXVu*16enDM+ic;97@R~u&kh__kgP#!R`*rQEnA+_dLkNP~L`0alC|J;c; zeiK=s8;BsLE)KbG3BD&Br@(Ha@SBT&$?xX`=$;eeel=|R_dIr6-Ro?=HEjnsJ_b`1 zK6Yg^-6;^2aW!xeTK)A~3Rm|L^FCHB_I>jIju7ZGo&N_1*QHkxH2!!%@o4iZ?vntS;&zJdPe1dH#04YD93A44o-MpfD zP{rn_aq>U%RDvC2+bp;xPlsOzauIi3*Lf42`jVKKZCRuKdYhi>FDuL2l=v{$BCN#Q6796s%r-AG$Q^t(3c@ zD?w0UhYr11@feiyl9kY_@H8~|xlmO<8PfQmj1!$@WieW@VxR@Psxfe-v9WCi1+f>F4VL?0O~K7T?m4-u|pSkBpUJZZe*16_wAp zSYZ@;k`3;W3UHKUWc8QeI}0jH5Ly=cGWQPw(Kr2fm=-5L(d`lcXofy8tJY3@Tuadz zYWXR{mW7XT!RF#RVCe%}=tM*O6!AD3^(!8un~opNI%Uko7$5t@<8+?; zTxDys(MyyGsUjtSu9$+|_-t!U3fVb1dkK?l`17<+jfl=hrBHnDSV>^R1=TnQeyqbW z>ov#l%!1|S!1>8UUxIdhQq`_klcHVx0{?#>K3#$4GlXncwldt!g17TcvKq-jo_996 z>oA=tH9CqRl6Yw?Uc`am!V?lHJbizOJaVaScf1UP5e7Dbgabq=b!B~T&_F6?ooU>w%x0A zH~&MHJ=q`fCH{U<7MDXE4SD32cDZA)WJeWkllJ`UspWaS#eDe^kg^oU_A14UE9zG-a^g{xaXf$})Wik>gT zl#dkzGr(;h0JZDuFn(+k8wNq?PZ5grQ<+sM?wBGt@JnH6v0#or-5wBQWKU~(S_> zkE!tc*ZJ1Y&*p(xX84POb3cClRMd!^qJ#CAZfIepEj-<`VURS_yCz0(?*Ixcj4 z-!zV1_QZhpm=0<;*(nm+F>T=)o?ep@CK5I%g^VAA+RB25ab?7)A~z~egru=I1S|@v zH7tXV!0wmGS^qj#e+MY;C5eUjEAp$Y?LDkS^QPZ}8WN85?r$u<-Epi;yZ1|J2J`se z$D6DpH~2F=eI0B&=UFAUnJvZAmClJlK)sutJ?M>xpZiWV&0=G4MZP+x+p>EX=HbCz zxls%Mw?*u^;LbHWIWCyq+yi)`GmFn9J112CZda_u@YIP%i;srFg_paU02Ifij*7}l z&CF-(3|>*a|+vbNR`^RP=9G?ymEJ0Z~)d&c*UE$UMepZ zcITr{0WqhxkjUnM15js_gW=e3Uh|y6ZReaXHIz-=p`x5VvB&rH9y>Amv@^WmXFEw) zQXYrk3feir=a{jMQ+wDIkkFnZ$k{sJakHn*?u za%4b!00ev8NVLM1TY=cl?KB&55BY_MU-sg?c>=Dbz_W{(Z~c?HJi*XpYL)C6Bd8WH zt+v-#0&o~@t4qESi*)+eW%@VD0|o^yF)n0hME$UtXF$*Lvh}7sso{`|pn*JDIy5^Fm3s$5*zEE=?u5<=l8FJc3r%+H} zdfoNl2J0^~!-*mOL5o-x32|e0Im*E!yY7F7E5N)W3>+v_LBydlEx?4$RL5f2oYRD# zaR0wv(-p~wO0eLDl3K=%`{5+0Gd$ktO=W)gWlGZJ0`K z$_RNA=ckrfa;H0KA~dR^p�(p-{x$&=IACIfoAR!za)F-^da-t3#0Dycnp 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

UmY2RIYtNPVDpE$%vda+HD#3m z&VuXJ{BK&Qe+rBa7eq}Q(bq|tn(RrJAk|ztj2(i{d>nmQnM?;HF2k&9sA6up5tmjl z7lySlzMbifH17-m-Lwa_F&e7nOH?ESi3#ckR3tsM+jsck3`oG!uMS}|eAwVXv>}qxwq?QY%QJ0}r@^;fhuUA9W z*BVl>TGo&N004@xSiwDUXUvp51sVmqO3m)=B55aPwf@0=e}cN+$-BdKxY`YrT_4)0 z_d10#i44Q*rFr8MC>*)v$EJvz``(pb{e&*6k+b zsMz%($|1+8hn8c2?P(l@;Rb&CsZeYoCI3?2!LqjbwPXW3z4G$Qfj=cT5Yb%vY0(AX oeb?AaKtwrnc|$|zzw9vfvn^aJJ!zd)XFXqqy0000001=f@-~a#s From 469987be1fa1c5daf4e1d1a9e1be18e55bffde08 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 2 Jul 2022 22:55:15 +0530 Subject: [PATCH 038/132] feat: toast to tell users to select apk before spamming patch button. --- .../manager/ui/components/FloatingActionButton.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/java/app/revanced/manager/ui/components/FloatingActionButton.kt b/app/src/main/java/app/revanced/manager/ui/components/FloatingActionButton.kt index 1af30122dc..f6074f81cd 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/FloatingActionButton.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/FloatingActionButton.kt @@ -1,5 +1,6 @@ package app.revanced.manager.ui.components +import android.widget.Toast import androidx.compose.material.ripple.LocalRippleTheme import androidx.compose.material.ripple.RippleAlpha import androidx.compose.material.ripple.RippleTheme @@ -8,6 +9,8 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalContext + @Composable fun FloatingActionButton( @@ -16,6 +19,8 @@ fun FloatingActionButton( onClick: () -> Unit, enabled: Boolean ) { + val context = LocalContext.current + // TODO: set icon color: // tint = if (enabled) LocalContentColor.current.copy(alpha = LocalContentAlpha.current) else else DarkGray CompositionLocalProvider( @@ -27,7 +32,12 @@ fun FloatingActionButton( text = text, icon = icon, onClick = { + if (!enabled) { + Toast.makeText(context, "Please select an application to patch", Toast.LENGTH_LONG).show() + } if (enabled) onClick() + + }, containerColor = if (enabled) MaterialTheme.colorScheme.primaryContainer else Color.Gray, ) From 11736f51c56bc503ad222486c838334427198981 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sun, 3 Jul 2022 02:08:34 +0530 Subject: [PATCH 039/132] feat: add theme changer switch (UI only). --- .../manager/ui/screens/SettingsScreen.kt | 39 +++++++++++++------ .../app/revanced/manager/ui/theme/Theme.kt | 2 +- 2 files changed, 28 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt index bb87d13ee9..ec3968bff1 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt @@ -1,13 +1,16 @@ package app.revanced.manager.ui.screens +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.* -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text +import androidx.compose.material3.* import androidx.compose.runtime.Composable +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp +import app.revanced.manager.ui.theme.ReVancedManagerTheme import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph @@ -19,13 +22,25 @@ private const val tag = "SettingsScreen" @Composable fun SettingsScreen( ) { - Column() { - Box(modifier = Modifier.fillMaxSize()) { - Text( - text = "TODO", - style = MaterialTheme.typography.headlineMedium, - modifier = Modifier.align(Alignment.TopCenter).paddingFromBaseline(12.dp,0.dp) - ) - } + val checkedState = remember { mutableStateOf(true) } + + Row( + modifier = Modifier + .fillMaxWidth() + .padding(24.dp, 16.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Text( + text = "Change Theme", + style = MaterialTheme.typography.bodyLarge, + ) + Spacer(modifier = Modifier.weight(1f),) + Switch( + checked = checkedState.value, + onCheckedChange = { + checkedState.value = it + + } + ) } -} \ No newline at end of file +} diff --git a/app/src/main/java/app/revanced/manager/ui/theme/Theme.kt b/app/src/main/java/app/revanced/manager/ui/theme/Theme.kt index 61306cc19f..3dacb8e417 100644 --- a/app/src/main/java/app/revanced/manager/ui/theme/Theme.kt +++ b/app/src/main/java/app/revanced/manager/ui/theme/Theme.kt @@ -11,7 +11,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.core.view.ViewCompat -private val DarkColorScheme = darkColorScheme( +private val DarkColorScheme = darkColorScheme( primary = Purple80, secondary = PurpleGrey80, tertiary = Pink80 From 085f04c95f64fb81076751efe484af3364a2472c Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 3 Jul 2022 00:22:36 +0300 Subject: [PATCH 040/132] feat: app version in about --- app/build.gradle.kts | 3 ++- .../java/app/revanced/manager/ui/screens/AboutScreen.kt | 8 ++++++++ app/src/main/res/values/strings.xml | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index dea4638b66..aeb8d9b0d5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -39,7 +39,8 @@ android { minSdk = 26 targetSdk = 32 // TODO: update to 33 when sources are available versionCode = 1 - versionName = "1.0" + versionName = "0.1" + buildConfigField("String", "VERSION_TYPE", "\"Alpha\"") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" vectorDrawables { diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 6c97797bfa..0b10130306 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import app.revanced.manager.BuildConfig import app.revanced.manager.Global.Companion.socialLinks import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R @@ -47,6 +48,13 @@ fun AboutScreen( var currentUriHandler = LocalUriHandler.current + PreferenceRow( + title = stringResource(R.string.app_version), + subtitle = "${BuildConfig.VERSION_TYPE} ${BuildConfig.VERSION_NAME}", + painter = painterResource(id = R.drawable.ic_baseline_info_24 + ), + onClick = { /* TODO: COPY DEVICE INFORMATION AND APP INFO */ }, + ) PreferenceRow( title = stringResource(R.string.whats_new), painter = painterResource(id = R.drawable.ic_baseline_new_releases_24 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e3ee850206..283f9bf8d5 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -58,4 +58,5 @@ Manager Contributors Integrations Contributors Dropdown Button + Version \ No newline at end of file From 1b76d669c8fd7dc1c3367ec053d8a2c4d070e0fe Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 3 Jul 2022 00:23:06 +0300 Subject: [PATCH 041/132] refactor: make IconHeader reusable --- .../manager/ui/components/IconHeader.kt | 33 +++++++++++++++++++ .../manager/ui/screens/AboutScreen.kt | 20 ++--------- .../manager/ui/screens/ContributorsScreen.kt | 1 - .../screens/mainsubscreens/MoreSubscreen.kt | 15 ++------- 4 files changed, 37 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt diff --git a/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt b/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt new file mode 100644 index 0000000000..6f66e7cb15 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt @@ -0,0 +1,33 @@ +package app.revanced.manager.ui.components + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Divider +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.unit.dp +import app.revanced.manager.R + +@Composable +fun IconHeader(){ + Box() { + Icon( + painterResource(id = R.drawable.ic_revanced), + contentDescription = "Header Icon", + modifier = Modifier + .fillMaxWidth() + .align(Alignment.TopCenter) + .size(100.dp), + tint = MaterialTheme.colorScheme.primary + ) + } + + Divider(Modifier.alpha(.5f)) +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 0b10130306..9dd27fe7c4 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -2,14 +2,10 @@ package app.revanced.manager.ui.screens import androidx.compose.foundation.layout.* import androidx.compose.material.IconButton -import androidx.compose.material3.Divider -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -18,13 +14,13 @@ import app.revanced.manager.BuildConfig import app.revanced.manager.Global.Companion.socialLinks import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R +import app.revanced.manager.ui.components.IconHeader import app.revanced.manager.ui.components.PreferenceRow import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph private const val tag = "AboutScreen" -@OptIn(ExperimentalMaterial3Api::class) @Destination @RootNavGraph @Composable @@ -32,19 +28,7 @@ fun AboutScreen( // navigator: NavController, ) { Column(Modifier.padding(8.dp)) { - Box() { - Icon( - painterResource(id = R.drawable.ic_revanced), - contentDescription = "Header Icon", - modifier = Modifier - .fillMaxWidth() - .align(Alignment.TopCenter) - .padding(32.dp) - .size(100.dp), - tint = MaterialTheme.colorScheme.primary - ) - } - Divider(Modifier.alpha(.5f)) + IconHeader() var currentUriHandler = LocalUriHandler.current diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index d2c53a21c4..52ec062cac 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -29,7 +29,6 @@ fun ContributorsScreen( // navigator: NavController, vm: ContributorsViewModel = viewModel() ) { - Column( Modifier .padding(8.dp) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt index d5a9d842f0..7bc45100cc 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt @@ -16,6 +16,7 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R +import app.revanced.manager.ui.components.IconHeader import app.revanced.manager.ui.components.PreferenceRow import app.revanced.manager.ui.screens.destinations.AboutScreenDestination import app.revanced.manager.ui.screens.destinations.ContributorsScreenDestination @@ -33,19 +34,7 @@ fun MoreSubscreen( navigator: NavController, ) { Column(Modifier.padding(8.dp)) { - Box() { - Icon( - painterResource(id = R.drawable.ic_revanced), - contentDescription = "Header Icon", - modifier = Modifier - .fillMaxWidth() - .align(Alignment.TopCenter) - .padding(32.dp) - .size(100.dp), - tint = MaterialTheme.colorScheme.primary - ) - } - Divider(Modifier.alpha(.5f)) + IconHeader() var currentUriHandler = LocalUriHandler.current From bd371e140f0f883c0b4533e04b8ba92d975267c2 Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 3 Jul 2022 00:23:49 +0300 Subject: [PATCH 042/132] refactor: title names for Patcher and More pages --- .../java/app/revanced/manager/ui/screens/MainScreen.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index 49ac95c04d..8f72fde85c 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -23,6 +23,16 @@ fun MainScreen() { Scaffold( topBar = { when (navController.appCurrentDestinationAsState().value) { + PatcherSubscreenDestination -> { + AppBar( + title = { Text("Patcher") } + ) + } + MoreSubscreenDestination -> { + AppBar( + title = { Text("More") } + ) + } AppSelectorScreenDestination -> { AppBar( title = { Text("Select an app...") }, From e7457e60dcbb5e8b842fab297bda3a3689661939 Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 3 Jul 2022 03:46:48 +0300 Subject: [PATCH 043/132] fix: set missing IconHeader padding --- .../main/java/app/revanced/manager/ui/components/IconHeader.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt b/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt index 6f66e7cb15..60e68a099f 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt @@ -24,6 +24,7 @@ fun IconHeader(){ modifier = Modifier .fillMaxWidth() .align(Alignment.TopCenter) + .padding(32.dp) .size(100.dp), tint = MaterialTheme.colorScheme.primary ) From 4d938e458d749333738dfb07d4cfd3d2f2c7414c Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sun, 3 Jul 2022 19:41:17 +0530 Subject: [PATCH 044/132] feat: experimental about version pop-up. --- .idea/deploymentTargetDropDown.xml | 17 ---- .../manager/ui/components/AboutDialog.kt | 90 +++++++++++++++++++ .../manager/ui/screens/AboutScreen.kt | 5 ++ 3 files changed, 95 insertions(+), 17 deletions(-) delete mode 100644 .idea/deploymentTargetDropDown.xml create mode 100644 app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml deleted file mode 100644 index 2a86429dd6..0000000000 --- a/.idea/deploymentTargetDropDown.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt b/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt new file mode 100644 index 0000000000..c754e43a21 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt @@ -0,0 +1,90 @@ +@file:OptIn(ExperimentalMaterial3Api::class) + +package app.revanced.manager.ui.components + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.AlertDialog +import androidx.compose.material.Icon +import androidx.compose.material.TextButton +import androidx.compose.material3.Card +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import app.revanced.manager.BuildConfig +import app.revanced.manager.R + +@Composable +fun AboutDialog() { + + var showPopup by remember { mutableStateOf(false) } + + val onPopupDismissed = { showPopup = false } + + Column( + Modifier + .clickable { showPopup = true } + .padding(horizontal = 12.dp) + .height(56.dp) + ) { + Row(verticalAlignment = Alignment.CenterVertically) { + Icon( + painter = painterResource(R.drawable.ic_baseline_info_24), + contentDescription = null, + tint = MaterialTheme.colorScheme.primary, + ) + Card( + modifier = Modifier.padding(horizontal = 28.dp), + border = null, + ) { + Text(text = stringResource(id = R.string.app_version), + style = MaterialTheme.typography.bodyLarge, + ) + Text( + text = BuildConfig.VERSION_TYPE + " " + BuildConfig.VERSION_NAME, + style = MaterialTheme.typography.bodyMedium.copy( + color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.75f), + ), + modifier = Modifier.padding(top = 4.dp), + ) + } + } + } + + if (showPopup) { + AlertDialog( + backgroundColor = MaterialTheme.colorScheme.background, + onDismissRequest = onPopupDismissed, + text = { + Column(Modifier.padding(8.dp)) { + Text(text = "Application Version = " + BuildConfig.VERSION_NAME) + Text(text = "Version Type = " + BuildConfig.VERSION_TYPE) + Text(text = "Build Type = " + BuildConfig.BUILD_TYPE) + } + }, + confirmButton = { + + }, + dismissButton = { + TextButton(onClick = { onPopupDismissed() }) { + Text(text = "Close") + } + }, + title = { + Text( + text = stringResource(R.string.app_version) + ) + }, + )} + +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 9dd27fe7c4..2b269e3b21 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -2,6 +2,7 @@ package app.revanced.manager.ui.screens import androidx.compose.foundation.layout.* import androidx.compose.material.IconButton +import androidx.compose.material.TextButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -16,6 +17,7 @@ import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R import app.revanced.manager.ui.components.IconHeader import app.revanced.manager.ui.components.PreferenceRow +import app.revanced.manager.ui.components.AboutDialog import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph @@ -39,6 +41,9 @@ fun AboutScreen( ), onClick = { /* TODO: COPY DEVICE INFORMATION AND APP INFO */ }, ) + + AboutDialog() + PreferenceRow( title = stringResource(R.string.whats_new), painter = painterResource(id = R.drawable.ic_baseline_new_releases_24 From 41f9f783c14313159b9f018116e0244830a390ae Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sun, 3 Jul 2022 19:54:13 +0530 Subject: [PATCH 045/132] feat: fixed about version pop-up. --- .../app/revanced/manager/ui/components/AboutDialog.kt | 11 ++++------- .../app/revanced/manager/ui/screens/AboutScreen.kt | 8 -------- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt b/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt index c754e43a21..3133322142 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt @@ -3,10 +3,7 @@ package app.revanced.manager.ui.components import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.AlertDialog import androidx.compose.material.Icon @@ -34,7 +31,8 @@ fun AboutDialog() { Column( Modifier .clickable { showPopup = true } - .padding(horizontal = 12.dp) + .padding(16.dp,16.dp,16.dp,0.dp) + .fillMaxWidth() .height(56.dp) ) { Row(verticalAlignment = Alignment.CenterVertically) { @@ -43,9 +41,8 @@ fun AboutDialog() { contentDescription = null, tint = MaterialTheme.colorScheme.primary, ) - Card( + Column( modifier = Modifier.padding(horizontal = 28.dp), - border = null, ) { Text(text = stringResource(id = R.string.app_version), style = MaterialTheme.typography.bodyLarge, diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 2b269e3b21..9dc628ec19 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -34,14 +34,6 @@ fun AboutScreen( var currentUriHandler = LocalUriHandler.current - PreferenceRow( - title = stringResource(R.string.app_version), - subtitle = "${BuildConfig.VERSION_TYPE} ${BuildConfig.VERSION_NAME}", - painter = painterResource(id = R.drawable.ic_baseline_info_24 - ), - onClick = { /* TODO: COPY DEVICE INFORMATION AND APP INFO */ }, - ) - AboutDialog() PreferenceRow( From 618f6558d91818354a6bdc76313ac56e9a834a8e Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 3 Jul 2022 19:07:45 +0300 Subject: [PATCH 046/132] refactor: version popup dialog --- .../manager/ui/components/AboutDialog.kt | 45 ++++--------------- .../revanced/manager/ui/components/AppBar.kt | 4 -- .../manager/ui/components/ExpandableCard.kt | 2 - .../manager/ui/screens/AboutScreen.kt | 7 +-- .../manager/ui/screens/ContributorsScreen.kt | 6 ++- .../manager/ui/screens/SettingsScreen.kt | 13 +++--- .../screens/mainsubscreens/MoreSubscreen.kt | 8 +--- 7 files changed, 24 insertions(+), 61 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt b/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt index 3133322142..c81f447cdd 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt @@ -2,18 +2,14 @@ package app.revanced.manager.ui.components -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding import androidx.compose.material.AlertDialog -import androidx.compose.material.Icon import androidx.compose.material.TextButton -import androidx.compose.material3.Card import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.* -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -27,36 +23,13 @@ fun AboutDialog() { var showPopup by remember { mutableStateOf(false) } val onPopupDismissed = { showPopup = false } - - Column( - Modifier - .clickable { showPopup = true } - .padding(16.dp,16.dp,16.dp,0.dp) - .fillMaxWidth() - .height(56.dp) - ) { - Row(verticalAlignment = Alignment.CenterVertically) { - Icon( - painter = painterResource(R.drawable.ic_baseline_info_24), - contentDescription = null, - tint = MaterialTheme.colorScheme.primary, - ) - Column( - modifier = Modifier.padding(horizontal = 28.dp), - ) { - Text(text = stringResource(id = R.string.app_version), - style = MaterialTheme.typography.bodyLarge, - ) - Text( - text = BuildConfig.VERSION_TYPE + " " + BuildConfig.VERSION_NAME, - style = MaterialTheme.typography.bodyMedium.copy( - color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.75f), - ), - modifier = Modifier.padding(top = 4.dp), - ) - } - } - } + + PreferenceRow( + title = stringResource(R.string.app_version), + subtitle = "${BuildConfig.VERSION_TYPE} ${BuildConfig.VERSION_NAME}", + painter = painterResource(id = R.drawable.ic_baseline_info_24), + onClick = { showPopup = true }, + ) if (showPopup) { AlertDialog( diff --git a/app/src/main/java/app/revanced/manager/ui/components/AppBar.kt b/app/src/main/java/app/revanced/manager/ui/components/AppBar.kt index 8a266167ec..343bfce353 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/AppBar.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/AppBar.kt @@ -1,14 +1,10 @@ package app.revanced.manager.ui.components import androidx.compose.foundation.layout.RowScope -import androidx.compose.material3.IconButton import androidx.compose.material3.SmallTopAppBar import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.tooling.preview.Preview -import app.revanced.manager.R -import app.revanced.manager.ui.components.placeholders.Icon @Composable diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt index 498f0bceb8..54ea7c776a 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt @@ -9,10 +9,8 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items -import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.verticalScroll import androidx.compose.material.ContentAlpha import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowDropDown diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 9dc628ec19..e9f046f799 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -2,7 +2,6 @@ package app.revanced.manager.ui.screens import androidx.compose.foundation.layout.* import androidx.compose.material.IconButton -import androidx.compose.material.TextButton import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -11,13 +10,12 @@ import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import app.revanced.manager.BuildConfig import app.revanced.manager.Global.Companion.socialLinks import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R +import app.revanced.manager.ui.components.AboutDialog import app.revanced.manager.ui.components.IconHeader import app.revanced.manager.ui.components.PreferenceRow -import app.revanced.manager.ui.components.AboutDialog import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph @@ -38,8 +36,7 @@ fun AboutScreen( PreferenceRow( title = stringResource(R.string.whats_new), - painter = painterResource(id = R.drawable.ic_baseline_new_releases_24 - ), + painter = painterResource(id = R.drawable.ic_baseline_new_releases_24), onClick = { currentUriHandler.openUri(websiteUrl) }, ) PreferenceRow( diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index 52ec062cac..a199b17a09 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -1,10 +1,12 @@ package app.revanced.manager.ui.screens import androidx.compose.foundation.layout.* -import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.* +import androidx.compose.material3.Divider +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier diff --git a/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt index ec3968bff1..ae4ea05112 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt @@ -1,22 +1,23 @@ package app.revanced.manager.ui.screens -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.foundation.layout.* -import androidx.compose.material3.* +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Switch +import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import app.revanced.manager.ui.theme.ReVancedManagerTheme import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph private const val tag = "SettingsScreen" -@OptIn(ExperimentalMaterial3Api::class) @Destination @RootNavGraph @Composable diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt index 7bc45100cc..3ccb072bec 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt @@ -1,14 +1,10 @@ package app.revanced.manager.ui.screens.mainsubscreens -import androidx.compose.foundation.layout.* -import androidx.compose.material3.Divider +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource From 3acc385b0d6238b513c1c0491bdf914324f1bb1d Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sun, 3 Jul 2022 22:28:10 +0530 Subject: [PATCH 047/132] feat: Primitive help button. --- .../manager/ui/components/FullScreenDialog.kt | 109 ++++++++++++++++++ .../screens/mainsubscreens/MoreSubscreen.kt | 7 +- 2 files changed, 111 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/components/FullScreenDialog.kt diff --git a/app/src/main/java/app/revanced/manager/ui/components/FullScreenDialog.kt b/app/src/main/java/app/revanced/manager/ui/components/FullScreenDialog.kt new file mode 100644 index 0000000000..2431cf3795 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/components/FullScreenDialog.kt @@ -0,0 +1,109 @@ +package app.revanced.manager.ui.components + +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import app.revanced.manager.R + + + +@Composable +fun FullScreenDialog( +) { + var showPopup by remember { mutableStateOf(false) } + + PreferenceRow( + title = stringResource(id = R.string.help), + onClick = { showPopup = true }, + painter = painterResource(id = R.drawable.ic_baseline_help_24), + ) + + if(showPopup) { + Box( + Modifier.padding(vertical = 32.dp) + ) { + Dialog( + properties = DialogProperties( + dismissOnBackPress = true, + dismissOnClickOutside = true, + ), + onDismissRequest = { + showPopup = false + } + ) { + Surface( + modifier = Modifier.fillMaxSize(), + shape = RoundedCornerShape(16.dp), + color = MaterialTheme.colorScheme.background + ) { + Box( + contentAlignment = Alignment.Center, + modifier = Modifier + .padding(horizontal = 8.dp, vertical = 32.dp) + .verticalScroll( + rememberScrollState() + ) + ) { + Text( + text = + "❓ Frequently asked questions\n" + + "Please make sure to read them before asking questions that have been asked too many times, thanks.\n" + + "I \uD83D\uDD38 What is ReVanced?\n" + + "ReVanced is a modular patcher for apps such as YouTube. This project was born out of Vanced's discontinuation and it is our goal to continue the legacy of what Vanced left.\n" + "\n" + + "II \uD83D\uDD38 How does ReVanced work?\n" + + "ReVanced does not distribute any proprietary file but instead provides open-source patches. Patches can be created for any Android app. The ReVanced Manager will use the patcher as its core to apply patches of your choice on your desired app. On rooted devices, ReVanced can mount the patched app over the original application. On non-rooted devices, ReVanced will install it under a different package name.\n" + "\n" + + "III \uD83D\uDD38 When will ReVanced be released?\n" + + "ReVanced is and will always be in development! Currently, you can build and test it yourself or use prebuild packages by following the documentation. You can also follow our approximate progress in the \uD83D\uDEA7・progress channel instead of an ETA.\n" + "\n" + + "IV \uD83D\uDD38 Does ReVanced support non-root devices?\n" + + "Yes! ReVanced supports non-root and rooted devices.\n" + "\n" + + "V \uD83D\uDD38 Will ReVanced have feature X?\n" + + "ReVanced is an open-source project. At first, we are working on implementing all core features from Vanced. Afterward, we will continue to implement your suggestions. Your contributions are also very welcome.\n" + "\n" + + "VI \uD83D\uDD38 How can I help?\n" + + "Since we are an open-source community and depend on outside help, you can always check out our GitHub repositories and contribute to us by creating an issue or pull request.\n" + "\n" + + "VII \uD83D\uDD38 Will ReVanced always stay up to date with YouTube?\n" + + "Unlike Vanced, our patcher can apply patches to any version of the app. This way, you can use patches on newer or older versions and are independent of us\n" + + "releasing a newer version. (Sometimes patches can break and will need updates. Check the documentation on what versions ReVanced is mainly targeting)\n" + "\n" + + "IX \uD83D\uDD38 Will ReVanced support Music?\n" + + "Yes. Patches have been created for YouTube Music and can be created for any other app. The MicroG patch is being worked on to allow ReVanced to work with YouTube Music.\n" + "\n" + + "X \uD83D\uDD38 Will ReVanced have NFTs?\n" + + "We do not intend to create NFTs. It also was never the reason why Vanced shut down and wouldn't be for us as well.\n" + "\n" + + "XI \uD83D\uDD38 Does Vanced still work?\n" + + "Vanced is currently fully functional and can be downloaded from mirrors.\n" + "\n" + + "XII \uD83D\uDD38 Why is the progress channel not updating?\n" + + "The \uD83D\uDEA7・progress channel is up to date. It might seem like ReVanced is not progressing, but it is under active development. It is also the reason, why no specific ETA can be given due to how fluctuating the current code base is. For every detailed update check \uD83E\uDD91・github.\n" + "\n" + + "XIII \uD83D\uDD38 Will MicroG stay up to date?\n" + + "MicroG and Vanced MicroG are under development by their respective maintainer.\n" + "\n" + + "XIV \uD83D\uDD38 Is ReVanced affiliated with Vanced?\n" + + "ReVanced is not affiliated with Vanced.\n" + "\n" + + "XV \uD83D\uDD38 Can you support me?\n" + + "If you have no idea how to use ReVanced yet, then do not use it yet. ReVanced is currently in development and directed toward developers. If you genuinely have a problem and need help for development purposes, please include the error you get, what caused it and your current environment such as which files and versions you used.\n" + "\n" + "\n" + ) + TextButton( + colors = ButtonDefaults.buttonColors( + containerColor = MaterialTheme.colorScheme.primary + ), + onClick = { showPopup = false }, + modifier = Modifier + .fillMaxWidth() + .align(Alignment.BottomCenter) + .padding(top = 12.dp) + , + ) { + Text(text = "Close Popup") + } + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt index 3ccb072bec..9f3c4c5f9f 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt @@ -12,6 +12,7 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R +import app.revanced.manager.ui.components.FullScreenDialog import app.revanced.manager.ui.components.IconHeader import app.revanced.manager.ui.components.PreferenceRow import app.revanced.manager.ui.screens.destinations.AboutScreenDestination @@ -49,10 +50,6 @@ fun MoreSubscreen( painter = painterResource(id = R.drawable.ic_baseline_info_24), onClick = { navigator.navigate(AboutScreenDestination().route) } ) - PreferenceRow( - title = stringResource(R.string.help), - painter = painterResource(id = R.drawable.ic_baseline_help_24), - onClick = { currentUriHandler.openUri("$websiteUrl/discord") } - ) + FullScreenDialog() } } \ No newline at end of file From ea73cf8c8e5f75b87e4eddb756d97b6d023a21cd Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 3 Jul 2022 20:48:45 +0300 Subject: [PATCH 048/132] feat: added debuginfo --- .../revanced/manager/ui/components/DebugInfo.kt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 app/src/main/java/app/revanced/manager/ui/components/DebugInfo.kt diff --git a/app/src/main/java/app/revanced/manager/ui/components/DebugInfo.kt b/app/src/main/java/app/revanced/manager/ui/components/DebugInfo.kt new file mode 100644 index 0000000000..dae8998285 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/components/DebugInfo.kt @@ -0,0 +1,15 @@ +package app.revanced.manager.ui.components + +import android.os.Build +import app.revanced.manager.BuildConfig + +fun DebugInfo(): String { + return """ + Application version: ${BuildConfig.VERSION_NAME} + Version Type = ${BuildConfig.VERSION_TYPE} ${BuildConfig.BUILD_TYPE} + Android Version: ${Build.VERSION.RELEASE} + SDK: ${Build.VERSION.SDK_INT} + Device Brand: ${Build.BRAND} + Device Model: ${Build.MODEL} + """.trimIndent() +} \ No newline at end of file From 265c2c25ec0e704f8d57a50f02775708dd5ddf69 Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 3 Jul 2022 20:49:09 +0300 Subject: [PATCH 049/132] feat: added copy to about version --- .../manager/ui/components/AboutDialog.kt | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt b/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt index c81f447cdd..396f1ee127 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt @@ -11,8 +11,10 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.dp import app.revanced.manager.BuildConfig import app.revanced.manager.R @@ -24,6 +26,8 @@ fun AboutDialog() { val onPopupDismissed = { showPopup = false } + val localClipboardManager = LocalClipboardManager.current + PreferenceRow( title = stringResource(R.string.app_version), subtitle = "${BuildConfig.VERSION_TYPE} ${BuildConfig.VERSION_NAME}", @@ -32,29 +36,30 @@ fun AboutDialog() { ) if (showPopup) { - AlertDialog( - backgroundColor = MaterialTheme.colorScheme.background, - onDismissRequest = onPopupDismissed, - text = { - Column(Modifier.padding(8.dp)) { - Text(text = "Application Version = " + BuildConfig.VERSION_NAME) - Text(text = "Version Type = " + BuildConfig.VERSION_TYPE) - Text(text = "Build Type = " + BuildConfig.BUILD_TYPE) - } - }, - confirmButton = { - - }, - dismissButton = { - TextButton(onClick = { onPopupDismissed() }) { - Text(text = "Close") - } - }, - title = { - Text( - text = stringResource(R.string.app_version) - ) - }, - )} + AlertDialog( + backgroundColor = MaterialTheme.colorScheme.background, + onDismissRequest = onPopupDismissed, + text = { + Column(Modifier.padding(8.dp)) { + Text(text = DebugInfo()) + } + }, + // TODO: MAKE CLIPBOARD REUSABLE, ADD TOAST MESSAGE *CLEANLY* + confirmButton = { + TextButton(onClick = { localClipboardManager.setText(AnnotatedString(DebugInfo())) }) { + Text(text = "Copy") + } + }, + dismissButton = { + TextButton(onClick = { onPopupDismissed() }) { + Text(text = "Close") + } + }, + title = { + Text( + text = stringResource(R.string.app_version) + ) + }, + )} } \ No newline at end of file From c9ac1a1738acaaba354d8189638731defd96e081 Mon Sep 17 00:00:00 2001 From: Ushie Date: Sun, 3 Jul 2022 21:24:26 +0300 Subject: [PATCH 050/132] feat: copy debug on hold, added label --- .../java/app/revanced/manager/ui/components/AboutDialog.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt b/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt index 396f1ee127..50029c7515 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt @@ -33,6 +33,7 @@ fun AboutDialog() { subtitle = "${BuildConfig.VERSION_TYPE} ${BuildConfig.VERSION_NAME}", painter = painterResource(id = R.drawable.ic_baseline_info_24), onClick = { showPopup = true }, + onLongClick = { localClipboardManager.setText(AnnotatedString("Debug Info:\n" + DebugInfo())) } ) if (showPopup) { @@ -46,7 +47,7 @@ fun AboutDialog() { }, // TODO: MAKE CLIPBOARD REUSABLE, ADD TOAST MESSAGE *CLEANLY* confirmButton = { - TextButton(onClick = { localClipboardManager.setText(AnnotatedString(DebugInfo())) }) { + TextButton(onClick = { localClipboardManager.setText(AnnotatedString("Debug Info:\n" + DebugInfo())) } ) { Text(text = "Copy") } }, From 8c0283347e668bc27726977d6394fb6eb519db01 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Mon, 4 Jul 2022 23:00:15 +0530 Subject: [PATCH 051/132] feat: Moved help button functionality to FAQ button. (Better suited.) --- .../revanced/manager/ui/components/FullScreenDialog.kt | 4 ++-- .../manager/ui/screens/mainsubscreens/MoreSubscreen.kt | 6 ++++++ app/src/main/res/drawable/ic_faq.xml | 8 ++++++++ app/src/main/res/values/strings.xml | 1 + 4 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 app/src/main/res/drawable/ic_faq.xml diff --git a/app/src/main/java/app/revanced/manager/ui/components/FullScreenDialog.kt b/app/src/main/java/app/revanced/manager/ui/components/FullScreenDialog.kt index 2431cf3795..d77682cdad 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/FullScreenDialog.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/FullScreenDialog.kt @@ -23,9 +23,9 @@ fun FullScreenDialog( var showPopup by remember { mutableStateOf(false) } PreferenceRow( - title = stringResource(id = R.string.help), + title = stringResource(id = R.string.faq), onClick = { showPopup = true }, - painter = painterResource(id = R.drawable.ic_baseline_help_24), + painter = painterResource(id = R.drawable.ic_faq), ) if(showPopup) { diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt index 9f3c4c5f9f..d366a11b3e 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt @@ -50,6 +50,12 @@ fun MoreSubscreen( painter = painterResource(id = R.drawable.ic_baseline_info_24), onClick = { navigator.navigate(AboutScreenDestination().route) } ) + PreferenceRow( + title = stringResource(R.string.help), + painter = painterResource(id = R.drawable.ic_baseline_help_24), + onClick = { //TODO: Add a popup for where to ask for help + } + ) FullScreenDialog() } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_faq.xml b/app/src/main/res/drawable/ic_faq.xml new file mode 100644 index 0000000000..96c99e3173 --- /dev/null +++ b/app/src/main/res/drawable/ic_faq.xml @@ -0,0 +1,8 @@ + + + + \ 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 283f9bf8d5..1c0e6d9c5d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -59,4 +59,5 @@ Integrations Contributors Dropdown Button Version + FAQ \ No newline at end of file From 47e76293b37f1624773762f7d6c7b6637719f223 Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 5 Jul 2022 06:35:28 +0300 Subject: [PATCH 052/132] feat: github button in contributors screen --- .../manager/ui/screens/ContributorsScreen.kt | 105 +++--------------- 1 file changed, 18 insertions(+), 87 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index a199b17a09..1e03724f8b 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -3,18 +3,18 @@ package app.revanced.manager.ui.screens import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.Divider -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.Icon -import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel +import app.revanced.manager.Global +import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R import app.revanced.manager.ui.components.ExpandableCard import app.revanced.manager.ui.models.ContributorsViewModel @@ -77,89 +77,20 @@ fun ContributorsScreen( size = 200 ) + var currentUriHandler = LocalUriHandler.current - } + Spacer(Modifier.weight(1f, true)) + Button( + modifier = Modifier.fillMaxWidth(), + onClick = { currentUriHandler.openUri("${websiteUrl}/github") } + ) { + Icon( + painter = painterResource(id = R.drawable.ic_github_24), + contentDescription = "GitHub Link" + ) + Spacer(Modifier.padding(4.dp)) + Text(text = "GitHub") + } } -// LazyColumn( -// Modifier.height(1200.dp), -// contentPadding = PaddingValues(4.dp) -// ) { -// item { -// Box() { -// Icon( -// painterResource(id = R.drawable.ic_revanced), -// contentDescription = "Header Icon", -// modifier = Modifier -// .fillMaxWidth() -// .align(Alignment.TopCenter) -// .padding(32.dp) -// .size(100.dp), -// tint = MaterialTheme.colorScheme.primary -// ) -// } -// } -// item { -// Divider(Modifier.alpha(.5f)) -// } -// item { -// ExpandableCard( -// stringResource(R.string.cli_contributors), -// data = vm.cliContributorsList, -// size = 100 -// ) -// -// } -// item { -// ExpandableCard( -// stringResource(R.string.cli_contributors), -// data = vm.cliContributorsList, -// size = 100 -// ) -// } -// item { -// ExpandableCard( -// stringResource(R.string.cli_contributors), -// data = vm.cliContributorsList, -// size = 100 -// ) -// } -// item { -// ExpandableCard( -// stringResource(R.string.cli_contributors), -// data = vm.cliContributorsList, -// size = 100 -// ) -// } -// item { -// ExpandableCard( -// stringResource(R.string.cli_contributors), -// data = vm.cliContributorsList, -// size = 100 -// ) -// } -// item { -// ExpandableCard( -// stringResource(R.string.cli_contributors), -// data = vm.cliContributorsList, -// size = 100 -// ) -// } -// item { -// ExpandableCard( -// stringResource(R.string.cli_contributors), -// data = vm.cliContributorsList, -// size = 100 -// ) -// } -// item { -// ExpandableCard( -// stringResource(R.string.cli_contributors), -// data = vm.cliContributorsList, -// size = 100 -// ) -// } -// -// } -// } - +} \ No newline at end of file From d5a3e4430413b0144dc512f62a895b0118a1341f Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 5 Jul 2022 06:37:06 +0300 Subject: [PATCH 053/132] feat: dialog for help button --- .../manager/ui/components/HelpDialog().kt | 62 +++++++++++++++++++ .../screens/mainsubscreens/MoreSubscreen.kt | 11 ++-- 2 files changed, 67 insertions(+), 6 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/components/HelpDialog().kt diff --git a/app/src/main/java/app/revanced/manager/ui/components/HelpDialog().kt b/app/src/main/java/app/revanced/manager/ui/components/HelpDialog().kt new file mode 100644 index 0000000000..cdcfd941ca --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/components/HelpDialog().kt @@ -0,0 +1,62 @@ +package app.revanced.manager.ui.components + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material.AlertDialog +import androidx.compose.material.TextButton +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.unit.dp +import app.revanced.manager.BuildConfig +import app.revanced.manager.R + +@Composable +fun HelpDialog() { + + var showPopup by remember { mutableStateOf(false) } + + val onPopupDismissed = { showPopup = false } + + var currentUriHandler = LocalUriHandler.current + + PreferenceRow( + title = stringResource(R.string.help), + painter = painterResource(id = R.drawable.ic_baseline_help_24), + onClick = { showPopup = true }, + ) + + if (showPopup) { + AlertDialog( + backgroundColor = MaterialTheme.colorScheme.background, + onDismissRequest = onPopupDismissed, + text = { + Column(Modifier.padding(8.dp)) { + Text(text = "In need of some help?\nJoin our Discord Server and ask in our dedicated support channel!") + } + }, + confirmButton = { + TextButton(onClick = { currentUriHandler.openUri("https://discord.gg/mxsFc6nyqp") }) { + Text(text = "Open Discord") + } + }, + dismissButton = { + TextButton(onClick = { onPopupDismissed() }) { + Text(text = "Close") + } + }, + title = { + Text( + text = stringResource(R.string.help) + ) + }, + )} + +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt index d366a11b3e..8b22ee2054 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt @@ -13,6 +13,7 @@ import androidx.navigation.NavController import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R import app.revanced.manager.ui.components.FullScreenDialog +import app.revanced.manager.ui.components.HelpDialog import app.revanced.manager.ui.components.IconHeader import app.revanced.manager.ui.components.PreferenceRow import app.revanced.manager.ui.screens.destinations.AboutScreenDestination @@ -50,12 +51,10 @@ fun MoreSubscreen( painter = painterResource(id = R.drawable.ic_baseline_info_24), onClick = { navigator.navigate(AboutScreenDestination().route) } ) - PreferenceRow( - title = stringResource(R.string.help), - painter = painterResource(id = R.drawable.ic_baseline_help_24), - onClick = { //TODO: Add a popup for where to ask for help - } - ) + + // TODO MAKE THESE DIALOGS REUSABLE + HelpDialog() + FullScreenDialog() } } \ No newline at end of file From b0969498507376562fa56e113665288865acd74e Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 5 Jul 2022 06:46:10 +0300 Subject: [PATCH 054/132] refactor: merge dialog files --- .../manager/ui/components/AboutDialog.kt | 66 ----------- .../{FullScreenDialog.kt => Dialogs.kt} | 103 +++++++++++++++++- .../manager/ui/components/HelpDialog().kt | 62 ----------- .../screens/mainsubscreens/MoreSubscreen.kt | 7 +- 4 files changed, 102 insertions(+), 136 deletions(-) delete mode 100644 app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt rename app/src/main/java/app/revanced/manager/ui/components/{FullScreenDialog.kt => Dialogs.kt} (68%) delete mode 100644 app/src/main/java/app/revanced/manager/ui/components/HelpDialog().kt diff --git a/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt b/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt deleted file mode 100644 index 50029c7515..0000000000 --- a/app/src/main/java/app/revanced/manager/ui/components/AboutDialog.kt +++ /dev/null @@ -1,66 +0,0 @@ -@file:OptIn(ExperimentalMaterial3Api::class) - -package app.revanced.manager.ui.components - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.material.AlertDialog -import androidx.compose.material.TextButton -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.* -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalClipboardManager -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.unit.dp -import app.revanced.manager.BuildConfig -import app.revanced.manager.R - -@Composable -fun AboutDialog() { - - var showPopup by remember { mutableStateOf(false) } - - val onPopupDismissed = { showPopup = false } - - val localClipboardManager = LocalClipboardManager.current - - PreferenceRow( - title = stringResource(R.string.app_version), - subtitle = "${BuildConfig.VERSION_TYPE} ${BuildConfig.VERSION_NAME}", - painter = painterResource(id = R.drawable.ic_baseline_info_24), - onClick = { showPopup = true }, - onLongClick = { localClipboardManager.setText(AnnotatedString("Debug Info:\n" + DebugInfo())) } - ) - - if (showPopup) { - AlertDialog( - backgroundColor = MaterialTheme.colorScheme.background, - onDismissRequest = onPopupDismissed, - text = { - Column(Modifier.padding(8.dp)) { - Text(text = DebugInfo()) - } - }, - // TODO: MAKE CLIPBOARD REUSABLE, ADD TOAST MESSAGE *CLEANLY* - confirmButton = { - TextButton(onClick = { localClipboardManager.setText(AnnotatedString("Debug Info:\n" + DebugInfo())) } ) { - Text(text = "Copy") - } - }, - dismissButton = { - TextButton(onClick = { onPopupDismissed() }) { - Text(text = "Close") - } - }, - title = { - Text( - text = stringResource(R.string.app_version) - ) - }, - )} - -} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/components/FullScreenDialog.kt b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt similarity index 68% rename from app/src/main/java/app/revanced/manager/ui/components/FullScreenDialog.kt rename to app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt index d77682cdad..72e7d01066 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/FullScreenDialog.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt @@ -4,21 +4,118 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.* +import androidx.compose.material.AlertDialog +import androidx.compose.material.TextButton +import androidx.compose.material3.ButtonDefaults +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties +import app.revanced.manager.BuildConfig import app.revanced.manager.R +@Composable +fun AboutDialog() { + + var showPopup by remember { mutableStateOf(false) } + + val onPopupDismissed = { showPopup = false } + + val localClipboardManager = LocalClipboardManager.current + + PreferenceRow( + title = stringResource(R.string.app_version), + subtitle = "${BuildConfig.VERSION_TYPE} ${BuildConfig.VERSION_NAME}", + painter = painterResource(id = R.drawable.ic_baseline_info_24), + onClick = { showPopup = true }, + onLongClick = { localClipboardManager.setText(AnnotatedString("Debug Info:\n" + DebugInfo())) } + ) + + if (showPopup) { + AlertDialog( + backgroundColor = MaterialTheme.colorScheme.background, + onDismissRequest = onPopupDismissed, + text = { + Column(Modifier.padding(8.dp)) { + Text(text = DebugInfo()) + } + }, + // TODO: MAKE CLIPBOARD REUSABLE, ADD TOAST MESSAGE *CLEANLY* + confirmButton = { + TextButton(onClick = { localClipboardManager.setText(AnnotatedString("Debug Info:\n" + DebugInfo())) } ) { + Text(text = "Copy") + } + }, + dismissButton = { + TextButton(onClick = { onPopupDismissed() }) { + Text(text = "Close") + } + }, + title = { + Text( + text = stringResource(R.string.app_version) + ) + }, + )} + +} + +@Composable +fun HelpDialog() { + + var showPopup by remember { mutableStateOf(false) } + + val onPopupDismissed = { showPopup = false } + + var currentUriHandler = LocalUriHandler.current + + PreferenceRow( + title = stringResource(R.string.help), + painter = painterResource(id = R.drawable.ic_baseline_help_24), + onClick = { showPopup = true }, + ) + + if (showPopup) { + AlertDialog( + backgroundColor = MaterialTheme.colorScheme.background, + onDismissRequest = onPopupDismissed, + text = { + Column(Modifier.padding(8.dp)) { + Text(text = "In need of some help?\nJoin our Discord Server and ask in our dedicated support channel!") + } + }, + confirmButton = { + TextButton(onClick = { currentUriHandler.openUri("https://discord.gg/mxsFc6nyqp") }) { + Text(text = "Open Discord") + } + }, + dismissButton = { + TextButton(onClick = { onPopupDismissed() }) { + Text(text = "Close") + } + }, + title = { + Text( + text = stringResource(R.string.help) + ) + }, + )} + +} @Composable -fun FullScreenDialog( +fun FAQDialog( ) { var showPopup by remember { mutableStateOf(false) } @@ -88,7 +185,7 @@ fun FullScreenDialog( "XV \uD83D\uDD38 Can you support me?\n" + "If you have no idea how to use ReVanced yet, then do not use it yet. ReVanced is currently in development and directed toward developers. If you genuinely have a problem and need help for development purposes, please include the error you get, what caused it and your current environment such as which files and versions you used.\n" + "\n" + "\n" ) - TextButton( + androidx.compose.material3.TextButton( colors = ButtonDefaults.buttonColors( containerColor = MaterialTheme.colorScheme.primary ), diff --git a/app/src/main/java/app/revanced/manager/ui/components/HelpDialog().kt b/app/src/main/java/app/revanced/manager/ui/components/HelpDialog().kt deleted file mode 100644 index cdcfd941ca..0000000000 --- a/app/src/main/java/app/revanced/manager/ui/components/HelpDialog().kt +++ /dev/null @@ -1,62 +0,0 @@ -package app.revanced.manager.ui.components - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.padding -import androidx.compose.material.AlertDialog -import androidx.compose.material.TextButton -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.runtime.* -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalClipboardManager -import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.AnnotatedString -import androidx.compose.ui.unit.dp -import app.revanced.manager.BuildConfig -import app.revanced.manager.R - -@Composable -fun HelpDialog() { - - var showPopup by remember { mutableStateOf(false) } - - val onPopupDismissed = { showPopup = false } - - var currentUriHandler = LocalUriHandler.current - - PreferenceRow( - title = stringResource(R.string.help), - painter = painterResource(id = R.drawable.ic_baseline_help_24), - onClick = { showPopup = true }, - ) - - if (showPopup) { - AlertDialog( - backgroundColor = MaterialTheme.colorScheme.background, - onDismissRequest = onPopupDismissed, - text = { - Column(Modifier.padding(8.dp)) { - Text(text = "In need of some help?\nJoin our Discord Server and ask in our dedicated support channel!") - } - }, - confirmButton = { - TextButton(onClick = { currentUriHandler.openUri("https://discord.gg/mxsFc6nyqp") }) { - Text(text = "Open Discord") - } - }, - dismissButton = { - TextButton(onClick = { onPopupDismissed() }) { - Text(text = "Close") - } - }, - title = { - Text( - text = stringResource(R.string.help) - ) - }, - )} - -} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt index 8b22ee2054..a287fbe8e6 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt @@ -12,10 +12,7 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R -import app.revanced.manager.ui.components.FullScreenDialog -import app.revanced.manager.ui.components.HelpDialog -import app.revanced.manager.ui.components.IconHeader -import app.revanced.manager.ui.components.PreferenceRow +import app.revanced.manager.ui.components.* import app.revanced.manager.ui.screens.destinations.AboutScreenDestination import app.revanced.manager.ui.screens.destinations.ContributorsScreenDestination import app.revanced.manager.ui.screens.destinations.SettingsScreenDestination @@ -55,6 +52,6 @@ fun MoreSubscreen( // TODO MAKE THESE DIALOGS REUSABLE HelpDialog() - FullScreenDialog() + FAQDialog() } } \ No newline at end of file From 3021e293c45d1adc8b3efbbdb9db4f437c23e439 Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 5 Jul 2022 07:00:48 +0300 Subject: [PATCH 055/132] feat: changed IconHeader to match app icon --- .../manager/ui/components/IconHeader.kt | 2 +- app/src/main/res/drawable/ic_manager.xml | 33 +++++++++++++++++++ app/src/main/res/drawable/ic_revanced.xml | 20 ----------- 3 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 app/src/main/res/drawable/ic_manager.xml delete mode 100644 app/src/main/res/drawable/ic_revanced.xml diff --git a/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt b/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt index 60e68a099f..f139bf43d5 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt @@ -19,7 +19,7 @@ import app.revanced.manager.R fun IconHeader(){ Box() { Icon( - painterResource(id = R.drawable.ic_revanced), + painterResource(id = R.drawable.ic_manager), contentDescription = "Header Icon", modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/res/drawable/ic_manager.xml b/app/src/main/res/drawable/ic_manager.xml new file mode 100644 index 0000000000..17e031d96f --- /dev/null +++ b/app/src/main/res/drawable/ic_manager.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/ic_revanced.xml b/app/src/main/res/drawable/ic_revanced.xml deleted file mode 100644 index a561a76189..0000000000 --- a/app/src/main/res/drawable/ic_revanced.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - From 4e265aa35fba66bd63c7090dd4419a92f5bcf081 Mon Sep 17 00:00:00 2001 From: Ushie <79272171+Ushie@users.noreply.github.com> Date: Tue, 5 Jul 2022 07:16:22 +0300 Subject: [PATCH 056/132] fix: contributor screen uses IconHeader now --- .../manager/ui/screens/ContributorsScreen.kt | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index 1e03724f8b..f7dca88a65 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -37,19 +37,7 @@ fun ContributorsScreen( .height(1400.dp) .verticalScroll(rememberScrollState()) ) { - Box() { - Icon( - painterResource(id = R.drawable.ic_revanced), - contentDescription = "Header Icon", - modifier = Modifier - .fillMaxWidth() - .align(Alignment.TopCenter) - .padding(32.dp) - .size(100.dp), - tint = MaterialTheme.colorScheme.primary - ) - } - Divider(Modifier.alpha(.5f)) + IconHeader() ExpandableCard( stringResource(R.string.cli_contributors), @@ -93,4 +81,4 @@ fun ContributorsScreen( Text(text = "GitHub") } } -} \ No newline at end of file +} From e1ec65dcc050c5427576425c0b9be92ce4d6e720 Mon Sep 17 00:00:00 2001 From: Ushie <79272171+Ushie@users.noreply.github.com> Date: Tue, 5 Jul 2022 07:22:48 +0300 Subject: [PATCH 057/132] fix: import lol (doing on gh web guh) --- .../java/app/revanced/manager/ui/screens/ContributorsScreen.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index f7dca88a65..3bb934dfdc 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -17,6 +17,7 @@ import app.revanced.manager.Global import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R import app.revanced.manager.ui.components.ExpandableCard +import app.revanced.manager.ui.components.IconHeader import app.revanced.manager.ui.models.ContributorsViewModel import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph From 8701905dc0e0ddfe52bc182fb0490ed8e0109a3a Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Tue, 5 Jul 2022 18:06:59 +0530 Subject: [PATCH 058/132] fix: reverted back to actual placeholder logo. --- .../manager/ui/components/IconHeader.kt | 2 +- app/src/main/res/drawable/ic_revanced.xml | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 app/src/main/res/drawable/ic_revanced.xml diff --git a/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt b/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt index f139bf43d5..60e68a099f 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt @@ -19,7 +19,7 @@ import app.revanced.manager.R fun IconHeader(){ Box() { Icon( - painterResource(id = R.drawable.ic_manager), + painterResource(id = R.drawable.ic_revanced), contentDescription = "Header Icon", modifier = Modifier .fillMaxWidth() diff --git a/app/src/main/res/drawable/ic_revanced.xml b/app/src/main/res/drawable/ic_revanced.xml new file mode 100644 index 0000000000..a561a76189 --- /dev/null +++ b/app/src/main/res/drawable/ic_revanced.xml @@ -0,0 +1,20 @@ + + + + From c40e98fe749a08ded98c6bede49cfc631d8f8bbd Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Tue, 5 Jul 2022 19:36:44 +0530 Subject: [PATCH 059/132] feat: replace ExpandableCards with ContributorsCard. --- .../manager/ui/components/ContributorsCard.kt | 72 +++++++++++ .../manager/ui/components/ExpandableCard.kt | 118 ------------------ .../manager/ui/screens/ContributorsScreen.kt | 36 +++--- 3 files changed, 89 insertions(+), 137 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt delete mode 100644 app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt diff --git a/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt new file mode 100644 index 0000000000..aeb0c04a0b --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt @@ -0,0 +1,72 @@ +package app.revanced.manager.ui.components + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.snapshots.SnapshotStateList +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import app.revanced.manager.R +import app.revanced.manager.backend.api.GitHubAPI +import coil.compose.AsyncImage + + +private const val tag = "Expandable Card" + +@Composable +@ExperimentalMaterial3Api +fun ContributorsCard( + title: String, + size: Int, + data: SnapshotStateList, +) { + Column( + Modifier.padding(horizontal = 8.dp, vertical = 8.dp).fillMaxWidth() + ) { + Text( + text = title, + modifier = Modifier.fillMaxWidth().align(Alignment.CenterHorizontally).padding(8.dp), + fontSize = MaterialTheme.typography.titleLarge.fontSize, + fontWeight = FontWeight.Bold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + style = MaterialTheme.typography.titleLarge + ) + + if (data.isNotEmpty()) { + val currentUriHandler = LocalUriHandler.current + + LazyVerticalGrid( + columns = GridCells.Adaptive(48.dp), + verticalArrangement = Arrangement.spacedBy(4.dp), + horizontalArrangement = Arrangement.spacedBy(4.dp), + modifier = Modifier.height(size.dp), + ) { + items(data) { contributor -> + AsyncImage( + model = contributor.avatar_url, + contentDescription = stringResource(id = R.string.contributor_image), + Modifier + .padding(4.dp) + .size(40.dp) + .clip(CircleShape) + .clickable { + currentUriHandler.openUri(contributor.url) + } + ) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt deleted file mode 100644 index 54ea7c776a..0000000000 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandableCard.kt +++ /dev/null @@ -1,118 +0,0 @@ -package app.revanced.manager.ui.components - -import androidx.compose.animation.animateContentSize -import androidx.compose.animation.core.LinearOutSlowInEasing -import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.animation.core.tween -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.lazy.grid.GridCells -import androidx.compose.foundation.lazy.grid.LazyVerticalGrid -import androidx.compose.foundation.lazy.grid.items -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.ContentAlpha -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ArrowDropDown -import androidx.compose.material3.* -import androidx.compose.runtime.* -import androidx.compose.runtime.snapshots.SnapshotStateList -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha -import androidx.compose.ui.draw.clip -import androidx.compose.ui.draw.rotate -import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import app.revanced.manager.R -import app.revanced.manager.backend.api.GitHubAPI -import coil.compose.AsyncImage - - -private const val tag = "Expandable Card" - - -@Composable -@ExperimentalMaterial3Api -fun ExpandableCard( - title: String, - size: Int, - data: SnapshotStateList, -) { - var expandedState by remember { mutableStateOf(false) } - val rotateState by animateFloatAsState(targetValue = if (expandedState) 180f else 0f) - - Card( - modifier = Modifier - .fillMaxWidth() - .padding(8.dp) - .animateContentSize( - animationSpec = tween( - durationMillis = 300, - easing = LinearOutSlowInEasing - ) - ), - shape = RoundedCornerShape(8.dp), - ) { - Column( - modifier = Modifier - .fillMaxWidth() - .padding(12.dp) - ) { - Row(verticalAlignment = Alignment.CenterVertically) { - Text( - text = "$title", - modifier = Modifier.weight(6f), - fontSize = MaterialTheme.typography.bodyLarge.fontSize, - fontWeight = FontWeight.Bold, - maxLines = 1, - overflow = TextOverflow.Ellipsis - ) - IconButton( - modifier = Modifier - .alpha(ContentAlpha.medium) - .weight(1f) - .rotate(rotateState), - onClick = { - expandedState = !expandedState - }) { - Icon( - imageVector = Icons.Default.ArrowDropDown, - contentDescription = stringResource(R.string.dropdown_button) - ) - } - } - if (expandedState) { - if(data.isNotEmpty()) { - var currentUriHandler = LocalUriHandler.current - - LazyVerticalGrid( - columns = GridCells.Adaptive(48.dp), - verticalArrangement = Arrangement.spacedBy(4.dp), - horizontalArrangement = Arrangement.spacedBy(4.dp), - modifier = Modifier.height(size.dp), - ) { - items(data) { - contributor -> AsyncImage( - model = contributor.avatar_url, - contentDescription = stringResource(id = R.string.contributor_image), - Modifier - .size(40.dp) - .clip(CircleShape) - .clickable { - currentUriHandler.openUri(contributor.url) - } - ) - } - } - - } else { - CircularProgressIndicator() - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index 3bb934dfdc..238d8802c3 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -5,18 +5,16 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.* import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel -import app.revanced.manager.Global import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R -import app.revanced.manager.ui.components.ExpandableCard +import app.revanced.manager.ui.components.ContributorsCard import app.revanced.manager.ui.components.IconHeader import app.revanced.manager.ui.models.ContributorsViewModel import com.ramcosta.composedestinations.annotation.Destination @@ -40,33 +38,33 @@ fun ContributorsScreen( ) { IconHeader() - ExpandableCard( - stringResource(R.string.cli_contributors), - data = vm.cliContributorsList, - size = 100 - ) - ExpandableCard( + ContributorsCard( + stringResource(R.string.cli_contributors), + data = vm.cliContributorsList, + size = 100 + ) + ContributorsCard( stringResource(R.string.patcher_contributors), data = vm.patcherContributorsList, size = 100 - ) - ExpandableCard( + ) + ContributorsCard( stringResource(R.string.patches_contributors), data = vm.patchesContributorsList, size = 150 - ) - ExpandableCard( + ) + ContributorsCard( stringResource(R.string.manager_contributors), data = vm.managerContributorsList, size = 100 - ) - ExpandableCard( + ) + ContributorsCard( stringResource(R.string.integrations_contributors), data = vm.integrationsContributorsList, size = 200 - ) + ) - var currentUriHandler = LocalUriHandler.current + val currentUriHandler = LocalUriHandler.current Spacer(Modifier.weight(1f, true)) @@ -79,7 +77,7 @@ fun ContributorsScreen( contentDescription = "GitHub Link" ) Spacer(Modifier.padding(4.dp)) - Text(text = "GitHub") + Text(text = "GitHub", color = Color.White) } } } From 612ac9c895d9d38a22a4e88b5cda98b32ef8e4ba Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 5 Jul 2022 17:37:11 +0300 Subject: [PATCH 060/132] fix: reverse button color --- .../java/app/revanced/manager/ui/screens/ContributorsScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index 238d8802c3..7f461783d4 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -77,7 +77,7 @@ fun ContributorsScreen( contentDescription = "GitHub Link" ) Spacer(Modifier.padding(4.dp)) - Text(text = "GitHub", color = Color.White) + Text(text = "GitHub") } } } From 13ec6d0c2d18d8b8bc9b8454852700bdd6925c66 Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 5 Jul 2022 18:03:29 +0300 Subject: [PATCH 061/132] refactor: remove contributors from more screen --- .../app/revanced/manager/ui/screens/AppSelectorScreen.kt | 2 +- .../manager/ui/screens/mainsubscreens/MoreSubscreen.kt | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt index bc287e53dd..49e847e182 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt @@ -34,7 +34,7 @@ private const val tag = "AppSelector" @RootNavGraph @Composable fun AppSelectorScreen( - navigator: NavController, // TODO: add back button + navigator: NavController, vm: AppSelectorViewModel = viewModel(), pvm: PatcherViewModel = viewModel(LocalContext.current as ComponentActivity) ) { diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt index a287fbe8e6..2f1396f880 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt @@ -38,11 +38,6 @@ fun MoreSubscreen( painter = painterResource(id = R.drawable.ic_baseline_settings_24), onClick = { navigator.navigate(SettingsScreenDestination().route) } ) - PreferenceRow( - title = stringResource(R.string.screen_contributors_title), - painter = painterResource(id = R.drawable.ic_baseline_favorite_24 ), - onClick = { navigator.navigate(ContributorsScreenDestination().route) } - ) PreferenceRow( title = stringResource(R.string.screen_about_title), painter = painterResource(id = R.drawable.ic_baseline_info_24), From 33a2f665e0363be29a33c4dafaa19fd98a74b90c Mon Sep 17 00:00:00 2001 From: Ushie Date: Wed, 6 Jul 2022 17:00:01 +0300 Subject: [PATCH 062/132] fix: manifest error --- app/src/main/AndroidManifest.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4af3628031..4fba1c451d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,7 +2,8 @@ - + From e9f4d6328aaa509296627c9c2b080cd84e6841f0 Mon Sep 17 00:00:00 2001 From: danthe1st Date: Wed, 6 Jul 2022 17:14:49 +0200 Subject: [PATCH 063/132] feat: move patching to foreground service --- app/src/main/AndroidManifest.xml | 3 + .../PatcherForegroundService.kt | 192 ++++++++++++++++++ .../mainsubscreens/PatcherSubscreen.kt | 116 +---------- app/src/main/res/values/strings.xml | 2 + 4 files changed, 208 insertions(+), 105 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherForegroundService.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4af3628031..2e3b018fdd 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -9,6 +9,7 @@ + @@ -45,6 +46,8 @@ android:name=".MainActivity" android:exported="false" android:theme="@style/Theme.ReVancedManager" /> + + \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherForegroundService.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherForegroundService.kt new file mode 100644 index 0000000000..7290dc8570 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherForegroundService.kt @@ -0,0 +1,192 @@ +package app.revanced.manager.ui.screens.mainsubscreens + +import android.app.* +import android.content.Intent +import android.os.IBinder +import android.util.Log +import androidx.compose.runtime.mutableStateListOf +import androidx.compose.runtime.mutableStateOf +import androidx.core.content.ContextCompat +import androidx.lifecycle.viewModelScope +import app.revanced.manager.R +import app.revanced.manager.backend.api.ManagerAPI +import app.revanced.manager.backend.utils.Aapt +import app.revanced.manager.backend.utils.aligning.ZipAligner +import app.revanced.manager.backend.utils.filesystem.ZipFileSystemUtils +import app.revanced.manager.backend.utils.signing.Signer +import app.revanced.manager.ui.Resource +import app.revanced.patcher.Patcher +import app.revanced.patcher.PatcherOptions +import app.revanced.patcher.data.Data +import app.revanced.patcher.extensions.PatchExtensions.patchName +import app.revanced.patcher.patch.Patch +import app.revanced.patcher.util.patch.implementation.DexPatchBundle +import dalvik.system.DexClassLoader +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking +import java.io.File +import java.lang.IllegalArgumentException + +class PatcherForegroundService : Service() { + + val patches = mutableStateOf>>>>(Resource.Loading) + val tag = "Patcher" + + override fun onCreate() { + super.onCreate() + val notificationIntent = Intent(this, PatcherForegroundService::class.java) + val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE) + val channel = + NotificationChannel("revanced-patcher-patching", + "Patching", + NotificationManager.IMPORTANCE_LOW) + val notificationManager = + ContextCompat.getSystemService(this, NotificationManager::class.java) + notificationManager!!.createNotificationChannel(channel) + val notification: Notification = Notification.Builder(this, channel.id) + .setContentTitle(getText(R.string.patcher_notification_title)) + .setContentText(getText(R.string.patcher_notification_message)) + //.setSmallIcon(R.drawable.icon) + .setContentIntent(pendingIntent) + .build() + + startForeground(1, notification) + } + + override fun onBind(intent: Intent?): IBinder? { + return null + } + + override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { + try { + val selectedPatches = intent.getStringArrayExtra("selectedPatches") + ?: throw IllegalArgumentException("selectedPatches is missing") + val patchBundleFile = intent.getStringExtra("patchBundleFile") + ?: throw IllegalArgumentException("patchBundleFile is missing") + runPatcher(selectedPatches.toList(), patchBundleFile) + }finally { + stopSelf() + } + return START_NOT_STICKY + } + + private fun runPatcher(selectedPatches: List, patchBundleFile: String): Boolean { + + val aaptPath = Aapt.binary(this).absolutePath + val frameworkPath = filesDir.resolve("framework").also { it.mkdirs() }.absolutePath + val integrationsCacheDir = filesDir.resolve("integrations-cache").also { it.mkdirs() } + + runBlocking { + loadPatches(patchBundleFile) + Log.d(tag, "Checking prerequisites") + val patches = findPatchesByIds(selectedPatches) + if (patches.isEmpty()) return@runBlocking true + val integrations = downloadIntegrations(integrationsCacheDir) + + Log.d(tag, "Creating directories") + val workdir = createWorkDir() + val inputFile = File(workdir.parentFile!!, "base.apk") + val patchedFile = File(workdir, "patched.apk") + val alignedFile = File(workdir, "aligned.apk") + val outputFile = File(workdir, "out.apk") + val cacheDirectory = workdir.resolve("cache") + + try { + // Log.d(tag, "Copying base.apk from ${info.packageName}") + // withContext(Dispatchers.IO) { + // Files.copy( + // File(info.publicSourceDir).toPath(), + // inputFile.toPath(), + // StandardCopyOption.REPLACE_EXISTING + // ) + // } + + Log.d(tag, "Creating patcher") + val patcher = Patcher( + PatcherOptions( + inputFile, + cacheDirectory.absolutePath, + patchResources = true, + aaptPath = aaptPath, + frameworkFolderLocation = frameworkPath + ) + ) + + Log.d(tag, "Merging integrations") + patcher.addFiles(listOf(integrations)) {} + + Log.d(tag, "Adding ${patches.size} patch(es)") + patcher.addPatches(patches) + + Log.d(tag, "Applying patches") + patcher.applyPatches().forEach { (patch, result) -> + if (result.isSuccess) { + Log.i(tag, "[success] $patch") + return@forEach + } + Log.e(tag, "[error] $patch:", result.exceptionOrNull()!!) + } + + Log.d(tag, "Saving file") + val result = patcher.save() + ZipFileSystemUtils(result.resourceFile!!, patchedFile).use { fs -> + result.dexFiles.forEach { fs.write(it.name, it.dexFileInputStream.readBytes()) } + fs.writeInput() + fs.uncompress(*result.doNotCompress!!.toTypedArray()) + } + + Log.d(tag, "Aligning apk") + ZipAligner.align(patchedFile, alignedFile) + Log.d(tag, "Signing apk") + Signer("ReVanced", "s3cur3p@ssw0rd").signApk(alignedFile, outputFile) + + // TODO: install apk! + Log.d(tag, "Installing apk") + } catch (e: Exception) { + Log.e(tag, "Error while patching", e) + } + + Log.d(tag, "Deleting workdir") + //workdir.deleteRecursively() + } + return false + } + + private fun createWorkDir(): File { + return filesDir.resolve("tmp-${System.currentTimeMillis()}").also { it.mkdirs() } + } + + private fun findPatchesByIds(ids: Iterable): List>> { + val (patches) = patches.value as? Resource.Success ?: return listOf() + return patches.filter { patch -> ids.any { it == patch.patchName } } + } + + private suspend fun downloadIntegrations(workdir: File): File { + return try { + val (_, out) = ManagerAPI.downloadIntegrations(workdir) + out + } catch (e: Exception) { + throw Exception("Failed to download integrations", e) + } + } + + private fun loadPatches(patchBundleFile: String) { + try { + loadPatches0(patchBundleFile) + } catch (e: Exception) { + Log.e(tag, "An error occurred while loading patches", e) + } + } + + private fun loadPatches0(path: String) { + val patchClasses = DexPatchBundle( + path, DexClassLoader( + path, + codeCacheDir.absolutePath, + null, + javaClass.classLoader + ) + ).loadPatches() + patches.value = Resource.Success(patchClasses) + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt index fd750cf4af..92349f104c 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt @@ -1,6 +1,7 @@ package app.revanced.manager.ui.screens.mainsubscreens import android.app.Application +import android.content.Intent import android.content.pm.PackageManager import android.util.Log import androidx.activity.ComponentActivity @@ -24,19 +25,12 @@ import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import app.revanced.manager.R import app.revanced.manager.backend.api.ManagerAPI -import app.revanced.manager.backend.utils.Aapt -import app.revanced.manager.backend.utils.aligning.ZipAligner -import app.revanced.manager.backend.utils.filesystem.ZipFileSystemUtils -import app.revanced.manager.backend.utils.signing.Signer import app.revanced.manager.ui.Resource import app.revanced.manager.ui.components.FloatingActionButton import app.revanced.manager.ui.screens.destinations.AppSelectorScreenDestination import app.revanced.manager.ui.screens.destinations.PatchesSelectorScreenDestination -import app.revanced.patcher.Patcher -import app.revanced.patcher.PatcherOptions import app.revanced.patcher.data.Data import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages -import app.revanced.patcher.extensions.PatchExtensions.patchName import app.revanced.patcher.patch.Patch import app.revanced.patcher.util.patch.implementation.DexPatchBundle import com.ramcosta.composedestinations.annotation.Destination @@ -46,6 +40,7 @@ import kotlinx.coroutines.launch import java.io.File import java.util.* + private const val tag = "PatcherScreen" @OptIn(ExperimentalMaterial3Api::class) @@ -54,7 +49,7 @@ private const val tag = "PatcherScreen" @Composable fun PatcherSubscreen( navigator: NavController, - vm: PatcherViewModel = viewModel(LocalContext.current as ComponentActivity) + vm: PatcherViewModel = viewModel(LocalContext.current as ComponentActivity), ) { val selectedAppPackage by vm.selectedAppPackage val hasAppSelected = selectedAppPackage.isPresent @@ -127,18 +122,16 @@ fun PatcherSubscreen( data class PatchClass( val patch: Class>, - val unsupported: Boolean + val unsupported: Boolean, ) class PatcherViewModel(val app: Application) : AndroidViewModel(app) { - private val aaptPath = Aapt.binary(app).absolutePath private val bundleCacheDir = app.filesDir.resolve("bundle-cache").also { it.mkdirs() } - private val frameworkPath = app.filesDir.resolve("framework").also { it.mkdirs() }.absolutePath - private val integrationsCacheDir = app.filesDir.resolve("integrations-cache").also { it.mkdirs() } val selectedAppPackage = mutableStateOf(Optional.empty()) private val selectedPatches = mutableStateListOf() val patches = mutableStateOf>>>>(Resource.Loading) + lateinit var patchBundleFile: String init { loadPatches() @@ -168,10 +161,7 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { return !selectedPatches.isEmpty() } - private fun findPatchesByIds(ids: Iterable): List>> { - val (patches) = patches.value as? Resource.Success ?: return listOf() - return patches.filter { patch -> ids.any { it == patch.patchName } } - } + private fun getSelectedPackageInfo() = if (selectedAppPackage.value.isPresent) @@ -207,18 +197,10 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { } } - private suspend fun downloadIntegrations(workdir: File): File { - return try { - val (_, out) = ManagerAPI.downloadIntegrations(workdir) - out - } catch (e: Exception) { - throw Exception("Failed to download integrations", e) - } - } - private fun loadPatches() = viewModelScope.launch { try { val file = downloadDefaultPatchBundle(bundleCacheDir) + patchBundleFile=file.absolutePath loadPatches0(file.absolutePath) } catch (e: Exception) { Log.e(tag, "An error occurred while loading patches", e) @@ -237,86 +219,10 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { patches.value = Resource.Success(patchClasses) } - private fun createWorkDir(): File { - return app.filesDir.resolve("tmp-${System.currentTimeMillis()}").also { it.mkdirs() } - } - fun startPatcher() { - val tag = "Patcher" - - viewModelScope.launch { - Log.d(tag, "Checking prerequisites") - val info = getSelectedPackageInfo()?.applicationInfo ?: return@launch - val patches = findPatchesByIds(selectedPatches) - if (patches.isEmpty()) return@launch - val integrations = downloadIntegrations(integrationsCacheDir) - - Log.d(tag, "Creating directories") - val workdir = createWorkDir() - val inputFile = File(workdir.parentFile!!, "base.apk") - val patchedFile = File(workdir, "patched.apk") - val alignedFile = File(workdir, "aligned.apk") - val outputFile = File(workdir, "out.apk") - val cacheDirectory = workdir.resolve("cache") - val buildDirectory = cacheDirectory.resolve("build") - - try { -// Log.d(tag, "Copying base.apk from ${info.packageName}") -// withContext(Dispatchers.IO) { -// Files.copy( -// File(info.publicSourceDir).toPath(), -// inputFile.toPath(), -// StandardCopyOption.REPLACE_EXISTING -// ) -// } - - Log.d(tag, "Creating patcher") - val patcher = Patcher( - PatcherOptions( - inputFile, - cacheDirectory.absolutePath, - patchResources = true, - aaptPath = aaptPath, - frameworkFolderLocation = frameworkPath - ) - ) - - Log.d(tag, "Merging integrations") - patcher.addFiles(listOf(integrations)) {} - - Log.d(tag, "Adding ${patches.size} patch(es)") - patcher.addPatches(patches) - - Log.d(tag, "Applying patches") - patcher.applyPatches().forEach { (patch, result) -> - if (result.isSuccess) { - Log.i(tag, "[success] $patch") - return@forEach - } - Log.e(tag, "[error] $patch:", result.exceptionOrNull()!!) - } - - Log.d(tag, "Saving file") - val result = patcher.save() - ZipFileSystemUtils(result.resourceFile!!, patchedFile).use { fs -> - result.dexFiles.forEach { fs.write(it.name, it.dexFileInputStream.readBytes()) } - fs.writeInput() - fs.uncompress(*result.doNotCompress!!.toTypedArray()) - } - - Log.d(tag, "Aligning apk") - ZipAligner.align(patchedFile, alignedFile) - Log.d(tag, "Signing apk") - Signer("ReVanced", "s3cur3p@ssw0rd").signApk(alignedFile, outputFile) - - // TODO: install apk! - Log.d(tag, "Installing apk") - } catch (e: Exception) { - Log.e(tag, "Error while patching", e) - } - - Log.d(tag, "Deleting workdir") - //workdir.deleteRecursively() - } + val serviceIntent = Intent(app, PatcherForegroundService::class.java) + serviceIntent.putExtra("selectedPatches",selectedPatches.toTypedArray()) + serviceIntent.putExtra("patchBundleFile",patchBundleFile) + app.startForegroundService(serviceIntent) } } \ 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 6e3a289ef1..3e703f06f4 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -42,4 +42,6 @@ Team Translators Patcher + Patching + ReVanced Manager is patching \ No newline at end of file From e16b5b1cfe369fbc8aba2f22aa83b3564db78a69 Mon Sep 17 00:00:00 2001 From: Ushie Date: Fri, 8 Jul 2022 21:59:57 +0300 Subject: [PATCH 064/132] feat: uncommented youtube in socials as we now have permission to use the logo --- app/src/main/java/app/revanced/manager/Global.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/Global.kt b/app/src/main/java/app/revanced/manager/Global.kt index 58908e9366..8e75a8a06a 100644 --- a/app/src/main/java/app/revanced/manager/Global.kt +++ b/app/src/main/java/app/revanced/manager/Global.kt @@ -11,7 +11,7 @@ class Global { R.drawable.ic_twitter to "https://twitter.com/revancedapp", R.drawable.ic_reddit to "https://reddit.com/r/revancedapp", R.drawable.ic_telegram to "https://t.me/app_revanced", - // R.drawable.ic_youtube to "https://youtube.com/channel/UCLktAUh5Gza9zAJBStwxNdw", + R.drawable.ic_youtube to "https://youtube.com/channel/UCLktAUh5Gza9zAJBStwxNdw", ) From 70531d983a66c3da830cbc3c64e379848e5d9175 Mon Sep 17 00:00:00 2001 From: Ushie Date: Fri, 8 Jul 2022 22:05:25 +0300 Subject: [PATCH 065/132] feat: added copyToClipboard and showToast functions --- .../revanced/manager/ui/components/Dialogs.kt | 10 ++++------ .../manager/ui/components/Extensions.kt | 18 ++++++++++++++++++ .../ui/components/FloatingActionButton.kt | 5 +---- 3 files changed, 23 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/components/Extensions.kt diff --git a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt index 72e7d01066..73e769a37d 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt @@ -13,11 +13,10 @@ import androidx.compose.material3.Text import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties @@ -26,19 +25,18 @@ import app.revanced.manager.R @Composable fun AboutDialog() { + val context = LocalContext.current var showPopup by remember { mutableStateOf(false) } val onPopupDismissed = { showPopup = false } - val localClipboardManager = LocalClipboardManager.current - PreferenceRow( title = stringResource(R.string.app_version), subtitle = "${BuildConfig.VERSION_TYPE} ${BuildConfig.VERSION_NAME}", painter = painterResource(id = R.drawable.ic_baseline_info_24), onClick = { showPopup = true }, - onLongClick = { localClipboardManager.setText(AnnotatedString("Debug Info:\n" + DebugInfo())) } + onLongClick = { context.copyToClipboard("Debug Info:\n" + DebugInfo()) } ) if (showPopup) { @@ -52,7 +50,7 @@ fun AboutDialog() { }, // TODO: MAKE CLIPBOARD REUSABLE, ADD TOAST MESSAGE *CLEANLY* confirmButton = { - TextButton(onClick = { localClipboardManager.setText(AnnotatedString("Debug Info:\n" + DebugInfo())) } ) { + TextButton(onClick = { context.copyToClipboard("Debug Info:\n" + DebugInfo()) } ) { Text(text = "Copy") } }, diff --git a/app/src/main/java/app/revanced/manager/ui/components/Extensions.kt b/app/src/main/java/app/revanced/manager/ui/components/Extensions.kt new file mode 100644 index 0000000000..a2f01c8105 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/components/Extensions.kt @@ -0,0 +1,18 @@ +package app.revanced.manager.ui.components + +import android.content.ClipData +import android.content.ClipboardManager +import android.content.Context +import android.content.Context.CLIPBOARD_SERVICE +import android.widget.Toast + +fun Context.copyToClipboard(content: String) { + val clipboard = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager + clipboard.setPrimaryClip(ClipData.newPlainText(null, content)) + + showToast("Copied") +} + +fun Context.showToast(message: String) { + Toast.makeText(this, message, Toast.LENGTH_LONG).show() +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/components/FloatingActionButton.kt b/app/src/main/java/app/revanced/manager/ui/components/FloatingActionButton.kt index f6074f81cd..7124be52da 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/FloatingActionButton.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/FloatingActionButton.kt @@ -1,6 +1,5 @@ package app.revanced.manager.ui.components -import android.widget.Toast import androidx.compose.material.ripple.LocalRippleTheme import androidx.compose.material.ripple.RippleAlpha import androidx.compose.material.ripple.RippleTheme @@ -33,11 +32,9 @@ fun FloatingActionButton( icon = icon, onClick = { if (!enabled) { - Toast.makeText(context, "Please select an application to patch", Toast.LENGTH_LONG).show() + context.showToast("Please select an application to patch") } if (enabled) onClick() - - }, containerColor = if (enabled) MaterialTheme.colorScheme.primaryContainer else Color.Gray, ) From e47a7a746b714b31fc39824fb069186eed67588d Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 9 Jul 2022 12:23:16 +0530 Subject: [PATCH 066/132] feat: added expanding text to patch descriptions. --- .../manager/ui/components/ExpandingText.kt | 48 +++++++++++++++++++ .../ui/screens/PatchesSelectorScreen.kt | 9 ++-- 2 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/components/ExpandingText.kt diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandingText.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandingText.kt new file mode 100644 index 0000000000..2d0fc1f6f6 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/components/ExpandingText.kt @@ -0,0 +1,48 @@ +import androidx.compose.animation.animateContentSize +import androidx.compose.foundation.clickable +import androidx.compose.material3.Text +import androidx.compose.runtime.* +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.TextLayoutResult + +private const val MINIMIZED_MAX_LINES = 1 + +@Composable +fun ExpandingText(modifier: Modifier = Modifier, text: String) { + var isExpanded by remember { mutableStateOf(false) } + val textLayoutResultState = remember { mutableStateOf(null) } + var isClickable by remember { mutableStateOf(false) } + var finalText by remember { mutableStateOf(text) } + + val textLayoutResult = textLayoutResultState.value + LaunchedEffect(textLayoutResult) { + if (textLayoutResult == null) return@LaunchedEffect + + when { + isExpanded -> { + finalText = "$text" + } + !isExpanded && textLayoutResult.hasVisualOverflow -> { + val lastCharIndex = textLayoutResult.getLineEnd(MINIMIZED_MAX_LINES - 1) + val showMoreString = "..." + val adjustedText = text + .substring(startIndex = 0, endIndex = lastCharIndex) + .dropLast(showMoreString.length) + .dropLastWhile { it == ' ' || it == '.' } + + finalText = "$adjustedText$showMoreString" + + isClickable = true + } + } + } + + Text( + text = finalText, + maxLines = if (isExpanded) Int.MAX_VALUE else MINIMIZED_MAX_LINES, + onTextLayout = { textLayoutResultState.value = it }, + modifier = modifier + .clickable(enabled = isClickable) { isExpanded = !isExpanded } + .animateContentSize(), + ) +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index aba986dc70..e9d8ac22b3 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -1,5 +1,6 @@ package app.revanced.manager.ui.screens +import ExpandingText import android.annotation.SuppressLint import androidx.activity.ComponentActivity import androidx.compose.foundation.layout.* @@ -7,9 +8,7 @@ import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.material3.* -import androidx.compose.runtime.Composable -import androidx.compose.runtime.CompositionLocalProvider -import androidx.compose.runtime.getValue +import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -132,12 +131,12 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () } } patch.description?.let { desc -> - Text( + ExpandingText( text = desc, - style = Typography.bodyMedium, modifier = Modifier.padding(vertical = 8.dp) ) } + } } } \ No newline at end of file From a11fe288bb0b519df1e00068c11163237103ec16 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sat, 9 Jul 2022 20:29:07 +0530 Subject: [PATCH 067/132] feat: patch compatibility versions in patch descriptions. --- .../manager/ui/screens/PatchesSelectorScreen.kt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index e9d8ac22b3..d101b4b95d 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -23,6 +23,7 @@ import app.revanced.manager.ui.components.LoadingIndicator import app.revanced.manager.ui.screens.mainsubscreens.PatchClass import app.revanced.manager.ui.screens.mainsubscreens.PatcherViewModel import app.revanced.manager.ui.theme.Typography +import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages import app.revanced.patcher.extensions.PatchExtensions.description import app.revanced.patcher.extensions.PatchExtensions.patchName import app.revanced.patcher.extensions.PatchExtensions.version @@ -136,7 +137,18 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () modifier = Modifier.padding(vertical = 8.dp) ) } - + patch.compatiblePackages?. let { + if (it.isNotEmpty()) { + Text( + text = it + .joinToString(", ") + .replaceBefore("["," "). + replaceAfter("]"," "), + style = Typography.bodySmall, + modifier = Modifier.padding(top = 4.dp) + ) + } + } } } } \ No newline at end of file From 38edf73d5899691760f1380d21eb2267c6d57cbf Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sun, 10 Jul 2022 00:07:54 +0530 Subject: [PATCH 068/132] fix: moved patch compatibility to right place. --- .../revanced/manager/ui/components/Dialogs.kt | 64 +++++++++++++++++-- .../ui/screens/PatchesSelectorScreen.kt | 23 +++---- 2 files changed, 68 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt index 73e769a37d..e0e29d6a1b 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt @@ -1,18 +1,18 @@ package app.revanced.manager.ui.components +import ExpandingText +import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll import androidx.compose.material.AlertDialog import androidx.compose.material.TextButton -import androidx.compose.material3.ButtonDefaults -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Surface -import androidx.compose.material3.Text +import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource @@ -22,6 +22,8 @@ import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import app.revanced.manager.BuildConfig import app.revanced.manager.R +import app.revanced.manager.ui.screens.mainsubscreens.PatchClass +import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages @Composable fun AboutDialog() { @@ -75,7 +77,7 @@ fun HelpDialog() { val onPopupDismissed = { showPopup = false } - var currentUriHandler = LocalUriHandler.current + val currentUriHandler = LocalUriHandler.current PreferenceRow( title = stringResource(R.string.help), @@ -183,7 +185,7 @@ fun FAQDialog( "XV \uD83D\uDD38 Can you support me?\n" + "If you have no idea how to use ReVanced yet, then do not use it yet. ReVanced is currently in development and directed toward developers. If you genuinely have a problem and need help for development purposes, please include the error you get, what caused it and your current environment such as which files and versions you used.\n" + "\n" + "\n" ) - androidx.compose.material3.TextButton( + TextButton( colors = ButtonDefaults.buttonColors( containerColor = MaterialTheme.colorScheme.primary ), @@ -201,4 +203,54 @@ fun FAQDialog( } } } +} + +@Composable +fun MonthDialog( + patchClass: PatchClass, + onClose: () -> Unit) { + val patch = patchClass.patch + val color = if (isSystemInDarkTheme()) { + Color.White + } else { + Color.Black + } + AlertDialog( + onDismissRequest = onClose, + backgroundColor = MaterialTheme.colorScheme.background, + shape = RoundedCornerShape(12.dp), + title = { + Box(modifier = Modifier.fillMaxWidth()) { + Text(text = "Compatible App Versions", color = color) + } + }, + text = { + patch.compatiblePackages?. let { + if (it.isNotEmpty()) { + ExpandingText( + text = it + .joinToString(", ") + .replaceBefore("["," "). + replaceAfter("]"," "), +// style = Typography.bodySmall, +// color = color, + modifier = Modifier.padding(top = 4.dp) + ) + } + } + }, + buttons = { + Row( + modifier = Modifier.padding(all = 8.dp), + horizontalArrangement = Arrangement.Center + ) { + Button( + modifier = Modifier.fillMaxWidth(), + onClick = onClose + ) { + Text("Dismiss") + } + } + } + ) } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index d101b4b95d..9e1074c6d2 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -1,6 +1,7 @@ package app.revanced.manager.ui.screens import ExpandingText +import app.revanced.manager.ui.components.MonthDialog import android.annotation.SuppressLint import androidx.activity.ComponentActivity import androidx.compose.foundation.layout.* @@ -14,6 +15,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController @@ -23,7 +25,6 @@ import app.revanced.manager.ui.components.LoadingIndicator import app.revanced.manager.ui.screens.mainsubscreens.PatchClass import app.revanced.manager.ui.screens.mainsubscreens.PatcherViewModel import app.revanced.manager.ui.theme.Typography -import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages import app.revanced.patcher.extensions.PatchExtensions.description import app.revanced.patcher.extensions.PatchExtensions.patchName import app.revanced.patcher.extensions.PatchExtensions.version @@ -79,6 +80,8 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () val patch = patchClass.patch val name = patch.patchName + var showDialog by remember { mutableStateOf(false) } + Card( modifier = Modifier .padding(16.dp, 4.dp), @@ -128,6 +131,12 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () onCheckedChange = { onSelected() } ) } + if (showDialog) { + MonthDialog(onClose = { showDialog = false }, patchClass = patchClass) + } + Button(onClick = {showDialog = true}) { + Icon(painter = painterResource(id = R.drawable.ic_baseline_info_24), contentDescription = null) + } } } } @@ -137,18 +146,6 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () modifier = Modifier.padding(vertical = 8.dp) ) } - patch.compatiblePackages?. let { - if (it.isNotEmpty()) { - Text( - text = it - .joinToString(", ") - .replaceBefore("["," "). - replaceAfter("]"," "), - style = Typography.bodySmall, - modifier = Modifier.padding(top = 4.dp) - ) - } - } } } } \ No newline at end of file From 3750f5c85566b89abde3794f36c61dc7cd1d2172 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sun, 10 Jul 2022 00:18:18 +0530 Subject: [PATCH 069/132] refactor: renamed incorrectly named function. --- .../main/java/app/revanced/manager/ui/components/Dialogs.kt | 2 +- .../app/revanced/manager/ui/screens/PatchesSelectorScreen.kt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt index e0e29d6a1b..8746f1889c 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt @@ -206,7 +206,7 @@ fun FAQDialog( } @Composable -fun MonthDialog( +fun PatchCompatibilityDialog( patchClass: PatchClass, onClose: () -> Unit) { val patch = patchClass.patch diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 9e1074c6d2..8b8c9f141a 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -1,7 +1,7 @@ package app.revanced.manager.ui.screens import ExpandingText -import app.revanced.manager.ui.components.MonthDialog +import app.revanced.manager.ui.components.PatchCompatibilityDialog import android.annotation.SuppressLint import androidx.activity.ComponentActivity import androidx.compose.foundation.layout.* @@ -132,7 +132,7 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () ) } if (showDialog) { - MonthDialog(onClose = { showDialog = false }, patchClass = patchClass) + PatchCompatibilityDialog(onClose = { showDialog = false }, patchClass = patchClass) } Button(onClick = {showDialog = true}) { Icon(painter = painterResource(id = R.drawable.ic_baseline_info_24), contentDescription = null) From 53306a3c61b54fdab9ee7f20a00687fe9f16634d Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sun, 10 Jul 2022 20:42:25 +0530 Subject: [PATCH 070/132] feat: Searchbar in PatchesSelectorScreen. --- .../ui/screens/PatchesSelectorScreen.kt | 61 ++++++++++++++++--- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 8b8c9f141a..edeeb08fb5 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -8,6 +8,8 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material.icons.filled.Search import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable @@ -32,7 +34,7 @@ import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph @OptIn(ExperimentalMaterial3Api::class) -@SuppressLint("QueryPermissionsNeeded") +@SuppressLint("QueryPermissionsNeeded", "UnrememberedMutableState") @Destination @RootNavGraph @Composable @@ -42,6 +44,7 @@ fun PatchesSelectorScreen( ) { val patches = rememberSaveable { pvm.getFilteredPatches() } val patchesState by pvm.patches + var query by mutableStateOf("") when (patchesState) { is Resource.Success -> { @@ -58,12 +61,56 @@ fun PatchesSelectorScreen( modifier = Modifier .padding(paddingValues) ) { - LazyColumn { - items(count = patches.size) { - val patch = patches[it] - val name = patch.patch.patchName - PatchSelectable(patch, pvm.isPatchSelected(name)) { - pvm.selectPatch(name, !pvm.isPatchSelected(name)) + Box( + modifier = Modifier + .fillMaxWidth() + .padding(12.dp, 4.dp), + ) { + Row( + modifier = Modifier.fillMaxWidth() + ) { + TextField( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + value = query, + onValueChange = { + newValue -> query = newValue + }, + leadingIcon = { + Icon(Icons.Default.Search, "Search") + }, + trailingIcon = { + if (query.isNotEmpty()) { + IconButton(onClick = { + query = "" + }) { + Icon(Icons.Default.Clear, "Clear") + } + } + }, + ) + } + } + LazyColumn { + + if (query.isEmpty() || query.isBlank()) { + items(count = patches.size) { + val patch = patches[it] + val name = patch.patch.patchName + PatchSelectable(patch, pvm.isPatchSelected(name)) { + pvm.selectPatch(name, !pvm.isPatchSelected(name)) + } + } + } else { + items(count = patches.size) { + val patch = patches[it] + val name = patch.patch.patchName + if (name.contains(query.lowercase())) { + PatchSelectable(patch, pvm.isPatchSelected(name)) { + pvm.selectPatch(name, !pvm.isPatchSelected(name)) + } + } } } } From ee7a52593b64c115b405d3e47e32f3226626dc59 Mon Sep 17 00:00:00 2001 From: Ushie Date: Mon, 11 Jul 2022 05:19:13 +0300 Subject: [PATCH 071/132] feat: replace Button with IconButton --- .../manager/ui/screens/PatchesSelectorScreen.kt | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index edeeb08fb5..cda0013923 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -134,11 +134,12 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () .padding(16.dp, 4.dp), onClick = { onSelected() } ) { - Column(modifier = Modifier.padding(12.dp)) { + Column(modifier = Modifier.padding(12.dp, 0.dp, 12.dp, 12.dp)) { Row { Column( Modifier .weight(1f) + .align(Alignment.CenterVertically) ) { Text( text = name.replace("-", " ").split(" ") @@ -172,18 +173,20 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () .absolutePadding(24.dp, 0.dp, 12.dp, 0.dp) ) } + + if (showDialog) { + PatchCompatibilityDialog(onClose = { showDialog = false }, patchClass = patchClass) + } + IconButton(onClick = {showDialog = true}) { + Icon(painter = painterResource(id = R.drawable.ic_baseline_info_24), contentDescription = null) + } + CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) { Checkbox( checked = isSelected, onCheckedChange = { onSelected() } ) } - if (showDialog) { - PatchCompatibilityDialog(onClose = { showDialog = false }, patchClass = patchClass) - } - Button(onClick = {showDialog = true}) { - Icon(painter = painterResource(id = R.drawable.ic_baseline_info_24), contentDescription = null) - } } } } From a0a4d75b6d13b5096d77f51afb09d1919898ecda Mon Sep 17 00:00:00 2001 From: Ushie Date: Mon, 11 Jul 2022 19:53:38 +0300 Subject: [PATCH 072/132] feat: combine version and unsupported into chip --- .../ui/screens/PatchesSelectorScreen.kt | 44 +++++++------------ app/src/main/res/values/strings.xml | 2 + 2 files changed, 19 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index cda0013923..595d2eaeb7 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -1,15 +1,12 @@ package app.revanced.manager.ui.screens import ExpandingText -import app.revanced.manager.ui.components.PatchCompatibilityDialog import android.annotation.SuppressLint import androidx.activity.ComponentActivity import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Check -import androidx.compose.material.icons.filled.Clear -import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.filled.* import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable @@ -17,13 +14,14 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import app.revanced.manager.R import app.revanced.manager.ui.Resource import app.revanced.manager.ui.components.LoadingIndicator +import app.revanced.manager.ui.components.PatchCompatibilityDialog import app.revanced.manager.ui.screens.mainsubscreens.PatchClass import app.revanced.manager.ui.screens.mainsubscreens.PatcherViewModel import app.revanced.manager.ui.theme.Typography @@ -149,37 +147,29 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () ) } - if (patchClass.unsupported) { - Column(Modifier.align(Alignment.CenterVertically)) { - Text( - text = "⚠️ Unsupported!", - modifier = Modifier.padding(horizontal = 4.dp), - style = Typography.bodySmall, - color = Color.Yellow - ) - } - } - Column { Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { - Column { - Text( - text = patch.version ?: "unknown", - style = Typography.bodySmall, - modifier = Modifier - .absolutePadding(24.dp, 0.dp, 12.dp, 0.dp) - ) - } if (showDialog) { PatchCompatibilityDialog(onClose = { showDialog = false }, patchClass = patchClass) } - IconButton(onClick = {showDialog = true}) { - Icon(painter = painterResource(id = R.drawable.ic_baseline_info_24), contentDescription = null) - } + InputChip( + modifier = Modifier.padding(horizontal = 8.dp), + onClick = { showDialog = true }, + leadingIcon = { + if (patchClass.unsupported) Icon( + Icons.Default.Warning, + contentDescription = stringResource(id = R.string.unsupported_version) + ) else Icon( + Icons.Default.Info, + contentDescription = stringResource(id = R.string.version_info) + ) + }, + label = { Text(text = patch.version ?: "unknown") } + ) CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) { Checkbox( diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1c0e6d9c5d..212964af3f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -60,4 +60,6 @@ Dropdown Button Version FAQ + Unsupported Version + Version info \ No newline at end of file From 136d722ef25a7df8dcf3d939a21301a03868bb67 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Mon, 11 Jul 2022 22:53:54 +0530 Subject: [PATCH 073/132] refactor: use version property of Package to show compatible version. --- .../revanced/manager/ui/components/Dialogs.kt | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt index 8746f1889c..850b8d29e3 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt @@ -1,6 +1,5 @@ package app.revanced.manager.ui.components -import ExpandingText import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState @@ -23,6 +22,7 @@ import androidx.compose.ui.window.DialogProperties import app.revanced.manager.BuildConfig import app.revanced.manager.R import app.revanced.manager.ui.screens.mainsubscreens.PatchClass +import app.revanced.patcher.annotation.Package import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages @Composable @@ -225,19 +225,7 @@ fun PatchCompatibilityDialog( } }, text = { - patch.compatiblePackages?. let { - if (it.isNotEmpty()) { - ExpandingText( - text = it - .joinToString(", ") - .replaceBefore("["," "). - replaceAfter("]"," "), -// style = Typography.bodySmall, -// color = color, - modifier = Modifier.padding(top = 4.dp) - ) - } - } + patch.compatiblePackages!!.forEach { p: Package -> Text(p.versions.joinToString(", ")) } }, buttons = { Row( From 6b402440708daef3055e4a534b0f5faa79d53208 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Mon, 11 Jul 2022 23:10:43 +0530 Subject: [PATCH 074/132] fix: sort compatible version from latest to oldest. --- app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt index 850b8d29e3..946845d98f 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt @@ -225,7 +225,7 @@ fun PatchCompatibilityDialog( } }, text = { - patch.compatiblePackages!!.forEach { p: Package -> Text(p.versions.joinToString(", ")) } + patch.compatiblePackages!!.forEach { p: Package -> Text(p.versions.reversed().joinToString(", ")) } }, buttons = { Row( From 84d506e4f79afa5600e547f483473845c5a8c8a5 Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 12 Jul 2022 04:17:57 +0300 Subject: [PATCH 075/132] feat: change Card to ElevatedCard & improve layout --- .../ui/screens/PatchesSelectorScreen.kt | 65 +++++++++++-------- app/src/main/res/values/strings.xml | 1 + 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 595d2eaeb7..d08476b7c3 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -127,50 +127,40 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () var showDialog by remember { mutableStateOf(false) } - Card( + ElevatedCard( modifier = Modifier .padding(16.dp, 4.dp), onClick = { onSelected() } ) { - Column(modifier = Modifier.padding(12.dp, 0.dp, 12.dp, 12.dp)) { + Column(modifier = Modifier.padding(12.dp, 12.dp, 12.dp, 12.dp)) { Row { Column( Modifier - .weight(1f) .align(Alignment.CenterVertically) ) { Text( text = name.replace("-", " ").split(" ") .joinToString(" ") { it.replaceFirstChar(Char::uppercase) }, - color = Color.White, - style = Typography.titleMedium +// color = Color.White, + style = MaterialTheme.typography.titleMedium ) } - + Spacer(Modifier.width(4.dp)) + Row( + Modifier + .align(Alignment.CenterVertically) + ) { + Text( + text = patch.version ?: "unknown", + style = Typography.bodySmall + ) + } + Spacer(Modifier.weight(1f, true)) Column { Row( horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically ) { - - if (showDialog) { - PatchCompatibilityDialog(onClose = { showDialog = false }, patchClass = patchClass) - } - InputChip( - modifier = Modifier.padding(horizontal = 8.dp), - onClick = { showDialog = true }, - leadingIcon = { - if (patchClass.unsupported) Icon( - Icons.Default.Warning, - contentDescription = stringResource(id = R.string.unsupported_version) - ) else Icon( - Icons.Default.Info, - contentDescription = stringResource(id = R.string.version_info) - ) - }, - label = { Text(text = patch.version ?: "unknown") } - ) - CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) { Checkbox( checked = isSelected, @@ -183,9 +173,32 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () patch.description?.let { desc -> ExpandingText( text = desc, - modifier = Modifier.padding(vertical = 8.dp) + modifier = Modifier.padding(vertical = 8.dp), ) } + Column { + Row { + if (showDialog) { + PatchCompatibilityDialog(onClose = { showDialog = false }, patchClass = patchClass) + } + InputChip( + onClick = { showDialog = true }, + leadingIcon = { + if (patchClass.unsupported) Icon( + Icons.Default.Warning, +// tint = Color.Yellow, + tint = MaterialTheme.colorScheme.primary, + contentDescription = stringResource(id = R.string.unsupported_version) + ) else Icon( + Icons.Default.Info, + tint = MaterialTheme.colorScheme.primary, + contentDescription = stringResource(id = R.string.version_info) + ) + }, + label = { Text(stringResource(id = R.string.supported_versions)) } + ) + } + } } } } \ 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 212964af3f..5710eb15dd 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -62,4 +62,5 @@ FAQ Unsupported Version Version info + Supported Versions \ No newline at end of file From 0d6f6d363344394e0a077d9be82f831ceae9faf0 Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 12 Jul 2022 04:18:45 +0300 Subject: [PATCH 076/132] feat: change search TextField to OutlinedTextField --- .../app/revanced/manager/ui/screens/PatchesSelectorScreen.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index d08476b7c3..2d5486feb7 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -62,12 +62,12 @@ fun PatchesSelectorScreen( Box( modifier = Modifier .fillMaxWidth() - .padding(12.dp, 4.dp), + .padding(8.dp, 4.dp), ) { Row( modifier = Modifier.fillMaxWidth() ) { - TextField( + OutlinedTextField( modifier = Modifier .fillMaxWidth() .padding(8.dp), From cd7895761d03358cbf9e4af32dfd14967cd091a7 Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 12 Jul 2022 04:19:24 +0300 Subject: [PATCH 077/132] refactor: remove ellipse --- .../main/java/app/revanced/manager/ui/screens/MainScreen.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index 8f72fde85c..66e97a06e2 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -35,7 +35,7 @@ fun MainScreen() { } AppSelectorScreenDestination -> { AppBar( - title = { Text("Select an app...") }, + title = { Text("Select an app") }, navigationIcon = { IconButton(onClick = { navController.navigateUp() }) { androidx.compose.material3.Icon( @@ -48,7 +48,7 @@ fun MainScreen() { } PatchesSelectorScreenDestination -> { AppBar( - title = { Text("Select patches...") }, + title = { Text("Select patches") }, navigationIcon = { IconButton(onClick = { navController.navigateUp() }) { androidx.compose.material3.Icon( From fd5bf9e88b14ffbc38076fbc90c294bad294ebca Mon Sep 17 00:00:00 2001 From: baiorett Date: Wed, 13 Jul 2022 23:35:05 +0300 Subject: [PATCH 078/132] fix: scrolling vertical contributor grid klfmdfklgmsdlkjfgnsdflkjgnsdflkjsgnserijfgsjmerivujfnmejsirkufgvmhruditgvmuhidrtfikmguvjdrntiugvmjrdtviglurmdtgvliudrtjvgmndlimrutgvjmdrlimutvgjdrliut,gvjdlituhjdtltyiumhmjvbiltuyhjmituyjghmvlietrujvhbrtikutyhjmbniutfybh --- .../app/revanced/manager/ui/components/ContributorsCard.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt index aeb0c04a0b..e5b87f7f53 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt @@ -1,5 +1,6 @@ package app.revanced.manager.ui.components +import android.util.Log import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.grid.GridCells @@ -12,6 +13,7 @@ import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -52,6 +54,7 @@ fun ContributorsCard( verticalArrangement = Arrangement.spacedBy(4.dp), horizontalArrangement = Arrangement.spacedBy(4.dp), modifier = Modifier.height(size.dp), + userScrollEnabled = false ) { items(data) { contributor -> AsyncImage( From 65d2cf2cd1da11f52756e46ad94fa65608f68317 Mon Sep 17 00:00:00 2001 From: Ushie Date: Thu, 14 Jul 2022 02:00:03 +0300 Subject: [PATCH 079/132] feat: replace contributor screen with redirect to readme --- app/build.gradle.kts | 18 ++-- .../manager/ui/components/ContributorsCard.kt | 75 ----------------- .../ui/models/ContributorsViewModel.kt | 56 ------------- .../manager/ui/screens/AboutScreen.kt | 7 +- .../manager/ui/screens/ContributorsScreen.kt | 83 ------------------- .../revanced/manager/ui/screens/MainScreen.kt | 15 ---- .../ui/screens/PatchesSelectorScreen.kt | 2 +- .../mainsubscreens/DashboardSubscreen.kt | 7 +- .../screens/mainsubscreens/MoreSubscreen.kt | 15 +--- build.gradle.kts | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 11 files changed, 27 insertions(+), 257 deletions(-) delete mode 100644 app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt delete mode 100644 app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt delete mode 100644 app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index aeb8d9b0d5..9ec24d2fbf 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -91,26 +91,26 @@ android { dependencies { // Core implementation("androidx.core:core-ktx:1.8.0") - implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.4.1") - implementation("androidx.activity:activity-compose:1.4.0") + implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.5.0") + implementation("androidx.activity:activity-compose:1.5.0") implementation("androidx.compose.ui:ui:$composeVersion") implementation("androidx.compose.ui:ui-tooling-preview:$composeVersion") - implementation("androidx.navigation:navigation-compose:2.5.0-rc02") + implementation("androidx.navigation:navigation-compose:2.5.0") // ReVanced - implementation("app.revanced:revanced-patcher:2.1.1") + implementation("app.revanced:revanced-patcher:2.4.0") // Signing & aligning implementation("org.bouncycastle:bcpkix-jdk15on:1.70") implementation("com.android.tools.build:apksig:7.2.1") // Compose Destinations - implementation("io.github.raamcosta.compose-destinations:core:1.5.5-beta") - ksp("io.github.raamcosta.compose-destinations:ksp:1.5.5-beta") + implementation("io.github.raamcosta.compose-destinations:core:1.6.12-beta") + ksp("io.github.raamcosta.compose-destinations:ksp:1.6.12-beta") // Accompanist implementation("com.google.accompanist:accompanist-drawablepainter:0.24.8-beta") - implementation("com.google.accompanist:accompanist-systemuicontroller:0.24.10-beta") + implementation("com.google.accompanist:accompanist-systemuicontroller:0.24.13-rc") // libsu implementation("com.github.topjohnwu.libsu:core:4.0.3") @@ -129,8 +129,8 @@ dependencies { implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion") // Material 3 + 2 - implementation("androidx.compose.material3:material3-window-size-class:1.0.0-alpha13") - implementation("androidx.compose.material3:material3:1.0.0-alpha13") + implementation("androidx.compose.material3:material3-window-size-class:1.0.0-alpha14") + implementation("androidx.compose.material3:material3:1.0.0-alpha14") implementation("androidx.compose.material:material:1.1.1") // Tests diff --git a/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt deleted file mode 100644 index e5b87f7f53..0000000000 --- a/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt +++ /dev/null @@ -1,75 +0,0 @@ -package app.revanced.manager.ui.components - -import android.util.Log -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.lazy.grid.GridCells -import androidx.compose.foundation.lazy.grid.LazyVerticalGrid -import androidx.compose.foundation.lazy.grid.items -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material3.* -import androidx.compose.runtime.* -import androidx.compose.runtime.snapshots.SnapshotStateList -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.platform.LocalConfiguration -import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextOverflow -import androidx.compose.ui.unit.dp -import app.revanced.manager.R -import app.revanced.manager.backend.api.GitHubAPI -import coil.compose.AsyncImage - - -private const val tag = "Expandable Card" - -@Composable -@ExperimentalMaterial3Api -fun ContributorsCard( - title: String, - size: Int, - data: SnapshotStateList, -) { - Column( - Modifier.padding(horizontal = 8.dp, vertical = 8.dp).fillMaxWidth() - ) { - Text( - text = title, - modifier = Modifier.fillMaxWidth().align(Alignment.CenterHorizontally).padding(8.dp), - fontSize = MaterialTheme.typography.titleLarge.fontSize, - fontWeight = FontWeight.Bold, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - style = MaterialTheme.typography.titleLarge - ) - - if (data.isNotEmpty()) { - val currentUriHandler = LocalUriHandler.current - - LazyVerticalGrid( - columns = GridCells.Adaptive(48.dp), - verticalArrangement = Arrangement.spacedBy(4.dp), - horizontalArrangement = Arrangement.spacedBy(4.dp), - modifier = Modifier.height(size.dp), - userScrollEnabled = false - ) { - items(data) { contributor -> - AsyncImage( - model = contributor.avatar_url, - contentDescription = stringResource(id = R.string.contributor_image), - Modifier - .padding(4.dp) - .size(40.dp) - .clip(CircleShape) - .clickable { - currentUriHandler.openUri(contributor.url) - } - ) - } - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt b/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt deleted file mode 100644 index 22aa18c30f..0000000000 --- a/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt +++ /dev/null @@ -1,56 +0,0 @@ -package app.revanced.manager.ui.models - -import androidx.compose.runtime.mutableStateListOf -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import app.revanced.manager.backend.api.GitHubAPI -import kotlinx.coroutines.launch - -class ContributorsViewModel : ViewModel() { - private val tag = "ContributorsViewModel" - - val patcherContributorsList = mutableStateListOf() - val patchesContributorsList = mutableStateListOf() - val cliContributorsList = mutableStateListOf() - val managerContributorsList = mutableStateListOf() - val integrationsContributorsList = mutableStateListOf() - - fun loadContributors() { - viewModelScope.launch { - val cliContributors = GitHubAPI.Contributors.contributors("revanced","revanced-cli") - cliContributors.sortedByDescending { - it.login - } - cliContributorsList.addAll(cliContributors) - - val patcherContributors = GitHubAPI.Contributors.contributors("revanced","revanced-patcher") - patcherContributors.sortedByDescending { - it.login - } - patcherContributorsList.addAll(patcherContributors) - - val patchesContributors = GitHubAPI.Contributors.contributors("revanced","revanced-patches") - patchesContributors.sortedByDescending { - it.login - } - patchesContributorsList.addAll(patchesContributors) - - val managerContributors = GitHubAPI.Contributors.contributors("Aunali321","revanced-manager") - managerContributors.sortedByDescending { - it.login - } - managerContributorsList.addAll(managerContributors) - - val integrationsContributors = GitHubAPI.Contributors.contributors("revanced","revanced-integrations") - integrationsContributors.sortedByDescending { - it.login - } - integrationsContributorsList.addAll(integrationsContributors) - } - } - - init { - loadContributors() - } - -} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index e9f046f799..40b8c6fdd3 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -19,8 +19,6 @@ import app.revanced.manager.ui.components.PreferenceRow import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph -private const val tag = "AboutScreen" - @Destination @RootNavGraph @Composable @@ -39,6 +37,11 @@ fun AboutScreen( painter = painterResource(id = R.drawable.ic_baseline_new_releases_24), onClick = { currentUriHandler.openUri(websiteUrl) }, ) + PreferenceRow( + title = stringResource(R.string.card_contributors_header), + painter = painterResource(id = R.drawable.ic_baseline_favorite_24), + onClick = { currentUriHandler.openUri("${websiteUrl}/github") } + ) PreferenceRow( title = stringResource(R.string.help_translate), painter = painterResource(id = R.drawable.ic_translate_black_24dp), diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt deleted file mode 100644 index 7f461783d4..0000000000 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ /dev/null @@ -1,83 +0,0 @@ -package app.revanced.manager.ui.screens - -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.* -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp -import androidx.lifecycle.viewmodel.compose.viewModel -import app.revanced.manager.Global.Companion.websiteUrl -import app.revanced.manager.R -import app.revanced.manager.ui.components.ContributorsCard -import app.revanced.manager.ui.components.IconHeader -import app.revanced.manager.ui.models.ContributorsViewModel -import com.ramcosta.composedestinations.annotation.Destination -import com.ramcosta.composedestinations.annotation.RootNavGraph - -private const val tag = "ContributorsScreen" - -@OptIn(ExperimentalMaterial3Api::class) -@Destination -@RootNavGraph -@Composable -fun ContributorsScreen( -// navigator: NavController, - vm: ContributorsViewModel = viewModel() -) { - Column( - Modifier - .padding(8.dp) - .height(1400.dp) - .verticalScroll(rememberScrollState()) - ) { - IconHeader() - - ContributorsCard( - stringResource(R.string.cli_contributors), - data = vm.cliContributorsList, - size = 100 - ) - ContributorsCard( - stringResource(R.string.patcher_contributors), - data = vm.patcherContributorsList, - size = 100 - ) - ContributorsCard( - stringResource(R.string.patches_contributors), - data = vm.patchesContributorsList, - size = 150 - ) - ContributorsCard( - stringResource(R.string.manager_contributors), - data = vm.managerContributorsList, - size = 100 - ) - ContributorsCard( - stringResource(R.string.integrations_contributors), - data = vm.integrationsContributorsList, - size = 200 - ) - - val currentUriHandler = LocalUriHandler.current - - Spacer(Modifier.weight(1f, true)) - - Button( - modifier = Modifier.fillMaxWidth(), - onClick = { currentUriHandler.openUri("${websiteUrl}/github") } - ) { - Icon( - painter = painterResource(id = R.drawable.ic_github_24), - contentDescription = "GitHub Link" - ) - Spacer(Modifier.padding(4.dp)) - Text(text = "GitHub") - } - } -} diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index 66e97a06e2..c2d0cb5437 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -85,19 +85,6 @@ fun MainScreen() { } ) } - ContributorsScreenDestination -> { - AppBar( - title = { Text(text = "Contributors") }, - navigationIcon = { - IconButton(onClick = { navController.navigateUp() }) { - androidx.compose.material3.Icon( - imageVector = Icons.Default.ArrowBack, - contentDescription = "Return" - ) - } - } - ) - } else -> { val currentUriHandler = LocalUriHandler.current @@ -117,8 +104,6 @@ fun MainScreen() { navController.appCurrentDestinationAsState().value != SettingsScreenDestination && navController.appCurrentDestinationAsState().value != AboutScreenDestination - && - navController.appCurrentDestinationAsState().value != ContributorsScreenDestination ) BottomNavBar(navController) }, content = { innerPadding -> diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 2d5486feb7..8e51493ac8 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -12,7 +12,6 @@ import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp @@ -182,6 +181,7 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () PatchCompatibilityDialog(onClose = { showDialog = false }, patchClass = patchClass) } InputChip( + selected = false, onClick = { showDialog = true }, leadingIcon = { if (patchClass.unsupported) Icon( diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt index 0fd139afff..a77fb2ec84 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt @@ -7,14 +7,15 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController +import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R import app.revanced.manager.ui.models.DashboardViewModel -import app.revanced.manager.ui.screens.destinations.ContributorsScreenDestination import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph @@ -26,6 +27,8 @@ fun DashboardSubscreen( navigator: NavController, vm: DashboardViewModel = viewModel() ) { + var currentUriHandler = LocalUriHandler.current + Column(modifier = Modifier.padding(16.dp)) { Card( modifier = Modifier @@ -83,7 +86,7 @@ fun DashboardSubscreen( } } Card( - onClick = { navigator.navigate(ContributorsScreenDestination().route) }, + onClick = { currentUriHandler.openUri("${websiteUrl}/github") }, modifier = Modifier .padding(4.dp) .weight(1f) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt index 2f1396f880..e67cf27717 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt @@ -2,26 +2,22 @@ package app.revanced.manager.ui.screens.mainsubscreens import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding -import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.navigation.NavController -import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R -import app.revanced.manager.ui.components.* +import app.revanced.manager.ui.components.FAQDialog +import app.revanced.manager.ui.components.HelpDialog +import app.revanced.manager.ui.components.IconHeader +import app.revanced.manager.ui.components.PreferenceRow import app.revanced.manager.ui.screens.destinations.AboutScreenDestination -import app.revanced.manager.ui.screens.destinations.ContributorsScreenDestination import app.revanced.manager.ui.screens.destinations.SettingsScreenDestination import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph -private const val tag = "MoreScreen" - -@OptIn(ExperimentalMaterial3Api::class) @Destination @Composable @RootNavGraph @@ -31,8 +27,6 @@ fun MoreSubscreen( Column(Modifier.padding(8.dp)) { IconHeader() - var currentUriHandler = LocalUriHandler.current - PreferenceRow( title = stringResource(R.string.screen_settings_title), painter = painterResource(id = R.drawable.ic_baseline_settings_24), @@ -44,7 +38,6 @@ fun MoreSubscreen( onClick = { navigator.navigate(AboutScreenDestination().route) } ) - // TODO MAKE THESE DIALOGS REUSABLE HelpDialog() FAQDialog() diff --git a/build.gradle.kts b/build.gradle.kts index 212baa260c..d9121fb862 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,8 +12,8 @@ buildscript { } plugins { - id("com.android.application") version "7.4.0-alpha06" apply false - id("com.android.library") version "7.4.0-alpha06" apply false + id("com.android.application") version "7.4.0-alpha08" apply false + id("com.android.library") version "7.4.0-alpha08" apply false id("org.jetbrains.kotlin.android") version "1.6.21" apply false id("com.google.devtools.ksp") version "1.6.21-+" apply false } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index af82424a2c..394ffb5834 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Mon May 09 12:07:41 MSK 2022 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-rc-1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-rc-2-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From 9c1dbfc7aec569203fbf228afd73a336d36179b3 Mon Sep 17 00:00:00 2001 From: Ushie Date: Thu, 14 Jul 2022 03:48:02 +0300 Subject: [PATCH 080/132] feat: switch to material 3 AlertDialog --- .../revanced/manager/ui/components/Dialogs.kt | 24 +++++++------------ 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt index 946845d98f..ce33453043 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt @@ -1,25 +1,17 @@ package app.revanced.manager.ui.components -import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.verticalScroll -import androidx.compose.material.AlertDialog -import androidx.compose.material.TextButton -import androidx.compose.material3.* +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton import androidx.compose.runtime.* -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.Dialog -import androidx.compose.ui.window.DialogProperties -import app.revanced.manager.BuildConfig import app.revanced.manager.R import app.revanced.manager.ui.screens.mainsubscreens.PatchClass import app.revanced.patcher.annotation.Package @@ -87,8 +79,8 @@ fun HelpDialog() { if (showPopup) { AlertDialog( - backgroundColor = MaterialTheme.colorScheme.background, onDismissRequest = onPopupDismissed, + shape = RoundedCornerShape(12.dp), text = { Column(Modifier.padding(8.dp)) { Text(text = "In need of some help?\nJoin our Discord Server and ask in our dedicated support channel!") @@ -109,8 +101,8 @@ fun HelpDialog() { text = stringResource(R.string.help) ) }, - )} - + ) + } } From 310efecf79bc01e57a09f1272a92c0cff2ff98eb Mon Sep 17 00:00:00 2001 From: Ushie Date: Thu, 14 Jul 2022 04:26:50 +0300 Subject: [PATCH 081/132] feat: remove Debug info dialog and FAQ dialog --- .../manager/ui/components/DebugInfo.kt | 2 +- .../revanced/manager/ui/components/Dialogs.kt | 136 ------------------ .../manager/ui/screens/AboutScreen.kt | 14 +- .../screens/mainsubscreens/MoreSubscreen.kt | 3 - 4 files changed, 11 insertions(+), 144 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/DebugInfo.kt b/app/src/main/java/app/revanced/manager/ui/components/DebugInfo.kt index dae8998285..4414f72fc3 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/DebugInfo.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/DebugInfo.kt @@ -6,7 +6,7 @@ import app.revanced.manager.BuildConfig fun DebugInfo(): String { return """ Application version: ${BuildConfig.VERSION_NAME} - Version Type = ${BuildConfig.VERSION_TYPE} ${BuildConfig.BUILD_TYPE} + Version Type: ${BuildConfig.BUILD_TYPE}-${BuildConfig.VERSION_TYPE} Android Version: ${Build.VERSION.RELEASE} SDK: ${Build.VERSION.SDK_INT} Device Brand: ${Build.BRAND} diff --git a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt index ce33453043..534e2458ae 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt @@ -17,51 +17,6 @@ import app.revanced.manager.ui.screens.mainsubscreens.PatchClass import app.revanced.patcher.annotation.Package import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages -@Composable -fun AboutDialog() { - val context = LocalContext.current - - var showPopup by remember { mutableStateOf(false) } - - val onPopupDismissed = { showPopup = false } - - PreferenceRow( - title = stringResource(R.string.app_version), - subtitle = "${BuildConfig.VERSION_TYPE} ${BuildConfig.VERSION_NAME}", - painter = painterResource(id = R.drawable.ic_baseline_info_24), - onClick = { showPopup = true }, - onLongClick = { context.copyToClipboard("Debug Info:\n" + DebugInfo()) } - ) - - if (showPopup) { - AlertDialog( - backgroundColor = MaterialTheme.colorScheme.background, - onDismissRequest = onPopupDismissed, - text = { - Column(Modifier.padding(8.dp)) { - Text(text = DebugInfo()) - } - }, - // TODO: MAKE CLIPBOARD REUSABLE, ADD TOAST MESSAGE *CLEANLY* - confirmButton = { - TextButton(onClick = { context.copyToClipboard("Debug Info:\n" + DebugInfo()) } ) { - Text(text = "Copy") - } - }, - dismissButton = { - TextButton(onClick = { onPopupDismissed() }) { - Text(text = "Close") - } - }, - title = { - Text( - text = stringResource(R.string.app_version) - ) - }, - )} - -} - @Composable fun HelpDialog() { @@ -106,97 +61,6 @@ fun HelpDialog() { } -@Composable -fun FAQDialog( -) { - var showPopup by remember { mutableStateOf(false) } - - PreferenceRow( - title = stringResource(id = R.string.faq), - onClick = { showPopup = true }, - painter = painterResource(id = R.drawable.ic_faq), - ) - - if(showPopup) { - Box( - Modifier.padding(vertical = 32.dp) - ) { - Dialog( - properties = DialogProperties( - dismissOnBackPress = true, - dismissOnClickOutside = true, - ), - onDismissRequest = { - showPopup = false - } - ) { - Surface( - modifier = Modifier.fillMaxSize(), - shape = RoundedCornerShape(16.dp), - color = MaterialTheme.colorScheme.background - ) { - Box( - contentAlignment = Alignment.Center, - modifier = Modifier - .padding(horizontal = 8.dp, vertical = 32.dp) - .verticalScroll( - rememberScrollState() - ) - ) { - Text( - text = - "❓ Frequently asked questions\n" + - "Please make sure to read them before asking questions that have been asked too many times, thanks.\n" + - "I \uD83D\uDD38 What is ReVanced?\n" + - "ReVanced is a modular patcher for apps such as YouTube. This project was born out of Vanced's discontinuation and it is our goal to continue the legacy of what Vanced left.\n" + "\n" + - "II \uD83D\uDD38 How does ReVanced work?\n" + - "ReVanced does not distribute any proprietary file but instead provides open-source patches. Patches can be created for any Android app. The ReVanced Manager will use the patcher as its core to apply patches of your choice on your desired app. On rooted devices, ReVanced can mount the patched app over the original application. On non-rooted devices, ReVanced will install it under a different package name.\n" + "\n" + - "III \uD83D\uDD38 When will ReVanced be released?\n" + - "ReVanced is and will always be in development! Currently, you can build and test it yourself or use prebuild packages by following the documentation. You can also follow our approximate progress in the \uD83D\uDEA7・progress channel instead of an ETA.\n" + "\n" + - "IV \uD83D\uDD38 Does ReVanced support non-root devices?\n" + - "Yes! ReVanced supports non-root and rooted devices.\n" + "\n" + - "V \uD83D\uDD38 Will ReVanced have feature X?\n" + - "ReVanced is an open-source project. At first, we are working on implementing all core features from Vanced. Afterward, we will continue to implement your suggestions. Your contributions are also very welcome.\n" + "\n" + - "VI \uD83D\uDD38 How can I help?\n" + - "Since we are an open-source community and depend on outside help, you can always check out our GitHub repositories and contribute to us by creating an issue or pull request.\n" + "\n" + - "VII \uD83D\uDD38 Will ReVanced always stay up to date with YouTube?\n" + - "Unlike Vanced, our patcher can apply patches to any version of the app. This way, you can use patches on newer or older versions and are independent of us\n" + - "releasing a newer version. (Sometimes patches can break and will need updates. Check the documentation on what versions ReVanced is mainly targeting)\n" + "\n" + - "IX \uD83D\uDD38 Will ReVanced support Music?\n" + - "Yes. Patches have been created for YouTube Music and can be created for any other app. The MicroG patch is being worked on to allow ReVanced to work with YouTube Music.\n" + "\n" + - "X \uD83D\uDD38 Will ReVanced have NFTs?\n" + - "We do not intend to create NFTs. It also was never the reason why Vanced shut down and wouldn't be for us as well.\n" + "\n" + - "XI \uD83D\uDD38 Does Vanced still work?\n" + - "Vanced is currently fully functional and can be downloaded from mirrors.\n" + "\n" + - "XII \uD83D\uDD38 Why is the progress channel not updating?\n" + - "The \uD83D\uDEA7・progress channel is up to date. It might seem like ReVanced is not progressing, but it is under active development. It is also the reason, why no specific ETA can be given due to how fluctuating the current code base is. For every detailed update check \uD83E\uDD91・github.\n" + "\n" + - "XIII \uD83D\uDD38 Will MicroG stay up to date?\n" + - "MicroG and Vanced MicroG are under development by their respective maintainer.\n" + "\n" + - "XIV \uD83D\uDD38 Is ReVanced affiliated with Vanced?\n" + - "ReVanced is not affiliated with Vanced.\n" + "\n" + - "XV \uD83D\uDD38 Can you support me?\n" + - "If you have no idea how to use ReVanced yet, then do not use it yet. ReVanced is currently in development and directed toward developers. If you genuinely have a problem and need help for development purposes, please include the error you get, what caused it and your current environment such as which files and versions you used.\n" + "\n" + "\n" - ) - TextButton( - colors = ButtonDefaults.buttonColors( - containerColor = MaterialTheme.colorScheme.primary - ), - onClick = { showPopup = false }, - modifier = Modifier - .fillMaxWidth() - .align(Alignment.BottomCenter) - .padding(top = 12.dp) - , - ) { - Text(text = "Close Popup") - } - } - } - } - } - } -} - @Composable fun PatchCompatibilityDialog( patchClass: PatchClass, diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 40b8c6fdd3..8170e3d01f 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -6,16 +6,16 @@ import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import app.revanced.manager.BuildConfig import app.revanced.manager.Global.Companion.socialLinks import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R -import app.revanced.manager.ui.components.AboutDialog -import app.revanced.manager.ui.components.IconHeader -import app.revanced.manager.ui.components.PreferenceRow +import app.revanced.manager.ui.components.* import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph @@ -30,8 +30,14 @@ fun AboutScreen( var currentUriHandler = LocalUriHandler.current - AboutDialog() + val context = LocalContext.current + PreferenceRow( + title = stringResource(R.string.app_version), + subtitle = "${BuildConfig.VERSION_TYPE} ${BuildConfig.VERSION_NAME}", + painter = painterResource(id = R.drawable.ic_baseline_info_24), + onLongClick = { context.copyToClipboard("Debug Info:\n" + DebugInfo()) } + ) PreferenceRow( title = stringResource(R.string.whats_new), painter = painterResource(id = R.drawable.ic_baseline_new_releases_24), diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt index e67cf27717..a19595a9ec 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt @@ -9,7 +9,6 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.navigation.NavController import app.revanced.manager.R -import app.revanced.manager.ui.components.FAQDialog import app.revanced.manager.ui.components.HelpDialog import app.revanced.manager.ui.components.IconHeader import app.revanced.manager.ui.components.PreferenceRow @@ -39,7 +38,5 @@ fun MoreSubscreen( ) HelpDialog() - - FAQDialog() } } \ No newline at end of file From 3d2bdd73fc3e122fd10f2014cc354f4266f1dd75 Mon Sep 17 00:00:00 2001 From: Ushie Date: Thu, 14 Jul 2022 04:28:21 +0300 Subject: [PATCH 082/132] feat: remove supported versions dialog in supported patches --- .../revanced/manager/ui/components/Dialogs.kt | 26 +++-------- .../ui/screens/PatchesSelectorScreen.kt | 45 +++++++++---------- app/src/main/res/values/strings.xml | 4 +- 3 files changed, 29 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt index 534e2458ae..4e4fdc0537 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt @@ -48,7 +48,7 @@ fun HelpDialog() { }, dismissButton = { TextButton(onClick = { onPopupDismissed() }) { - Text(text = "Close") + Text(text = "Dismiss") } }, title = { @@ -66,34 +66,18 @@ fun PatchCompatibilityDialog( patchClass: PatchClass, onClose: () -> Unit) { val patch = patchClass.patch - val color = if (isSystemInDarkTheme()) { - Color.White - } else { - Color.Black - } AlertDialog( onDismissRequest = onClose, - backgroundColor = MaterialTheme.colorScheme.background, shape = RoundedCornerShape(12.dp), title = { - Box(modifier = Modifier.fillMaxWidth()) { - Text(text = "Compatible App Versions", color = color) - } + Text(stringResource(id = R.string.compatible_versions)) }, text = { patch.compatiblePackages!!.forEach { p: Package -> Text(p.versions.reversed().joinToString(", ")) } }, - buttons = { - Row( - modifier = Modifier.padding(all = 8.dp), - horizontalArrangement = Arrangement.Center - ) { - Button( - modifier = Modifier.fillMaxWidth(), - onClick = onClose - ) { - Text("Dismiss") - } + confirmButton = { + TextButton(onClick = onClose) { + Text(text = "Dismiss") } } ) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 8e51493ac8..8952e5cca1 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -6,7 +6,10 @@ import androidx.activity.ComponentActivity import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.* +import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.filled.Warning import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable @@ -140,7 +143,6 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () Text( text = name.replace("-", " ").split(" ") .joinToString(" ") { it.replaceFirstChar(Char::uppercase) }, -// color = Color.White, style = MaterialTheme.typography.titleMedium ) } @@ -175,28 +177,25 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () modifier = Modifier.padding(vertical = 8.dp), ) } - Column { - Row { - if (showDialog) { - PatchCompatibilityDialog(onClose = { showDialog = false }, patchClass = patchClass) + if (patchClass.unsupported) { + Column { + Row { + if (showDialog) { + PatchCompatibilityDialog(onClose = { showDialog = false }, patchClass = patchClass) + } + InputChip( + selected = false, + onClick = { showDialog = true }, + leadingIcon = { + Icon( + Icons.Default.Warning, + tint = MaterialTheme.colorScheme.primary, + contentDescription = stringResource(id = R.string.unsupported_version) + ) + }, + label = { Text(stringResource(id = R.string.unsupported_version)) } + ) } - InputChip( - selected = false, - onClick = { showDialog = true }, - leadingIcon = { - if (patchClass.unsupported) Icon( - Icons.Default.Warning, -// tint = Color.Yellow, - tint = MaterialTheme.colorScheme.primary, - contentDescription = stringResource(id = R.string.unsupported_version) - ) else Icon( - Icons.Default.Info, - tint = MaterialTheme.colorScheme.primary, - contentDescription = stringResource(id = R.string.version_info) - ) - }, - label = { Text(stringResource(id = R.string.supported_versions)) } - ) } } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5710eb15dd..3086309f53 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -60,7 +60,7 @@ Dropdown Button Version FAQ - Unsupported Version Version info - Supported Versions + Unsupported version + Compatible app versions \ No newline at end of file From 92aaea6e9f256f60c309e7cd59d03cb13c0ab814 Mon Sep 17 00:00:00 2001 From: Ushie Date: Thu, 14 Jul 2022 04:29:34 +0300 Subject: [PATCH 083/132] feat: use Text instead of ExpandableText for description --- .../app/revanced/manager/ui/screens/PatchesSelectorScreen.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 8952e5cca1..7a43fc9860 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -1,6 +1,5 @@ package app.revanced.manager.ui.screens -import ExpandingText import android.annotation.SuppressLint import androidx.activity.ComponentActivity import androidx.compose.foundation.layout.* @@ -172,7 +171,7 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () } } patch.description?.let { desc -> - ExpandingText( + Text( text = desc, modifier = Modifier.padding(vertical = 8.dp), ) From 3548ab9fce37e5b7e4d703705fc42332d1683595 Mon Sep 17 00:00:00 2001 From: Ushie Date: Thu, 14 Jul 2022 04:29:57 +0300 Subject: [PATCH 084/132] feat: move social media icons to the bottom --- .../main/java/app/revanced/manager/ui/screens/AboutScreen.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 8170e3d01f..003f0a8456 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -25,7 +25,7 @@ import com.ramcosta.composedestinations.annotation.RootNavGraph fun AboutScreen( // navigator: NavController, ) { - Column(Modifier.padding(8.dp)) { + Column(Modifier.padding(8.dp,8.dp,8.dp,20.dp)) { IconHeader() var currentUriHandler = LocalUriHandler.current @@ -54,6 +54,8 @@ fun AboutScreen( onClick = { currentUriHandler.openUri(websiteUrl) } ) + Spacer(Modifier.weight(1f)) + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { for ((social_ic, uri) in socialLinks.entries) { IconButton(onClick = { currentUriHandler.openUri(uri) }) { From edb56e9dfe61620c7c981a61defe1734432b6e42 Mon Sep 17 00:00:00 2001 From: baiorett Date: Fri, 15 Jul 2022 06:41:30 +0300 Subject: [PATCH 085/132] fix: hopefully now only correct values guyz untested fix at 6 am!!! i FOR SURE dont know if it will w --- .../manager/ui/screens/mainsubscreens/PatcherSubscreen.kt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt index fd750cf4af..87805e1793 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt @@ -189,11 +189,13 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { var unsupported = false patch.compatiblePackages?.forEach { pkg -> // if we detect unsupported once, don't overwrite it - if (pkg.name == selected.packageName && !unsupported) { - unsupported = pkg.versions.isNotEmpty() && !pkg.versions.any { it == selected.versionName } + if (pkg.name == selected.packageName) { + if (!unsupported) + unsupported = + pkg.versions.isNotEmpty() && !pkg.versions.any { it == selected.versionName } + add(PatchClass(patch, unsupported)) } } - add(PatchClass(patch, unsupported)) } } } From f31c45beecba38cec66bb8ded96d451b8a94c54d Mon Sep 17 00:00:00 2001 From: baiorett Date: Fri, 15 Jul 2022 18:56:11 +0300 Subject: [PATCH 086/132] fix: i --- app/build.gradle.kts | 4 ++ .../java/app/revanced/manager/MainActivity.kt | 22 ++++++- .../manager/backend/api/ManagerAPI.kt | 7 +- .../manager/ui/screens/SettingsScreen.kt | 65 +++++++++++++------ .../mainsubscreens/PatcherSubscreen.kt | 8 ++- 5 files changed, 76 insertions(+), 30 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 9ec24d2fbf..62ff972dde 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -116,6 +116,10 @@ dependencies { implementation("com.github.topjohnwu.libsu:core:4.0.3") implementation("com.github.topjohnwu.libsu:io:4.0.3") + // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + implementation("com.github.JamalMulla:ComposePrefs3:1.0.2") + implementation("androidx.datastore:datastore-preferences:1.0.0") + // Room implementation("androidx.room:room-runtime:$roomVersion") annotationProcessor("androidx.room:room-compiler:$roomVersion") diff --git a/app/src/main/java/app/revanced/manager/MainActivity.kt b/app/src/main/java/app/revanced/manager/MainActivity.kt index af6db6e444..97e258e507 100644 --- a/app/src/main/java/app/revanced/manager/MainActivity.kt +++ b/app/src/main/java/app/revanced/manager/MainActivity.kt @@ -1,5 +1,6 @@ package app.revanced.manager +import android.content.Context import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent @@ -9,29 +10,46 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect +import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier +import androidx.compose.ui.res.colorResource import androidx.compose.ui.tooling.preview.Preview +import androidx.datastore.core.DataStore +import androidx.datastore.preferences.core.Preferences +import androidx.datastore.preferences.core.booleanPreferencesKey +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.datastore.preferences.preferencesDataStore import app.revanced.manager.ui.screens.MainScreen import app.revanced.manager.ui.theme.ReVancedManagerTheme import com.google.accompanist.systemuicontroller.rememberSystemUiController +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map + +val Context.settings: DataStore by preferencesDataStore(name = "settings") class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + val darklight: Flow = baseContext.settings.data.map { preferences -> + preferences.get(booleanPreferencesKey("darklight")) ?: false + } setContent { - ReVancedManagerTheme { + val darklightstate = darklight.collectAsState(initial = false) + ReVancedManagerTheme(darkTheme = darklightstate.value) { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { val systemUiController = rememberSystemUiController() - val useDarkIcons = !isSystemInDarkTheme() + val useDarkIcons = !darklightstate.value val background = MaterialTheme.colorScheme.background SideEffect { systemUiController.setSystemBarsColor( color = background, darkIcons = useDarkIcons ) + } MainScreen() diff --git a/app/src/main/java/app/revanced/manager/backend/api/ManagerAPI.kt b/app/src/main/java/app/revanced/manager/backend/api/ManagerAPI.kt index 3d16fd1850..5f8c4535ec 100644 --- a/app/src/main/java/app/revanced/manager/backend/api/ManagerAPI.kt +++ b/app/src/main/java/app/revanced/manager/backend/api/ManagerAPI.kt @@ -28,11 +28,8 @@ val client = HttpClient(Android) { object ManagerAPI { private const val tag = "ManagerAPI" - suspend fun downloadPatches(workdir: File) = downloadAsset(workdir, findPatchesAsset()) - suspend fun downloadIntegrations(workdir: File) = downloadAsset(workdir, findIntegrationsAsset()) - - private suspend fun findPatchesAsset() = findAsset(Global.ghPatches) - private suspend fun findIntegrationsAsset() = findAsset(Global.ghIntegrations) + suspend fun downloadPatches(workdir: File, asset: String) = downloadAsset(workdir, findAsset(asset)) + suspend fun downloadIntegrations(workdir: File, asset: String) = downloadAsset(workdir, findAsset(asset)) private suspend fun findAsset(repo: String): PatchesAsset { val release = GitHubAPI.Releases.latestRelease(repo) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt index ae4ea05112..e6c64383e3 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt @@ -7,41 +7,64 @@ import androidx.compose.foundation.layout.padding import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Switch import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember +import androidx.compose.runtime.* import androidx.compose.ui.Alignment +import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp +import androidx.datastore.preferences.core.stringPreferencesKey +import app.revanced.manager.Global +import app.revanced.manager.settings +import com.jamal.composeprefs3.ui.PrefsScreen +import com.jamal.composeprefs3.ui.prefs.CheckBoxPref +import com.jamal.composeprefs3.ui.prefs.EditTextPref +import com.jamal.composeprefs3.ui.prefs.SwitchPref import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph private const val tag = "SettingsScreen" +@OptIn(ExperimentalComposeUiApi::class) @Destination @RootNavGraph @Composable fun SettingsScreen( ) { - val checkedState = remember { mutableStateOf(true) } - - Row( - modifier = Modifier - .fillMaxWidth() - .padding(24.dp, 16.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Text( - text = "Change Theme", - style = MaterialTheme.typography.bodyLarge, - ) - Spacer(modifier = Modifier.weight(1f),) - Switch( - checked = checkedState.value, - onCheckedChange = { - checkedState.value = it + val data = LocalContext.current.settings.data + val prefs by remember { data }.collectAsState(initial = null) + PrefsScreen(dataStore = LocalContext.current.settings) { + prefsGroup("Appearance") { + prefsItem { + SwitchPref( + key = "darklight", + title = "Change Theme", + summary = "dark/lightie", + ) + } + } + prefsGroup("Sources") { + prefsItem { + EditTextPref( + key = "patches", + title = "Patches source", + summary = prefs?.get(stringPreferencesKey("patches")), + dialogTitle = "Patches source", + dialogMessage = "Specify where to grab patches.", + defaultValue = "${Global.ghPatches}", + ) + } + prefsItem { + EditTextPref( + key = "integrations", + title = "Integrations source", + summary = prefs?.get(stringPreferencesKey("integrations")), + dialogTitle = "Integrations source", + dialogMessage = "Specify where to grab integrations.", + defaultValue = "${Global.ghIntegrations}", + ) } - ) + } } } diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt index 87805e1793..af5f075ae9 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt @@ -18,6 +18,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.datastore.preferences.core.stringPreferencesKey import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel @@ -28,6 +29,7 @@ import app.revanced.manager.backend.utils.Aapt import app.revanced.manager.backend.utils.aligning.ZipAligner import app.revanced.manager.backend.utils.filesystem.ZipFileSystemUtils import app.revanced.manager.backend.utils.signing.Signer +import app.revanced.manager.settings import app.revanced.manager.ui.Resource import app.revanced.manager.ui.components.FloatingActionButton import app.revanced.manager.ui.screens.destinations.AppSelectorScreenDestination @@ -42,6 +44,8 @@ import app.revanced.patcher.util.patch.implementation.DexPatchBundle import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph import dalvik.system.DexClassLoader +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map import kotlinx.coroutines.launch import java.io.File import java.util.* @@ -202,7 +206,7 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { private suspend fun downloadDefaultPatchBundle(workdir: File): File { return try { - val (_, out) = ManagerAPI.downloadPatches(workdir) + val (_, out) = ManagerAPI.downloadPatches(workdir, this.app.baseContext.settings.data.map { pref -> pref.get(stringPreferencesKey("patches")) }.first().toString()) out } catch (e: Exception) { throw Exception("Failed to download default patch bundle", e) @@ -211,7 +215,7 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { private suspend fun downloadIntegrations(workdir: File): File { return try { - val (_, out) = ManagerAPI.downloadIntegrations(workdir) + val (_, out) = ManagerAPI.downloadIntegrations(workdir, this.app.baseContext.settings.data.map { pref -> pref.get(stringPreferencesKey("integrations")) }.first().toString()) out } catch (e: Exception) { throw Exception("Failed to download integrations", e) From 65c7da4162c72a142dac216d509333a0637ff361 Mon Sep 17 00:00:00 2001 From: baiorett Date: Fri, 15 Jul 2022 19:08:55 +0300 Subject: [PATCH 087/132] fix: dark theme by default --- app/src/main/java/app/revanced/manager/MainActivity.kt | 8 +++----- build.gradle.kts | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/MainActivity.kt b/app/src/main/java/app/revanced/manager/MainActivity.kt index 97e258e507..686b0d202a 100644 --- a/app/src/main/java/app/revanced/manager/MainActivity.kt +++ b/app/src/main/java/app/revanced/manager/MainActivity.kt @@ -30,12 +30,12 @@ val Context.settings: DataStore by preferencesDataStore(name = "set class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) val darklight: Flow = baseContext.settings.data.map { preferences -> - preferences.get(booleanPreferencesKey("darklight")) ?: false + preferences.get(booleanPreferencesKey("darklight")) ?: true } + super.onCreate(savedInstanceState) setContent { - val darklightstate = darklight.collectAsState(initial = false) + val darklightstate = darklight.collectAsState(initial = true) ReVancedManagerTheme(darkTheme = darklightstate.value) { Surface( modifier = Modifier.fillMaxSize(), @@ -49,9 +49,7 @@ class MainActivity : ComponentActivity() { color = background, darkIcons = useDarkIcons ) - } - MainScreen() } } diff --git a/build.gradle.kts b/build.gradle.kts index d9121fb862..212baa260c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,8 +12,8 @@ buildscript { } plugins { - id("com.android.application") version "7.4.0-alpha08" apply false - id("com.android.library") version "7.4.0-alpha08" apply false + id("com.android.application") version "7.4.0-alpha06" apply false + id("com.android.library") version "7.4.0-alpha06" apply false id("org.jetbrains.kotlin.android") version "1.6.21" apply false id("com.google.devtools.ksp") version "1.6.21-+" apply false } From 5205250b0c2242da547e178cc4c1dca353cc2f9f Mon Sep 17 00:00:00 2001 From: baiorett Date: Fri, 15 Jul 2022 19:34:33 +0300 Subject: [PATCH 088/132] fix: you've been trolled you've been trolled yes you probably been told --- app/src/main/java/app/revanced/manager/MainActivity.kt | 2 +- .../manager/ui/screens/mainsubscreens/PatcherSubscreen.kt | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/MainActivity.kt b/app/src/main/java/app/revanced/manager/MainActivity.kt index 686b0d202a..8a1b2ae0e5 100644 --- a/app/src/main/java/app/revanced/manager/MainActivity.kt +++ b/app/src/main/java/app/revanced/manager/MainActivity.kt @@ -35,7 +35,7 @@ class MainActivity : ComponentActivity() { } super.onCreate(savedInstanceState) setContent { - val darklightstate = darklight.collectAsState(initial = true) + val darklightstate = darklight.collectAsState(initial = isSystemInDarkTheme()) ReVancedManagerTheme(darkTheme = darklightstate.value) { Surface( modifier = Modifier.fillMaxSize(), diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt index af5f075ae9..8b2723b9d8 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt @@ -23,6 +23,7 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController +import app.revanced.manager.Global import app.revanced.manager.R import app.revanced.manager.backend.api.ManagerAPI import app.revanced.manager.backend.utils.Aapt @@ -206,7 +207,7 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { private suspend fun downloadDefaultPatchBundle(workdir: File): File { return try { - val (_, out) = ManagerAPI.downloadPatches(workdir, this.app.baseContext.settings.data.map { pref -> pref.get(stringPreferencesKey("patches")) }.first().toString()) + val (_, out) = ManagerAPI.downloadPatches(workdir, this.app.baseContext.settings.data.map { pref -> pref.get(stringPreferencesKey("patches")) ?: Global.ghPatches }.first()) out } catch (e: Exception) { throw Exception("Failed to download default patch bundle", e) @@ -215,7 +216,7 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { private suspend fun downloadIntegrations(workdir: File): File { return try { - val (_, out) = ManagerAPI.downloadIntegrations(workdir, this.app.baseContext.settings.data.map { pref -> pref.get(stringPreferencesKey("integrations")) }.first().toString()) + val (_, out) = ManagerAPI.downloadIntegrations(workdir, this.app.baseContext.settings.data.map { pref -> pref.get(stringPreferencesKey("integrations")) ?: Global.ghIntegrations }.first()) out } catch (e: Exception) { throw Exception("Failed to download integrations", e) From 6dfcca8876ce325139880479e4e669eb69678645 Mon Sep 17 00:00:00 2001 From: Ushie Date: Fri, 15 Jul 2022 21:10:12 +0300 Subject: [PATCH 089/132] feat: disable selection of unsupported card --- .../manager/ui/screens/PatchesSelectorScreen.kt | 10 ++++++++-- build.gradle.kts | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 7a43fc9860..30bcc87963 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import androidx.activity.ComponentActivity import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Clear @@ -14,8 +15,10 @@ import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController @@ -71,7 +74,8 @@ fun PatchesSelectorScreen( OutlinedTextField( modifier = Modifier .fillMaxWidth() - .padding(8.dp), + .padding(8.dp) + .clip(shape = RoundedCornerShape(12.dp)), value = query, onValueChange = { newValue -> query = newValue @@ -131,7 +135,8 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () ElevatedCard( modifier = Modifier .padding(16.dp, 4.dp), - onClick = { onSelected() } + enabled = !patchClass.unsupported, + onClick = onSelected ) { Column(modifier = Modifier.padding(12.dp, 12.dp, 12.dp, 12.dp)) { Row { @@ -163,6 +168,7 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () ) { CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) { Checkbox( + enabled = !patchClass.unsupported, checked = isSelected, onCheckedChange = { onSelected() } ) diff --git a/build.gradle.kts b/build.gradle.kts index 212baa260c..d9121fb862 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -12,8 +12,8 @@ buildscript { } plugins { - id("com.android.application") version "7.4.0-alpha06" apply false - id("com.android.library") version "7.4.0-alpha06" apply false + id("com.android.application") version "7.4.0-alpha08" apply false + id("com.android.library") version "7.4.0-alpha08" apply false id("org.jetbrains.kotlin.android") version "1.6.21" apply false id("com.google.devtools.ksp") version "1.6.21-+" apply false } From 61cce6147d834a2161f4488f07f85b0730176776 Mon Sep 17 00:00:00 2001 From: Ushie Date: Fri, 15 Jul 2022 21:13:18 +0300 Subject: [PATCH 090/132] fix: revert premature push for searchbar oops --- .../revanced/manager/ui/screens/PatchesSelectorScreen.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 30bcc87963..30c58d9c08 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -4,7 +4,6 @@ import android.annotation.SuppressLint import androidx.activity.ComponentActivity import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Clear @@ -15,10 +14,8 @@ import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController @@ -74,8 +71,7 @@ fun PatchesSelectorScreen( OutlinedTextField( modifier = Modifier .fillMaxWidth() - .padding(8.dp) - .clip(shape = RoundedCornerShape(12.dp)), + .padding(8.dp), value = query, onValueChange = { newValue -> query = newValue From db6f8061cf05e332613f392a5b2f023c87e19548 Mon Sep 17 00:00:00 2001 From: Ushie Date: Fri, 15 Jul 2022 21:35:09 +0300 Subject: [PATCH 091/132] feat: match searchbar roundness w rest of the UI --- .../app/revanced/manager/ui/screens/PatchesSelectorScreen.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 30c58d9c08..ee4cfece42 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -4,6 +4,7 @@ import android.annotation.SuppressLint import androidx.activity.ComponentActivity import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Check import androidx.compose.material.icons.filled.Clear @@ -72,6 +73,7 @@ fun PatchesSelectorScreen( modifier = Modifier .fillMaxWidth() .padding(8.dp), + shape = RoundedCornerShape(12.dp), value = query, onValueChange = { newValue -> query = newValue From f7e2885fab624a4dceb905ffbc4b0161e6329ea5 Mon Sep 17 00:00:00 2001 From: Ushie Date: Sat, 16 Jul 2022 05:35:50 +0300 Subject: [PATCH 092/132] feat: add arrow to expandable description --- .../manager/ui/components/ExpandingText.kt | 48 ------------ .../ui/screens/PatchesSelectorScreen.kt | 77 +++++++++++++------ 2 files changed, 54 insertions(+), 71 deletions(-) delete mode 100644 app/src/main/java/app/revanced/manager/ui/components/ExpandingText.kt diff --git a/app/src/main/java/app/revanced/manager/ui/components/ExpandingText.kt b/app/src/main/java/app/revanced/manager/ui/components/ExpandingText.kt deleted file mode 100644 index 2d0fc1f6f6..0000000000 --- a/app/src/main/java/app/revanced/manager/ui/components/ExpandingText.kt +++ /dev/null @@ -1,48 +0,0 @@ -import androidx.compose.animation.animateContentSize -import androidx.compose.foundation.clickable -import androidx.compose.material3.Text -import androidx.compose.runtime.* -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.TextLayoutResult - -private const val MINIMIZED_MAX_LINES = 1 - -@Composable -fun ExpandingText(modifier: Modifier = Modifier, text: String) { - var isExpanded by remember { mutableStateOf(false) } - val textLayoutResultState = remember { mutableStateOf(null) } - var isClickable by remember { mutableStateOf(false) } - var finalText by remember { mutableStateOf(text) } - - val textLayoutResult = textLayoutResultState.value - LaunchedEffect(textLayoutResult) { - if (textLayoutResult == null) return@LaunchedEffect - - when { - isExpanded -> { - finalText = "$text" - } - !isExpanded && textLayoutResult.hasVisualOverflow -> { - val lastCharIndex = textLayoutResult.getLineEnd(MINIMIZED_MAX_LINES - 1) - val showMoreString = "..." - val adjustedText = text - .substring(startIndex = 0, endIndex = lastCharIndex) - .dropLast(showMoreString.length) - .dropLastWhile { it == ' ' || it == '.' } - - finalText = "$adjustedText$showMoreString" - - isClickable = true - } - } - } - - Text( - text = finalText, - maxLines = if (isExpanded) Int.MAX_VALUE else MINIMIZED_MAX_LINES, - onTextLayout = { textLayoutResultState.value = it }, - modifier = modifier - .clickable(enabled = isClickable) { isExpanded = !isExpanded } - .animateContentSize(), - ) -} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index ee4cfece42..fb68a0c084 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -2,21 +2,29 @@ package app.revanced.manager.ui.screens import android.annotation.SuppressLint import androidx.activity.ComponentActivity +import androidx.compose.animation.animateContentSize +import androidx.compose.animation.core.LinearOutSlowInEasing +import androidx.compose.animation.core.animateFloatAsState +import androidx.compose.animation.core.tween +import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.ContentAlpha import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Check -import androidx.compose.material.icons.filled.Clear -import androidx.compose.material.icons.filled.Search -import androidx.compose.material.icons.filled.Warning +import androidx.compose.material.icons.filled.* import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.rotate import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.TextLayoutResult +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController @@ -154,7 +162,7 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () .align(Alignment.CenterVertically) ) { Text( - text = patch.version ?: "unknown", + text = patch.version ?: "unknown", style = Typography.bodySmall ) } @@ -174,29 +182,52 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () } } } + var isExpanded by remember { mutableStateOf(false) } + var isOverflowed by remember { mutableStateOf(false) } patch.description?.let { desc -> Text( text = desc, - modifier = Modifier.padding(vertical = 8.dp), + modifier = Modifier + .padding(vertical = 8.dp) + // The condition here is to prevent the text being clickable if it's not overflowing + .clickable { if(isOverflowed || isExpanded) isExpanded = !isExpanded }, + maxLines = if (isExpanded) Int.MAX_VALUE else 1, + // kill me + onTextLayout = {result -> isOverflowed = result.hasVisualOverflow }, + overflow = TextOverflow.Ellipsis ) } - if (patchClass.unsupported) { - Column { - Row { - if (showDialog) { - PatchCompatibilityDialog(onClose = { showDialog = false }, patchClass = patchClass) - } - InputChip( - selected = false, - onClick = { showDialog = true }, - leadingIcon = { - Icon( - Icons.Default.Warning, - tint = MaterialTheme.colorScheme.primary, - contentDescription = stringResource(id = R.string.unsupported_version) - ) - }, - label = { Text(stringResource(id = R.string.unsupported_version)) } + Row { + if (patchClass.unsupported) { + if (showDialog) PatchCompatibilityDialog( + onClose = { showDialog = false }, + patchClass = patchClass + ) + InputChip( + selected = false, + onClick = { showDialog = true }, + leadingIcon = { + Icon( + Icons.Default.Warning, + tint = MaterialTheme.colorScheme.primary, + contentDescription = stringResource(id = R.string.unsupported_version) + ) + }, + label = { Text(stringResource(id = R.string.unsupported_version)) } + ) + } + Spacer(Modifier.weight(1f)) + // Condition to hide the arrow if there's no overflowing description (isExpanded is necessary to keep the arrow when description is Expanded, as it's no longer considered to be overflowing) + if (isOverflowed || isExpanded) { + val rotateState by animateFloatAsState(targetValue = if (isExpanded) 180f else 0f) + IconButton( + modifier = Modifier + .rotate(rotateState), + onClick = { isExpanded = !isExpanded } + ) { + Icon( + imageVector = Icons.Default.ArrowDropDown, + contentDescription = stringResource(id = R.string.dropdown_button) ) } } From 169cc8e90778204957782e0c909e7bb2c20e889e Mon Sep 17 00:00:00 2001 From: Ushie Date: Sat, 16 Jul 2022 20:48:32 +0300 Subject: [PATCH 093/132] revert removing contributors & remove expand arrow --- .../manager/ui/components/ContributorsCard.kt | 75 +++++++++++++++++ .../ui/models/ContributorsViewModel.kt | 56 +++++++++++++ .../manager/ui/screens/AboutScreen.kt | 6 +- .../manager/ui/screens/ContributorsScreen.kt | 83 +++++++++++++++++++ .../revanced/manager/ui/screens/MainScreen.kt | 15 ++++ .../ui/screens/PatchesSelectorScreen.kt | 58 +++++-------- .../mainsubscreens/DashboardSubscreen.kt | 7 +- 7 files changed, 255 insertions(+), 45 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt create mode 100644 app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt create mode 100644 app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt diff --git a/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt new file mode 100644 index 0000000000..e5b87f7f53 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt @@ -0,0 +1,75 @@ +package app.revanced.manager.ui.components + +import android.util.Log +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.grid.GridCells +import androidx.compose.foundation.lazy.grid.LazyVerticalGrid +import androidx.compose.foundation.lazy.grid.items +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.runtime.snapshots.SnapshotStateList +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import app.revanced.manager.R +import app.revanced.manager.backend.api.GitHubAPI +import coil.compose.AsyncImage + + +private const val tag = "Expandable Card" + +@Composable +@ExperimentalMaterial3Api +fun ContributorsCard( + title: String, + size: Int, + data: SnapshotStateList, +) { + Column( + Modifier.padding(horizontal = 8.dp, vertical = 8.dp).fillMaxWidth() + ) { + Text( + text = title, + modifier = Modifier.fillMaxWidth().align(Alignment.CenterHorizontally).padding(8.dp), + fontSize = MaterialTheme.typography.titleLarge.fontSize, + fontWeight = FontWeight.Bold, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + style = MaterialTheme.typography.titleLarge + ) + + if (data.isNotEmpty()) { + val currentUriHandler = LocalUriHandler.current + + LazyVerticalGrid( + columns = GridCells.Adaptive(48.dp), + verticalArrangement = Arrangement.spacedBy(4.dp), + horizontalArrangement = Arrangement.spacedBy(4.dp), + modifier = Modifier.height(size.dp), + userScrollEnabled = false + ) { + items(data) { contributor -> + AsyncImage( + model = contributor.avatar_url, + contentDescription = stringResource(id = R.string.contributor_image), + Modifier + .padding(4.dp) + .size(40.dp) + .clip(CircleShape) + .clickable { + currentUriHandler.openUri(contributor.url) + } + ) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt b/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt new file mode 100644 index 0000000000..22aa18c30f --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt @@ -0,0 +1,56 @@ +package app.revanced.manager.ui.models + +import androidx.compose.runtime.mutableStateListOf +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import app.revanced.manager.backend.api.GitHubAPI +import kotlinx.coroutines.launch + +class ContributorsViewModel : ViewModel() { + private val tag = "ContributorsViewModel" + + val patcherContributorsList = mutableStateListOf() + val patchesContributorsList = mutableStateListOf() + val cliContributorsList = mutableStateListOf() + val managerContributorsList = mutableStateListOf() + val integrationsContributorsList = mutableStateListOf() + + fun loadContributors() { + viewModelScope.launch { + val cliContributors = GitHubAPI.Contributors.contributors("revanced","revanced-cli") + cliContributors.sortedByDescending { + it.login + } + cliContributorsList.addAll(cliContributors) + + val patcherContributors = GitHubAPI.Contributors.contributors("revanced","revanced-patcher") + patcherContributors.sortedByDescending { + it.login + } + patcherContributorsList.addAll(patcherContributors) + + val patchesContributors = GitHubAPI.Contributors.contributors("revanced","revanced-patches") + patchesContributors.sortedByDescending { + it.login + } + patchesContributorsList.addAll(patchesContributors) + + val managerContributors = GitHubAPI.Contributors.contributors("Aunali321","revanced-manager") + managerContributors.sortedByDescending { + it.login + } + managerContributorsList.addAll(managerContributors) + + val integrationsContributors = GitHubAPI.Contributors.contributors("revanced","revanced-integrations") + integrationsContributors.sortedByDescending { + it.login + } + integrationsContributorsList.addAll(integrationsContributors) + } + } + + init { + loadContributors() + } + +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 003f0a8456..e9d21c897b 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -11,11 +11,13 @@ import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import androidx.navigation.NavController import app.revanced.manager.BuildConfig import app.revanced.manager.Global.Companion.socialLinks import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R import app.revanced.manager.ui.components.* +import app.revanced.manager.ui.screens.destinations.ContributorsScreenDestination import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph @@ -23,7 +25,7 @@ import com.ramcosta.composedestinations.annotation.RootNavGraph @RootNavGraph @Composable fun AboutScreen( - // navigator: NavController, + navigator: NavController, ) { Column(Modifier.padding(8.dp,8.dp,8.dp,20.dp)) { IconHeader() @@ -46,7 +48,7 @@ fun AboutScreen( PreferenceRow( title = stringResource(R.string.card_contributors_header), painter = painterResource(id = R.drawable.ic_baseline_favorite_24), - onClick = { currentUriHandler.openUri("${websiteUrl}/github") } + onClick = { navigator.navigate(ContributorsScreenDestination().route) } ) PreferenceRow( title = stringResource(R.string.help_translate), diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt new file mode 100644 index 0000000000..c25460737b --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -0,0 +1,83 @@ +package app.revanced.manager.ui.screens + +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.platform.LocalUriHandler +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import androidx.lifecycle.viewmodel.compose.viewModel +import app.revanced.manager.Global.Companion.websiteUrl +import app.revanced.manager.R +import app.revanced.manager.ui.components.ContributorsCard +import app.revanced.manager.ui.components.IconHeader +import app.revanced.manager.ui.models.ContributorsViewModel +import com.ramcosta.composedestinations.annotation.Destination +import com.ramcosta.composedestinations.annotation.RootNavGraph + +private const val tag = "ContributorsScreen" + +@OptIn(ExperimentalMaterial3Api::class) +@Destination +@RootNavGraph +@Composable +fun ContributorsScreen( +// navigator: NavController, + vm: ContributorsViewModel = viewModel() +) { + Column( + Modifier + .padding(8.dp) + .height(1400.dp) + .verticalScroll(rememberScrollState()) + ) { + ContributorsCard( + stringResource(R.string.cli_contributors), + data = vm.cliContributorsList, + size = 100 + ) + ContributorsCard( + stringResource(R.string.patcher_contributors), + data = vm.patcherContributorsList, + size = 100 + ) + ContributorsCard( + stringResource(R.string.patches_contributors), + data = vm.patchesContributorsList, + size = 150 + ) + ContributorsCard( + stringResource(R.string.manager_contributors), + data = vm.managerContributorsList, + size = 100 + ) + ContributorsCard( + stringResource(R.string.integrations_contributors), + data = vm.integrationsContributorsList, + size = 200 + ) + + val currentUriHandler = LocalUriHandler.current + + Spacer(Modifier.weight(1f, true)) + + Button( + modifier = Modifier + .fillMaxWidth() + .padding(top = 10.dp), + onClick = { currentUriHandler.openUri("${websiteUrl}/github") } + ) { + Icon( + painter = painterResource(id = R.drawable.ic_github_24), + contentDescription = "GitHub Link" + ) + Spacer(Modifier.padding(4.dp)) + Text(text = "GitHub") + } + } +} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index c2d0cb5437..66e97a06e2 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -85,6 +85,19 @@ fun MainScreen() { } ) } + ContributorsScreenDestination -> { + AppBar( + title = { Text(text = "Contributors") }, + navigationIcon = { + IconButton(onClick = { navController.navigateUp() }) { + androidx.compose.material3.Icon( + imageVector = Icons.Default.ArrowBack, + contentDescription = "Return" + ) + } + } + ) + } else -> { val currentUriHandler = LocalUriHandler.current @@ -104,6 +117,8 @@ fun MainScreen() { navController.appCurrentDestinationAsState().value != SettingsScreenDestination && navController.appCurrentDestinationAsState().value != AboutScreenDestination + && + navController.appCurrentDestinationAsState().value != ContributorsScreenDestination ) BottomNavBar(navController) }, content = { innerPadding -> diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index fb68a0c084..108f558f1a 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -183,51 +183,33 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () } } var isExpanded by remember { mutableStateOf(false) } - var isOverflowed by remember { mutableStateOf(false) } patch.description?.let { desc -> Text( text = desc, modifier = Modifier - .padding(vertical = 8.dp) - // The condition here is to prevent the text being clickable if it's not overflowing - .clickable { if(isOverflowed || isExpanded) isExpanded = !isExpanded }, + .padding(0.dp, 8.dp, 22.dp, 8.dp) + .clickable { isExpanded = !isExpanded }, maxLines = if (isExpanded) Int.MAX_VALUE else 1, - // kill me - onTextLayout = {result -> isOverflowed = result.hasVisualOverflow }, - overflow = TextOverflow.Ellipsis + overflow = TextOverflow.Ellipsis, ) } - Row { - if (patchClass.unsupported) { - if (showDialog) PatchCompatibilityDialog( - onClose = { showDialog = false }, - patchClass = patchClass - ) - InputChip( - selected = false, - onClick = { showDialog = true }, - leadingIcon = { - Icon( - Icons.Default.Warning, - tint = MaterialTheme.colorScheme.primary, - contentDescription = stringResource(id = R.string.unsupported_version) - ) - }, - label = { Text(stringResource(id = R.string.unsupported_version)) } - ) - } - Spacer(Modifier.weight(1f)) - // Condition to hide the arrow if there's no overflowing description (isExpanded is necessary to keep the arrow when description is Expanded, as it's no longer considered to be overflowing) - if (isOverflowed || isExpanded) { - val rotateState by animateFloatAsState(targetValue = if (isExpanded) 180f else 0f) - IconButton( - modifier = Modifier - .rotate(rotateState), - onClick = { isExpanded = !isExpanded } - ) { - Icon( - imageVector = Icons.Default.ArrowDropDown, - contentDescription = stringResource(id = R.string.dropdown_button) + if (patchClass.unsupported) { + Column { + Row { + if (showDialog) { + PatchCompatibilityDialog(onClose = { showDialog = false }, patchClass = patchClass) + } + InputChip( + selected = false, + onClick = { showDialog = true }, + leadingIcon = { + Icon( + Icons.Default.Warning, + tint = MaterialTheme.colorScheme.primary, + contentDescription = stringResource(id = R.string.unsupported_version) + ) + }, + label = { Text(stringResource(id = R.string.unsupported_version)) } ) } } diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt index a77fb2ec84..0fd139afff 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/DashboardSubscreen.kt @@ -7,15 +7,14 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R import app.revanced.manager.ui.models.DashboardViewModel +import app.revanced.manager.ui.screens.destinations.ContributorsScreenDestination import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph @@ -27,8 +26,6 @@ fun DashboardSubscreen( navigator: NavController, vm: DashboardViewModel = viewModel() ) { - var currentUriHandler = LocalUriHandler.current - Column(modifier = Modifier.padding(16.dp)) { Card( modifier = Modifier @@ -86,7 +83,7 @@ fun DashboardSubscreen( } } Card( - onClick = { currentUriHandler.openUri("${websiteUrl}/github") }, + onClick = { navigator.navigate(ContributorsScreenDestination().route) }, modifier = Modifier .padding(4.dp) .weight(1f) From 4d8ee7cdf8505f1421823994581079efcc6fb7de Mon Sep 17 00:00:00 2001 From: Ushie Date: Sat, 16 Jul 2022 20:48:57 +0300 Subject: [PATCH 094/132] feat: change description text style --- .../app/revanced/manager/ui/screens/PatchesSelectorScreen.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 108f558f1a..3d541fd37d 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -191,6 +191,7 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () .clickable { isExpanded = !isExpanded }, maxLines = if (isExpanded) Int.MAX_VALUE else 1, overflow = TextOverflow.Ellipsis, + style = MaterialTheme.typography.bodyMedium ) } if (patchClass.unsupported) { From 811a0f704a29423b01d88a925bbaf23c60349a74 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Sun, 17 Jul 2022 01:33:07 +0530 Subject: [PATCH 095/132] feat: load contributors in another thread. --- .gitignore | 1 + .../ui/models/ContributorsViewModel.kt | 62 +++++++++++-------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index bbf870ee3f..786af17bdb 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,4 @@ lint/generated/ lint/outputs/ lint/tmp/ *.hprof +/.idea/deploymentTargetDropDown.xml diff --git a/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt b/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt index 22aa18c30f..46d9d29424 100644 --- a/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt @@ -4,7 +4,10 @@ import androidx.compose.runtime.mutableStateListOf import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import app.revanced.manager.backend.api.GitHubAPI +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext class ContributorsViewModel : ViewModel() { private val tag = "ContributorsViewModel" @@ -15,42 +18,47 @@ class ContributorsViewModel : ViewModel() { val managerContributorsList = mutableStateListOf() val integrationsContributorsList = mutableStateListOf() - fun loadContributors() { - viewModelScope.launch { - val cliContributors = GitHubAPI.Contributors.contributors("revanced","revanced-cli") - cliContributors.sortedByDescending { - it.login - } - cliContributorsList.addAll(cliContributors) + suspend fun loadContributors() { + withContext(Dispatchers.IO){ + viewModelScope.launch { + val cliContributors = GitHubAPI.Contributors.contributors("revanced","revanced-cli") + cliContributors.sortedByDescending { + it.login + } + cliContributorsList.addAll(cliContributors) - val patcherContributors = GitHubAPI.Contributors.contributors("revanced","revanced-patcher") - patcherContributors.sortedByDescending { - it.login - } - patcherContributorsList.addAll(patcherContributors) + val patcherContributors = GitHubAPI.Contributors.contributors("revanced","revanced-patcher") + patcherContributors.sortedByDescending { + it.login + } + patcherContributorsList.addAll(patcherContributors) - val patchesContributors = GitHubAPI.Contributors.contributors("revanced","revanced-patches") - patchesContributors.sortedByDescending { - it.login - } - patchesContributorsList.addAll(patchesContributors) + val patchesContributors = GitHubAPI.Contributors.contributors("revanced","revanced-patches") + patchesContributors.sortedByDescending { + it.login + } + patchesContributorsList.addAll(patchesContributors) - val managerContributors = GitHubAPI.Contributors.contributors("Aunali321","revanced-manager") - managerContributors.sortedByDescending { - it.login - } - managerContributorsList.addAll(managerContributors) + val managerContributors = GitHubAPI.Contributors.contributors("Aunali321","revanced-manager") + managerContributors.sortedByDescending { + it.login + } + managerContributorsList.addAll(managerContributors) - val integrationsContributors = GitHubAPI.Contributors.contributors("revanced","revanced-integrations") - integrationsContributors.sortedByDescending { - it.login + val integrationsContributors = GitHubAPI.Contributors.contributors("revanced","revanced-integrations") + integrationsContributors.sortedByDescending { + it.login + } + integrationsContributorsList.addAll(integrationsContributors) } - integrationsContributorsList.addAll(integrationsContributors) + } } init { - loadContributors() + GlobalScope.launch { + loadContributors() + } } } \ No newline at end of file From 017651b055bc167a2d572cfe0ca9a52e852d7f66 Mon Sep 17 00:00:00 2001 From: Ushie Date: Mon, 18 Jul 2022 07:10:26 +0300 Subject: [PATCH 096/132] feat: splashscreen Co-authored by: (zt) Nick --- app/build.gradle.kts | 2 + app/src/main/AndroidManifest.xml | 16 +++---- .../java/app/revanced/manager/MainActivity.kt | 42 +++++++++---------- .../java/app/revanced/manager/ShellHeater.kt | 29 ------------- .../app/revanced/manager/ui/theme/Theme.kt | 18 ++++---- app/src/main/res/values/themes.xml | 5 ++- 6 files changed, 39 insertions(+), 73 deletions(-) delete mode 100644 app/src/main/java/app/revanced/manager/ShellHeater.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 62ff972dde..ecb8d862fd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -96,6 +96,8 @@ dependencies { implementation("androidx.compose.ui:ui:$composeVersion") implementation("androidx.compose.ui:ui-tooling-preview:$composeVersion") implementation("androidx.navigation:navigation-compose:2.5.0") + implementation("androidx.appcompat:appcompat:1.4.2") + implementation("androidx.core:core-splashscreen:1.0.0-rc01") // ReVanced implementation("app.revanced:revanced-patcher:2.4.0") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 4fba1c451d..7e948646ad 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,7 +2,8 @@ - @@ -22,17 +23,17 @@ @@ -41,11 +42,6 @@ - - \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/MainActivity.kt b/app/src/main/java/app/revanced/manager/MainActivity.kt index 8a1b2ae0e5..da45cb373a 100644 --- a/app/src/main/java/app/revanced/manager/MainActivity.kt +++ b/app/src/main/java/app/revanced/manager/MainActivity.kt @@ -8,59 +8,55 @@ import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface -import androidx.compose.runtime.Composable -import androidx.compose.runtime.SideEffect import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier -import androidx.compose.ui.res.colorResource -import androidx.compose.ui.tooling.preview.Preview +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences import androidx.datastore.preferences.core.booleanPreferencesKey -import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore import app.revanced.manager.ui.screens.MainScreen import app.revanced.manager.ui.theme.ReVancedManagerTheme -import com.google.accompanist.systemuicontroller.rememberSystemUiController +import com.topjohnwu.superuser.Shell import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map val Context.settings: DataStore by preferencesDataStore(name = "settings") class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { + installSplashScreen() + + super.onCreate(savedInstanceState) + val darklight: Flow = baseContext.settings.data.map { preferences -> preferences.get(booleanPreferencesKey("darklight")) ?: true } - super.onCreate(savedInstanceState) + + Shell.getShell() + setContent { val darklightstate = darklight.collectAsState(initial = isSystemInDarkTheme()) + ReVancedManagerTheme(darkTheme = darklightstate.value) { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { - val systemUiController = rememberSystemUiController() - val useDarkIcons = !darklightstate.value - val background = MaterialTheme.colorScheme.background - SideEffect { - systemUiController.setSystemBarsColor( - color = background, - darkIcons = useDarkIcons - ) - } MainScreen() } } } } -} -@Preview -@Composable -fun FullPreview() { - ReVancedManagerTheme { - MainScreen() + companion object { + init { + Shell.enableVerboseLogging = BuildConfig.DEBUG + Shell.setDefaultBuilder( + Shell.Builder.create() + .setFlags(Shell.FLAG_REDIRECT_STDERR) + .setTimeout(10) + ) + } } } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ShellHeater.kt b/app/src/main/java/app/revanced/manager/ShellHeater.kt deleted file mode 100644 index 2d714f5542..0000000000 --- a/app/src/main/java/app/revanced/manager/ShellHeater.kt +++ /dev/null @@ -1,29 +0,0 @@ -package app.revanced.manager - -import android.content.Intent -import android.os.Bundle -import androidx.activity.ComponentActivity -import com.topjohnwu.superuser.Shell - -class ShellHeater : ComponentActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - - Shell.getShell { - val intent = Intent(this, MainActivity::class.java) - startActivity(intent) - finish() - } - } - - companion object { - init { - Shell.enableVerboseLogging = BuildConfig.DEBUG - Shell.setDefaultBuilder( - Shell.Builder.create() - .setFlags(Shell.FLAG_REDIRECT_STDERR) - .setTimeout(10) - ) - } - } -} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/theme/Theme.kt b/app/src/main/java/app/revanced/manager/ui/theme/Theme.kt index 3dacb8e417..7e6aa5ee5a 100644 --- a/app/src/main/java/app/revanced/manager/ui/theme/Theme.kt +++ b/app/src/main/java/app/revanced/manager/ui/theme/Theme.kt @@ -1,15 +1,12 @@ package app.revanced.manager.ui.theme -import android.app.Activity import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect -import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalView -import androidx.core.view.ViewCompat +import com.google.accompanist.systemuicontroller.rememberSystemUiController private val DarkColorScheme = darkColorScheme( primary = Purple80, @@ -48,12 +45,13 @@ fun ReVancedManagerTheme( darkTheme -> DarkColorScheme else -> LightColorScheme } - val view = LocalView.current - if (!view.isInEditMode) { - SideEffect { - (view.context as Activity).window.statusBarColor = colorScheme.primary.toArgb() - ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars = darkTheme - } + val systemUiController = rememberSystemUiController() + + SideEffect { + systemUiController.setSystemBarsColor( + color = colorScheme.background, + darkIcons = !darkTheme + ) } MaterialTheme( diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 66a08e1566..25bde821a6 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,5 +1,8 @@ - \ No newline at end of file From a2c9b27411d5e20d11611f23dde26e37f2f9d82e Mon Sep 17 00:00:00 2001 From: Ushie Date: Mon, 18 Jul 2022 18:59:00 +0300 Subject: [PATCH 097/132] feat: material you toggle in settings --- .../main/java/app/revanced/manager/MainActivity.kt | 11 ++++++++++- .../app/revanced/manager/ui/screens/SettingsScreen.kt | 8 +++++++- .../main/java/app/revanced/manager/ui/theme/Theme.kt | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/MainActivity.kt b/app/src/main/java/app/revanced/manager/MainActivity.kt index da45cb373a..5288bd7869 100644 --- a/app/src/main/java/app/revanced/manager/MainActivity.kt +++ b/app/src/main/java/app/revanced/manager/MainActivity.kt @@ -33,12 +33,21 @@ class MainActivity : ComponentActivity() { preferences.get(booleanPreferencesKey("darklight")) ?: true } + val dynamicColor: Flow = baseContext.settings.data.map { preferences -> + preferences.get(booleanPreferencesKey("dynamicTheming")) ?: true + } + Shell.getShell() setContent { val darklightstate = darklight.collectAsState(initial = isSystemInDarkTheme()) - ReVancedManagerTheme(darkTheme = darklightstate.value) { + val dynamicColorstate = dynamicColor.collectAsState(initial = true) + + ReVancedManagerTheme( + darkTheme = darklightstate.value, + dynamicColor = dynamicColorstate.value + ) { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background diff --git a/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt index e6c64383e3..f8ba592bee 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt @@ -36,11 +36,17 @@ fun SettingsScreen( val prefs by remember { data }.collectAsState(initial = null) PrefsScreen(dataStore = LocalContext.current.settings) { prefsGroup("Appearance") { + prefsItem { + SwitchPref( + key = "dynamicTheming", + title = "Material You", + ) + } prefsItem { SwitchPref( key = "darklight", title = "Change Theme", - summary = "dark/lightie", + summary = "Light/Dark", ) } } diff --git a/app/src/main/java/app/revanced/manager/ui/theme/Theme.kt b/app/src/main/java/app/revanced/manager/ui/theme/Theme.kt index 7e6aa5ee5a..316559536c 100644 --- a/app/src/main/java/app/revanced/manager/ui/theme/Theme.kt +++ b/app/src/main/java/app/revanced/manager/ui/theme/Theme.kt @@ -8,7 +8,7 @@ import androidx.compose.runtime.SideEffect import androidx.compose.ui.platform.LocalContext import com.google.accompanist.systemuicontroller.rememberSystemUiController -private val DarkColorScheme = darkColorScheme( +private val DarkColorScheme = darkColorScheme( primary = Purple80, secondary = PurpleGrey80, tertiary = Pink80 From 1209353a1b4e6cefd68919b7398a41d04a17316d Mon Sep 17 00:00:00 2001 From: Ushie Date: Tue, 19 Jul 2022 00:55:00 +0300 Subject: [PATCH 098/132] Revert "Merge branch 'patching-foreground-service' of https://github.com/danthe1st/revanced-manager" This reverts commit bceb864ab5c602c0f23c5369ec17d8387ee57f16, reversing changes made to a2c9b27411d5e20d11611f23dde26e37f2f9d82e. --- app/src/main/AndroidManifest.xml | 3 - .../PatcherForegroundService.kt | 192 ------------------ .../mainsubscreens/PatcherSubscreen.kt | 112 +++++++++- app/src/main/res/values/strings.xml | 2 - 4 files changed, 101 insertions(+), 208 deletions(-) delete mode 100644 app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherForegroundService.kt diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 8eea529626..7e948646ad 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,7 +11,6 @@ - @@ -43,8 +42,6 @@ - - \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherForegroundService.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherForegroundService.kt deleted file mode 100644 index 7290dc8570..0000000000 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherForegroundService.kt +++ /dev/null @@ -1,192 +0,0 @@ -package app.revanced.manager.ui.screens.mainsubscreens - -import android.app.* -import android.content.Intent -import android.os.IBinder -import android.util.Log -import androidx.compose.runtime.mutableStateListOf -import androidx.compose.runtime.mutableStateOf -import androidx.core.content.ContextCompat -import androidx.lifecycle.viewModelScope -import app.revanced.manager.R -import app.revanced.manager.backend.api.ManagerAPI -import app.revanced.manager.backend.utils.Aapt -import app.revanced.manager.backend.utils.aligning.ZipAligner -import app.revanced.manager.backend.utils.filesystem.ZipFileSystemUtils -import app.revanced.manager.backend.utils.signing.Signer -import app.revanced.manager.ui.Resource -import app.revanced.patcher.Patcher -import app.revanced.patcher.PatcherOptions -import app.revanced.patcher.data.Data -import app.revanced.patcher.extensions.PatchExtensions.patchName -import app.revanced.patcher.patch.Patch -import app.revanced.patcher.util.patch.implementation.DexPatchBundle -import dalvik.system.DexClassLoader -import kotlinx.coroutines.launch -import kotlinx.coroutines.runBlocking -import java.io.File -import java.lang.IllegalArgumentException - -class PatcherForegroundService : Service() { - - val patches = mutableStateOf>>>>(Resource.Loading) - val tag = "Patcher" - - override fun onCreate() { - super.onCreate() - val notificationIntent = Intent(this, PatcherForegroundService::class.java) - val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE) - val channel = - NotificationChannel("revanced-patcher-patching", - "Patching", - NotificationManager.IMPORTANCE_LOW) - val notificationManager = - ContextCompat.getSystemService(this, NotificationManager::class.java) - notificationManager!!.createNotificationChannel(channel) - val notification: Notification = Notification.Builder(this, channel.id) - .setContentTitle(getText(R.string.patcher_notification_title)) - .setContentText(getText(R.string.patcher_notification_message)) - //.setSmallIcon(R.drawable.icon) - .setContentIntent(pendingIntent) - .build() - - startForeground(1, notification) - } - - override fun onBind(intent: Intent?): IBinder? { - return null - } - - override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { - try { - val selectedPatches = intent.getStringArrayExtra("selectedPatches") - ?: throw IllegalArgumentException("selectedPatches is missing") - val patchBundleFile = intent.getStringExtra("patchBundleFile") - ?: throw IllegalArgumentException("patchBundleFile is missing") - runPatcher(selectedPatches.toList(), patchBundleFile) - }finally { - stopSelf() - } - return START_NOT_STICKY - } - - private fun runPatcher(selectedPatches: List, patchBundleFile: String): Boolean { - - val aaptPath = Aapt.binary(this).absolutePath - val frameworkPath = filesDir.resolve("framework").also { it.mkdirs() }.absolutePath - val integrationsCacheDir = filesDir.resolve("integrations-cache").also { it.mkdirs() } - - runBlocking { - loadPatches(patchBundleFile) - Log.d(tag, "Checking prerequisites") - val patches = findPatchesByIds(selectedPatches) - if (patches.isEmpty()) return@runBlocking true - val integrations = downloadIntegrations(integrationsCacheDir) - - Log.d(tag, "Creating directories") - val workdir = createWorkDir() - val inputFile = File(workdir.parentFile!!, "base.apk") - val patchedFile = File(workdir, "patched.apk") - val alignedFile = File(workdir, "aligned.apk") - val outputFile = File(workdir, "out.apk") - val cacheDirectory = workdir.resolve("cache") - - try { - // Log.d(tag, "Copying base.apk from ${info.packageName}") - // withContext(Dispatchers.IO) { - // Files.copy( - // File(info.publicSourceDir).toPath(), - // inputFile.toPath(), - // StandardCopyOption.REPLACE_EXISTING - // ) - // } - - Log.d(tag, "Creating patcher") - val patcher = Patcher( - PatcherOptions( - inputFile, - cacheDirectory.absolutePath, - patchResources = true, - aaptPath = aaptPath, - frameworkFolderLocation = frameworkPath - ) - ) - - Log.d(tag, "Merging integrations") - patcher.addFiles(listOf(integrations)) {} - - Log.d(tag, "Adding ${patches.size} patch(es)") - patcher.addPatches(patches) - - Log.d(tag, "Applying patches") - patcher.applyPatches().forEach { (patch, result) -> - if (result.isSuccess) { - Log.i(tag, "[success] $patch") - return@forEach - } - Log.e(tag, "[error] $patch:", result.exceptionOrNull()!!) - } - - Log.d(tag, "Saving file") - val result = patcher.save() - ZipFileSystemUtils(result.resourceFile!!, patchedFile).use { fs -> - result.dexFiles.forEach { fs.write(it.name, it.dexFileInputStream.readBytes()) } - fs.writeInput() - fs.uncompress(*result.doNotCompress!!.toTypedArray()) - } - - Log.d(tag, "Aligning apk") - ZipAligner.align(patchedFile, alignedFile) - Log.d(tag, "Signing apk") - Signer("ReVanced", "s3cur3p@ssw0rd").signApk(alignedFile, outputFile) - - // TODO: install apk! - Log.d(tag, "Installing apk") - } catch (e: Exception) { - Log.e(tag, "Error while patching", e) - } - - Log.d(tag, "Deleting workdir") - //workdir.deleteRecursively() - } - return false - } - - private fun createWorkDir(): File { - return filesDir.resolve("tmp-${System.currentTimeMillis()}").also { it.mkdirs() } - } - - private fun findPatchesByIds(ids: Iterable): List>> { - val (patches) = patches.value as? Resource.Success ?: return listOf() - return patches.filter { patch -> ids.any { it == patch.patchName } } - } - - private suspend fun downloadIntegrations(workdir: File): File { - return try { - val (_, out) = ManagerAPI.downloadIntegrations(workdir) - out - } catch (e: Exception) { - throw Exception("Failed to download integrations", e) - } - } - - private fun loadPatches(patchBundleFile: String) { - try { - loadPatches0(patchBundleFile) - } catch (e: Exception) { - Log.e(tag, "An error occurred while loading patches", e) - } - } - - private fun loadPatches0(path: String) { - val patchClasses = DexPatchBundle( - path, DexClassLoader( - path, - codeCacheDir.absolutePath, - null, - javaClass.classLoader - ) - ).loadPatches() - patches.value = Resource.Success(patchClasses) - } -} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt index db3e9329e9..8b2723b9d8 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt @@ -1,7 +1,6 @@ package app.revanced.manager.ui.screens.mainsubscreens import android.app.Application -import android.content.Intent import android.content.pm.PackageManager import android.util.Log import androidx.activity.ComponentActivity @@ -36,8 +35,11 @@ import app.revanced.manager.ui.Resource import app.revanced.manager.ui.components.FloatingActionButton import app.revanced.manager.ui.screens.destinations.AppSelectorScreenDestination import app.revanced.manager.ui.screens.destinations.PatchesSelectorScreenDestination +import app.revanced.patcher.Patcher +import app.revanced.patcher.PatcherOptions import app.revanced.patcher.data.Data import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages +import app.revanced.patcher.extensions.PatchExtensions.patchName import app.revanced.patcher.patch.Patch import app.revanced.patcher.util.patch.implementation.DexPatchBundle import com.ramcosta.composedestinations.annotation.Destination @@ -49,7 +51,6 @@ import kotlinx.coroutines.launch import java.io.File import java.util.* - private const val tag = "PatcherScreen" @OptIn(ExperimentalMaterial3Api::class) @@ -58,7 +59,7 @@ private const val tag = "PatcherScreen" @Composable fun PatcherSubscreen( navigator: NavController, - vm: PatcherViewModel = viewModel(LocalContext.current as ComponentActivity), + vm: PatcherViewModel = viewModel(LocalContext.current as ComponentActivity) ) { val selectedAppPackage by vm.selectedAppPackage val hasAppSelected = selectedAppPackage.isPresent @@ -131,16 +132,18 @@ fun PatcherSubscreen( data class PatchClass( val patch: Class>, - val unsupported: Boolean, + val unsupported: Boolean ) class PatcherViewModel(val app: Application) : AndroidViewModel(app) { + private val aaptPath = Aapt.binary(app).absolutePath private val bundleCacheDir = app.filesDir.resolve("bundle-cache").also { it.mkdirs() } + private val frameworkPath = app.filesDir.resolve("framework").also { it.mkdirs() }.absolutePath + private val integrationsCacheDir = app.filesDir.resolve("integrations-cache").also { it.mkdirs() } val selectedAppPackage = mutableStateOf(Optional.empty()) private val selectedPatches = mutableStateListOf() val patches = mutableStateOf>>>>(Resource.Loading) - lateinit var patchBundleFile: String init { loadPatches() @@ -170,7 +173,10 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { return !selectedPatches.isEmpty() } - + private fun findPatchesByIds(ids: Iterable): List>> { + val (patches) = patches.value as? Resource.Success ?: return listOf() + return patches.filter { patch -> ids.any { it == patch.patchName } } + } private fun getSelectedPackageInfo() = if (selectedAppPackage.value.isPresent) @@ -208,10 +214,18 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { } } + private suspend fun downloadIntegrations(workdir: File): File { + return try { + val (_, out) = ManagerAPI.downloadIntegrations(workdir, this.app.baseContext.settings.data.map { pref -> pref.get(stringPreferencesKey("integrations")) ?: Global.ghIntegrations }.first()) + out + } catch (e: Exception) { + throw Exception("Failed to download integrations", e) + } + } + private fun loadPatches() = viewModelScope.launch { try { val file = downloadDefaultPatchBundle(bundleCacheDir) - patchBundleFile=file.absolutePath loadPatches0(file.absolutePath) } catch (e: Exception) { Log.e(tag, "An error occurred while loading patches", e) @@ -230,10 +244,86 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { patches.value = Resource.Success(patchClasses) } + private fun createWorkDir(): File { + return app.filesDir.resolve("tmp-${System.currentTimeMillis()}").also { it.mkdirs() } + } + fun startPatcher() { - val serviceIntent = Intent(app, PatcherForegroundService::class.java) - serviceIntent.putExtra("selectedPatches",selectedPatches.toTypedArray()) - serviceIntent.putExtra("patchBundleFile",patchBundleFile) - app.startForegroundService(serviceIntent) + val tag = "Patcher" + + viewModelScope.launch { + Log.d(tag, "Checking prerequisites") + val info = getSelectedPackageInfo()?.applicationInfo ?: return@launch + val patches = findPatchesByIds(selectedPatches) + if (patches.isEmpty()) return@launch + val integrations = downloadIntegrations(integrationsCacheDir) + + Log.d(tag, "Creating directories") + val workdir = createWorkDir() + val inputFile = File(workdir.parentFile!!, "base.apk") + val patchedFile = File(workdir, "patched.apk") + val alignedFile = File(workdir, "aligned.apk") + val outputFile = File(workdir, "out.apk") + val cacheDirectory = workdir.resolve("cache") + val buildDirectory = cacheDirectory.resolve("build") + + try { +// Log.d(tag, "Copying base.apk from ${info.packageName}") +// withContext(Dispatchers.IO) { +// Files.copy( +// File(info.publicSourceDir).toPath(), +// inputFile.toPath(), +// StandardCopyOption.REPLACE_EXISTING +// ) +// } + + Log.d(tag, "Creating patcher") + val patcher = Patcher( + PatcherOptions( + inputFile, + cacheDirectory.absolutePath, + patchResources = true, + aaptPath = aaptPath, + frameworkFolderLocation = frameworkPath + ) + ) + + Log.d(tag, "Merging integrations") + patcher.addFiles(listOf(integrations)) {} + + Log.d(tag, "Adding ${patches.size} patch(es)") + patcher.addPatches(patches) + + Log.d(tag, "Applying patches") + patcher.applyPatches().forEach { (patch, result) -> + if (result.isSuccess) { + Log.i(tag, "[success] $patch") + return@forEach + } + Log.e(tag, "[error] $patch:", result.exceptionOrNull()!!) + } + + Log.d(tag, "Saving file") + val result = patcher.save() + ZipFileSystemUtils(result.resourceFile!!, patchedFile).use { fs -> + result.dexFiles.forEach { fs.write(it.name, it.dexFileInputStream.readBytes()) } + fs.writeInput() + fs.uncompress(*result.doNotCompress!!.toTypedArray()) + } + + Log.d(tag, "Aligning apk") + ZipAligner.align(patchedFile, alignedFile) + Log.d(tag, "Signing apk") + Signer("ReVanced", "s3cur3p@ssw0rd").signApk(alignedFile, outputFile) + + // TODO: install apk! + Log.d(tag, "Installing apk") + } catch (e: Exception) { + Log.e(tag, "Error while patching", e) + } + + Log.d(tag, "Deleting workdir") + //workdir.deleteRecursively() + } } } \ 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 8dd09bebbc..3086309f53 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -63,6 +63,4 @@ Version info Unsupported version Compatible app versions - Patching - ReVanced Manager is patching \ No newline at end of file From 28ddf9b79f305486847d8801393e50e7aaba26f9 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Thu, 21 Jul 2022 15:17:50 +0530 Subject: [PATCH 099/132] chore: bump patcher version to 2.5.1 --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ecb8d862fd..276ea20a5b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -100,7 +100,7 @@ dependencies { implementation("androidx.core:core-splashscreen:1.0.0-rc01") // ReVanced - implementation("app.revanced:revanced-patcher:2.4.0") + implementation("app.revanced:revanced-patcher:2.5.1") // Signing & aligning implementation("org.bouncycastle:bcpkix-jdk15on:1.70") From c13b3362a48641ac8d3907d32252a40d603f0427 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Thu, 21 Jul 2022 21:23:38 +0530 Subject: [PATCH 100/132] chore: bump java version to 17. --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 276ea20a5b..a01ce12020 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -64,8 +64,8 @@ android { } } compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() From 9de720e568cc5efd3249def210a5a28090ec34e1 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Thu, 21 Jul 2022 21:55:43 +0530 Subject: [PATCH 101/132] chore: bump java version to 17 for kotlinOptions. --- app/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a01ce12020..52fb3cccf0 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -68,7 +68,7 @@ android { targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = JavaVersion.VERSION_11.toString() + jvmTarget = JavaVersion.VERSION_17.toString() optIn("kotlin.RequiresOptIn") } buildFeatures { From 7e52514f20233a3732ebad10735c70b94c619732 Mon Sep 17 00:00:00 2001 From: danthe1st Date: Sun, 24 Jul 2022 15:22:35 +0200 Subject: [PATCH 102/132] use CoroutineWorker instead of foreground service --- app/build.gradle.kts | 1 + app/src/main/AndroidManifest.xml | 6 +- .../mainsubscreens/PatcherSubscreen.kt | 126 ++-------- .../screens/mainsubscreens/PatcherWorker.kt | 230 ++++++++++++++++++ app/src/main/res/values/strings.xml | 2 + 5 files changed, 260 insertions(+), 105 deletions(-) create mode 100644 app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 52fb3cccf0..00777a4031 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -108,6 +108,7 @@ dependencies { // Compose Destinations implementation("io.github.raamcosta.compose-destinations:core:1.6.12-beta") + implementation("androidx.work:work-runtime-ktx:2.5.0") ksp("io.github.raamcosta.compose-destinations:ksp:1.6.12-beta") // Accompanist diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7e948646ad..f22b617307 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,6 +11,7 @@ + @@ -42,6 +43,9 @@ - + + \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt index 8b2723b9d8..0e29837bbf 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt @@ -1,6 +1,7 @@ package app.revanced.manager.ui.screens.mainsubscreens import android.app.Application +import android.content.Intent import android.content.pm.PackageManager import android.util.Log import androidx.activity.ComponentActivity @@ -23,23 +24,20 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController +import androidx.work.OneTimeWorkRequest +import androidx.work.OneTimeWorkRequestBuilder +import androidx.work.WorkManager +import androidx.work.WorkerParameters import app.revanced.manager.Global import app.revanced.manager.R import app.revanced.manager.backend.api.ManagerAPI -import app.revanced.manager.backend.utils.Aapt -import app.revanced.manager.backend.utils.aligning.ZipAligner -import app.revanced.manager.backend.utils.filesystem.ZipFileSystemUtils -import app.revanced.manager.backend.utils.signing.Signer import app.revanced.manager.settings import app.revanced.manager.ui.Resource import app.revanced.manager.ui.components.FloatingActionButton import app.revanced.manager.ui.screens.destinations.AppSelectorScreenDestination import app.revanced.manager.ui.screens.destinations.PatchesSelectorScreenDestination -import app.revanced.patcher.Patcher -import app.revanced.patcher.PatcherOptions import app.revanced.patcher.data.Data import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages -import app.revanced.patcher.extensions.PatchExtensions.patchName import app.revanced.patcher.patch.Patch import app.revanced.patcher.util.patch.implementation.DexPatchBundle import com.ramcosta.composedestinations.annotation.Destination @@ -51,6 +49,7 @@ import kotlinx.coroutines.launch import java.io.File import java.util.* + private const val tag = "PatcherScreen" @OptIn(ExperimentalMaterial3Api::class) @@ -59,7 +58,7 @@ private const val tag = "PatcherScreen" @Composable fun PatcherSubscreen( navigator: NavController, - vm: PatcherViewModel = viewModel(LocalContext.current as ComponentActivity) + vm: PatcherViewModel = viewModel(LocalContext.current as ComponentActivity), ) { val selectedAppPackage by vm.selectedAppPackage val hasAppSelected = selectedAppPackage.isPresent @@ -132,18 +131,16 @@ fun PatcherSubscreen( data class PatchClass( val patch: Class>, - val unsupported: Boolean + val unsupported: Boolean, ) class PatcherViewModel(val app: Application) : AndroidViewModel(app) { - private val aaptPath = Aapt.binary(app).absolutePath private val bundleCacheDir = app.filesDir.resolve("bundle-cache").also { it.mkdirs() } - private val frameworkPath = app.filesDir.resolve("framework").also { it.mkdirs() }.absolutePath - private val integrationsCacheDir = app.filesDir.resolve("integrations-cache").also { it.mkdirs() } val selectedAppPackage = mutableStateOf(Optional.empty()) private val selectedPatches = mutableStateListOf() val patches = mutableStateOf>>>>(Resource.Loading) + lateinit var patchBundleFile: String init { loadPatches() @@ -173,10 +170,7 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { return !selectedPatches.isEmpty() } - private fun findPatchesByIds(ids: Iterable): List>> { - val (patches) = patches.value as? Resource.Success ?: return listOf() - return patches.filter { patch -> ids.any { it == patch.patchName } } - } + private fun getSelectedPackageInfo() = if (selectedAppPackage.value.isPresent) @@ -214,18 +208,10 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { } } - private suspend fun downloadIntegrations(workdir: File): File { - return try { - val (_, out) = ManagerAPI.downloadIntegrations(workdir, this.app.baseContext.settings.data.map { pref -> pref.get(stringPreferencesKey("integrations")) ?: Global.ghIntegrations }.first()) - out - } catch (e: Exception) { - throw Exception("Failed to download integrations", e) - } - } - private fun loadPatches() = viewModelScope.launch { try { val file = downloadDefaultPatchBundle(bundleCacheDir) + patchBundleFile=file.absolutePath loadPatches0(file.absolutePath) } catch (e: Exception) { Log.e(tag, "An error occurred while loading patches", e) @@ -244,86 +230,18 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { patches.value = Resource.Success(patchClasses) } - private fun createWorkDir(): File { - return app.filesDir.resolve("tmp-${System.currentTimeMillis()}").also { it.mkdirs() } - } - fun startPatcher() { - val tag = "Patcher" - - viewModelScope.launch { - Log.d(tag, "Checking prerequisites") - val info = getSelectedPackageInfo()?.applicationInfo ?: return@launch - val patches = findPatchesByIds(selectedPatches) - if (patches.isEmpty()) return@launch - val integrations = downloadIntegrations(integrationsCacheDir) - - Log.d(tag, "Creating directories") - val workdir = createWorkDir() - val inputFile = File(workdir.parentFile!!, "base.apk") - val patchedFile = File(workdir, "patched.apk") - val alignedFile = File(workdir, "aligned.apk") - val outputFile = File(workdir, "out.apk") - val cacheDirectory = workdir.resolve("cache") - val buildDirectory = cacheDirectory.resolve("build") - - try { -// Log.d(tag, "Copying base.apk from ${info.packageName}") -// withContext(Dispatchers.IO) { -// Files.copy( -// File(info.publicSourceDir).toPath(), -// inputFile.toPath(), -// StandardCopyOption.REPLACE_EXISTING -// ) -// } - - Log.d(tag, "Creating patcher") - val patcher = Patcher( - PatcherOptions( - inputFile, - cacheDirectory.absolutePath, - patchResources = true, - aaptPath = aaptPath, - frameworkFolderLocation = frameworkPath + WorkManager + .getInstance(app) + .enqueue( + OneTimeWorkRequest.Builder(PatcherWorker::class.java) + .setInputData( + androidx.work.Data.Builder() + .putStringArray("selectedPatches",selectedPatches.toTypedArray()) + .putString("patchBundleFile",patchBundleFile) + .build() ) - ) - - Log.d(tag, "Merging integrations") - patcher.addFiles(listOf(integrations)) {} - - Log.d(tag, "Adding ${patches.size} patch(es)") - patcher.addPatches(patches) - - Log.d(tag, "Applying patches") - patcher.applyPatches().forEach { (patch, result) -> - if (result.isSuccess) { - Log.i(tag, "[success] $patch") - return@forEach - } - Log.e(tag, "[error] $patch:", result.exceptionOrNull()!!) - } - - Log.d(tag, "Saving file") - val result = patcher.save() - ZipFileSystemUtils(result.resourceFile!!, patchedFile).use { fs -> - result.dexFiles.forEach { fs.write(it.name, it.dexFileInputStream.readBytes()) } - fs.writeInput() - fs.uncompress(*result.doNotCompress!!.toTypedArray()) - } - - Log.d(tag, "Aligning apk") - ZipAligner.align(patchedFile, alignedFile) - Log.d(tag, "Signing apk") - Signer("ReVanced", "s3cur3p@ssw0rd").signApk(alignedFile, outputFile) - - // TODO: install apk! - Log.d(tag, "Installing apk") - } catch (e: Exception) { - Log.e(tag, "Error while patching", e) - } - - Log.d(tag, "Deleting workdir") - //workdir.deleteRecursively() - } + .build() + ) } } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt new file mode 100644 index 0000000000..c68badd632 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt @@ -0,0 +1,230 @@ +package app.revanced.manager.ui.screens.mainsubscreens + +import android.app.* +import android.content.Context +import android.content.Intent +import android.graphics.drawable.Icon +import android.net.Uri +import android.os.IBinder +import android.util.Log +import androidx.compose.runtime.mutableStateOf +import androidx.core.content.ContextCompat +import androidx.datastore.preferences.core.stringPreferencesKey +import androidx.work.CoroutineWorker +import androidx.work.ForegroundInfo +import androidx.work.WorkerParameters +import app.revanced.manager.Global +import app.revanced.manager.R +import app.revanced.manager.backend.api.ManagerAPI +import app.revanced.manager.backend.utils.Aapt +import app.revanced.manager.backend.utils.aligning.ZipAligner +import app.revanced.manager.backend.utils.filesystem.ZipFileSystemUtils +import app.revanced.manager.backend.utils.signing.Signer +import app.revanced.manager.settings +import app.revanced.manager.ui.Resource +import app.revanced.patcher.Patcher +import app.revanced.patcher.PatcherOptions +import app.revanced.patcher.data.Data +import app.revanced.patcher.extensions.PatchExtensions.patchName +import app.revanced.patcher.patch.Patch +import app.revanced.patcher.util.patch.implementation.DexPatchBundle +import dalvik.system.DexClassLoader +import kotlinx.coroutines.flow.first +import kotlinx.coroutines.flow.map +import kotlinx.coroutines.runBlocking +import java.io.File +import java.lang.IllegalArgumentException + +class PatcherWorker(context: Context, parameters: WorkerParameters) : + CoroutineWorker(context, parameters) { + val patches = mutableStateOf>>>>(Resource.Loading) + val tag = "Patcher" + + override suspend fun doWork(): Result { + val selectedPatches = inputData.getStringArray("selectedPatches") + ?: throw IllegalArgumentException("selectedPatches is missing") + val patchBundleFile = inputData.getString("patchBundleFile") + ?: throw IllegalArgumentException("patchBundleFile is missing") + + val notificationIntent = Intent(applicationContext, PatcherWorker::class.java) + val pendingIntent: PendingIntent = + PendingIntent.getActivity( + applicationContext, + 0, + notificationIntent, + PendingIntent.FLAG_IMMUTABLE + ) + val channel = + NotificationChannel( + "revanced-patcher-patching", + "Patching", + NotificationManager.IMPORTANCE_LOW + ) + val notificationManager = + ContextCompat.getSystemService(applicationContext, NotificationManager::class.java) + notificationManager!!.createNotificationChannel(channel) + val notification: Notification = Notification.Builder(applicationContext, channel.id) + .setContentTitle(applicationContext.getText(R.string.patcher_notification_title)) + .setContentText(applicationContext.getText(R.string.patcher_notification_message)) + .setLargeIcon(Icon.createWithResource(applicationContext, R.drawable.manager)) + .setSmallIcon(Icon.createWithResource(applicationContext, R.drawable.manager)) + .setContentIntent(pendingIntent) + .build() + + setForeground(ForegroundInfo(1, notification)) + + runPatcher(selectedPatches.toList(), patchBundleFile) + return Result.success() + } + + private suspend fun runPatcher(selectedPatches: List, patchBundleFile: String): Boolean { + + val aaptPath = Aapt.binary(applicationContext).absolutePath + val frameworkPath = + applicationContext.filesDir.resolve("framework").also { it.mkdirs() }.absolutePath + val integrationsCacheDir = + applicationContext.filesDir.resolve("integrations-cache").also { it.mkdirs() } + + loadPatches(patchBundleFile) + Log.d(tag, "Checking prerequisites") + val patches = findPatchesByIds(selectedPatches) + if (patches.isEmpty()) return true + val integrations = downloadIntegrations(integrationsCacheDir) + + Log.d(tag, "Creating directories") + val workdir = createWorkDir() + val inputFile = File(workdir.parentFile!!, "base.apk") + val patchedFile = File(workdir, "patched.apk") + val alignedFile = File(workdir, "aligned.apk") + val outputFile = File(workdir, "out.apk") + val cacheDirectory = workdir.resolve("cache") + + try { + // Log.d(tag, "Copying base.apk from ${info.packageName}") + // withContext(Dispatchers.IO) { + // Files.copy( + // File(info.publicSourceDir).toPath(), + // inputFile.toPath(), + // StandardCopyOption.REPLACE_EXISTING + // ) + // } + + Log.d(tag, "Creating patcher") + val patcher = Patcher( + PatcherOptions( + inputFile, + cacheDirectory.absolutePath, + patchResources = true, + aaptPath = aaptPath, + frameworkFolderLocation = frameworkPath, + logger = object : app.revanced.patcher.logging.Logger { + override fun error(msg: String) { + Log.e(tag, msg) + } + + override fun warn(msg: String) { + Log.w(tag, msg) + } + + override fun info(msg: String) { + Log.i(tag, msg) + } + + override fun trace(msg: String) { + Log.v(tag, msg) + } + } + ) + ) + + Log.d(tag, "Merging integrations")//TODO add again + patcher.addFiles(listOf(integrations)) {} + + Log.d(tag, "Adding ${patches.size} patch(es)") + patcher.addPatches(patches) + + Log.d(tag, "Applying patches") + patcher.applyPatches().forEach { (patch, result) -> + if (result.isSuccess) { + Log.i(tag, "[success] $patch") + return@forEach + } + Log.e(tag, "[error] $patch:", result.exceptionOrNull()!!) + } + + Log.d(tag, "Saving file") + val result = patcher.save() + ZipFileSystemUtils(result.resourceFile!!, patchedFile).use { fs -> + result.dexFiles.forEach { fs.write(it.name, it.dexFileInputStream.readBytes()) } + fs.writeInput() + fs.uncompress(*result.doNotCompress!!.toTypedArray()) + } + + Log.d(tag, "Aligning apk") + ZipAligner.align(patchedFile, alignedFile) + Log.d(tag, "Signing apk") + Signer("ReVanced", "s3cur3p@ssw0rd").signApk(alignedFile, outputFile) + Log.d(tag, "Installing apk ${outputFile.absolutePath}") + install(outputFile) + } catch (e: Exception) { + Log.e(tag, "Error while patching", e) + } + + Log.d(tag, "Deleting workdir") + //workdir.deleteRecursively() + + return false + } + + private fun install(apk: File) { + val intent = Intent(Intent.ACTION_VIEW); + intent.setDataAndType( + Uri.fromFile(apk), "application/vnd.android.package-archive" + ); + applicationContext.startActivity(intent); + } + + private fun createWorkDir(): File { + return applicationContext.filesDir.resolve("tmp-${System.currentTimeMillis()}") + .also { it.mkdirs() } + } + + private fun findPatchesByIds(ids: Iterable): List>> { + val (patches) = patches.value as? Resource.Success ?: return listOf() + return patches.filter { patch -> ids.any { it == patch.patchName } } + } + + private suspend fun downloadIntegrations(workdir: File): File { + return try { + val (_, out) = ManagerAPI.downloadIntegrations( + workdir, + applicationContext.settings.data.map { pref -> + pref.get(stringPreferencesKey("integrations")) ?: Global.ghIntegrations + }.first() + ) + out + } catch (e: Exception) { + throw Exception("Failed to download integrations", e) + } + } + + private fun loadPatches(patchBundleFile: String) { + try { + loadPatches0(patchBundleFile) + } catch (e: Exception) { + Log.e(tag, "An error occurred while loading patches", e) + } + } + + private fun loadPatches0(path: String) { + val patchClasses = DexPatchBundle( + path, DexClassLoader( + path, + applicationContext.codeCacheDir.absolutePath, + null, + javaClass.classLoader + ) + ).loadPatches() + patches.value = Resource.Success(patchClasses) + } +} \ 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 3086309f53..8dd09bebbc 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -63,4 +63,6 @@ Version info Unsupported version Compatible app versions + Patching + ReVanced Manager is patching \ No newline at end of file From 68032c4cd07b5cebe918bb99b4e2816bdb73b492 Mon Sep 17 00:00:00 2001 From: danthe1st Date: Sun, 24 Jul 2022 15:33:53 +0200 Subject: [PATCH 103/132] comment out nonroot installation logic --- .../screens/mainsubscreens/PatcherWorker.kt | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt index c68badd632..3f817fda9d 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt @@ -1,11 +1,13 @@ package app.revanced.manager.ui.screens.mainsubscreens -import android.app.* +import android.app.Notification +import android.app.NotificationChannel +import android.app.NotificationManager +import android.app.PendingIntent import android.content.Context import android.content.Intent import android.graphics.drawable.Icon import android.net.Uri -import android.os.IBinder import android.util.Log import androidx.compose.runtime.mutableStateOf import androidx.core.content.ContextCompat @@ -31,9 +33,7 @@ import app.revanced.patcher.util.patch.implementation.DexPatchBundle import dalvik.system.DexClassLoader import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map -import kotlinx.coroutines.runBlocking import java.io.File -import java.lang.IllegalArgumentException class PatcherWorker(context: Context, parameters: WorkerParameters) : CoroutineWorker(context, parameters) { @@ -164,8 +164,7 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : ZipAligner.align(patchedFile, alignedFile) Log.d(tag, "Signing apk") Signer("ReVanced", "s3cur3p@ssw0rd").signApk(alignedFile, outputFile) - Log.d(tag, "Installing apk ${outputFile.absolutePath}") - install(outputFile) + Log.i(tag,"Successfully patched into $outputFile") } catch (e: Exception) { Log.e(tag, "Error while patching", e) } @@ -176,13 +175,13 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : return false } - private fun install(apk: File) { - val intent = Intent(Intent.ACTION_VIEW); - intent.setDataAndType( - Uri.fromFile(apk), "application/vnd.android.package-archive" - ); - applicationContext.startActivity(intent); - } + //private fun installNonRoot(apk: File) { + // val intent = Intent(Intent.ACTION_VIEW); + // intent.setDataAndType( + // Uri.fromFile(apk), "application/vnd.android.package-archive" + // ); + // applicationContext.startActivity(intent); + //} private fun createWorkDir(): File { return applicationContext.filesDir.resolve("tmp-${System.currentTimeMillis()}") From 74d60d780655255d6c219e0c49792afbf951cab6 Mon Sep 17 00:00:00 2001 From: Canny1913 <94744045+Canny1913@users.noreply.github.com> Date: Sun, 24 Jul 2022 17:30:20 +0300 Subject: [PATCH 104/132] Update build_debug_apk.yml --- .github/workflows/build_debug_apk.yml | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build_debug_apk.yml b/.github/workflows/build_debug_apk.yml index 7b9694936c..f65966f5e5 100644 --- a/.github/workflows/build_debug_apk.yml +++ b/.github/workflows/build_debug_apk.yml @@ -1,15 +1,28 @@ name: Build -on: push +on: + push: + branches: [ "main" ] + pull_request: + branches: [ "main" ] jobs: build: + runs-on: ubuntu-latest + steps: - - name: Clone repository - uses: actions/checkout@v2 + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'zulu' + cache: gradle - - name: Build + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build with Gradle run: export GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} && chmod +x gradlew && ./gradlew assembleDebug - name: Store generated APK file From e707b6ba880188416ca9c9a9e1c08be102aa95b7 Mon Sep 17 00:00:00 2001 From: Sculas Date: Sun, 24 Jul 2022 16:57:33 +0200 Subject: [PATCH 105/132] ci: remove unused stuff --- .github/workflows/build_debug_apk.yml | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/.github/workflows/build_debug_apk.yml b/.github/workflows/build_debug_apk.yml index f65966f5e5..8677283c60 100644 --- a/.github/workflows/build_debug_apk.yml +++ b/.github/workflows/build_debug_apk.yml @@ -8,9 +8,7 @@ on: jobs: build: - runs-on: ubuntu-latest - steps: - uses: actions/checkout@v3 - name: Set up JDK 17 @@ -19,12 +17,10 @@ jobs: java-version: '17' distribution: 'zulu' cache: gradle - - - name: Grant execute permission for gradlew - run: chmod +x gradlew - name: Build with Gradle - run: export GITHUB_TOKEN=${{ secrets.GITHUB_TOKEN }} && chmod +x gradlew && ./gradlew assembleDebug - + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: chmod +x gradlew && ./gradlew assembleDebug - name: Store generated APK file uses: actions/upload-artifact@v2 with: From 033f32635d1ac70e3ef5284c1ba556c8d20e8f9d Mon Sep 17 00:00:00 2001 From: Sculas Date: Sun, 24 Jul 2022 16:58:47 +0200 Subject: [PATCH 106/132] chore: double quotes aren't needed [skip ci] --- .github/workflows/build_debug_apk.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_debug_apk.yml b/.github/workflows/build_debug_apk.yml index 8677283c60..03447266dd 100644 --- a/.github/workflows/build_debug_apk.yml +++ b/.github/workflows/build_debug_apk.yml @@ -2,9 +2,9 @@ name: Build on: push: - branches: [ "main" ] + branches: [main] pull_request: - branches: [ "main" ] + branches: [main] jobs: build: From 5429c83fd2878a1e21da27da4fab0372fb4296fc Mon Sep 17 00:00:00 2001 From: Sculas Date: Sun, 24 Jul 2022 17:03:52 +0200 Subject: [PATCH 107/132] ci: remove chmod [skip ci] no longer needed. --- .github/workflows/build_debug_apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_debug_apk.yml b/.github/workflows/build_debug_apk.yml index 03447266dd..37cdd2cb22 100644 --- a/.github/workflows/build_debug_apk.yml +++ b/.github/workflows/build_debug_apk.yml @@ -20,7 +20,7 @@ jobs: - name: Build with Gradle env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: chmod +x gradlew && ./gradlew assembleDebug + run: ./gradlew assembleDebug - name: Store generated APK file uses: actions/upload-artifact@v2 with: From bbcb6098f301a26e2471a7abae99e5ea74ccabd6 Mon Sep 17 00:00:00 2001 From: Aunali321 <48486084+Aunali321@users.noreply.github.com> Date: Sun, 24 Jul 2022 22:01:51 +0530 Subject: [PATCH 108/132] Workflow trigger --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 00777a4031..a25f6b5918 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -119,7 +119,7 @@ dependencies { implementation("com.github.topjohnwu.libsu:core:4.0.3") implementation("com.github.topjohnwu.libsu:io:4.0.3") - // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA implementation("com.github.JamalMulla:ComposePrefs3:1.0.2") implementation("androidx.datastore:datastore-preferences:1.0.0") @@ -154,4 +154,4 @@ dependencies { fun org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions.optIn(library: String) { freeCompilerArgs = freeCompilerArgs + "-opt-in=$library" -} \ No newline at end of file +} From bdff87d945a9cd92499ce8ae5175158563a2a497 Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Sun, 24 Jul 2022 18:32:26 +0200 Subject: [PATCH 109/132] build: update dependencies --- app/build.gradle.kts | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 00777a4031..091ee0eac9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -16,10 +16,8 @@ repositories { maven { url = uri("https://maven.pkg.github.com/revanced/revanced-patcher") credentials { - username = - (project.findProperty("gpr.user") ?: System.getenv("GITHUB_ACTOR")) as String - password = - (project.findProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN")) as String + username = (project.findProperty("gpr.user") ?: System.getenv("GITHUB_ACTOR")) as String + password = (project.findProperty("gpr.key") ?: System.getenv("GITHUB_TOKEN")) as String } } } @@ -47,6 +45,7 @@ android { useSupportLibrary = true } } + applicationVariants.all { kotlin.sourceSets { getByName(name) { @@ -54,29 +53,34 @@ android { } } } + buildTypes { getByName("release") { isMinifyEnabled = true proguardFiles( - getDefaultProguardFile("proguard-android-optimize.txt"), - "proguard-rules.pro" + getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } + compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } + kotlinOptions { jvmTarget = JavaVersion.VERSION_17.toString() optIn("kotlin.RequiresOptIn") } + buildFeatures { compose = true } + composeOptions { kotlinCompilerExtensionVersion = composeVersion } + packagingOptions { jniLibs { useLegacyPackaging = true @@ -85,6 +89,7 @@ android { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } + buildToolsVersion = "33.0.0" } @@ -100,7 +105,7 @@ dependencies { implementation("androidx.core:core-splashscreen:1.0.0-rc01") // ReVanced - implementation("app.revanced:revanced-patcher:2.5.1") + implementation("app.revanced:revanced-patcher:2.5.2") // Signing & aligning implementation("org.bouncycastle:bcpkix-jdk15on:1.70") @@ -108,7 +113,7 @@ dependencies { // Compose Destinations implementation("io.github.raamcosta.compose-destinations:core:1.6.12-beta") - implementation("androidx.work:work-runtime-ktx:2.5.0") + implementation("androidx.work:work-runtime-ktx:2.7.1") ksp("io.github.raamcosta.compose-destinations:ksp:1.6.12-beta") // Accompanist From 95f83f68fa89ec1d845437a2288162c7cf448b78 Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Sun, 24 Jul 2022 18:33:30 +0200 Subject: [PATCH 110/132] chore: cleanup --- .../screens/mainsubscreens/PatcherWorker.kt | 50 +++++++++--------- .../arm64-v8a/{aapt.so => to_be_removed.so} | Bin .../armeabi-v7a/{aapt.so => to_be_removed.so} | Bin .../x86_64/{aapt.so => to_be_removed.so} | Bin build.gradle.kts | 1 - 5 files changed, 24 insertions(+), 27 deletions(-) rename app/src/main/jniLibs/arm64-v8a/{aapt.so => to_be_removed.so} (100%) rename app/src/main/jniLibs/armeabi-v7a/{aapt.so => to_be_removed.so} (100%) rename app/src/main/jniLibs/x86_64/{aapt.so => to_be_removed.so} (100%) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt index 3f817fda9d..40713acdb3 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt @@ -37,8 +37,8 @@ import java.io.File class PatcherWorker(context: Context, parameters: WorkerParameters) : CoroutineWorker(context, parameters) { - val patches = mutableStateOf>>>>(Resource.Loading) - val tag = "Patcher" + private val patches = mutableStateOf>>>>(Resource.Loading) + val tag = "PatcherWorker" override suspend fun doWork(): Result { val selectedPatches = inputData.getStringArray("selectedPatches") @@ -77,8 +77,10 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : return Result.success() } - private suspend fun runPatcher(selectedPatches: List, patchBundleFile: String): Boolean { - + private suspend fun runPatcher( + selectedPatches: List, + patchBundleFile: String + ): Boolean { val aaptPath = Aapt.binary(applicationContext).absolutePath val frameworkPath = applicationContext.filesDir.resolve("framework").also { it.mkdirs() }.absolutePath @@ -100,14 +102,14 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : val cacheDirectory = workdir.resolve("cache") try { - // Log.d(tag, "Copying base.apk from ${info.packageName}") - // withContext(Dispatchers.IO) { - // Files.copy( - // File(info.publicSourceDir).toPath(), - // inputFile.toPath(), - // StandardCopyOption.REPLACE_EXISTING - // ) - // } +// Log.d(tag, "Copying base.apk from ${info.packageName}") +// withContext(Dispatchers.IO) { +// Files.copy( +// File(info.publicSourceDir).toPath(), +// inputFile.toPath(), +// StandardCopyOption.REPLACE_EXISTING +// ) +// } Log.d(tag, "Creating patcher") val patcher = Patcher( @@ -164,7 +166,7 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : ZipAligner.align(patchedFile, alignedFile) Log.d(tag, "Signing apk") Signer("ReVanced", "s3cur3p@ssw0rd").signApk(alignedFile, outputFile) - Log.i(tag,"Successfully patched into $outputFile") + Log.i(tag, "Successfully patched into $outputFile") } catch (e: Exception) { Log.e(tag, "Error while patching", e) } @@ -209,21 +211,17 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : private fun loadPatches(patchBundleFile: String) { try { - loadPatches0(patchBundleFile) + val patchClasses = DexPatchBundle( + patchBundleFile, DexClassLoader( + patchBundleFile, + applicationContext.codeCacheDir.absolutePath, + null, + javaClass.classLoader + ) + ).loadPatches() + patches.value = Resource.Success(patchClasses) } catch (e: Exception) { Log.e(tag, "An error occurred while loading patches", e) } } - - private fun loadPatches0(path: String) { - val patchClasses = DexPatchBundle( - path, DexClassLoader( - path, - applicationContext.codeCacheDir.absolutePath, - null, - javaClass.classLoader - ) - ).loadPatches() - patches.value = Resource.Success(patchClasses) - } } \ No newline at end of file diff --git a/app/src/main/jniLibs/arm64-v8a/aapt.so b/app/src/main/jniLibs/arm64-v8a/to_be_removed.so similarity index 100% rename from app/src/main/jniLibs/arm64-v8a/aapt.so rename to app/src/main/jniLibs/arm64-v8a/to_be_removed.so diff --git a/app/src/main/jniLibs/armeabi-v7a/aapt.so b/app/src/main/jniLibs/armeabi-v7a/to_be_removed.so similarity index 100% rename from app/src/main/jniLibs/armeabi-v7a/aapt.so rename to app/src/main/jniLibs/armeabi-v7a/to_be_removed.so diff --git a/app/src/main/jniLibs/x86_64/aapt.so b/app/src/main/jniLibs/x86_64/to_be_removed.so similarity index 100% rename from app/src/main/jniLibs/x86_64/aapt.so rename to app/src/main/jniLibs/x86_64/to_be_removed.so diff --git a/build.gradle.kts b/build.gradle.kts index d9121fb862..50bced3348 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,7 +4,6 @@ buildscript { set("compose_version", "1.2.0-beta03") set("ktor_version", "2.0.1") set("room_version", "2.4.2") - } repositories { google() From 7f4a03bb4225485f1317aa542e9a1fdacd59e4a7 Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Sun, 24 Jul 2022 19:12:49 +0200 Subject: [PATCH 111/132] fix: path component error once and for good --- .../manager/backend/utils/filesystem/ZipFileSystemUtils.kt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt index 4a6e9d2679..219c32c753 100644 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt +++ b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt @@ -1,5 +1,6 @@ package app.revanced.manager.backend.utils.filesystem +import app.revanced.manager.backend.utils.filesystem.zipfs.ZipFileSystemProvider import java.io.Closeable import java.io.File import java.nio.file.FileSystems @@ -7,9 +8,11 @@ import java.nio.file.Files import java.nio.file.Path import java.util.zip.ZipEntry +private val zfsProvider = ZipFileSystemProvider() + internal class ZipFileSystemUtils(input: File, output: File) : Closeable { - private val inFileSystem = FileSystems.newFileSystem(input.toURI(), mapOf()) - private val outFileSystem = FileSystems.newFileSystem(output.toURI(), mapOf("noCompression" to true)) + private val inFileSystem = zfsProvider.newFileSystem(input.toPath(), mapOf()) + private val outFileSystem = zfsProvider.newFileSystem(output.toPath(), mapOf("noCompression" to true)) private fun Path.deleteRecursively() { if (!Files.exists(this)) { From 0ff70ba56bac0c5ff0b2f55e19438942c0d65174 Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Sun, 24 Jul 2022 20:28:05 +0200 Subject: [PATCH 112/132] chore: cleanup --- .../backend/utils/filesystem/ZipFileSystemUtils.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt index 219c32c753..9ad4003a34 100644 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt +++ b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt @@ -56,12 +56,20 @@ internal class ZipFileSystemUtils(input: File, output: File) : Closeable { }.close() } - internal fun write(path: String, content: ByteArray) = Files.write(outFileSystem.getPath(path), content) + internal fun write(path: String, content: ByteArray) = + Files.write(outFileSystem.getPath(path), content) - private fun Path.getRelativePath(path: Path): Path = outFileSystem.getPath(path.relativize(this).toString()) + private fun Path.getRelativePath(path: Path): Path = + outFileSystem.getPath(path.relativize(this).toString()) internal fun uncompress(vararg paths: String) = - paths.forEach { Files.setAttribute(outFileSystem.getPath(it), "zip:method", ZipEntry.STORED) } + paths.forEach { + Files.setAttribute( + outFileSystem.getPath(it), + "zip:method", + ZipEntry.STORED + ) + } override fun close() { inFileSystem?.close() From 116337bf9d33b51d458e66fe658b7364eb8fd777 Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Sun, 24 Jul 2022 20:31:47 +0200 Subject: [PATCH 113/132] fix: input file not being copied to output --- .../revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt index 40713acdb3..86689351ca 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt @@ -155,6 +155,7 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : } Log.d(tag, "Saving file") + inputFile.copyTo(patchedFile) val result = patcher.save() ZipFileSystemUtils(result.resourceFile!!, patchedFile).use { fs -> result.dexFiles.forEach { fs.write(it.name, it.dexFileInputStream.readBytes()) } From 1caaf443675c83a9978b554e130479d4de6e2f99 Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Sun, 24 Jul 2022 23:32:51 +0200 Subject: [PATCH 114/132] fix: zfs wip (contains debug code) --- .../utils/filesystem/ZipFileSystemUtils.kt | 38 +++++++++---------- .../screens/mainsubscreens/PatcherWorker.kt | 28 +++++++++++++- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt index 9ad4003a34..04c28c6aa4 100644 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt +++ b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt @@ -1,9 +1,9 @@ package app.revanced.manager.backend.utils.filesystem +import android.util.Log import app.revanced.manager.backend.utils.filesystem.zipfs.ZipFileSystemProvider import java.io.Closeable import java.io.File -import java.nio.file.FileSystems import java.nio.file.Files import java.nio.file.Path import java.util.zip.ZipEntry @@ -15,17 +15,19 @@ internal class ZipFileSystemUtils(input: File, output: File) : Closeable { private val outFileSystem = zfsProvider.newFileSystem(output.toPath(), mapOf("noCompression" to true)) private fun Path.deleteRecursively() { + Log.v("ZipFileSystemUtils", "Deleting file $this") + if (!Files.exists(this)) { - throw IllegalStateException("File exists in input but not in output, cannot delete") + Log.w("ZipFileSystemUtils", "File ($this) exists in input but not in output, cannot delete") + return } if (Files.isDirectory(this)) { - Files.list(this).forEach { path -> - path.deleteRecursively() - } + Files.list(this).forEach { it.deleteRecursively() } } Files.delete(this) + Log.v("ZipFileSystemUtils", "Deleted file $this") } internal fun writeInput() { @@ -36,15 +38,19 @@ internal class ZipFileSystemUtils(input: File, output: File) : Closeable { Files.list(root).also { fileStream -> fileStream.forEach { filePath -> - val fileSystemPath = filePath.getRelativePath(root) - fileSystemPath.deleteRecursively() + Log.v("ZipFileSystemUtils", "Want to delete file ($filePath)") + val fileSystemPath = outFileSystem.getPath(filePath.toString()) + if (filePath.toString() != fileSystemPath.toString()) { + throw IllegalStateException("File from input ($filePath) does not match file from output ($fileSystemPath)") + } + //fileSystemPath.deleteRecursively() } }.close() Files.walk(root).also { fileStream -> - // don't include build directory by skipping the root node. + // skip the root directory (/) or else it will crash. fileStream.skip(1).forEach { filePath -> - val relativePath = filePath.getRelativePath(root) + val relativePath = outFileSystem.getPath(filePath.toString()) if (Files.isDirectory(filePath)) { Files.createDirectory(relativePath) @@ -56,20 +62,10 @@ internal class ZipFileSystemUtils(input: File, output: File) : Closeable { }.close() } - internal fun write(path: String, content: ByteArray) = - Files.write(outFileSystem.getPath(path), content) - - private fun Path.getRelativePath(path: Path): Path = - outFileSystem.getPath(path.relativize(this).toString()) + internal fun write(path: String, content: ByteArray) = Files.write(outFileSystem.getPath(path), content) internal fun uncompress(vararg paths: String) = - paths.forEach { - Files.setAttribute( - outFileSystem.getPath(it), - "zip:method", - ZipEntry.STORED - ) - } + paths.forEach { Files.setAttribute(outFileSystem.getPath(it), "zip:method", ZipEntry.STORED) } override fun close() { inFileSystem?.close() diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt index 86689351ca..26e563eac8 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt @@ -7,8 +7,8 @@ import android.app.PendingIntent import android.content.Context import android.content.Intent import android.graphics.drawable.Icon -import android.net.Uri import android.util.Log +import androidx.compose.runtime.NoLiveLiterals import androidx.compose.runtime.mutableStateOf import androidx.core.content.ContextCompat import androidx.datastore.preferences.core.stringPreferencesKey @@ -77,10 +77,33 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : return Result.success() } + private fun zfstest() { + val workdir = applicationContext.filesDir + val resourceFile = File(workdir, "aapt_temp_file") + + val baseFile = File(workdir, "base-test.apk") + val inputFile = File(workdir, "base-test-${System.currentTimeMillis()}.apk") + baseFile.copyTo(inputFile) + + try { + ZipFileSystemUtils(resourceFile, inputFile).use { fs -> + fs.writeInput() + } + } catch (e: Exception) { + e.printStackTrace() + } + + inputFile.delete() + } + + @NoLiveLiterals private suspend fun runPatcher( selectedPatches: List, patchBundleFile: String ): Boolean { + zfstest() + return false + val aaptPath = Aapt.binary(applicationContext).absolutePath val frameworkPath = applicationContext.filesDir.resolve("framework").also { it.mkdirs() }.absolutePath @@ -101,6 +124,8 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : val outputFile = File(workdir, "out.apk") val cacheDirectory = workdir.resolve("cache") + inputFile.copyTo(patchedFile) + try { // Log.d(tag, "Copying base.apk from ${info.packageName}") // withContext(Dispatchers.IO) { @@ -155,7 +180,6 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : } Log.d(tag, "Saving file") - inputFile.copyTo(patchedFile) val result = patcher.save() ZipFileSystemUtils(result.resourceFile!!, patchedFile).use { fs -> result.dexFiles.forEach { fs.write(it.name, it.dexFileInputStream.readBytes()) } From fffcb11423519fa88662da2e1e96d6ac8f4cd667 Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Mon, 25 Jul 2022 00:24:35 +0200 Subject: [PATCH 115/132] feat: wip zip impl --- .../utils/filesystem/ZipFileSystemUtils.kt | 90 ++++++------------- .../screens/mainsubscreens/PatcherWorker.kt | 33 +------ 2 files changed, 33 insertions(+), 90 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt index 04c28c6aa4..d14f82fc58 100644 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt +++ b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt @@ -1,74 +1,42 @@ package app.revanced.manager.backend.utils.filesystem -import android.util.Log -import app.revanced.manager.backend.utils.filesystem.zipfs.ZipFileSystemProvider import java.io.Closeable import java.io.File -import java.nio.file.Files -import java.nio.file.Path import java.util.zip.ZipEntry - -private val zfsProvider = ZipFileSystemProvider() - -internal class ZipFileSystemUtils(input: File, output: File) : Closeable { - private val inFileSystem = zfsProvider.newFileSystem(input.toPath(), mapOf()) - private val outFileSystem = zfsProvider.newFileSystem(output.toPath(), mapOf("noCompression" to true)) - - private fun Path.deleteRecursively() { - Log.v("ZipFileSystemUtils", "Deleting file $this") - - if (!Files.exists(this)) { - Log.w("ZipFileSystemUtils", "File ($this) exists in input but not in output, cannot delete") - return - } - - if (Files.isDirectory(this)) { - Files.list(this).forEach { it.deleteRecursively() } +import java.util.zip.ZipFile +import java.util.zip.ZipOutputStream + +internal class ZipFileSystemUtils(destFile: File) : Closeable { + private val dest = ZipOutputStream(destFile.outputStream()) + private val written = mutableListOf() + + internal fun copyOver(srcFile: File, uncompressed: List) { + val src = ZipFile(srcFile) + for (entry in src.entries()) { + val path = entry.name + if (written.contains(path)) continue + val compressionMethod = if (uncompressed.contains(path)) { + ZipEntry.STORED + } else { + entry.method + } + val zipEntry = ZipEntry(entry).apply { method = compressionMethod } + dest.putNextEntry(zipEntry) + src.getInputStream(entry).copyTo(dest) + dest.closeEntry() + written.add(path) } - - Files.delete(this) - Log.v("ZipFileSystemUtils", "Deleted file $this") + src.close() } - internal fun writeInput() { - if (inFileSystem == null) { - throw IllegalArgumentException("Input file not set") - } - val root = inFileSystem.getPath(inFileSystem.separator) - - Files.list(root).also { fileStream -> - fileStream.forEach { filePath -> - Log.v("ZipFileSystemUtils", "Want to delete file ($filePath)") - val fileSystemPath = outFileSystem.getPath(filePath.toString()) - if (filePath.toString() != fileSystemPath.toString()) { - throw IllegalStateException("File from input ($filePath) does not match file from output ($fileSystemPath)") - } - //fileSystemPath.deleteRecursively() - } - }.close() - - Files.walk(root).also { fileStream -> - // skip the root directory (/) or else it will crash. - fileStream.skip(1).forEach { filePath -> - val relativePath = outFileSystem.getPath(filePath.toString()) - - if (Files.isDirectory(filePath)) { - Files.createDirectory(relativePath) - return@forEach - } - - Files.copy(filePath, relativePath) - } - }.close() + internal fun write(path: String, content: ByteArray) { + dest.putNextEntry(ZipEntry(path)) + dest.write(content) + dest.closeEntry() + written.add(path) } - internal fun write(path: String, content: ByteArray) = Files.write(outFileSystem.getPath(path), content) - - internal fun uncompress(vararg paths: String) = - paths.forEach { Files.setAttribute(outFileSystem.getPath(it), "zip:method", ZipEntry.STORED) } - override fun close() { - inFileSystem?.close() - outFileSystem.close() + dest.close() } } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt index 26e563eac8..5e4765c8d8 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt @@ -77,33 +77,10 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : return Result.success() } - private fun zfstest() { - val workdir = applicationContext.filesDir - val resourceFile = File(workdir, "aapt_temp_file") - - val baseFile = File(workdir, "base-test.apk") - val inputFile = File(workdir, "base-test-${System.currentTimeMillis()}.apk") - baseFile.copyTo(inputFile) - - try { - ZipFileSystemUtils(resourceFile, inputFile).use { fs -> - fs.writeInput() - } - } catch (e: Exception) { - e.printStackTrace() - } - - inputFile.delete() - } - - @NoLiveLiterals private suspend fun runPatcher( selectedPatches: List, patchBundleFile: String ): Boolean { - zfstest() - return false - val aaptPath = Aapt.binary(applicationContext).absolutePath val frameworkPath = applicationContext.filesDir.resolve("framework").also { it.mkdirs() }.absolutePath @@ -119,13 +96,11 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : Log.d(tag, "Creating directories") val workdir = createWorkDir() val inputFile = File(workdir.parentFile!!, "base.apk") - val patchedFile = File(workdir, "patched.apk") + val patchedFile = File(workdir, "patched.apk").apply { createNewFile() } val alignedFile = File(workdir, "aligned.apk") val outputFile = File(workdir, "out.apk") val cacheDirectory = workdir.resolve("cache") - inputFile.copyTo(patchedFile) - try { // Log.d(tag, "Copying base.apk from ${info.packageName}") // withContext(Dispatchers.IO) { @@ -181,10 +156,10 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : Log.d(tag, "Saving file") val result = patcher.save() - ZipFileSystemUtils(result.resourceFile!!, patchedFile).use { fs -> + ZipFileSystemUtils(patchedFile).use { fs -> result.dexFiles.forEach { fs.write(it.name, it.dexFileInputStream.readBytes()) } - fs.writeInput() - fs.uncompress(*result.doNotCompress!!.toTypedArray()) + fs.copyOver(result.resourceFile!!, result.doNotCompress!!) + fs.copyOver(inputFile, listOf()) } Log.d(tag, "Aligning apk") From 7757e216ec1193e5ea73999e11799c64b6c3f556 Mon Sep 17 00:00:00 2001 From: Ushie Date: Mon, 25 Jul 2022 02:36:27 +0300 Subject: [PATCH 116/132] chore: disable root for now --- app/build.gradle.kts | 4 ++-- .../java/app/revanced/manager/MainActivity.kt | 23 +++++++++---------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 47385eaf0e..025572e958 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -121,8 +121,8 @@ dependencies { implementation("com.google.accompanist:accompanist-systemuicontroller:0.24.13-rc") // libsu - implementation("com.github.topjohnwu.libsu:core:4.0.3") - implementation("com.github.topjohnwu.libsu:io:4.0.3") +// implementation("com.github.topjohnwu.libsu:core:4.0.3") +// implementation("com.github.topjohnwu.libsu:io:4.0.3") // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA implementation("com.github.JamalMulla:ComposePrefs3:1.0.2") diff --git a/app/src/main/java/app/revanced/manager/MainActivity.kt b/app/src/main/java/app/revanced/manager/MainActivity.kt index 5288bd7869..6c5c7cbc96 100644 --- a/app/src/main/java/app/revanced/manager/MainActivity.kt +++ b/app/src/main/java/app/revanced/manager/MainActivity.kt @@ -17,7 +17,6 @@ import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.preferencesDataStore import app.revanced.manager.ui.screens.MainScreen import app.revanced.manager.ui.theme.ReVancedManagerTheme -import com.topjohnwu.superuser.Shell import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map @@ -37,7 +36,7 @@ class MainActivity : ComponentActivity() { preferences.get(booleanPreferencesKey("dynamicTheming")) ?: true } - Shell.getShell() +// Shell.getShell() setContent { val darklightstate = darklight.collectAsState(initial = isSystemInDarkTheme()) @@ -58,14 +57,14 @@ class MainActivity : ComponentActivity() { } } - companion object { - init { - Shell.enableVerboseLogging = BuildConfig.DEBUG - Shell.setDefaultBuilder( - Shell.Builder.create() - .setFlags(Shell.FLAG_REDIRECT_STDERR) - .setTimeout(10) - ) - } - } +// companion object { +// init { +// Shell.enableVerboseLogging = BuildConfig.DEBUG +// Shell.setDefaultBuilder( +// Shell.Builder.create() +// .setFlags(Shell.FLAG_REDIRECT_STDERR) +// .setTimeout(10) +// ) +// } +// } } \ No newline at end of file From 02fcdbe8cad7a8ad623277d1ba902161a8ef2a7a Mon Sep 17 00:00:00 2001 From: Sculas Date: Mon, 25 Jul 2022 02:36:51 +0200 Subject: [PATCH 117/132] chore: add todo [skip ci] --- .../manager/backend/utils/filesystem/ZipFileSystemUtils.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt index d14f82fc58..8539130508 100644 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt +++ b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt @@ -8,7 +8,7 @@ import java.util.zip.ZipOutputStream internal class ZipFileSystemUtils(destFile: File) : Closeable { private val dest = ZipOutputStream(destFile.outputStream()) - private val written = mutableListOf() + private val written = mutableListOf() // TODO: instead of this, just catch ZipException in putNextEntry. internal fun copyOver(srcFile: File, uncompressed: List) { val src = ZipFile(srcFile) @@ -39,4 +39,4 @@ internal class ZipFileSystemUtils(destFile: File) : Closeable { override fun close() { dest.close() } -} \ No newline at end of file +} From f062ac425d33c757dffca5f54238ffa3b040e651 Mon Sep 17 00:00:00 2001 From: bogadana <30848157+bogadana@users.noreply.github.com> Date: Mon, 25 Jul 2022 06:17:50 +0200 Subject: [PATCH 118/132] feat: zip improvements --- .../backend/utils/aligning/ZipAligner.kt | 99 +- .../utils/filesystem/ZipFileSystemUtils.kt | 42 - .../filesystem/zipfs/ByteArrayChannel.java | 252 -- .../utils/filesystem/zipfs/StreamUtils.java | 91 - .../utils/filesystem/zipfs/ZipCoder.java | 151 - .../utils/filesystem/zipfs/ZipConstants.java | 263 -- .../filesystem/zipfs/ZipDirectoryStream.java | 100 - .../zipfs/ZipFileAttributeView.java | 173 - .../filesystem/zipfs/ZipFileAttributes.java | 45 - .../utils/filesystem/zipfs/ZipFileStore.java | 140 - .../utils/filesystem/zipfs/ZipFileSystem.java | 3406 ----------------- .../zipfs/ZipFileSystemProvider.java | 315 -- .../utils/filesystem/zipfs/ZipInfo.java | 218 -- .../utils/filesystem/zipfs/ZipPath.java | 1043 ----- .../zipfs/ZipPosixFileAttributeView.java | 88 - .../utils/filesystem/zipfs/ZipUtils.java | 428 --- .../manager/backend/utils/zip/Extensions.kt | 33 + .../manager/backend/utils/zip/ZipFile.kt | 174 + .../utils/zip/structures/ZipEndRecord.kt | 78 + .../backend/utils/zip/structures/ZipEntry.kt | 190 + .../screens/mainsubscreens/PatcherWorker.kt | 19 +- 21 files changed, 503 insertions(+), 6845 deletions(-) delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ByteArrayChannel.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/StreamUtils.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipCoder.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipConstants.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipDirectoryStream.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileAttributeView.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileAttributes.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileStore.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileSystem.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileSystemProvider.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipInfo.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipPath.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipPosixFileAttributeView.java delete mode 100644 app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipUtils.java create mode 100644 app/src/main/java/app/revanced/manager/backend/utils/zip/Extensions.kt create mode 100644 app/src/main/java/app/revanced/manager/backend/utils/zip/ZipFile.kt create mode 100644 app/src/main/java/app/revanced/manager/backend/utils/zip/structures/ZipEndRecord.kt create mode 100644 app/src/main/java/app/revanced/manager/backend/utils/zip/structures/ZipEntry.kt diff --git a/app/src/main/java/app/revanced/manager/backend/utils/aligning/ZipAligner.kt b/app/src/main/java/app/revanced/manager/backend/utils/aligning/ZipAligner.kt index 5de1170330..0d9fe06615 100644 --- a/app/src/main/java/app/revanced/manager/backend/utils/aligning/ZipAligner.kt +++ b/app/src/main/java/app/revanced/manager/backend/utils/aligning/ZipAligner.kt @@ -1,98 +1,29 @@ package app.revanced.manager.backend.utils.aligning -import java.io.BufferedOutputStream +import app.revanced.manager.backend.utils.zip.ZipFile import java.io.File -import java.io.OutputStream -import java.util.* -import java.util.zip.ZipEntry -import java.util.zip.ZipFile -import java.util.zip.ZipOutputStream internal object ZipAligner { - fun align(input: File, output: File, alignment: Int = 4) { - val zipFile = ZipFile(input) - val entries: Enumeration = zipFile.entries() + private const val DEFAULT_ALIGNMENT = 4 + private const val LIBRARY_ALIGNMENT = 4096 - // fake - val peekingFakeStream = PeekingFakeStream() - val fakeOutputStream = ZipOutputStream(peekingFakeStream) - // real - val zipOutputStream = ZipOutputStream(BufferedOutputStream(output.outputStream())) + fun align(input: File, output: File) { + val inputZip = ZipFile(input) + val outputZip = ZipFile(output) - val multiOutputStream = MultiOutputStream( - listOf( - fakeOutputStream, // fake, used to add the data to the fake stream - zipOutputStream // real - ) - ) + for (entry in inputZip.entries) { + val data = inputZip.getDataForEntry(entry) - var bias = 0 - while (entries.hasMoreElements()) { - var padding = 0 + if (entry.compression == 0.toUShort()) { + val alignment = + if (entry.fileName.endsWith(".so")) LIBRARY_ALIGNMENT else DEFAULT_ALIGNMENT - val entry = ZipEntry(entries.nextElement()!!).also { - it.compressedSize = -1 + outputZip.addEntryCopyData(entry, data, alignment) + } else { + outputZip.addEntryCopyData(entry, data) } - // fake, used to calculate the file offset of the entry - fakeOutputStream.putNextEntry(entry) - - if (entry.method == ZipEntry.STORED) { - val fileOffset = peekingFakeStream.peek() - val newOffset = fileOffset + bias - padding = ((alignment - (newOffset % alignment)) % alignment).toInt() - - // real - entry.extra = if (entry.extra == null) ByteArray(padding) - else Arrays.copyOf(entry.extra, entry.extra.size + padding) - } - - zipOutputStream.putNextEntry(entry) - zipFile.getInputStream(entry).copyTo(multiOutputStream) - - // fake, used to add remaining bytes - fakeOutputStream.closeEntry() - // real - zipOutputStream.closeEntry() - - bias += padding } - zipFile.close() - zipOutputStream.close() - } -} - -private class MultiOutputStream( - private val streams: Iterable, -) : OutputStream() { - override fun write(b: ByteArray, off: Int, len: Int) = streams.forEach { - it.write(b, off, len) - } - - override fun write(b: ByteArray) = streams.forEach { - it.write(b) + outputZip.close() } - - override fun write(b: Int) = streams.forEach { - it.write(b) - } - } - -private class PeekingFakeStream : OutputStream() { - private var numberOfBytes: Long = 0 - - fun peek() = numberOfBytes - - override fun write(b: Int) { - numberOfBytes++ - } - - override fun write(b: ByteArray) { - numberOfBytes += b.size - } - - override fun write(b: ByteArray, offset: Int, len: Int) { - numberOfBytes += len - } -} \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt deleted file mode 100644 index 8539130508..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/ZipFileSystemUtils.kt +++ /dev/null @@ -1,42 +0,0 @@ -package app.revanced.manager.backend.utils.filesystem - -import java.io.Closeable -import java.io.File -import java.util.zip.ZipEntry -import java.util.zip.ZipFile -import java.util.zip.ZipOutputStream - -internal class ZipFileSystemUtils(destFile: File) : Closeable { - private val dest = ZipOutputStream(destFile.outputStream()) - private val written = mutableListOf() // TODO: instead of this, just catch ZipException in putNextEntry. - - internal fun copyOver(srcFile: File, uncompressed: List) { - val src = ZipFile(srcFile) - for (entry in src.entries()) { - val path = entry.name - if (written.contains(path)) continue - val compressionMethod = if (uncompressed.contains(path)) { - ZipEntry.STORED - } else { - entry.method - } - val zipEntry = ZipEntry(entry).apply { method = compressionMethod } - dest.putNextEntry(zipEntry) - src.getInputStream(entry).copyTo(dest) - dest.closeEntry() - written.add(path) - } - src.close() - } - - internal fun write(path: String, content: ByteArray) { - dest.putNextEntry(ZipEntry(path)) - dest.write(content) - dest.closeEntry() - written.add(path) - } - - override fun close() { - dest.close() - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ByteArrayChannel.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ByteArrayChannel.java deleted file mode 100644 index 9ca7763b0c..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ByteArrayChannel.java +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (c) 2018, 2020, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.io.IOException; -import java.nio.ByteBuffer; -import java.nio.channels.ClosedChannelException; -import java.nio.channels.NonWritableChannelException; -import java.nio.channels.SeekableByteChannel; -import java.util.Arrays; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; - -public class ByteArrayChannel implements SeekableByteChannel { - - private final ReadWriteLock rwlock = new ReentrantReadWriteLock(); - private byte buf[]; - - /* - * The current position of this channel. - */ - private int pos; - - /* - * The index that is one greater than the last valid byte in the channel. - */ - private int last; - - private boolean closed; - private boolean readonly; - - /* - * Creates a {@code ByteArrayChannel} with size {@code sz}. - */ - ByteArrayChannel(int sz, boolean readonly) { - this.buf = new byte[sz]; - this.pos = this.last = 0; - this.readonly = readonly; - } - - /* - * Creates a ByteArrayChannel with its 'pos' at 0 and its 'last' at buf's end. - * Note: no defensive copy of the 'buf', used directly. - */ - ByteArrayChannel(byte[] buf, boolean readonly) { - this.buf = buf; - this.pos = 0; - this.last = buf.length; - this.readonly = readonly; - } - - @Override - public boolean isOpen() { - return !closed; - } - - @Override - public long position() throws IOException { - beginRead(); - try { - ensureOpen(); - return pos; - } finally { - endRead(); - } - } - - @Override - public SeekableByteChannel position(long pos) throws IOException { - beginWrite(); - try { - ensureOpen(); - if (pos < 0 || pos >= Integer.MAX_VALUE) - throw new IllegalArgumentException("Illegal position " + pos); - this.pos = Math.min((int)pos, last); - return this; - } finally { - endWrite(); - } - } - - @Override - public int read(ByteBuffer dst) throws IOException { - beginWrite(); - try { - ensureOpen(); - if (pos == last) - return -1; - int n = Math.min(dst.remaining(), last - pos); - dst.put(buf, pos, n); - pos += n; - return n; - } finally { - endWrite(); - } - } - - @Override - public SeekableByteChannel truncate(long size) throws IOException { - if (readonly) - throw new NonWritableChannelException(); - ensureOpen(); - throw new UnsupportedOperationException(); - } - - @Override - public int write(ByteBuffer src) throws IOException { - if (readonly) - throw new NonWritableChannelException(); - beginWrite(); - try { - ensureOpen(); - int n = src.remaining(); - ensureCapacity(pos + n); - src.get(buf, pos, n); - pos += n; - if (pos > last) { - last = pos; - } - return n; - } finally { - endWrite(); - } - } - - @Override - public long size() throws IOException { - beginRead(); - try { - ensureOpen(); - return last; - } finally { - endRead(); - } - } - - @Override - public void close() throws IOException { - if (closed) - return; - beginWrite(); - try { - closed = true; - buf = null; - pos = 0; - last = 0; - } finally { - endWrite(); - } - } - - /** - * Creates a newly allocated byte array. Its size is the current - * size of this channel and the valid contents of the buffer - * have been copied into it. - * - * @return the current contents of this channel, as a byte array. - */ - public byte[] toByteArray() { - beginRead(); - try { - // avoid copy if last == bytes.length? - return Arrays.copyOf(buf, last); - } finally { - endRead(); - } - } - - private void ensureOpen() throws IOException { - if (closed) - throw new ClosedChannelException(); - } - - final void beginWrite() { - rwlock.writeLock().lock(); - } - - final void endWrite() { - rwlock.writeLock().unlock(); - } - - private final void beginRead() { - rwlock.readLock().lock(); - } - - private final void endRead() { - rwlock.readLock().unlock(); - } - - private void ensureCapacity(int minCapacity) { - // overflow-conscious code - if (minCapacity - buf.length > 0) { - grow(minCapacity); - } - } - - /** - * The maximum size of array to allocate. - * Some VMs reserve some header words in an array. - * Attempts to allocate larger arrays may result in - * OutOfMemoryError: Requested array size exceeds VM limit - */ - private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; - - /** - * Increases the capacity to ensure that it can hold at least the - * number of elements specified by the minimum capacity argument. - * - * @param minCapacity the desired minimum capacity - */ - private void grow(int minCapacity) { - // overflow-conscious code - int oldCapacity = buf.length; - int newCapacity = oldCapacity << 1; - if (newCapacity - minCapacity < 0) - newCapacity = minCapacity; - if (newCapacity - MAX_ARRAY_SIZE > 0) - newCapacity = hugeCapacity(minCapacity); - buf = Arrays.copyOf(buf, newCapacity); - } - - private static int hugeCapacity(int minCapacity) { - if (minCapacity < 0) // overflow - throw new OutOfMemoryError("Required length exceeds implementation limit"); - return (minCapacity > MAX_ARRAY_SIZE) ? - Integer.MAX_VALUE : - MAX_ARRAY_SIZE; - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/StreamUtils.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/StreamUtils.java deleted file mode 100644 index e7f704cbff..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/StreamUtils.java +++ /dev/null @@ -1,91 +0,0 @@ -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -public class StreamUtils { - private static final int DEFAULT_BUFFER_SIZE = 8192; - private static final int MAX_BUFFER_SIZE = Integer.MAX_VALUE - 8; - - public static long transferTo(InputStream in, OutputStream out) throws IOException { - Objects.requireNonNull(out, "out"); - long transferred = 0; - byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; - int read; - while ((read = in.read(buffer, 0, DEFAULT_BUFFER_SIZE)) >= 0) { - out.write(buffer, 0, read); - transferred += read; - } - return transferred; - } - - public static byte[] readAllBytes(InputStream in) throws IOException { - return readNBytes(in, Integer.MAX_VALUE); - } - - public static byte[] readNBytes(InputStream in, int len) throws IOException { - if (len < 0) { - throw new IllegalArgumentException("len < 0"); - } - - List bufs = null; - byte[] result = null; - int total = 0; - int remaining = len; - int n; - do { - byte[] buf = new byte[Math.min(remaining, DEFAULT_BUFFER_SIZE)]; - int nread = 0; - - // read to EOF which may read more or less than buffer size - while ((n = in.read(buf, nread, - Math.min(buf.length - nread, remaining))) > 0) { - nread += n; - remaining -= n; - } - - if (nread > 0) { - if (MAX_BUFFER_SIZE - total < nread) { - throw new OutOfMemoryError("Required array size too large"); - } - total += nread; - if (result == null) { - result = buf; - } else { - if (bufs == null) { - bufs = new ArrayList<>(); - bufs.add(result); - } - bufs.add(buf); - } - } - // if the last call to read returned -1 or the number of bytes - // requested have been read then break - } while (n >= 0 && remaining > 0); - - if (bufs == null) { - if (result == null) { - return new byte[0]; - } - return result.length == total ? - result : Arrays.copyOf(result, total); - } - - result = new byte[total]; - int offset = 0; - remaining = total; - for (byte[] b : bufs) { - int count = Math.min(b.length, remaining); - System.arraycopy(b, 0, result, offset, count); - offset += count; - remaining -= count; - } - - return result; - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipCoder.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipCoder.java deleted file mode 100644 index b0f5c30000..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipCoder.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2009, 2018, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.nio.ByteBuffer; -import java.nio.CharBuffer; -import java.nio.charset.Charset; -import java.nio.charset.CharsetDecoder; -import java.nio.charset.CharsetEncoder; -import java.nio.charset.CoderResult; -import java.nio.charset.CodingErrorAction; -import java.util.Arrays; - -import static java.nio.charset.StandardCharsets.ISO_8859_1; -import static java.nio.charset.StandardCharsets.UTF_8; - -/** - * Utility class for zipfile name and comment decoding and encoding - * - * @author Xueming Shen - */ -class ZipCoder { - - static class UTF8 extends ZipCoder { - UTF8() { - super(UTF_8); - } - - @Override - byte[] getBytes(String s) { // fast pass for ascii - for (int i = 0; i < s.length(); i++) { - if (s.charAt(i) > 0x7f) return super.getBytes(s); - } - return s.getBytes(ISO_8859_1); - } - - @Override - String toString(byte[] ba) { - for (byte b : ba) { - if (b < 0) return super.toString(ba); - } - return new String(ba, ISO_8859_1); - } - } - - private static final ZipCoder utf8 = new UTF8(); - - public static ZipCoder get(String csn) { - Charset cs = Charset.forName(csn); - if (cs.name().equals("UTF-8")) { - return utf8; - } - return new ZipCoder(cs); - } - - String toString(byte[] ba) { - CharsetDecoder cd = decoder().reset(); - int clen = (int)(ba.length * cd.maxCharsPerByte()); - char[] ca = new char[clen]; - if (clen == 0) - return new String(ca); - ByteBuffer bb = ByteBuffer.wrap(ba, 0, ba.length); - CharBuffer cb = CharBuffer.wrap(ca); - CoderResult cr = cd.decode(bb, cb, true); - if (!cr.isUnderflow()) - throw new IllegalArgumentException(cr.toString()); - cr = cd.flush(cb); - if (!cr.isUnderflow()) - throw new IllegalArgumentException(cr.toString()); - return new String(ca, 0, cb.position()); - } - - byte[] getBytes(String s) { - CharsetEncoder ce = encoder().reset(); - char[] ca = s.toCharArray(); - int len = (int)(ca.length * ce.maxBytesPerChar()); - byte[] ba = new byte[len]; - if (len == 0) - return ba; - ByteBuffer bb = ByteBuffer.wrap(ba); - CharBuffer cb = CharBuffer.wrap(ca); - CoderResult cr = ce.encode(cb, bb, true); - if (!cr.isUnderflow()) - throw new IllegalArgumentException(cr.toString()); - cr = ce.flush(bb); - if (!cr.isUnderflow()) - throw new IllegalArgumentException(cr.toString()); - if (bb.position() == ba.length) // defensive copy? - return ba; - else - return Arrays.copyOf(ba, bb.position()); - } - - boolean isUTF8() { - return cs == UTF_8; - } - - private Charset cs; - - private ZipCoder(Charset cs) { - this.cs = cs; - } - - private final ThreadLocal decTL = new ThreadLocal<>(); - private final ThreadLocal encTL = new ThreadLocal<>(); - - private CharsetDecoder decoder() { - CharsetDecoder dec = decTL.get(); - if (dec == null) { - dec = cs.newDecoder() - .onMalformedInput(CodingErrorAction.REPORT) - .onUnmappableCharacter(CodingErrorAction.REPORT); - decTL.set(dec); - } - return dec; - } - - private CharsetEncoder encoder() { - CharsetEncoder enc = encTL.get(); - if (enc == null) { - enc = cs.newEncoder() - .onMalformedInput(CodingErrorAction.REPORT) - .onUnmappableCharacter(CodingErrorAction.REPORT); - encTL.set(enc); - } - return enc; - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipConstants.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipConstants.java deleted file mode 100644 index c31b2df948..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipConstants.java +++ /dev/null @@ -1,263 +0,0 @@ -/* - * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -/** - * @author Xueming Shen - */ -class ZipConstants { - /* - * Compression methods - */ - static final int METHOD_STORED = 0; - static final int METHOD_DEFLATED = 8; - static final int METHOD_DEFLATED64 = 9; - static final int METHOD_BZIP2 = 12; - static final int METHOD_LZMA = 14; - static final int METHOD_LZ77 = 19; - static final int METHOD_AES = 99; - - /* - * General purpose bit flag - */ - static final int FLAG_ENCRYPTED = 0x01; - static final int FLAG_DATADESCR = 0x08; // crc, size and csize in dd - static final int FLAG_USE_UTF8 = 0x800; // If this bit is set the filename and - // comment fields for this file must be - // encoded using UTF-8. - /* - * Header signatures - */ - static long LOCSIG = 0x04034b50L; // "PK\003\004" - static long EXTSIG = 0x08074b50L; // "PK\007\008" - static long CENSIG = 0x02014b50L; // "PK\001\002" - static long ENDSIG = 0x06054b50L; // "PK\005\006" - - /* - * Header sizes in bytes (including signatures) - */ - static final int LOCHDR = 30; // LOC header size - static final int EXTHDR = 16; // EXT header size - static final int CENHDR = 46; // CEN header size - static final int ENDHDR = 22; // END header size - - /* - * File attribute compatibility types of CEN field "version made by" - */ - static final int FILE_ATTRIBUTES_UNIX = 3; // Unix - - /* - * Base values for CEN field "version made by" - */ - static final int VERSION_MADE_BY_BASE_UNIX = FILE_ATTRIBUTES_UNIX << 8; // Unix - - /* - * Local file (LOC) header field offsets - */ - static final int LOCVER = 4; // version needed to extract - static final int LOCFLG = 6; // general purpose bit flag - static final int LOCHOW = 8; // compression method - static final int LOCTIM = 10; // modification time - static final int LOCCRC = 14; // uncompressed file crc-32 value - static final int LOCSIZ = 18; // compressed size - static final int LOCLEN = 22; // uncompressed size - static final int LOCNAM = 26; // filename length - static final int LOCEXT = 28; // extra field length - - /* - * Extra local (EXT) header field offsets - */ - static final int EXTCRC = 4; // uncompressed file crc-32 value - static final int EXTSIZ = 8; // compressed size - static final int EXTLEN = 12; // uncompressed size - - /* - * Central directory (CEN) header field offsets - */ - static final int CENVEM = 4; // version made by - static final int CENVER = 6; // version needed to extract - static final int CENFLG = 8; // encrypt, decrypt flags - static final int CENHOW = 10; // compression method - static final int CENTIM = 12; // modification time - static final int CENCRC = 16; // uncompressed file crc-32 value - static final int CENSIZ = 20; // compressed size - static final int CENLEN = 24; // uncompressed size - static final int CENNAM = 28; // filename length - static final int CENEXT = 30; // extra field length - static final int CENCOM = 32; // comment length - static final int CENDSK = 34; // disk number start - static final int CENATT = 36; // internal file attributes - static final int CENATX = 38; // external file attributes - static final int CENOFF = 42; // LOC header offset - - /* - * End of central directory (END) header field offsets - */ - static final int ENDSUB = 8; // number of entries on this disk - static final int ENDTOT = 10; // total number of entries - static final int ENDSIZ = 12; // central directory size in bytes - static final int ENDOFF = 16; // offset of first CEN header - static final int ENDCOM = 20; // zip file comment length - - /* - * ZIP64 constants - */ - static final long ZIP64_ENDSIG = 0x06064b50L; // "PK\006\006" - static final long ZIP64_LOCSIG = 0x07064b50L; // "PK\006\007" - static final int ZIP64_ENDHDR = 56; // ZIP64 end header size - static final int ZIP64_LOCHDR = 20; // ZIP64 end loc header size - static final int ZIP64_EXTHDR = 24; // EXT header size - static final int ZIP64_EXTID = 0x0001; // Extra field Zip64 header ID - - static final int ZIP64_MINVAL32 = 0xFFFF; - static final long ZIP64_MINVAL = 0xFFFFFFFFL; - - /* - * Zip64 End of central directory (END) header field offsets - */ - static final int ZIP64_ENDLEN = 4; // size of zip64 end of central dir - static final int ZIP64_ENDVEM = 12; // version made by - static final int ZIP64_ENDVER = 14; // version needed to extract - static final int ZIP64_ENDNMD = 16; // number of this disk - static final int ZIP64_ENDDSK = 20; // disk number of start - static final int ZIP64_ENDTOD = 24; // total number of entries on this disk - static final int ZIP64_ENDTOT = 32; // total number of entries - static final int ZIP64_ENDSIZ = 40; // central directory size in bytes - static final int ZIP64_ENDOFF = 48; // offset of first CEN header - static final int ZIP64_ENDEXT = 56; // zip64 extensible data sector - - /* - * Zip64 End of central directory locator field offsets - */ - static final int ZIP64_LOCDSK = 4; // disk number start - static final int ZIP64_LOCOFF = 8; // offset of zip64 end - static final int ZIP64_LOCTOT = 16; // total number of disks - - /* - * Zip64 Extra local (EXT) header field offsets - */ - static final int ZIP64_EXTCRC = 4; // uncompressed file crc-32 value - static final int ZIP64_EXTSIZ = 8; // compressed size, 8-byte - static final int ZIP64_EXTLEN = 16; // uncompressed size, 8-byte - - /* - * Extra field header ID - */ - static final int EXTID_ZIP64 = 0x0001; // ZIP64 - static final int EXTID_NTFS = 0x000a; // NTFS - static final int EXTID_UNIX = 0x000d; // UNIX - static final int EXTID_EFS = 0x0017; // Strong Encryption - static final int EXTID_EXTT = 0x5455; // Info-ZIP Extended Timestamp - - /* - * fields access methods - */ - /////////////////////////////////////////////////////// - static final int CH(byte[] b, int n) { - return Byte.toUnsignedInt(b[n]); - } - - static final int SH(byte[] b, int n) { - return Byte.toUnsignedInt(b[n]) | (Byte.toUnsignedInt(b[n + 1]) << 8); - } - - static final long LG(byte[] b, int n) { - return ((SH(b, n)) | (SH(b, n + 2) << 16)) & 0xffffffffL; - } - - static final long LL(byte[] b, int n) { - return (LG(b, n)) | (LG(b, n + 4) << 32); - } - - static long getSig(byte[] b, int n) { return LG(b, n); } - - private static boolean pkSigAt(byte[] b, int n, int b1, int b2) { - return b[n] == 'P' & b[n + 1] == 'K' & b[n + 2] == b1 & b[n + 3] == b2; - } - - static boolean cenSigAt(byte[] b, int n) { return pkSigAt(b, n, 1, 2); } - static boolean locSigAt(byte[] b, int n) { return pkSigAt(b, n, 3, 4); } - static boolean endSigAt(byte[] b, int n) { return pkSigAt(b, n, 5, 6); } - static boolean extSigAt(byte[] b, int n) { return pkSigAt(b, n, 7, 8); } - static boolean end64SigAt(byte[] b, int n) { return pkSigAt(b, n, 6, 6); } - static boolean locator64SigAt(byte[] b, int n) { return pkSigAt(b, n, 6, 7); } - - // local file (LOC) header fields - static final long LOCSIG(byte[] b) { return LG(b, 0); } // signature - static final int LOCVER(byte[] b) { return SH(b, 4); } // version needed to extract - static final int LOCFLG(byte[] b) { return SH(b, 6); } // general purpose bit flags - static final int LOCHOW(byte[] b) { return SH(b, 8); } // compression method - static final long LOCTIM(byte[] b) { return LG(b, 10);} // modification time - static final long LOCCRC(byte[] b) { return LG(b, 14);} // crc of uncompressed data - static final long LOCSIZ(byte[] b) { return LG(b, 18);} // compressed data size - static final long LOCLEN(byte[] b) { return LG(b, 22);} // uncompressed data size - static final int LOCNAM(byte[] b) { return SH(b, 26);} // filename length - static final int LOCEXT(byte[] b) { return SH(b, 28);} // extra field length - - // extra local (EXT) header fields - static final long EXTCRC(byte[] b) { return LG(b, 4);} // crc of uncompressed data - static final long EXTSIZ(byte[] b) { return LG(b, 8);} // compressed size - static final long EXTLEN(byte[] b) { return LG(b, 12);} // uncompressed size - - // end of central directory header (END) fields - static final int ENDSUB(byte[] b) { return SH(b, 8); } // number of entries on this disk - static final int ENDTOT(byte[] b) { return SH(b, 10);} // total number of entries - static final long ENDSIZ(byte[] b) { return LG(b, 12);} // central directory size - static final long ENDOFF(byte[] b) { return LG(b, 16);} // central directory offset - static final int ENDCOM(byte[] b) { return SH(b, 20);} // size of zip file comment - static final int ENDCOM(byte[] b, int off) { return SH(b, off + 20);} - - // zip64 end of central directory recoder fields - static final long ZIP64_ENDTOD(byte[] b) { return LL(b, 24);} // total number of entries on disk - static final long ZIP64_ENDTOT(byte[] b) { return LL(b, 32);} // total number of entries - static final long ZIP64_ENDSIZ(byte[] b) { return LL(b, 40);} // central directory size - static final long ZIP64_ENDOFF(byte[] b) { return LL(b, 48);} // central directory offset - static final long ZIP64_LOCOFF(byte[] b) { return LL(b, 8);} // zip64 end offset - - // central directory header (CEN) fields - static final long CENSIG(byte[] b, int pos) { return LG(b, pos + 0); } // signature - static final int CENVEM(byte[] b, int pos) { return SH(b, pos + 4); } // version made by - static final int CENVEM_FA(byte[] b, int pos) { return CH(b, pos + 5); } // file attribute compatibility - static final int CENVER(byte[] b, int pos) { return SH(b, pos + 6); } // version needed to extract - static final int CENFLG(byte[] b, int pos) { return SH(b, pos + 8); } // encrypt, decrypt flags - static final int CENHOW(byte[] b, int pos) { return SH(b, pos + 10);} // compression method - static final long CENTIM(byte[] b, int pos) { return LG(b, pos + 12);} // modification time - static final long CENCRC(byte[] b, int pos) { return LG(b, pos + 16);} // uncompressed file crc-32 value - static final long CENSIZ(byte[] b, int pos) { return LG(b, pos + 20);} // compressed size - static final long CENLEN(byte[] b, int pos) { return LG(b, pos + 24);} // uncompressed size - static final int CENNAM(byte[] b, int pos) { return SH(b, pos + 28);} // filename length - static final int CENEXT(byte[] b, int pos) { return SH(b, pos + 30);} // extra field length - static final int CENCOM(byte[] b, int pos) { return SH(b, pos + 32);} // comment length - static final int CENDSK(byte[] b, int pos) { return SH(b, pos + 34);} // disk number start - static final int CENATT(byte[] b, int pos) { return SH(b, pos + 36);} // internal file attributes - static final long CENATX(byte[] b, int pos) { return LG(b, pos + 38);} // external file attributes - static final int CENATX_PERMS(byte[] b, int pos) { return SH(b, pos + 40);} // posix permission data - static final long CENOFF(byte[] b, int pos) { return LG(b, pos + 42);} // LOC header offset - - /* The END header is followed by a variable length comment of size < 64k. */ - static final long END_MAXLEN = 0xFFFF + ENDHDR; - static final int READBLOCKSZ = 128; -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipDirectoryStream.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipDirectoryStream.java deleted file mode 100644 index e626324e4b..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipDirectoryStream.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.io.IOException; -import java.nio.file.ClosedDirectoryStreamException; -import java.nio.file.DirectoryIteratorException; -import java.nio.file.DirectoryStream; -import java.nio.file.NotDirectoryException; -import java.nio.file.Path; -import java.util.Iterator; -import java.util.NoSuchElementException; - -/** - * - * @author Xueming Shen, Rajendra Gutupalli, Jaya Hangal - */ -class ZipDirectoryStream implements DirectoryStream { - - private final ZipFileSystem zipfs; - private final ZipPath dir; - private final DirectoryStream.Filter filter; - private volatile boolean isClosed; - private volatile Iterator itr; - - ZipDirectoryStream(ZipPath dir, - DirectoryStream.Filter filter) - throws IOException - { - this.zipfs = dir.getFileSystem(); - this.dir = dir; - this.filter = filter; - // sanity check - if (!zipfs.isDirectory(dir.getResolvedPath())) - throw new NotDirectoryException(dir.toString()); - } - - @Override - public synchronized Iterator iterator() { - if (isClosed) - throw new ClosedDirectoryStreamException(); - if (itr != null) - throw new IllegalStateException("Iterator has already been returned"); - - try { - itr = zipfs.iteratorOf(dir, filter); - } catch (IOException e) { - throw new DirectoryIteratorException(e); - } - - return new Iterator() { - @Override - public boolean hasNext() { - if (isClosed) - return false; - return itr.hasNext(); - } - - @Override - public synchronized Path next() { - if (isClosed) - throw new NoSuchElementException(); - return itr.next(); - } - - @Override - public void remove() { - throw new UnsupportedOperationException(); - } - }; - } - - @Override - public synchronized void close() throws IOException { - isClosed = true; - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileAttributeView.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileAttributeView.java deleted file mode 100644 index 07b72a53cf..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileAttributeView.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.io.IOException; -import java.nio.file.attribute.BasicFileAttributeView; -import java.nio.file.attribute.BasicFileAttributes; -import java.nio.file.attribute.FileTime; -import java.nio.file.attribute.PosixFilePermission; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Set; - -/** - * @author Xueming Shen, Rajendra Gutupalli, Jaya Hangal - */ -class ZipFileAttributeView implements BasicFileAttributeView { - static enum AttrID { - size, - creationTime, - lastAccessTime, - lastModifiedTime, - isDirectory, - isRegularFile, - isSymbolicLink, - isOther, - fileKey, - compressedSize, - crc, - method, - owner, - group, - permissions - } - - final ZipPath path; - private final boolean isZipView; - - ZipFileAttributeView(ZipPath path, boolean isZipView) { - this.path = path; - this.isZipView = isZipView; - } - - @Override - public String name() { - return isZipView ? "zip" : "basic"; - } - - @Override - public BasicFileAttributes readAttributes() throws IOException { - return path.readAttributes(); - } - - @Override - public void setTimes(FileTime lastModifiedTime, - FileTime lastAccessTime, - FileTime createTime) - throws IOException - { - path.setTimes(lastModifiedTime, lastAccessTime, createTime); - } - - public void setPermissions(Set perms) throws IOException { - path.setPermissions(perms); - } - - @SuppressWarnings("unchecked") - void setAttribute(String attribute, Object value) - throws IOException - { - try { - if (AttrID.valueOf(attribute) == AttrID.lastModifiedTime) - setTimes((FileTime)value, null, null); - if (AttrID.valueOf(attribute) == AttrID.lastAccessTime) - setTimes(null, (FileTime)value, null); - if (AttrID.valueOf(attribute) == AttrID.creationTime) - setTimes(null, null, (FileTime)value); - if (AttrID.valueOf(attribute) == AttrID.permissions) - setPermissions((Set)value); - } catch (IllegalArgumentException x) { - throw new UnsupportedOperationException("'" + attribute + - "' is unknown or read-only attribute"); - } - } - - Map readAttributes(String attributes) - throws IOException - { - ZipFileAttributes zfas = (ZipFileAttributes)readAttributes(); - LinkedHashMap map = new LinkedHashMap<>(); - if ("*".equals(attributes)) { - for (AttrID id : AttrID.values()) { - try { - map.put(id.name(), attribute(id, zfas)); - } catch (IllegalArgumentException x) {} - } - } else { - String[] as = attributes.split(","); - for (String a : as) { - try { - map.put(a, attribute(AttrID.valueOf(a), zfas)); - } catch (IllegalArgumentException x) {} - } - } - return map; - } - - Object attribute(AttrID id, ZipFileAttributes zfas) { - switch (id) { - case size: - return zfas.size(); - case creationTime: - return zfas.creationTime(); - case lastAccessTime: - return zfas.lastAccessTime(); - case lastModifiedTime: - return zfas.lastModifiedTime(); - case isDirectory: - return zfas.isDirectory(); - case isRegularFile: - return zfas.isRegularFile(); - case isSymbolicLink: - return zfas.isSymbolicLink(); - case isOther: - return zfas.isOther(); - case fileKey: - return zfas.fileKey(); - case compressedSize: - if (isZipView) - return zfas.compressedSize(); - break; - case crc: - if (isZipView) - return zfas.crc(); - break; - case method: - if (isZipView) - return zfas.method(); - break; - case permissions: - if (isZipView) { - return zfas.storedPermissions().orElse(null); - } - break; - default: - break; - } - return null; - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileAttributes.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileAttributes.java deleted file mode 100644 index 8b631b3867..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileAttributes.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.nio.file.attribute.BasicFileAttributes; -import java.nio.file.attribute.PosixFilePermission; -import java.util.Optional; -import java.util.Set; - -/** - * The attributes of a file stored in a zip file. - * - * @author Xueming Shen, Rajendra Gutupalli, Jaya Hangal - */ -interface ZipFileAttributes extends BasicFileAttributes { - long compressedSize(); - long crc(); - int method(); - byte[] extra(); - byte[] comment(); - Optional> storedPermissions(); -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileStore.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileStore.java deleted file mode 100644 index 7da4c4d7c5..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileStore.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.io.IOException; -import java.nio.file.FileStore; -import java.nio.file.FileSystems; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.attribute.BasicFileAttributeView; -import java.nio.file.attribute.FileAttributeView; -import java.nio.file.attribute.FileOwnerAttributeView; -import java.nio.file.attribute.FileStoreAttributeView; -import java.nio.file.attribute.PosixFileAttributeView; - -/** - * @author Xueming Shen, Rajendra Gutupalli, Jaya Hangal - */ -class ZipFileStore extends FileStore { - - private final ZipFileSystem zfs; - - ZipFileStore(ZipPath zpath) { - this.zfs = zpath.getFileSystem(); - } - - @Override - public String name() { - return zfs.toString() + "/"; - } - - @Override - public String type() { - return "zipfs"; - } - - @Override - public boolean isReadOnly() { - return zfs.isReadOnly(); - } - - @Override - public boolean supportsFileAttributeView(Class type) { - return (type == BasicFileAttributeView.class || - type == ZipFileAttributeView.class || - ((type == FileOwnerAttributeView.class || - type == PosixFileAttributeView.class) && zfs.supportPosix)); - } - - @Override - public boolean supportsFileAttributeView(String name) { - return "basic".equals(name) || "zip".equals(name) || - (("owner".equals(name) || "posix".equals(name)) && zfs.supportPosix); - } - - @Override - public V getFileStoreAttributeView(Class type) { - if (type == null) - throw new NullPointerException(); - return null; - } - - @Override - public long getTotalSpace() throws IOException { - return new ZipFileStoreAttributes(this).totalSpace(); - } - - @Override - public long getUsableSpace() throws IOException { - return new ZipFileStoreAttributes(this).usableSpace(); - } - - @Override - public long getUnallocatedSpace() throws IOException { - return new ZipFileStoreAttributes(this).unallocatedSpace(); - } - - @Override - public Object getAttribute(String attribute) throws IOException { - if (attribute.equals("totalSpace")) - return getTotalSpace(); - if (attribute.equals("usableSpace")) - return getUsableSpace(); - if (attribute.equals("unallocatedSpace")) - return getUnallocatedSpace(); - throw new UnsupportedOperationException("does not support the given attribute"); - } - - private static class ZipFileStoreAttributes { - final FileStore fstore; - final long size; - - ZipFileStoreAttributes(ZipFileStore fileStore) - throws IOException - { - Path path = FileSystems.getDefault().getPath(fileStore.name()); - this.size = Files.size(path); - this.fstore = Files.getFileStore(path); - } - - long totalSpace() { - return size; - } - - long usableSpace() throws IOException { - if (!fstore.isReadOnly()) - return fstore.getUsableSpace(); - return 0; - } - - long unallocatedSpace() throws IOException { - if (!fstore.isReadOnly()) - return fstore.getUnallocatedSpace(); - return 0; - } - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileSystem.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileSystem.java deleted file mode 100644 index 76b804b502..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileSystem.java +++ /dev/null @@ -1,3406 +0,0 @@ -/* - * Copyright (c) 2009, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.io.BufferedOutputStream; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.EOFException; -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.nio.ByteBuffer; -import java.nio.MappedByteBuffer; -import java.nio.channels.FileChannel; -import java.nio.channels.FileLock; -import java.nio.channels.ReadableByteChannel; -import java.nio.channels.SeekableByteChannel; -import java.nio.channels.WritableByteChannel; -import java.nio.file.*; -import java.nio.file.attribute.*; -import java.nio.file.spi.FileSystemProvider; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.util.*; -import java.util.concurrent.locks.ReadWriteLock; -import java.util.concurrent.locks.ReentrantReadWriteLock; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.jar.Attributes; -import java.util.jar.Manifest; -import java.util.regex.Pattern; -import java.util.zip.CRC32; -import java.util.zip.Deflater; -import java.util.zip.DeflaterOutputStream; -import java.util.zip.Inflater; -import java.util.zip.InflaterInputStream; -import java.util.zip.ZipException; - -import static java.lang.Boolean.TRUE; -import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES; -import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; -import static java.nio.file.StandardOpenOption.APPEND; -import static java.nio.file.StandardOpenOption.CREATE; -import static java.nio.file.StandardOpenOption.CREATE_NEW; -import static java.nio.file.StandardOpenOption.READ; -import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING; -import static java.nio.file.StandardOpenOption.WRITE; -import static app.revanced.manager.backend.utils.filesystem.zipfs.ZipConstants.*; -import static app.revanced.manager.backend.utils.filesystem.zipfs.ZipUtils.*; - -/** - * A FileSystem built on a zip file - * - * @author Xueming Shen - */ -class ZipFileSystem extends FileSystem { - // statics - @SuppressWarnings("removal") - private static final boolean isWindows = AccessController.doPrivileged( - (PrivilegedAction)()->System.getProperty("os.name") - .startsWith("Windows")); - private static final byte[] ROOTPATH = new byte[] { '/' }; - private static final String PROPERTY_POSIX = "enablePosixFileAttributes"; - private static final String PROPERTY_DEFAULT_OWNER = "defaultOwner"; - private static final String PROPERTY_DEFAULT_GROUP = "defaultGroup"; - private static final String PROPERTY_DEFAULT_PERMISSIONS = "defaultPermissions"; - // Property used to specify the entry version to use for a multi-release JAR - private static final String PROPERTY_RELEASE_VERSION = "releaseVersion"; - // Original property used to specify the entry version to use for a - // multi-release JAR which is kept for backwards compatibility. - private static final String PROPERTY_MULTI_RELEASE = "multi-release"; - - private static final Set DEFAULT_PERMISSIONS = - PosixFilePermissions.fromString("rwxrwxrwx"); - // Property used to specify the compression mode to use - private static final String PROPERTY_COMPRESSION_METHOD = "compressionMethod"; - // Value specified for compressionMethod property to compress Zip entries - private static final String COMPRESSION_METHOD_DEFLATED = "DEFLATED"; - // Value specified for compressionMethod property to not compress Zip entries - private static final String COMPRESSION_METHOD_STORED = "STORED"; - - private final ZipFileSystemProvider provider; - private final Path zfpath; - final ZipCoder zc; - private final ZipPath rootdir; - private boolean readOnly; // readonly file system, false by default - - // default time stamp for pseudo entries - private final long zfsDefaultTimeStamp = System.currentTimeMillis(); - - // configurable by env map - private final boolean noExtt; // see readExtra() - private final boolean useTempFile; // use a temp file for newOS, default - // is to use BAOS for better performance - - // a threshold, in bytes, to decide whether to create a temp file - // for outputstream of a zip entry - private final int tempFileCreationThreshold = 10 * 1024 * 1024; // 10 MB - - private final boolean forceEnd64; - private final int defaultCompressionMethod; // METHOD_STORED if "noCompression=true" - // METHOD_DEFLATED otherwise - - // entryLookup is identity by default, will be overridden for multi-release jars - private Function entryLookup = Function.identity(); - - // POSIX support - final boolean supportPosix; - private final UserPrincipal defaultOwner; - private final GroupPrincipal defaultGroup; - private final Set defaultPermissions; - - private final Set supportedFileAttributeViews; - - ZipFileSystem(ZipFileSystemProvider provider, - Path zfpath, - Map env) throws IOException - { - // default encoding for name/comment - String nameEncoding = env.containsKey("encoding") ? - (String)env.get("encoding") : "UTF-8"; - this.noExtt = "false".equals(env.get("zipinfo-time")); - this.useTempFile = isTrue(env, "useTempFile"); - this.forceEnd64 = isTrue(env, "forceZIP64End"); - this.defaultCompressionMethod = getDefaultCompressionMethod(env); - this.supportPosix = isTrue(env, PROPERTY_POSIX); - this.defaultOwner = initOwner(zfpath, env); - this.defaultGroup = initGroup(zfpath, env); - this.defaultPermissions = initPermissions(env); - this.supportedFileAttributeViews = supportPosix ? - Set.of("basic", "posix", "zip") : Set.of("basic", "zip"); - if (Files.notExists(zfpath)) { - // create a new zip if it doesn't exist - if (isTrue(env, "create")) { - try (OutputStream os = Files.newOutputStream(zfpath, CREATE_NEW, WRITE)) { - new END().write(os, 0, forceEnd64); - } - } else { - throw new NoSuchFileException(zfpath.toString()); - } - } - // sm and existence check - zfpath.getFileSystem().provider().checkAccess(zfpath, AccessMode.READ); - @SuppressWarnings("removal") - boolean writeable = AccessController.doPrivileged( - (PrivilegedAction)()->Files.isWritable(zfpath)); - this.readOnly = !writeable; - this.zc = ZipCoder.get(nameEncoding); - this.rootdir = new ZipPath(this, new byte[]{'/'}); - this.ch = Files.newByteChannel(zfpath, READ); - try { - this.cen = initCEN(); - } catch (IOException x) { - try { - this.ch.close(); - } catch (IOException xx) { - x.addSuppressed(xx); - } - throw x; - } - this.provider = provider; - this.zfpath = zfpath; - - initializeReleaseVersion(env); - } - - /** - * Return the compression method to use (STORED or DEFLATED). If the - * property {@code commpressionMethod} is set use its value to determine - * the compression method to use. If the property is not set, then the - * default compression is DEFLATED unless the property {@code noCompression} - * is set which is supported for backwards compatibility. - * @param env Zip FS map of properties - * @return The Compression method to use - */ - private int getDefaultCompressionMethod(Map env) { - int result = - isTrue(env, "noCompression") ? ZipConstants.METHOD_STORED : ZipConstants.METHOD_DEFLATED; - if (env.containsKey(PROPERTY_COMPRESSION_METHOD)) { - Object compressionMethod = env.get(PROPERTY_COMPRESSION_METHOD); - if (compressionMethod != null) { - if (compressionMethod instanceof String) { - switch (((String) compressionMethod).toUpperCase()) { - case COMPRESSION_METHOD_STORED: - result = ZipConstants.METHOD_STORED; - break; - case COMPRESSION_METHOD_DEFLATED: - result = ZipConstants.METHOD_DEFLATED; - break; - default: - throw new IllegalArgumentException(String.format( - "The value for the %s property must be %s or %s", - PROPERTY_COMPRESSION_METHOD, COMPRESSION_METHOD_STORED, - COMPRESSION_METHOD_DEFLATED)); - } - } else { - throw new IllegalArgumentException(String.format( - "The Object type for the %s property must be a String", - PROPERTY_COMPRESSION_METHOD)); - } - } else { - throw new IllegalArgumentException(String.format( - "The value for the %s property must be %s or %s", - PROPERTY_COMPRESSION_METHOD, COMPRESSION_METHOD_STORED, - COMPRESSION_METHOD_DEFLATED)); - } - } - return result; - } - - // returns true if there is a name=true/"true" setting in env - private static boolean isTrue(Map env, String name) { - return "true".equals(env.get(name)) || TRUE.equals(env.get(name)); - } - - // Initialize the default owner for files inside the zip archive. - // If not specified in env, it is the owner of the archive. If no owner can - // be determined, we try to go with system property "user.name". If that's not - // accessible, we return "". - @SuppressWarnings("removal") - private UserPrincipal initOwner(Path zfpath, Map env) throws IOException { - Object o = env.get(PROPERTY_DEFAULT_OWNER); - if (o == null) { - try { - PrivilegedExceptionAction pa = ()->Files.getOwner(zfpath); - return AccessController.doPrivileged(pa); - } catch (UnsupportedOperationException | PrivilegedActionException e) { - if (e instanceof UnsupportedOperationException || - e.getCause() instanceof NoSuchFileException) - { - PrivilegedAction pa = ()->System.getProperty("user.name"); - String userName = AccessController.doPrivileged(pa); - return ()->userName; - } else { - throw new IOException(e); - } - } - } - if (o instanceof String) { - if (((String)o).isEmpty()) { - throw new IllegalArgumentException("Value for property " + - PROPERTY_DEFAULT_OWNER + " must not be empty."); - } - return ()->(String)o; - } - if (o instanceof UserPrincipal) { - return (UserPrincipal)o; - } - throw new IllegalArgumentException("Value for property " + - PROPERTY_DEFAULT_OWNER + " must be of type " + String.class + - " or " + UserPrincipal.class); - } - - // Initialize the default group for files inside the zip archive. - // If not specified in env, we try to determine the group of the zip archive itself. - // If this is not possible/unsupported, we will return a group principal going by - // the same name as the default owner. - @SuppressWarnings("removal") - private GroupPrincipal initGroup(Path zfpath, Map env) throws IOException { - Object o = env.get(PROPERTY_DEFAULT_GROUP); - if (o == null) { - try { - PosixFileAttributeView zfpv = Files.getFileAttributeView(zfpath, PosixFileAttributeView.class); - if (zfpv == null) { - return defaultOwner::getName; - } - PrivilegedExceptionAction pa = ()->zfpv.readAttributes().group(); - return AccessController.doPrivileged(pa); - } catch (UnsupportedOperationException | PrivilegedActionException e) { - if (e instanceof UnsupportedOperationException || - e.getCause() instanceof NoSuchFileException) - { - return defaultOwner::getName; - } else { - throw new IOException(e); - } - } - } - if (o instanceof String) { - if (((String)o).isEmpty()) { - throw new IllegalArgumentException("Value for property " + - PROPERTY_DEFAULT_GROUP + " must not be empty."); - } - return ()->(String)o; - } - if (o instanceof GroupPrincipal) { - return (GroupPrincipal)o; - } - throw new IllegalArgumentException("Value for property " + - PROPERTY_DEFAULT_GROUP + " must be of type " + String.class + - " or " + GroupPrincipal.class); - } - - // Initialize the default permissions for files inside the zip archive. - // If not specified in env, it will return 777. - private Set initPermissions(Map env) { - Object o = env.get(PROPERTY_DEFAULT_PERMISSIONS); - if (o == null) { - return DEFAULT_PERMISSIONS; - } - if (o instanceof String) { - return PosixFilePermissions.fromString((String)o); - } - if (!(o instanceof Set)) { - throw new IllegalArgumentException("Value for property " + - PROPERTY_DEFAULT_PERMISSIONS + " must be of type " + String.class + - " or " + Set.class); - } - Set perms = new HashSet<>(); - for (Object o2 : (Set)o) { - if (o2 instanceof PosixFilePermission) { - perms.add((PosixFilePermission)o2); - } else { - throw new IllegalArgumentException(PROPERTY_DEFAULT_PERMISSIONS + - " must only contain objects of type " + PosixFilePermission.class); - } - } - return perms; - } - - @Override - public FileSystemProvider provider() { - return provider; - } - - @Override - public String getSeparator() { - return "/"; - } - - @Override - public boolean isOpen() { - return isOpen; - } - - @Override - public boolean isReadOnly() { - return readOnly; - } - - private void checkWritable() { - if (readOnly) { - throw new ReadOnlyFileSystemException(); - } - } - - void setReadOnly() { - this.readOnly = true; - } - - @Override - public Iterable getRootDirectories() { - return List.of(rootdir); - } - - ZipPath getRootDir() { - return rootdir; - } - - @Override - public ZipPath getPath(String first, String... more) { - if (more.length == 0) { - return new ZipPath(this, first); - } - StringBuilder sb = new StringBuilder(); - sb.append(first); - for (String path : more) { - if (path.length() > 0) { - if (sb.length() > 0) { - sb.append('/'); - } - sb.append(path); - } - } - return new ZipPath(this, sb.toString()); - } - - @Override - public UserPrincipalLookupService getUserPrincipalLookupService() { - throw new UnsupportedOperationException(); - } - - @Override - public WatchService newWatchService() { - throw new UnsupportedOperationException(); - } - - FileStore getFileStore(ZipPath path) { - return new ZipFileStore(path); - } - - @Override - public Iterable getFileStores() { - return List.of(new ZipFileStore(rootdir)); - } - - @Override - public Set supportedFileAttributeViews() { - return supportedFileAttributeViews; - } - - @Override - public String toString() { - return zfpath.toString(); - } - - Path getZipFile() { - return zfpath; - } - - private static final String GLOB_SYNTAX = "glob"; - private static final String REGEX_SYNTAX = "regex"; - - @Override - public PathMatcher getPathMatcher(String syntaxAndInput) { - int pos = syntaxAndInput.indexOf(':'); - if (pos <= 0 || pos == syntaxAndInput.length()) { - throw new IllegalArgumentException(); - } - String syntax = syntaxAndInput.substring(0, pos); - String input = syntaxAndInput.substring(pos + 1); - String expr; - if (syntax.equalsIgnoreCase(GLOB_SYNTAX)) { - expr = toRegexPattern(input); - } else { - if (syntax.equalsIgnoreCase(REGEX_SYNTAX)) { - expr = input; - } else { - throw new UnsupportedOperationException("Syntax '" + syntax + - "' not recognized"); - } - } - // return matcher - final Pattern pattern = Pattern.compile(expr); - return (path)->pattern.matcher(path.toString()).matches(); - } - - @SuppressWarnings("removal") - @Override - public void close() throws IOException { - beginWrite(); - try { - if (!isOpen) - return; - isOpen = false; // set closed - } finally { - endWrite(); - } - if (!streams.isEmpty()) { // unlock and close all remaining streams - Set copy = new HashSet<>(streams); - for (InputStream is : copy) - is.close(); - } - beginWrite(); // lock and sync - try { - AccessController.doPrivileged((PrivilegedExceptionAction)() -> { - sync(); return null; - }); - ch.close(); // close the ch just in case no update - // and sync didn't close the ch - } catch (PrivilegedActionException e) { - throw (IOException)e.getException(); - } finally { - endWrite(); - } - - synchronized (inflaters) { - for (Inflater inf : inflaters) - inf.end(); - } - synchronized (deflaters) { - for (Deflater def : deflaters) - def.end(); - } - - beginWrite(); // lock and sync - try { - // Clear the map so that its keys & values can be garbage collected - inodes = null; - } finally { - endWrite(); - } - - IOException ioe = null; - synchronized (tmppaths) { - for (Path p : tmppaths) { - try { - AccessController.doPrivileged( - (PrivilegedExceptionAction)() -> Files.deleteIfExists(p)); - } catch (PrivilegedActionException e) { - IOException x = (IOException)e.getException(); - if (ioe == null) - ioe = x; - else - ioe.addSuppressed(x); - } - } - } - provider.removeFileSystem(zfpath, this); - if (ioe != null) - throw ioe; - } - - ZipFileAttributes getFileAttributes(byte[] path) - throws IOException - { - beginRead(); - try { - ensureOpen(); - IndexNode inode = getInode(path); - if (inode == null) { - return null; - } else if (inode instanceof Entry) { - return (Entry)inode; - } else if (inode.pos == -1) { - // pseudo directory, uses METHOD_STORED - Entry e = supportPosix ? - new PosixEntry(inode.name, inode.isdir, ZipConstants.METHOD_STORED) : - new Entry(inode.name, inode.isdir, ZipConstants.METHOD_STORED); - e.mtime = e.atime = e.ctime = zfsDefaultTimeStamp; - return e; - } else { - return supportPosix ? new PosixEntry(this, inode) : new Entry(this, inode); - } - } finally { - endRead(); - } - } - - void checkAccess(byte[] path) throws IOException { - beginRead(); - try { - ensureOpen(); - // is it necessary to readCEN as a sanity check? - if (getInode(path) == null) { - throw new NoSuchFileException(toString()); - } - - } finally { - endRead(); - } - } - - void setTimes(byte[] path, FileTime mtime, FileTime atime, FileTime ctime) - throws IOException - { - checkWritable(); - beginWrite(); - try { - ensureOpen(); - Entry e = getEntry(path); // ensureOpen checked - if (e == null) - throw new NoSuchFileException(getString(path)); - if (e.type == Entry.CEN) - e.type = Entry.COPY; // copy e - if (mtime != null) - e.mtime = mtime.toMillis(); - if (atime != null) - e.atime = atime.toMillis(); - if (ctime != null) - e.ctime = ctime.toMillis(); - update(e); - } finally { - endWrite(); - } - } - - void setOwner(byte[] path, UserPrincipal owner) throws IOException { - checkWritable(); - beginWrite(); - try { - ensureOpen(); - Entry e = getEntry(path); // ensureOpen checked - if (e == null) { - throw new NoSuchFileException(getString(path)); - } - // as the owner information is not persistent, we don't need to - // change e.type to Entry.COPY - if (e instanceof PosixEntry) { - ((PosixEntry)e).owner = owner; - update(e); - } - } finally { - endWrite(); - } - } - - void setGroup(byte[] path, GroupPrincipal group) throws IOException { - checkWritable(); - beginWrite(); - try { - ensureOpen(); - Entry e = getEntry(path); // ensureOpen checked - if (e == null) { - throw new NoSuchFileException(getString(path)); - } - // as the group information is not persistent, we don't need to - // change e.type to Entry.COPY - if (e instanceof PosixEntry) { - ((PosixEntry)e).group = group; - update(e); - } - } finally { - endWrite(); - } - } - - void setPermissions(byte[] path, Set perms) throws IOException { - checkWritable(); - beginWrite(); - try { - ensureOpen(); - Entry e = getEntry(path); // ensureOpen checked - if (e == null) { - throw new NoSuchFileException(getString(path)); - } - if (e.type == Entry.CEN) { - e.type = Entry.COPY; // copy e - } - e.posixPerms = perms == null ? -1 : ZipUtils.permsToFlags(perms); - update(e); - } finally { - endWrite(); - } - } - - boolean exists(byte[] path) { - beginRead(); - try { - ensureOpen(); - return getInode(path) != null; - } finally { - endRead(); - } - } - - boolean isDirectory(byte[] path) { - beginRead(); - try { - IndexNode n = getInode(path); - return n != null && n.isDir(); - } finally { - endRead(); - } - } - - // returns the list of child paths of "path" - Iterator iteratorOf(ZipPath dir, - DirectoryStream.Filter filter) - throws IOException - { - beginWrite(); // iteration of inodes needs exclusive lock - try { - ensureOpen(); - byte[] path = dir.getResolvedPath(); - IndexNode inode = getInode(path); - if (inode == null) - throw new NotDirectoryException(getString(path)); - List list = new ArrayList<>(); - IndexNode child = inode.child; - while (child != null) { - // (1) Assume each path from the zip file itself is "normalized" - // (2) IndexNode.name is absolute. see IndexNode(byte[],int,int) - // (3) If parent "dir" is relative when ZipDirectoryStream - // is created, the returned child path needs to be relative - // as well. - ZipPath childPath = new ZipPath(this, child.name, true); - ZipPath childFileName = childPath.getFileName(); - ZipPath zpath = dir.resolve(childFileName); - if (filter == null || filter.accept(zpath)) - list.add(zpath); - child = child.sibling; - } - return list.iterator(); - } finally { - endWrite(); - } - } - - void createDirectory(byte[] dir, FileAttribute... attrs) throws IOException { - checkWritable(); - beginWrite(); - try { - ensureOpen(); - if (dir.length == 0 || exists(dir)) // root dir, or existing dir - throw new FileAlreadyExistsException(getString(dir)); - checkParents(dir); - Entry e = supportPosix ? - new PosixEntry(dir, Entry.NEW, true, ZipConstants.METHOD_STORED, attrs) : - new Entry(dir, Entry.NEW, true, ZipConstants.METHOD_STORED, attrs); - update(e); - } finally { - endWrite(); - } - } - - void copyFile(boolean deletesrc, byte[]src, byte[] dst, CopyOption... options) - throws IOException - { - checkWritable(); - if (Arrays.equals(src, dst)) - return; // do nothing, src and dst are the same - - beginWrite(); - try { - ensureOpen(); - Entry eSrc = getEntry(src); // ensureOpen checked - - if (eSrc == null) - throw new NoSuchFileException(getString(src)); - if (eSrc.isDir()) { // spec says to create dst dir - createDirectory(dst); - return; - } - boolean hasReplace = false; - boolean hasCopyAttrs = false; - for (CopyOption opt : options) { - if (opt == REPLACE_EXISTING) - hasReplace = true; - else if (opt == COPY_ATTRIBUTES) - hasCopyAttrs = true; - } - Entry eDst = getEntry(dst); - if (eDst != null) { - if (!hasReplace) - throw new FileAlreadyExistsException(getString(dst)); - } else { - checkParents(dst); - } - // copy eSrc entry and change name - Entry u = supportPosix ? - new PosixEntry((PosixEntry)eSrc, Entry.COPY) : - new Entry(eSrc, Entry.COPY); - u.name(dst); - if (eSrc.type == Entry.NEW || eSrc.type == Entry.FILECH) { - u.type = eSrc.type; // make it the same type - if (deletesrc) { // if it's a "rename", take the data - u.bytes = eSrc.bytes; - u.file = eSrc.file; - } else { // if it's not "rename", copy the data - if (eSrc.bytes != null) - u.bytes = Arrays.copyOf(eSrc.bytes, eSrc.bytes.length); - else if (eSrc.file != null) { - u.file = getTempPathForEntry(null); - Files.copy(eSrc.file, u.file, REPLACE_EXISTING); - } - } - } else if (eSrc.type == Entry.CEN && eSrc.method != defaultCompressionMethod) { - - /** - * We are copying a file within the same Zip file using a - * different compression method. - */ - try (InputStream in = newInputStream(src); - OutputStream out = newOutputStream(dst, - CREATE, TRUNCATE_EXISTING, WRITE)) { - StreamUtils.transferTo(in, out); - } - u = getEntry(dst); - } - - if (!hasCopyAttrs) - u.mtime = u.atime= u.ctime = System.currentTimeMillis(); - update(u); - if (deletesrc) - updateDelete(eSrc); - } finally { - endWrite(); - } - } - - // Returns an output stream for writing the contents into the specified - // entry. - OutputStream newOutputStream(byte[] path, OpenOption... options) - throws IOException - { - checkWritable(); - boolean hasCreateNew = false; - boolean hasCreate = false; - boolean hasAppend = false; - boolean hasTruncate = false; - for (OpenOption opt : options) { - if (opt == READ) - throw new IllegalArgumentException("READ not allowed"); - if (opt == CREATE_NEW) - hasCreateNew = true; - if (opt == CREATE) - hasCreate = true; - if (opt == APPEND) - hasAppend = true; - if (opt == TRUNCATE_EXISTING) - hasTruncate = true; - } - if (hasAppend && hasTruncate) - throw new IllegalArgumentException("APPEND + TRUNCATE_EXISTING not allowed"); - beginRead(); // only need a readlock, the "update()" will - try { // try to obtain a writelock when the os is - ensureOpen(); // being closed. - Entry e = getEntry(path); - if (e != null) { - if (e.isDir() || hasCreateNew) - throw new FileAlreadyExistsException(getString(path)); - if (hasAppend) { - OutputStream os = getOutputStream(new Entry(e, Entry.NEW)); - try (InputStream is = getInputStream(e)) { - StreamUtils.transferTo(is, os); - } - return os; - } - return getOutputStream(supportPosix ? - new PosixEntry((PosixEntry)e, Entry.NEW, defaultCompressionMethod) - : new Entry(e, Entry.NEW, defaultCompressionMethod)); - } else { - if (!hasCreate && !hasCreateNew) - throw new NoSuchFileException(getString(path)); - checkParents(path); - return getOutputStream(supportPosix ? - new PosixEntry(path, Entry.NEW, false, defaultCompressionMethod) : - new Entry(path, Entry.NEW, false, defaultCompressionMethod)); - } - } finally { - endRead(); - } - } - - // Returns an input stream for reading the contents of the specified - // file entry. - InputStream newInputStream(byte[] path) throws IOException { - beginRead(); - try { - ensureOpen(); - Entry e = getEntry(path); - if (e == null) - throw new NoSuchFileException(getString(path)); - if (e.isDir()) - throw new FileSystemException(getString(path), "is a directory", null); - return getInputStream(e); - } finally { - endRead(); - } - } - - private void checkOptions(Set options) { - // check for options of null type and option is an intance of StandardOpenOption - for (OpenOption option : options) { - if (option == null) - throw new NullPointerException(); - if (!(option instanceof StandardOpenOption)) - throw new IllegalArgumentException(); - } - if (options.contains(APPEND) && options.contains(TRUNCATE_EXISTING)) - throw new IllegalArgumentException("APPEND + TRUNCATE_EXISTING not allowed"); - } - - // Returns an output SeekableByteChannel for either - // (1) writing the contents of a new entry, if the entry doesn't exist, or - // (2) updating/replacing the contents of an existing entry. - // Note: The content of the channel is not compressed until the - // channel is closed - private class EntryOutputChannel extends ByteArrayChannel { - final Entry e; - - EntryOutputChannel(Entry e) { - super(e.size > 0? (int)e.size : 8192, false); - this.e = e; - if (e.mtime == -1) - e.mtime = System.currentTimeMillis(); - if (e.method == -1) - e.method = defaultCompressionMethod; - // store size, compressed size, and crc-32 in datadescriptor - e.flag = ZipConstants.FLAG_DATADESCR; - if (zc.isUTF8()) - e.flag |= ZipConstants.FLAG_USE_UTF8; - } - - @Override - public void close() throws IOException { - super.beginWrite(); - try { - if (!isOpen()) - return; - // will update the entry - try (OutputStream os = getOutputStream(e)) { - os.write(toByteArray()); - } - super.close(); - } finally { - super.endWrite(); - } - } - } - - // Returns a Writable/ReadByteChannel for now. Might consider to use - // newFileChannel() instead, which dump the entry data into a regular - // file on the default file system and create a FileChannel on top of it. - SeekableByteChannel newByteChannel(byte[] path, - Set options, - FileAttribute... attrs) - throws IOException - { - checkOptions(options); - if (options.contains(StandardOpenOption.WRITE) || - options.contains(StandardOpenOption.APPEND)) { - checkWritable(); - beginRead(); // only need a read lock, the "update()" will obtain - // the write lock when the channel is closed - ensureOpen(); - try { - Entry e = getEntry(path); - if (e != null) { - if (e.isDir() || options.contains(CREATE_NEW)) - throw new FileAlreadyExistsException(getString(path)); - SeekableByteChannel sbc = - new EntryOutputChannel(supportPosix ? - new PosixEntry((PosixEntry)e, Entry.NEW) : - new Entry(e, Entry.NEW)); - if (options.contains(APPEND)) { - try (InputStream is = getInputStream(e)) { // copyover - byte[] buf = new byte[8192]; - ByteBuffer bb = ByteBuffer.wrap(buf); - int n; - while ((n = is.read(buf)) != -1) { - bb.position(0); - bb.limit(n); - sbc.write(bb); - } - } - } - return sbc; - } - if (!options.contains(CREATE) && !options.contains(CREATE_NEW)) - throw new NoSuchFileException(getString(path)); - checkParents(path); - return new EntryOutputChannel( - supportPosix ? - new PosixEntry(path, Entry.NEW, false, defaultCompressionMethod, attrs) : - new Entry(path, Entry.NEW, false, defaultCompressionMethod, attrs)); - } finally { - endRead(); - } - } else { - beginRead(); - try { - ensureOpen(); - Entry e = getEntry(path); - if (e == null || e.isDir()) - throw new NoSuchFileException(getString(path)); - try (InputStream is = getInputStream(e)) { - // TBD: if (e.size < NNNNN); - return new ByteArrayChannel(StreamUtils.readAllBytes(is), true); - } - } finally { - endRead(); - } - } - } - - // Returns a FileChannel of the specified entry. - // - // This implementation creates a temporary file on the default file system, - // copy the entry data into it if the entry exists, and then create a - // FileChannel on top of it. - FileChannel newFileChannel(byte[] path, - Set options, - FileAttribute... attrs) - throws IOException - { - checkOptions(options); - final boolean forWrite = (options.contains(StandardOpenOption.WRITE) || - options.contains(StandardOpenOption.APPEND)); - beginRead(); - try { - ensureOpen(); - Entry e = getEntry(path); - if (forWrite) { - checkWritable(); - if (e == null) { - if (!options.contains(StandardOpenOption.CREATE) && - !options.contains(StandardOpenOption.CREATE_NEW)) { - throw new NoSuchFileException(getString(path)); - } - } else { - if (options.contains(StandardOpenOption.CREATE_NEW)) { - throw new FileAlreadyExistsException(getString(path)); - } - if (e.isDir()) - throw new FileAlreadyExistsException("directory <" - + getString(path) + "> exists"); - } - options = new HashSet<>(options); - options.remove(StandardOpenOption.CREATE_NEW); // for tmpfile - } else if (e == null || e.isDir()) { - throw new NoSuchFileException(getString(path)); - } - - final boolean isFCH = (e != null && e.type == Entry.FILECH); - final Path tmpfile = isFCH ? e.file : getTempPathForEntry(path); - final FileChannel fch = tmpfile.getFileSystem() - .provider() - .newFileChannel(tmpfile, options, attrs); - final Entry u = isFCH ? e : ( - supportPosix ? - new PosixEntry(path, tmpfile, Entry.FILECH, attrs) : - new Entry(path, tmpfile, Entry.FILECH, attrs)); - if (forWrite) { - u.flag = ZipConstants.FLAG_DATADESCR; - u.method = defaultCompressionMethod; - } - // is there a better way to hook into the FileChannel's close method? - return new FileChannel() { - public int write(ByteBuffer src) throws IOException { - return fch.write(src); - } - public long write(ByteBuffer[] srcs, int offset, int length) - throws IOException - { - return fch.write(srcs, offset, length); - } - public long position() throws IOException { - return fch.position(); - } - public FileChannel position(long newPosition) - throws IOException - { - fch.position(newPosition); - return this; - } - public long size() throws IOException { - return fch.size(); - } - public FileChannel truncate(long size) - throws IOException - { - fch.truncate(size); - return this; - } - public void force(boolean metaData) - throws IOException - { - fch.force(metaData); - } - public long transferTo(long position, long count, - WritableByteChannel target) - throws IOException - { - return fch.transferTo(position, count, target); - } - public long transferFrom(ReadableByteChannel src, - long position, long count) - throws IOException - { - return fch.transferFrom(src, position, count); - } - public int read(ByteBuffer dst) throws IOException { - return fch.read(dst); - } - public int read(ByteBuffer dst, long position) - throws IOException - { - return fch.read(dst, position); - } - public long read(ByteBuffer[] dsts, int offset, int length) - throws IOException - { - return fch.read(dsts, offset, length); - } - public int write(ByteBuffer src, long position) - throws IOException - { - return fch.write(src, position); - } - public MappedByteBuffer map(MapMode mode, - long position, long size) - { - throw new UnsupportedOperationException(); - } - public FileLock lock(long position, long size, boolean shared) - throws IOException - { - return fch.lock(position, size, shared); - } - public FileLock tryLock(long position, long size, boolean shared) - throws IOException - { - return fch.tryLock(position, size, shared); - } - protected void implCloseChannel() throws IOException { - fch.close(); - if (forWrite) { - u.mtime = System.currentTimeMillis(); - u.size = Files.size(u.file); - update(u); - } else { - if (!isFCH) // if this is a new fch for reading - removeTempPathForEntry(tmpfile); - } - } - }; - } finally { - endRead(); - } - } - - // the outstanding input streams that need to be closed - private Set streams = - Collections.synchronizedSet(new HashSet<>()); - - private final Set tmppaths = Collections.synchronizedSet(new HashSet<>()); - private Path getTempPathForEntry(byte[] path) throws IOException { - Path tmpPath = createTempFileInSameDirectoryAs(zfpath); - if (path != null) { - Entry e = getEntry(path); - if (e != null) { - try (InputStream is = newInputStream(path)) { - Files.copy(is, tmpPath, REPLACE_EXISTING); - } - } - } - return tmpPath; - } - - private void removeTempPathForEntry(Path path) throws IOException { - Files.delete(path); - tmppaths.remove(path); - } - - // check if all parents really exist. ZIP spec does not require - // the existence of any "parent directory". - private void checkParents(byte[] path) throws IOException { - beginRead(); - try { - while ((path = getParent(path)) != null && - path != ROOTPATH) { - if (!inodes.containsKey(IndexNode.keyOf(path))) { - throw new NoSuchFileException(getString(path)); - } - } - } finally { - endRead(); - } - } - - private static byte[] getParent(byte[] path) { - int off = getParentOff(path); - if (off <= 1) - return ROOTPATH; - return Arrays.copyOf(path, off); - } - - private static int getParentOff(byte[] path) { - int off = path.length - 1; - if (off > 0 && path[off] == '/') // isDirectory - off--; - while (off > 0 && path[off] != '/') { off--; } - return off; - } - - private void beginWrite() { - rwlock.writeLock().lock(); - } - - private void endWrite() { - rwlock.writeLock().unlock(); - } - - private void beginRead() { - rwlock.readLock().lock(); - } - - private void endRead() { - rwlock.readLock().unlock(); - } - - /////////////////////////////////////////////////////////////////// - - private volatile boolean isOpen = true; - private final SeekableByteChannel ch; // channel to the zipfile - final byte[] cen; // CEN & ENDHDR - private END end; - private long locpos; // position of first LOC header (usually 0) - - private final ReadWriteLock rwlock = new ReentrantReadWriteLock(); - - // name -> pos (in cen), IndexNode itself can be used as a "key" - private LinkedHashMap inodes; - - final byte[] getBytes(String name) { - return zc.getBytes(name); - } - - final String getString(byte[] name) { - return zc.toString(name); - } - - @SuppressWarnings("deprecation") - protected void finalize() throws IOException { - close(); - } - - // Reads len bytes of data from the specified offset into buf. - // Returns the total number of bytes read. - // Each/every byte read from here (except the cen, which is mapped). - final long readFullyAt(byte[] buf, int off, long len, long pos) - throws IOException - { - ByteBuffer bb = ByteBuffer.wrap(buf); - bb.position(off); - bb.limit((int)(off + len)); - return readFullyAt(bb, pos); - } - - private long readFullyAt(ByteBuffer bb, long pos) throws IOException { - if (ch instanceof FileChannel) { - FileChannel fch = (FileChannel)ch; - return fch.read(bb, pos); - } else { - synchronized(ch) { - return ch.position(pos).read(bb); - } - } - } - - // Searches for end of central directory (END) header. The contents of - // the END header will be read and placed in endbuf. Returns the file - // position of the END header, otherwise returns -1 if the END header - // was not found or an error occurred. - private END findEND() throws IOException { - byte[] buf = new byte[ZipConstants.READBLOCKSZ]; - long ziplen = ch.size(); - long minHDR = (ziplen - ZipConstants.END_MAXLEN) > 0 ? ziplen - ZipConstants.END_MAXLEN : 0; - long minPos = minHDR - (buf.length - ZipConstants.ENDHDR); - - for (long pos = ziplen - buf.length; pos >= minPos; pos -= (buf.length - ZipConstants.ENDHDR)) { - int off = 0; - if (pos < 0) { - // Pretend there are some NUL bytes before start of file - off = (int)-pos; - Arrays.fill(buf, 0, off, (byte)0); - } - int len = buf.length - off; - if (readFullyAt(buf, off, len, pos + off) != len) - throw new ZipException("zip END header not found"); - - // Now scan the block backwards for END header signature - for (int i = buf.length - ZipConstants.ENDHDR; i >= 0; i--) { - if (buf[i] == (byte)'P' && - buf[i+1] == (byte)'K' && - buf[i+2] == (byte)'\005' && - buf[i+3] == (byte)'\006' && - (pos + i + ZipConstants.ENDHDR + ZipConstants.ENDCOM(buf, i) == ziplen)) { - // Found END header - buf = Arrays.copyOfRange(buf, i, i + ZipConstants.ENDHDR); - END end = new END(); - // end.endsub = ENDSUB(buf); // not used - end.centot = ZipConstants.ENDTOT(buf); - end.cenlen = ZipConstants.ENDSIZ(buf); - end.cenoff = ZipConstants.ENDOFF(buf); - // end.comlen = ENDCOM(buf); // not used - end.endpos = pos + i; - // try if there is zip64 end; - byte[] loc64 = new byte[ZipConstants.ZIP64_LOCHDR]; - if (end.endpos < ZipConstants.ZIP64_LOCHDR || - readFullyAt(loc64, 0, loc64.length, end.endpos - ZipConstants.ZIP64_LOCHDR) - != loc64.length || - !ZipConstants.locator64SigAt(loc64, 0)) { - return end; - } - long end64pos = ZipConstants.ZIP64_LOCOFF(loc64); - byte[] end64buf = new byte[ZipConstants.ZIP64_ENDHDR]; - if (readFullyAt(end64buf, 0, end64buf.length, end64pos) - != end64buf.length || - !ZipConstants.end64SigAt(end64buf, 0)) { - return end; - } - // end64 found, - long cenlen64 = ZipConstants.ZIP64_ENDSIZ(end64buf); - long cenoff64 = ZipConstants.ZIP64_ENDOFF(end64buf); - long centot64 = ZipConstants.ZIP64_ENDTOT(end64buf); - // double-check - if (cenlen64 != end.cenlen && end.cenlen != ZipConstants.ZIP64_MINVAL || - cenoff64 != end.cenoff && end.cenoff != ZipConstants.ZIP64_MINVAL || - centot64 != end.centot && end.centot != ZipConstants.ZIP64_MINVAL32) { - return end; - } - // to use the end64 values - end.cenlen = cenlen64; - end.cenoff = cenoff64; - end.centot = (int)centot64; // assume total < 2g - end.endpos = end64pos; - return end; - } - } - } - throw new ZipException("zip END header not found"); - } - - private void makeParentDirs(IndexNode node, IndexNode root) { - IndexNode parent; - ParentLookup lookup = new ParentLookup(); - while (true) { - int off = getParentOff(node.name); - // parent is root - if (off <= 1) { - node.sibling = root.child; - root.child = node; - break; - } - // parent exists - lookup = lookup.as(node.name, off); - if (inodes.containsKey(lookup)) { - parent = inodes.get(lookup); - node.sibling = parent.child; - parent.child = node; - break; - } - // parent does not exist, add new pseudo directory entry - parent = new IndexNode(Arrays.copyOf(node.name, off), true); - inodes.put(parent, parent); - node.sibling = parent.child; - parent.child = node; - node = parent; - } - } - - // ZIP directory has two issues: - // (1) ZIP spec does not require the ZIP file to include - // directory entry - // (2) all entries are not stored/organized in a "tree" - // structure. - // A possible solution is to build the node tree ourself as - // implemented below. - private void buildNodeTree() { - beginWrite(); - try { - IndexNode root = inodes.remove(LOOKUPKEY.as(ROOTPATH)); - if (root == null) { - root = new IndexNode(ROOTPATH, true); - } - IndexNode[] nodes = inodes.values().toArray(new IndexNode[0]); - inodes.put(root, root); - for (IndexNode node : nodes) { - makeParentDirs(node, root); - } - } finally { - endWrite(); - } - } - - private void removeFromTree(IndexNode inode) { - IndexNode parent = inodes.get(LOOKUPKEY.as(getParent(inode.name))); - IndexNode child = parent.child; - if (child.equals(inode)) { - parent.child = child.sibling; - } else { - IndexNode last = child; - while ((child = child.sibling) != null) { - if (child.equals(inode)) { - last.sibling = child.sibling; - break; - } else { - last = child; - } - } - } - } - - /** - * If a version property has been specified and the file represents a multi-release JAR, - * determine the requested runtime version and initialize the ZipFileSystem instance accordingly. - * - * Checks if the Zip File System property "releaseVersion" has been specified. If it has, - * use its value to determine the requested version. If not use the value of the "multi-release" property. - */ - private void initializeReleaseVersion(Map env) throws IOException { - /*Object o = env.containsKey(PROPERTY_RELEASE_VERSION) ? - env.get(PROPERTY_RELEASE_VERSION) : - env.get(PROPERTY_MULTI_RELEASE); - - if (o != null && isMultiReleaseJar()) { - int version; - if (o instanceof String) { - String s = (String)o; - if (s.equals("runtime")) { - version = Runtime.version().feature(); - } else if (s.matches("^[1-9][0-9]*$")) { - version = Version.parse(s).feature(); - } else { - throw new IllegalArgumentException("Invalid runtime version"); - } - } else if (o instanceof Integer) { - version = Version.parse(((Integer)o).toString()).feature(); - } else if (o instanceof Version) { - version = ((Version)o).feature(); - } else { - throw new IllegalArgumentException("env parameter must be String, " + - "Integer, or Version"); - } - createVersionedLinks(version < 0 ? 0 : version); - setReadOnly(); - }*/ - } - - /** - * Returns true if the Manifest main attribute "Multi-Release" is set to true; false otherwise. - */ - /*private boolean isMultiReleaseJar() throws IOException { - try (InputStream is = newInputStream(getBytes("/META-INF/MANIFEST.MF"))) { - String multiRelease = new Manifest(is).getMainAttributes() - .getValue(Attributes.Name.MULTI_RELEASE); - return "true".equalsIgnoreCase(multiRelease); - } catch (NoSuchFileException x) { - return false; - } - }*/ - - /** - * Create a map of aliases for versioned entries, for example: - * version/PackagePrivate.class -> META-INF/versions/9/version/PackagePrivate.class - * version/PackagePrivate.java -> META-INF/versions/9/version/PackagePrivate.java - * version/Version.class -> META-INF/versions/10/version/Version.class - * version/Version.java -> META-INF/versions/10/version/Version.java - * - * Then wrap the map in a function that getEntry can use to override root - * entry lookup for entries that have corresponding versioned entries. - */ - private void createVersionedLinks(int version) { - IndexNode verdir = getInode(getBytes("/META-INF/versions")); - // nothing to do, if no /META-INF/versions - if (verdir == null) { - return; - } - // otherwise, create a map and for each META-INF/versions/{n} directory - // put all the leaf inodes, i.e. entries, into the alias map - // possibly shadowing lower versioned entries - HashMap aliasMap = new HashMap<>(); - getVersionMap(version, verdir).values().forEach(versionNode -> - walk(versionNode.child, entryNode -> - aliasMap.put( - getOrCreateInode(getRootName(entryNode, versionNode), entryNode.isdir), - entryNode.name)) - ); - entryLookup = path -> { - byte[] entry = aliasMap.get(IndexNode.keyOf(path)); - return entry == null ? path : entry; - }; - } - - /** - * Create a sorted version map of version -> inode, for inodes <= max version. - * 9 -> META-INF/versions/9 - * 10 -> META-INF/versions/10 - */ - private TreeMap getVersionMap(int version, IndexNode metaInfVersions) { - TreeMap map = new TreeMap<>(); - IndexNode child = metaInfVersions.child; - while (child != null) { - Integer key = getVersion(child, metaInfVersions); - if (key != null && key <= version) { - map.put(key, child); - } - child = child.sibling; - } - return map; - } - - /** - * Extract the integer version number -- META-INF/versions/9 returns 9. - */ - private Integer getVersion(IndexNode inode, IndexNode metaInfVersions) { - try { - byte[] fullName = inode.name; - return Integer.parseInt(getString(Arrays - .copyOfRange(fullName, metaInfVersions.name.length + 1, fullName.length))); - } catch (NumberFormatException x) { - // ignore this even though it might indicate issues with the JAR structure - return null; - } - } - - /** - * Walk the IndexNode tree processing all leaf nodes. - */ - private void walk(IndexNode inode, Consumer consumer) { - if (inode == null) return; - if (inode.isDir()) { - walk(inode.child, consumer); - } else { - consumer.accept(inode); - } - walk(inode.sibling, consumer); - } - - /** - * Extract the root name from a versioned entry name. - * E.g. given inode 'META-INF/versions/9/foo/bar.class' - * and prefix 'META-INF/versions/9/' returns 'foo/bar.class'. - */ - private byte[] getRootName(IndexNode inode, IndexNode prefix) { - byte[] fullName = inode.name; - return Arrays.copyOfRange(fullName, prefix.name.length, fullName.length); - } - - // Reads zip file central directory. Returns the file position of first - // CEN header, otherwise returns -1 if an error occurred. If zip->msg != NULL - // then the error was a zip format error and zip->msg has the error text. - // Always pass in -1 for knownTotal; it's used for a recursive call. - private byte[] initCEN() throws IOException { - end = findEND(); - if (end.endpos == 0) { - inodes = new LinkedHashMap<>(10); - locpos = 0; - buildNodeTree(); - return null; // only END header present - } - if (end.cenlen > end.endpos) - throw new ZipException("invalid END header (bad central directory size)"); - long cenpos = end.endpos - end.cenlen; // position of CEN table - - // Get position of first local file (LOC) header, taking into - // account that there may be a stub prefixed to the zip file. - locpos = cenpos - end.cenoff; - if (locpos < 0) - throw new ZipException("invalid END header (bad central directory offset)"); - - // read in the CEN and END - byte[] cen = new byte[(int)(end.cenlen + ZipConstants.ENDHDR)]; - if (readFullyAt(cen, 0, cen.length, cenpos) != end.cenlen + ZipConstants.ENDHDR) { - throw new ZipException("read CEN tables failed"); - } - // Iterate through the entries in the central directory - inodes = new LinkedHashMap<>(end.centot + 1); - int pos = 0; - int limit = cen.length - ZipConstants.ENDHDR; - while (pos < limit) { - if (!ZipConstants.cenSigAt(cen, pos)) - throw new ZipException("invalid CEN header (bad signature)"); - int method = ZipConstants.CENHOW(cen, pos); - int nlen = ZipConstants.CENNAM(cen, pos); - int elen = ZipConstants.CENEXT(cen, pos); - int clen = ZipConstants.CENCOM(cen, pos); - int flag = ZipConstants.CENFLG(cen, pos); - if ((flag & 1) != 0) { - throw new ZipException("invalid CEN header (encrypted entry)"); - } - if (method != ZipConstants.METHOD_STORED && method != ZipConstants.METHOD_DEFLATED) { - throw new ZipException("invalid CEN header (unsupported compression method: " + method + ")"); - } - if (pos + ZipConstants.CENHDR + nlen > limit) { - throw new ZipException("invalid CEN header (bad header size)"); - } - IndexNode inode = new IndexNode(cen, pos, nlen); - if (hasDotOrDotDot(inode.name)) { - throw new ZipException("ZIP file can't be opened as a file system " + - "because an entry has a '.' or '..' element in its name"); - } - inodes.put(inode, inode); - if (zc.isUTF8() || (flag & ZipConstants.FLAG_USE_UTF8) != 0) { - checkUTF8(inode.name); - } else { - checkEncoding(inode.name); - } - // skip ext and comment - pos += (ZipConstants.CENHDR + nlen + elen + clen); - } - if (pos + ZipConstants.ENDHDR != cen.length) { - throw new ZipException("invalid CEN header (bad header size)"); - } - buildNodeTree(); - return cen; - } - - /** - * Check Inode.name to see if it includes a "." or ".." in the name array - * @param path the path as stored in Inode.name to verify - * @return true if the path contains a "." or ".." entry; false otherwise - */ - private boolean hasDotOrDotDot(byte[] path) { - // Inode.name always includes "/" in path[0] - assert path[0] == '/'; - if (path.length == 1) { - return false; - } - int index = 1; - while (index < path.length) { - int starting = index; - while (index < path.length && path[index] != '/') { - index++; - } - // Check the path snippet for a "." or ".." - if (isDotOrDotDotPath(path, starting, index)) { - return true; - } - index++; - } - return false; - } - - /** - * Check the path to see if it includes a "." or ".." - * @param path the path to check - * @return true if the path contains a "." or ".." entry; false otherwise - */ - private boolean isDotOrDotDotPath(byte[] path, int start, int index) { - int pathLen = index - start; - if ((pathLen == 1 && path[start] == '.')) - return true; - return (pathLen == 2 && path[start] == '.') && path[start + 1] == '.'; - } - - private final void checkUTF8(byte[] a) throws ZipException { - try { - int end = a.length; - int pos = 0; - while (pos < end) { - // ASCII fast-path: When checking that a range of bytes is - // valid UTF-8, we can avoid some allocation by skipping - // past bytes in the 0-127 range - if (a[pos] < 0) { - zc.toString(Arrays.copyOfRange(a, pos, a.length)); - break; - } - pos++; - } - } catch(Exception e) { - throw new ZipException("invalid CEN header (bad entry name)"); - } - } - - private final void checkEncoding( byte[] a) throws ZipException { - try { - zc.toString(a); - } catch(Exception e) { - throw new ZipException("invalid CEN header (bad entry name)"); - } - } - - - private void ensureOpen() { - if (!isOpen) - throw new ClosedFileSystemException(); - } - - // Creates a new empty temporary file in the same directory as the - // specified file. A variant of Files.createTempFile. - private Path createTempFileInSameDirectoryAs(Path path) throws IOException { - Path parent = path.toAbsolutePath().getParent(); - Path dir = (parent == null) ? path.getFileSystem().getPath(".") : parent; - Path tmpPath = Files.createTempFile(dir, "zipfstmp", null); - tmppaths.add(tmpPath); - return tmpPath; - } - - ////////////////////update & sync ////////////////////////////////////// - - private boolean hasUpdate = false; - - // shared key. consumer guarantees the "writeLock" before use it. - private final IndexNode LOOKUPKEY = new IndexNode(null, -1); - - private void updateDelete(IndexNode inode) { - beginWrite(); - try { - removeFromTree(inode); - inodes.remove(inode); - hasUpdate = true; - } finally { - endWrite(); - } - } - - private void update(Entry e) { - beginWrite(); - try { - IndexNode old = inodes.put(e, e); - if (old != null) { - removeFromTree(old); - } - if (e.type == Entry.NEW || e.type == Entry.FILECH || e.type == Entry.COPY) { - IndexNode parent = inodes.get(LOOKUPKEY.as(getParent(e.name))); - e.sibling = parent.child; - parent.child = e; - } - hasUpdate = true; - } finally { - endWrite(); - } - } - - // copy over the whole LOC entry (header if necessary, data and ext) from - // old zip to the new one. - private long copyLOCEntry(Entry e, boolean updateHeader, - OutputStream os, - long written, byte[] buf) - throws IOException - { - long locoff = e.locoff; // where to read - e.locoff = written; // update the e.locoff with new value - - // calculate the size need to write out - long size = 0; - // if there is A ext - if ((e.flag & ZipConstants.FLAG_DATADESCR) != 0) { - if (e.size >= ZipConstants.ZIP64_MINVAL || e.csize >= ZipConstants.ZIP64_MINVAL) - size = 24; - else - size = 16; - } - // read loc, use the original loc.elen/nlen - // - // an extra byte after loc is read, which should be the first byte of the - // 'name' field of the loc. if this byte is '/', which means the original - // entry has an absolute path in original zip/jar file, the e.writeLOC() - // is used to output the loc, in which the leading "/" will be removed - if (readFullyAt(buf, 0, ZipConstants.LOCHDR + 1 , locoff) != ZipConstants.LOCHDR + 1) - throw new ZipException("loc: reading failed"); - - if (updateHeader || ZipConstants.LOCNAM(buf) > 0 && buf[ZipConstants.LOCHDR] == '/') { - locoff += ZipConstants.LOCHDR + ZipConstants.LOCNAM(buf) + ZipConstants.LOCEXT(buf); // skip header - size += e.csize; - written = e.writeLOC(os) + size; - } else { - os.write(buf, 0, ZipConstants.LOCHDR); // write out the loc header - locoff += ZipConstants.LOCHDR; - // use e.csize, LOCSIZ(buf) is zero if FLAG_DATADESCR is on - // size += LOCNAM(buf) + LOCEXT(buf) + LOCSIZ(buf); - size += ZipConstants.LOCNAM(buf) + ZipConstants.LOCEXT(buf) + e.csize; - written = ZipConstants.LOCHDR + size; - } - int n; - while (size > 0 && - (n = (int)readFullyAt(buf, 0, buf.length, locoff)) != -1) - { - if (size < n) - n = (int)size; - os.write(buf, 0, n); - size -= n; - locoff += n; - } - return written; - } - - private long writeEntry(Entry e, OutputStream os) - throws IOException { - - if (e.bytes == null && e.file == null) // dir, 0-length data - return 0; - - long written = 0; - if (e.method != ZipConstants.METHOD_STORED && e.csize > 0 && (e.crc != 0 || e.size == 0)) { - // pre-compressed entry, write directly to output stream - writeTo(e, os); - } else { - try (OutputStream os2 = (e.method == ZipConstants.METHOD_STORED) ? - new EntryOutputStreamCRC32(e, os) : new EntryOutputStreamDef(e, os)) { - writeTo(e, os2); - } - } - written += e.csize; - if ((e.flag & ZipConstants.FLAG_DATADESCR) != 0) { - written += e.writeEXT(os); - } - return written; - } - - private void writeTo(Entry e, OutputStream os) throws IOException { - if (e.bytes != null) { - os.write(e.bytes, 0, e.bytes.length); - } else if (e.file != null) { - if (e.type == Entry.NEW || e.type == Entry.FILECH) { - try (InputStream is = Files.newInputStream(e.file)) { - StreamUtils.transferTo(is, os); - } - } - Files.delete(e.file); - tmppaths.remove(e.file); - } - } - - // sync the zip file system, if there is any update - private void sync() throws IOException { - if (!hasUpdate) - return; - PosixFileAttributes attrs = getPosixAttributes(zfpath); - Path tmpFile = createTempFileInSameDirectoryAs(zfpath); - try (OutputStream os = new BufferedOutputStream(Files.newOutputStream(tmpFile, WRITE))) { - ArrayList elist = new ArrayList<>(inodes.size()); - long written = 0; - byte[] buf = null; - Entry e; - - final IndexNode manifestInode = inodes.get( - IndexNode.keyOf(getBytes("/META-INF/MANIFEST.MF"))); - final Iterator inodeIterator = inodes.values().iterator(); - boolean manifestProcessed = false; - - // write loc - while (inodeIterator.hasNext()) { - final IndexNode inode; - - // write the manifest inode (if any) first so that - // java.util.jar.JarInputStream can find it - if (manifestInode == null) { - inode = inodeIterator.next(); - } else { - if (manifestProcessed) { - // advance to next node, filtering out the manifest - // which was already written - inode = inodeIterator.next(); - if (inode == manifestInode) { - continue; - } - } else { - inode = manifestInode; - manifestProcessed = true; - } - } - - if (inode instanceof Entry) { // an updated inode - e = (Entry)inode; - try { - if (e.type == Entry.COPY) { - // entry copy: the only thing changed is the "name" - // and "nlen" in LOC header, so we update/rewrite the - // LOC in new file and simply copy the rest (data and - // ext) without enflating/deflating from the old zip - // file LOC entry. - if (buf == null) - buf = new byte[8192]; - written += copyLOCEntry(e, true, os, written, buf); - } else { // NEW, FILECH or CEN - e.locoff = written; - written += e.writeLOC(os); // write loc header - written += writeEntry(e, os); - } - elist.add(e); - } catch (IOException x) { - x.printStackTrace(); // skip any in-accurate entry - } - } else { // unchanged inode - if (inode.pos == -1) { - continue; // pseudo directory node - } - if (inode.name.length == 1 && inode.name[0] == '/') { - continue; // no root '/' directory even if it - // exists in original zip/jar file. - } - e = supportPosix ? new PosixEntry(this, inode) : new Entry(this, inode); - try { - if (buf == null) - buf = new byte[8192]; - written += copyLOCEntry(e, false, os, written, buf); - elist.add(e); - } catch (IOException x) { - x.printStackTrace(); // skip any wrong entry - } - } - } - - // now write back the cen and end table - end.cenoff = written; - for (Entry entry : elist) { - written += entry.writeCEN(os); - } - end.centot = elist.size(); - end.cenlen = written - end.cenoff; - end.write(os, written, forceEnd64); - } - ch.close(); - Files.delete(zfpath); - - // Set the POSIX permissions of the original Zip File if available - // before moving the temp file - if (attrs != null) { - Files.setPosixFilePermissions(tmpFile, attrs.permissions()); - } - Files.move(tmpFile, zfpath, REPLACE_EXISTING); - hasUpdate = false; // clear - } - - /** - * Returns a file's POSIX file attributes. - * @param path The path to the file - * @return The POSIX file attributes for the specified file or - * null if the POSIX attribute view is not available - * @throws IOException If an error occurs obtaining the POSIX attributes for - * the specified file - */ - private PosixFileAttributes getPosixAttributes(Path path) throws IOException { - try { - PosixFileAttributeView view = - Files.getFileAttributeView(path, PosixFileAttributeView.class); - // Return if the attribute view is not supported - if (view == null) { - return null; - } - return view.readAttributes(); - } catch (UnsupportedOperationException e) { - // PosixFileAttributes not available - return null; - } - } - - private IndexNode getInode(byte[] path) { - return inodes.get(IndexNode.keyOf(Objects.requireNonNull(entryLookup.apply(path), "path"))); - } - - /** - * Return the IndexNode from the root tree. If it doesn't exist, - * it gets created along with all parent directory IndexNodes. - */ - private IndexNode getOrCreateInode(byte[] path, boolean isdir) { - IndexNode node = getInode(path); - // if node exists, return it - if (node != null) { - return node; - } - - // otherwise create new pseudo node and parent directory hierarchy - node = new IndexNode(path, isdir); - beginWrite(); - try { - makeParentDirs(node, Objects.requireNonNull(inodes.get(IndexNode.keyOf(ROOTPATH)), "no root node found")); - return node; - } finally { - endWrite(); - } - } - - private Entry getEntry(byte[] path) throws IOException { - IndexNode inode = getInode(path); - if (inode instanceof Entry) - return (Entry)inode; - if (inode == null || inode.pos == -1) - return null; - return supportPosix ? new PosixEntry(this, inode): new Entry(this, inode); - } - - public void deleteFile(byte[] path, boolean failIfNotExists) - throws IOException - { - checkWritable(); - IndexNode inode = getInode(path); - if (inode == null) { - if (path != null && path.length == 0) - throw new ZipException("root directory cannot be deleted"); - if (failIfNotExists) - throw new NoSuchFileException(getString(path)); - } else { - if (inode.isDir() && inode.child != null) - throw new DirectoryNotEmptyException(getString(path)); - updateDelete(inode); - } - } - - // Returns an out stream for either - // (1) writing the contents of a new entry, if the entry exists, or - // (2) updating/replacing the contents of the specified existing entry. - private OutputStream getOutputStream(Entry e) throws IOException { - if (e.mtime == -1) - e.mtime = System.currentTimeMillis(); - if (e.method == -1) - e.method = defaultCompressionMethod; - // store size, compressed size, and crc-32 in datadescr - e.flag = ZipConstants.FLAG_DATADESCR; - if (zc.isUTF8()) - e.flag |= ZipConstants.FLAG_USE_UTF8; - OutputStream os; - if (useTempFile || e.size >= tempFileCreationThreshold) { - e.file = getTempPathForEntry(null); - os = Files.newOutputStream(e.file, WRITE); - } else { - os = new FileRolloverOutputStream(e); - } - if (e.method == ZipConstants.METHOD_DEFLATED) { - return new DeflatingEntryOutputStream(e, os); - } else { - return new EntryOutputStream(e, os); - } - } - - private class EntryOutputStream extends FilterOutputStream { - private final Entry e; - private long written; - private boolean isClosed; - - EntryOutputStream(Entry e, OutputStream os) { - super(os); - this.e = Objects.requireNonNull(e, "Zip entry is null"); - // this.written = 0; - } - - @Override - public synchronized void write(int b) throws IOException { - out.write(b); - written += 1; - } - - @Override - public synchronized void write(byte[] b, int off, int len) - throws IOException { - out.write(b, off, len); - written += len; - } - - @Override - public synchronized void close() throws IOException { - if (isClosed) { - return; - } - isClosed = true; - e.size = written; - if (out instanceof FileRolloverOutputStream) { - FileRolloverOutputStream fros = (FileRolloverOutputStream)out; - if (fros.tmpFileOS == null) { - e.bytes = fros.toByteArray(); - } - } - super.close(); - update(e); - } - } - - // Output stream returned when writing "deflated" entries into memory, - // to enable eager (possibly parallel) deflation and reduce memory required. - private class DeflatingEntryOutputStream extends DeflaterOutputStream { - private final CRC32 crc; - private final Entry e; - private boolean isClosed; - - DeflatingEntryOutputStream(Entry e, OutputStream os) { - super(os, getDeflater()); - this.e = Objects.requireNonNull(e, "Zip entry is null"); - this.crc = new CRC32(); - } - - @Override - public synchronized void write(byte[] b, int off, int len) - throws IOException { - super.write(b, off, len); - crc.update(b, off, len); - } - - @Override - public synchronized void close() throws IOException { - if (isClosed) - return; - isClosed = true; - finish(); - e.size = def.getBytesRead(); - e.csize = def.getBytesWritten(); - e.crc = crc.getValue(); - if (out instanceof FileRolloverOutputStream) { - FileRolloverOutputStream fros = (FileRolloverOutputStream)out; - if (fros.tmpFileOS == null) { - e.bytes = fros.toByteArray(); - } - } - super.close(); - update(e); - releaseDeflater(def); - } - } - - // Wrapper output stream class to write out a "stored" entry. - // (1) this class does not close the underlying out stream when - // being closed. - // (2) no need to be "synchronized", only used by sync() - private class EntryOutputStreamCRC32 extends FilterOutputStream { - private final CRC32 crc; - private final Entry e; - private long written; - private boolean isClosed; - - EntryOutputStreamCRC32(Entry e, OutputStream os) { - super(os); - this.e = Objects.requireNonNull(e, "Zip entry is null"); - this.crc = new CRC32(); - } - - @Override - public void write(int b) throws IOException { - out.write(b); - crc.update(b); - written += 1; - } - - @Override - public void write(byte[] b, int off, int len) - throws IOException { - out.write(b, off, len); - crc.update(b, off, len); - written += len; - } - - @Override - public void close() { - if (isClosed) - return; - isClosed = true; - e.size = e.csize = written; - e.crc = crc.getValue(); - } - } - - // Wrapper output stream class to write out a "deflated" entry. - // (1) this class does not close the underlying out stream when - // being closed. - // (2) no need to be "synchronized", only used by sync() - private class EntryOutputStreamDef extends DeflaterOutputStream { - private final CRC32 crc; - private final Entry e; - private boolean isClosed; - - EntryOutputStreamDef(Entry e, OutputStream os) { - super(os, getDeflater()); - this.e = Objects.requireNonNull(e, "Zip entry is null"); - this.crc = new CRC32(); - } - - @Override - public void write(byte[] b, int off, int len) throws IOException { - super.write(b, off, len); - crc.update(b, off, len); - } - - @Override - public void close() throws IOException { - if (isClosed) - return; - isClosed = true; - finish(); - e.size = def.getBytesRead(); - e.csize = def.getBytesWritten(); - e.crc = crc.getValue(); - releaseDeflater(def); - } - } - - // A wrapper around the ByteArrayOutputStream. This FileRolloverOutputStream - // uses a threshold size to decide if the contents being written need to be - // rolled over into a temporary file. Until the threshold is reached, writes - // on this outputstream just write it to the internal in-memory byte array - // held by the ByteArrayOutputStream. Once the threshold is reached, the - // write operation on this outputstream first (and only once) creates a temporary file - // and transfers the data that has so far been written in the internal - // byte array, to that newly created file. The temp file is then opened - // in append mode and any subsequent writes, including the one which triggered - // the temporary file creation, will be written to the file. - // Implementation note: the "write" and the "close" methods of this implementation - // aren't "synchronized" because this FileRolloverOutputStream gets called - // only from either DeflatingEntryOutputStream or EntryOutputStream, both of which - // already have the necessary "synchronized" before calling these methods. - private class FileRolloverOutputStream extends OutputStream { - private ByteArrayOutputStream baos = new ByteArrayOutputStream(8192); - private final Entry entry; - private OutputStream tmpFileOS; - private long totalWritten = 0; - - private FileRolloverOutputStream(final Entry e) { - this.entry = e; - } - - @Override - public void write(final int b) throws IOException { - if (tmpFileOS != null) { - // already rolled over, write to the file that has been created previously - writeToFile(b); - return; - } - if (totalWritten + 1 < tempFileCreationThreshold) { - // write to our in-memory byte array - baos.write(b); - totalWritten++; - return; - } - // rollover into a file - transferToFile(); - writeToFile(b); - } - - @Override - public void write(final byte[] b) throws IOException { - write(b, 0, b.length); - } - - @Override - public void write(final byte[] b, final int off, final int len) throws IOException { - if (tmpFileOS != null) { - // already rolled over, write to the file that has been created previously - writeToFile(b, off, len); - return; - } - if (totalWritten + len < tempFileCreationThreshold) { - // write to our in-memory byte array - baos.write(b, off, len); - totalWritten += len; - return; - } - // rollover into a file - transferToFile(); - writeToFile(b, off, len); - } - - @Override - public void flush() throws IOException { - if (tmpFileOS != null) { - tmpFileOS.flush(); - } - } - - @Override - public void close() throws IOException { - baos = null; - if (tmpFileOS != null) { - tmpFileOS.close(); - } - } - - private void writeToFile(int b) throws IOException { - tmpFileOS.write(b); - totalWritten++; - } - - private void writeToFile(byte[] b, int off, int len) throws IOException { - tmpFileOS.write(b, off, len); - totalWritten += len; - } - - private void transferToFile() throws IOException { - // create a tempfile - entry.file = getTempPathForEntry(null); - tmpFileOS = new BufferedOutputStream(Files.newOutputStream(entry.file)); - // transfer the already written data from the byte array buffer into this tempfile - baos.writeTo(tmpFileOS); - // release the underlying byte array - baos = null; - } - - private byte[] toByteArray() { - return baos == null ? null : baos.toByteArray(); - } - } - - private InputStream getInputStream(Entry e) - throws IOException - { - InputStream eis; - if (e.type == Entry.NEW) { - if (e.bytes != null) - eis = new ByteArrayInputStream(e.bytes); - else if (e.file != null) - eis = Files.newInputStream(e.file); - else - throw new ZipException("update entry data is missing"); - } else if (e.type == Entry.FILECH) { - // FILECH result is un-compressed. - eis = Files.newInputStream(e.file); - // TBD: wrap to hook close() - // streams.add(eis); - return eis; - } else { // untouched CEN or COPY - eis = new EntryInputStream(e); - } - if (e.method == ZipConstants.METHOD_DEFLATED) { - // MORE: Compute good size for inflater stream: - long bufSize = e.size + 2; // Inflater likes a bit of slack - if (bufSize > 65536) - bufSize = 8192; - final long size = e.size; - eis = new InflaterInputStream(eis, getInflater(), (int)bufSize) { - private boolean isClosed = false; - public void close() throws IOException { - if (!isClosed) { - releaseInflater(inf); - this.in.close(); - isClosed = true; - streams.remove(this); - } - } - // Override fill() method to provide an extra "dummy" byte - // at the end of the input stream. This is required when - // using the "nowrap" Inflater option. (it appears the new - // zlib in 7 does not need it, but keep it for now) - protected void fill() throws IOException { - if (eof) { - throw new EOFException( - "Unexpected end of ZLIB input stream"); - } - len = this.in.read(buf, 0, buf.length); - if (len == -1) { - buf[0] = 0; - len = 1; - eof = true; - } - inf.setInput(buf, 0, len); - } - private boolean eof; - - public int available() { - if (isClosed) - return 0; - long avail = size - inf.getBytesWritten(); - return avail > (long) Integer.MAX_VALUE ? - Integer.MAX_VALUE : (int) avail; - } - }; - } else if (e.method == ZipConstants.METHOD_STORED) { - // TBD: wrap/ it does not seem necessary - } else { - throw new ZipException("invalid compression method"); - } - streams.add(eis); - return eis; - } - - // Inner class implementing the input stream used to read - // a (possibly compressed) zip file entry. - private class EntryInputStream extends InputStream { - private long pos; // current position within entry data - private long rem; // number of remaining bytes within entry - - EntryInputStream(Entry e) - throws IOException - { - rem = e.csize; - pos = e.locoff; - if (pos == -1) { - Entry e2 = getEntry(e.name); - if (e2 == null) { - throw new ZipException("invalid loc for entry <" + getString(e.name) + ">"); - } - pos = e2.locoff; - } - pos = -pos; // lazy initialize the real data offset - } - - public int read(byte[] b, int off, int len) throws IOException { - ensureOpen(); - initDataPos(); - if (rem == 0) { - return -1; - } - if (len <= 0) { - return 0; - } - if (len > rem) { - len = (int) rem; - } - ByteBuffer bb = ByteBuffer.wrap(b); - bb.position(off); - bb.limit(off + len); - long n = readFullyAt(bb, pos); - if (n > 0) { - pos += n; - rem -= n; - } - if (rem == 0) { - close(); - } - return (int)n; - } - - public int read() throws IOException { - byte[] b = new byte[1]; - if (read(b, 0, 1) == 1) { - return b[0] & 0xff; - } else { - return -1; - } - } - - public long skip(long n) { - ensureOpen(); - if (n > rem) - n = rem; - pos += n; - rem -= n; - if (rem == 0) { - close(); - } - return n; - } - - public int available() { - return rem > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) rem; - } - - public void close() { - rem = 0; - streams.remove(this); - } - - private void initDataPos() throws IOException { - if (pos <= 0) { - pos = -pos + locpos; - byte[] buf = new byte[ZipConstants.LOCHDR]; - if (readFullyAt(buf, 0, buf.length, pos) != ZipConstants.LOCHDR) { - throw new ZipException("invalid loc " + pos + " for entry reading"); - } - pos += ZipConstants.LOCHDR + ZipConstants.LOCNAM(buf) + ZipConstants.LOCEXT(buf); - } - } - } - - // Maxmum number of de/inflater we cache - private final int MAX_FLATER = 20; - // List of available Inflater objects for decompression - private final List inflaters = new ArrayList<>(); - - // Gets an inflater from the list of available inflaters or allocates - // a new one. - private Inflater getInflater() { - synchronized (inflaters) { - int size = inflaters.size(); - if (size > 0) { - return inflaters.remove(size - 1); - } else { - return new Inflater(true); - } - } - } - - // Releases the specified inflater to the list of available inflaters. - private void releaseInflater(Inflater inf) { - synchronized (inflaters) { - if (inflaters.size() < MAX_FLATER) { - inf.reset(); - inflaters.add(inf); - } else { - inf.end(); - } - } - } - - // List of available Deflater objects for compression - private final List deflaters = new ArrayList<>(); - - // Gets a deflater from the list of available deflaters or allocates - // a new one. - private Deflater getDeflater() { - synchronized (deflaters) { - int size = deflaters.size(); - if (size > 0) { - return deflaters.remove(size - 1); - } else { - return new Deflater(Deflater.DEFAULT_COMPRESSION, true); - } - } - } - - // Releases the specified inflater to the list of available inflaters. - private void releaseDeflater(Deflater def) { - synchronized (deflaters) { - if (deflaters.size() < MAX_FLATER) { - def.reset(); - deflaters.add(def); - } else { - def.end(); - } - } - } - - // End of central directory record - static class END { - // The fields that are commented out below are not used by anyone and write() uses "0" - // int disknum; - // int sdisknum; - // int endsub; - int centot; // 4 bytes - long cenlen; // 4 bytes - long cenoff; // 4 bytes - // int comlen; // comment length - // byte[] comment; - - // members of Zip64 end of central directory locator - // int diskNum; - long endpos; - // int disktot; - - void write(OutputStream os, long offset, boolean forceEnd64) throws IOException { - boolean hasZip64 = forceEnd64; // false; - long xlen = cenlen; - long xoff = cenoff; - if (xlen >= ZipConstants.ZIP64_MINVAL) { - xlen = ZipConstants.ZIP64_MINVAL; - hasZip64 = true; - } - if (xoff >= ZipConstants.ZIP64_MINVAL) { - xoff = ZipConstants.ZIP64_MINVAL; - hasZip64 = true; - } - int count = centot; - if (count >= ZipConstants.ZIP64_MINVAL32) { - count = ZipConstants.ZIP64_MINVAL32; - hasZip64 = true; - } - if (hasZip64) { - //zip64 end of central directory record - writeInt(os, ZipConstants.ZIP64_ENDSIG); // zip64 END record signature - writeLong(os, ZipConstants.ZIP64_ENDHDR - 12); // size of zip64 end - writeShort(os, 45); // version made by - writeShort(os, 45); // version needed to extract - writeInt(os, 0); // number of this disk - writeInt(os, 0); // central directory start disk - writeLong(os, centot); // number of directory entries on disk - writeLong(os, centot); // number of directory entries - writeLong(os, cenlen); // length of central directory - writeLong(os, cenoff); // offset of central directory - - //zip64 end of central directory locator - writeInt(os, ZipConstants.ZIP64_LOCSIG); // zip64 END locator signature - writeInt(os, 0); // zip64 END start disk - writeLong(os, offset); // offset of zip64 END - writeInt(os, 1); // total number of disks (?) - } - writeInt(os, ZipConstants.ENDSIG); // END record signature - writeShort(os, 0); // number of this disk - writeShort(os, 0); // central directory start disk - writeShort(os, count); // number of directory entries on disk - writeShort(os, count); // total number of directory entries - writeInt(os, xlen); // length of central directory - writeInt(os, xoff); // offset of central directory - writeShort(os, 0); // zip file comment, not used - } - } - - // Internal node that links a "name" to its pos in cen table. - // The node itself can be used as a "key" to lookup itself in - // the HashMap inodes. - static class IndexNode { - byte[] name; - int hashcode; // node is hashable/hashed by its name - boolean isdir; - int pos = -1; // position in cen table, -1 means the - // entry does not exist in zip file - IndexNode child; // first child - IndexNode sibling; // next sibling - - IndexNode() {} - - IndexNode(byte[] name, boolean isdir) { - name(name); - this.isdir = isdir; - this.pos = -1; - } - - IndexNode(byte[] name, int pos) { - name(name); - this.pos = pos; - } - - // constructor for initCEN() (1) remove trailing '/' (2) pad leading '/' - IndexNode(byte[] cen, int pos, int nlen) { - int noff = pos + ZipConstants.CENHDR; - if (cen[noff + nlen - 1] == '/') { - isdir = true; - nlen--; - } - if (nlen > 0 && cen[noff] == '/') { - name = Arrays.copyOfRange(cen, noff, noff + nlen); - } else { - name = new byte[nlen + 1]; - System.arraycopy(cen, noff, name, 1, nlen); - name[0] = '/'; - } - name(normalize(name)); - this.pos = pos; - } - - // Normalize the IndexNode.name field. - private byte[] normalize(byte[] path) { - int len = path.length; - if (len == 0) - return path; - byte prevC = 0; - for (int pathPos = 0; pathPos < len; pathPos++) { - byte c = path[pathPos]; - if (c == '/' && prevC == '/') - return normalize(path, pathPos - 1); - prevC = c; - } - if (len > 1 && prevC == '/') { - return Arrays.copyOf(path, len - 1); - } - return path; - } - - private byte[] normalize(byte[] path, int off) { - // As we know we have at least one / to trim, we can reduce - // the size of the resulting array - byte[] to = new byte[path.length - 1]; - int pathPos = 0; - while (pathPos < off) { - to[pathPos] = path[pathPos]; - pathPos++; - } - int toPos = pathPos; - byte prevC = 0; - while (pathPos < path.length) { - byte c = path[pathPos++]; - if (c == '/' && prevC == '/') - continue; - to[toPos++] = c; - prevC = c; - } - if (toPos > 1 && to[toPos - 1] == '/') - toPos--; - return (toPos == to.length) ? to : Arrays.copyOf(to, toPos); - } - - private static final ThreadLocal cachedKey = new ThreadLocal<>(); - - static final IndexNode keyOf(byte[] name) { // get a lookup key; - IndexNode key = cachedKey.get(); - if (key == null) { - key = new IndexNode(name, -1); - cachedKey.set(key); - } - return key.as(name); - } - - final void name(byte[] name) { - this.name = name; - this.hashcode = Arrays.hashCode(name); - } - - final IndexNode as(byte[] name) { // reuse the node, mostly - name(name); // as a lookup "key" - return this; - } - - boolean isDir() { - return isdir; - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof IndexNode)) { - return false; - } - if (other instanceof ParentLookup) { - return ((ParentLookup)other).equals(this); - } - return Arrays.equals(name, ((IndexNode)other).name); - } - - @Override - public int hashCode() { - return hashcode; - } - - @Override - public String toString() { - return new String(name) + (isdir ? " (dir)" : " ") + ", index: " + pos; - } - } - - static class Entry extends IndexNode implements ZipFileAttributes { - static final int CEN = 1; // entry read from cen - static final int NEW = 2; // updated contents in bytes or file - static final int FILECH = 3; // fch update in "file" - static final int COPY = 4; // copy of a CEN entry - - byte[] bytes; // updated content bytes - Path file; // use tmp file to store bytes; - int type = CEN; // default is the entry read from cen - - // entry attributes - int version; - int flag; - int posixPerms = -1; // posix permissions - int method = -1; // compression method - long mtime = -1; // last modification time (in DOS time) - long atime = -1; // last access time - long ctime = -1; // create time - long crc = -1; // crc-32 of entry data - long csize = -1; // compressed size of entry data - long size = -1; // uncompressed size of entry data - byte[] extra; - - // CEN - // The fields that are commented out below are not used by anyone and write() uses "0" - // int versionMade; - // int disk; - // int attrs; - // long attrsEx; - long locoff; - byte[] comment; - - Entry(byte[] name, boolean isdir, int method) { - name(name); - this.isdir = isdir; - this.mtime = this.ctime = this.atime = System.currentTimeMillis(); - this.crc = 0; - this.size = 0; - this.csize = 0; - this.method = method; - } - - @SuppressWarnings("unchecked") - Entry(byte[] name, int type, boolean isdir, int method, FileAttribute... attrs) { - this(name, isdir, method); - this.type = type; - for (FileAttribute attr : attrs) { - String attrName = attr.name(); - if (attrName.equals("posix:permissions")) { - posixPerms = ZipUtils.permsToFlags((Set)attr.value()); - } - } - } - - Entry(byte[] name, Path file, int type, FileAttribute... attrs) { - this(name, type, false, ZipConstants.METHOD_STORED, attrs); - this.file = file; - } - - Entry(Entry e, int type, int compressionMethod) { - this(e, type); - this.method = compressionMethod; - } - - Entry(Entry e, int type) { - name(e.name); - this.isdir = e.isdir; - this.version = e.version; - this.ctime = e.ctime; - this.atime = e.atime; - this.mtime = e.mtime; - this.crc = e.crc; - this.size = e.size; - this.csize = e.csize; - this.method = e.method; - this.extra = e.extra; - /* - this.versionMade = e.versionMade; - this.disk = e.disk; - this.attrs = e.attrs; - this.attrsEx = e.attrsEx; - */ - this.locoff = e.locoff; - this.comment = e.comment; - this.posixPerms = e.posixPerms; - this.type = type; - } - - Entry(ZipFileSystem zipfs, IndexNode inode) throws IOException { - readCEN(zipfs, inode); - } - - // Calculates a suitable base for the version number to - // be used for fields version made by/version needed to extract. - // The lower bytes of these 2 byte fields hold the version number - // (value/10 = major; value%10 = minor) - // For different features certain minimum versions apply: - // stored = 10 (1.0), deflated = 20 (2.0), zip64 = 45 (4.5) - private int version(boolean zip64) throws ZipException { - if (zip64) { - return 45; - } - if (method == ZipConstants.METHOD_DEFLATED) - return 20; - else if (method == ZipConstants.METHOD_STORED) - return 10; - throw new ZipException("unsupported compression method"); - } - - /** - * Adds information about compatibility of file attribute information - * to a version value. - */ - private int versionMadeBy(int version) { - return (posixPerms < 0) ? version : - ZipConstants.VERSION_MADE_BY_BASE_UNIX | (version & 0xff); - } - - ///////////////////// CEN ////////////////////// - private void readCEN(ZipFileSystem zipfs, IndexNode inode) throws IOException { - byte[] cen = zipfs.cen; - int pos = inode.pos; - if (!ZipConstants.cenSigAt(cen, pos)) - throw new ZipException("invalid CEN header (bad signature)"); - version = ZipConstants.CENVER(cen, pos); - flag = ZipConstants.CENFLG(cen, pos); - method = ZipConstants.CENHOW(cen, pos); - mtime = dosToJavaTime(ZipConstants.CENTIM(cen, pos)); - crc = ZipConstants.CENCRC(cen, pos); - csize = ZipConstants.CENSIZ(cen, pos); - size = ZipConstants.CENLEN(cen, pos); - int nlen = ZipConstants.CENNAM(cen, pos); - int elen = ZipConstants.CENEXT(cen, pos); - int clen = ZipConstants.CENCOM(cen, pos); - /* - versionMade = CENVEM(cen, pos); - disk = CENDSK(cen, pos); - attrs = CENATT(cen, pos); - attrsEx = CENATX(cen, pos); - */ - if (ZipConstants.CENVEM_FA(cen, pos) == ZipConstants.FILE_ATTRIBUTES_UNIX) { - posixPerms = ZipConstants.CENATX_PERMS(cen, pos) & 0xFFF; // 12 bits for setuid, setgid, sticky + perms - } - locoff = ZipConstants.CENOFF(cen, pos); - pos += ZipConstants.CENHDR; - this.name = inode.name; - this.isdir = inode.isdir; - this.hashcode = inode.hashcode; - - pos += nlen; - if (elen > 0) { - extra = Arrays.copyOfRange(cen, pos, pos + elen); - pos += elen; - readExtra(zipfs); - } - if (clen > 0) { - comment = Arrays.copyOfRange(cen, pos, pos + clen); - } - } - - private int writeCEN(OutputStream os) throws IOException { - long csize0 = csize; - long size0 = size; - long locoff0 = locoff; - int elen64 = 0; // extra for ZIP64 - int elenNTFS = 0; // extra for NTFS (a/c/mtime) - int elenEXTT = 0; // extra for Extended Timestamp - boolean foundExtraTime = false; // if time stamp NTFS, EXTT present - - byte[] zname = isdir ? toDirectoryPath(name) : name; - - // confirm size/length - int nlen = (zname != null) ? zname.length - 1 : 0; // name has [0] as "slash" - int elen = (extra != null) ? extra.length : 0; - int eoff = 0; - int clen = (comment != null) ? comment.length : 0; - if (csize >= ZipConstants.ZIP64_MINVAL) { - csize0 = ZipConstants.ZIP64_MINVAL; - elen64 += 8; // csize(8) - } - if (size >= ZipConstants.ZIP64_MINVAL) { - size0 = ZipConstants.ZIP64_MINVAL; // size(8) - elen64 += 8; - } - if (locoff >= ZipConstants.ZIP64_MINVAL) { - locoff0 = ZipConstants.ZIP64_MINVAL; - elen64 += 8; // offset(8) - } - if (elen64 != 0) { - elen64 += 4; // header and data sz 4 bytes - } - boolean zip64 = (elen64 != 0); - int version0 = version(zip64); - while (eoff + 4 < elen) { - int tag = ZipConstants.SH(extra, eoff); - int sz = ZipConstants.SH(extra, eoff + 2); - if (tag == ZipConstants.EXTID_EXTT || tag == ZipConstants.EXTID_NTFS) { - foundExtraTime = true; - } - eoff += (4 + sz); - } - if (!foundExtraTime) { - if (isWindows) { // use NTFS - elenNTFS = 36; // total 36 bytes - } else { // Extended Timestamp otherwise - elenEXTT = 9; // only mtime in cen - } - } - writeInt(os, ZipConstants.CENSIG); // CEN header signature - writeShort(os, versionMadeBy(version0)); // version made by - writeShort(os, version0); // version needed to extract - writeShort(os, flag); // general purpose bit flag - writeShort(os, method); // compression method - // last modification time - writeInt(os, (int)javaToDosTime(mtime)); - writeInt(os, crc); // crc-32 - writeInt(os, csize0); // compressed size - writeInt(os, size0); // uncompressed size - writeShort(os, nlen); - writeShort(os, elen + elen64 + elenNTFS + elenEXTT); - - if (comment != null) { - writeShort(os, Math.min(clen, 0xffff)); - } else { - writeShort(os, 0); - } - writeShort(os, 0); // starting disk number - writeShort(os, 0); // internal file attributes (unused) - writeInt(os, posixPerms > 0 ? posixPerms << 16 : 0); // external file - // attributes, used for storing posix - // permissions - writeInt(os, locoff0); // relative offset of local header - writeBytes(os, zname, 1, nlen); - if (zip64) { - writeShort(os, ZipConstants.EXTID_ZIP64);// Zip64 extra - writeShort(os, elen64 - 4); // size of "this" extra block - if (size0 == ZipConstants.ZIP64_MINVAL) - writeLong(os, size); - if (csize0 == ZipConstants.ZIP64_MINVAL) - writeLong(os, csize); - if (locoff0 == ZipConstants.ZIP64_MINVAL) - writeLong(os, locoff); - } - if (elenNTFS != 0) { - writeShort(os, ZipConstants.EXTID_NTFS); - writeShort(os, elenNTFS - 4); - writeInt(os, 0); // reserved - writeShort(os, 0x0001); // NTFS attr tag - writeShort(os, 24); - writeLong(os, javaToWinTime(mtime)); - writeLong(os, javaToWinTime(atime)); - writeLong(os, javaToWinTime(ctime)); - } - if (elenEXTT != 0) { - writeShort(os, ZipConstants.EXTID_EXTT); - writeShort(os, elenEXTT - 4); - if (ctime == -1) - os.write(0x3); // mtime and atime - else - os.write(0x7); // mtime, atime and ctime - writeInt(os, javaToUnixTime(mtime)); - } - if (extra != null) // whatever not recognized - writeBytes(os, extra); - if (comment != null) //TBD: 0, Math.min(commentBytes.length, 0xffff)); - writeBytes(os, comment); - return ZipConstants.CENHDR + nlen + elen + clen + elen64 + elenNTFS + elenEXTT; - } - - ///////////////////// LOC ////////////////////// - - private int writeLOC(OutputStream os) throws IOException { - byte[] zname = isdir ? toDirectoryPath(name) : name; - int nlen = (zname != null) ? zname.length - 1 : 0; // [0] is slash - int elen = (extra != null) ? extra.length : 0; - boolean foundExtraTime = false; // if extra timestamp present - int eoff = 0; - int elen64 = 0; - boolean zip64 = false; - int elenEXTT = 0; - int elenNTFS = 0; - writeInt(os, ZipConstants.LOCSIG); // LOC header signature - if ((flag & ZipConstants.FLAG_DATADESCR) != 0) { - writeShort(os, version(false)); // version needed to extract - writeShort(os, flag); // general purpose bit flag - writeShort(os, method); // compression method - // last modification time - writeInt(os, (int)javaToDosTime(mtime)); - // store size, uncompressed size, and crc-32 in data descriptor - // immediately following compressed entry data - writeInt(os, 0); - writeInt(os, 0); - writeInt(os, 0); - } else { - if (csize >= ZipConstants.ZIP64_MINVAL || size >= ZipConstants.ZIP64_MINVAL) { - elen64 = 20; //headid(2) + size(2) + size(8) + csize(8) - zip64 = true; - } - writeShort(os, version(zip64)); // version needed to extract - writeShort(os, flag); // general purpose bit flag - writeShort(os, method); // compression method - // last modification time - writeInt(os, (int)javaToDosTime(mtime)); - writeInt(os, crc); // crc-32 - if (zip64) { - writeInt(os, ZipConstants.ZIP64_MINVAL); - writeInt(os, ZipConstants.ZIP64_MINVAL); - } else { - writeInt(os, csize); // compressed size - writeInt(os, size); // uncompressed size - } - } - while (eoff + 4 < elen) { - int tag = ZipConstants.SH(extra, eoff); - int sz = ZipConstants.SH(extra, eoff + 2); - if (tag == ZipConstants.EXTID_EXTT || tag == ZipConstants.EXTID_NTFS) { - foundExtraTime = true; - } - eoff += (4 + sz); - } - if (!foundExtraTime) { - if (isWindows) { - elenNTFS = 36; // NTFS, total 36 bytes - } else { // on unix use "ext time" - elenEXTT = 9; - if (atime != -1) - elenEXTT += 4; - if (ctime != -1) - elenEXTT += 4; - } - } - writeShort(os, nlen); - writeShort(os, elen + elen64 + elenNTFS + elenEXTT); - writeBytes(os, zname, 1, nlen); - if (zip64) { - writeShort(os, ZipConstants.EXTID_ZIP64); - writeShort(os, 16); - writeLong(os, size); - writeLong(os, csize); - } - if (elenNTFS != 0) { - writeShort(os, ZipConstants.EXTID_NTFS); - writeShort(os, elenNTFS - 4); - writeInt(os, 0); // reserved - writeShort(os, 0x0001); // NTFS attr tag - writeShort(os, 24); - writeLong(os, javaToWinTime(mtime)); - writeLong(os, javaToWinTime(atime)); - writeLong(os, javaToWinTime(ctime)); - } - if (elenEXTT != 0) { - writeShort(os, ZipConstants.EXTID_EXTT); - writeShort(os, elenEXTT - 4);// size for the folowing data block - int fbyte = 0x1; - if (atime != -1) // mtime and atime - fbyte |= 0x2; - if (ctime != -1) // mtime, atime and ctime - fbyte |= 0x4; - os.write(fbyte); // flags byte - writeInt(os, javaToUnixTime(mtime)); - if (atime != -1) - writeInt(os, javaToUnixTime(atime)); - if (ctime != -1) - writeInt(os, javaToUnixTime(ctime)); - } - if (extra != null) { - writeBytes(os, extra); - } - return ZipConstants.LOCHDR + nlen + elen + elen64 + elenNTFS + elenEXTT; - } - - // Data Descriptor - private int writeEXT(OutputStream os) throws IOException { - writeInt(os, ZipConstants.EXTSIG); // EXT header signature - writeInt(os, crc); // crc-32 - if (csize >= ZipConstants.ZIP64_MINVAL || size >= ZipConstants.ZIP64_MINVAL) { - writeLong(os, csize); - writeLong(os, size); - return 24; - } else { - writeInt(os, csize); // compressed size - writeInt(os, size); // uncompressed size - return 16; - } - } - - // read NTFS, UNIX and ZIP64 data from cen.extra - private void readExtra(ZipFileSystem zipfs) throws IOException { - // Note that Section 4.5, Extensible data fields, of the PKWARE ZIP File - // Format Specification does not mandate a specific order for the - // data in the extra field, therefore Zip FS cannot assume the data - // is written in the same order by Zip libraries as Zip FS. - if (extra == null) - return; - int elen = extra.length; - int off = 0; - int newOff = 0; - boolean hasZip64LocOffset = false; - while (off + 4 < elen) { - // extra spec: HeaderID+DataSize+Data - int pos = off; - int tag = ZipConstants.SH(extra, pos); - int sz = ZipConstants.SH(extra, pos + 2); - pos += 4; - if (pos + sz > elen) // invalid data - break; - switch (tag) { - case ZipConstants.EXTID_ZIP64 : - if (size == ZipConstants.ZIP64_MINVAL) { - if (pos + 8 > elen) // invalid zip64 extra - break; // fields, just skip - size = ZipConstants.LL(extra, pos); - pos += 8; - } - if (csize == ZipConstants.ZIP64_MINVAL) { - if (pos + 8 > elen) - break; - csize = ZipConstants.LL(extra, pos); - pos += 8; - } - if (locoff == ZipConstants.ZIP64_MINVAL) { - if (pos + 8 > elen) - break; - locoff = ZipConstants.LL(extra, pos); - } - break; - case ZipConstants.EXTID_NTFS: - if (sz < 32) - break; - pos += 4; // reserved 4 bytes - if (ZipConstants.SH(extra, pos) != 0x0001) - break; - if (ZipConstants.SH(extra, pos + 2) != 24) - break; - // override the loc field, datatime here is - // more "accurate" - mtime = winToJavaTime(ZipConstants.LL(extra, pos + 4)); - atime = winToJavaTime(ZipConstants.LL(extra, pos + 12)); - ctime = winToJavaTime(ZipConstants.LL(extra, pos + 20)); - break; - case ZipConstants.EXTID_EXTT: - // spec says the Extended timestamp in cen only has mtime - // need to read the loc to get the extra a/ctime, if flag - // "zipinfo-time" is not specified to false; - // there is performance cost (move up to loc and read) to - // access the loc table foreach entry; - if (zipfs.noExtt) { - if (sz == 5) - mtime = unixToJavaTime(ZipConstants.LG(extra, pos + 1)); - break; - } - // If the LOC offset is 0xFFFFFFFF, then we need to read the - // LOC offset from the EXTID_ZIP64 extra data. Therefore - // wait until all of the CEN extra data fields have been processed - // prior to reading the LOC extra data field in order to obtain - // the Info-ZIP Extended Timestamp. - if (locoff != ZipConstants.ZIP64_MINVAL) { - readLocEXTT(zipfs); - } else { - hasZip64LocOffset = true; - } - break; - default: // unknown tag - System.arraycopy(extra, off, extra, newOff, sz + 4); - newOff += (sz + 4); - } - off += (sz + 4); - } - - // We need to read the LOC extra data and the LOC offset was obtained - // from the EXTID_ZIP64 field. - if (hasZip64LocOffset) { - readLocEXTT(zipfs); - } - - if (newOff != 0 && newOff != extra.length) - extra = Arrays.copyOf(extra, newOff); - else - extra = null; - } - - /** - * Read the LOC extra field to obtain the Info-ZIP Extended Timestamp fields - * @param zipfs The Zip FS to use - * @throws IOException If an error occurs - */ - private void readLocEXTT(ZipFileSystem zipfs) throws IOException { - byte[] buf = new byte[ZipConstants.LOCHDR]; - if (zipfs.readFullyAt(buf, 0, buf.length , locoff) - != buf.length) - throw new ZipException("loc: reading failed"); - if (!ZipConstants.locSigAt(buf, 0)) - throw new ZipException("R" - + Long.toString(ZipConstants.getSig(buf, 0), 16)); - int locElen = ZipConstants.LOCEXT(buf); - if (locElen < 9) // EXTT is at least 9 bytes - return; - int locNlen = ZipConstants.LOCNAM(buf); - buf = new byte[locElen]; - if (zipfs.readFullyAt(buf, 0, buf.length , locoff + ZipConstants.LOCHDR + locNlen) - != buf.length) - throw new ZipException("loc extra: reading failed"); - int locPos = 0; - while (locPos + 4 < buf.length) { - int locTag = ZipConstants.SH(buf, locPos); - int locSZ = ZipConstants.SH(buf, locPos + 2); - locPos += 4; - if (locTag != ZipConstants.EXTID_EXTT) { - locPos += locSZ; - continue; - } - int end = locPos + locSZ - 4; - int flag = ZipConstants.CH(buf, locPos++); - if ((flag & 0x1) != 0 && locPos <= end) { - mtime = unixToJavaTime(ZipConstants.LG(buf, locPos)); - locPos += 4; - } - if ((flag & 0x2) != 0 && locPos <= end) { - atime = unixToJavaTime(ZipConstants.LG(buf, locPos)); - locPos += 4; - } - if ((flag & 0x4) != 0 && locPos <= end) { - ctime = unixToJavaTime(ZipConstants.LG(buf, locPos)); - } - break; - } - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(1024); - Formatter fm = new Formatter(sb); - fm.format(" name : %s%n", new String(name)); - fm.format(" creationTime : %tc%n", creationTime().toMillis()); - fm.format(" lastAccessTime : %tc%n", lastAccessTime().toMillis()); - fm.format(" lastModifiedTime: %tc%n", lastModifiedTime().toMillis()); - fm.format(" isRegularFile : %b%n", isRegularFile()); - fm.format(" isDirectory : %b%n", isDirectory()); - fm.format(" isSymbolicLink : %b%n", isSymbolicLink()); - fm.format(" isOther : %b%n", isOther()); - fm.format(" fileKey : %s%n", fileKey()); - fm.format(" size : %d%n", size()); - fm.format(" compressedSize : %d%n", compressedSize()); - fm.format(" crc : %x%n", crc()); - fm.format(" method : %d%n", method()); - Set permissions = storedPermissions().orElse(null); - if (permissions != null) { - fm.format(" permissions : %s%n", permissions); - } - fm.close(); - return sb.toString(); - } - - ///////// basic file attributes /////////// - @Override - public FileTime creationTime() { - return FileTime.fromMillis(ctime == -1 ? mtime : ctime); - } - - @Override - public boolean isDirectory() { - return isDir(); - } - - @Override - public boolean isOther() { - return false; - } - - @Override - public boolean isRegularFile() { - return !isDir(); - } - - @Override - public FileTime lastAccessTime() { - return FileTime.fromMillis(atime == -1 ? mtime : atime); - } - - @Override - public FileTime lastModifiedTime() { - return FileTime.fromMillis(mtime); - } - - @Override - public long size() { - return size; - } - - @Override - public boolean isSymbolicLink() { - return false; - } - - @Override - public Object fileKey() { - return null; - } - - ///////// zip file attributes /////////// - - @Override - public long compressedSize() { - return csize; - } - - @Override - public long crc() { - return crc; - } - - @Override - public int method() { - return method; - } - - @Override - public byte[] extra() { - if (extra != null) - return Arrays.copyOf(extra, extra.length); - return null; - } - - @Override - public byte[] comment() { - if (comment != null) - return Arrays.copyOf(comment, comment.length); - return null; - } - - @Override - public Optional> storedPermissions() { - Set perms = null; - if (posixPerms != -1) { - perms = new HashSet<>(PosixFilePermission.values().length); - for (PosixFilePermission perm : PosixFilePermission.values()) { - if ((posixPerms & ZipUtils.permToFlag(perm)) != 0) { - perms.add(perm); - } - } - } - return Optional.ofNullable(perms); - } - } - - final class PosixEntry extends Entry implements PosixFileAttributes { - private UserPrincipal owner = defaultOwner; - private GroupPrincipal group = defaultGroup; - - PosixEntry(byte[] name, boolean isdir, int method) { - super(name, isdir, method); - } - - PosixEntry(byte[] name, int type, boolean isdir, int method, FileAttribute... attrs) { - super(name, type, isdir, method, attrs); - } - - PosixEntry(byte[] name, Path file, int type, FileAttribute... attrs) { - super(name, file, type, attrs); - } - - PosixEntry(PosixEntry e, int type, int compressionMethod) { - super(e, type); - this.method = compressionMethod; - } - - PosixEntry(PosixEntry e, int type) { - super(e, type); - this.owner = e.owner; - this.group = e.group; - } - - PosixEntry(ZipFileSystem zipfs, IndexNode inode) throws IOException { - super(zipfs, inode); - } - - @Override - public UserPrincipal owner() { - return owner; - } - - @Override - public GroupPrincipal group() { - return group; - } - - @Override - public Set permissions() { - return storedPermissions().orElse(Set.copyOf(defaultPermissions)); - } - } - - // purely for parent lookup, so we don't have to copy the parent - // name every time - static class ParentLookup extends IndexNode { - int len; - ParentLookup() {} - - final ParentLookup as(byte[] name, int len) { // as a lookup "key" - name(name, len); - return this; - } - - void name(byte[] name, int len) { - this.name = name; - this.len = len; - // calculate the hashcode the same way as Arrays.hashCode() does - int result = 1; - for (int i = 0; i < len; i++) - result = 31 * result + name[i]; - this.hashcode = result; - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof IndexNode)) { - return false; - } - byte[] oname = ((IndexNode)other).name; - return Arrays.equals(name, oname); - } - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileSystemProvider.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileSystemProvider.java deleted file mode 100644 index 5eede0d6d3..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipFileSystemProvider.java +++ /dev/null @@ -1,315 +0,0 @@ -/* - * Copyright (c) 2009, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.nio.channels.AsynchronousFileChannel; -import java.nio.channels.FileChannel; -import java.nio.channels.SeekableByteChannel; -import java.nio.file.*; -import java.nio.file.DirectoryStream.Filter; -import java.nio.file.attribute.BasicFileAttributes; -import java.nio.file.attribute.FileAttribute; -import java.nio.file.attribute.FileAttributeView; -import java.nio.file.spi.FileSystemProvider; -import java.security.AccessController; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ExecutorService; -import java.util.zip.ZipException; - -/** - * @author Xueming Shen, Rajendra Gutupalli, Jaya Hangal - */ -public class ZipFileSystemProvider extends FileSystemProvider { - private final Map filesystems = new HashMap<>(); - - public ZipFileSystemProvider() {} - - @Override - public String getScheme() { - return "jar"; - } - - protected Path uriToPath(URI uri) { - String scheme = uri.getScheme(); - if ((scheme == null) || !scheme.equalsIgnoreCase(getScheme())) { - throw new IllegalArgumentException("URI scheme is not '" + getScheme() + "'"); - } - try { - // only support legacy JAR URL syntax jar:{uri}!/{entry} for now - String spec = uri.getRawSchemeSpecificPart(); - int sep = spec.indexOf("!/"); - if (sep != -1) { - spec = spec.substring(0, sep); - } - return Paths.get(new URI(spec)).toAbsolutePath(); - } catch (URISyntaxException e) { - throw new IllegalArgumentException(e.getMessage(), e); - } - } - - private boolean ensureFile(Path path) { - try { - BasicFileAttributes attrs = - Files.readAttributes(path, BasicFileAttributes.class); - if (!attrs.isRegularFile()) - throw new UnsupportedOperationException(); - return true; - } catch (IOException ioe) { - return false; - } - } - - @Override - public FileSystem newFileSystem(URI uri, Map env) - throws IOException - { - Path path = uriToPath(uri); - synchronized(filesystems) { - Path realPath = null; - if (ensureFile(path)) { - realPath = path.toRealPath(); - if (filesystems.containsKey(realPath)) - throw new FileSystemAlreadyExistsException(); - } - ZipFileSystem zipfs = getZipFileSystem(path, env); - if (realPath == null) { // newly created - realPath = path.toRealPath(); - } - filesystems.put(realPath, zipfs); - return zipfs; - } - } - - @Override - public FileSystem newFileSystem(Path path, Map env) - throws IOException - { - ensureFile(path); - return getZipFileSystem(path, env); - } - - private ZipFileSystem getZipFileSystem(Path path, Map env) throws IOException { - try { - return new ZipFileSystem(this, path, env); - } catch (ZipException ze) { - String pname = path.toString(); - if (pname.endsWith(".zip") || pname.endsWith(".jar")) - throw ze; - throw new UnsupportedOperationException(); - } - } - - @Override - public Path getPath(URI uri) { - String spec = uri.getSchemeSpecificPart(); - int sep = spec.indexOf("!/"); - if (sep == -1) - throw new IllegalArgumentException("URI: " - + uri - + " does not contain path info ex. jar:file:/c:/foo.zip!/BAR"); - return getFileSystem(uri).getPath(spec.substring(sep + 1)); - } - - - @Override - public FileSystem getFileSystem(URI uri) { - synchronized (filesystems) { - ZipFileSystem zipfs = null; - try { - zipfs = filesystems.get(uriToPath(uri).toRealPath()); - } catch (IOException x) { - // ignore the ioe from toRealPath(), return FSNFE - } - if (zipfs == null) - throw new FileSystemNotFoundException(); - return zipfs; - } - } - - // Checks that the given file is a UnixPath - private static ZipPath toZipPath(Path path) { - if (path == null) - throw new NullPointerException(); - if (!(path instanceof ZipPath)) - throw new ProviderMismatchException(); - return (ZipPath)path; - } - - @Override - public void checkAccess(Path path, AccessMode... modes) throws IOException { - toZipPath(path).checkAccess(modes); - } - - @Override - public void copy(Path src, Path target, CopyOption... options) - throws IOException - { - toZipPath(src).copy(toZipPath(target), options); - } - - @Override - public void createDirectory(Path path, FileAttribute... attrs) - throws IOException - { - toZipPath(path).createDirectory(attrs); - } - - @Override - public final void delete(Path path) throws IOException { - toZipPath(path).delete(); - } - - @Override - public V - getFileAttributeView(Path path, Class type, LinkOption... options) - { - return toZipPath(path).getFileAttributeView(type); - } - - @Override - public FileStore getFileStore(Path path) throws IOException { - return toZipPath(path).getFileStore(); - } - - @Override - public boolean isHidden(Path path) { - return toZipPath(path).isHidden(); - } - - @Override - public boolean isSameFile(Path path, Path other) throws IOException { - return toZipPath(path).isSameFile(other); - } - - @Override - public void move(Path src, Path target, CopyOption... options) - throws IOException - { - toZipPath(src).move(toZipPath(target), options); - } - - @Override - public AsynchronousFileChannel newAsynchronousFileChannel(Path path, - Set options, - ExecutorService exec, - FileAttribute... attrs) - { - throw new UnsupportedOperationException(); - } - - @Override - public SeekableByteChannel newByteChannel(Path path, - Set options, - FileAttribute... attrs) - throws IOException - { - return toZipPath(path).newByteChannel(options, attrs); - } - - @Override - public DirectoryStream newDirectoryStream( - Path path, Filter filter) throws IOException - { - return toZipPath(path).newDirectoryStream(filter); - } - - @Override - public FileChannel newFileChannel(Path path, - Set options, - FileAttribute... attrs) - throws IOException - { - return toZipPath(path).newFileChannel(options, attrs); - } - - @Override - public InputStream newInputStream(Path path, OpenOption... options) - throws IOException - { - return toZipPath(path).newInputStream(options); - } - - @Override - public OutputStream newOutputStream(Path path, OpenOption... options) - throws IOException - { - return toZipPath(path).newOutputStream(options); - } - - @Override - public A - readAttributes(Path path, Class type, LinkOption... options) - throws IOException - { - return toZipPath(path).readAttributes(type); - } - - @Override - public Map - readAttributes(Path path, String attributes, LinkOption... options) - throws IOException - { - return toZipPath(path).readAttributes(attributes, options); - } - - @Override - public Path readSymbolicLink(Path link) { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public void setAttribute(Path path, String attribute, - Object value, LinkOption... options) - throws IOException - { - toZipPath(path).setAttribute(attribute, value, options); - } - - ////////////////////////////////////////////////////////////// - @SuppressWarnings("removal") - void removeFileSystem(Path zfpath, ZipFileSystem zfs) throws IOException { - synchronized (filesystems) { - Path tempPath = zfpath; - PrivilegedExceptionAction action = tempPath::toRealPath; - try { - zfpath = AccessController.doPrivileged(action); - } catch (PrivilegedActionException e) { - throw (IOException) e.getException(); - } - if (filesystems.get(zfpath) == zfs) - filesystems.remove(zfpath); - } - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipInfo.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipInfo.java deleted file mode 100644 index 2441598e12..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipInfo.java +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.nio.file.Paths; -import java.util.Collections; -import java.util.Map; -import java.util.zip.ZipException; - -import static app.revanced.manager.backend.utils.filesystem.zipfs.ZipUtils.dosToJavaTime; -import static app.revanced.manager.backend.utils.filesystem.zipfs.ZipUtils.unixToJavaTime; -import static app.revanced.manager.backend.utils.filesystem.zipfs.ZipUtils.winToJavaTime; - -/** - * Print all loc and cen headers of the ZIP file - * - * @author Xueming Shen - */ -public class ZipInfo { - - public static void main(String[] args) throws Throwable { - if (args.length < 1) { - print("Usage: java ZipInfo zfname"); - } else { - Map env = Collections.emptyMap(); - ZipFileSystem zfs = (ZipFileSystem)(new ZipFileSystemProvider() - .newFileSystem(Paths.get(args[0]), env)); - byte[] cen = zfs.cen; - if (cen == null) { - print("zip file is empty%n"); - return; - } - int pos = 0; - byte[] buf = new byte[1024]; - int no = 1; - while (pos + ZipConstants.CENHDR < cen.length) { - print("----------------#%d--------------------%n", no++); - printCEN(cen, pos); - - // use size CENHDR as the extra bytes to read, just in case the - // loc.extra is bigger than the cen.extra, try to avoid to read - // twice - long len = ZipConstants.LOCHDR + ZipConstants.CENNAM(cen, pos) + ZipConstants.CENEXT(cen, pos) + ZipConstants.CENHDR; - if (zfs.readFullyAt(buf, 0, len, locoff(cen, pos)) != len) - throw new ZipException("read loc header failed"); - if (ZipConstants.LOCEXT(buf) > ZipConstants.CENEXT(cen, pos) + ZipConstants.CENHDR) { - // have to read the second time; - len = ZipConstants.LOCHDR + ZipConstants.LOCNAM(buf) + ZipConstants.LOCEXT(buf); - if (zfs.readFullyAt(buf, 0, len, locoff(cen, pos)) != len) - throw new ZipException("read loc header failed"); - } - printLOC(buf); - pos += ZipConstants.CENHDR + ZipConstants.CENNAM(cen, pos) + ZipConstants.CENEXT(cen, pos) + ZipConstants.CENCOM(cen, pos); - } - zfs.close(); - } - } - - private static void print(String fmt, Object... objs) { - System.out.printf(fmt, objs); - } - - private static void printLOC(byte[] loc) { - print("%n"); - print("[Local File Header]%n"); - print(" Signature : %#010x%n", ZipConstants.LOCSIG(loc)); - if (ZipConstants.LOCSIG(loc) != ZipConstants.LOCSIG) { - print(" Wrong signature!"); - return; - } - print(" Version : %#6x [%d.%d]%n", - ZipConstants.LOCVER(loc), ZipConstants.LOCVER(loc) / 10, ZipConstants.LOCVER(loc) % 10); - print(" Flag : %#6x%n", ZipConstants.LOCFLG(loc)); - print(" Method : %#6x%n", ZipConstants.LOCHOW(loc)); - print(" LastMTime : %#10x [%tc]%n", - ZipConstants.LOCTIM(loc), dosToJavaTime(ZipConstants.LOCTIM(loc))); - print(" CRC : %#10x%n", ZipConstants.LOCCRC(loc)); - print(" CSize : %#10x%n", ZipConstants.LOCSIZ(loc)); - print(" Size : %#10x%n", ZipConstants.LOCLEN(loc)); - print(" NameLength : %#6x [%s]%n", - ZipConstants.LOCNAM(loc), new String(loc, ZipConstants.LOCHDR, ZipConstants.LOCNAM(loc))); - print(" ExtraLength : %#6x%n", ZipConstants.LOCEXT(loc)); - if (ZipConstants.LOCEXT(loc) != 0) - printExtra(loc, ZipConstants.LOCHDR + ZipConstants.LOCNAM(loc), ZipConstants.LOCEXT(loc)); - } - - private static void printCEN(byte[] cen, int off) { - print("[Central Directory Header]%n"); - print(" Signature : %#010x%n", ZipConstants.CENSIG(cen, off)); - if (ZipConstants.CENSIG(cen, off) != ZipConstants.CENSIG) { - print(" Wrong signature!"); - return; - } - print(" VerMadeby : %#6x [%d, %d.%d]%n", - ZipConstants.CENVEM(cen, off), (ZipConstants.CENVEM(cen, off) >> 8), - (ZipConstants.CENVEM(cen, off) & 0xff) / 10, - (ZipConstants.CENVEM(cen, off) & 0xff) % 10); - print(" VerExtract : %#6x [%d.%d]%n", - ZipConstants.CENVER(cen, off), ZipConstants.CENVER(cen, off) / 10, ZipConstants.CENVER(cen, off) % 10); - print(" Flag : %#6x%n", ZipConstants.CENFLG(cen, off)); - print(" Method : %#6x%n", ZipConstants.CENHOW(cen, off)); - print(" LastMTime : %#10x [%tc]%n", - ZipConstants.CENTIM(cen, off), dosToJavaTime(ZipConstants.CENTIM(cen, off))); - print(" CRC : %#10x%n", ZipConstants.CENCRC(cen, off)); - print(" CSize : %#10x%n", ZipConstants.CENSIZ(cen, off)); - print(" Size : %#10x%n", ZipConstants.CENLEN(cen, off)); - print(" NameLen : %#6x [%s]%n", - ZipConstants.CENNAM(cen, off), new String(cen, off + ZipConstants.CENHDR, ZipConstants.CENNAM(cen, off))); - print(" ExtraLen : %#6x%n", ZipConstants.CENEXT(cen, off)); - if (ZipConstants.CENEXT(cen, off) != 0) - printExtra(cen, off + ZipConstants.CENHDR + ZipConstants.CENNAM(cen, off), ZipConstants.CENEXT(cen, off)); - print(" CommentLen : %#6x%n", ZipConstants.CENCOM(cen, off)); - print(" DiskStart : %#6x%n", ZipConstants.CENDSK(cen, off)); - print(" Attrs : %#6x%n", ZipConstants.CENATT(cen, off)); - print(" AttrsEx : %#10x%n", ZipConstants.CENATX(cen, off)); - print(" LocOff : %#10x%n", ZipConstants.CENOFF(cen, off)); - - } - - private static long locoff(byte[] cen, int pos) { - long locoff = ZipConstants.CENOFF(cen, pos); - if (locoff == ZipConstants.ZIP64_MINVAL) { //ZIP64 - int off = pos + ZipConstants.CENHDR + ZipConstants.CENNAM(cen, pos); - int end = off + ZipConstants.CENEXT(cen, pos); - while (off + 4 < end) { - int tag = ZipConstants.SH(cen, off); - int sz = ZipConstants.SH(cen, off + 2); - if (tag != ZipConstants.EXTID_ZIP64) { - off += 4 + sz; - continue; - } - off += 4; - if (ZipConstants.CENLEN(cen, pos) == ZipConstants.ZIP64_MINVAL) - off += 8; - if (ZipConstants.CENSIZ(cen, pos) == ZipConstants.ZIP64_MINVAL) - off += 8; - return ZipConstants.LL(cen, off); - } - // should never be here - } - return locoff; - } - - private static void printExtra(byte[] extra, int off, int len) { - int end = off + len; - while (off + 4 <= end) { - int tag = ZipConstants.SH(extra, off); - int sz = ZipConstants.SH(extra, off + 2); - print(" [tag=0x%04x, sz=%d, data= ", tag, sz); - if (off + sz > end) { - print(" Error: Invalid extra data, beyond extra length"); - break; - } - off += 4; - for (int i = 0; i < sz; i++) - print("%02x ", extra[off + i]); - print("]%n"); - switch (tag) { - case ZipConstants.EXTID_ZIP64 : - print(" ->ZIP64: "); - int pos = off; - while (pos + 8 <= off + sz) { - print(" *0x%x ", ZipConstants.LL(extra, pos)); - pos += 8; - } - print("%n"); - break; - case ZipConstants.EXTID_NTFS: - print(" ->PKWare NTFS%n"); - // 4 bytes reserved - if (ZipConstants.SH(extra, off + 4) != 0x0001 || ZipConstants.SH(extra, off + 6) != 24) - print(" Error: Invalid NTFS sub-tag or subsz"); - print(" mtime:%tc%n", - winToJavaTime(ZipConstants.LL(extra, off + 8))); - print(" atime:%tc%n", - winToJavaTime(ZipConstants.LL(extra, off + 16))); - print(" ctime:%tc%n", - winToJavaTime(ZipConstants.LL(extra, off + 24))); - break; - case ZipConstants.EXTID_EXTT: - print(" ->Info-ZIP Extended Timestamp: flag=%x%n",extra[off]); - pos = off + 1 ; - while (pos + 4 <= off + sz) { - print(" *%tc%n", - unixToJavaTime(ZipConstants.LG(extra, pos))); - pos += 4; - } - break; - default: - print(" ->[tag=%x, size=%d]%n", tag, sz); - } - off += sz; - } - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipPath.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipPath.java deleted file mode 100644 index 52855224ad..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipPath.java +++ /dev/null @@ -1,1043 +0,0 @@ -/* - * Copyright (c) 2009, 2021, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URI; -import java.nio.channels.FileChannel; -import java.nio.channels.SeekableByteChannel; -import java.nio.file.*; -import java.nio.file.DirectoryStream.Filter; -import java.nio.file.attribute.*; -import java.util.Arrays; -import java.util.Iterator; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Objects; -import java.util.Set; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES; -import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; -import static java.nio.file.StandardOpenOption.CREATE; -import static java.nio.file.StandardOpenOption.READ; -import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING; -import static java.nio.file.StandardOpenOption.WRITE; - -/** - * @author Xueming Shen, Rajendra Gutupalli,Jaya Hangal - */ -final class ZipPath implements Path { - - private final ZipFileSystem zfs; - private final byte[] path; - private volatile int[] offsets; - private int hashcode = 0; // cached hashcode (created lazily) - - ZipPath(ZipFileSystem zfs, byte[] path) { - this(zfs, path, false); - } - - ZipPath(ZipFileSystem zfs, byte[] path, boolean normalized) { - this.zfs = zfs; - if (normalized) { - this.path = path; - } else { - if (zfs.zc.isUTF8()) { - this.path = normalize(path); - } else { // see normalize(String); - this.path = normalize(zfs.getString(path)); - } - } - } - - ZipPath(ZipFileSystem zfs, String path) { - this.zfs = zfs; - this.path = normalize(path); - } - - @Override - public ZipPath getRoot() { - if (this.isAbsolute()) - return zfs.getRootDir(); - else - return null; - } - - @Override - public ZipPath getFileName() { - int off = path.length; - if (off == 0 || off == 1 && path[0] == '/') - return null; - while (--off >= 0 && path[off] != '/') {} - if (off < 0) - return this; - off++; - byte[] result = new byte[path.length - off]; - System.arraycopy(path, off, result, 0, result.length); - return new ZipPath(getFileSystem(), result, true); - } - - @Override - public ZipPath getParent() { - int off = path.length; - if (off == 0 || off == 1 && path[0] == '/') - return null; - while (--off >= 0 && path[off] != '/') {} - if (off <= 0) - return getRoot(); - byte[] result = new byte[off]; - System.arraycopy(path, 0, result, 0, off); - return new ZipPath(getFileSystem(), result, true); - } - - @Override - public int getNameCount() { - initOffsets(); - return offsets.length; - } - - @Override - public ZipPath getName(int index) { - initOffsets(); - if (index < 0 || index >= offsets.length) - throw new IllegalArgumentException(); - int begin = offsets[index]; - int len; - if (index == (offsets.length-1)) - len = path.length - begin; - else - len = offsets[index+1] - begin - 1; - // construct result - byte[] result = new byte[len]; - System.arraycopy(path, begin, result, 0, len); - return new ZipPath(zfs, result); - } - - @Override - public ZipPath subpath(int beginIndex, int endIndex) { - initOffsets(); - if (beginIndex < 0 || - beginIndex >= offsets.length || - endIndex > offsets.length || - beginIndex >= endIndex) - throw new IllegalArgumentException(); - - // starting offset and length - int begin = offsets[beginIndex]; - int len; - if (endIndex == offsets.length) - len = path.length - begin; - else - len = offsets[endIndex] - begin - 1; - // construct result - byte[] result = new byte[len]; - System.arraycopy(path, begin, result, 0, len); - return new ZipPath(zfs, result); - } - - @Override - public ZipPath toRealPath(LinkOption... options) throws IOException { - ZipPath realPath; - byte[] resolved = getResolvedPath(); - // resolved is always absolute and normalized - if (resolved == path) { - realPath = this; - } else { - realPath = new ZipPath(zfs, resolved, true); - realPath.resolved = resolved; - } - realPath.checkAccess(); - return realPath; - } - - boolean isHidden() { - return false; - } - - @Override - public ZipPath toAbsolutePath() { - if (isAbsolute()) { - return this; - } else { - // add '/' before the existing path - byte[] tmp = new byte[path.length + 1]; - System.arraycopy(path, 0, tmp, 1, path.length); - tmp[0] = '/'; - return new ZipPath(zfs, tmp, true); // normalized - } - } - - @Override - public URI toUri() { - try { - return new URI("jar", - decodeUri(zfs.getZipFile().toUri().toString()) + - "!" + - zfs.getString(toAbsolutePath().path), - null); - } catch (Exception ex) { - throw new AssertionError(ex); - } - } - - private boolean equalsNameAt(ZipPath other, int index) { - int mbegin = offsets[index]; - int mlen; - if (index == (offsets.length-1)) - mlen = path.length - mbegin; - else - mlen = offsets[index + 1] - mbegin - 1; - int obegin = other.offsets[index]; - int olen; - if (index == (other.offsets.length - 1)) - olen = other.path.length - obegin; - else - olen = other.offsets[index + 1] - obegin - 1; - if (mlen != olen) - return false; - int n = 0; - while(n < mlen) { - if (path[mbegin + n] != other.path[obegin + n]) - return false; - n++; - } - return true; - } - - @Override - public Path relativize(Path other) { - final ZipPath o = checkPath(other); - if (o.equals(this)) - return new ZipPath(zfs, new byte[0], true); - if (this.path.length == 0) - return o; - if (this.zfs != o.zfs || this.isAbsolute() != o.isAbsolute()) - throw new IllegalArgumentException(); - if (this.path.length == 1 && this.path[0] == '/') - return new ZipPath(zfs, - Arrays.copyOfRange(o.path, 1, o.path.length), - true); - int mc = this.getNameCount(); - int oc = o.getNameCount(); - int n = Math.min(mc, oc); - int i = 0; - while (i < n) { - if (!equalsNameAt(o, i)) - break; - i++; - } - int dotdots = mc - i; - int len = dotdots * 3 - 1; - if (i < oc) - len += (o.path.length - o.offsets[i] + 1); - byte[] result = new byte[len]; - - int pos = 0; - while (dotdots > 0) { - result[pos++] = (byte)'.'; - result[pos++] = (byte)'.'; - if (pos < len) // no tailing slash at the end - result[pos++] = (byte)'/'; - dotdots--; - } - if (i < oc) - System.arraycopy(o.path, o.offsets[i], - result, pos, - o.path.length - o.offsets[i]); - return new ZipPath(zfs, result); - } - - @Override - public ZipFileSystem getFileSystem() { - return zfs; - } - - @Override - public boolean isAbsolute() { - return path.length > 0 && path[0] == '/'; - } - - @Override - public ZipPath resolve(Path other) { - ZipPath o = checkPath(other); - if (o.path.length == 0) - return this; - if (o.isAbsolute() || this.path.length == 0) - return o; - return resolve(o.path); - } - - // opath is normalized, just concat - private ZipPath resolve(byte[] opath) { - byte[] resolved; - byte[] tpath = this.path; - int tlen = tpath.length; - int olen = opath.length; - if (path[tlen - 1] == '/') { - resolved = new byte[tlen + olen]; - System.arraycopy(tpath, 0, resolved, 0, tlen); - System.arraycopy(opath, 0, resolved, tlen, olen); - } else { - resolved = new byte[tlen + 1 + olen]; - System.arraycopy(tpath, 0, resolved, 0, tlen); - resolved[tlen] = '/'; - System.arraycopy(opath, 0, resolved, tlen + 1, olen); - } - return new ZipPath(zfs, resolved, true); - } - - @Override - public Path resolveSibling(Path other) { - Objects.requireNonNull(other, "other"); - Path parent = getParent(); - return (parent == null) ? other : parent.resolve(other); - } - - @Override - public boolean startsWith(Path other) { - Objects.requireNonNull(other, "other"); - if (!(other instanceof ZipPath)) - return false; - final ZipPath o = (ZipPath)other; - if (o.isAbsolute() != this.isAbsolute() || - o.path.length > this.path.length) - return false; - int olast = o.path.length; - for (int i = 0; i < olast; i++) { - if (o.path[i] != this.path[i]) - return false; - } - olast--; - return o.path.length == this.path.length || - o.path[olast] == '/' || - this.path[olast + 1] == '/'; - } - - @Override - public boolean endsWith(Path other) { - Objects.requireNonNull(other, "other"); - if (!(other instanceof ZipPath)) - return false; - final ZipPath o = (ZipPath)other; - int olast = o.path.length - 1; - if (olast > 0 && o.path[olast] == '/') - olast--; - int last = this.path.length - 1; - if (last > 0 && this.path[last] == '/') - last--; - if (olast == -1) // o.path.length == 0 - return last == -1; - if ((o.isAbsolute() &&(!this.isAbsolute() || olast != last)) || - (last < olast)) - return false; - for (; olast >= 0; olast--, last--) { - if (o.path[olast] != this.path[last]) - return false; - } - return o.path[olast + 1] == '/' || - last == -1 || this.path[last] == '/'; - } - - @Override - public ZipPath resolve(String other) { - byte[] opath = normalize(other); - if (opath.length == 0) - return this; - if (opath[0] == '/' || this.path.length == 0) - return new ZipPath(zfs, opath, true); - return resolve(opath); - } - - @Override - public final Path resolveSibling(String other) { - return resolveSibling(zfs.getPath(other)); - } - - @Override - public final boolean startsWith(String other) { - return startsWith(zfs.getPath(other)); - } - - @Override - public final boolean endsWith(String other) { - return endsWith(zfs.getPath(other)); - } - - @Override - public Path normalize() { - byte[] resolved = getResolved(); - if (resolved == path) // no change - return this; - return new ZipPath(zfs, resolved, true); - } - - private ZipPath checkPath(Path path) { - Objects.requireNonNull(path, "path"); - if (!(path instanceof ZipPath)) - throw new ProviderMismatchException(); - return (ZipPath) path; - } - - // create offset list if not already created - private void initOffsets() { - if (offsets == null) { - int count, index; - // count names - count = 0; - index = 0; - if (path.length == 0) { - // empty path has one name - count = 1; - } else { - while (index < path.length) { - byte c = path[index++]; - if (c != '/') { - count++; - while (index < path.length && path[index] != '/') - index++; - } - } - } - // populate offsets - int[] result = new int[count]; - count = 0; - index = 0; - while (index < path.length) { - byte c = path[index]; - if (c == '/') { - index++; - } else { - result[count++] = index++; - while (index < path.length && path[index] != '/') - index++; - } - } - synchronized (this) { - if (offsets == null) - offsets = result; - } - } - } - - // resolved path for locating zip entry inside the zip file, - // the result path does not contain ./ and .. components - private volatile byte[] resolved = null; - byte[] getResolvedPath() { - byte[] r = resolved; - if (r == null) { - if (isAbsolute()) - r = getResolved(); - else - r = toAbsolutePath().getResolvedPath(); - resolved = r; - } - return resolved; - } - - // removes redundant slashs, replace "\" to zip separator "/" - // and check for invalid characters - private byte[] normalize(byte[] path) { - int len = path.length; - if (len == 0) - return path; - byte prevC = 0; - for (int i = 0; i < len; i++) { - byte c = path[i]; - if (c == '\\' || c == '\u0000') - return normalize(path, i); - if (c == (byte)'/' && prevC == '/') - return normalize(path, i - 1); - prevC = c; - } - if (len > 1 && prevC == '/') { - return Arrays.copyOf(path, len - 1); - } - return path; - } - - private byte[] normalize(byte[] path, int off) { - byte[] to = new byte[path.length]; - int n = 0; - while (n < off) { - to[n] = path[n]; - n++; - } - int m = n; - byte prevC = 0; - while (n < path.length) { - byte c = path[n++]; - if (c == (byte)'\\') - c = (byte)'/'; - if (c == (byte)'/' && prevC == (byte)'/') - continue; - if (c == '\u0000') - throw new InvalidPathException(zfs.getString(path), - "Path: nul character not allowed"); - to[m++] = c; - prevC = c; - } - if (m > 1 && to[m - 1] == '/') - m--; - return (m == to.length)? to : Arrays.copyOf(to, m); - } - - // if zfs is NOT in utf8, normalize the path as "String" - // to avoid incorrectly normalizing byte '0x5c' (as '\') - // to '/'. - private byte[] normalize(String path) { - if (zfs.zc.isUTF8()) - return normalize(zfs.getBytes(path)); - int len = path.length(); - if (len == 0) - return new byte[0]; - char prevC = 0; - for (int i = 0; i < len; i++) { - char c = path.charAt(i); - if (c == '\\' || c == '\u0000') - return normalize(path, i, len); - if (c == '/' && prevC == '/') - return normalize(path, i - 1, len); - prevC = c; - } - if (len > 1 && prevC == '/') - path = path.substring(0, len - 1); - return zfs.getBytes(path); - } - - private byte[] normalize(String path, int off, int len) { - StringBuilder to = new StringBuilder(len); - to.append(path, 0, off); - char prevC = 0; - while (off < len) { - char c = path.charAt(off++); - if (c == '\\') - c = '/'; - if (c == '/' && prevC == '/') - continue; - if (c == '\u0000') - throw new InvalidPathException(path, - "Path: nul character not allowed"); - to.append(c); - prevC = c; - } - len = to.length(); - if (len > 1 && prevC == '/') - to.delete(len -1, len); - return zfs.getBytes(to.toString()); - } - - // Remove DotSlash(./) and resolve DotDot (..) components - private byte[] getResolved() { - for (int i = 0; i < path.length; i++) { - if (path[i] == (byte)'.' && - (i + 1 == path.length || path[i + 1] == '/')) { - return resolve0(); - } - } - return path; - } - - // TBD: performance, avoid initOffsets - private byte[] resolve0() { - byte[] to = new byte[path.length]; - int nc = getNameCount(); - int[] lastM = new int[nc]; - int lastMOff = -1; - int m = 0; - for (int i = 0; i < nc; i++) { - int n = offsets[i]; - int len = (i == offsets.length - 1)? - (path.length - n):(offsets[i + 1] - n - 1); - if (len == 1 && path[n] == (byte)'.') { - if (m == 0 && path[0] == '/') // absolute path - to[m++] = '/'; - continue; - } - if (len == 2 && path[n] == '.' && path[n + 1] == '.') { - if (lastMOff >= 0) { - m = lastM[lastMOff--]; // retreat - continue; - } - if (path[0] == '/') { // "/../xyz" skip - if (m == 0) - to[m++] = '/'; - } else { // "../xyz" -> "../xyz" - if (m != 0 && to[m-1] != '/') - to[m++] = '/'; - while (len-- > 0) - to[m++] = path[n++]; - } - continue; - } - if (m == 0 && path[0] == '/' || // absolute path - m != 0 && to[m-1] != '/') { // not the first name - to[m++] = '/'; - } - lastM[++lastMOff] = m; - while (len-- > 0) - to[m++] = path[n++]; - } - if (m > 1 && to[m - 1] == '/') - m--; - return (m == to.length)? to : Arrays.copyOf(to, m); - } - - @Override - public String toString() { - return zfs.getString(path); - } - - @Override - public int hashCode() { - int h = hashcode; - if (h == 0) - hashcode = h = Arrays.hashCode(path); - return h; - } - - @Override - public boolean equals(Object obj) { - return obj instanceof ZipPath && - this.zfs == ((ZipPath) obj).zfs && - compareTo((Path) obj) == 0; - } - - @Override - public int compareTo(Path other) { - final ZipPath o = checkPath(other); - int len1 = this.path.length; - int len2 = o.path.length; - - int n = Math.min(len1, len2); - - int k = 0; - while (k < n) { - int c1 = this.path[k] & 0xff; - int c2 = o.path[k] & 0xff; - if (c1 != c2) - return c1 - c2; - k++; - } - return len1 - len2; - } - - public WatchKey register( - WatchService watcher, - WatchEvent.Kind[] events, - WatchEvent.Modifier... modifiers) { - if (watcher == null || events == null || modifiers == null) { - throw new NullPointerException(); - } - // watcher must be associated with a different provider - throw new ProviderMismatchException(); - } - - @Override - public WatchKey register(WatchService watcher, WatchEvent.Kind... events) { - return register(watcher, events, new WatchEvent.Modifier[0]); - } - - @Override - public final File toFile() { - throw new UnsupportedOperationException(); - } - - @Override - public Iterator iterator() { - return new Iterator<>() { - private int i = 0; - - @Override - public boolean hasNext() { - return (i < getNameCount()); - } - - @Override - public Path next() { - if (i < getNameCount()) { - Path result = getName(i); - i++; - return result; - } else { - throw new NoSuchElementException(); - } - } - - @Override - public void remove() { - throw new ReadOnlyFileSystemException(); - } - }; - } - - ///////////////////////////////////////////////////////////////////// - - @SuppressWarnings("unchecked") // Cast to V - V getFileAttributeView(Class type) { - if (type == null) - throw new NullPointerException(); - if (type == BasicFileAttributeView.class) - return (V)new ZipFileAttributeView(this, false); - if (type == ZipFileAttributeView.class) - return (V)new ZipFileAttributeView(this, true); - if (zfs.supportPosix) { - if (type == PosixFileAttributeView.class) - return (V)new ZipPosixFileAttributeView(this, false); - if (type == FileOwnerAttributeView.class) - return (V)new ZipPosixFileAttributeView(this,true); - } - return null; - } - - private ZipFileAttributeView getFileAttributeView(String type) { - if (type == null) - throw new NullPointerException(); - if ("basic".equals(type)) - return new ZipFileAttributeView(this, false); - if ("zip".equals(type)) - return new ZipFileAttributeView(this, true); - if (zfs.supportPosix) { - if ("posix".equals(type)) - return new ZipPosixFileAttributeView(this, false); - if ("owner".equals(type)) - return new ZipPosixFileAttributeView(this, true); - } - throw new UnsupportedOperationException("view <" + type + "> is not supported"); - } - - void createDirectory(FileAttribute... attrs) - throws IOException - { - zfs.createDirectory(getResolvedPath(), attrs); - } - - InputStream newInputStream(OpenOption... options) throws IOException - { - if (options.length > 0) { - for (OpenOption opt : options) { - if (opt != READ) - throw new UnsupportedOperationException("'" + opt + "' not allowed"); - } - } - return zfs.newInputStream(getResolvedPath()); - } - - DirectoryStream newDirectoryStream(Filter filter) - throws IOException - { - return new ZipDirectoryStream(this, filter); - } - - void delete() throws IOException { - zfs.deleteFile(getResolvedPath(), true); - } - - private void deleteIfExists() throws IOException { - zfs.deleteFile(getResolvedPath(), false); - } - - ZipFileAttributes readAttributes() throws IOException { - ZipFileAttributes zfas = zfs.getFileAttributes(getResolvedPath()); - if (zfas == null) - throw new NoSuchFileException(toString()); - return zfas; - } - - @SuppressWarnings("unchecked") // Cast to A - A readAttributes(Class type) throws IOException { - // unconditionally support BasicFileAttributes and ZipFileAttributes - if (type == BasicFileAttributes.class || type == ZipFileAttributes.class) { - return (A)readAttributes(); - } - - // support PosixFileAttributes when activated - if (type == PosixFileAttributes.class && zfs.supportPosix) { - return (A)readAttributes(); - } - - throw new UnsupportedOperationException("Attributes of type " + - type.getName() + " not supported"); - } - - void setAttribute(String attribute, Object value, LinkOption... options) - throws IOException - { - String type; - String attr; - int colonPos = attribute.indexOf(':'); - if (colonPos == -1) { - type = "basic"; - attr = attribute; - } else { - type = attribute.substring(0, colonPos++); - attr = attribute.substring(colonPos); - } - getFileAttributeView(type).setAttribute(attr, value); - } - - void setTimes(FileTime mtime, FileTime atime, FileTime ctime) - throws IOException - { - zfs.setTimes(getResolvedPath(), mtime, atime, ctime); - } - - void setOwner(UserPrincipal owner) throws IOException { - zfs.setOwner(getResolvedPath(), owner); - } - - void setPermissions(Set perms) - throws IOException - { - zfs.setPermissions(getResolvedPath(), perms); - } - - void setGroup(GroupPrincipal group) throws IOException { - zfs.setGroup(getResolvedPath(), group); - } - - Map readAttributes(String attributes, LinkOption... options) - throws IOException - { - String view; - String attrs; - int colonPos = attributes.indexOf(':'); - if (colonPos == -1) { - view = "basic"; - attrs = attributes; - } else { - view = attributes.substring(0, colonPos++); - attrs = attributes.substring(colonPos); - } - return getFileAttributeView(view).readAttributes(attrs); - } - - FileStore getFileStore() throws IOException { - // each ZipFileSystem only has one root (as requested for now) - if (exists()) - return zfs.getFileStore(this); - throw new NoSuchFileException(zfs.getString(path)); - } - - boolean isSameFile(Path other) throws IOException { - if (this.equals(other)) - return true; - if (other == null || - this.getFileSystem() != other.getFileSystem()) - return false; - this.checkAccess(); - ((ZipPath)other).checkAccess(); - return Arrays.equals(this.getResolvedPath(), - ((ZipPath)other).getResolvedPath()); - } - - SeekableByteChannel newByteChannel(Set options, - FileAttribute... attrs) - throws IOException - { - return zfs.newByteChannel(getResolvedPath(), options, attrs); - } - - - FileChannel newFileChannel(Set options, - FileAttribute... attrs) - throws IOException - { - return zfs.newFileChannel(getResolvedPath(), options, attrs); - } - - void checkAccess(AccessMode... modes) throws IOException { - boolean w = false; - boolean x = false; - for (AccessMode mode : modes) { - switch (mode) { - case READ: - break; - case WRITE: - w = true; - break; - case EXECUTE: - x = true; - break; - default: - throw new UnsupportedOperationException(); - } - } - zfs.checkAccess(getResolvedPath()); - if ((w && zfs.isReadOnly()) || x) { - throw new AccessDeniedException(toString()); - } - } - - private boolean exists() { - return zfs.exists(getResolvedPath()); - } - - OutputStream newOutputStream(OpenOption... options) throws IOException - { - if (options.length == 0) - return zfs.newOutputStream(getResolvedPath(), - CREATE, TRUNCATE_EXISTING, WRITE); - return zfs.newOutputStream(getResolvedPath(), options); - } - - void move(ZipPath target, CopyOption... options) - throws IOException - { - if (Files.isSameFile(this.zfs.getZipFile(), target.zfs.getZipFile())) - { - zfs.copyFile(true, - getResolvedPath(), target.getResolvedPath(), - options); - } else { - copyToTarget(target, options); - delete(); - } - } - - void copy(ZipPath target, CopyOption... options) - throws IOException - { - if (Files.isSameFile(this.zfs.getZipFile(), target.zfs.getZipFile())) - zfs.copyFile(false, - getResolvedPath(), target.getResolvedPath(), - options); - else - copyToTarget(target, options); - } - - private void copyToTarget(ZipPath target, CopyOption... options) - throws IOException - { - boolean replaceExisting = false; - boolean copyAttrs = false; - for (CopyOption opt : options) { - if (opt == REPLACE_EXISTING) - replaceExisting = true; - else if (opt == COPY_ATTRIBUTES) - copyAttrs = true; - } - // attributes of source file - ZipFileAttributes zfas = readAttributes(); - // check if target exists - boolean exists; - if (replaceExisting) { - try { - target.deleteIfExists(); - exists = false; - } catch (DirectoryNotEmptyException x) { - exists = true; - } - } else { - exists = target.exists(); - } - if (exists) - throw new FileAlreadyExistsException(target.toString()); - - if (zfas.isDirectory()) { - // create directory or file - target.createDirectory(); - } else { - try (InputStream is = zfs.newInputStream(getResolvedPath()); - OutputStream os = target.newOutputStream()) - { - StreamUtils.transferTo(is, os); - } - } - if (copyAttrs) { - ZipFileAttributeView view = - target.getFileAttributeView(ZipFileAttributeView.class); - try { - view.setTimes(zfas.lastModifiedTime(), - zfas.lastAccessTime(), - zfas.creationTime()); - // copy permissions - view.setPermissions(zfas.storedPermissions().orElse(null)); - } catch (IOException x) { - // rollback? - try { - target.delete(); - } catch (IOException ignore) { } - throw x; - } - } - } - - private static int decode(char c) { - if ((c >= '0') && (c <= '9')) - return c - '0'; - if ((c >= 'a') && (c <= 'f')) - return c - 'a' + 10; - if ((c >= 'A') && (c <= 'F')) - return c - 'A' + 10; - assert false; - return -1; - } - - // to avoid double escape - private static String decodeUri(String s) { - if (s == null) - return null; - int n = s.length(); - if (n == 0) - return s; - if (s.indexOf('%') < 0) - return s; - - StringBuilder sb = new StringBuilder(n); - byte[] bb = new byte[n]; - boolean betweenBrackets = false; - - for (int i = 0; i < n;) { - char c = s.charAt(i); - if (c == '[') { - betweenBrackets = true; - } else if (betweenBrackets && c == ']') { - betweenBrackets = false; - } - if (c != '%' || betweenBrackets ) { - sb.append(c); - i++; - continue; - } - int nb = 0; - while (c == '%') { - assert (n - i >= 2); - bb[nb++] = (byte)(((decode(s.charAt(++i)) & 0xf) << 4) | - (decode(s.charAt(++i)) & 0xf)); - if (++i >= n) { - break; - } - c = s.charAt(i); - } - sb.append(new String(bb, 0, nb, UTF_8)); - } - return sb.toString(); - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipPosixFileAttributeView.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipPosixFileAttributeView.java deleted file mode 100644 index ba966f108c..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipPosixFileAttributeView.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.io.IOException; -import java.nio.file.attribute.GroupPrincipal; -import java.nio.file.attribute.PosixFileAttributeView; -import java.nio.file.attribute.PosixFileAttributes; -import java.nio.file.attribute.UserPrincipal; - -/** - * The zip file system attribute view with POSIX support. - */ -class ZipPosixFileAttributeView extends ZipFileAttributeView implements PosixFileAttributeView { - private final boolean isOwnerView; - - ZipPosixFileAttributeView(ZipPath path, boolean owner) { - super(path, true); - this.isOwnerView = owner; - } - - @Override - public String name() { - return isOwnerView ? "owner" : "posix"; - } - - @Override - public PosixFileAttributes readAttributes() throws IOException { - return (PosixFileAttributes)path.readAttributes(); - } - - @Override - public UserPrincipal getOwner() throws IOException { - return readAttributes().owner(); - } - - @Override - public void setOwner(UserPrincipal owner) throws IOException { - path.setOwner(owner); - } - - @Override - public void setGroup(GroupPrincipal group) throws IOException { - path.setGroup(group); - } - - @Override - Object attribute(AttrID id, ZipFileAttributes zfas) { - PosixFileAttributes pzfas = (PosixFileAttributes)zfas; - switch (id) { - case owner: - return pzfas.owner(); - case group: - return pzfas.group(); - case permissions: - if (!isOwnerView) { - return pzfas.permissions(); - } else { - return super.attribute(id, zfas); - } - default: - return super.attribute(id, zfas); - } - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipUtils.java b/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipUtils.java deleted file mode 100644 index a184572416..0000000000 --- a/app/src/main/java/app/revanced/manager/backend/utils/filesystem/zipfs/ZipUtils.java +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright (c) 2009, 2019, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package app.revanced.manager.backend.utils.filesystem.zipfs; - -import java.io.IOException; -import java.io.OutputStream; -import java.nio.file.attribute.PosixFilePermission; -import java.time.DateTimeException; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.ZoneId; -import java.util.Arrays; -import java.util.Date; -import java.util.Set; -import java.util.concurrent.TimeUnit; -import java.util.regex.PatternSyntaxException; - -/** - * @author Xueming Shen - */ -class ZipUtils { - - /** - * The bit flag used to specify read permission by the owner. - */ - static final int POSIX_USER_READ = 0400; - - /** - * The bit flag used to specify write permission by the owner. - */ - static final int POSIX_USER_WRITE = 0200; - - /** - * The bit flag used to specify execute permission by the owner. - */ - static final int POSIX_USER_EXECUTE = 0100; - - /** - * The bit flag used to specify read permission by the group. - */ - static final int POSIX_GROUP_READ = 040; - - /** - * The bit flag used to specify write permission by the group. - */ - static final int POSIX_GROUP_WRITE = 020; - - /** - * The bit flag used to specify execute permission by the group. - */ - static final int POSIX_GROUP_EXECUTE = 010; - - /** - * The bit flag used to specify read permission by others. - */ - static final int POSIX_OTHER_READ = 04; - - /** - * The bit flag used to specify write permission by others. - */ - static final int POSIX_OTHER_WRITE = 02; - - /** - * The bit flag used to specify execute permission by others. - */ - static final int POSIX_OTHER_EXECUTE = 01; - - /** - * Convert a {@link PosixFilePermission} object into the appropriate bit - * flag. - * - * @param perm The {@link PosixFilePermission} object. - * @return The bit flag as int. - */ - static int permToFlag(PosixFilePermission perm) { - switch(perm) { - case OWNER_READ: - return POSIX_USER_READ; - case OWNER_WRITE: - return POSIX_USER_WRITE; - case OWNER_EXECUTE: - return POSIX_USER_EXECUTE; - case GROUP_READ: - return POSIX_GROUP_READ; - case GROUP_WRITE: - return POSIX_GROUP_WRITE; - case GROUP_EXECUTE: - return POSIX_GROUP_EXECUTE; - case OTHERS_READ: - return POSIX_OTHER_READ; - case OTHERS_WRITE: - return POSIX_OTHER_WRITE; - case OTHERS_EXECUTE: - return POSIX_OTHER_EXECUTE; - default: - return 0; - } - } - - /** - * Converts a set of {@link PosixFilePermission}s into an int value where - * the according bits are set. - * - * @param perms A Set of {@link PosixFilePermission} objects. - * - * @return A bit mask representing the input Set. - */ - static int permsToFlags(Set perms) { - if (perms == null) { - return -1; - } - int flags = 0; - for (PosixFilePermission perm : perms) { - flags |= permToFlag(perm); - } - return flags; - } - - /* - * Writes a 16-bit short to the output stream in little-endian byte order. - */ - public static void writeShort(OutputStream os, int v) throws IOException { - os.write(v & 0xff); - os.write((v >>> 8) & 0xff); - } - - /* - * Writes a 32-bit int to the output stream in little-endian byte order. - */ - public static void writeInt(OutputStream os, long v) throws IOException { - os.write((int)(v & 0xff)); - os.write((int)((v >>> 8) & 0xff)); - os.write((int)((v >>> 16) & 0xff)); - os.write((int)((v >>> 24) & 0xff)); - } - - /* - * Writes a 64-bit int to the output stream in little-endian byte order. - */ - public static void writeLong(OutputStream os, long v) throws IOException { - os.write((int)(v & 0xff)); - os.write((int)((v >>> 8) & 0xff)); - os.write((int)((v >>> 16) & 0xff)); - os.write((int)((v >>> 24) & 0xff)); - os.write((int)((v >>> 32) & 0xff)); - os.write((int)((v >>> 40) & 0xff)); - os.write((int)((v >>> 48) & 0xff)); - os.write((int)((v >>> 56) & 0xff)); - } - - /* - * Writes an array of bytes to the output stream. - */ - public static void writeBytes(OutputStream os, byte[] b) - throws IOException - { - os.write(b, 0, b.length); - } - - /* - * Writes an array of bytes to the output stream. - */ - public static void writeBytes(OutputStream os, byte[] b, int off, int len) - throws IOException - { - os.write(b, off, len); - } - - /* - * Append a slash at the end, if it does not have one yet - */ - public static byte[] toDirectoryPath(byte[] dir) { - if (dir.length != 0 && dir[dir.length - 1] != '/') { - dir = Arrays.copyOf(dir, dir.length + 1); - dir[dir.length - 1] = '/'; - } - return dir; - } - - /* - * Converts DOS time to Java time (number of milliseconds since epoch). - */ - public static long dosToJavaTime(long dtime) { - int year = (int) (((dtime >> 25) & 0x7f) + 1980); - int month = (int) ((dtime >> 21) & 0x0f); - int day = (int) ((dtime >> 16) & 0x1f); - int hour = (int) ((dtime >> 11) & 0x1f); - int minute = (int) ((dtime >> 5) & 0x3f); - int second = (int) ((dtime << 1) & 0x3e); - - if (month > 0 && month < 13 && day > 0 && hour < 24 && minute < 60 && second < 60) { - try { - LocalDateTime ldt = LocalDateTime.of(year, month, day, hour, minute, second); - return TimeUnit.MILLISECONDS.convert(ldt.toEpochSecond( - ZoneId.systemDefault().getRules().getOffset(ldt)), TimeUnit.SECONDS); - } catch (DateTimeException dte) { - // ignore - } - } - return overflowDosToJavaTime(year, month, day, hour, minute, second); - } - - /* - * Deal with corner cases where an arguably mal-formed DOS time is used - */ - @SuppressWarnings("deprecation") // Use of Date constructor - private static long overflowDosToJavaTime(int year, int month, int day, - int hour, int minute, int second) { - return new Date(year - 1900, month - 1, day, hour, minute, second).getTime(); - } - - /* - * Converts Java time to DOS time. - */ - public static long javaToDosTime(long time) { - Instant instant = Instant.ofEpochMilli(time); - LocalDateTime ldt = LocalDateTime.ofInstant( - instant, ZoneId.systemDefault()); - int year = ldt.getYear() - 1980; - if (year < 0) { - return (1 << 21) | (1 << 16); - } - return (year << 25 | - ldt.getMonthValue() << 21 | - ldt.getDayOfMonth() << 16 | - ldt.getHour() << 11 | - ldt.getMinute() << 5 | - ldt.getSecond() >> 1) & 0xffffffffL; - } - - // used to adjust values between Windows and java epoch - private static final long WINDOWS_EPOCH_IN_MICROSECONDS = -11644473600000000L; - public static final long winToJavaTime(long wtime) { - return TimeUnit.MILLISECONDS.convert( - wtime / 10 + WINDOWS_EPOCH_IN_MICROSECONDS, TimeUnit.MICROSECONDS); - } - - public static final long javaToWinTime(long time) { - return (TimeUnit.MICROSECONDS.convert(time, TimeUnit.MILLISECONDS) - - WINDOWS_EPOCH_IN_MICROSECONDS) * 10; - } - - public static final long unixToJavaTime(long utime) { - return TimeUnit.MILLISECONDS.convert(utime, TimeUnit.SECONDS); - } - - public static final long javaToUnixTime(long time) { - return TimeUnit.SECONDS.convert(time, TimeUnit.MILLISECONDS); - } - - private static final String regexMetaChars = ".^$+{[]|()"; - private static final String globMetaChars = "\\*?[{"; - private static boolean isRegexMeta(char c) { - return regexMetaChars.indexOf(c) != -1; - } - private static boolean isGlobMeta(char c) { - return globMetaChars.indexOf(c) != -1; - } - private static char EOL = 0; //TBD - private static char next(String glob, int i) { - if (i < glob.length()) { - return glob.charAt(i); - } - return EOL; - } - - /* - * Creates a regex pattern from the given glob expression. - * - * @throws PatternSyntaxException - */ - public static String toRegexPattern(String globPattern) { - boolean inGroup = false; - StringBuilder regex = new StringBuilder("^"); - - int i = 0; - while (i < globPattern.length()) { - char c = globPattern.charAt(i++); - switch (c) { - case '\\': - // escape special characters - if (i == globPattern.length()) { - throw new PatternSyntaxException("No character to escape", - globPattern, i - 1); - } - char next = globPattern.charAt(i++); - if (isGlobMeta(next) || isRegexMeta(next)) { - regex.append('\\'); - } - regex.append(next); - break; - case '/': - regex.append(c); - break; - case '[': - // don't match name separator in class - regex.append("[[^/]&&["); - if (next(globPattern, i) == '^') { - // escape the regex negation char if it appears - regex.append("\\^"); - i++; - } else { - // negation - if (next(globPattern, i) == '!') { - regex.append('^'); - i++; - } - // hyphen allowed at start - if (next(globPattern, i) == '-') { - regex.append('-'); - i++; - } - } - boolean hasRangeStart = false; - char last = 0; - while (i < globPattern.length()) { - c = globPattern.charAt(i++); - if (c == ']') { - break; - } - if (c == '/') { - throw new PatternSyntaxException("Explicit 'name separator' in class", - globPattern, i - 1); - } - // TBD: how to specify ']' in a class? - if (c == '\\' || c == '[' || - c == '&' && next(globPattern, i) == '&') { - // escape '\', '[' or "&&" for regex class - regex.append('\\'); - } - regex.append(c); - - if (c == '-') { - if (!hasRangeStart) { - throw new PatternSyntaxException("Invalid range", - globPattern, i - 1); - } - if ((c = next(globPattern, i++)) == EOL || c == ']') { - break; - } - if (c < last) { - throw new PatternSyntaxException("Invalid range", - globPattern, i - 3); - } - regex.append(c); - hasRangeStart = false; - } else { - hasRangeStart = true; - last = c; - } - } - if (c != ']') { - throw new PatternSyntaxException("Missing ']", globPattern, i - 1); - } - regex.append("]]"); - break; - case '{': - if (inGroup) { - throw new PatternSyntaxException("Cannot nest groups", - globPattern, i - 1); - } - regex.append("(?:(?:"); - inGroup = true; - break; - case '}': - if (inGroup) { - regex.append("))"); - inGroup = false; - } else { - regex.append('}'); - } - break; - case ',': - if (inGroup) { - regex.append(")|(?:"); - } else { - regex.append(','); - } - break; - case '*': - if (next(globPattern, i) == '*') { - // crosses directory boundaries - regex.append(".*"); - i++; - } else { - // within directory boundary - regex.append("[^/]*"); - } - break; - case '?': - regex.append("[^/]"); - break; - default: - if (isRegexMeta(c)) { - regex.append('\\'); - } - regex.append(c); - } - } - if (inGroup) { - throw new PatternSyntaxException("Missing '}", globPattern, i - 1); - } - return regex.append('$').toString(); - } -} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/zip/Extensions.kt b/app/src/main/java/app/revanced/manager/backend/utils/zip/Extensions.kt new file mode 100644 index 0000000000..4bc4a76361 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/backend/utils/zip/Extensions.kt @@ -0,0 +1,33 @@ +package app.revanced.manager.backend.utils.zip + +import java.io.DataInput +import java.io.DataOutput +import java.nio.ByteBuffer + +fun UInt.toLittleEndian() = + (((this.toInt() and 0xff000000.toInt()) shr 24) or ((this.toInt() and 0x00ff0000) shr 8) or ((this.toInt() and 0x0000ff00) shl 8) or (this.toInt() shl 24)).toUInt() + +fun UShort.toLittleEndian() = (this.toUInt() shl 16).toLittleEndian().toUShort() + +fun UInt.toBigEndian() = (((this.toInt() and 0xff) shl 24) or ((this.toInt() and 0xff00) shl 8) + or ((this.toInt() and 0x00ff0000) ushr 8) or (this.toInt() ushr 24)).toUInt() + +fun UShort.toBigEndian() = (this.toUInt() shl 16).toBigEndian().toUShort() + +fun ByteBuffer.getUShort() = this.short.toUShort() +fun ByteBuffer.getUInt() = this.int.toUInt() + +fun ByteBuffer.putUShort(ushort: UShort) = this.putShort(ushort.toShort()) +fun ByteBuffer.putUInt(uint: UInt) = this.putInt(uint.toInt()) + +fun DataInput.readUShort() = this.readShort().toUShort() +fun DataInput.readUInt() = this.readInt().toUInt() + +fun DataOutput.writeUShort(ushort: UShort) = this.writeShort(ushort.toInt()) +fun DataOutput.writeUInt(uint: UInt) = this.writeInt(uint.toInt()) + +fun DataInput.readUShortLE() = this.readUShort().toBigEndian() +fun DataInput.readUIntLE() = this.readUInt().toBigEndian() + +fun DataOutput.writeUShortLE(ushort: UShort) = this.writeUShort(ushort.toLittleEndian()) +fun DataOutput.writeUIntLE(uint: UInt) = this.writeUInt(uint.toLittleEndian()) diff --git a/app/src/main/java/app/revanced/manager/backend/utils/zip/ZipFile.kt b/app/src/main/java/app/revanced/manager/backend/utils/zip/ZipFile.kt new file mode 100644 index 0000000000..1e8b8e827f --- /dev/null +++ b/app/src/main/java/app/revanced/manager/backend/utils/zip/ZipFile.kt @@ -0,0 +1,174 @@ +package app.revanced.manager.backend.utils.zip + +import app.revanced.manager.backend.utils.zip.structures.ZipEndRecord +import app.revanced.manager.backend.utils.zip.structures.ZipEntry +import java.io.Closeable +import java.io.File +import java.io.RandomAccessFile +import java.nio.ByteBuffer +import java.nio.channels.FileChannel +import java.util.zip.CRC32 +import java.util.zip.Deflater + +class ZipFile(val file: File) : Closeable { + var entries: MutableList = mutableListOf() + + private val filePointer: RandomAccessFile = RandomAccessFile(file, "rw") + private var CDENeedsRewrite = false + + init { + //if file isn't empty try to load entries + if (file.length() > 0) { + val endRecord = findEndRecord() + + if (endRecord.diskNumber > 0u || endRecord.totalEntries != endRecord.diskEntries) + throw IllegalArgumentException("Multi-file archives are not supported") + + entries = readEntries(endRecord).toMutableList() + } + + //seek back to start for writing + filePointer.seek(0) + } + + private fun findEndRecord(): ZipEndRecord { + //look from end to start since end record is at the end + for (i in filePointer.length() - 1 downTo 0) { + filePointer.seek(i) + //possible beginning of signature + if (filePointer.readByte() == 0x50.toByte()) { + //seek back to get the full int + filePointer.seek(i) + val possibleSignature = filePointer.readUIntLE() + if (possibleSignature == ZipEndRecord.ECD_SIGNATURE) { + filePointer.seek(i) + return ZipEndRecord.fromECD(filePointer) + } + } + } + + throw Exception("Couldn't find end record") + } + + private fun readEntries(endRecord: ZipEndRecord): List { + filePointer.seek(endRecord.centralDirectoryStartOffset.toLong()) + + val numberOfEntries = endRecord.diskEntries.toInt() + + return buildList(numberOfEntries) { + for (i in 1..numberOfEntries) { + add( + ZipEntry.fromCDE(filePointer).also + { + //for some reason the local extra field can be different from the central one + it.readLocalExtra( + filePointer.channel.map( + FileChannel.MapMode.READ_ONLY, + it.localHeaderOffset.toLong() + 28, + 2 + ) + ) + }) + } + } + } + + private fun writeCDE() { + val CDEStart = filePointer.channel.position().toUInt() + + entries.forEach { + filePointer.channel.write(it.toCDE()) + } + + val entriesCount = entries.size.toUShort() + + val endRecord = ZipEndRecord( + 0u, + 0u, + entriesCount, + entriesCount, + filePointer.channel.position().toUInt() - CDEStart, + CDEStart, + "" + ) + + filePointer.channel.write(endRecord.toECD()) + } + + private fun addEntry(entry: ZipEntry, data: ByteBuffer) { + CDENeedsRewrite = true + + entry.localHeaderOffset = filePointer.channel.position().toUInt() + + filePointer.channel.write(entry.toLFH()) + filePointer.channel.write(data) + + entries.add(entry) + } + + fun addEntryCompressData(entry: ZipEntry, data: ByteArray) { + val compressor = Deflater(9, true) + compressor.setInput(data) + compressor.finish() + + val uncompressedSize = data.size + val compressedData = + ByteArray(uncompressedSize) //i'm guessing compression won't make the data bigger + + val compressedDataLength = compressor.deflate(compressedData) + val compressedBuffer = + ByteBuffer.wrap(compressedData.take(compressedDataLength).toByteArray()) + + compressor.end() + + val crc = CRC32() + crc.update(data) + + entry.compression = 8u //deflate compression + entry.uncompressedSize = uncompressedSize.toUInt() + entry.compressedSize = compressedDataLength.toUInt() + entry.crc32 = crc.value.toUInt() + + addEntry(entry, compressedBuffer) + } + + fun addEntryCopyData(entry: ZipEntry, data: ByteBuffer, alignment: Int? = null) { + alignment?.let { alignment -> + //calculate where data would end up + val dataOffset = filePointer.filePointer + entry.LFHSize + + val mod = dataOffset % alignment + + //wrong alignment + if (mod != 0L) { + //add padding at end of extra field + entry.localExtraField = + entry.localExtraField.copyOf((entry.localExtraField.size + (alignment - mod)).toInt()) + } + } + + addEntry(entry, data) + } + + fun getDataForEntry(entry: ZipEntry): ByteBuffer { + return filePointer.channel.map( + FileChannel.MapMode.READ_ONLY, + entry.dataOffset.toLong(), + entry.compressedSize.toLong() + ) + } + + fun copyEntriesFromFile(file: ZipFile) { + for (entry in file.entries) { + if (entries.any { it.fileName == entry.fileName }) continue //don't add duplicates + + val data = file.getDataForEntry(entry) + addEntryCopyData(entry, data) + } + } + + override fun close() { + if (CDENeedsRewrite) writeCDE() + filePointer.close() + } +} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/zip/structures/ZipEndRecord.kt b/app/src/main/java/app/revanced/manager/backend/utils/zip/structures/ZipEndRecord.kt new file mode 100644 index 0000000000..c7f42fdd09 --- /dev/null +++ b/app/src/main/java/app/revanced/manager/backend/utils/zip/structures/ZipEndRecord.kt @@ -0,0 +1,78 @@ +package app.revanced.manager.backend.utils.zip.structures + +import app.revanced.manager.backend.utils.zip.putUInt +import app.revanced.manager.backend.utils.zip.putUShort +import app.revanced.manager.backend.utils.zip.readUIntLE +import app.revanced.manager.backend.utils.zip.readUShortLE +import java.io.DataInput +import java.nio.ByteBuffer +import java.nio.ByteOrder + +data class ZipEndRecord( + val diskNumber: UShort, + val startingDiskNumber: UShort, + val diskEntries: UShort, + val totalEntries: UShort, + val centralDirectorySize: UInt, + val centralDirectoryStartOffset: UInt, + val fileComment: String, +) { + + companion object { + const val ECD_HEADER_SIZE = 22 + const val ECD_SIGNATURE = 0x06054b50u + + fun fromECD(input: DataInput): ZipEndRecord { + val signature = input.readUIntLE() + + if (signature != ECD_SIGNATURE) + throw IllegalArgumentException("Input doesn't start with end record signature") + + val diskNumber = input.readUShortLE() + val startingDiskNumber = input.readUShortLE() + val diskEntries = input.readUShortLE() + val totalEntries = input.readUShortLE() + val centralDirectorySize = input.readUIntLE() + val centralDirectoryStartOffset = input.readUIntLE() + val fileCommentLength = input.readUShortLE() + var fileComment = "" + + if (fileCommentLength > 0u) { + val fileCommentBytes = ByteArray(fileCommentLength.toInt()) + input.readFully(fileCommentBytes) + fileComment = fileCommentBytes.toString(Charsets.UTF_8) + } + + return ZipEndRecord( + diskNumber, + startingDiskNumber, + diskEntries, + totalEntries, + centralDirectorySize, + centralDirectoryStartOffset, + fileComment + ) + } + } + + fun toECD(): ByteBuffer { + val commentBytes = fileComment.toByteArray(Charsets.UTF_8) + + val buffer = ByteBuffer.allocate(ECD_HEADER_SIZE + commentBytes.size) + .also { it.order(ByteOrder.LITTLE_ENDIAN) } + + buffer.putUInt(ECD_SIGNATURE) + buffer.putUShort(diskNumber) + buffer.putUShort(startingDiskNumber) + buffer.putUShort(diskEntries) + buffer.putUShort(totalEntries) + buffer.putUInt(centralDirectorySize) + buffer.putUInt(centralDirectoryStartOffset) + buffer.putUShort(commentBytes.size.toUShort()) + + buffer.put(commentBytes) + + buffer.flip() + return buffer + } +} diff --git a/app/src/main/java/app/revanced/manager/backend/utils/zip/structures/ZipEntry.kt b/app/src/main/java/app/revanced/manager/backend/utils/zip/structures/ZipEntry.kt new file mode 100644 index 0000000000..b07395afee --- /dev/null +++ b/app/src/main/java/app/revanced/manager/backend/utils/zip/structures/ZipEntry.kt @@ -0,0 +1,190 @@ +package app.revanced.manager.backend.utils.zip.structures + +import app.revanced.manager.backend.utils.zip.* +import java.io.DataInput +import java.nio.ByteBuffer +import java.nio.ByteOrder + +data class ZipEntry( + val version: UShort, + val versionNeeded: UShort, + val flags: UShort, + var compression: UShort, + val modificationTime: UShort, + val modificationDate: UShort, + var crc32: UInt, + var compressedSize: UInt, + var uncompressedSize: UInt, + val diskNumber: UShort, + val internalAttributes: UShort, + val externalAttributes: UInt, + var localHeaderOffset: UInt, + val fileName: String, + val extraField: ByteArray, + val fileComment: String, + var localExtraField: ByteArray = ByteArray(0), //separate for alignment +) { + val LFHSize: Int + get() = LFH_HEADER_SIZE + fileName.toByteArray(Charsets.UTF_8).size + localExtraField.size + + val dataOffset: UInt + get() = localHeaderOffset + LFHSize.toUInt() + + companion object { + const val CDE_HEADER_SIZE = 46 + const val CDE_SIGNATURE = 0x02014b50u + + const val LFH_HEADER_SIZE = 30 + const val LFH_SIGNATURE = 0x04034b50u + + fun createWithName(fileName: String): ZipEntry { + return ZipEntry( + 0x1403u, //made by unix, version 20 + 0u, + 0u, + 0u, + 0x0821u, //seems to be static time google uses, no idea + 0x0221u, //same as above + 0u, + 0u, + 0u, + 0u, + 0u, + 0u, + 0u, + fileName, + ByteArray(0), + "" + ) + } + + fun fromCDE(input: DataInput): ZipEntry { + val signature = input.readUIntLE() + + if (signature != CDE_SIGNATURE) + throw IllegalArgumentException("Input doesn't start with central directory entry signature") + + val version = input.readUShortLE() + val versionNeeded = input.readUShortLE() + var flags = input.readUShortLE() + val compression = input.readUShortLE() + val modificationTime = input.readUShortLE() + val modificationDate = input.readUShortLE() + val crc32 = input.readUIntLE() + val compressedSize = input.readUIntLE() + val uncompressedSize = input.readUIntLE() + val fileNameLength = input.readUShortLE() + var fileName = "" + val extraFieldLength = input.readUShortLE() + var extraField = ByteArray(extraFieldLength.toInt()) + val fileCommentLength = input.readUShortLE() + var fileComment = "" + val diskNumber = input.readUShortLE() + val internalAttributes = input.readUShortLE() + val externalAttributes = input.readUIntLE() + val localHeaderOffset = input.readUIntLE() + + val variableFieldsLength = + fileNameLength.toInt() + extraFieldLength.toInt() + fileCommentLength.toInt() + + if (variableFieldsLength > 0) { + val fileNameBytes = ByteArray(fileNameLength.toInt()) + input.readFully(fileNameBytes) + fileName = fileNameBytes.toString(Charsets.UTF_8) + + input.readFully(extraField) + + val fileCommentBytes = ByteArray(fileCommentLength.toInt()) + input.readFully(fileCommentBytes) + fileComment = fileCommentBytes.toString(Charsets.UTF_8) + } + + flags = (flags and 0b1000u.inv() + .toUShort()) //disable data descriptor flag as they are not used + + return ZipEntry( + version, + versionNeeded, + flags, + compression, + modificationTime, + modificationDate, + crc32, + compressedSize, + uncompressedSize, + diskNumber, + internalAttributes, + externalAttributes, + localHeaderOffset, + fileName, + extraField, + fileComment, + ) + } + } + + fun readLocalExtra(buffer: ByteBuffer) { + buffer.order(ByteOrder.LITTLE_ENDIAN) + localExtraField = ByteArray(buffer.getUShort().toInt()) + } + + fun toLFH(): ByteBuffer { + val nameBytes = fileName.toByteArray(Charsets.UTF_8) + + val buffer = ByteBuffer.allocate(LFH_HEADER_SIZE + nameBytes.size + localExtraField.size) + .also { it.order(ByteOrder.LITTLE_ENDIAN) } + + buffer.putUInt(LFH_SIGNATURE) + buffer.putUShort(versionNeeded) + buffer.putUShort(flags) + buffer.putUShort(compression) + buffer.putUShort(modificationTime) + buffer.putUShort(modificationDate) + buffer.putUInt(crc32) + buffer.putUInt(compressedSize) + buffer.putUInt(uncompressedSize) + buffer.putUShort(nameBytes.size.toUShort()) + buffer.putUShort(localExtraField.size.toUShort()) + + buffer.put(nameBytes) + buffer.put(localExtraField) + + buffer.flip() + return buffer + } + + fun toCDE(): ByteBuffer { + val nameBytes = fileName.toByteArray(Charsets.UTF_8) + val commentBytes = fileComment.toByteArray(Charsets.UTF_8) + + val buffer = + ByteBuffer.allocate(CDE_HEADER_SIZE + nameBytes.size + extraField.size + commentBytes.size) + .also { it.order(ByteOrder.LITTLE_ENDIAN) } + + buffer.putUInt(CDE_SIGNATURE) + buffer.putUShort(version) + buffer.putUShort(versionNeeded) + buffer.putUShort(flags) + buffer.putUShort(compression) + buffer.putUShort(modificationTime) + buffer.putUShort(modificationDate) + buffer.putUInt(crc32) + buffer.putUInt(compressedSize) + buffer.putUInt(uncompressedSize) + buffer.putUShort(nameBytes.size.toUShort()) + buffer.putUShort(extraField.size.toUShort()) + buffer.putUShort(commentBytes.size.toUShort()) + buffer.putUShort(diskNumber) + buffer.putUShort(internalAttributes) + buffer.putUInt(externalAttributes) + buffer.putUInt(localHeaderOffset) + + buffer.put(nameBytes) + buffer.put(extraField) + buffer.put(commentBytes) + + buffer.flip() + return buffer + } +} + diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt index 5e4765c8d8..558ad33b59 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt @@ -8,7 +8,6 @@ import android.content.Context import android.content.Intent import android.graphics.drawable.Icon import android.util.Log -import androidx.compose.runtime.NoLiveLiterals import androidx.compose.runtime.mutableStateOf import androidx.core.content.ContextCompat import androidx.datastore.preferences.core.stringPreferencesKey @@ -20,8 +19,9 @@ import app.revanced.manager.R import app.revanced.manager.backend.api.ManagerAPI import app.revanced.manager.backend.utils.Aapt import app.revanced.manager.backend.utils.aligning.ZipAligner -import app.revanced.manager.backend.utils.filesystem.ZipFileSystemUtils import app.revanced.manager.backend.utils.signing.Signer +import app.revanced.manager.backend.utils.zip.ZipFile +import app.revanced.manager.backend.utils.zip.structures.ZipEntry import app.revanced.manager.settings import app.revanced.manager.ui.Resource import app.revanced.patcher.Patcher @@ -156,10 +156,17 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : Log.d(tag, "Saving file") val result = patcher.save() - ZipFileSystemUtils(patchedFile).use { fs -> - result.dexFiles.forEach { fs.write(it.name, it.dexFileInputStream.readBytes()) } - fs.copyOver(result.resourceFile!!, result.doNotCompress!!) - fs.copyOver(inputFile, listOf()) + + ZipFile(patchedFile).use { file -> + result.dexFiles.forEach { + file.addEntryCompressData( + ZipEntry.createWithName(it.name), + it.dexFileInputStream.readBytes() + ) + } + + file.copyEntriesFromFile(ZipFile(result.resourceFile!!)) + file.copyEntriesFromFile(ZipFile(inputFile)) } Log.d(tag, "Aligning apk") From 82360237a58e3a0d6f11164a695dbfff31a7a25b Mon Sep 17 00:00:00 2001 From: danthe1st Date: Mon, 25 Jul 2022 10:37:55 +0200 Subject: [PATCH 119/132] fix: make PatcherWorker not restart --- .../screens/mainsubscreens/PatcherWorker.kt | 29 +++++++++++++------ 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt index 558ad33b59..5bc89e15c5 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt @@ -41,6 +41,12 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : val tag = "PatcherWorker" override suspend fun doWork(): Result { + if(runAttemptCount>0){ + return Result.failure(androidx.work.Data.Builder() + .putString("error","Android requested retrying but retrying is disabled") + .build() + )//don't retry + } val selectedPatches = inputData.getStringArray("selectedPatches") ?: throw IllegalArgumentException("selectedPatches is missing") val patchBundleFile = inputData.getString("patchBundleFile") @@ -72,9 +78,17 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : .build() setForeground(ForegroundInfo(1, notification)) - - runPatcher(selectedPatches.toList(), patchBundleFile) - return Result.success() + return try { + runPatcher(selectedPatches.toList(), patchBundleFile) + Result.success() + }catch (e: Exception){ + Log.e(tag,"Error while patching", e) + Result.failure( + androidx.work.Data.Builder() + .putString("error","Error while patching: ${e.message ?: e::class.simpleName}") + .build() + ) + } } private suspend fun runPatcher( @@ -174,13 +188,10 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : Log.d(tag, "Signing apk") Signer("ReVanced", "s3cur3p@ssw0rd").signApk(alignedFile, outputFile) Log.i(tag, "Successfully patched into $outputFile") - } catch (e: Exception) { - Log.e(tag, "Error while patching", e) + }finally { + Log.d(tag, "Deleting workdir") + //workdir.deleteRecursively() } - - Log.d(tag, "Deleting workdir") - //workdir.deleteRecursively() - return false } From 1a4dcadedaa044065d03b022b4993c6c04871e46 Mon Sep 17 00:00:00 2001 From: danthe1st Date: Mon, 25 Jul 2022 10:52:21 +0200 Subject: [PATCH 120/132] fix: Stop previous patching instead of patching multiple times in parallel --- .../ui/screens/mainsubscreens/PatcherSubscreen.kt | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt index 0e29837bbf..10fbfab690 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt @@ -24,10 +24,7 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import androidx.work.OneTimeWorkRequest -import androidx.work.OneTimeWorkRequestBuilder -import androidx.work.WorkManager -import androidx.work.WorkerParameters +import androidx.work.* import app.revanced.manager.Global import app.revanced.manager.R import app.revanced.manager.backend.api.ManagerAPI @@ -233,7 +230,9 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { fun startPatcher() { WorkManager .getInstance(app) - .enqueue( + .enqueueUniqueWork( + "patching", + ExistingWorkPolicy.REPLACE, OneTimeWorkRequest.Builder(PatcherWorker::class.java) .setInputData( androidx.work.Data.Builder() From f9eb177f2342a328bbebf9575f4dbc62b689b9a3 Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Mon, 25 Jul 2022 19:04:14 +0530 Subject: [PATCH 121/132] feat: SearchBar in AppSelectorScreen. --- .../manager/ui/screens/AppSelectorScreen.kt | 110 ++++++++++++++---- 1 file changed, 89 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt index 49e847e182..ef7ea372da 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt @@ -8,15 +8,26 @@ import android.graphics.drawable.Drawable import android.util.Log import androidx.activity.ComponentActivity import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.ListItem +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material.icons.filled.Search +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController @@ -29,7 +40,7 @@ import com.ramcosta.composedestinations.annotation.RootNavGraph private const val tag = "AppSelector" @OptIn(ExperimentalMaterialApi::class) -@SuppressLint("QueryPermissionsNeeded") +@SuppressLint("QueryPermissionsNeeded", "UnrememberedMutableState") @Destination @RootNavGraph @Composable @@ -39,33 +50,90 @@ fun AppSelectorScreen( pvm: PatcherViewModel = viewModel(LocalContext.current as ComponentActivity) ) { val installedApps by vm.installedApps + var query by mutableStateOf("") when (val installedApps = installedApps) { is Resource.Success -> { val apps = installedApps.data LazyColumn { - items(count = apps.size) { - val app = apps[it] - val label = vm.applicationLabel(app) - val packageName = app.packageName + item { + OutlinedTextField( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp), + shape = RoundedCornerShape(12.dp), + value = query, + onValueChange = { + newValue -> query = newValue + }, + leadingIcon = { + Icon(Icons.Default.Search, "Search") + }, + trailingIcon = { + if (query.isNotEmpty()) { + IconButton(onClick = { + query = "" + }) { + Icon(Icons.Default.Clear, "Clear") + } + } + }, + ) + } - val same = packageName == label - ListItem(modifier = Modifier.clickable { - pvm.setSelectedAppPackage(app.packageName) - navigator.navigateUp() - }, icon = { - AppIcon(vm.loadIcon(app), packageName) - }, text = { - if (same) { - Text(packageName) - } else { - Text(label) - } - }, secondaryText = { - if (!same) { - Text(packageName) + // show all apps if there is no query + if (query.isEmpty() || query.isBlank()) { + items(count = apps.size) { + val app = apps[it] + val label = vm.applicationLabel(app) + val packageName = app.packageName + + val same = packageName == label + ListItem(modifier = Modifier.clickable { + pvm.setSelectedAppPackage(app.packageName) + navigator.navigateUp() + }, icon = { + AppIcon(vm.loadIcon(app), packageName) + }, text = { + if (same) { + Text(packageName) + } else { + Text(label) + } + }, secondaryText = { + if (!same) { + Text(packageName) + } + }) + } + } + // filter apps to match query + else { + items(count = apps.size) { + val app = apps[it] + val label = vm.applicationLabel(app) + val packageName = app.packageName + + val same = packageName == label + if (label.contains(query, true)) { + ListItem(modifier = Modifier.clickable { + pvm.setSelectedAppPackage(app.packageName) + navigator.navigateUp() + }, icon = { + AppIcon(vm.loadIcon(app), packageName) + }, text = { + if (same) { + Text(packageName) + } else { + Text(label) + } + }, secondaryText = { + if (!same) { + Text(packageName) + } + }) } - }) + } } } } From 6ac13354e3ceae403291e68ea6ddc0185f496e8f Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Mon, 25 Jul 2022 18:34:41 +0200 Subject: [PATCH 122/132] refactor: keep existing work instead of replacing we should definitely not replace existing work *like this*. we should instead add a cancel button so we have control over exiting, instead of Android forcing it up our ass. --- .../manager/ui/screens/mainsubscreens/PatcherSubscreen.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt index 10fbfab690..ea1cba22b5 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt @@ -1,7 +1,6 @@ package app.revanced.manager.ui.screens.mainsubscreens import android.app.Application -import android.content.Intent import android.content.pm.PackageManager import android.util.Log import androidx.activity.ComponentActivity @@ -232,7 +231,7 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { .getInstance(app) .enqueueUniqueWork( "patching", - ExistingWorkPolicy.REPLACE, + ExistingWorkPolicy.KEEP, OneTimeWorkRequest.Builder(PatcherWorker::class.java) .setInputData( androidx.work.Data.Builder() From 8eecb46d9685feb8dff18d89beca7424991ec377 Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Mon, 25 Jul 2022 18:38:41 +0200 Subject: [PATCH 123/132] refactor: cleanup --- .../main/java/app/revanced/manager/Global.kt | 2 +- .../revanced/manager/backend/api/GitHubAPI.kt | 5 +- .../manager/backend/api/ManagerAPI.kt | 17 +++-- .../manager/backend/utils/signing/Signer.kt | 3 +- .../revanced/manager/data/PatchDatabase.kt | 2 +- .../revanced/manager/ui/components/AppBar.kt | 6 +- .../revanced/manager/ui/components/AppList.kt | 8 -- .../manager/ui/components/ContributorsCard.kt | 17 +++-- .../manager/ui/components/DialogAppBar.kt | 2 +- .../revanced/manager/ui/components/Dialogs.kt | 11 ++- .../manager/ui/components/IconHeader.kt | 4 +- .../ui/models/ContributorsViewModel.kt | 19 +++-- .../manager/ui/models/DashboardViewModel.kt | 10 +-- .../manager/ui/screens/AboutScreen.kt | 13 +++- .../manager/ui/screens/AppSelectorScreen.kt | 4 +- .../manager/ui/screens/ContributorsScreen.kt | 7 +- .../revanced/manager/ui/screens/MainScreen.kt | 2 +- .../ui/screens/MainScreenDestinations.kt | 2 +- .../ui/screens/PatchesSelectorScreen.kt | 25 +++---- .../manager/ui/screens/SettingsScreen.kt | 16 +--- .../mainsubscreens/PatcherSubscreen.kt | 18 +++-- .../screens/mainsubscreens/PatcherWorker.kt | 75 ++++++++----------- 22 files changed, 140 insertions(+), 128 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/Global.kt b/app/src/main/java/app/revanced/manager/Global.kt index 8e75a8a06a..0846fb4787 100644 --- a/app/src/main/java/app/revanced/manager/Global.kt +++ b/app/src/main/java/app/revanced/manager/Global.kt @@ -13,7 +13,7 @@ class Global { R.drawable.ic_telegram to "https://t.me/app_revanced", R.drawable.ic_youtube to "https://youtube.com/channel/UCLktAUh5Gza9zAJBStwxNdw", - ) + ) private const val ghOrg = "revanced" const val ghPatches = "$ghOrg/revanced-patches" diff --git a/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt b/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt index 13af96cffd..8b4a25f04e 100644 --- a/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt +++ b/app/src/main/java/app/revanced/manager/backend/api/GitHubAPI.kt @@ -3,8 +3,8 @@ package app.revanced.manager.backend.api import android.util.Log import io.ktor.client.call.* import io.ktor.client.request.* -import kotlinx.serialization.Serializable import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable object GitHubAPI { private const val tag = "GitHubAPI" @@ -65,12 +65,13 @@ object GitHubAPI { } object Contributors { - suspend fun contributors(org: String, repo: String) : List { + suspend fun contributors(org: String, repo: String): List { Log.d(tag, "Fetching contributors for repo ($repo)") val res: List = client.get("$baseUrl/$org/$repo/contributors") { }.body() return res } + @Serializable class Contributor( @SerialName("login") val login: String, diff --git a/app/src/main/java/app/revanced/manager/backend/api/ManagerAPI.kt b/app/src/main/java/app/revanced/manager/backend/api/ManagerAPI.kt index 5f8c4535ec..d85a740b6f 100644 --- a/app/src/main/java/app/revanced/manager/backend/api/ManagerAPI.kt +++ b/app/src/main/java/app/revanced/manager/backend/api/ManagerAPI.kt @@ -1,7 +1,6 @@ package app.revanced.manager.backend.api import android.util.Log -import app.revanced.manager.Global import io.ktor.client.* import io.ktor.client.engine.android.* import io.ktor.client.plugins.* @@ -28,8 +27,11 @@ val client = HttpClient(Android) { object ManagerAPI { private const val tag = "ManagerAPI" - suspend fun downloadPatches(workdir: File, asset: String) = downloadAsset(workdir, findAsset(asset)) - suspend fun downloadIntegrations(workdir: File, asset: String) = downloadAsset(workdir, findAsset(asset)) + suspend fun downloadPatches(workdir: File, asset: String) = + downloadAsset(workdir, findAsset(asset)) + + suspend fun downloadIntegrations(workdir: File, asset: String) = + downloadAsset(workdir, findAsset(asset)) private suspend fun findAsset(repo: String): PatchesAsset { val release = GitHubAPI.Releases.latestRelease(repo) @@ -37,7 +39,10 @@ object ManagerAPI { return PatchesAsset(release, asset) } - private suspend fun downloadAsset(workdir: File, patchesAsset: PatchesAsset): Pair { + private suspend fun downloadAsset( + workdir: File, + patchesAsset: PatchesAsset + ): Pair { val (release, asset) = patchesAsset val out = workdir.resolve("${release.tagName}-${asset.name}") if (out.exists()) { @@ -59,7 +64,9 @@ object ManagerAPI { ) private fun List.findAsset() = find { asset -> - (asset.name.contains(".apk") || asset.name.contains(".dex")) && !asset.name.contains("-sources") && !asset.name.contains("-javadoc") + (asset.name.contains(".apk") || asset.name.contains(".dex")) && !asset.name.contains("-sources") && !asset.name.contains( + "-javadoc" + ) } } diff --git a/app/src/main/java/app/revanced/manager/backend/utils/signing/Signer.kt b/app/src/main/java/app/revanced/manager/backend/utils/signing/Signer.kt index e9c7058e32..5f7d181ef1 100644 --- a/app/src/main/java/app/revanced/manager/backend/utils/signing/Signer.kt +++ b/app/src/main/java/app/revanced/manager/backend/utils/signing/Signer.kt @@ -33,7 +33,8 @@ internal class Signer( gen.initialize(2048) val pair = gen.generateKeyPair() var serialNumber: BigInteger - do serialNumber = BigInteger.valueOf(SecureRandom().nextLong()) while (serialNumber < BigInteger.ZERO) + do serialNumber = + BigInteger.valueOf(SecureRandom().nextLong()) while (serialNumber < BigInteger.ZERO) val x500Name = X500Name("CN=$cn") val builder = X509v3CertificateBuilder( x500Name, diff --git a/app/src/main/java/app/revanced/manager/data/PatchDatabase.kt b/app/src/main/java/app/revanced/manager/data/PatchDatabase.kt index e6ab328c91..206398e6e5 100644 --- a/app/src/main/java/app/revanced/manager/data/PatchDatabase.kt +++ b/app/src/main/java/app/revanced/manager/data/PatchDatabase.kt @@ -7,6 +7,6 @@ import androidx.room.RoomDatabase entities = [PatchEntity::class], version = 1 ) -abstract class PatchDatabase: RoomDatabase() { +abstract class PatchDatabase : RoomDatabase() { abstract val dao: PatchesDao } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/components/AppBar.kt b/app/src/main/java/app/revanced/manager/ui/components/AppBar.kt index 343bfce353..0979cdb7a3 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/AppBar.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/AppBar.kt @@ -8,7 +8,11 @@ import androidx.compose.ui.tooling.preview.Preview @Composable -fun AppBar(title: @Composable () -> Unit, actions: @Composable RowScope.() -> Unit = {}, navigationIcon: @Composable () -> Unit = {}) { +fun AppBar( + title: @Composable () -> Unit, + actions: @Composable RowScope.() -> Unit = {}, + navigationIcon: @Composable () -> Unit = {} +) { SmallTopAppBar( title = title, navigationIcon = navigationIcon, diff --git a/app/src/main/java/app/revanced/manager/ui/components/AppList.kt b/app/src/main/java/app/revanced/manager/ui/components/AppList.kt index 95047e9ced..9191cb4863 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/AppList.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/AppList.kt @@ -1,16 +1,8 @@ package app.revanced.manager.ui.components import android.content.pm.ApplicationInfo -import androidx.compose.foundation.clickable -import androidx.compose.foundation.lazy.LazyColumn -import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.ListItem -import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext -import app.revanced.manager.ui.components.placeholders.applist.AppIcon @OptIn(ExperimentalMaterialApi::class) @Composable diff --git a/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt b/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt index e5b87f7f53..72f8ffb7f5 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/ContributorsCard.kt @@ -1,19 +1,19 @@ package app.revanced.manager.ui.components -import android.util.Log import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.shape.CircleShape -import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable import androidx.compose.runtime.snapshots.SnapshotStateList import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight @@ -34,11 +34,16 @@ fun ContributorsCard( data: SnapshotStateList, ) { Column( - Modifier.padding(horizontal = 8.dp, vertical = 8.dp).fillMaxWidth() + Modifier + .padding(horizontal = 8.dp, vertical = 8.dp) + .fillMaxWidth() ) { Text( text = title, - modifier = Modifier.fillMaxWidth().align(Alignment.CenterHorizontally).padding(8.dp), + modifier = Modifier + .fillMaxWidth() + .align(Alignment.CenterHorizontally) + .padding(8.dp), fontSize = MaterialTheme.typography.titleLarge.fontSize, fontWeight = FontWeight.Bold, maxLines = 1, diff --git a/app/src/main/java/app/revanced/manager/ui/components/DialogAppBar.kt b/app/src/main/java/app/revanced/manager/ui/components/DialogAppBar.kt index 332230ef14..56283b8449 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/DialogAppBar.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/DialogAppBar.kt @@ -12,7 +12,7 @@ import androidx.compose.ui.tooling.preview.Preview @Composable fun DialogAppBar(title: String, onClick: () -> Unit) { SmallTopAppBar( - title = {Text(title) }, + title = { Text(title) }, navigationIcon = { IconButton(onClick = onClick) { androidx.compose.material3.Icon( diff --git a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt index 4e4fdc0537..d6c741657d 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/Dialogs.kt @@ -64,16 +64,21 @@ fun HelpDialog() { @Composable fun PatchCompatibilityDialog( patchClass: PatchClass, - onClose: () -> Unit) { + onClose: () -> Unit +) { val patch = patchClass.patch AlertDialog( onDismissRequest = onClose, shape = RoundedCornerShape(12.dp), title = { - Text(stringResource(id = R.string.compatible_versions)) + Text(stringResource(id = R.string.compatible_versions)) }, text = { - patch.compatiblePackages!!.forEach { p: Package -> Text(p.versions.reversed().joinToString(", ")) } + patch.compatiblePackages!!.forEach { p: Package -> + Text( + p.versions.reversed().joinToString(", ") + ) + } }, confirmButton = { TextButton(onClick = onClose) { diff --git a/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt b/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt index 60e68a099f..52e41f4f72 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt @@ -16,8 +16,8 @@ import androidx.compose.ui.unit.dp import app.revanced.manager.R @Composable -fun IconHeader(){ - Box() { +fun IconHeader() { + Box { Icon( painterResource(id = R.drawable.ic_revanced), contentDescription = "Header Icon", diff --git a/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt b/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt index 46d9d29424..a12e3368f7 100644 --- a/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/models/ContributorsViewModel.kt @@ -18,34 +18,39 @@ class ContributorsViewModel : ViewModel() { val managerContributorsList = mutableStateListOf() val integrationsContributorsList = mutableStateListOf() - suspend fun loadContributors() { - withContext(Dispatchers.IO){ + suspend fun loadContributors() { + withContext(Dispatchers.IO) { viewModelScope.launch { - val cliContributors = GitHubAPI.Contributors.contributors("revanced","revanced-cli") + val cliContributors = + GitHubAPI.Contributors.contributors("revanced", "revanced-cli") cliContributors.sortedByDescending { it.login } cliContributorsList.addAll(cliContributors) - val patcherContributors = GitHubAPI.Contributors.contributors("revanced","revanced-patcher") + val patcherContributors = + GitHubAPI.Contributors.contributors("revanced", "revanced-patcher") patcherContributors.sortedByDescending { it.login } patcherContributorsList.addAll(patcherContributors) - val patchesContributors = GitHubAPI.Contributors.contributors("revanced","revanced-patches") + val patchesContributors = + GitHubAPI.Contributors.contributors("revanced", "revanced-patches") patchesContributors.sortedByDescending { it.login } patchesContributorsList.addAll(patchesContributors) - val managerContributors = GitHubAPI.Contributors.contributors("Aunali321","revanced-manager") + val managerContributors = + GitHubAPI.Contributors.contributors("Aunali321", "revanced-manager") managerContributors.sortedByDescending { it.login } managerContributorsList.addAll(managerContributors) - val integrationsContributors = GitHubAPI.Contributors.contributors("revanced","revanced-integrations") + val integrationsContributors = + GitHubAPI.Contributors.contributors("revanced", "revanced-integrations") integrationsContributors.sortedByDescending { it.login } diff --git a/app/src/main/java/app/revanced/manager/ui/models/DashboardViewModel.kt b/app/src/main/java/app/revanced/manager/ui/models/DashboardViewModel.kt index 95f7ebf13b..ce4313277b 100644 --- a/app/src/main/java/app/revanced/manager/ui/models/DashboardViewModel.kt +++ b/app/src/main/java/app/revanced/manager/ui/models/DashboardViewModel.kt @@ -38,11 +38,11 @@ class DashboardViewModel : ViewModel() { } catch (e: Exception) { Log.e(tag, "failed to fetch latest patcher commit", e) } - try { - _latestManagerCommit = GitHubAPI.Commits.latestCommit(Global.ghManager, "HEAD") - } catch (e: Exception) { - Log.e(tag, "failed to fetch latest manager commit", e) - } + try { + _latestManagerCommit = GitHubAPI.Commits.latestCommit(Global.ghManager, "HEAD") + } catch (e: Exception) { + Log.e(tag, "failed to fetch latest manager commit", e) + } } } diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index e9d21c897b..48f4556e13 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -16,7 +16,10 @@ import app.revanced.manager.BuildConfig import app.revanced.manager.Global.Companion.socialLinks import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R -import app.revanced.manager.ui.components.* +import app.revanced.manager.ui.components.DebugInfo +import app.revanced.manager.ui.components.IconHeader +import app.revanced.manager.ui.components.PreferenceRow +import app.revanced.manager.ui.components.copyToClipboard import app.revanced.manager.ui.screens.destinations.ContributorsScreenDestination import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph @@ -27,7 +30,7 @@ import com.ramcosta.composedestinations.annotation.RootNavGraph fun AboutScreen( navigator: NavController, ) { - Column(Modifier.padding(8.dp,8.dp,8.dp,20.dp)) { + Column(Modifier.padding(8.dp, 8.dp, 8.dp, 20.dp)) { IconHeader() var currentUriHandler = LocalUriHandler.current @@ -61,7 +64,11 @@ fun AboutScreen( Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.Center) { for ((social_ic, uri) in socialLinks.entries) { IconButton(onClick = { currentUriHandler.openUri(uri) }) { - Icon(painter = painterResource(social_ic), contentDescription = "Links", tint = MaterialTheme.colorScheme.primary) + Icon( + painter = painterResource(social_ic), + contentDescription = "Links", + tint = MaterialTheme.colorScheme.primary + ) } } } diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt index ef7ea372da..98a0fd226b 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt @@ -63,8 +63,8 @@ fun AppSelectorScreen( .padding(8.dp), shape = RoundedCornerShape(12.dp), value = query, - onValueChange = { - newValue -> query = newValue + onValueChange = { newValue -> + query = newValue }, leadingIcon = { Icon(Icons.Default.Search, "Search") diff --git a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt index c25460737b..769b4d7d09 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/ContributorsScreen.kt @@ -3,10 +3,12 @@ package app.revanced.manager.ui.screens import androidx.compose.foundation.layout.* import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.* +import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource @@ -15,7 +17,6 @@ import androidx.lifecycle.viewmodel.compose.viewModel import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R import app.revanced.manager.ui.components.ContributorsCard -import app.revanced.manager.ui.components.IconHeader import app.revanced.manager.ui.models.ContributorsViewModel import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index 66e97a06e2..ce1bf70e97 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -61,7 +61,7 @@ fun MainScreen() { } SettingsScreenDestination -> { AppBar( - title = { Text(text = "Settings") }, + title = { Text(text = "Settings") }, navigationIcon = { IconButton(onClick = { navController.navigateUp() }) { androidx.compose.material3.Icon( diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreenDestinations.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreenDestinations.kt index ddad974058..77d95a67ca 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreenDestinations.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreenDestinations.kt @@ -3,8 +3,8 @@ package app.revanced.manager.ui.screens import androidx.annotation.StringRes import app.revanced.manager.R import app.revanced.manager.ui.screens.destinations.DashboardSubscreenDestination -import app.revanced.manager.ui.screens.destinations.PatcherSubscreenDestination import app.revanced.manager.ui.screens.destinations.MoreSubscreenDestination +import app.revanced.manager.ui.screens.destinations.PatcherSubscreenDestination import com.ramcosta.composedestinations.spec.DirectionDestinationSpec enum class MainScreenDestinations( diff --git a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt index 3d541fd37d..e644ab4720 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/PatchesSelectorScreen.kt @@ -2,28 +2,22 @@ package app.revanced.manager.ui.screens import android.annotation.SuppressLint import androidx.activity.ComponentActivity -import androidx.compose.animation.animateContentSize -import androidx.compose.animation.core.LinearOutSlowInEasing -import androidx.compose.animation.core.animateFloatAsState -import androidx.compose.animation.core.tween import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.ContentAlpha import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.* +import androidx.compose.material.icons.filled.Check +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.filled.Warning import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha -import androidx.compose.ui.draw.rotate import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.TextLayoutResult import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel @@ -83,8 +77,8 @@ fun PatchesSelectorScreen( .padding(8.dp), shape = RoundedCornerShape(12.dp), value = query, - onValueChange = { - newValue -> query = newValue + onValueChange = { newValue -> + query = newValue }, leadingIcon = { Icon(Icons.Default.Search, "Search") @@ -101,7 +95,7 @@ fun PatchesSelectorScreen( ) } } - LazyColumn { + LazyColumn { if (query.isEmpty() || query.isBlank()) { items(count = patches.size) { @@ -198,7 +192,10 @@ fun PatchSelectable(patchClass: PatchClass, isSelected: Boolean, onSelected: () Column { Row { if (showDialog) { - PatchCompatibilityDialog(onClose = { showDialog = false }, patchClass = patchClass) + PatchCompatibilityDialog( + onClose = { showDialog = false }, + patchClass = patchClass + ) } InputChip( selected = false, diff --git a/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt index f8ba592bee..6e9d3c7de2 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/SettingsScreen.kt @@ -1,23 +1,15 @@ package app.revanced.manager.ui.screens -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Switch -import androidx.compose.material3.Text -import androidx.compose.runtime.* -import androidx.compose.ui.Alignment +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import androidx.compose.ui.ExperimentalComposeUiApi -import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.unit.dp import androidx.datastore.preferences.core.stringPreferencesKey import app.revanced.manager.Global import app.revanced.manager.settings import com.jamal.composeprefs3.ui.PrefsScreen -import com.jamal.composeprefs3.ui.prefs.CheckBoxPref import com.jamal.composeprefs3.ui.prefs.EditTextPref import com.jamal.composeprefs3.ui.prefs.SwitchPref import com.ramcosta.composedestinations.annotation.Destination diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt index ea1cba22b5..73e1806960 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherSubscreen.kt @@ -23,7 +23,9 @@ import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController -import androidx.work.* +import androidx.work.ExistingWorkPolicy +import androidx.work.OneTimeWorkRequest +import androidx.work.WorkManager import app.revanced.manager.Global import app.revanced.manager.R import app.revanced.manager.backend.api.ManagerAPI @@ -167,7 +169,6 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { } - private fun getSelectedPackageInfo() = if (selectedAppPackage.value.isPresent) app.packageManager.getPackageInfo( @@ -197,7 +198,12 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { private suspend fun downloadDefaultPatchBundle(workdir: File): File { return try { - val (_, out) = ManagerAPI.downloadPatches(workdir, this.app.baseContext.settings.data.map { pref -> pref.get(stringPreferencesKey("patches")) ?: Global.ghPatches }.first()) + val (_, out) = ManagerAPI.downloadPatches( + workdir, + this.app.baseContext.settings.data.map { pref -> + pref.get(stringPreferencesKey("patches")) ?: Global.ghPatches + }.first() + ) out } catch (e: Exception) { throw Exception("Failed to download default patch bundle", e) @@ -207,7 +213,7 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { private fun loadPatches() = viewModelScope.launch { try { val file = downloadDefaultPatchBundle(bundleCacheDir) - patchBundleFile=file.absolutePath + patchBundleFile = file.absolutePath loadPatches0(file.absolutePath) } catch (e: Exception) { Log.e(tag, "An error occurred while loading patches", e) @@ -235,8 +241,8 @@ class PatcherViewModel(val app: Application) : AndroidViewModel(app) { OneTimeWorkRequest.Builder(PatcherWorker::class.java) .setInputData( androidx.work.Data.Builder() - .putStringArray("selectedPatches",selectedPatches.toTypedArray()) - .putString("patchBundleFile",patchBundleFile) + .putStringArray("selectedPatches", selectedPatches.toTypedArray()) + .putString("patchBundleFile", patchBundleFile) .build() ) .build() diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt index 5bc89e15c5..c80448cf80 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt @@ -41,11 +41,12 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : val tag = "PatcherWorker" override suspend fun doWork(): Result { - if(runAttemptCount>0){ - return Result.failure(androidx.work.Data.Builder() - .putString("error","Android requested retrying but retrying is disabled") - .build() - )//don't retry + if (runAttemptCount > 0) { + return Result.failure( + androidx.work.Data.Builder() + .putString("error", "Android requested retrying but retrying is disabled") + .build() + ) // don't retry } val selectedPatches = inputData.getStringArray("selectedPatches") ?: throw IllegalArgumentException("selectedPatches is missing") @@ -53,19 +54,12 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : ?: throw IllegalArgumentException("patchBundleFile is missing") val notificationIntent = Intent(applicationContext, PatcherWorker::class.java) - val pendingIntent: PendingIntent = - PendingIntent.getActivity( - applicationContext, - 0, - notificationIntent, - PendingIntent.FLAG_IMMUTABLE - ) - val channel = - NotificationChannel( - "revanced-patcher-patching", - "Patching", - NotificationManager.IMPORTANCE_LOW - ) + val pendingIntent: PendingIntent = PendingIntent.getActivity( + applicationContext, 0, notificationIntent, PendingIntent.FLAG_IMMUTABLE + ) + val channel = NotificationChannel( + "revanced-patcher-patching", "Patching", NotificationManager.IMPORTANCE_LOW + ) val notificationManager = ContextCompat.getSystemService(applicationContext, NotificationManager::class.java) notificationManager!!.createNotificationChannel(channel) @@ -74,26 +68,24 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : .setContentText(applicationContext.getText(R.string.patcher_notification_message)) .setLargeIcon(Icon.createWithResource(applicationContext, R.drawable.manager)) .setSmallIcon(Icon.createWithResource(applicationContext, R.drawable.manager)) - .setContentIntent(pendingIntent) - .build() + .setContentIntent(pendingIntent).build() setForeground(ForegroundInfo(1, notification)) return try { runPatcher(selectedPatches.toList(), patchBundleFile) Result.success() - }catch (e: Exception){ - Log.e(tag,"Error while patching", e) + } catch (e: Exception) { + Log.e(tag, "Error while patching", e) Result.failure( androidx.work.Data.Builder() - .putString("error","Error while patching: ${e.message ?: e::class.simpleName}") + .putString("error", "Error while patching: ${e.message ?: e::class.simpleName}") .build() ) } } private suspend fun runPatcher( - selectedPatches: List, - patchBundleFile: String + selectedPatches: List, patchBundleFile: String ): Boolean { val aaptPath = Aapt.binary(applicationContext).absolutePath val frameworkPath = @@ -116,19 +108,19 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : val cacheDirectory = workdir.resolve("cache") try { -// Log.d(tag, "Copying base.apk from ${info.packageName}") -// withContext(Dispatchers.IO) { -// Files.copy( -// File(info.publicSourceDir).toPath(), -// inputFile.toPath(), -// StandardCopyOption.REPLACE_EXISTING -// ) -// } + // TODO: Add back when split support is added to the Patcher. + // Log.d(tag, "Copying base.apk from ${info.packageName}") + // withContext(Dispatchers.IO) { + // Files.copy( + // File(info.publicSourceDir).toPath(), + // inputFile.toPath(), + // StandardCopyOption.REPLACE_EXISTING + // ) + // } Log.d(tag, "Creating patcher") val patcher = Patcher( - PatcherOptions( - inputFile, + PatcherOptions(inputFile, cacheDirectory.absolutePath, patchResources = true, aaptPath = aaptPath, @@ -149,8 +141,7 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : override fun trace(msg: String) { Log.v(tag, msg) } - } - ) + }) ) Log.d(tag, "Merging integrations")//TODO add again @@ -174,8 +165,7 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : ZipFile(patchedFile).use { file -> result.dexFiles.forEach { file.addEntryCompressData( - ZipEntry.createWithName(it.name), - it.dexFileInputStream.readBytes() + ZipEntry.createWithName(it.name), it.dexFileInputStream.readBytes() ) } @@ -188,9 +178,9 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : Log.d(tag, "Signing apk") Signer("ReVanced", "s3cur3p@ssw0rd").signApk(alignedFile, outputFile) Log.i(tag, "Successfully patched into $outputFile") - }finally { + } finally { Log.d(tag, "Deleting workdir") - //workdir.deleteRecursively() + // workdir.deleteRecursively() } return false } @@ -216,8 +206,7 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : private suspend fun downloadIntegrations(workdir: File): File { return try { val (_, out) = ManagerAPI.downloadIntegrations( - workdir, - applicationContext.settings.data.map { pref -> + workdir, applicationContext.settings.data.map { pref -> pref.get(stringPreferencesKey("integrations")) ?: Global.ghIntegrations }.first() ) From 9134676d50d4a5d8ae425baf9c2aa1ef39425fa2 Mon Sep 17 00:00:00 2001 From: bogadana <30848157+bogadana@users.noreply.github.com> Date: Mon, 25 Jul 2022 18:40:16 +0200 Subject: [PATCH 124/132] feat: remove seperate zipalign step (#9) --- .../backend/utils/aligning/ZipAligner.kt | 24 +++---------------- .../manager/backend/utils/zip/ZipFile.kt | 22 +++++++++-------- .../screens/mainsubscreens/PatcherWorker.kt | 9 +++---- 3 files changed, 18 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/backend/utils/aligning/ZipAligner.kt b/app/src/main/java/app/revanced/manager/backend/utils/aligning/ZipAligner.kt index 0d9fe06615..27904cbaac 100644 --- a/app/src/main/java/app/revanced/manager/backend/utils/aligning/ZipAligner.kt +++ b/app/src/main/java/app/revanced/manager/backend/utils/aligning/ZipAligner.kt @@ -1,29 +1,11 @@ package app.revanced.manager.backend.utils.aligning -import app.revanced.manager.backend.utils.zip.ZipFile -import java.io.File +import app.revanced.manager.backend.utils.zip.structures.ZipEntry internal object ZipAligner { private const val DEFAULT_ALIGNMENT = 4 private const val LIBRARY_ALIGNMENT = 4096 - fun align(input: File, output: File) { - val inputZip = ZipFile(input) - val outputZip = ZipFile(output) - - for (entry in inputZip.entries) { - val data = inputZip.getDataForEntry(entry) - - if (entry.compression == 0.toUShort()) { - val alignment = - if (entry.fileName.endsWith(".so")) LIBRARY_ALIGNMENT else DEFAULT_ALIGNMENT - - outputZip.addEntryCopyData(entry, data, alignment) - } else { - outputZip.addEntryCopyData(entry, data) - } - } - - outputZip.close() - } + fun getEntryAlignment(entry: ZipEntry): Int? = + if (entry.compression.toUInt() != 0u) null else if (entry.fileName.endsWith(".so")) LIBRARY_ALIGNMENT else DEFAULT_ALIGNMENT } diff --git a/app/src/main/java/app/revanced/manager/backend/utils/zip/ZipFile.kt b/app/src/main/java/app/revanced/manager/backend/utils/zip/ZipFile.kt index 1e8b8e827f..1e46bf5788 100644 --- a/app/src/main/java/app/revanced/manager/backend/utils/zip/ZipFile.kt +++ b/app/src/main/java/app/revanced/manager/backend/utils/zip/ZipFile.kt @@ -14,7 +14,9 @@ class ZipFile(val file: File) : Closeable { var entries: MutableList = mutableListOf() private val filePointer: RandomAccessFile = RandomAccessFile(file, "rw") - private var CDENeedsRewrite = false + private var CDNeedsRewrite = false + + private val compressionLevel = 9 init { //if file isn't empty try to load entries @@ -73,8 +75,8 @@ class ZipFile(val file: File) : Closeable { } } - private fun writeCDE() { - val CDEStart = filePointer.channel.position().toUInt() + private fun writeCD() { + val CDStart = filePointer.channel.position().toUInt() entries.forEach { filePointer.channel.write(it.toCDE()) @@ -87,8 +89,8 @@ class ZipFile(val file: File) : Closeable { 0u, entriesCount, entriesCount, - filePointer.channel.position().toUInt() - CDEStart, - CDEStart, + filePointer.channel.position().toUInt() - CDStart, + CDStart, "" ) @@ -96,7 +98,7 @@ class ZipFile(val file: File) : Closeable { } private fun addEntry(entry: ZipEntry, data: ByteBuffer) { - CDENeedsRewrite = true + CDNeedsRewrite = true entry.localHeaderOffset = filePointer.channel.position().toUInt() @@ -107,7 +109,7 @@ class ZipFile(val file: File) : Closeable { } fun addEntryCompressData(entry: ZipEntry, data: ByteArray) { - val compressor = Deflater(9, true) + val compressor = Deflater(compressionLevel, true) compressor.setInput(data) compressor.finish() @@ -158,17 +160,17 @@ class ZipFile(val file: File) : Closeable { ) } - fun copyEntriesFromFile(file: ZipFile) { + fun copyEntriesFromFileAligned(file: ZipFile, entryAlignment: (entry: ZipEntry) -> Int?) { for (entry in file.entries) { if (entries.any { it.fileName == entry.fileName }) continue //don't add duplicates val data = file.getDataForEntry(entry) - addEntryCopyData(entry, data) + addEntryCopyData(entry, data, entryAlignment(entry)) } } override fun close() { - if (CDENeedsRewrite) writeCDE() + if (CDNeedsRewrite) writeCD() filePointer.close() } } diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt index c80448cf80..89b103f97e 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt @@ -103,7 +103,6 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : val workdir = createWorkDir() val inputFile = File(workdir.parentFile!!, "base.apk") val patchedFile = File(workdir, "patched.apk").apply { createNewFile() } - val alignedFile = File(workdir, "aligned.apk") val outputFile = File(workdir, "out.apk") val cacheDirectory = workdir.resolve("cache") @@ -169,14 +168,12 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : ) } - file.copyEntriesFromFile(ZipFile(result.resourceFile!!)) - file.copyEntriesFromFile(ZipFile(inputFile)) + file.copyEntriesFromFileAligned(ZipFile(result.resourceFile!!), ZipAligner::getEntryAlignment) + file.copyEntriesFromFileAligned(ZipFile(inputFile), ZipAligner::getEntryAlignment) } - Log.d(tag, "Aligning apk") - ZipAligner.align(patchedFile, alignedFile) Log.d(tag, "Signing apk") - Signer("ReVanced", "s3cur3p@ssw0rd").signApk(alignedFile, outputFile) + Signer("ReVanced", "s3cur3p@ssw0rd").signApk(patchedFile, outputFile) Log.i(tag, "Successfully patched into $outputFile") } finally { Log.d(tag, "Deleting workdir") From 65bf5290bb3cee6979b0750171c91f302776cf1d Mon Sep 17 00:00:00 2001 From: Aunali321 Date: Mon, 25 Jul 2022 22:53:59 +0530 Subject: [PATCH 125/132] feat: partial custom apkselector. --- .../revanced/manager/ui/screens/MainScreen.kt | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index ce1bf70e97..379999d84b 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -1,15 +1,18 @@ package app.revanced.manager.ui.screens +import android.content.Intent +import android.net.Uri import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.ArrowBack -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.IconButton -import androidx.compose.material3.Scaffold -import androidx.compose.material3.Text +import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler +import androidx.core.content.ContextCompat +import androidx.core.net.toUri import androidx.navigation.compose.rememberNavController import app.revanced.manager.ui.components.AppBar import app.revanced.manager.ui.components.BottomNavBar @@ -20,6 +23,7 @@ import com.ramcosta.composedestinations.DestinationsNavHost @Composable fun MainScreen() { val navController = rememberNavController() + val context = LocalContext.current Scaffold( topBar = { when (navController.appCurrentDestinationAsState().value) { @@ -38,11 +42,29 @@ fun MainScreen() { title = { Text("Select an app") }, navigationIcon = { IconButton(onClick = { navController.navigateUp() }) { - androidx.compose.material3.Icon( + Icon( imageVector = Icons.Default.ArrowBack, contentDescription = "Return" ) } + }, + actions = { + IconButton(onClick = { + fun selectApp(pickerInitialUri: Uri) { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "application/vnd.android.package-archive" + } + ContextCompat.startActivity(context, intent, null) + + } + selectApp(pickerInitialUri = "file:///storage/emulated/0/".toUri()) + }) { + Icon( + imageVector = Icons.Default.Add, + contentDescription = "Return" + ) + } } ) } @@ -51,7 +73,7 @@ fun MainScreen() { title = { Text("Select patches") }, navigationIcon = { IconButton(onClick = { navController.navigateUp() }) { - androidx.compose.material3.Icon( + Icon( imageVector = Icons.Default.ArrowBack, contentDescription = "Return" ) @@ -64,7 +86,7 @@ fun MainScreen() { title = { Text(text = "Settings") }, navigationIcon = { IconButton(onClick = { navController.navigateUp() }) { - androidx.compose.material3.Icon( + Icon( imageVector = Icons.Default.ArrowBack, contentDescription = "Return" ) @@ -77,7 +99,7 @@ fun MainScreen() { title = { Text(text = "About") }, navigationIcon = { IconButton(onClick = { navController.navigateUp() }) { - androidx.compose.material3.Icon( + Icon( imageVector = Icons.Default.ArrowBack, contentDescription = "Return" ) @@ -90,7 +112,7 @@ fun MainScreen() { title = { Text(text = "Contributors") }, navigationIcon = { IconButton(onClick = { navController.navigateUp() }) { - androidx.compose.material3.Icon( + Icon( imageVector = Icons.Default.ArrowBack, contentDescription = "Return" ) From da7ca80b329568dd14269e4940f983ee05b39cee Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Mon, 25 Jul 2022 19:31:07 +0200 Subject: [PATCH 126/132] refactor: cleanup --- .../revanced/manager/ui/screens/MainScreen.kt | 72 ++++++------------- 1 file changed, 21 insertions(+), 51 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index 379999d84b..fbd2e26317 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -13,6 +13,7 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalUriHandler import androidx.core.content.ContextCompat import androidx.core.net.toUri +import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController import app.revanced.manager.ui.components.AppBar import app.revanced.manager.ui.components.BottomNavBar @@ -40,29 +41,18 @@ fun MainScreen() { AppSelectorScreenDestination -> { AppBar( title = { Text("Select an app") }, - navigationIcon = { - IconButton(onClick = { navController.navigateUp() }) { - Icon( - imageVector = Icons.Default.ArrowBack, - contentDescription = "Return" - ) - } - }, + navigationIcon = { ReturnButton(navController) }, actions = { IconButton(onClick = { - fun selectApp(pickerInitialUri: Uri) { - val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - type = "application/vnd.android.package-archive" - } - ContextCompat.startActivity(context, intent, null) - + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { + addCategory(Intent.CATEGORY_OPENABLE) + type = "application/vnd.android.package-archive" } - selectApp(pickerInitialUri = "file:///storage/emulated/0/".toUri()) + ContextCompat.startActivity(context, intent, null) }) { Icon( imageVector = Icons.Default.Add, - contentDescription = "Return" + contentDescription = "From filesystem" ) } } @@ -71,58 +61,28 @@ fun MainScreen() { PatchesSelectorScreenDestination -> { AppBar( title = { Text("Select patches") }, - navigationIcon = { - IconButton(onClick = { navController.navigateUp() }) { - Icon( - imageVector = Icons.Default.ArrowBack, - contentDescription = "Return" - ) - } - } + navigationIcon = { ReturnButton(navController) } ) } SettingsScreenDestination -> { AppBar( title = { Text(text = "Settings") }, - navigationIcon = { - IconButton(onClick = { navController.navigateUp() }) { - Icon( - imageVector = Icons.Default.ArrowBack, - contentDescription = "Return" - ) - } - } + navigationIcon = { ReturnButton(navController) } ) } AboutScreenDestination -> { AppBar( title = { Text(text = "About") }, - navigationIcon = { - IconButton(onClick = { navController.navigateUp() }) { - Icon( - imageVector = Icons.Default.ArrowBack, - contentDescription = "Return" - ) - } - } + navigationIcon = { ReturnButton(navController) } ) } ContributorsScreenDestination -> { AppBar( title = { Text(text = "Contributors") }, - navigationIcon = { - IconButton(onClick = { navController.navigateUp() }) { - Icon( - imageVector = Icons.Default.ArrowBack, - contentDescription = "Return" - ) - } - } + navigationIcon = { ReturnButton(navController) } ) } else -> { - val currentUriHandler = LocalUriHandler.current - AppBar( title = { Text("ReVanced Manager") } ) @@ -151,4 +111,14 @@ fun MainScreen() { ) } ) +} + +@Composable +fun ReturnButton(navController: NavHostController) { + IconButton(onClick = navController::navigateUp) { + Icon( + imageVector = Icons.Default.ArrowBack, + contentDescription = "Return" + ) + } } \ No newline at end of file From e875ab50e91f5ab49e0687e5d473087aa318fbfa Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Mon, 25 Jul 2022 21:37:22 +0200 Subject: [PATCH 127/132] refactor: cleanup --- .../java/app/revanced/manager/MainActivity.kt | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/MainActivity.kt b/app/src/main/java/app/revanced/manager/MainActivity.kt index 6c5c7cbc96..527fc5d0c3 100644 --- a/app/src/main/java/app/revanced/manager/MainActivity.kt +++ b/app/src/main/java/app/revanced/manager/MainActivity.kt @@ -28,24 +28,21 @@ class MainActivity : ComponentActivity() { super.onCreate(savedInstanceState) - val darklight: Flow = baseContext.settings.data.map { preferences -> - preferences.get(booleanPreferencesKey("darklight")) ?: true + val darkLight: Flow = baseContext.settings.data.map { preferences -> + preferences[booleanPreferencesKey("darklight")] ?: true } val dynamicColor: Flow = baseContext.settings.data.map { preferences -> - preferences.get(booleanPreferencesKey("dynamicTheming")) ?: true + preferences[booleanPreferencesKey("dynamicTheming")] ?: true } -// Shell.getShell() - setContent { - val darklightstate = darklight.collectAsState(initial = isSystemInDarkTheme()) - - val dynamicColorstate = dynamicColor.collectAsState(initial = true) + val dlState = darkLight.collectAsState(initial = isSystemInDarkTheme()) + val dcState = dynamicColor.collectAsState(initial = true) ReVancedManagerTheme( - darkTheme = darklightstate.value, - dynamicColor = dynamicColorstate.value + darkTheme = dlState.value, + dynamicColor = dcState.value ) { Surface( modifier = Modifier.fillMaxSize(), @@ -56,15 +53,4 @@ class MainActivity : ComponentActivity() { } } } - -// companion object { -// init { -// Shell.enableVerboseLogging = BuildConfig.DEBUG -// Shell.setDefaultBuilder( -// Shell.Builder.create() -// .setFlags(Shell.FLAG_REDIRECT_STDERR) -// .setTimeout(10) -// ) -// } -// } } \ No newline at end of file From d339dcb048e8011a9444f9c33b5c2aea852a33d3 Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Mon, 25 Jul 2022 21:38:23 +0200 Subject: [PATCH 128/132] refactor: wip stuff for file picker functionality --- .../revanced/manager/ui/screens/MainScreen.kt | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index fbd2e26317..56c626212b 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -1,7 +1,10 @@ package app.revanced.manager.ui.screens -import android.content.Intent +import android.app.Application import android.net.Uri +import androidx.activity.ComponentActivity +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.foundation.layout.padding import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Add @@ -10,21 +13,32 @@ import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.platform.LocalUriHandler -import androidx.core.content.ContextCompat -import androidx.core.net.toUri +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavHostController import androidx.navigation.compose.rememberNavController import app.revanced.manager.ui.components.AppBar import app.revanced.manager.ui.components.BottomNavBar import app.revanced.manager.ui.screens.destinations.* +import app.revanced.manager.ui.screens.mainsubscreens.PatcherViewModel import com.ramcosta.composedestinations.DestinationsNavHost @OptIn(ExperimentalMaterial3Api::class) @Composable -fun MainScreen() { +fun MainScreen( + pvm: PatcherViewModel = viewModel(LocalContext.current as ComponentActivity), + vm: MainViewModel = viewModel() +) { val navController = rememberNavController() - val context = LocalContext.current + val getContent = + rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri -> + if (uri == null) return@rememberLauncherForActivityResult + // val input = vm.getInputStream(uri) // example + pvm.setSelectedAppPackage(uri.path!!) // TODO: this is obviously not going to work. + // TODO: switch over from "selected app package" string to a SelectedApp object. + // which includes the InputStreamSupplier (or path?), package name and version. + } + Scaffold( topBar = { when (navController.appCurrentDestinationAsState().value) { @@ -44,11 +58,7 @@ fun MainScreen() { navigationIcon = { ReturnButton(navController) }, actions = { IconButton(onClick = { - val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { - addCategory(Intent.CATEGORY_OPENABLE) - type = "application/vnd.android.package-archive" - } - ContextCompat.startActivity(context, intent, null) + getContent.launch("application/vnd.android.package-archive") }) { Icon( imageVector = Icons.Default.Add, @@ -121,4 +131,8 @@ fun ReturnButton(navController: NavHostController) { contentDescription = "Return" ) } +} + +class MainViewModel(val app: Application) : ViewModel() { + fun getInputStream(uri: Uri) = app.contentResolver.openInputStream(uri)!! } \ No newline at end of file From c7ec5d8b98707aae3b7d33ef47c989532d575aa7 Mon Sep 17 00:00:00 2001 From: Lucaskyy Date: Mon, 25 Jul 2022 21:58:29 +0200 Subject: [PATCH 129/132] feat: add shitty implementation for filtering by bundle --- .../manager/ui/screens/AppSelectorScreen.kt | 29 ++++++++++++++++--- .../revanced/manager/ui/screens/MainScreen.kt | 3 +- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt index 98a0fd226b..dadb3d9eb5 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AppSelectorScreen.kt @@ -21,10 +21,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.setValue +import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp @@ -34,6 +31,9 @@ import androidx.navigation.NavController import app.revanced.manager.ui.Resource import app.revanced.manager.ui.components.placeholders.applist.AppIcon import app.revanced.manager.ui.screens.mainsubscreens.PatcherViewModel +import app.revanced.patcher.data.Data +import app.revanced.patcher.extensions.PatchExtensions.compatiblePackages +import app.revanced.patcher.patch.Patch import com.ramcosta.composedestinations.annotation.Destination import com.ramcosta.composedestinations.annotation.RootNavGraph @@ -51,6 +51,20 @@ fun AppSelectorScreen( ) { val installedApps by vm.installedApps var query by mutableStateOf("") + val patches by pvm.patches + + LaunchedEffect(Unit) { + if (patches is Resource.Success) { + val filter = + (patches as Resource.Success>>>).data.flatMap { patch -> + (patch.compatiblePackages?.toList() ?: emptyList()).map { it.name } + } + vm.filterInstalledApps(filter) + // TODO: someone capable, instead of filtering them completely out make the ones + // that are not in the filter (don't have a patch belonging to them) + // be grayed out and not clickable. also put the filtered apps on top of the list. + } + } when (val installedApps = installedApps) { is Resource.Success -> { @@ -166,4 +180,11 @@ class AppSelectorViewModel(val app: Application) : AndroidViewModel(app) { fun loadIcon(info: ApplicationInfo): Drawable? { return info.loadIcon(app.packageManager) } + + fun filterInstalledApps(toPkgs: Iterable) { + if (installedApps.value !is Resource.Success) return + val apps = (installedApps.value as Resource.Success>).data + val filtered = apps.filter { app -> toPkgs.any { app.packageName == it } } + installedApps.value = Resource.success(filtered) + } } \ No newline at end of file diff --git a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt index 56c626212b..e749c9213d 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/MainScreen.kt @@ -13,6 +13,7 @@ import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavHostController @@ -133,6 +134,6 @@ fun ReturnButton(navController: NavHostController) { } } -class MainViewModel(val app: Application) : ViewModel() { +class MainViewModel(val app: Application) : AndroidViewModel(app) { fun getInputStream(uri: Uri) = app.contentResolver.openInputStream(uri)!! } \ No newline at end of file From d693b38d5442d5c7c3443fdc9e63a0431c3cf405 Mon Sep 17 00:00:00 2001 From: Ushie Date: Wed, 27 Jul 2022 02:17:03 +0300 Subject: [PATCH 130/132] fix: disable forceDark memeui moment --- app/src/main/res/values/themes.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 25bde821a6..480e5f19da 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,8 +1,11 @@ - + \ No newline at end of file From eefbb133288aa1517626f3e47a503a60f2bf453e Mon Sep 17 00:00:00 2001 From: Ushie Date: Wed, 27 Jul 2022 04:40:24 +0300 Subject: [PATCH 131/132] refactor: rename IconHeader to LogoHeader --- .../manager/ui/components/{IconHeader.kt => LogoHeader.kt} | 2 +- .../main/java/app/revanced/manager/ui/screens/AboutScreen.kt | 4 ++-- .../manager/ui/screens/mainsubscreens/MoreSubscreen.kt | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) rename app/src/main/java/app/revanced/manager/ui/components/{IconHeader.kt => LogoHeader.kt} (98%) diff --git a/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt b/app/src/main/java/app/revanced/manager/ui/components/LogoHeader.kt similarity index 98% rename from app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt rename to app/src/main/java/app/revanced/manager/ui/components/LogoHeader.kt index 52e41f4f72..92b5511aef 100644 --- a/app/src/main/java/app/revanced/manager/ui/components/IconHeader.kt +++ b/app/src/main/java/app/revanced/manager/ui/components/LogoHeader.kt @@ -16,7 +16,7 @@ import androidx.compose.ui.unit.dp import app.revanced.manager.R @Composable -fun IconHeader() { +fun LogoHeader() { Box { Icon( painterResource(id = R.drawable.ic_revanced), diff --git a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt index 48f4556e13..a7a25ce0f7 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/AboutScreen.kt @@ -17,7 +17,7 @@ import app.revanced.manager.Global.Companion.socialLinks import app.revanced.manager.Global.Companion.websiteUrl import app.revanced.manager.R import app.revanced.manager.ui.components.DebugInfo -import app.revanced.manager.ui.components.IconHeader +import app.revanced.manager.ui.components.LogoHeader import app.revanced.manager.ui.components.PreferenceRow import app.revanced.manager.ui.components.copyToClipboard import app.revanced.manager.ui.screens.destinations.ContributorsScreenDestination @@ -31,7 +31,7 @@ fun AboutScreen( navigator: NavController, ) { Column(Modifier.padding(8.dp, 8.dp, 8.dp, 20.dp)) { - IconHeader() + LogoHeader() var currentUriHandler = LocalUriHandler.current diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt index a19595a9ec..8713b0933b 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/MoreSubscreen.kt @@ -10,7 +10,7 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavController import app.revanced.manager.R import app.revanced.manager.ui.components.HelpDialog -import app.revanced.manager.ui.components.IconHeader +import app.revanced.manager.ui.components.LogoHeader import app.revanced.manager.ui.components.PreferenceRow import app.revanced.manager.ui.screens.destinations.AboutScreenDestination import app.revanced.manager.ui.screens.destinations.SettingsScreenDestination @@ -24,7 +24,7 @@ fun MoreSubscreen( navigator: NavController, ) { Column(Modifier.padding(8.dp)) { - IconHeader() + LogoHeader() PreferenceRow( title = stringResource(R.string.screen_settings_title), From 8652ef59e19363f016366b650a95d69644f435c0 Mon Sep 17 00:00:00 2001 From: danthe1st Date: Wed, 27 Jul 2022 10:27:19 +0200 Subject: [PATCH 132/132] fix: not copy resources if resource patching is disabled --- .../manager/ui/screens/mainsubscreens/PatcherWorker.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt index 89b103f97e..ed37570140 100644 --- a/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt +++ b/app/src/main/java/app/revanced/manager/ui/screens/mainsubscreens/PatcherWorker.kt @@ -143,7 +143,7 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : }) ) - Log.d(tag, "Merging integrations")//TODO add again + Log.d(tag, "Merging integrations") patcher.addFiles(listOf(integrations)) {} Log.d(tag, "Adding ${patches.size} patch(es)") @@ -168,7 +168,9 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) : ) } - file.copyEntriesFromFileAligned(ZipFile(result.resourceFile!!), ZipAligner::getEntryAlignment) + result.resourceFile?.let{ + file.copyEntriesFromFileAligned(ZipFile(it), ZipAligner::getEntryAlignment) + } file.copyEntriesFromFileAligned(ZipFile(inputFile), ZipAligner::getEntryAlignment) }