From 0af8c8a766ae4ba6926404d59da2f14d649f91f7 Mon Sep 17 00:00:00 2001 From: ADudeCalledLeo <7997354+Leo40Git@users.noreply.github.com> Date: Thu, 16 Oct 2025 22:29:01 +0300 Subject: [PATCH 01/20] fix(X / Twitter - Change link sharing domain): Use bytecode patching to resolve patching with Manager (#6125) --- .../links/ChangeLinkSharingDomainPatch.java | 10 +++++++ .../links/ChangeLinkSharingDomainPatch.kt | 28 +++++++++++++++++-- .../twitter/misc/links/Fingerprints.kt | 13 +++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) diff --git a/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch.java b/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch.java index 60b2d5cb5..0be07403b 100644 --- a/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch.java +++ b/extensions/twitter/src/main/java/app/revanced/twitter/patches/links/ChangeLinkSharingDomainPatch.java @@ -11,6 +11,16 @@ public final class ChangeLinkSharingDomainPatch { return ""; } + // TODO remove this once changeLinkSharingDomainResourcePatch is restored + /** + * Injection point. + */ + public static String formatResourceLink(Object... formatArgs) { + String username = (String) formatArgs[0]; + String tweetId = (String) formatArgs[1]; + return String.format(LINK_FORMAT, getShareDomain(), username, tweetId); + } + /** * Injection point. */ diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt index 57120d70b..1a2c99f59 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt @@ -1,14 +1,17 @@ package app.revanced.patches.twitter.misc.links import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.stringOption import app.revanced.patches.shared.PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN import app.revanced.patches.shared.PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN import app.revanced.patches.twitter.misc.extension.sharedExtensionPatch -import app.revanced.util.findElementByAttributeValueOrThrow +import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.returnEarly +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import java.net.InetAddress import java.net.UnknownHostException import java.util.logging.Logger @@ -40,6 +43,8 @@ internal val domainNameOption = stringOption( true } +// TODO restore this once Manager uses a fixed version of Patcher +/* internal val changeLinkSharingDomainResourcePatch = resourcePatch { execute { val domainName = domainNameOption.value!! @@ -54,6 +59,7 @@ internal val changeLinkSharingDomainResourcePatch = resourcePatch { } } } +*/ @Suppress("unused") val changeLinkSharingDomainPatch = bytecodePatch( @@ -62,7 +68,6 @@ val changeLinkSharingDomainPatch = bytecodePatch( use = false ) { dependsOn( - changeLinkSharingDomainResourcePatch, sharedExtensionPatch, ) @@ -88,5 +93,22 @@ val changeLinkSharingDomainPatch = bytecodePatch( return-object p0 """ ) + + // TODO remove this once changeLinkSharingDomainResourcePatch is restored + // Replace the domain name in the "Share via..." dialog. + linkResourceGetterFingerprint.method.apply { + val templateIdConstIndex = indexOfFirstInstructionOrThrow(Opcode.CONST) + + // Format the link with the new domain name register (1 instruction below the const). + val formatLinkCallIndex = templateIdConstIndex + 1 + val register = getInstruction(formatLinkCallIndex).registerE + + // Replace the original method call with the new method call. + replaceInstruction( + formatLinkCallIndex, + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->" + + "formatResourceLink([Ljava/lang/Object;)Ljava/lang/String;", + ) + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt index 9dbd7aeb1..6117798eb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.twitter.misc.links import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags internal val openLinkFingerprint = fingerprint { returns("V") @@ -17,6 +18,18 @@ internal val linkBuilderFingerprint = fingerprint { strings("/%1\$s/status/%2\$d") } +// TODO remove this once changeLinkSharingDomainResourcePatch is restored +// Returns a shareable link for the "Share via..." dialog. +internal val linkResourceGetterFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameters("Landroid/content/res/Resources;") + custom { _, classDef -> + classDef.fields.any { field -> + field.type.startsWith("Lcom/twitter/model/core/") + } + } +} + internal val linkSharingDomainHelperFingerprint = fingerprint { custom { method, classDef -> method.name == "getShareDomain" && classDef.type == EXTENSION_CLASS_DESCRIPTOR From 14dd7346a8a890a4dcdf257d0b1f27df74d1d906 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Thu, 16 Oct 2025 19:37:32 +0000 Subject: [PATCH 02/20] chore: Release v5.43.2-dev.1 [skip ci] ## [5.43.2-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.43.1...v5.43.2-dev.1) (2025-10-16) ### Bug Fixes * **X / Twitter - Change link sharing domain:** Use bytecode patching to resolve patching with Manager ([#6125](https://github.com/ReVanced/revanced-patches/issues/6125)) ([0af8c8a](https://github.com/ReVanced/revanced-patches/commit/0af8c8a766ae4ba6926404d59da2f14d649f91f7)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 64c7f0178..d7d50d203 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.43.2-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.43.1...v5.43.2-dev.1) (2025-10-16) + + +### Bug Fixes + +* **X / Twitter - Change link sharing domain:** Use bytecode patching to resolve patching with Manager ([#6125](https://github.com/ReVanced/revanced-patches/issues/6125)) ([0af8c8a](https://github.com/ReVanced/revanced-patches/commit/0af8c8a766ae4ba6926404d59da2f14d649f91f7)) + ## [5.43.1](https://github.com/ReVanced/revanced-patches/compare/v5.43.0...v5.43.1) (2025-10-15) diff --git a/gradle.properties b/gradle.properties index f53b377e9..847b69190 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.43.1 +version = 5.43.2-dev.1 From 644d6dcb51fac9fef996f0268d0def241b3f4c2d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 18 Oct 2025 01:08:27 +0400 Subject: [PATCH 03/20] chore: Sync translations (#6142) --- .../addresources/values-fi-rFI/strings.xml | 18 +- .../addresources/values-fr-rFR/strings.xml | 2 +- .../addresources/values-ga-rIE/strings.xml | 194 +++++++++--------- .../addresources/values-ja-rJP/strings.xml | 48 ++--- 4 files changed, 130 insertions(+), 132 deletions(-) diff --git a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml index 4e5ccb0f9..4662ae628 100644 --- a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml +++ b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml @@ -1158,13 +1158,13 @@ UserID on kuin salasana, eikä sitä pidä jakaa kenellekään. Se osa videota, jota useimmat ihmiset etsivät Tauko/Introanimaatio Aikaväli ilman varsinaista sisältöä. Voi olla tauko, staattinen kehys tai toistuva animaatio. Ei sisällä siirtymiä, jotka sisältävät tietoa - Loppukortit / Tekijätiedot + Loppukortit / -tekstit Lopputekstit tai kun YouTuben loppukortit tulevat näkyviin. Ei lopetuksille, joissa on tietoa Koukku / Tervehdykset Kertovat trailerit tulevasta videosta, tervehdykset ja hyvästelyt. Ei sisällä osioita, jotka lisäävät lisäsisältöä - Esikatselu / Yhteenveto + Esikatselu / Kertaus Kokoelma leikkeitä, jotka osoittavat, mitä on tulossa tai mitä tapahtui videossa tai muissa sarjan videoissa, joiden kaikki informaatio toistuu muualla - Tangentti / Vitsit + Toissijaiset kohtaukset / Vitsit Epäolennaiset kohtaukset tai vitsit, joita ei tarvita videon pääsisällön ymmärtämiseen. Ei sisällä osioita, jotka tarjoavat kontekstia tai taustatietoja Musiikki: Musiikiton osa Vain musiikkivideoille. Musiikkivideoiden osiot ilman musiikkia, jotka eivät jo kuulu toiseen kategoriaan @@ -1182,7 +1182,7 @@ UserID on kuin salasana, eikä sitä pidä jakaa kenellekään. Ohita esikatselu Ohita esikatselu Ohita kertaus - Ohita Tangentti + Ohita toissijainen kohtaus Ohita musiikiton Ohita osio Sponsori ohitettiin @@ -1193,11 +1193,11 @@ UserID on kuin salasana, eikä sitä pidä jakaa kenellekään. Tauko ohitettiin Tauko ohitettiin Outro ohitettiin - Ohitettu koukku + Koukku ohitettiin Esikatselu ohitettiin Esikatselu ohitettiin Kertaus ohitettiin - Ohitettu tangentti + Toissijainen kohtaus ohitettiin Musiikiton osio ohitettiin Lähettämätön osio ohitettiin Useita osioita ohitettiin @@ -1254,7 +1254,7 @@ Oletko valmis lähettämään?" Annettu aika on virheellinen Tilastot - Tilastot eivät tilapäisesti saatavilla (API ei ole käytettävissä) + Tilastot eivät ole tilapäisesti saatavilla (API ei ole käytettävissä) Ladataan... SponsorBlock ei ole käytössä Käyttäjänimesi: <b>%s</b> @@ -1265,11 +1265,11 @@ Oletko valmis lähettämään?" Olet luonut <b>%s</b> osiota Napauta tästä nähdäksesi osiosi SponsorBlock-tulostaulu - Olet pelastanut ihmisiä <b>%s</b> segmentiltä + Olet pelastanut ihmisiä <b>%s</b> osiolta Napauta tästä nähdäksesi globaalit tilastot ja parhaat osallistujat Se on <b>%s</b> heidän elämistään.<br>Napauta tästä nähdäksesi tulostaulun Olet ohittanut <b>%s</b> osiota - Tuo on <b>%s</b> + Se on <b>%s</b> Nollataanko ohitettujen osioiden laskuri? %1$s tuntia %2$s minuuttia %1$s minuuttia %2$s sekuntia diff --git a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml index c4e413064..5469dd10c 100644 --- a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml +++ b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml @@ -24,7 +24,7 @@ Second \"item\" text" Nom de l\'application - Personnalisée + Personnalisé Icône de l\'application Originale diff --git a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml index 496a69f74..bc3ebfd57 100644 --- a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml +++ b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml @@ -555,87 +555,85 @@ Níl an ghné seo ar fáil ach do ghléasanna níos sine" Eile Níl an aip suiteáilte Níl %s suiteáilte. Suiteáil é le do thoil. - "Níorbh fhéidir an aip suiteáilte a aimsiú le hainm an phacáiste: %s - -Deimhnigh go bhfuil ainm an phacáiste ceart agus go bhfuil an aip suiteáilte" - Ní féidir le hainm an phacáiste a bheith folamh + "Níorbh fhéidir an aip suiteáilte a aimsiú le hainm an phacáiste: %s\n\nDeimhnigh go bhfuil ainm an phacáiste ceart agus go bhfuil an aip suiteáilte" + Ní féidir ainm an phacáiste a fhágáil folamh Díchumasaigh comhartha cuardaigh beacht - Tá comhartha míchumasaithe - Tá comhartha cumasaithe + Tá gotha ​​cuardaigh chruinn díchumasaithe + Tá gotha ​​cuardaigh chruinn cumasaithe - Cumasaigh sconna chun lorg a dhéanamh - Tá sconna chun cuardach a dhéanamh cumasaithe - Tá sconna chun lorg a dhéanamh díchumasaithe + Cumasaigh tapáil chun cuardach a dhéanamh + Tá tapáil chun cuardach cumasaithe + Tá tapáil chun cuardach a dhíchumasaithe - Cumasaigh comhartha gile - "Tá swipe gile lánscáileáin cumasaithe + Cumasaigh gotha ​​gile + "Tá swipeáil gile lánscáileáin cumasaithe -Coigeartaigh gile trí swipe a dhéanamh go hingearach ar thaobh na láimhe clé den scáileán" - Tá swipe gile lánscáileáin díchumasaithe - Cumasaigh comhartha toirte - "Tá an haiscairt toirte lánscáileáin cumasaithe. +Coigeartaigh gile trí swipeáil go hingearach ar thaobh clé an scáileáin" + Tá svaidhpeáil gile lánscáileáin díchumasaithe + Cumasaigh gotha ​​toirte + "Tá swipeáil toirte lánscáileáin cumasaithe -Coigeartaigh an toirt trí haisceartán go hingearach ar thaobh deas an scáileáin" - Tá an haiscairt toirte lánscáileáin díchumasaithe - Cumasaigh brúigh chun haisc a chur i ngníomh - Tá brúigh chun haisc a chur i ngníomh cumasaithe - Tá brúigh chun haisc a chur i ngníomh díchumasaithe +Coigeartaigh an toirt trí swipeáil go hingearach ar thaobh na láimhe deise den scáileán" + Tá swipeáil toirte lánscáileáin díchumasaithe + Cumasaigh gotha ​​brúigh chun svaidhpeáil + Tá brúigh chun svaidhpeáil cumasaithe + Tá brúigh chun svaidhpeáil díchumasaithe Cumasaigh aiseolas haptic Tá aiseolas haptic cumasaithe - Tá aiseolas haptic míchumasaithe + Tá aiseolas haptic díchumasaithe Sábháil agus athchóirigh gile Sábháil agus cuir gile ar ais agus tú ag imeacht nó ag dul isteach i lánscáileán - Ná sábháil agus athchóirigh gile agus tú ag imeacht nó ag dul isteach sa scáileán iomlán - Cumasaigh gotha uathoibríoch - Cumasaíonn scioradh síos go dtí an luach is ísle den chomhartha gile uathoibríoch - Ní chumasaíonn uathoibríoch a tharraingt síos go dtí an luach is ísle + Ná sábháil agus ná hathchóirigh gile agus tú ag imeacht nó ag dul isteach sa lánscáileán + Cumasaigh gotha ​​gile uathoibríoch + Cumasaíonn tú gile uathoibríoch trí shleamhnú síos go dtí an luach is ísle den ghluaiseacht gile + Ní chumasaítear gile uathoibríoch trí shleamhnú síos go dtí an luach is ísle Uathoibríoch - Amach forleagtha Swipe - Tá méid na milleasoicind an forleagan le feiceáil - Réabhlóid thrasláiteachta na gcúlra léaráidí - Luach léaráidí idir 0-100 - Caithfidh léaráidí traslaithe a bheith idir 0-100 - Dath gile forleagan swipe - Dath an bharra dul chun cinn do rialuithe gile - Dath toirte forleagan swipe + Am scoir forleagan svaidhpeála + An méid milleasoicind atá an forleagan le feiceáil + Teimhneacht chúlra forleagan svaidhpeála + Luach teimhneachta idir 0-100 + Teimhneacht svaidhpeála idir 0-100 + Dath gile forleagan svaidhpeála + Dath an bharra dul chun cinn le haghaidh rialuithe gile + Dath toirte forleagan svaidhpeála Dath an bharra dul chun cinn do rialuithe toirte - Méid téacs an fhorleagain swipe - Méid téacs an fhorleagain swipe idir 1-30 - Caithfidh an méid téacs a bheith idir 1-30 - Tairseach méid swipe - Méid an tairseach le haghaidh sruthú tarlú - Íogaireacht swipe toirte - An méid a athraíonn an toirt in aghaidh gach swipe - Stíl forleagain swipe + Méid téacs forleagan svaidhpeála + Méid an téacs le haghaidh forleagan svaidhpeála idir 1-30 + Caithfidh méid an téacs a bheith idir 1-30 + Tairseach méide svaidhpeála + An méid tairsí le go dtarlóidh svaidhpeáil + Íogaireacht svaidhpeáil toirte + Cé mhéad a athraíonn an toirt in aghaidh an svaidhpeála + Stíl forleagan svaidhpeála Forleagan cothrománach - Forleagan cothrománach (íosta - barr) - Forleagan cothrománach (íosta - lár) + Forleagan cothrománach (íosmhéid - barr) + Forleagan cothrománach (íosmhéid - lár) Forleagan ciorclach - Forleagan ciorclach (íosta) + Forleagan ciorclach (íosmhéid) Forleagan ingearach - Forleagan ingearach (íosta) - Cumasaigh swipe chun físeáin a athrú - Achlaigh i mód lán-scáile chun athrú go dtí an físeán chéanna/arís - Ní athróidh achlaigh i mód lán-scáile go dtí an físeán chéanna/arís + Forleagan ingearach (íosmhéid) + Cumasaigh svaidhpeáil chun físeáin a athrú + Athróidh svaidhpeáil i mód lánscáileáin go dtí an chéad fhíseán eile/roimhe seo + Ní athróidh svaidhpeáil i mód lánscáileáin go dtí an chéad fhíseán eile/roimhe seo - Díchumasaigh fotheidil uathoibríoch + Díchumasaigh fotheidil uathoibríocha Tá fotheidil uathoibríocha díchumasaithe Tá fotheidil uathoibríocha cumasaithe - Cnaipí gníomh + Cnaipí gníomhaíochta Folaigh nó taispeáin cnaipí faoi fhíseáin Díchumasaigh lonradh na cnaipí Cosúil / Liostáil - Ní lonróidh an cnaipe \'Cosúil\' agus \'Liostáil\' nuair a luafaí - Lonróidh an cnaipe Cosúil agus Liostáil nuair a luaitear + Ní bheidh na cnaipe Is maith liom agus Liostáil ag lonrú nuair a luaitear iad + Lonróidh na cnaipe Is maith liom agus Liostáil nuair a luaitear iad Folaigh Like agus Dislike - Tá cnaipí Cosúil agus Dislike i bhfolach - Taispeántar cnaipí Cosúil agus Dislike + Tá cnaipí Like agus Dislike i bhfolach + Taispeántar cnaipí Like agus Dislike Folaigh Comhroinn Tá cnaipe Comhroinn i bhfolach @@ -643,11 +641,11 @@ Coigeartaigh an toirt trí haisceartán go hingearach ar thaobh deas an scáile Folaigh Stad fógraí Tá cnaipe stad fógraí i bhfolach - Tá cnaipe stad fógraí taispeánta + Taispeántar an cnaipe Stad fógraí - Folaigh Tuairimí - Tá cnaipe na dTuairimí folaithe - Tá cnaipe na dTuairimí taispeánta + Folaigh Tráchtanna + Tá an cnaipe tráchtanna i bhfolach + Taispeántar an cnaipe tráchtanna Folaigh Tuairisc @@ -663,22 +661,22 @@ Coigeartaigh an toirt trí haisceartán go hingearach ar thaobh deas an scáile Taispeántar cnaipe íoslódáil - Folaigh Borradh + Folaigh Hype Tá cnaipe an Hype i bhfolach - Tá an cnaipe Hype ar taispeáint + Taispeántar cnaipe Hype Folaigh Cur Chun Cinn - Tá an cnaipe Cur Chun Cinn folaithe - Tá an cnaipe Cur Chun Cinn taispeánta + Tá an cnaipe cur chun cinn i bhfolach + Taispeántar an cnaipe cur chun cinn - Folaigh Go raibh maith agat + Folaigh Buíochas Tá cnaipe buíochas i bhfolach Taispeántar cnaipe buíochas - Folaigh Fiafraigh - Tá cnaipe Fiafraigh i bhfolach - Taispeántar cnaipe Fiafraigh + Folaigh Iarr + Tá an cnaipe Iarr i bhfolach + Taispeántar cnaipe Iarr Folaigh Gearrthóg Tá an cnaipe gearrthóg i bhfolach @@ -686,11 +684,11 @@ Coigeartaigh an toirt trí haisceartán go hingearach ar thaobh deas an scáile Folaigh Siopa Tá cnaipe an tSiopa i bhfolach - Tá cnaipe an tSiopa ar taispeáint + Taispeántar an cnaipe siopa Folaigh Sábháil Tá cnaipe sábhála i bhfolach - Tá cnaipe sábhála taispeánta + Taispeántar an cnaipe Sábháil Cnaipí nascleanúna @@ -726,22 +724,22 @@ Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur a Folaigh lipéid cnaipe nascleanú Tá lipéid i bhfolach Taispeántar lipéid - Díchumas trasúlacht staidéir a dhíchumas - Tá an barra stádais neamhshainiúil - Tá an barra stádais neamhshainiúil nó tríluchtúil - Ar roinnt feistí, má chuirtear an ghné seo ar siúl, is féidir an barra nascleanúna córais a athrú go trédhearcach. - Díchumas barra soiléir trasúlachta - Tá barra nascleanúna mód soiléir dochrach - Tá an barra nascleanúna sa mód solas neamhshainiúil nó tríluchtúil - Díchoigearrd an barra tríluchtúil dorcha - Tá barra nascleanúna mód dorcha dochrach - Tá an barra nascleanúna sa mód dorcha neamhshainiúil nó tríluchtúil + Díchumasaigh barra stádais tréshoilseach + Tá an barra stádais teimhneach + Tá an barra stádais teimhneach nó tréshoilseach + Ar roinnt gléasanna, is féidir leis an ngné seo a chumasú barra nascleanúna an chórais a athrú go trédhearcach. + Díchumasaigh barra tréshoilseach solais + Tá an barra nascleanúna i mód solais teimhneach + Tá barra nascleanúna mód solais teimhneach nó tréshoilseach + Díchumasaigh barra tréshoilseach dorcha + Tá an barra nascleanúna i mód dorcha teimhneach + Tá barra nascleanúna mód dorcha teimhneach nó tréshoilseach Roghchlár Flyout Folaigh nó taispeáin míreanna roghchlár flyout an imreora - Fotheidil i bhfolach + Folaigh Fotheidil Tá roghchlár fotheidil i bhfolach Taispeántar roghchlár fotheidil @@ -753,7 +751,7 @@ Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur a Tá an roghchlár lasc ama codlata i bhfolach Taispeántar roghchlár an lasc ama codlata - Folaigh físeán lúb + Físeán Lúb Folaigh Tá roghchlár físe lúb i bhfolach Taispeántar roghchlár físe lúb @@ -1284,7 +1282,7 @@ Maithe chun cur isteach?" Réamhshocrúch Fón Táibhléad - Gluaisrothar + Gluaisteán "Áirítear ar na hathruithe: Leagan amach an táibléid @@ -1307,15 +1305,15 @@ Má dhiúltaítear é níos déanaí, moltar sonraí an aip a ghlanadh chun buga 20.13.41 - Cuir an barra gníomhaíochta físe neamhchomhbhrúite ar ais 20.05.46 - Athchóirigh feidhmiúlacht tras-scríbhinne 19.35.36 - Athchóirigh sean-deilbhíní imreoir Shorts - 19.01.34 - Athchóiriú Sean Icóin Treorach + 19.01.34 - Athchóirigh deilbhíní nascleanúna sean Athraigh an leathanach tosaigh - Réamhshocraithe - Uile shuibhscríbhinní + Réamhshocrú + Gach síntiús Brabhsáil cainéil Cúrsaí / Foghlaim - Déan iniúchadh + Taiscéal Faisean & Áilleacht Cluichíocht Stair @@ -1332,9 +1330,9 @@ Má dhiúltaítear é níos déanaí, moltar sonraí an aip a ghlanadh chun buga Spóirt Síntiúis Ag treocht - Fíor-Rialtas - Féach ar níos déanaí - Do chlipbhoirt + Réaltacht Fhíorúil + Féach níos déanaí + Do ghearrthóga Athraigh an leathanach tosaigh i gcónaí "Athraítear an leathanach tosaigh i gcónaí @@ -1342,28 +1340,28 @@ Teorainn: Seans nach n-oibreoidh úsáid a bhaint as an gcnaipe cúil ar an mbar Ní athraítear an leathanach tosaigh ach amháin ar tosú an aip - Díchumasaigh an t-imreoir Shorts atá ag tosú arís - Ní thosóidh an t-imreoir Shorts ar thosú an aip - Athosóidh an t-imreoir Shorts ar thosú an aip + Díchumasaigh atosú seinnteoir Shorts + Ní atosóidh seinnteoir Shorts nuair a thosófar an aip + Atosóidh seinnteoir Shorts nuair a thosóidh an aip arís Oscail Shorts le Shorts seinnteoir - Imreoir Rialaigh - Imreoir Rialaigh lán-scáileán + Imreoir rialta + Lánscáileáin imreoir rialta - Shorts Autoplay + Shorts Uathsheinn Seinnfidh Shorts go huathoibríoch Déanfaidh Shorts arís - Cluiche Cúlra Shorts Autoplay + Uathsheinn Shorts Cúlra sheinn Déanfar súgradh cúlra Shorts go huathoibríoch - Athdhéanfar súgradh cúlra Shorts + Athdhéanfar athsheinm Shorts cúlra sheinn - Minipléir + Mion seinnteoir Athraigh stíl an imreora íoslaghdaithe in-aip - Cineál Miniplayer + Cineál Mion seinnteoir Díchumasaithe Réamhshocraithe Íosta diff --git a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml index 996b775e5..a354c8430 100644 --- a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml +++ b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml @@ -28,8 +28,8 @@ Second \"item\" text" アプリアイコン オリジナル - ReVanced (シンプル) - ReVanced (ロゴ拡大) + ReVanced(シンプル) + ReVanced(ロゴ拡大) カスタム @@ -342,8 +342,8 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が 文字起こしセクションを非表示 文字起こしセクションは表示されません 文字起こしセクションは表示されます - 動画の概要欄 - 動画の概要欄のコンポーネントを表示または非表示にします + 概要欄 + 概要欄のコンポーネントを表示または非表示にします フィルタバー フィード、関連動画、検索結果、および再生履歴でフィルタバーを表示または非表示にします フィードで非表示 @@ -496,8 +496,8 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が 自己スポンサー カードは表示されません 自己スポンサー カードは表示されます 商品へのリンクを非表示 - 動画の概要欄にある商品へのリンクは表示されません - 動画の概要欄にある商品へのリンクは表示されます + 動画の概要欄の商品へのリンクは表示されません + 動画の概要欄の商品へのリンクは表示されます 「商品を表示」バナーを非表示 動画オーバーレイの「商品を表示」バナーは表示されません 動画オーバーレイの「商品を表示」バナーは表示されます @@ -614,12 +614,12 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が スワイプによる音量の変化量 オーバーレイのスタイル 横型 - 横型 (シンプル - 画面上部) - 横型 (シンプル - 画面中央) + 横型(シンプル - 画面上部) + 横型(シンプル - 画面中央) 円形 - 円形 (シンプル) + 円形(シンプル) 縦型 - 縦型 (シンプル) + 縦型(シンプル) スワイプによる動画の切り替えを有効化 全画面表示中に左 / 右にスワイプすると、前 / 次の動画に切り替わります 全画面表示中に左 / 右にスワイプしても、前 / 次の動画に切り替わりません @@ -967,7 +967,7 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が "終了画面の「関連動画」は表示されませんが、自動再生がオンの場合は関連動画が自動で再生されます 自動再生の設定は YouTube の設定で変更できます: -[設定] → [再生] → [次の動画を自動再生]" +[設定] > [再生] > [次の動画を自動再生]" 終了画面の「関連動画」は表示されます @@ -1159,9 +1159,9 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が 動画内に挿入される視聴者への高評価、チャンネル登録、フォローなどの時間的に短い催促。時間的に長い催促またはイベントなどの個別具体的なものに関する催促は、「視聴者への催促」ではなく「自己宣伝」に分類すべきです ハイライト 動画の中で最も重要な場面 - 幕間 / オープニング + 幕間 / オープニング (OP) 実際のコンテンツを含まない区間。一時停止、静止画、繰り返しアニメーションなど。情報を含むトランジッション (場面転換) は、このカテゴリーではありません - 終了画面 / クレジット + 終了画面 / クレジット (ED) クレジット、または YouTube の終了画面が表示される場面。情報を含む結論、まとめ部分は、このカテゴリーには含まれません フック / あいさつ 今後の動画のナレーション付きの予告編、および開幕と別れのあいさつ。重複しない内容や情報を追加する場面は含まれません @@ -1177,10 +1177,10 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が 自己宣伝をスキップ 催促をスキップ ハイライトまでスキップ - オープニングをスキップ + OP をスキップ 幕間をスキップ 幕間をスキップ - エンディングをスキップ + ED をスキップ フックをスキップ 予告編をスキップ 予告編をスキップ @@ -1192,10 +1192,10 @@ YouTube Premium ユーザーの場合、この設定は必要ない可能性が 自己宣伝をスキップしました 催促をスキップしました ハイライトまでスキップしました - オープニングをスキップしました + OP をスキップしました 幕間をスキップしました 幕間をスキップしました - エンディングをスキップしました + ED をスキップしました フックをスキップしました 予告編をスキップしました 予告編をスキップしました @@ -1309,7 +1309,7 @@ Automotive レイアウト アプリバージョンの偽装先 20.13.41 - アクション ボタンの文字表示を復元 20.05.46 - 文字起こし機能を復元 - 19.35.36 - 古いショート プレーヤーのアイコンを復元 + 19.35.36 - ショート プレーヤーの古いアイコンを復元 19.01.34 - 古いナビゲーション アイコンを復元 @@ -1359,7 +1359,7 @@ Automotive レイアウト ショート動画の自動再生 ショート動画は自動再生されます ショート動画はループ再生されます - ショート動画の自動再生(バックグラウンド) + ショート動画の自動再生 (バックグラウンド) バックグラウンドのショート動画は自動再生されます バックグラウンドのショート動画はループ再生されます @@ -1433,7 +1433,7 @@ Automotive レイアウト デフォルト 標準 - ReVanced (シンプル) + ReVanced(シンプル) カスタム @@ -1546,13 +1546,13 @@ Automotive レイアウト 画質の変更時にトーストを表示 デフォルトの画質が変更された場合にトースト通知が表示されます デフォルトの画質が変更された場合にトースト通知は表示されません - デフォルトの画質(Wi-Fi) - デフォルトの画質(携帯回線) + デフォルトの画質 (Wi-Fi) + デフォルトの画質 (携帯回線) ショートの画質の変更を保存 画質の変更はすべてのショート動画に適用されます 画質の変更は現在のショート動画にのみ適用されます - デフォルトのショートの画質(Wi-Fi) - デフォルトのショートの画質(携帯回線) + デフォルトのショートの画質 (Wi-Fi) + デフォルトのショートの画質 (携帯回線) 携帯回線 Wi-Fi デフォルトの画質の変更 (%1$s): %2$s From 2e4c6fdcadeef45a80733e374421d52e5e8af910 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 18 Oct 2025 01:12:34 +0400 Subject: [PATCH 04/20] fix(YouTube Music): Resolve patching 7.29 target --- patches/api/patches.api | 2 ++ .../patches/music/misc/spoof/SpoofVideoStreamsPatch.kt | 3 ++- .../patches/music/misc/tracks/ForceOriginalAudioPatch.kt | 9 +++------ .../patches/music/playservice/VersionCheckPatch.kt | 8 +++++++- .../youtube/video/audio/ForceOriginalAudioPatch.kt | 5 +---- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index dfc890bf2..b15bb5bd3 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -481,7 +481,9 @@ public final class app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatc public final class app/revanced/patches/music/playservice/VersionCheckPatchKt { public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun is_7_16_or_greater ()Z public static final fun is_7_33_or_greater ()Z + public static final fun is_8_05_or_greater ()Z public static final fun is_8_10_or_greater ()Z public static final fun is_8_11_or_greater ()Z public static final fun is_8_15_or_greater ()Z diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt index 93c294480..e4268330d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofVideoStreamsPatch.kt @@ -6,6 +6,7 @@ import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.gms.musicActivityOnCreateFingerprint import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch +import app.revanced.patches.music.playservice.is_7_16_or_greater import app.revanced.patches.music.playservice.is_7_33_or_greater import app.revanced.patches.music.playservice.is_8_11_or_greater import app.revanced.patches.music.playservice.is_8_15_or_greater @@ -18,7 +19,7 @@ import app.revanced.patches.shared.misc.spoof.spoofVideoStreamsPatch val spoofVideoStreamsPatch = spoofVideoStreamsPatch( extensionClassDescriptor = "Lapp/revanced/extension/music/patches/spoof/SpoofVideoStreamsPatch;", mainActivityOnCreateFingerprint = musicActivityOnCreateFingerprint, - fixMediaFetchHotConfig = { true }, + fixMediaFetchHotConfig = { is_7_16_or_greater }, fixMediaFetchHotConfigAlternative = { is_8_11_or_greater && !is_8_15_or_greater }, fixParsePlaybackResponseFeatureFlag = { is_7_33_or_greater }, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt index f5f170d54..09be85c56 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/tracks/ForceOriginalAudioPatch.kt @@ -3,14 +3,11 @@ package app.revanced.patches.music.misc.tracks import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch -import app.revanced.patches.music.playservice.is_8_10_or_greater +import app.revanced.patches.music.playservice.is_8_05_or_greater import app.revanced.patches.music.playservice.versionCheckPatch import app.revanced.patches.music.shared.mainActivityOnCreateFingerprint import app.revanced.patches.shared.misc.audio.forceOriginalAudioPatch -private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/music/patches/ForceOriginalAudioPatch;" - @Suppress("unused") val forceOriginalAudioPatch = forceOriginalAudioPatch( block = { @@ -27,8 +24,8 @@ val forceOriginalAudioPatch = forceOriginalAudioPatch( ) ) }, - fixUseLocalizedAudioTrackFlag = { is_8_10_or_greater }, + fixUseLocalizedAudioTrackFlag = { is_8_05_or_greater }, mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, - subclassExtensionClassDescriptor = EXTENSION_CLASS_DESCRIPTOR, + subclassExtensionClassDescriptor = "Lapp/revanced/extension/music/patches/ForceOriginalAudioPatch;", preferenceScreen = PreferenceScreen.MISC, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt index d923c954f..d8f1fd709 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/playservice/VersionCheckPatch.kt @@ -8,8 +8,12 @@ import kotlin.properties.Delegates // Use notNull delegate so an exception is thrown if these fields are accessed before they are set. +var is_7_16_or_greater: Boolean by Delegates.notNull() + private set var is_7_33_or_greater: Boolean by Delegates.notNull() private set +var is_8_05_or_greater: Boolean by Delegates.notNull() + private set var is_8_10_or_greater: Boolean by Delegates.notNull() private set var is_8_11_or_greater: Boolean by Delegates.notNull() @@ -26,8 +30,10 @@ val versionCheckPatch = resourcePatch( val playStoreServicesVersion = findPlayStoreServicesVersion() // All bug fix releases always seem to use the same play store version as the minor version. + is_7_16_or_greater = 243499000 <= playStoreServicesVersion is_7_33_or_greater = 245199000 <= playStoreServicesVersion - is_8_10_or_greater = 244799000 <= playStoreServicesVersion + is_8_05_or_greater = 250599000 <= playStoreServicesVersion + is_8_10_or_greater = 251099000 <= playStoreServicesVersion is_8_11_or_greater = 251199000 <= playStoreServicesVersion is_8_15_or_greater = 251530000 <= playStoreServicesVersion } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt index 390fe6c4a..ea1fed89b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt @@ -8,9 +8,6 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint -private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/ForceOriginalAudioPatch;" - @Suppress("unused") val forceOriginalAudioPatch = forceOriginalAudioPatch( block = { @@ -31,6 +28,6 @@ val forceOriginalAudioPatch = forceOriginalAudioPatch( }, fixUseLocalizedAudioTrackFlag = { is_20_07_or_greater }, mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, - subclassExtensionClassDescriptor = EXTENSION_CLASS_DESCRIPTOR, + subclassExtensionClassDescriptor = "Lapp/revanced/extension/youtube/patches/ForceOriginalAudioPatch;", preferenceScreen = PreferenceScreen.VIDEO, ) From e8e28e2b6a2b231022967f8dab0980d74fd0ba0b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 17 Oct 2025 21:15:51 +0000 Subject: [PATCH 05/20] chore: Release v5.43.2-dev.2 [skip ci] ## [5.43.2-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.1...v5.43.2-dev.2) (2025-10-17) ### Bug Fixes * **YouTube Music:** Resolve patching 7.29 target ([2e4c6fd](https://github.com/ReVanced/revanced-patches/commit/2e4c6fdcadeef45a80733e374421d52e5e8af910)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d7d50d203..b85e438ac 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.43.2-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.1...v5.43.2-dev.2) (2025-10-17) + + +### Bug Fixes + +* **YouTube Music:** Resolve patching 7.29 target ([2e4c6fd](https://github.com/ReVanced/revanced-patches/commit/2e4c6fdcadeef45a80733e374421d52e5e8af910)) + ## [5.43.2-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.43.1...v5.43.2-dev.1) (2025-10-16) diff --git a/gradle.properties b/gradle.properties index 847b69190..973dda541 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.43.2-dev.1 +version = 5.43.2-dev.2 From cfd244b4088daacd2788ec38357ac521e4b296d5 Mon Sep 17 00:00:00 2001 From: Bceez Date: Sun, 19 Oct 2025 16:24:45 +0200 Subject: [PATCH 06/20] fix(YouTube - Hide layout components): Hide new kind of community post (#6146) --- .../youtube/patches/components/LayoutComponentsFilter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java index 9b1aa94dc..c096e17e8 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java @@ -87,7 +87,8 @@ public final class LayoutComponentsFilter extends Filter { "post_shelf_slim.e", "videos_post_responsive_root.e", "text_post_responsive_root.e", - "poll_post_responsive_root.e" + "poll_post_responsive_root.e", + "shared_post_root.e" ); final var subscribersCommunityGuidelines = new StringFilterGroup( From 6373829fd6ae5664e00ced23a7c0a277757d4fd2 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 19 Oct 2025 14:29:38 +0000 Subject: [PATCH 07/20] chore: Release v5.43.2-dev.3 [skip ci] ## [5.43.2-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.2...v5.43.2-dev.3) (2025-10-19) ### Bug Fixes * **YouTube - Hide layout components:** Hide new kind of community post ([#6146](https://github.com/ReVanced/revanced-patches/issues/6146)) ([cfd244b](https://github.com/ReVanced/revanced-patches/commit/cfd244b4088daacd2788ec38357ac521e4b296d5)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b85e438ac..584422306 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## [5.43.2-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.2...v5.43.2-dev.3) (2025-10-19) + + +### Bug Fixes + +* **YouTube - Hide layout components:** Hide new kind of community post ([#6146](https://github.com/ReVanced/revanced-patches/issues/6146)) ([cfd244b](https://github.com/ReVanced/revanced-patches/commit/cfd244b4088daacd2788ec38357ac521e4b296d5)) + ## [5.43.2-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.1...v5.43.2-dev.2) (2025-10-17) diff --git a/gradle.properties b/gradle.properties index 973dda541..d8d1c57a8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.43.2-dev.2 +version = 5.43.2-dev.3 From de97562c5ddc8ec707761c1e04e74c4e18f9c158 Mon Sep 17 00:00:00 2001 From: rospino74 <34315725+rospino74@users.noreply.github.com> Date: Wed, 22 Oct 2025 08:09:34 +0200 Subject: [PATCH 08/20] feat(Samsung Radio): Add `Disable device checks` patch (#6145) --- extensions/samsung/radio/build.gradle.kts | 4 ++ .../radio/src/main/AndroidManifest.xml | 1 + .../radio/misc/fix/crash/FixCrashPatch.java | 24 ++++++++ .../device/BypassDeviceChecksPatch.java | 19 ++++++ .../samsung/radio/stub/build.gradle.kts | 17 ++++++ .../radio/stub/src/main/AndroidManifest.xml | 1 + .../java/android/os/SemSystemProperties.java | 7 +++ patches/api/patches.api | 8 +++ .../fix/crash/AddManifestPermissionsPatch.kt | 34 +++++++++++ .../radio/misc/fix/crash/Fingerprints.kt | 18 ++++++ .../radio/misc/fix/crash/FixCrashPatch.kt | 42 +++++++++++++ .../device/BypassDeviceChecksPatch.kt | 55 +++++++++++++++++ .../radio/restrictions/device/Fingerprints.kt | 61 +++++++++++++++++++ 13 files changed, 291 insertions(+) create mode 100644 extensions/samsung/radio/build.gradle.kts create mode 100644 extensions/samsung/radio/src/main/AndroidManifest.xml create mode 100644 extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/misc/fix/crash/FixCrashPatch.java create mode 100644 extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/restrictions/device/BypassDeviceChecksPatch.java create mode 100644 extensions/samsung/radio/stub/build.gradle.kts create mode 100644 extensions/samsung/radio/stub/src/main/AndroidManifest.xml create mode 100644 extensions/samsung/radio/stub/src/main/java/android/os/SemSystemProperties.java create mode 100644 patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/AddManifestPermissionsPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt diff --git a/extensions/samsung/radio/build.gradle.kts b/extensions/samsung/radio/build.gradle.kts new file mode 100644 index 000000000..0eadeef26 --- /dev/null +++ b/extensions/samsung/radio/build.gradle.kts @@ -0,0 +1,4 @@ +dependencies { + compileOnly(project(":extensions:shared:library")) + compileOnly(project(":extensions:samsung:radio:stub")) +} diff --git a/extensions/samsung/radio/src/main/AndroidManifest.xml b/extensions/samsung/radio/src/main/AndroidManifest.xml new file mode 100644 index 000000000..9b65eb06c --- /dev/null +++ b/extensions/samsung/radio/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + diff --git a/extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/misc/fix/crash/FixCrashPatch.java b/extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/misc/fix/crash/FixCrashPatch.java new file mode 100644 index 000000000..72c5addc4 --- /dev/null +++ b/extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/misc/fix/crash/FixCrashPatch.java @@ -0,0 +1,24 @@ +package app.revanced.extension.samsung.radio.misc.fix.crash; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@SuppressWarnings("unused") +public final class FixCrashPatch { + /** + * Injection point. + *

+ * Add the required permissions to the request list to avoid crashes on API 34+. + **/ + public static final String[] fixPermissionRequestList(String[] perms) { + List permsList = new ArrayList<>(Arrays.asList(perms)); + if (permsList.contains("android.permission.POST_NOTIFICATIONS")) { + permsList.addAll(Arrays.asList("android.permission.RECORD_AUDIO", "android.permission.READ_PHONE_STATE", "android.permission.FOREGROUND_SERVICE_MICROPHONE")); + } + if (permsList.contains("android.permission.RECORD_AUDIO")) { + permsList.add("android.permission.FOREGROUND_SERVICE_MICROPHONE"); + } + return permsList.toArray(new String[0]); + } +} diff --git a/extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/restrictions/device/BypassDeviceChecksPatch.java b/extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/restrictions/device/BypassDeviceChecksPatch.java new file mode 100644 index 000000000..19b6c3e82 --- /dev/null +++ b/extensions/samsung/radio/src/main/java/app/revanced/extension/samsung/radio/restrictions/device/BypassDeviceChecksPatch.java @@ -0,0 +1,19 @@ +package app.revanced.extension.samsung.radio.restrictions.device; + +import android.os.SemSystemProperties; + +import java.util.Arrays; + +@SuppressWarnings("unused") +public final class BypassDeviceChecksPatch { + + /** + * Injection point. + *

+ * Check if the device has the required hardware + **/ + public static final boolean checkIfDeviceIsIncompatible(String[] deviceList) { + String currentDevice = SemSystemProperties.getSalesCode(); + return Arrays.asList(deviceList).contains(currentDevice); + } +} diff --git a/extensions/samsung/radio/stub/build.gradle.kts b/extensions/samsung/radio/stub/build.gradle.kts new file mode 100644 index 000000000..b4bee8809 --- /dev/null +++ b/extensions/samsung/radio/stub/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + alias(libs.plugins.android.library) +} + +android { + namespace = "app.revanced.extension" + compileSdk = 34 + + defaultConfig { + minSdk = 24 + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 + } +} diff --git a/extensions/samsung/radio/stub/src/main/AndroidManifest.xml b/extensions/samsung/radio/stub/src/main/AndroidManifest.xml new file mode 100644 index 000000000..15e7c2ae6 --- /dev/null +++ b/extensions/samsung/radio/stub/src/main/AndroidManifest.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/extensions/samsung/radio/stub/src/main/java/android/os/SemSystemProperties.java b/extensions/samsung/radio/stub/src/main/java/android/os/SemSystemProperties.java new file mode 100644 index 000000000..33a4b4400 --- /dev/null +++ b/extensions/samsung/radio/stub/src/main/java/android/os/SemSystemProperties.java @@ -0,0 +1,7 @@ +package android.os; + +public class SemSystemProperties { + public static String getSalesCode() { + throw new UnsupportedOperationException("Stub"); + } +} \ No newline at end of file diff --git a/patches/api/patches.api b/patches/api/patches.api index b15bb5bd3..20f74169a 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -764,6 +764,14 @@ public final class app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQuer public static final fun getSanitizeUrlQueryPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatchKt { + public static final fun getFixCrashPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + +public final class app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatchKt { + public static final fun getBypassDeviceChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatchKt { public static final fun getRootDetectionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/AddManifestPermissionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/AddManifestPermissionsPatch.kt new file mode 100644 index 000000000..35641f2e7 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/AddManifestPermissionsPatch.kt @@ -0,0 +1,34 @@ +package app.revanced.patches.samsung.radio.misc.fix.crash + +import app.revanced.patcher.patch.resourcePatch +import app.revanced.util.asSequence +import org.w3c.dom.Element + +@Suppress("unused") +internal val addManifestPermissionsPatch = resourcePatch { + + val requiredPermissions = listOf( + "android.permission.READ_PHONE_STATE", + "android.permission.FOREGROUND_SERVICE_MICROPHONE", + "android.permission.RECORD_AUDIO", + ) + + execute { + document("AndroidManifest.xml").use { document -> + document.getElementsByTagName("manifest").item(0).let { manifestEl -> + + // Check which permissions are missing + val existingPermissionNames = document.getElementsByTagName("uses-permission").asSequence() + .mapNotNull { (it as? Element)?.getAttribute("android:name") }.toSet() + val missingPermissions = requiredPermissions.filterNot { it in existingPermissionNames } + + // Then add them + for (permission in missingPermissions) { + val element = document.createElement("uses-permission") + element.setAttribute("android:name", permission) + manifestEl.appendChild(element) + } + } + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt new file mode 100644 index 000000000..f842a45cc --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt @@ -0,0 +1,18 @@ +@file:Suppress("unused") + +package app.revanced.patches.samsung.radio.misc.fix.crash + +import app.revanced.patcher.fingerprint +import app.revanced.patches.all.misc.transformation.IMethodCall +import app.revanced.patches.all.misc.transformation.fromMethodReference +import app.revanced.util.getReference +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +internal val permissionRequestListFingerprint = fingerprint { + strings( + "android.permission.POST_NOTIFICATIONS", + "android.permission.READ_MEDIA_AUDIO", + "android.permission.RECORD_AUDIO" + ) + custom { method, _ -> method.name == "" } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt new file mode 100644 index 000000000..a076ca830 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/FixCrashPatch.kt @@ -0,0 +1,42 @@ +@file:Suppress("unused") + +package app.revanced.patches.samsung.radio.misc.fix.crash + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.samsung.radio.restrictions.device.bypassDeviceChecksPatch +import app.revanced.util.findInstructionIndicesReversedOrThrow +import app.revanced.util.indexOfFirstInstruction +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction + +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/samsung/radio/misc/fix/crash/FixCrashPatch;" + +val fixCrashPatch = bytecodePatch( + name = "Fix crashes", description = "Prevents the app from crashing because of missing system permissions." +) { + dependsOn(addManifestPermissionsPatch, bypassDeviceChecksPatch) + extendWith("extensions/samsung/radio.rve") + compatibleWith("com.sec.android.app.fm"("12.4.00.7", "12.3.00.13", "12.3.00.11")) + + execute { + permissionRequestListFingerprint.method.apply { + findInstructionIndicesReversedOrThrow(Opcode.FILLED_NEW_ARRAY).forEach { filledNewArrayIndex -> + val moveResultIndex = indexOfFirstInstruction(filledNewArrayIndex, Opcode.MOVE_RESULT_OBJECT) + if (moveResultIndex < 0) return@forEach // No move-result-object found after the filled-new-array + + // Get the register where the array is saved + val arrayRegister = getInstruction(moveResultIndex).registerA + + // Invoke the method from the extension + addInstructions( + moveResultIndex + 1, """ + invoke-static { v$arrayRegister }, ${EXTENSION_CLASS_DESCRIPTOR}->fixPermissionRequestList([Ljava/lang/String;)[Ljava/lang/String; + move-result-object v$arrayRegister + """ + ) + } + } + } +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatch.kt new file mode 100644 index 000000000..68ef9a801 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/BypassDeviceChecksPatch.kt @@ -0,0 +1,55 @@ +package app.revanced.patches.samsung.radio.restrictions.device + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.findFreeRegister +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.StringReference + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/samsung/radio/restrictions/device/BypassDeviceChecksPatch;" + +@Suppress("unused") +val bypassDeviceChecksPatch = bytecodePatch( + name = "Bypass device checks", + description = "Removes firmware and region blacklisting. " + + "This patch will still not allow the app to run on devices that do not have the required hardware.", +) { + extendWith("extensions/samsung/radio.rve") + compatibleWith("com.sec.android.app.fm"("12.4.00.7", "12.3.00.13", "12.3.00.11")) + + execute { + // Return false = The device is not blacklisted + checkDeviceFingerprint.method.apply { + // Find the first string that start with "SM-", that's the list of incompatible devices + val firstStringIndex = indexOfFirstInstructionOrThrow { + opcode == Opcode.CONST_STRING && + getReference()?.string?.startsWith("SM-") == true + } + + // Find the following filled-new-array (or filled-new-array/range) instruction + val filledNewArrayIndex = indexOfFirstInstructionOrThrow(firstStringIndex + 1) { + opcode == Opcode.FILLED_NEW_ARRAY || opcode == Opcode.FILLED_NEW_ARRAY_RANGE + } + + // Find an available register for our use + val resultRegister = findFreeRegister(filledNewArrayIndex + 1) + + // Store the array there and invoke the method that we added to the class earlier + addInstructions( + filledNewArrayIndex + 1, """ + move-result-object v$resultRegister + invoke-static { v$resultRegister }, $EXTENSION_CLASS_DESCRIPTOR->checkIfDeviceIsIncompatible([Ljava/lang/String;)Z + move-result v$resultRegister + return v$resultRegister + """ + ) + + // Remove the instructions before our strings + removeInstructions(0, firstStringIndex) + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt new file mode 100644 index 000000000..476823591 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt @@ -0,0 +1,61 @@ +package app.revanced.patches.samsung.radio.restrictions.device + +import app.revanced.patcher.fingerprint +import app.revanced.patches.all.misc.transformation.IMethodCall +import app.revanced.patches.all.misc.transformation.fromMethodReference +import app.revanced.util.getReference +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +internal val checkDeviceFingerprint = fingerprint { + returns("Z") + custom { method, _ -> + /* Check for methods call to: + - Landroid/os/SemSystemProperties;->getSalesCode()Ljava/lang/String; + - Landroid/os/SemSystemProperties;->getCountryIso()Ljava/lang/String; + */ + + val impl = method.implementation ?: return@custom false + + // Track which target methods we've found + val foundMethods = mutableSetOf() + + // Scan method instructions for calls to our target methods + for (instr in impl.instructions) { + val ref = instr.getReference() ?: continue + val mc = fromMethodReference(ref) ?: continue + + if (mc == MethodCall.GetSalesCode || mc == MethodCall.GetCountryIso) { + foundMethods.add(mc) + + // If we found both methods, return success + if (foundMethods.size == 2) { + return@custom true + } + } + } + + // Only match if both methods are present + return@custom false + } +} + +// Information about method calls we want to replace +private enum class MethodCall( + override val definedClassName: String, + override val methodName: String, + override val methodParams: Array, + override val returnType: String, +) : IMethodCall { + GetSalesCode( + "Landroid/os/SemSystemProperties;", + "getSalesCode", + arrayOf(), + "Ljava/lang/String;", + ), + GetCountryIso( + "Landroid/os/SemSystemProperties;", + "getCountryIso", + arrayOf(), + "Ljava/lang/String;", + ), +} \ No newline at end of file From b2dd008aeed341e91f87aad8f90da33f13ce0031 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 22 Oct 2025 06:14:00 +0000 Subject: [PATCH 09/20] chore: Release v5.44.0-dev.1 [skip ci] # [5.44.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.3...v5.44.0-dev.1) (2025-10-22) ### Features * **Samsung Radio:** Add `Disable device checks` patch ([#6145](https://github.com/ReVanced/revanced-patches/issues/6145)) ([de97562](https://github.com/ReVanced/revanced-patches/commit/de97562c5ddc8ec707761c1e04e74c4e18f9c158)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 584422306..a7b15246d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.44.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.3...v5.44.0-dev.1) (2025-10-22) + + +### Features + +* **Samsung Radio:** Add `Disable device checks` patch ([#6145](https://github.com/ReVanced/revanced-patches/issues/6145)) ([de97562](https://github.com/ReVanced/revanced-patches/commit/de97562c5ddc8ec707761c1e04e74c4e18f9c158)) + ## [5.43.2-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.2...v5.43.2-dev.3) (2025-10-19) diff --git a/gradle.properties b/gradle.properties index d8d1c57a8..a5b833989 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.43.2-dev.3 +version = 5.44.0-dev.1 From c64e29ec5791392b8c26ad91a6bd2b5000392363 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 22 Oct 2025 11:47:39 +0400 Subject: [PATCH 10/20] refactor(YouTube - Seekbar): Remove obsolete splash screen color code --- .../patches/theme/ProgressBarDrawable.java | 51 ------- .../patches/theme/SeekbarColorPatch.java | 54 ------- .../layout/seekbar/SeekbarColorPatch.kt | 135 +----------------- .../main/resources/seekbar/values/attrs.xml | 4 - 4 files changed, 1 insertion(+), 243 deletions(-) delete mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ProgressBarDrawable.java delete mode 100644 patches/src/main/resources/seekbar/values/attrs.xml diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ProgressBarDrawable.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ProgressBarDrawable.java deleted file mode 100644 index 93d53c9a5..000000000 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ProgressBarDrawable.java +++ /dev/null @@ -1,51 +0,0 @@ -package app.revanced.extension.youtube.patches.theme; - -import android.graphics.Canvas; -import android.graphics.ColorFilter; -import android.graphics.Paint; -import android.graphics.PixelFormat; -import android.graphics.drawable.Drawable; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import app.revanced.extension.youtube.patches.HideSeekbarPatch; -import app.revanced.extension.youtube.settings.Settings; - -/** - * Used by {@link SeekbarColorPatch} change the color of the seekbar. - * and {@link HideSeekbarPatch} to hide the seekbar of the feed and watch history. - */ -@SuppressWarnings("unused") -public class ProgressBarDrawable extends Drawable { - - private final Paint paint = new Paint(); - { - paint.setColor(SeekbarColorPatch.getSeekbarColor()); - } - - @Override - public void draw(@NonNull Canvas canvas) { - if (Settings.HIDE_SEEKBAR_THUMBNAIL.get()) { - return; - } - - canvas.drawRect(getBounds(), paint); - } - - @Override - public void setAlpha(int alpha) { - paint.setAlpha(alpha); - } - - @Override - public void setColorFilter(@Nullable ColorFilter colorFilter) { - paint.setColorFilter(colorFilter); - } - - @Override - public int getOpacity() { - return PixelFormat.TRANSLUCENT; - } - -} diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java index 72b74fc94..270576700 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java @@ -4,9 +4,7 @@ import static app.revanced.extension.shared.StringRef.str; import static app.revanced.extension.shared.Utils.clamp; import static app.revanced.extension.youtube.patches.theme.ThemePatch.SplashScreenAnimationStyle; -import android.content.res.Resources; import android.graphics.Color; -import android.graphics.drawable.AnimatedVectorDrawable; import com.airbnb.lottie.LottieAnimationView; @@ -15,7 +13,6 @@ import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; import java.util.Arrays; -import java.util.Locale; import java.util.Scanner; import app.revanced.extension.shared.Logger; @@ -104,27 +101,6 @@ public final class SeekbarColorPatch { return customSeekbarColor; } - private static int colorChannelTo3Bits(int channel8Bits) { - final float channel3Bits = channel8Bits * 7 / 255f; - - // If a color channel is near zero, then allow rounding up so values between - // 0x12 and 0x23 will show as 0x24. But always round down when the channel is - // near full saturation, otherwise rounding to nearest will cause all values - // between 0xEC and 0xFE to always show as full saturation (0xFF). - return channel3Bits < 6 - ? Math.round(channel3Bits) - : (int) channel3Bits; - } - - @SuppressWarnings("SameParameterValue") - private static String get9BitStyleIdentifier(int color24Bit) { - final int r3 = colorChannelTo3Bits(Color.red(color24Bit)); - final int g3 = colorChannelTo3Bits(Color.green(color24Bit)); - final int b3 = colorChannelTo3Bits(Color.blue(color24Bit)); - - return String.format(Locale.US, "splash_seekbar_color_style_%d_%d_%d", r3, g3, b3); - } - /** * injection point. */ @@ -135,36 +111,6 @@ public final class SeekbarColorPatch { return original; // false = drawable style, true = lottie style. } - /** - * Injection point. - * Old drawable style launch screen. - */ - public static void setSplashAnimationDrawableTheme(AnimatedVectorDrawable vectorDrawable) { - // Alternatively a ColorMatrixColorFilter can be used to change the color of the drawable - // without using any styles, but a color filter cannot selectively change the seekbar - // while keeping the red YT logo untouched. - // Even if the seekbar color xml value is changed to a completely different color (such as green), - // a color filter still cannot be selectively applied when the drawable has more than 1 color. - try { - // Must set the color even if custom seekbar is off, - // because the xml color was replaced with a themed value. - String seekbarStyle = get9BitStyleIdentifier(customSeekbarColor); - Logger.printDebug(() -> "Using splash seekbar style: " + seekbarStyle); - - final int styleIdentifierDefault = Utils.getResourceIdentifierOrThrow( - seekbarStyle, - "style" - ); - - Resources.Theme theme = Utils.getContext().getResources().newTheme(); - theme.applyStyle(styleIdentifierDefault, true); - - vectorDrawable.applyTheme(theme); - } catch (Exception ex) { - Logger.printException(() -> "setSplashAnimationDrawableTheme failure", ex); - } - } - /** * Injection point. * Modern Lottie style animation. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index f89175c8f..f7332f5c3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -1,11 +1,9 @@ package app.revanced.patches.youtube.layout.seekbar import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod @@ -17,17 +15,13 @@ import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater -import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint -import app.revanced.util.copyXmlNode -import app.revanced.util.findElementByAttributeValueOrThrow import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.inputStreamFromBundledResource import app.revanced.util.insertLiteralOverride import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -38,9 +32,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter -import org.w3c.dom.Element -import java.io.ByteArrayInputStream -import kotlin.use internal var reelTimeBarPlayedColorId = -1L private set @@ -57,8 +48,6 @@ internal var ytTextSecondaryId = -1L internal var inlineTimeBarLiveSeekableRangeId = -1L private set -internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color" - private val seekbarColorResourcePatch = resourcePatch { dependsOn( settingsPatch, @@ -92,21 +81,6 @@ private val seekbarColorResourcePatch = resourcePatch { "inline_time_bar_live_seekable_range" ] - // Modify the resume playback drawable and replace the progress bar with a custom drawable. - document("res/drawable/resume_playback_progressbar_drawable.xml").use { document -> - val layerList = document.getElementsByTagName("layer-list").item(0) as Element - val progressNode = layerList.getElementsByTagName("item").item(1) as Element - if (!progressNode.getAttributeNode("android:id").value.endsWith("progress")) { - throw PatchException("Could not find progress bar") - } - val scaleNode = progressNode.getElementsByTagName("scale").item(0) as Element - val shapeNode = scaleNode.getElementsByTagName("shape").item(0) as Element - val replacementNode = document.createElement( - "app.revanced.extension.youtube.patches.theme.ProgressBarDrawable", - ) - scaleNode.replaceChild(replacementNode, shapeNode) - } - ytYoutubeMagentaColorId = resourceMappings[ "color", "yt_youtube_magenta", @@ -115,99 +89,9 @@ private val seekbarColorResourcePatch = resourcePatch { "attr", "ytStaticBrandRed", ] - - // Add attribute and styles for splash screen custom color. - // Using a style is the only way to selectively change just the seekbar fill color. - // - // Because the style colors must be hard coded for all color possibilities, - // instead of allowing 24 bit color the style is restricted to 9-bit (3 bits per color channel) - // and the style color closest to the users custom color is used for the splash screen. - arrayOf( - inputStreamFromBundledResource("seekbar/values", "attrs.xml")!! to "res/values/attrs.xml", - ByteArrayInputStream(create9BitSeekbarColorStyles().toByteArray()) to "res/values/styles.xml" - ).forEach { (source, destination) -> - "resources".copyXmlNode( - document(source), - document(destination), - ).close() - } - - fun setSplashDrawablePathFillColor(xmlFileNames: Iterable, vararg resourceNames: String) { - xmlFileNames.forEach { xmlFileName -> - document(xmlFileName).use { document -> - val childNodes = document.childNodes - - resourceNames.forEach { elementId -> - val element = childNodes.findElementByAttributeValueOrThrow( - "android:name", - elementId - ) - - val attribute = "android:fillColor" - if (!element.hasAttribute(attribute)) { - throw PatchException("Could not find $attribute for $elementId") - } - - element.setAttribute(attribute, "?attr/$splashSeekbarColorAttributeName") - } - } - } - } - - setSplashDrawablePathFillColor( - listOf( - "res/drawable/\$startup_animation_light__0.xml", - "res/drawable/\$startup_animation_dark__0.xml" - ), - "_R_G_L_10_G_D_0_P_0" - ) - - if (!is_19_46_or_greater) { - // Resources removed in 19.46+ - setSplashDrawablePathFillColor( - listOf( - "res/drawable/\$buenos_aires_animation_light__0.xml", - "res/drawable/\$buenos_aires_animation_dark__0.xml" - ), - "_R_G_L_8_G_D_0_P_0" - ) - } } } -/** - * Generate a style xml with all combinations of 9-bit colors. - */ -private fun create9BitSeekbarColorStyles(): String = StringBuilder().apply { - append("") - append("\n") - - for (red in 0..7) { - for (green in 0..7) { - for (blue in 0..7) { - val name = "${red}_${green}_${blue}" - - fun roundTo3BitHex(channel8Bits: Int) = - (channel8Bits * 255 / 7).toString(16).padStart(2, '0') - val r = roundTo3BitHex(red) - val g = roundTo3BitHex(green) - val b = roundTo3BitHex(blue) - val color = "#ff$r$g$b" - - append( - """ - - """ - ) - } - } - } - - append("") -}.toString() - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/theme/SeekbarColorPatch;" val seekbarColorPatch = bytecodePatch( @@ -344,21 +228,6 @@ val seekbarColorPatch = bytecodePatch( // Hook the splash animation to set the a seekbar color. mainActivityOnCreateFingerprint.method.apply { - val drawableIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Landroid/widget/ImageView;" - && reference.name == "getDrawable" - } - val checkCastIndex = indexOfFirstInstructionOrThrow(drawableIndex, Opcode.CHECK_CAST) - val drawableRegister = getInstruction(checkCastIndex).registerA - - addInstruction( - checkCastIndex + 1, - "invoke-static { v$drawableRegister }, $EXTENSION_CLASS_DESCRIPTOR->" + - "setSplashAnimationDrawableTheme(Landroid/graphics/drawable/AnimatedVectorDrawable;)V" - ) - - // Replace the Lottie animation view setAnimation(int) call. val setAnimationIntMethodName = lottieAnimationViewSetAnimationIntFingerprint.originalMethod.name findInstructionIndicesReversedOrThrow { @@ -371,13 +240,11 @@ val seekbarColorPatch = bytecodePatch( replaceInstruction( index, "invoke-static { v${instruction.registerC}, v${instruction.registerD} }, " + - "$EXTENSION_CLASS_DESCRIPTOR->setSplashAnimationLottie" + - "(Lcom/airbnb/lottie/LottieAnimationView;I)V" + "$EXTENSION_CLASS_DESCRIPTOR->setSplashAnimationLottie(Lcom/airbnb/lottie/LottieAnimationView;I)V" ) } } - // Add non obfuscated method aliases for `setAnimation(int)` // and `setAnimation(InputStream, String)` so extension code can call them. lottieAnimationViewSetAnimationIntFingerprint.classDef.methods.apply { diff --git a/patches/src/main/resources/seekbar/values/attrs.xml b/patches/src/main/resources/seekbar/values/attrs.xml deleted file mode 100644 index 2bf349f0d..000000000 --- a/patches/src/main/resources/seekbar/values/attrs.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file From 754b71959a0155413eb33cf1bdc2c8976eaca634 Mon Sep 17 00:00:00 2001 From: Lassie111 <125142449+Lassie111@users.noreply.github.com> Date: Wed, 22 Oct 2025 19:50:10 +0300 Subject: [PATCH 11/20] fix(Google Photos - Spoof features): Add support for Pixel 10 devices (#6161) --- .../patches/googlephotos/misc/features/SpoofFeaturesPatch.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt index 4c0be2b77..db6158d27 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofFeaturesPatch.kt @@ -47,6 +47,7 @@ val spoofFeaturesPatch = bytecodePatch( "com.google.android.feature.PIXEL_2024_MIDYEAR_EXPERIENCE", "com.google.android.feature.PIXEL_2024_EXPERIENCE", "com.google.android.feature.PIXEL_2025_MIDYEAR_EXPERIENCE", + "com.google.android.feature.PIXEL_2025_EXPERIENCE", ), title = "Features to disable", description = "Google Pixel exclusive features to disable." + From 7283b93cead1f4d9f9ba2048d9f979412a8f3c57 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 22 Oct 2025 16:53:15 +0000 Subject: [PATCH 12/20] chore: Release v5.44.0-dev.2 [skip ci] # [5.44.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.1...v5.44.0-dev.2) (2025-10-22) ### Bug Fixes * **Google Photos - Spoof features:** Add support for Pixel 10 devices ([#6161](https://github.com/ReVanced/revanced-patches/issues/6161)) ([754b719](https://github.com/ReVanced/revanced-patches/commit/754b71959a0155413eb33cf1bdc2c8976eaca634)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7b15246d..e67c43375 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.44.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.1...v5.44.0-dev.2) (2025-10-22) + + +### Bug Fixes + +* **Google Photos - Spoof features:** Add support for Pixel 10 devices ([#6161](https://github.com/ReVanced/revanced-patches/issues/6161)) ([754b719](https://github.com/ReVanced/revanced-patches/commit/754b71959a0155413eb33cf1bdc2c8976eaca634)) + # [5.44.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.43.2-dev.3...v5.44.0-dev.1) (2025-10-22) diff --git a/gradle.properties b/gradle.properties index a5b833989..08bb2c7ce 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.44.0-dev.1 +version = 5.44.0-dev.2 From 08baa19b4a62e62bd103d177c3f4454de199cf16 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 23 Oct 2025 00:21:30 +0400 Subject: [PATCH 13/20] feat(Duolingo - Enable debug menu): Support latest app target (#6163) --- .../duolingo/debug/EnableDebugMenuPatch.kt | 31 ++++++++++------- .../patches/duolingo/debug/Fingerprints.kt | 33 ++++++++++++------- 2 files changed, 41 insertions(+), 23 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt index 833f9dd7d..a507352e8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt @@ -1,26 +1,35 @@ package app.revanced.patches.duolingo.debug -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import app.revanced.util.returnEarly +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Suppress("unused") val enableDebugMenuPatch = bytecodePatch( name = "Enable debug menu", - use = false, + use = false ) { - compatibleWith("com.duolingo"("5.158.4")) + compatibleWith("com.duolingo") execute { - initializeBuildConfigProviderFingerprint.method.apply { - val insertIndex = initializeBuildConfigProviderFingerprint.patternMatch!!.startIndex - val register = getInstruction(insertIndex).registerA + // It seems all categories are allowed on release. Force this on anyway. + debugCategoryAllowOnReleaseBuildsFingerprint.method.returnEarly(true) - addInstructions( - insertIndex, - "const/4 v$register, 0x1", - ) + // Change build config debug build flag. + buildConfigProviderConstructorFingerprint.match( + buildConfigProviderToStringFingerprint.classDef + ).let { + val index = it.patternMatch!!.startIndex + + it.method.apply { + val register = getInstruction(index).registerA + addInstruction( + index + 1, + "const/4 v$register, 0x1" + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt index 543e40b43..c3d663c83 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt @@ -4,16 +4,25 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -/** - * The `BuildConfigProvider` class has two booleans: - * - * - `isChina`: (usually) compares "play" with "china"...except for builds in China - * - `isDebug`: compares "release" with "debug" <-- we want to force this to `true` - */ - -internal val initializeBuildConfigProviderFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - opcodes(Opcode.IPUT_BOOLEAN) - strings("debug", "release", "china") +internal val debugCategoryAllowOnReleaseBuildsFingerprint = fingerprint { + returns("Z") + parameters() + custom { method, classDef -> + method.name == "getAllowOnReleaseBuilds" && classDef.type == "Lcom/duolingo/debug/DebugCategory;" + } +} + +internal val buildConfigProviderConstructorFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + parameters() + opcodes(Opcode.CONST_4) +} + +internal val buildConfigProviderToStringFingerprint = fingerprint { + parameters() + returns("Ljava/lang/String;") + strings("BuildConfigProvider(") // Partial string match. + custom { method, _ -> + method.name == "toString" + } } From a2aa9cac2739ccdcba54b849822ae9c99b6cb11b Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 22 Oct 2025 20:24:37 +0000 Subject: [PATCH 14/20] chore: Release v5.44.0-dev.3 [skip ci] # [5.44.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.2...v5.44.0-dev.3) (2025-10-22) ### Features * **Duolingo - Enable debug menu:** Support latest app target ([#6163](https://github.com/ReVanced/revanced-patches/issues/6163)) ([08baa19](https://github.com/ReVanced/revanced-patches/commit/08baa19b4a62e62bd103d177c3f4454de199cf16)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e67c43375..0d5a1a4ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.44.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.2...v5.44.0-dev.3) (2025-10-22) + + +### Features + +* **Duolingo - Enable debug menu:** Support latest app target ([#6163](https://github.com/ReVanced/revanced-patches/issues/6163)) ([08baa19](https://github.com/ReVanced/revanced-patches/commit/08baa19b4a62e62bd103d177c3f4454de199cf16)) + # [5.44.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.1...v5.44.0-dev.2) (2025-10-22) diff --git a/gradle.properties b/gradle.properties index 08bb2c7ce..9f1b9a4dc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.44.0-dev.2 +version = 5.44.0-dev.3 From 876d7a6b03a8efcef8a33035ac31bd0214f82b19 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 24 Oct 2025 09:18:20 +0400 Subject: [PATCH 15/20] chore(X / Twitter - Change link sharing domain): Add disclaimer to description --- .../patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt index 1a2c99f59..e69a44965 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt @@ -64,7 +64,7 @@ internal val changeLinkSharingDomainResourcePatch = resourcePatch { @Suppress("unused") val changeLinkSharingDomainPatch = bytecodePatch( name = PATCH_NAME_CHANGE_LINK_SHARING_DOMAIN, - description = PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN, + description = "$PATCH_DESCRIPTION_CHANGE_LINK_SHARING_DOMAIN Including this patch can prevent making posts that quote other posts.", use = false ) { dependsOn( From 3466d9d210a7d2bf9e72d71d5e47eabf62dad51c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Oct 2025 09:19:08 +0400 Subject: [PATCH 16/20] chore: Sync translations (#6172) --- .../addresources/values-az-rAZ/strings.xml | 20 +- .../addresources/values-ga-rIE/strings.xml | 496 +++++++++--------- 2 files changed, 258 insertions(+), 258 deletions(-) diff --git a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml index 5c3bd1b87..adf2063f5 100644 --- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml +++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml @@ -218,9 +218,9 @@ Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlum İcma elanların gizlət İcma elanları gizlədilib İcma elanları göstərilir - Yığcam etiketləri gizlət - Yığcam etiketlər gizlidir - Yığcam etiketlər göstərilir + Yığcam afişaları gizlət + Yığcam afişalar gizlidir + Yığcam afişalar görünür İanə qutusunu gizlət İanə qutusu gizlidir İanə qutusu göstərilir @@ -471,9 +471,9 @@ Məhdudiyyətlər Yaradıcı mağaza bölümün gizlət Yaradıcı alış-veriş cərgəsi video oynadıcı altında gizlidir Yaradıcı alış-veriş cərgəsi video oynadıcı altında görünür - Son ekran mağaza etiketini gizlət - Son ekran alış-veriş etiketi gizlədilib - Son ekran alış-veriş etiketi görünür + Son ekran mağaza afişasın gizlət + Son ekran mağaza afişası gizlidir + Son ekran mağaza afişası görünür Tam ekran reklamlarını gizlət "Tam ekran reklamları gizlidir @@ -484,9 +484,9 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur" Ümumi reklamları gizlət Ümumi reklamlar gizlidir Ümumi reklamlar göstərilir - Məhsul etiketlərini gizlət - Məhsul etiketləri gizlədilir - Məhsul etiketləri göstərilir + Məhsul afişaların gizlət + Məhsul afişaları gizlədilir + Məhsul afişaları görünür Ödənişli tanıtım etiketini gizlət Ödənişli reklam etiketi gizlədilib Ödənişli reklam etiketi göstərilir @@ -496,7 +496,7 @@ Bu xüsusiyyət yalnız köhnə cihazlar üçün mövcuddur" Alış-veriş linklərini gizlət Alış-veriş linkləri video təsvirdə gizlidir Alış-veriş linkləri video təsvirdə görünür - “Məhsullara baxın” panelin gizlət + “Məhsullara baxın” afişasın gizlət Məhsullara baxış etiketi video örtüyündə gizlidir Məhsullara baxış etiketi video örtüyündə görünür Veb axtarış nəticələrini gizlət diff --git a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml index bc3ebfd57..ff9a063ad 100644 --- a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml +++ b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml @@ -756,7 +756,7 @@ Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur a Taispeántar roghchlár físe lúb Folaigh modh comhthimpeallach - Tá roghchlár mód chomhthimpeallach + Tá roghchlár mód comhthimpeallach i bhfolach Taispeántar roghchlár mód comhthimpeallach Folaigh toirt cobhsaí Taispeántar roghchlár toirte cobhsaí @@ -764,7 +764,7 @@ Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur a Folaigh Cabhair & aiseolas Cabhair & Tá an roghchlár aiseolais i bhfolach - Cabhair & Taispeántar roghchlár aiseolais + Taispeántar roghchlár Cabhrach & Aiseolais Folaigh luas athsheinm Tá roghchlár luas athsheinm i bhfolach @@ -773,11 +773,11 @@ Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur a This menu only appears for some videos. Translate the name normally if the menu cannot be found. --> Folaigh Tuilleadh eolais Tá tuilleadh eolais i bhfolach - Taispeántar roghchlár níos mó faisnéise + Taispeántar roghchlár tuilleadh eolais Folaigh scáileán Glas Tá roghchlár scáileán glas i bhfolach - Taispeántar roghchlár scáileáin glas + Taispeántar roghchlár an scáileáin ghlasála Folaigh Rian Fuaime Tá roghchlár rian fuaime i bhfolach @@ -788,32 +788,32 @@ Mura dtagann aon athrú ar an socrú seo, bain triail as mód Incognito a chur a Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhréige' go iPadOS" Folaigh Watch i VR - Tá faire i roghchlár VR i bhfolach - Taispeántar an faire sa roghchlár VR + Tá an roghchlár Féach i VR i bhfolach + Taispeántar an roghchlár Féach i VR Folaigh roghchlár cáilíocht físe Tá roghchlár cháilíocht na físeáin i bhfolach - Tá roghchlár cháilíocht na físeáin ar taispeáint + Taispeántar roghchlár cáilíochta físe Folaigh buntásc roghchlár cáilíochta físe - Tá buntásc an roghchláir cáilíochta físeáin folaithe + Tá buntásc roghchláir cáilíochta físe i bhfolach Taispeántar buntásc roghchlár cáilíochta físeáin - Folaigh cnaipe an Uathoimh - Tá cnaipe Autoplay i bhfolach + Folaigh an cnaipe Uath-imirt + Tá an cnaipe uath-sheinm i bhfolach Taispeántar cnaipe Autoplay - Folaigh cnaipe na dTeidil + Folaigh cnaipe fotheidil Tá cnaipe fotheidil i bhfolach Taispeántar cnaipe fotheidil - Folaigh cnaipe an Chasta - Tá cnaipe teilgthe i bhfolach - Taispeántar cnaipe teilgthe + Folaigh cnaipe Cast + Tá cnaipe Cast i bhfolach + Taispeántar cnaipe Cast Folaigh cúlra rialuithe an imreora Tá cúlra rialuithe an imreora i bhfolach Taispeántar cúlra rialuithe an imreora - Folaigh Cnaipí Roimhe & Ar Aghaidh - Tá cnaipí i bhfolach - Taispeántar cnaipí + Folaigh cnaipí Roimhe Seo & Ar Aghaidh + Tá cnaipí Roimhe Seo & Ar Aghaidh i bhfolach + Taispeántar cnaipí Roimhe Seo & Ar Aghaidh Folaigh cártaí scáileáin deireadh @@ -821,7 +821,7 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr Taispeántar cártaí scáileáin deireadh - Díchumasaigh mód Timpeallachta i scáileán iomlán + Díchumasaigh mód comhthimpeallach i lánscáileán Díchumasaíodh mód comhthimpeallach Mód comhthimpeallach cumasaithe @@ -831,8 +831,8 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr Taispeántar cártaí faisnéise - Díchumasaigh beochan uimhreacha - Níl uimhreacha rollta beoite + Díchumasaigh beochana uimhreacha rollta + Ní bhíonn uimhreacha rollta beoite Tá uimhreacha rollta beoite @@ -840,9 +840,9 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr Tá barra cuardaigh seinnteoir físe i bhfolach Taispeántar barra cuardaigh an t-imreoir físeán - Folaigh barra cuardaigh mionsamhlaí físeáin - Tá barra cuardaigh mionsamhlaí físeáin i bhfolach - Tá barra cuardaigh mionsamhlaí físeáin taispeánta + Folaigh barra cuardaigh mionsamhlacha físeáin + Tá barra cuardaigh mionsamhlacha físeáin i bhfolach + Taispeántar barra cuardaigh mionsamhlacha físe Shorts seinnteoir @@ -852,91 +852,91 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr I bhfolach sa fhotha Baile agus físeáin ghaolmhara Taispeánta sa fhotha Baile agus físeáin ghaolmhara Folaigh Shorts i dtorthaí cuardaigh - Folaithe i dtorthaí cuardaigh - Tá ar taispeáint sna torthaí cuardaigh + Folaigh i dtorthaí cuardaigh + Taispeáin i dtorthaí cuardaigh Folaigh Shorts sa fhotha Liostálaí I bhfolach sa fhotha Liostálaí Taispeánta sa fhotha Liostálaí Folaigh Shorts i stair féachana - Faolithe sa stair féachana + I bhfolach i stair féachana Taispeántar i stair féachana - Folaigh cnaipe \'Ceannaigh Super Thanks\' - Cnaipe \'Ceannaigh Super Thanks\' i bhfolach - Cnaipe \'Ceannaigh Super Thanks\' taispeánta - Folaigh cnaipe éifeachta - Tá an cnaipe Éifeacht i bhfolach - Tá an cnaipe Éifeacht taispeánta - Folaigh cnaipe \'Scáileán glas\' - Tá cnaipe an scáileáin glas i bhfolach - Taispeántar cnaipe an scáileáin glas - Folaigh an cnaipe hashtag - Tá cnaipe hashtag i bhfolach - Taispeántar an cnaipe hashtag + Folaigh cnaipe Ceannaigh Super Thanks + Cnaipe Ceannaigh Super Thanks i bhfolach + Taispeántar an cnaipe Ceannaigh Super Thanks + Folaigh cnaipe Éifeacht + Tá cnaipe Éifeacht i bhfolach + Taispeántar cnaipe Éifeacht + Folaigh cnaipe Scáileáin Ghlais + Tá cnaipe Scáileáin Ghlais i bhfolach + Taispeántar cnaipe Scáileáin Ghlais + Folaigh cnaipe Hashtag + Tá cnaipe Hashtag i bhfolach + Taispeántar cnaipe hashtag - Folaigh cnaipe \'Bí\' - Tá an cnaipe Bí i bhfolach - Taispeántar an cnaipe Bí isteach + Folaigh cnaipe Glac páirt + Tá cnaipe Glac páirt i bhfolach + Taispeántar cnaipe Glac páirt Folaigh lipéad suímh Tá lipéad suímh i bhfolach Taispeántar lipéad suímh - Folaigh cnaipe na bpostálacha nua - Tá cnaipe na bpostálacha nua i bhfolach - Taispeántar cnaipe na bpostálacha nua - Folaigh na cnaipí forleagan sosaithe - Tá cnaipí forleagtha sos i bhfolach - Taispeántar cnaipí forleagtha sos - Folaigh réamhamharc ar an nóta tráchta - Tá réamhamharc ar an nóta tráchta i bhfolach - Taispeántar réamhamharc ar an nóta tráchta - Folaigh cnaipe \'Sábháil ceol\' - Tá an cnaipe Sábháil ceoil i bhfolach - Taispeántar an cnaipe Sábháil ceoil + Folaigh Cnaipe Poist nua + Tá cnaipe Poist nua i bhfolach + Taispeántar cnaipe Poist nua + Folaigh cnaipí forleagan ar sos + Tá cnaipí forleagan ar sos i bhfolach + Taispeántar cnaipí forleagan ar sos + Folaigh trácht réamhamhairc + Tá an trácht réamhamhairc i bhfolach + Taispeántar réamhamharc tráchta + Folaigh an cnaipe Sábháil Ceoil + Tá an cnaipe sábháil ceoil i bhfolach + Taispeántar an cnaipe sábháil ceoil Folaigh moltaí cuardaigh Tá moltaí cuardaigh i bhfolach Taispeántar moltaí cuardaigh - Folaigh cnaipe an Siopa + Folaigh cnaipe Siopa Tá cnaipe siopa i bhfolach Taispeántar cnaipe siopa Folaigh greamáin Tá greamáin i bhfolach Taispeántar greamáin - Folaigh cnaipe \'Liostáil\' - Tá cnaipe liostáil i bhfolach - Taispeántar cnaipe liostáil + Folaigh cnaipe Liostáil + Tá an cnaipe Liostáil i bhfolach + Taispeántar cnaipe Liostáil Folaigh táirgí clibeáilte - Tá táirgí clib i bhfolach + Tá táirgí clibeáilte i bhfolach Taispeántar táirgí clibeáilte - Folaigh cnaipe \'Le teacht\' - Tá cnaipe atá le teacht i bhfolach - Taispeántar an cnaipe atá le teacht - Folaigh an cnaipe \"Úsáid an fhuaim seo\" - Tá an cnaipe \"Úsáid an fhuaim seo\" folaithe - Tá an cnaipe \"Úsáid an fhuaim seo\" taispeánta - Folaigh an cnaipe Bain úsáid as an teimpléad seo - Tá an cnaipe \"Úsáid an teimpléad seo\" folaithe - Taispeántar an cnaipe Bain úsáid as an teimpléad seo - Folaigh an beochan fhoinse cnaipe Cosúil - Cosúil le beochan tobair cnaipe i bhfolach - Taispeántar beochan tobair cnaipe cosúil le cnaipe - Folaigh cnaipe Cosúil - Tá an cnaipe Cosúil i bhfolach - Taispeántar an cnaipe Cosúil - Folaigh cnaipe Mhíchlú - Taispeántar an cnaipe nach dtaitníonn leis - Taispeántar an cnaipe nach dtaitníonn leis + Folaigh cnaipe Ag Teacht + Tá cnaipe Ag Teacht i bhfolach + Taispeántar an cnaipe Ag Teacht + Folaigh Úsáid an cnaipe fuaime seo + Tá an cnaipe Úsáid an fhuaim seo i bhfolach + Taispeántar an cnaipe Úsáid an fhuaim seo + Folaigh an cnaipe Úsáid an teimpléad seo + Tá an cnaipe Úsáid an teimpléid seo i bhfolach + Taispeántar an cnaipe Úsáid an teimpléid seo + Folaigh an cnaipe Is maith liom \'beochan tobair\' + Tá an cnaipe Is maith liom \'beochan tobair\' i bhfolach + Taispeántar an cnaipe Is maith liom \'beochan tobair\' + Folaigh cnaipe Is maith liom + Tá an cnaipe Is maith liom i bhfolach + Taispeántar an cnaipe Is maith liom + Folaigh cnaipe Ní maith liom + Tá an cnaipe Ní maith liom i bhfolach + Taispeántar an cnaipe Ní maith liom Folaigh cnaipe na Tuairimí Tá an cnaipe tuairimí i bhfolach Taispeántar cnaipe tuairimí - Folaigh cnaipe \'Roinn\' - Tá cnaipe Comhroinn i bhfolach - Taispeántar an cnaipe Comhroinn + Folaigh cnaipe Roinn + Tá cnaipe Roinn i bhfolach + Taispeántar an cnaipe Roinn - Folaigh cnaipe an Athchóiriú - Tá cnaipe Remix i bhfolach - Taispeántar cnaipe Remix - Folaigh an cnaipe fuaime + Folaigh cnaipe Athmheasc + Tá cnaipe Athmheasc i bhfolach + Taispeántar cnaipe Athmheasc + Folaigh cnaipe Fuaime Tá cnaipe fuaime i bhfolach Taispeántar cnaipe fuaime Folaigh painéal faisnéise @@ -947,29 +947,29 @@ Chun roghchlár an rian fuaime a thaispeáint, athraigh 'Sruthanna físeáin bhr Taispeántar barra cainéal Folaigh teideal físeáin Teideal físeáin i bhfolach - Teideal físeáin taispeánta + Taispeántar teideal físeáin Folaigh lipéad meiteashonraí fuaime Lipéad meiteashonraí fuaime i bhfolach - Lipéad meiteashonraí fuaime taispeánta + Taispeántar Lipéad meiteashonraí fuaime Folaigh lipéad nasc físeáin - Tá lipéad nasc físe i bhfolach - Taispeántar lipéad nasc físe + Tá lipéad nasc físeáin i bhfolach + Taispeántar lipéad nasc físeáin Folaigh barra nascleanúna Tá barra nascleanúna i bhfolach Taispeántar barra nascleanúna Folaigh físeán molta deireadh scáileáin - "Folaítear físeán molta deireadh scáileáin nuair a bhíonn an uathshein múchta + "Bíonn an físeán molta don scáileán deiridh i bhfolach nuair a bhíonn an t-uathsheinm múchta -Is féidir an uathshein a athrú i socruithe YouTube: -Socruithe → Athsheinm → Uathshein físeán eile" +Is féidir an t-uathsheinm a athrú i socruithe YouTube: +Socruithe → Athsheinm → Uathsheinm an chéad fhíseán eile" Taispeántar físeán molta deireadh scáileáin Folaigh forleagan físeáin ghaolmhara - Forleagan físeáin ghaolmhara i scáileán iomlán i bhfolach - Forleagan físeáin ghaolmhara i scáileán iomlán taispeánta + Tá forleagan físeáin ghaolmhara i lánscáileán i bhfolach + Taispeántar forleagan físeáin ghaolmhara i lánscáileán Folaigh stampa ama an fhíseáin @@ -977,85 +977,85 @@ Socruithe → Athsheinm → Uathshein físeán eile" Taispeántar stampa ama - Folaigh painéil aníos imreoir - Tá painéil aníos imreoirí i bhfolach - Taispeántar painéil aníos imreoirí + Folaigh painéil preab aníos imreoir + Tá painéil preab aníos imreoir i bhfolach + Taispeántar painéil preab aníos imreoir - Baint á âmód éadaéin iomlán lán iomlán ar deireadh na físe - Déchumasaithe - Portait - Téacscaoileadh - Portait agus téacscaoileadh + Scoir an mód lánscáileáin ag deireadh an fhíseáin + Díchumasaithe + Portráid + Tírdhreach + Portráid agus tírdhreach - Oscail físeáin i módh scáileáin iomláin portráit - Osclaítear físeáin i scáileán iomlán - Ní osclaítear físeáin i scáileán iomlán + Oscail físeáin i bportráid lánscáileáin + Osclaítear físeáin i mód lánscáileáin + Ní osclaítear físeáin i mód lánscáileáin - Trédhearcacht forleagtha an imreoir - Luach trédhearcachta idir 0-100, áit a bhfuil 0 trédhearcach - Caithfidh trédhearcacht forleagtha imreoirí a bheith idir 0-100 + Teimhneacht fhorleagan imreora + Luach teimhneachta idir 0-100, áit a seasann 0 do thrédhearcacht + Teimhneacht fhorleagan an imreora idir 0-100 - Ní dtaitníonn sé ar fáil go sealadach (API amuigh amach) - Ní dtaitníonn sé ar fáil (stádas %d) - Níl easaontais ar fáil (teorainn API an chliaint) - Ní dtaitníonn sé ar fáil (%s) + Níl dí-mhaith ar fáil faoi láthair (API am istigh) + Níl \'Ní maith liom\' ar fáil (stádas %d) + Níl \'Ní maith liom\' ar fáil (teorainn API cliaint) + Níl \'Ní maith liom\' ar fáil (%s) - Athlódáil físeán chun vótáil ag baint úsáide as Return YouTube Dislike + Athlódáil físeán vótáil trí Return YouTube Dislike - I bhfolach ag úinéir - Taispeántar rudaí nach dtaitníonn leo - Ní thaispeántar nach dtaitníonn leat - Taispeáin neamhthaitníonn ar Shorts - "Taispeántar easaontais ar Shorts + I bhfolach ag an úinéir + Taispeántar \'Ní maith liom\' + Ní thaispeántar \'Ní maith liom\' + Taispeáin \'ní maith liom\' ar Shorts + "Taispeántar 'Ní thaitníonn' ar Shorts -Srianadh: Bíodh easaontais gan teacht ar taispeáint sa mhodh incognito" - Ní thaispeántar easaontais ar Shorts - Ní dtaitníonn mar chéatadán - Taispeántar easaontais mar chéatadán - Taispeántar easaontais mar uimhir +Teorainn: B’fhéidir nach dtaispeánfar 'Ní thaitníonn' i mód incognito" + Ní thaispeántar \'Ní maith liom\' ar Shorts + \'Ní maith liom\' mar chéatadán + Taispeántar \'Ní thaitníonn\' mar chéatadán + Taispeántar \'Ní maith liom\' mar uimhir - Cnaipe Cosúil dlúth - Cosúil le cnaipe stíleáilte don leithead íosta - Cosúil le cnaipe stíleáilte don chuma is fearr - Taispeáin na rudaí is maith leis - Taispeánann físeáin le maith díchumasaithe comhaireamh measta maith - Ní thaispeántar maith measta + Cnaipe dlúth \'Is maith liom\' + Cnaipe \'Is maith liom\' stílithe don leithead íosta + Cnaipe \'Is maith liom\' stílithe le haghaidh cuma is fearr + Taispeáin \'is maith liom\' measta + Taispeánann físeáin a bhfuil \'is maith liom\' díchumasaithe iontu líon measta is maith leo + Ní thaispeántar líon na \'is maith leis\' measta Taispeáin tósta mura bhfuil API ar fáil Taispeántar tósta mura bhfuil Return YouTube Dislike ar fáil - Ní thaispeántar tóst mura bhfuil Return YouTube Dislike ar fáil - Soláthraíonn an API Return YouTube Dislike sonraí. Tapáil anseo chun tuilleadh a fhoghlaim + Ní thaispeántar tósta mura bhfuil Return YouTube Dislike ar fáil + Cuirtear sonraí ar fáil ag an Return YouTube Dislike API. Beartaíonn anseo le tuilleadh eolais a fháil - Staitisticí API returnieYouTubeDislike den fheiste seo + Staitisticí API ReturnYouTubeDislike an ghléis seo Am freagartha API, meán Am freagartha API, íosmhéid Am freagartha API, uasmhéid Am freagartha API, físeán deireanach Ní dtaitníonn sé ar fáil go sealadach - Teorainn ráta API cliant i bhfeidhm - Vótaí a fháil API, líon na nglaonna - Ní dhéantar aon ghlaonna líonra + Vótaí aisghabhála API, líon na nglaonna + Níor rinneadh aon ghlaonna líonra %d glaonna líonra déanta - Vótaí a fháil API, líon na n-imeachtaí ama - Níor aimsíodh aon ghlaonna líonra - Chuaigh %d glaoch líonra thar am + Vótaí aisghabhála API, líon na sosanna ama + Níl aon ghlaonna líonra imithe in éag + %d glaonna líonra imithe thar an am Teorainneacha ráta cliant API - Níor tharla aon teorainneacha rátaí cliant - Bhí teorainn ráta cliant ag teacht %d uair + Níor aimsíodh aon teorainneacha ráta cliant + Teorainn ráta cliant a bhíonn le fáil %d uair %d milleasoicind Cumasaigh barra cuardaigh leathan Tá barra cuardaigh leathan cumasaithe - Tá barra cuardaigh leathan míchumasaithe + Tá an barra cuardaigh leathan díchumasaithe Cumasaigh mionsamhlacha ardchaighdeáin Tá mionsamhlacha Seekbar ardchaighdeáin - Tá mionsamhlacha barra cuardaigh de chaighdeán meánach + Tá mionsamhlacha Seekbar ar chaighdeán meánach "Cuirfidh sé seo na miontaispeántais ar ais ar shruth beo nach bhfuil miontaispeántais cuardaigh acu. Úsáidfidh miontaispeántais cuardaigh an caighdeán céanna leis an bhfíseán reatha. @@ -1069,65 +1069,65 @@ Oibríonn an ghné seo is fearr le caighdeán físeáin 720p nó níos ísle agu Cumasaigh SponsorBlock Is córas sruthaíodh ó lucht an phobail é SponsorBlock le haghaidh codanna do-áisiúla físeán YouTube a leag thar n-ais Dealramh - Taispeáin cnaipe vótá - Taispeántar cnaipe vótála deigh - Ní thaispeántar cnaipe vótála deireadh - Úsáid leagan amach cearnógach + Taispeáin an cnaipe vótála + Taispeántar cnaipe vótála deighleog + Ní thaispeántar cnaipe vótála deighleog + Úsáid leagan amach cearnach Tá cnaipí agus rialtáin cearnach Tá cnaipí agus rialuithe cruinn - Úsáid cnaipe Dlúthscipeála - Sceip cnaipe stíleáilte don leithead íosta - Sceip cnaipe stíleáilte chun an chuma is fearr - Folaigh cnaipe Scipeála go huathoibríoch - Folaíonn cnaipe scipeáil tar éis cúpla soicindí - Taispeántar cnaipe Scipeála don deighleog iomlán - Fad an chnaipe scipeála - Cá fhad chun na cnaipí scipeála agus scipeála go dtí an aibhsigh a thaispeáint sula bhfolóidh siad go huathoibríoch - Taispeáin teast cealaigh scipeála - Taispeántar teast nuair a scipeáiltear deighleog go huathoibríoch. Tapáil an fógra teast chun an scipeáil a chealú - Ní thaispeántar an tóstas - Fad an tóstais scipeála - Cá fhad chun an fógra dísciption a thaispeáint + Úsáid an cnaipe Scipeáil dlúth + Cnaipe Scipeáil stílithe don leithead íosta + Cnaipe Scipeáil stílithe le haghaidh an chuma is fearr + Folaigh an cnaipe Scipeáil go huathoibríoch + Folaítear an cnaipe Scipeáil tar éis cúpla soicind + Taispeántar an cnaipe Scipeáil don deighleog iomlán + Fad an chnaipe Scipeáil + Cá fhad a thaispeánfar na cnaipí scipeáil agus scipeáil chun aibhsiú sula bhfolachar go huathoibríoch iad + Taispeáin an tósta cealaithe scipeáilte + Taispeántar tósta nuair a scipeáiltear deighleog go huathoibríoch. Tapáil an fógra tósta chun an scipeáil a chealú + Ní thaispeántar tósta + Scipeáil fad an tósta + Cá fhad a thaispeántar an tósta cealaithe scipeála 1 soicind 2 soicind 3 soicind 4 soicind 5 soicind 6 soicind - 7 soicindí - 8 soicindí - 9 soicindí - 10 soicindí - Taispeáin fad físeáin gan codanna + 7 soicind + 8 soicind + 9 soicind + 10 soicind + Taispeáin fad an fhíseáin gan deighleog Taispeántar fad an fhíseáin lúide na deighleoga uile ar an mbarra cuardaigh Taispeántar fad físe iomlán Deighleoga nua a chruthú Taispeáin cnaipe Cruthaigh deighleog nua - Taispeántar cnaipe deighleog nua Cruthaigh - Ní thaispeántar cnaipe deighleog nua Cruthaigh + Taispeántar an cnaipe cruthaigh deighleog nua + Ní thaispeántar an cnaipe cruthaigh deighleog nua Coigeartaigh céim deighleog nua Líon na milleasoicind a ghluaiseann na cnaipí coigeartaithe ama nuair a bhíonn teascáin nua á gcruthú Caithfidh luach a bheith ina uimhir dheimhneach - Féach treoirlín + Féach ar threoirlínte Tá rialacha agus leideanna i dtreoirlínte chun deighleoga nua Lean na treoirlínte - Léigh na treoirlínte SponsorBlock sula gcruthóidh tú + Léigh treoirlínte SponsorBlock sula gcruthaíonn tú deighleoga nua Léigh cheana féin Taispeáin dom Ginearálta Taispeáin tósta mura bhfuil API ar fáil Taispeántar tósta mura bhfuil SponsorBlock ar fáil Ní thaispeántar tósta mura bhfuil SponsorBlock ar fáil - Cumasaigh scip-rianú comhairimh - Ligeann sí do chlár ceannairí SponsorBlock cá mhéad ama a shábháiltear. Seoltar teachtaireacht chuig an gclár ceannairí gach uair a fhágtar mírlíne + Cumasaigh rianú comhaireamh scipeála + Cuireann sé ar an eolas é don chlár ceannaireachta SponsorBlock cé mhéad ama a shábháiltear. Seoltar teachtaireacht chuig an gclár ceannaireachta gach uair a scipeáiltear deighleog Níl rianú comhaireamh scipeála cumasaithe Fad íosta deighleog Ní thaispeánfar ná ní scipeánfar deighleoga níos giorra ná an luach seo (i soicindí) Fad ama neamhbhailí - Do id úsáideora príobháideach + D\'aitheantas úsáideora príobháideach Ba cheart é seo a choinneáil príobháideach. Is cosúil le pasfhocal é seo agus níor cheart é a roinnt le haon duine. Má tá sé seo ag duine, is féidir leo aithris a dhéanamh ort - Caithfidh id úsáideora príobháideach a bheith 30 carachtar ar a laghad + Caithfidh Id príobháideach a bheith ≥30 carachtar Athraigh URL API An seoladh a úsáideann SponsorBlock chun glaonna a dhéanamh ar an bhfreastalaí Athshocrú URL API @@ -1148,75 +1148,75 @@ Is cosúil le pasfhocal é do ID úsáideora agus níor cheart é a roinnt riamh Athraigh iompar deighleog Urraitheoir Ardú céime íoctha, atreoruithe íoctha agus fógraí díreacha Ní le haghaidh féin-chur chun cinn nó tuairimí saor in aisce do chúisea/cruthaitheoirí/láithreáin ghréasáin agus táirgí is maith leo - Neamhíocta/Féin-Chur Chun Cinn - Cosúil le Fear gnótha ach amháin le haghaidh cur chun cinn neamhíoctha nó féin-thacaíochta. Áirítear roinntí faoi earraí, bronntanais, nó faisnéis faoi cé a oibrigh siad le chéile + Neamhíoctha/Féin-chur chun cinn + Cosúil le hUrraitheoir ach amháin i gcás neamhíoctha nó féin-chur chun cinn. Áirítear leis rannóga faoi earraí, síntiúis nó faisnéis faoi cé leis ar chomhoibrigh siad Meabhrúchán Idirghníomhaíochta (Liostáil) - Meabhrúchán gairid ar mhaith leat, liostáil leo nó iad a leanúint i lár an ábhair. Má tá sé fada nó thart ar rud éigin ar leith, ba chóir é a chur chun cinn féin + Meabhrúchán gearr chun iad a thaitin, liostáil nó leanúint i lár ábhair. Más fada é nó má bhaineann sé le rud éigin ar leith, ba chóir é a bheith faoi fhéin-chur chun cinn ina ionad sin Aibhsigh An chuid den fhíseán atá ag cuardach mórchuid na ndaoine - Beochan Idirmheán/Intro + Beochan Eatramh / Réamhrá Eatraimh gan ábhar iarbhír. D\'fhéadfadh sé a bheith ina sos, fráma statach, nó beochan athrá. Ní chuimsíonn sé aistrithe ina bhfuil faisnéis - Cártaí Deiridh / Creidiúintí + Cártaí Deiridh / Creidmheasanna Creidmheasanna nó nuair a thaispeántar na cártaí YouTube. Ní le haghaidh conclúidí le faisnéis - Hook / Beannachtaí + Crúca / Beannachtaí Leantóirí inste don fhíseán atá le teacht, beannachtaí agus slán. Ní chuimsíonn sé ailt a chuireann ábhar breise leis Réamhamharc / Achoimre Bailiúchán gearrthóga a thaispeánann cad atá ag teacht suas nó cad a tharla san fhíseán nó i bhfíseáin eile de shraith, áit a ndéantar gach faisnéis arís eile in áit eile Seachrán / Scéalta Grinn Radhairc nó scéalta grinn imeallacha nach gá chun príomhábhar an fhíseáin a thuiscint. Níor cheart go n-áireofaí anseo deighleoga a sholáthraíonn comhthéacs nó sonraí cúlra Ceol: Rannóg Neamh-Cheoil - Le húsáid amháin i bhfíseáin ceoil. Rannóga d\'fhíseáin ceoil gan ceol, nach bhfuil clúdaithe ag catagóir eile cheana féin - Scip + Le húsáid i bhfíseáin cheoil amháin. Codanna de fhíseáin cheoil gan cheol, nach bhfuil clúdaithe cheana féin ag catagóir eile + Scipeáil Aibhsigh - Scip urraitheoir - Scip réamhfhógrán - Scip idirghníomhú - Scip go dtí an buaicphointe - Scip intreoir - Scip idirghabháil - Scip idirghabháil - Scip an forchríoch + Scipeáil urraitheoir + Scipeáil promóisean + Scipeáil idirghníomhú + Scipeáil go dtí aird a tharraingt + Scipeáil réamhrá + Scipeáil briseadh + Scipeáil briseadh + Scipeáil an chuid deiridh Scipeáil crúca - Scip réamhamharc - Scip réamhamharc - Scip an achoimre - Scipeáil imeall - Scip neamh-cheol - Scip deighleog - Urra scipeáilte - Féin-chur chun cinn scipeáilte - Meabhrúchán ciapach scipeáilte - Scipeáilte chun aird a tharraingt - Réamhrá scipeáilte - Idirmheas scipeáilte - Idirmheas scipeáilte - Scipeáilte an forchríoch - Crúca scipeáilte - Scipeáilte an réamhléiriú - Scipeáilte an réamhléiriú - Athbhreithniú scipeáilte - Imeall scipeáilte - Scaoileadh rannán neamh-cheoil + Scipeáil réamhamharc + Scipeáil réamhamharc + Scipeáil achoimre + Scipeáil tadhlaí + Scipeáil neamh-cheol + Scipeáil deighleog + Scipeáilte urraitheoir + Scipeáilte féin-chur chun cinn + Scipeáilte meabhrúchán cráite + Scipeáilte aird a tharraingt + Scipeáilte réamhrá + Scipeáilte briseadh + Scipeáilte briseadh + Scipeáilte an chuid deiridh + Scipeáilte crúca + Scipeáilte réamhamharc + Scipeáilte réamhamharc + Achoimre scipeáilte + Tadhlaí scipeáilte + Scipeáladh cuid nach ceolmhar í Deighleog gan curtha isteach scipeáilte - Scipeáilte go leor deighleoga - Scip go huathoibríoch - Scip go huathoibríoch uair amháin - Taispeáin cnaipe Scipeála + Scipeáilte iomadúil deighleoga + Scipeáil go huathoibríoch + Scipeáil go huathoibríoch uair amháin + Taispeáin cnaipe Scipeáil Taispeáin i mbarra lorg Díchumasaigh Ní féidir deighleog a chur isteach: %s Tá SponsorBlock síos go sealadach Ní féidir deighleog a chur isteach (stádas: %1$d %2$s) - Ní féidir an chuid a chur isteach. Teoranta (ró-iomadú ó úsáideoir nó ó IP céanna) + Ní féidir deighleog a chur isteach. Ráta Teoranta (an iomarca ón úsáideoir nó IP céanna) Ní féidir an deighleog a chur isteach: %s - "Ní féidir an chuid a chur isteach. + "Ní féidir deighleog a chur isteach. Tá sé ann cheana féin" - Déileog curtha isteach go rathúil + Cuireadh an deighleog isteach go rathúil - Níl SponsorBlock ar fáil go sealadach (API amuigh amach) + Níl SponsorBlock ar fáil go sealadach (API am istigh) Níl SponsorBlock ar fáil go sealadach (stádas %d) Níl SponsorBlock ar fáil go sealadach - Ní féidir vótáil a dhéanamh don deighleog (API amuigh amach) + Ní féidir vótáil don deighleog (API am istigh) Ní féidir vótáil a dhéanamh don deighleog (stádas: %1$d %2$s) Ní féidir vótáil a dhéanamh don deighleog: %s Vótáil suas @@ -1226,7 +1226,7 @@ Tá sé ann cheana féin" %1$s go %2$s Roghnaigh catagóir deighleog - Tá catagóir díchumasaithe i socruithe. Cumasaigh catagóir a chur isteach. + Catagóir díchumasaithe. Cumasaigh í le cur isteach. Deighleog nua SponsorBlock Socraigh %s mar thús nó deireadh deighleog nua? Tosaigh @@ -1235,36 +1235,36 @@ Tá sé ann cheana féin" Am a thosaíonn an deighleog ag Am a chríochnaíonn an deighleog ag An bhfuil na hamanna ceart? - "Tagann an clipe + "Tá an deighleog ó %1$s -gu chuig +go %2$s (%3$s) -Maithe chun cur isteach?" +Réidh le cur isteach?" Caithfidh an tús a bheith roimh an deireadh Marcáil dhá shuíomh ar an mbarra ama ar dtús - Réamhamharc ar an deighleog, agus cinntigh go scipeánann sé - Cuir uainiú deighleog in eagar + Féach ar an deighleog agus cinntigh léim réidh + Cuir am an deighleog in eagar de láimh Ar mhaith leat an t-am a chur in eagar do thús nó deireadh an deighleog? Am neamhbhailí tugtha Staitisticí - Níl stats ar fáil go sealadach (tá API síos) - Á lódáil... - Tá SponsorBlock míchumasaithe + Níl staitisticí ar fáil faoi láthair (tá an API síos) + Ag lódáil... + Tá SponsorBlock díchumasaithe D\'ainm úsáideora: <b>%s</b> Tapáil anseo chun d\'ainm úsáideora a athrú Ní féidir ainm úsáideora a athrú: Stádas: %1$d %2$s - Athraíodh ainm úsáideora - Tá do chlú <b>%.2f</b> + Athraíodh ainm úsáideora go rathúil + Is é do chlú <b>%.2f</b> Chruthaigh tú <b>%s</b> deighleoga - Tapáil anseo chun do mhíreanna a fheiceáil + Tapáil anseo chun do dheighleoga a fheiceáil Clár ceannairí SponsorBlock Tá daoine sábháilte agat ó <b>%s</b> deighleoga - Tapáil anseo chun na stats domhanda agus na rannpháirtithe is fearr a fheiceáil + Tapáil anseo chun na staitisticí domhanda agus na rannpháirtithe is fearr a fheiceáil Sin é <b>%s</b> dá saol.<br>Tapáil anseo chun an clár ceannairí a fheiceáil Rinne tú scipeáil ar <b>%s</b> deighleoga Sin é <b>%s</b> @@ -1275,36 +1275,36 @@ Maithe chun cur isteach?" Teimhneacht: Dath: Maidir - Soláthraíonn an API SponsorBlock sonraí. Tapáil anseo chun níos mó a fhoghlaim agus íoslódálacha a fheiceáil d\'ardáin eile + Cuirtear sonraí ar fáil ag API SponsorBlock. Tapáil anseo chun tuilleadh eolais a fháil agus íoslódálacha le haghaidh ardáin eile a fheiceáil - Fábos fóirmeanna foirmiúin - Réamhshocrúch - Fón - Táibhléad + Fachtóir foirme leagan amach + Réamhshocrú + Guthán + Táibléad Gluaisteán - "Áirítear ar na hathruithe: + "Áirítear leis na hathruithe: -Leagan amach an táibléid -• Tá postálacha pobail i bhfolach +Leagan amach táibléid +• Tá poist phobail i bhfolach -Leagan amach feithicleach -• Osclaítear Shorts sa ghnáthsheinnteoir -• Eagraítear an fotha de réir topaicí agus bealaí" +Leagan amach gluaisteán +• Gearrscannáin oscailte sa ghnáth-imreoir +• Tá an fotha eagraithe de réir topaicí agus bealaí" - Leagan aip spoof - Leagan spoofed - Leagan gan bhfoláiste - "Déanfar leagan an aip a spoofadh go leagan níos sine de YouTube. + Leagan aip bréige + Leagan bréagach + Leagan gan bréag + "Déanfar leagan aip a bréagach chuig leagan níos sine de YouTube. -Athróidh sé seo cuma agus gnéithe an aip, ach d'fhéadfadh fo-iarsmaí anaithnid a bheith ann. +Athróidh sé seo cuma agus gnéithe na haipe, ach d'fhéadfadh fo-iarsmaí anaithnide tarlú. -Má dhiúltaítear é níos déanaí, moltar sonraí an aip a ghlanadh chun buganna UI a chosc." - Sprioc leagan aip spoof - 20.13.41 - Cuir an barra gníomhaíochta físe neamhchomhbhrúite ar ais - 20.05.46 - Athchóirigh feidhmiúlacht tras-scríbhinne - 19.35.36 - Athchóirigh sean-deilbhíní imreoir Shorts +Má mhúchtar é níos déanaí, moltar sonraí na haipe a ghlanadh chun fabhtanna UI a chosc." + Sprioc leagan aip bréagach + 20.13.41 - Barra gníomhaíochta físe neamh-fhillte a athchóiriú + 20.05.46 - Athchóirigh feidhmiúlacht an trascríbhinn + 19.35.36 - Athchóirigh deilbhíní sean-imreoir Shorts 19.01.34 - Athchóirigh deilbhíní nascleanúna sean From 7a53f8f62dce9dfbca07d1789c45c6a7f356495c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 24 Oct 2025 09:25:44 +0400 Subject: [PATCH 17/20] chore(YouTube Music): Simplify fingerprint for upcoming app versions --- .../revanced/patches/shared/misc/audio/Fingerprints.kt | 9 +++------ .../patches/shared/misc/audio/ForceOriginalAudioPatch.kt | 2 +- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt index 78cf1f284..6d6b0b662 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt @@ -1,7 +1,7 @@ package app.revanced.patches.shared.misc.audio import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction +import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags internal val formatStreamModelToStringFingerprint = fingerprint { @@ -20,10 +20,7 @@ internal val formatStreamModelToStringFingerprint = fingerprint { internal const val AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG = 45666189L internal val selectAudioStreamFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("L") - custom { method, _ -> - method.parameters.size > 2 // Method has a large number of parameters and may change. - && method.containsLiteralInstruction(AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG) + literal { + AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt index 465ce8030..010a7143e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt @@ -34,7 +34,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = internal fun forceOriginalAudioPatch( block: BytecodePatchBuilder.() -> Unit = {}, executeBlock: BytecodePatchContext.() -> Unit = {}, - fixUseLocalizedAudioTrackFlag: () -> Boolean, + fixUseLocalizedAudioTrackFlag: BytecodePatchContext.() -> Boolean, mainActivityOnCreateFingerprint: Fingerprint, subclassExtensionClassDescriptor: String, preferenceScreen: BasePreferenceScreen.Screen From e7336d2ef361cc5d6fe6e8442b36d9cf1f542931 Mon Sep 17 00:00:00 2001 From: Pawloland <59684145+Pawloland@users.noreply.github.com> Date: Fri, 24 Oct 2025 07:27:12 +0200 Subject: [PATCH 18/20] feat: Add `Custom network security` patch (#6151) --- .../CustomCertificatesPatch.kt | 182 ++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt new file mode 100644 index 000000000..009758977 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/customcertificates/CustomCertificatesPatch.kt @@ -0,0 +1,182 @@ +package app.revanced.patches.all.misc.customcertificates + +import app.revanced.patcher.patch.PatchException +import app.revanced.patcher.patch.booleanOption +import app.revanced.patcher.patch.resourcePatch +import app.revanced.patcher.patch.stringsOption +import app.revanced.util.Utils.trimIndentMultiline +import app.revanced.util.getNode +import org.w3c.dom.Element +import java.io.File + + + + +val customNetworkSecurityPatch = resourcePatch( + name = "Custom network security", + description = "Allows trusting custom certificate authorities for a specific domain.", + use = false +) { + + val targetDomains by stringsOption( + key = "targetDomains", + title = "Target domains", + description = "List of domains to which the custom trust configuration will be applied (one domain per entry).", + default = listOf("example.com"), + required = true + ) + + val includeSubdomains by booleanOption( + key = "includeSubdomains", + title = "Include subdomains", + description = "Applies the configuration to all subdomains of the target domains.", + default = false, + required = true + ) + + val customCAFilePaths by stringsOption( + key = "customCAFilePaths", + title = "Custom CA file paths", + description = """ + List of paths to files in PEM or DER format (one file path per entry). + + Makes an app trust the provided custom certificate authorities (CAs), + for the specified domains, and if the option "Include Subdomains" is enabled then also the subdomains. + + + CA files will be bundled in res/raw/ of resulting APK + """.trimIndentMultiline(), + default = null, + required = false + ) + + val allowUserCerts by booleanOption( + key = "allowUserCerts", + title = "Trust user added CAs", + description = "Makes an app trust certificates from the Android user store for the specified domains, and if the option \"Include Subdomains\" is enabled then also the subdomains.", + + default = false, + required = true + ) + + val allowSystemCerts by booleanOption( + key = "allowSystemCerts", + title = "Trust system CAs", + description = "Makes an app trust certificates from the Android system store for the specified domains, and and if the option \"Include Subdomains\" is enabled then also the subdomains.", + + default = true, + required = true + ) + + val allowCleartextTraffic by booleanOption( + key = "allowCleartextTraffic", + title = "Allow cleartext traffic (HTTP)", + description = "Allows unencrypted HTTP traffic for the specified domains, and if \"Include Subdomains\" is enabled then also the subdomains.", + + default = false, + required = true + ) + + val overridePins by booleanOption( + key = "overridePins", + title = "Override certificate pinning", + description = "Overrides certificate pinning for the specified domains and their subdomains if the option \"Include Subdomains\" is enabled to allow inspecting app traffic via a proxy.", + + default = false, + required = true + ) + + fun generateNetworkSecurityConfig(): String { + val targetDomains = targetDomains ?: emptyList() + val includeSubdomains = includeSubdomains ?: false + val customCAFilePaths = customCAFilePaths ?: emptyList() + val allowUserCerts = allowUserCerts ?: false + val allowSystemCerts = allowSystemCerts ?: true + val allowCleartextTraffic = allowCleartextTraffic ?: false + val overridePins = overridePins ?: false + + val domainsXML = buildString { + targetDomains.forEach { + appendLine(""" $it""") + } + }.trimEnd() + + val trustAnchorsXML = buildString { + if (allowSystemCerts) { + appendLine(""" """) + } + if (allowUserCerts) { + appendLine(""" """) + } + customCAFilePaths.forEach { path -> + val fileName = path.substringAfterLast('/').substringBeforeLast('.') + appendLine(""" """) + } + } + + if (trustAnchorsXML.isBlank()) { + throw PatchException("At least one trust anchor (System, User, or Custom CA) must be enabled.") + } + + return """ + + + +$domainsXML + +${trustAnchorsXML.trimEnd()} + + + + """.trimIndent() + } + + + execute { + val nscFileNameBare = "network_security_config" + val resXmlDir = "res/xml" + val resRawDir = "res/raw" + val nscFileNameWithSuffix = "$nscFileNameBare.xml" + + + document("AndroidManifest.xml").use { document -> + val applicationNode = document.getNode("application") as Element + applicationNode.setAttribute("android:networkSecurityConfig", "@xml/$nscFileNameBare") + } + + + File(get(resXmlDir), nscFileNameWithSuffix).apply { + writeText(generateNetworkSecurityConfig()) + } + + + + for (customCAFilePath in customCAFilePaths ?: emptyList()) { + val file = File(customCAFilePath) + if (!file.exists()) { + throw PatchException( + "The custom CA file path cannot be found: " + + file.absolutePath + ) + } + + if (!file.isFile) { + throw PatchException( + "The custom CA file path must be a file: " + + file.absolutePath + ) + } + val caFileNameWithoutSuffix = customCAFilePath.substringAfterLast('/').substringBefore('.') + val caFile = File(customCAFilePath) + File( + get(resRawDir), + caFileNameWithoutSuffix + ).writeText( + caFile.readText() + ) + + } + + + } +} From 591e106098c6eff431b8b7ac7d985ce7373d701e Mon Sep 17 00:00:00 2001 From: hckrman101 Date: Fri, 24 Oct 2025 01:28:34 -0400 Subject: [PATCH 19/20] feat(Duolingo): Add `Skip energy recharge ads` patch (#6167) --- patches/api/patches.api | 4 +++ .../patches/duolingo/energy/Fingerprints.kt | 21 +++++++++++++ .../energy/SkipEnergyRechargeAdsPatch.kt | 31 +++++++++++++++++++ 3 files changed, 56 insertions(+) create mode 100644 patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index 20f74169a..1341b5ff8 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -184,6 +184,10 @@ public final class app/revanced/patches/duolingo/debug/EnableDebugMenuPatchKt { public static final fun getEnableDebugMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatchKt { + public static final fun getSkipEnergyRechargeAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatchKt { public static final fun getHideSponsoredStoriesPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt new file mode 100644 index 000000000..73dbcf304 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt @@ -0,0 +1,21 @@ +package app.revanced.patches.duolingo.energy + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode + +/** + * Matches the class found in [energyConfigToStringFingerprint]. + */ +internal val initializeEnergyConfigFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + opcodes(Opcode.RETURN_VOID) +} + +// Class name currently is not obfuscated but it may be in the future. +internal val energyConfigToStringFingerprint = fingerprint { + parameters() + returns("Ljava/lang/String;") + strings("EnergyConfig(", "maxEnergy=") // Partial string matches. + custom { method, _ -> method.name == "toString" } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt new file mode 100644 index 000000000..bec800f50 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/SkipEnergyRechargeAdsPatch.kt @@ -0,0 +1,31 @@ +package app.revanced.patches.duolingo.energy + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.findFieldFromToString + +@Suppress("unused") +val skipEnergyRechargeAdsPatch = bytecodePatch( + name = "Skip energy recharge ads", + description = "Skips watching ads to recharge energy." +) { + compatibleWith("com.duolingo") + + execute { + initializeEnergyConfigFingerprint + .match(energyConfigToStringFingerprint.classDef) + .method.apply { + val energyField = energyConfigToStringFingerprint.method + .findFieldFromToString("energy=") + val insertIndex = initializeEnergyConfigFingerprint.patternMatch!!.startIndex + + addInstructions( + insertIndex, + """ + const/16 v0, 99 + iput v0, p0, $energyField + """ + ) + } + } +} From b8c2ede2bf2397f0920ed358593834e37517d8ab Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 24 Oct 2025 05:32:12 +0000 Subject: [PATCH 20/20] chore: Release v5.44.0-dev.4 [skip ci] # [5.44.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.3...v5.44.0-dev.4) (2025-10-24) ### Features * Add `Custom network security` patch ([#6151](https://github.com/ReVanced/revanced-patches/issues/6151)) ([e7336d2](https://github.com/ReVanced/revanced-patches/commit/e7336d2ef361cc5d6fe6e8442b36d9cf1f542931)) * **Duolingo:** Add `Skip energy recharge ads` patch ([#6167](https://github.com/ReVanced/revanced-patches/issues/6167)) ([591e106](https://github.com/ReVanced/revanced-patches/commit/591e106098c6eff431b8b7ac7d985ce7373d701e)) --- CHANGELOG.md | 8 ++++++++ gradle.properties | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0d5a1a4ef..a4857ca84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,11 @@ +# [5.44.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.3...v5.44.0-dev.4) (2025-10-24) + + +### Features + +* Add `Custom network security` patch ([#6151](https://github.com/ReVanced/revanced-patches/issues/6151)) ([e7336d2](https://github.com/ReVanced/revanced-patches/commit/e7336d2ef361cc5d6fe6e8442b36d9cf1f542931)) +* **Duolingo:** Add `Skip energy recharge ads` patch ([#6167](https://github.com/ReVanced/revanced-patches/issues/6167)) ([591e106](https://github.com/ReVanced/revanced-patches/commit/591e106098c6eff431b8b7ac7d985ce7373d701e)) + # [5.44.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.44.0-dev.2...v5.44.0-dev.3) (2025-10-22) diff --git a/gradle.properties b/gradle.properties index 9f1b9a4dc..0c351eeb4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.jvmargs = -Xms512M -Xmx2048M org.gradle.parallel = true android.useAndroidX = true kotlin.code.style = official -version = 5.44.0-dev.3 +version = 5.44.0-dev.4