From b0440ad6af0e190e516974ce896dcc54c8d2e122 Mon Sep 17 00:00:00 2001 From: ByteEVM <155392541+ByteEVM@users.noreply.github.com> Date: Fri, 30 May 2025 22:51:12 +0200 Subject: [PATCH 01/21] feat(Proton Mail): Add `Remove free accounts limit` patch (#4970) Co-authored-by: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Co-authored-by: oSumAtrIX --- patches/api/patches.api | 4 ++++ .../account/RemoveFreeAccountsLimitPatch.kt | 21 +++++++++++++++++++ .../signature/RemoveSentFromSignaturePatch.kt | 2 +- 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 patches/src/main/kotlin/app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatch.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index 668e1072e..a96d4a6c9 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -448,6 +448,10 @@ public final class app/revanced/patches/primevideo/misc/permissions/RenamePermis public static final fun getRenamePermissionsPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } +public final class app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatchKt { + public static final fun getRemoveFreeAccountsLimitPatch ()Lapp/revanced/patcher/patch/ResourcePatch; +} + public final class app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatchKt { public static final fun getRemoveSentFromSignaturePatch ()Lapp/revanced/patcher/patch/ResourcePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatch.kt b/patches/src/main/kotlin/app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatch.kt new file mode 100644 index 000000000..473d8d400 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/protonmail/account/RemoveFreeAccountsLimitPatch.kt @@ -0,0 +1,21 @@ +package app.revanced.patches.protonmail.account + +import app.revanced.patcher.patch.resourcePatch +import app.revanced.util.findElementByAttributeValueOrThrow + +@Suppress("unused") +val removeFreeAccountsLimitPatch = resourcePatch( + name = "Remove free accounts limit", + description = "Removes the limit for maximum free accounts logged in.", +) { + compatibleWith("ch.protonmail.android") + + execute { + document("res/values/integers.xml").use { document -> + document.documentElement.childNodes.findElementByAttributeValueOrThrow( + "name", + "core_feature_auth_user_check_max_free_user_count", + ).textContent = Int.MAX_VALUE.toString() + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatch.kt index f3d2b2dd2..a59b8e7dd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/protonmail/signature/RemoveSentFromSignaturePatch.kt @@ -39,4 +39,4 @@ val removeSentFromSignaturePatch = resourcePatch( if (!foundString) throw PatchException("Could not find 'sent from' string in resources") } -} \ No newline at end of file +} From bbdee7690691fbad3f4db2a8dd000ae8f473d10a Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Fri, 30 May 2025 20:53:45 +0000 Subject: [PATCH 02/21] chore: Release v5.26.0-dev.1 [skip ci] # [5.26.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.25.0...v5.26.0-dev.1) (2025-05-30) ### Features * **Proton Mail:** Add `Remove free accounts limit` patch ([#4970](https://github.com/ReVanced/revanced-patches/issues/4970)) ([b0440ad](https://github.com/ReVanced/revanced-patches/commit/b0440ad6af0e190e516974ce896dcc54c8d2e122)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d86cb2408..53b85c931 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.26.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.25.0...v5.26.0-dev.1) (2025-05-30) + + +### Features + +* **Proton Mail:** Add `Remove free accounts limit` patch ([#4970](https://github.com/ReVanced/revanced-patches/issues/4970)) ([b0440ad](https://github.com/ReVanced/revanced-patches/commit/b0440ad6af0e190e516974ce896dcc54c8d2e122)) + # [5.25.0](https://github.com/ReVanced/revanced-patches/compare/v5.24.0...v5.25.0) (2025-05-29) diff --git a/gradle.properties b/gradle.properties index 39a0a93cf..1fff77370 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.25.0 +version = 5.26.0-dev.1 From 28a389a62f69b3a31053bb700c4db159229aadae Mon Sep 17 00:00:00 2001 From: ILoveOpenSourceApplications <117499019+ILoveOpenSourceApplications@users.noreply.github.com> Date: Sat, 31 May 2025 13:55:04 +0530 Subject: [PATCH 03/21] refactor: Make strings consistent (#5075) --- patches/api/patches.api | 1 + .../patches/all/misc/build/SpoofBuildInfoPatch.kt | 6 +++--- .../telephony/sim/spoof/SpoofSimCountryPatch.kt | 4 ++-- .../lightroom/misc/premium/UnlockPremiumPatch.kt | 2 +- .../layout/premiumicon/UnlockPremiumIconPatch.kt | 12 +++++++++--- .../misc/pairip/license/DisableLicenseCheckPatch.kt | 2 +- .../patches/spotify/misc/UnlockPremiumPatch.kt | 2 +- 7 files changed, 18 insertions(+), 11 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index a96d4a6c9..83e6c7afe 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -593,6 +593,7 @@ public final class app/revanced/patches/reddit/layout/disablescreenshotpopup/Dis public final class app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatchKt { public static final fun getUnlockPremiumIconPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun getUnlockPremiumIconsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } public final class app/revanced/patches/reddit/misc/extension/ExtensionPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/build/SpoofBuildInfoPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/build/SpoofBuildInfoPatch.kt index 7cfd385c6..aa4fbf3f8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/build/SpoofBuildInfoPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/build/SpoofBuildInfoPatch.kt @@ -7,7 +7,7 @@ import app.revanced.patcher.patch.stringOption @Suppress("unused") val spoofBuildInfoPatch = bytecodePatch( name = "Spoof build info", - description = "Spoof the information about the current build.", + description = "Spoofs the information about the current build.", use = false, ) { val board by stringOption( @@ -141,14 +141,14 @@ val spoofBuildInfoPatch = bytecodePatch( val socManufacturer by stringOption( key = "soc-manufacturer", default = null, - title = "SOC Manufacturer", + title = "SOC manufacturer", description = "The manufacturer of the device's primary system-on-chip.", ) val socModel by stringOption( key = "soc-model", default = null, - title = "SOC Model", + title = "SOC model", description = "The model name of the device's primary system-on-chip.", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimCountryPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimCountryPatch.kt index b50ccfc88..2f90b5ec3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimCountryPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/connectivity/telephony/sim/spoof/SpoofSimCountryPatch.kt @@ -36,12 +36,12 @@ val spoofSimCountryPatch = bytecodePatch( val networkCountryIso by isoCountryPatchOption( "networkCountryIso", - "Network ISO Country Code", + "Network ISO country code", ) val simCountryIso by isoCountryPatchOption( "simCountryIso", - "Sim ISO Country Code", + "SIM ISO country code", ) dependsOn( diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt index 4561cee41..8dc963a49 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") val unlockPremiumPatch = bytecodePatch( - name = "Unlock premium", + name = "Unlock Premium", ) { compatibleWith("com.adobe.lrmobile"("10.0.2")) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatch.kt index bde2b52b9..992ff27e5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatch.kt @@ -4,9 +4,9 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch @Suppress("unused") -val unlockPremiumIconPatch = bytecodePatch( - name = "Unlock premium Reddit icons", - description = "Unlocks the premium Reddit icons.", +val unlockPremiumIconsPatch = bytecodePatch( + name = "Unlock Premium icons", + description = "Unlocks the Reddit Premium icons.", ) { compatibleWith("com.reddit.frontpage") @@ -20,3 +20,9 @@ val unlockPremiumIconPatch = bytecodePatch( ) } } + +@Deprecated("Patch was renamed", ReplaceWith("unlockPremiumIconsPatch")) +@Suppress("unused") +val unlockPremiumIconPatch = bytecodePatch{ + dependsOn(unlockPremiumIconsPatch) +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatch.kt index 0eafad4e8..36a99f728 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatch.kt @@ -8,7 +8,7 @@ import java.util.logging.Logger @Suppress("unused") val disableLicenseCheckPatch = bytecodePatch( name = "Disable Pairip license check", - description = "Disable Play Integrity Protect (Pairip) client-side license check.", + description = "Disables Play Integrity API (Pairip) client-side license check.", use = false ) { diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/UnlockPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/UnlockPremiumPatch.kt index b34df2aac..3e16751ab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/UnlockPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/UnlockPremiumPatch.kt @@ -26,7 +26,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/ @Suppress("unused") val unlockPremiumPatch = bytecodePatch( - name = "Unlock Spotify Premium", + name = "Unlock Premium", description = "Unlocks Spotify Premium features. Server-sided features like downloading songs are still locked.", ) { compatibleWith("com.spotify.music") From 7af0c6f2d28ea8a86c32b529534532f6bb0b6d19 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 1 Jun 2025 08:58:37 +0200 Subject: [PATCH 04/21] chore: Sync translations (#5084) --- .../addresources/values-az-rAZ/strings.xml | 33 +++++ .../addresources/values-fi-rFI/strings.xml | 120 ++++++++++++------ .../addresources/values-iw-rIL/strings.xml | 64 +++++++++- .../addresources/values-ja-rJP/strings.xml | 28 ++-- .../addresources/values-ko-rKR/strings.xml | 16 +-- .../addresources/values-ru-rRU/strings.xml | 18 +-- .../addresources/values-sr-rCS/strings.xml | 4 +- .../addresources/values-sr-rSP/strings.xml | 8 +- .../addresources/values-tr-rTR/strings.xml | 14 +- 9 files changed, 220 insertions(+), 85 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 b8bb420df..847da8130 100644 --- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml +++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml @@ -35,6 +35,8 @@ Second \"item\" text" Tənzimləmələr Davam etmək istəyirsiniz? Sıfırla + Rəngi sıfırla + Yanlış rəng Yenilə və yenidən başlat Yenidən başlat İdxal et @@ -115,6 +117,11 @@ Davam et düyməsinə toxun və optimallaşdırma dəyişikliklərin qəbul et." Bufer protokol jurnalı Sazlama jurnallarına protokol buferi daxildir Sazlama jurnallarına protokol buferi daxil deyil + "Bu seçimi aktivləşdirmə bəzi UI quruluşları üçün ekran mətni də olmaqla əlavə tərtibat bazasını daxil edəcək. + +Bu, xüsusi filtrlər yaradarkən quruluşları müəyyən etməyə kömək edə bilər. + +Hər halda, bunu aktivləşdirmə IP ünvanınız kimi bəzi istifadəçi məlumatın da daxil edəcək." Yığın izləri jurnalı Sazlama jurnalına yığın izləri daxildir Sazlama jurnalına yığın izləri daxil deyil @@ -124,6 +131,15 @@ Davam et düyməsinə toxun və optimallaşdırma dəyişikliklərin qəbul et." "Xəta ani bildirişlərin qapatmaq, bütün ReVanced xəta bildirişlərin gizlədir. Gözlənilməz hallardan xəbərdar olmayacaqsınız." + Sazlama qeydlərini ixrac edin + ReVanced sazlama qeydlərini buferə köçürür + Sazlama qeydi qapalıdır + Qeydlər tapılmadı + Qeydlər köçürüldü + Qeydləri ixrac etmək alınmadı: $s + Sazlama qeydlərini təmizlə + Saxlanılan bütün ReVanced sazlama qeydlərini təmizləyir + Qeydlər silindi Albom kartlarını gizlət @@ -475,6 +491,10 @@ Ekranın sağ tərəfində düzünə sürüşdürərək səs səviyyəsini tənz Sürüşdürmə cildi arxa plan qeyri-şəffaflığı 0-100 arası qeyri-şəffaflıq dəyəri Sürüşmə qeyri-şəffaflığı 0-100 arası olmalıdır + Sürüşdürmə örtüyü parlaqlıq rəngi + Parlaqlığa nəzarət üçün irəliləyiş zolağının rəngi + Sürüşdürmə örtüyü səs səviyyəsi rəngi + Səs səviyyəsinə nəzarət üçün irəliləyiş zolağının rəngi Sürüşdürmə örtüyü mətn ölçüsü Sürüşmə üçün mətn ölçüsü 1-30 arasındadır Mətn ölçüsü 1-30 arası olmalıdır @@ -1317,7 +1337,20 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər GmsCore üçün Tənzimləmələr + Əks-əlaqə reaksiyası + Əks-əlaqə reaksiyasını dəyişdir + Fəsillər reaksiyasın qapat + Fəsillər reaksiyası qapalıdır + Fəsillər reaksiyası aktivdir + Dəqiq axtarış reaksiyasın qapat + Dəqiq axtarış reaksiyası qapalıdır + Dəqiq axtarış reaksiyası aktivdir + Axtarış geriyə reaksiyasın qapat + Axtarış geri reaksiyası qapalıdır + Axtarış geri reaksiyası aktivdir Yaxınlaşdırma reaksiyasın qapat + Yaxınlaşdırma reaksiyası qapalıdır + Yaxınlaşdırma reaksiyası aktivdir Bu yaxınlarda hesabınıza giriş məlumatlarınızı dəyişmisinizsə, MicroG-ni silin və təkrar quraşdırın. 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 20e669226..80b2dd574 100644 --- a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml +++ b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml @@ -36,6 +36,7 @@ Second \"item\" text" Haluatko jatkaa? Nollaa Nollaa väri + Virheellinen väri Päivitä ja käynnistä uudelleen Käynnistä uudelleen Tuo @@ -91,7 +92,7 @@ Napauta jatka-painiketta ja salli optimoinnin muutokset." Syöte Yleiset Soitin - Liukusäädin + Etenemispalkki Pyyhkäisyohjaus Sekalaiset Video @@ -116,6 +117,11 @@ Napauta jatka-painiketta ja salli optimoinnin muutokset." Loki protokollan puskuri Virheenkorjauslokit sisältävät proto-puskurin Virheenkorjauslokit eivät sisällä proto-puskuria + "Tämän asetuksen käyttöönotto kirjaa lisätietoja asettelusta, mm. joidenkin käyttöliittymäkomponenttien näyttötekstiä. + +Tämä voi auttaa komponenttien tunnistamisessa, kun luot mukautettuja suodattimia. + +Tämän käyttöönotto kirjaa myös joitakin käyttäjätietoja, kuten IP-osoitteesi." Loki pinojäljet Vianetsintälokit sisältävät pinojäljet Vianetsintälokit eivät sisällä pinojälkiä @@ -125,6 +131,15 @@ Napauta jatka-painiketta ja salli optimoinnin muutokset." "Virheilmoitusten poistaminen käytöstä piilottaa kaikki ReVancedin virheilmoitukset. Et saa ilmoituksia odottamattomista tapahtumista." + Vie virheenkorjauslokit + Kopioi ReVancedin virheenkorjauslokit leikepöydälle + Virheenkorjausloki ei ole käytössä + Lokeja ei löytynyt + Lokit kopioitu + Lokien vienti epäonnistui: $s + Tyhjennä virheenkorjauslokit + Tyhjentää kaikki tallennetut ReVanced-virheenkorjauslokit + Lokit tyhjennetty Piilota albumikortit @@ -163,6 +178,8 @@ Et saa ilmoituksia odottamattomista tapahtumista." Painike näytetään Piilota videosuositusten otsikot + \"Ihmiset katsoivat myös\"- ja \"Saatat pitää myös\" -tunnisteet on piilotettu + \"Ihmiset katsoivat myös\"- ja \"Saatat pitää myös\" -tunnisteet näytetään Piilota \"Näytä lisää\" -painike @@ -240,6 +257,9 @@ Et saa ilmoituksia odottamattomista tapahtumista." Piilota \"tekoälyn luoma videoyhteenveto\" Videon yhteenveto-osio on piilotettu Videon yhteenveto-osio näytetään + Piilota Ask + Ask-osio on piilotettu + Ask-osio näytetään Piilota Määritteet Esitellyt paikat, Pelit, Musiikki ja Mainitut ihmiset -osiot on piilotettu Esitellyt paikat, Pelit, Musiikki ja Mainitut ihmiset -osiot näytetään @@ -433,26 +453,26 @@ Tämä ominaisuus on käytettävissä vain vanhemmilla laitteilla" %s ei ole asennettu. Asenna se. - Poista tarkka hakuele käytöstä + Poista tarkka etsintäele käytöstä Ele ei ole käytössä Ele on käytössä - Ota kelaus napauttamalla käyttöön - Kelaus napauttamalla on käytössä - Kelaus napauttamalla ei ole käytössä + Ota etsintä napauttamalla käyttöön + Etsintä napauttamalla on käytössä + Etsintä napauttamalla ei ole käytössä Ota kirkkauden ele käyttöön - "Koko näytön kirkkauden pyyhkäisy on käytössä + "Koko näytön kirkkauspyyhkäisy on käytössä Säädä kirkkautta pyyhkäisemällä pystysuoraan näytön vasemmalla puolella" - Koko näytön kirkkauden pyyhkäisy ei ole käytössä + Koko näytön kirkkauspyyhkäisy ei ole käytössä Ota äänenvoimakkuuden ele käyttöön - "Koko näytön äänenvoimakkuuden pyyhkäisy on käytössä + "Koko näytön äänenvoimakkuuspyyhkäisy on käytössä Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta puolella" - Koko näytön äänenvoimakkuuden pyyhkäisy ei ole käytössä + Koko näytön äänenvoimakkuuspyyhkäisy ei ole käytössä Ota pyyhkäise painamalla -ele käyttöön Pyyhkäise painamalla -ele on käytössä Pyyhkäise painamalla -ele ei ole käytössä @@ -466,19 +486,23 @@ Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta pu Automaattinen kirkkaus otetaan käyttöön pyyhkäisemällä alhaisimpaan arvoon Pienimpään arvoon alas pyyhkäiseminen ei ota käyttöön automaattista kirkkautta Automaattinen - Pyyhkäisypeittokuvan aikakatkaisu + Pyyhkäisyn peittokuvan aikakatkaisu Kuinka monta millisekuntia ikkuna on näkyvissä - Pyyhkäisypeittokuvan taustan läpinäkymättömyys + Pyyhkäisyn peittokuvan taustan läpinäkymättömyys Läpinäkymättömyysarvo 0–100 välillä - Pyyhkäisypeittokuvan läpinäkymättömyyden tulee olla 0–100 välillä - Pyyhkäisypeittokuvan tekstin koko - Pyyhkäisypeittokuvan tekstin koko 1–30 välillä + Pyyhkäisyn peittokuvan läpinäkymättömyyden tulee olla 0–100 välillä + Kirkkauspyyhkäisyn peittokuvan väri + Kirkkauden liukusäätimien väri + Äänenvoimakkuuspyyhkäisyn peittokuvan väri + Äänenvoimakkuuden liukusäätimien väri + Pyyhkäisyn peittokuvan tekstin koko + Pyyhkäisyn peittokuvan tekstin koko 1–30 välillä Tekstin koon tulee olla 1–30 välillä Pyyhkäisyn kynnysraja Pyyhkäisyä varten tarvittavan kynnyksen määrä - Äänenvoimakkuuden pyyhkäisyn herkkyys + Äänenvoimakkuuspyyhkäisyn herkkyys Kuinka paljon äänenvoimakkuus muuttuu pyyhkäisyä kohden - Pyyhkäisypeittokuvan tyyli + Pyyhkäisyn peittokuvan tyyli Vaakasuuntainen peittokuva Vaakasuuntainen peittokuva (minimaalinen – ylhäällä) Vaakasuuntainen peittokuva (minimaalinen – keskellä) @@ -527,6 +551,9 @@ Säädä äänenvoimakkuutta pyyhkäisemällä pystysuoraan näytön oikealta pu Kiitos-painike näytetään + Piilota Ask + Ask-painike on piilotettu + Ask-painike näytetään Piilota Klippi Klippi-painike on piilotettu @@ -676,12 +703,12 @@ Jos haluat nähdä sen, aseta \"Naamioi videovirrat\" iOS TV:ksi" Vierivät numerot animoidaan - Piilota liukusäädin videosoittimessa - Videosoittimen liukusäädin on piilotettu - Videosoittimen liukusäädin näytetään - Piilota liukusäädin videon pikkukuvissa - Pikkukuvan liukusäädin on piilotettu - Pikkukuvan liukusäädin näytetään + Piilota etenemispalkki videosoittimessa + Videosoittimen etenemispalkki on piilotettu + Videosoittimen etenemispalkki näytetään + Piilota etenemispalkki videon pikkukuvissa + Pikkukuvan etenemispalkki on piilotettu + Pikkukuvan etenemispalkki näytetään Shorts-soitin @@ -882,18 +909,18 @@ Rajoitus: Ei-tykkäykset eivät välttämättä näy incognito-tilassa" Ota korkealaatuiset pikkukuvat käyttöön - Liukusäätimen pikkukuvat ovat korkealaatuisia - Liukusäätimen pikkukuvat ovat keskilaatuisia - Koko näytön liukusäätimen pikkukuvat ovat korkealaatuisia - Koko näytön liukusäätimen pikkukuvat ovat keskilaatuisia - "Tämä palauttaa myös pienoiskuvat livestriimeissä, joilla ei ole liukusäätimen pikkukuvia. + Etenemispalkin pikkukuvat ovat korkealaatuisia + Etenemispalkin pikkukuvat ovat keskilaatuisia + Koko näytön etenemispalkin pikkukuvat ovat korkealaatuisia + Koko näytön etenemispalkin pikkukuvat ovat keskilaatuisia + "Tämä palauttaa myös pienoiskuvat livestriimeissä, joilla ei ole etenemispalkin pikkukuvia. -Liukusäätimen pikkukuvat käyttävät samaa laatua kuin nykyinen video. +Etenemispalkin pikkukuvat käyttävät samaa laatua kuin nykyinen video. Tämä ominaisuus toimii parhaiten, kun videon laatu on 720p tai alhaisempi ja kun käytössä on erittäin nopea Internet-yhteys." - Palauta vanhat liukusäätimen pikkukuvat - Liukusäätimen pikkukuvat näkyvät liukusäätimen yläpuolella - Liukusäätimen pikkukuvat näkyvät kokoruututilassa + Palauta vanhat etenemispalkin pikkukuvat + Etenemispalkin pikkukuvat näkyvät etenemispalkin yläpuolella + Etenemispalkin pikkukuvat näkyvät kokoruututilassa Ota SponsorBlock käyttöön @@ -1014,7 +1041,7 @@ UserID on kuin salasana, eikä sitä pidä jakaa kenellekään. Ohita automaattisesti Ohita automaattisesti kerran Näytä Ohita-painike - Näytä liukusäätimessä + Näytä etenemispalkissa Poista käytöstä Osiota ei voitu lähettää: %s SponsorBlock on tilapäisesti poissa käytöstä @@ -1226,14 +1253,14 @@ Pyyhkäise laajentaaksesi tai sulkeaksesi" Ota liukuvärillinen latausruutu käyttöön Latausruudulla on liukuvärillinen tausta Latausruudulla on yksivärinen tausta - Ota oma liukusäätimen väri käyttöön - Oma liukusäätimen väri näytetään - Alkuperäinen liukusäätimen väri näytetään - Oma liukusäätimen väri - Liukusäätimen väri - Oma liukusäätimen korostusväri - Liukusäätimen korostusväri - Virheellinen liukusäätimen väriarvo + Ota oma etenemispalkin väri käyttöön + Oma etenemispalkin väri näytetään + Alkuperäinen etenemispalkin väri näytetään + Oma etenemispalkin väri + Etenemispalkin väri + Oma etenemispalkin korostusväri + Etenemispalkin korostusväri + Virheellinen etenemispalkin väriarvo Ohita kuvien alueelliset rajoitukset @@ -1311,7 +1338,20 @@ Tämä voi avata korkealaatuisemmat videot" GmsCoren asetukset + Haptinen palaute + Muuta haptista palautetta + Poista videon osien haptiikka käytöstä + Videon osien haptiikka ei ole käytössä + Videon osien haptiikka on käytössä + Poista tarkan etsintäeleen haptiikka käytöstä + Tarkan etsinnän haptiikka ei ole käytössä + Tarkan etsinnän haptiikka on käytössä + Poista etsinnän kumoamisen haptiikka käytöstä + Etsinnän kumoamisen haptiikka ei ole käytössä + Etsinnän kumoamisen haptiikka on käytössä Poista zoomaushaptiikka käytöstä + Zoomaushaptiikka ei ole käytössä + Zoomaushaptiikka on käytössä Jos olet äskettäin muuttanut tilisi kirjautumistietoja, poista ja asenna MicroG uudelleen. diff --git a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml index bdc988eaa..17cf445c1 100644 --- a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml +++ b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml @@ -46,6 +46,8 @@ Second \"item\" text" ייבוא נכשל: %s חפש בהגדרות לא נמצאו תוצאות עבור \'%s\' + נסה מילת מפתח אחרת + להסיר מהיסטוריית חיפוש? הצג סמלי הגדרות ReVanced סמלי ההגדרות מוצגים סמלי ההגדרות אינם מוצגים @@ -97,6 +99,9 @@ Second \"item\" text" שחזר תפריטי הגדרות ישנים תפריטי הגדרות ישנים מוצגים תפריטי הגדרות ישנים אינם מוצגים + הצג הגדרות היסטוריית חיפוש + הגדרות היסטוריית חיפוש מוצגות + הגדרות היסטוריית חיפוש אינן מוצגות השבת הפעלה ברקע של Shorts @@ -112,6 +117,11 @@ Second \"item\" text" רשום פרוטוקול חוצץ יומני איתור באגים כוללים פרוטוקול חוצץ יומני איתור באגים אינם כוללים פרוטוקול חוצץ + "הפעלת הגדרה זו תתעד נתוני פריסה נוספים, כולל טקסט שעל המסך עבור רכיבי ממשק משתמש מסוימים. + +זה יכול לעזור לזהות רכיבים בעת יצירת מסננים מותאמים אישית. + +עם זאת, הפעלת הגדרה זו תתעד גם כמה נתוני משתמש כמו כתובת ה-IP שלך." רשום עקבות מחסנית יומני איתור באגים כוללים עקבות מחסנית יומני איתור באגים אינם כוללים עקבות מחסנית @@ -121,6 +131,15 @@ Second \"item\" text" "השבתת הודעות שגיאה קופצות מסתירה את כל הודעות השגיאה של ReVanced. לא תקבל הודעה על אירועים בלתי צפויים." + ייצוא יומני איתור באגים + מעתיק יומנים לאיתור באגים של Revanced ללוח ההעתקה + תיעוד איתור באגים מושבת + לא נמצאו יומנים + היומנים הועתקו + נכשל לייצא יומנים: $s + נקה יומני איתור באגים + מנקה את כל היומנים לאיתור באגים של Revanced המאוחסנים + היומנים נוקו הסתר כרטיסי אלבום @@ -158,11 +177,17 @@ Second \"item\" text" הלחצן מוסתר הלחצן מוצג + הסתר תוויות המלצה על סרטון + \'אנשים צפו גם\' ו\'את/ה עשוי/ה לאהוב\' מוסתרים + \'אנשים צפו גם\' ו\'את/ה עשוי/ה לאהוב\' מוצגים הסתר לחצן \'הצג עוד\' הלחצן מוסתר הלחצן מוצג + הסתר מדף כרטיסים + מדף כרטיסים מוסתר + מדף כרטיסים מוצג הסתר תגובות באמוג\'י מתוזמנות תגובות באמוג\'י מתוזמנות מוסתרות תגובות באמוג\'י מתוזמנות מוצגות @@ -232,6 +257,9 @@ Second \"item\" text" הסתר את \'סיכום הווידאו שנוצר על ידי בינה מלאכותית\' מדור סיכום הסרטון מוסתר מדור סיכום הסרטון מוצג + הסתר Ask + מדור Ask מוסתר + מדור Ask מוצג הסתר מאפיינים המדורים \'מקומות שמככבים בסרטון\', \'משחקים\', \'מוזיקה\', ו\'אנשים שאוזכרו\' מוסתרים המדורים \'מקומות שמככבים בסרטון\', \'משחקים\', \'מוזיקה\', ו\'אנשים שאוזכרו\' מוצגים @@ -463,10 +491,25 @@ Second \"item\" text" אטימות רקע שכבת-על של החלקה ערך אטימות בין 0 ל-100 אטימות החלקה חייבת להיות בין 0 ל-100 + צבע שכבת-על של החלקת בהירות + הצבע של סרגל ההתקדמות עבור בקרות בהירות + צבע שכבת-על של החלקת עוצמת קול + הצבע של סרגל ההתקדמות עבור בקרות עוצמת קול + גודל טקסט שכבת-על של החלקה + גודל הטקסט עבור שכבת-על של החלקה בין 1 ל-30 + גודל הטקסט חייב להיות בין 1 ל-30 סף גודל החלקה כמות הסף להתרחשות החלקה רגישות החלקה בעוצמת הקול כמה משתנה עוצמת השמע לכל החלקה + סגנון שכבת-על להחלקה + שכבת-על אופקית + שכבת-על אופקית (מזערית - עליונה) + שכבת-על אופקית (מזערית - מרכזית) + שכבת-על מעגלית + שכבת-על מעגלית (מזערית) + שכבת-על אנכית + שכבת-על אנכית (מזערית) הפעל החלקה כדי לשנות סרטונים החלקה במצב מסך מלא תשנה לסרטון הבא/הקודם החלקה במצב מסך מלא לא תשנה לסרטון הבא/הקודם @@ -508,6 +551,9 @@ Second \"item\" text" לחצן תודה מוצג + הסתר Ask + לחצן Ask מוסתר + לחצן Ask מוצג הסתר קליפ לחצן קליפ מוסתר @@ -777,6 +823,9 @@ Second \"item\" text" סרטון מוצע של מסך סיום מוצג + הסתר שכבת-על של סרטונים קשורים במסך מלא + שכבת-על של סרטונים קשורים מוסתרת + שכבת-על של סרטונים קשורים מוצגת הסתר חותמת זמן של סרטון @@ -1289,10 +1338,23 @@ Second \"item\" text" הגדרות עבור GmsCore + משוב ברטט + שנה משוב ברטט + השבת משוב ברטט עבור פרקים + משוב ברטט עבור פרקים מושבת + משוב ברטט עבור פרקים מופעל + השבת משוב ברטט עבור דילוג מדויק + משוב ברטט עבור דילוג מדויק מושבת + משוב ברטט עבור דילוג מדויק מופעל + השבת משוב ברטט עבור ביטול דילוג + משוב ברטט עבור ביטול דילוג מושבת + משוב ברטט עבור ביטול דילוג מופעל השבת משוב זום ברטט + משוב ברטט עבור זום מושבת + משוב ברטט עבור זום מופעל - אם שיניתם לאחרונה את פרטי הכניסה לחשבון שלכם, הסירו והתקינו מחדש את MicroG. + אם פרטי הכניסה לחשבונך השתנו לאחרונה, אז יש להסיר ולהתקין מחדש את MicroG. עקוף הפניות מחדש של URL 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 ef7d250c8..f2e3772dd 100644 --- a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml +++ b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml @@ -112,20 +112,20 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ デバッグ デバッグの設定 - デバッグ ログを有効にする - デバッグ ログは有効です - デバッグ ログは無効です + デバッグログを有効にする + デバッグログは有効です + デバッグログは無効です protocol buffer を記録する - デバッグ ログに protocol buffer が含まれます - デバッグ ログに protocol buffer は含まれません + protocol buffer はデバッグログに含まれます + protocol buffer はデバッグログに含まれません "この設定を有効にすると、一部の UI コンポーネントの画面上のテキストなど、追加のレイアウト データがデバッグログに記録されます。 この追加されたデータは、カスタム フィルタを作成する際にコンポーネントを特定するのに役立つ可能性があります。 -ただし、IP アドレスなどの一部のユーザーデータもデバッグログに記録されるようになることに注意が必要です。" +ただし、この機能によりデバッグログに追加で記録されるデータには、IP アドレスなど、一部のユーザーデータも含まれます。" stack trace を記録する - デバッグ ログにstack trace が含まれます - デバッグ ログにstack trace は含まれません + stack trace はデバッグログに含まれます + stack trace はデバッグログに含まれません ReVanced エラーのトーストを表示する エラー発生時にトースト ポップアップが表示されます エラーが発生してもトースト ポップアップは表示されません @@ -134,7 +134,7 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ あらゆる予期せぬイベントが通知されなくなります。" デバッグログをエクスポート ReVanced のデバッグログをクリップボードにコピーします - デバッグログは無効です + デバッグログが無効です ログが見つかりませんでした ログをコピーしました ログのエクスポートに失敗: $s @@ -264,8 +264,8 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ 質問セクションは表示されません 質問セクションは表示されます 関連情報を非表示 - 注目の場所 / ゲーム / 音楽 / 言及された人物セクションは表示されません - 注目の場所 / ゲーム / 音楽 / 言及された人物セクションは表示されます + 注目の場所 / ゲーム / 音楽 / 言及されている人物セクションは表示されません + 注目の場所 / ゲーム / 音楽 / 言及されている人物セクションは表示されます チャプター セクションを非表示 チャプター セクションは表示されません チャプター セクションは表示されます @@ -1517,9 +1517,9 @@ AVC は、最大解像度が 1080p であり、Opus オーディオ コーデッ その他の設定 クライアントサイド広告 サーバー側サレストリーム広告 - デバッグ ログ - デバッグ ログは有効です - デバッグ ログは無効です + デバッグログ + デバッグログは有効です + デバッグログは無効です diff --git a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml index f7eed3776..8855203b5 100644 --- a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml +++ b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml @@ -488,14 +488,14 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 스와이프 오버레이 타임아웃 오버레이가 표시되는 시간을 지정할 수 있습니다 (밀리초) 스와이프 오버레이 배경 불투명도 - 스와이프 불투명도 값은 0-100 사이여야 합니다 - 스와이프 불투명도 값은 0-100 사이여야 합니다 + 배경 불투명도 값을 지정할 수 있습니다 (0-100) + 스와이프 배경 불투명도 값은 0-100 사이여야 합니다 스와이프 오버레이 밝기 조절바 색상 - 스와이프 오버레이 밝기 조절바 색상을 변경할 수 있습니다 + 밝기 조절바 색상을 지정할 수 있습니다 스와이프 오버레이 볼륨 조절바 색상 - 스와이프 오버레이 볼륨 조절바 색상을 변경할 수 있습니다 + 볼륨 조절바 색상을 지정할 수 있습니다 스와이프 오버레이 텍스트 크기 - 스와이프 오버레이 텍스트 크기를 지정할 수 있습니다 (1-30) + 텍스트 크기를 지정할 수 있습니다 (1-30) 텍스트 크기는 1-30 사이여야 합니다 스와이프 한계치 제스처 인식을 위해 얼마나 스와이프를 해야 할지를 지정할 수 있으며, 원하지 않은 제스처 인식을 방지할 수 있습니다 @@ -1260,9 +1260,9 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 사용자 정의 재생바 색상을 활성화합니다 기본 재생바 색상을 활성화합니다 사용자 정의 재생바 메인 색상 - 재생바 메인 색상을 변경할 수 있습니다 + 재생바 메인 색상을 지정할 수 있습니다 사용자 정의 재생바 보조 색상 - 재생바 보조 색상을 변경할 수 있습니다 + 재생바 보조 색상을 지정할 수 있습니다 잘못된 재생바 색상입니다 @@ -1409,7 +1409,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요" 사용자 정의 동영상 재생 속도를 활성화합니다 사용자 정의 동영상 재생 속도를 비활성화합니다 사용자 정의 동영상 재생 속도 편집하기 - 사용자 정의 동영상 재생 속도 값을 추가 또는 변경할 수 있습니다 + 동영상 재생 속도 값을 추가 또는 변경할 수 있습니다 재생 속도 값은 %s배속보다 작아야 합니다 잘못된 사용자 정의 재생 속도 값입니다 자동 diff --git a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml index 86a10fa4a..38ac46278 100644 --- a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml +++ b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml @@ -491,9 +491,9 @@ Second \"item\" text" Затемнение фона панели жестов Значение затемнения всплывающей панели при жестах от 0 до 100 Значение затемнения панели жестов должно быть от 0 до 100 - Цвет наложения жестов для яркости + Цвет индикатора яркости при жестах Цвет полосы прогресса при изменении яркости жестами - Цвет наложения жестов для громкости + Цвет индикатора громкости при жестах Цвет полосы прогресса при изменении громкости жестами Размер текста панели жестов Размер текста панели жестов от 1 до 30 @@ -1340,15 +1340,15 @@ Second \"item\" text" Виброотклик Изменить виброотклик - Отключить виброотклик глав - Виброотклик глав отключен - Виброотклик глав включен + Отключить виброотклик между эпизодов + Виброотклик между эпизодов отключен + Виброотклик между эпизодов включен Отключить виброотклик при покадровой перемотке - Виброотклик при точном поиске отключен + Виброотклик при покадровой перемотке отключен Виброотклик при покадровой перемотке включен - Отключить виброотклик отмены поиска - Виброотклик отмены поиска отключен - Виброотклик отмены поиска включен + Отключить виброотклик отмены перемотки + Виброотклик отмены перемотки отключен + Виброотклик отмены перемотки включен Отключить виброотклик при масштабировании Виброотклик при масштабировании отключен Виброотклик при масштабировании включен diff --git a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml index 39ab50440..831ddad3d 100644 --- a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml @@ -491,9 +491,9 @@ Podesite jačinu zvuka prevlačenjem vertikalno na desnoj strani ekrana"Neprozirnost pozadine pokreta prevlačenja Vrednost neprozirnosti između 0 i 100 Neprozirnost pokreta prevlačenja mora biti između 0 i 100 - Boja osvetljenosti trake pokreta prevlačenja + Boja pokreta prevlačenja za osvetljenost Boja trake napretka za kontrolu osvetljenosti - Boja jačine zvuka trake pokreta prevlačenja + Boja pokreta prevlačenja za jačinu zvuka Boja trake napretka za kontrolu jačine zvuka Veličina teksta pokreta prevlačenja Veličina teksta za pokret prevlačenja između 1 i 30 diff --git a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml index feff0cba3..8639c3bab 100644 --- a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml @@ -491,10 +491,10 @@ Second \"item\" text" Непрозирност позадине покрета превлачења Вредност непрозирности између 0 и 100 Непрозирност покрета превлачења мора бити између 0 и 100 - Боја осветљености превлачења преко екрана - Боја траке напретка за контроле осветљености - Боја јачине звука превлачења преко екрана - Боја траке напретка за контроле јачине звука + Боја покрета превлачења за осветљеност + Боја траке напретка за контролу осветљености + Боја покрета превлачења за јачину звука + Боја траке напретка за контролу јачине звука Величина текста покрета превлачења Величина текста за покрет превлачења између 1 и 30 Величина текста мора бити између 1 и 30 diff --git a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml index b3b772175..f673e1132 100644 --- a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml +++ b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml @@ -131,15 +131,15 @@ Ancak, bunun etkinleştirilmesi IP adresiniz gibi bazı kullanıcı verilerini d "Hata bildirimlerini kapatmak, tüm ReVanced hata bildirimlerini gizler. Beklenmedik olaylar hakkında bilgilendirilmeyeceksiniz." - Hata ayıklama günlüklerini dışa aktar - ReVanced hata ayıklama günlüklerini panoya kopyalar + Hata ayıklama kayıtlarını dışa aktar + ReVanced hata ayıklama kayıtlarını panoya kopyalar Hata ayıklama kaydı devre dışı Kayıt bulunamadı - Günlükler kopyalandı - Günlükler dışa aktarılamadı: $s - Hata ayıklama günlüklerini temizle - Kaydedilmiş tüm ReVanced hata ayıklama günlüklerini temizler - Günlükler temizlendi + Kayıtlar kopyalandı + Kayıtlar dışa aktarılamadı: $s + Hata ayıklama kayıtlarını temizle + Kaydedilmiş tüm ReVanced hata ayıklama kayıtlarını temizler + Kayıtlar temizlendi Albüm kartlarını gizle From 8ecacaad27162d9380014a9a13ac9220b12257b2 Mon Sep 17 00:00:00 2001 From: alieRN <45766489+aliernfrog@users.noreply.github.com> Date: Sun, 1 Jun 2025 09:59:09 +0300 Subject: [PATCH 05/21] fix(YouTube): Support A/B Shorts layout for RYD and component hiding (#5081) --- .../patches/ReturnYouTubeDislikePatch.java | 8 ++++++-- .../patches/components/ShortsFilter.java | 20 ++++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java index 2db744ae6..b43eb77ab 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java @@ -152,11 +152,15 @@ public class ReturnYouTubeDislikePatch { return original; // No need to check for Shorts in the context. } - if (conversionContextString.contains("|shorts_dislike_button.eml")) { + if (Utils.containsAny(conversionContextString, + "|shorts_dislike_button.eml", "|reel_dislike_button.eml" + )) { return getShortsSpan(original, true); } - if (conversionContextString.contains("|shorts_like_button.eml")) { + if (Utils.containsAny(conversionContextString, + "|shorts_like_button.eml", "|reel_like_button.eml" + )) { if (!Utils.containsNumber(original)) { Logger.printDebug(() -> "Replacing hidden likes count"); return getShortsSpan(original, false); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java index ef1cd5bb5..142a27473 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java @@ -143,12 +143,14 @@ public final class ShortsFilter extends Filter { StringFilterGroup likeButton = new StringFilterGroup( Settings.HIDE_SHORTS_LIKE_BUTTON, - "shorts_like_button.eml" + "shorts_like_button.eml", + "reel_like_button.eml" ); StringFilterGroup dislikeButton = new StringFilterGroup( Settings.HIDE_SHORTS_DISLIKE_BUTTON, - "shorts_dislike_button.eml" + "shorts_dislike_button.eml", + "reel_dislike_button.eml" ); joinButton = new StringFilterGroup( @@ -168,12 +170,13 @@ public final class ShortsFilter extends Filter { shortsActionBar = new StringFilterGroup( null, - "shorts_action_bar.eml" + "shorts_action_bar.eml", + "reel_action_bar.eml" ); actionButton = new StringFilterGroup( null, - // Can be simply 'button.eml' or 'shorts_video_action_button.eml' + // Can be simply 'button.eml', 'shorts_video_action_button.eml' or 'reel_action_button.eml' "button.eml" ); @@ -195,15 +198,18 @@ public final class ShortsFilter extends Filter { videoActionButtonGroupList.addAll( new ByteArrayFilterGroup( Settings.HIDE_SHORTS_COMMENTS_BUTTON, - "reel_comment_button" + "reel_comment_button", + "youtube_shorts_comment_outline" ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_SHARE_BUTTON, - "reel_share_button" + "reel_share_button", + "youtube_shorts_share_outline" ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_REMIX_BUTTON, - "reel_remix_button" + "reel_remix_button", + "youtube_shorts_remix_outline" ) ); From d96134cbb7001fde5c52711fae62c169765a5754 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 1 Jun 2025 07:01:35 +0000 Subject: [PATCH 06/21] chore: Release v5.26.0-dev.2 [skip ci] # [5.26.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.1...v5.26.0-dev.2) (2025-06-01) ### Bug Fixes * **YouTube:** Support A/B Shorts layout for RYD and component hiding ([#5081](https://github.com/ReVanced/revanced-patches/issues/5081)) ([8ecacaa](https://github.com/ReVanced/revanced-patches/commit/8ecacaad27162d9380014a9a13ac9220b12257b2)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53b85c931..7a41e6153 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.26.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.1...v5.26.0-dev.2) (2025-06-01) + + +### Bug Fixes + +* **YouTube:** Support A/B Shorts layout for RYD and component hiding ([#5081](https://github.com/ReVanced/revanced-patches/issues/5081)) ([8ecacaa](https://github.com/ReVanced/revanced-patches/commit/8ecacaad27162d9380014a9a13ac9220b12257b2)) + # [5.26.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v5.25.0...v5.26.0-dev.1) (2025-05-30) diff --git a/gradle.properties b/gradle.properties index 1fff77370..1c4d0d024 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.26.0-dev.1 +version = 5.26.0-dev.2 From 9a1e6ca178d9833ee2c681fb130b9290a4e89cd8 Mon Sep 17 00:00:00 2001 From: MarcaD <152095496+MarcaDian@users.noreply.github.com> Date: Sun, 1 Jun 2025 12:12:56 +0300 Subject: [PATCH 07/21] feat(YouTube - Playback Speed): Use modern custom speed dialog (#5069) Co-authored-by: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> --- .../shared/spoof/requests/PlayerRoutes.java | 4 +- .../extension/youtube/ThemeHelper.java | 8 + .../patches/AlternativeThumbnailsPatch.java | 2 +- .../patches/ReturnYouTubeDislikePatch.java | 11 + .../youtube/patches/VideoInformation.java | 19 + .../PlaybackSpeedMenuFilterPatch.java | 20 +- .../speed/CustomPlaybackSpeedPatch.java | 533 ++++++++++++++++-- .../speed/RememberPlaybackSpeedPatch.java | 8 +- .../patches/theme/SeekbarColorPatch.java | 22 +- .../extension/youtube/settings/Settings.java | 2 +- .../PlaybackSpeedDialogButton.java | 27 +- .../youtube/video/information/Fingerprints.kt | 10 + .../information/VideoInformationPatch.kt | 70 +++ .../speed/custom/CustomPlaybackSpeedPatch.kt | 107 +--- .../video/speed/custom/Fingerprints.kt | 21 - .../kotlin/app/revanced/util/BytecodeUtils.kt | 39 ++ .../resources/addresources/values/strings.xml | 3 +- 17 files changed, 697 insertions(+), 209 deletions(-) diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/PlayerRoutes.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/PlayerRoutes.java index f45e890d5..5179b3e5f 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/PlayerRoutes.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/PlayerRoutes.java @@ -71,9 +71,7 @@ final class PlayerRoutes { return innerTubeBody.toString(); } - /** - * @noinspection SameParameterValue - */ + @SuppressWarnings("SameParameterValue") static HttpURLConnection getPlayerResponseConnectionFromRoute(Route.CompiledRoute route, ClientType clientType) throws IOException { var connection = Requester.getConnectionFromCompiledRoute(YT_API_URL, route); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/ThemeHelper.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/ThemeHelper.java index 0177c9cbc..d6594f20d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/ThemeHelper.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/ThemeHelper.java @@ -105,6 +105,14 @@ public class ThemeHelper { return isDarkTheme() ? getLightThemeColor() : getDarkThemeColor(); } + public static int getDialogBackgroundColor() { + final String colorName = isDarkTheme() + ? "yt_black1" + : "yt_white1"; + + return Utils.getColorFromString(colorName); + } + public static int getToolbarBackgroundColor() { final String colorName = isDarkTheme() ? "yt_black3" diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java index c670a79de..a4dd50fcc 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java @@ -686,7 +686,7 @@ public final class AlternativeThumbnailsPatch { ? "" : fullUrl.substring(imageExtensionEndIndex); } - /** @noinspection SameParameterValue */ + @SuppressWarnings("SameParameterValue") String createStillsUrl(@NonNull ThumbnailQuality qualityToUse, boolean includeViewTracking) { // Images could be upgraded to webp if they are not already, but this fails quite often, // especially for new videos uploaded in the last hour. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java index b43eb77ab..862847410 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java @@ -365,6 +365,11 @@ public class ReturnYouTubeDislikePatch { if (videoId.equals(lastPrefetchedVideoId)) { return; } + if (!Utils.isNetworkConnected()) { + Logger.printDebug(() -> "Cannot pre-fetch RYD, network is not connected"); + lastPrefetchedVideoId = null; + return; + } final boolean videoIdIsShort = VideoInformation.lastPlayerResponseIsShort(); // Shorts shelf in home and subscription feed causes player response hook to be called, @@ -419,6 +424,12 @@ public class ReturnYouTubeDislikePatch { } Logger.printDebug(() -> "New video id: " + videoId + " playerType: " + currentPlayerType); + if (!Utils.isNetworkConnected()) { + Logger.printDebug(() -> "Cannot fetch RYD, network is not connected"); + currentVideoData = null; + return; + } + ReturnYouTubeDislike data = ReturnYouTubeDislike.getFetchForVideoId(videoId); // Pre-emptively set the data to short status. // Required to prevent Shorts data from being used on a minimized video in incognito mode. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoInformation.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoInformation.java index 6df9a9095..99d8a5b6a 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoInformation.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoInformation.java @@ -354,4 +354,23 @@ public final class VideoInformation { return videoTime >= videoLength && videoLength > 0; } + /** + * Overrides the current playback speed. + * Rest of the implementation added by patch. + */ + public static void overridePlaybackSpeed(float speedOverride) { + Logger.printDebug(() -> "Overriding playback speed to: " + speedOverride); + } + + /** + * Injection point. + * + * @param newlyLoadedPlaybackSpeed The current playback speed. + */ + public static void setPlaybackSpeed(float newlyLoadedPlaybackSpeed) { + if (playbackSpeed != newlyLoadedPlaybackSpeed) { + Logger.printDebug(() -> "Video speed changed: " + newlyLoadedPlaybackSpeed); + playbackSpeed = newlyLoadedPlaybackSpeed; + } + } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilterPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilterPatch.java index d630ee9ed..531578a8b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilterPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilterPatch.java @@ -10,18 +10,11 @@ import app.revanced.extension.youtube.settings.Settings; */ public final class PlaybackSpeedMenuFilterPatch extends Filter { - /** - * Old litho based speed selection menu. - */ - public static volatile boolean isOldPlaybackSpeedMenuVisible; - /** * 0.05x speed selection menu. */ public static volatile boolean isPlaybackRateSelectorMenuVisible; - private final StringFilterGroup oldPlaybackMenuGroup; - public PlaybackSpeedMenuFilterPatch() { // 0.05x litho speed menu. var playbackRateSelectorGroup = new StringFilterGroup( @@ -29,22 +22,13 @@ public final class PlaybackSpeedMenuFilterPatch extends Filter { "playback_rate_selector_menu_sheet.eml-js" ); - // Old litho based speed menu. - oldPlaybackMenuGroup = new StringFilterGroup( - Settings.CUSTOM_SPEED_MENU, - "playback_speed_sheet_content.eml-js"); - - addPathCallbacks(playbackRateSelectorGroup, oldPlaybackMenuGroup); + addPathCallbacks(playbackRateSelectorGroup); } @Override boolean isFiltered(@Nullable String identifier, String path, byte[] protobufBufferArray, StringFilterGroup matchedGroup, FilterContentType contentType, int contentIndex) { - if (matchedGroup == oldPlaybackMenuGroup) { - isOldPlaybackSpeedMenuVisible = true; - } else { - isPlaybackRateSelectorMenuVisible = true; - } + isPlaybackRateSelectorMenuVisible = true; return false; } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java index 9b6224106..4c509bccb 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch.java @@ -1,24 +1,57 @@ package app.revanced.extension.youtube.patches.playback.speed; import static app.revanced.extension.shared.StringRef.str; +import static app.revanced.extension.shared.Utils.dipToPixels; +import android.annotation.SuppressLint; +import android.app.Dialog; +import android.content.Context; +import android.content.res.Configuration; +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.PorterDuff; +import android.graphics.Rect; +import android.graphics.Typeface; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.RoundRectShape; +import android.icu.text.NumberFormat; import android.support.v7.widget.RecyclerView; +import android.view.animation.Animation; +import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; +import android.view.Window; +import android.view.WindowManager; +import android.widget.Button; +import android.widget.FrameLayout; +import android.widget.GridLayout; +import android.widget.LinearLayout; +import android.widget.SeekBar; +import android.widget.TextView; +import java.lang.ref.WeakReference; import java.util.Arrays; +import java.util.function.Function; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; +import app.revanced.extension.youtube.ThemeHelper; +import app.revanced.extension.youtube.patches.VideoInformation; import app.revanced.extension.youtube.patches.components.PlaybackSpeedMenuFilterPatch; import app.revanced.extension.youtube.settings.Settings; +import app.revanced.extension.youtube.shared.PlayerType; +import kotlin.Unit; +import kotlin.jvm.functions.Function1; @SuppressWarnings("unused") public class CustomPlaybackSpeedPatch { /** - * Maximum playback speed, exclusive value. Custom speeds must be less than this value. + * Maximum playback speed, inclusive. Custom speeds must be this or less. *

* Going over 8x does not increase the actual playback speed any higher, * and the UI selector starts flickering and acting weird. @@ -26,6 +59,11 @@ public class CustomPlaybackSpeedPatch { */ public static final float PLAYBACK_SPEED_MAXIMUM = 8; + /** + * Scale used to convert user speed to {@link android.widget.ProgressBar#setProgress(int)}. + */ + private static final float PROGRESS_BAR_VALUE_SCALE = 100; + /** * Tap and hold speed. */ @@ -34,16 +72,28 @@ public class CustomPlaybackSpeedPatch { /** * Custom playback speeds. */ - public static float[] customPlaybackSpeeds; + public static final float[] customPlaybackSpeeds; /** - * The last time the old playback menu was forcefully called. + * Formats speeds to UI strings. */ - private static long lastTimeOldPlaybackMenuInvoked; + private static final NumberFormat speedFormatter = NumberFormat.getNumberInstance(); + + /** + * Weak reference to the currently open dialog. + */ + private static WeakReference

currentDialog = new WeakReference<>(null); + + /** + * Minimum and maximum custom playback speeds of {@link #customPlaybackSpeeds}. + */ + private static final float customPlaybackSpeedsMin, customPlaybackSpeedsMax; static { - final float holdSpeed = Settings.SPEED_TAP_AND_HOLD.get(); + // Cap at 2 decimals (rounds automatically). + speedFormatter.setMaximumFractionDigits(2); + final float holdSpeed = Settings.SPEED_TAP_AND_HOLD.get(); if (holdSpeed > 0 && holdSpeed <= PLAYBACK_SPEED_MAXIMUM) { TAP_AND_HOLD_SPEED = holdSpeed; } else { @@ -51,7 +101,9 @@ public class CustomPlaybackSpeedPatch { TAP_AND_HOLD_SPEED = Settings.SPEED_TAP_AND_HOLD.resetToDefault(); } - loadCustomSpeeds(); + customPlaybackSpeeds = loadCustomSpeeds(); + customPlaybackSpeedsMin = customPlaybackSpeeds[0]; + customPlaybackSpeedsMax = customPlaybackSpeeds[customPlaybackSpeeds.length - 1]; } /** @@ -65,37 +117,41 @@ public class CustomPlaybackSpeedPatch { Utils.showToastLong(str("revanced_custom_playback_speeds_invalid", PLAYBACK_SPEED_MAXIMUM)); } - private static void loadCustomSpeeds() { + private static float[] loadCustomSpeeds() { try { - String[] speedStrings = Settings.CUSTOM_PLAYBACK_SPEEDS.get().split("\\s+"); + // Automatically replace commas with periods, + // if the user added speeds in a localized format. + String[] speedStrings = Settings.CUSTOM_PLAYBACK_SPEEDS.get() + .replace(',', '.').split("\\s+"); Arrays.sort(speedStrings); if (speedStrings.length == 0) { throw new IllegalArgumentException(); } - customPlaybackSpeeds = new float[speedStrings.length]; + float[] speeds = new float[speedStrings.length]; int i = 0; for (String speedString : speedStrings) { final float speedFloat = Float.parseFloat(speedString); - if (speedFloat <= 0 || arrayContains(customPlaybackSpeeds, speedFloat)) { + if (speedFloat <= 0 || arrayContains(speeds, speedFloat)) { throw new IllegalArgumentException(); } - if (speedFloat >= PLAYBACK_SPEED_MAXIMUM) { + if (speedFloat > PLAYBACK_SPEED_MAXIMUM) { showInvalidCustomSpeedToast(); Settings.CUSTOM_PLAYBACK_SPEEDS.resetToDefault(); - loadCustomSpeeds(); - return; + return loadCustomSpeeds(); } - customPlaybackSpeeds[i++] = speedFloat; + speeds[i++] = speedFloat; } + + return speeds; } catch (Exception ex) { - Logger.printInfo(() -> "parse error", ex); - Utils.showToastLong(str("revanced_custom_playback_speeds_parse_exception")); + Logger.printInfo(() -> "Parse error", ex); + Utils.showToastShort(str("revanced_custom_playback_speeds_parse_exception")); Settings.CUSTOM_PLAYBACK_SPEEDS.resetToDefault(); - loadCustomSpeeds(); + return loadCustomSpeeds(); } } @@ -113,38 +169,28 @@ public class CustomPlaybackSpeedPatch { recyclerView.getViewTreeObserver().addOnDrawListener(() -> { try { if (PlaybackSpeedMenuFilterPatch.isPlaybackRateSelectorMenuVisible) { - if (hideLithoMenuAndShowOldSpeedMenu(recyclerView, 5)) { + if (hideLithoMenuAndShowCustomSpeedMenu(recyclerView, 5)) { PlaybackSpeedMenuFilterPatch.isPlaybackRateSelectorMenuVisible = false; } - return; } } catch (Exception ex) { - Logger.printException(() -> "isPlaybackRateSelectorMenuVisible failure", ex); - } - - try { - if (PlaybackSpeedMenuFilterPatch.isOldPlaybackSpeedMenuVisible) { - if (hideLithoMenuAndShowOldSpeedMenu(recyclerView, 8)) { - PlaybackSpeedMenuFilterPatch.isOldPlaybackSpeedMenuVisible = false; - } - } - } catch (Exception ex) { - Logger.printException(() -> "isOldPlaybackSpeedMenuVisible failure", ex); + Logger.printException(() -> "onFlyoutMenuCreate failure", ex); } }); } - private static boolean hideLithoMenuAndShowOldSpeedMenu(RecyclerView recyclerView, int expectedChildCount) { + @SuppressWarnings("SameParameterValue") + private static boolean hideLithoMenuAndShowCustomSpeedMenu(RecyclerView recyclerView, int expectedChildCount) { if (recyclerView.getChildCount() == 0) { return false; } View firstChild = recyclerView.getChildAt(0); - if (!(firstChild instanceof ViewGroup PlaybackSpeedParentView)) { + if (!(firstChild instanceof ViewGroup playbackSpeedParentView)) { return false; } - if (PlaybackSpeedParentView.getChildCount() != expectedChildCount) { + if (playbackSpeedParentView.getChildCount() != expectedChildCount) { return false; } @@ -168,23 +214,418 @@ public class CustomPlaybackSpeedPatch { ((ViewGroup) parentView3rd).setVisibility(View.GONE); ((ViewGroup) parentView4th).setVisibility(View.GONE); - // Close the litho speed menu and show the old one. - showOldPlaybackSpeedMenu(); + // Close the litho speed menu and show the modern custom speed dialog. + showModernCustomPlaybackSpeedDialog(recyclerView.getContext()); + Logger.printDebug(() -> "Modern playback speed dialog shown"); return true; } - public static void showOldPlaybackSpeedMenu() { - // This method is sometimes used multiple times. - // To prevent this, ignore method reuse within 1 second. - final long now = System.currentTimeMillis(); - if (now - lastTimeOldPlaybackMenuInvoked < 1000) { - Logger.printDebug(() -> "Ignoring call to showOldPlaybackSpeedMenu"); - return; - } - lastTimeOldPlaybackMenuInvoked = now; - Logger.printDebug(() -> "Old video quality menu shown"); + /** + * Displays a modern custom dialog for adjusting video playback speed. + *

+ * This method creates a dialog with a slider, plus/minus buttons, and preset speed buttons + * to allow the user to modify the video playback speed. The dialog is styled with rounded + * corners and themed colors, positioned at the bottom of the screen. The playback speed + * can be adjusted in 0.05 increments using the slider or buttons, or set directly to preset + * values. The dialog updates the displayed speed in real-time and applies changes to the + * video playback. The dialog is dismissed if the player enters Picture-in-Picture (PiP) mode. + */ + @SuppressLint("SetTextI18n") + public static void showModernCustomPlaybackSpeedDialog(Context context) { + // Create a dialog without a theme for custom appearance. + Dialog dialog = new Dialog(context); + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); // Remove default title bar. - // Rest of the implementation added by patch. + // Store the dialog reference. + currentDialog = new WeakReference<>(dialog); + + // Create main vertical LinearLayout for dialog content. + LinearLayout mainLayout = new LinearLayout(context); + mainLayout.setOrientation(LinearLayout.VERTICAL); + + // Preset size constants. + final int dip4 = dipToPixels(4); // Height for handle bar. + final int dip5 = dipToPixels(5); + final int dip6 = dipToPixels(6); // Padding for mainLayout from bottom. + final int dip8 = dipToPixels(8); // Padding for mainLayout from left and right. + final int dip20 = dipToPixels(20); + final int dip32 = dipToPixels(32); // Height for in-rows speed buttons. + final int dip36 = dipToPixels(36); // Height for minus and plus buttons. + final int dip40 = dipToPixels(40); // Width for handle bar. + final int dip60 = dipToPixels(60); // Height for speed button container. + + mainLayout.setPadding(dip5, dip8, dip5, dip8); + + // Set rounded rectangle background for the main layout. + RoundRectShape roundRectShape = new RoundRectShape( + createCornerRadii(12), null, null); + ShapeDrawable background = new ShapeDrawable(roundRectShape); + background.getPaint().setColor(ThemeHelper.getDialogBackgroundColor()); + mainLayout.setBackground(background); + + // Add handle bar at the top. + View handleBar = new View(context); + ShapeDrawable handleBackground = new ShapeDrawable(new RoundRectShape( + createCornerRadii(4), null, null)); + handleBackground.getPaint().setColor(getAdjustedBackgroundColor(true)); + handleBar.setBackground(handleBackground); + LinearLayout.LayoutParams handleParams = new LinearLayout.LayoutParams( + dip40, // handle bar width. + dip4 // handle bar height. + ); + handleParams.gravity = Gravity.CENTER_HORIZONTAL; // Center horizontally. + handleParams.setMargins(0, 0, 0, dip20); // 20dp bottom margins. + handleBar.setLayoutParams(handleParams); + // Add handle bar view to main layout. + mainLayout.addView(handleBar); + + // Display current playback speed. + TextView currentSpeedText = new TextView(context); + float currentSpeed = VideoInformation.getPlaybackSpeed(); + // Initially show with only 0 minimum digits, so 1.0 shows as 1x + currentSpeedText.setText(formatSpeedStringX(currentSpeed, 0)); + currentSpeedText.setTextColor(ThemeHelper.getForegroundColor()); + currentSpeedText.setTextSize(16); + currentSpeedText.setTypeface(Typeface.DEFAULT_BOLD); + currentSpeedText.setGravity(Gravity.CENTER); + LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); + textParams.setMargins(0, 0, 0, 0); + currentSpeedText.setLayoutParams(textParams); + // Add current speed text view to main layout. + mainLayout.addView(currentSpeedText); + + // Create horizontal layout for slider and +/- buttons. + LinearLayout sliderLayout = new LinearLayout(context); + sliderLayout.setOrientation(LinearLayout.HORIZONTAL); + sliderLayout.setGravity(Gravity.CENTER_VERTICAL); + sliderLayout.setPadding(dip5, dip5, dip5, dip5); // 5dp padding. + + // Create minus button. + Button minusButton = new Button(context, null, 0); // Disable default theme style. + minusButton.setText(""); // No text on button. + ShapeDrawable minusBackground = new ShapeDrawable(new RoundRectShape(createCornerRadii(20), null, null)); + minusBackground.getPaint().setColor(getAdjustedBackgroundColor(false)); + minusButton.setBackground(minusBackground); + OutlineSymbolDrawable minusDrawable = new OutlineSymbolDrawable(false); // Minus symbol. + minusButton.setForeground(minusDrawable); + LinearLayout.LayoutParams minusParams = new LinearLayout.LayoutParams(dip36, dip36); + minusParams.setMargins(0, 0, dip5, 0); // 5dp to slider. + minusButton.setLayoutParams(minusParams); + + // Create slider for speed adjustment. + SeekBar speedSlider = new SeekBar(context); + speedSlider.setMax(speedToProgressValue(customPlaybackSpeedsMax)); + speedSlider.setProgress(speedToProgressValue(currentSpeed)); + speedSlider.getProgressDrawable().setColorFilter( + ThemeHelper.getForegroundColor(), PorterDuff.Mode.SRC_IN); // Theme progress bar. + speedSlider.getThumb().setColorFilter( + ThemeHelper.getForegroundColor(), PorterDuff.Mode.SRC_IN); // Theme slider thumb. + LinearLayout.LayoutParams sliderParams = new LinearLayout.LayoutParams( + 0, LinearLayout.LayoutParams.WRAP_CONTENT, 1f); + sliderParams.setMargins(dip5, 0, dip5, 0); // 5dp to -/+ buttons. + speedSlider.setLayoutParams(sliderParams); + + // Create plus button. + Button plusButton = new Button(context, null, 0); // Disable default theme style. + plusButton.setText(""); // No text on button. + ShapeDrawable plusBackground = new ShapeDrawable(new RoundRectShape( + createCornerRadii(20), null, null)); + plusBackground.getPaint().setColor(getAdjustedBackgroundColor(false)); + plusButton.setBackground(plusBackground); + OutlineSymbolDrawable plusDrawable = new OutlineSymbolDrawable(true); // Plus symbol. + plusButton.setForeground(plusDrawable); + LinearLayout.LayoutParams plusParams = new LinearLayout.LayoutParams(dip36, dip36); + plusParams.setMargins(dip5, 0, 0, 0); // 5dp to slider. + plusButton.setLayoutParams(plusParams); + + // Add -/+ and slider views to slider layout. + sliderLayout.addView(minusButton); + sliderLayout.addView(speedSlider); + sliderLayout.addView(plusButton); + + LinearLayout.LayoutParams sliderLayoutParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); + sliderLayoutParams.setMargins(0, 0, 0, dip5); // 5dp bottom margin. + sliderLayout.setLayoutParams(sliderLayoutParams); + + // Add slider layout to main layout. + mainLayout.addView(sliderLayout); + + Function userSelectedSpeed = newSpeed -> { + final float roundedSpeed = roundSpeedToNearestIncrement(newSpeed); + if (VideoInformation.getPlaybackSpeed() == roundedSpeed) { + // Nothing has changed. New speed rounds to the current speed. + return null; + } + + VideoInformation.overridePlaybackSpeed(roundedSpeed); + RememberPlaybackSpeedPatch.userSelectedPlaybackSpeed(roundedSpeed); + currentSpeedText.setText(formatSpeedStringX(roundedSpeed, 2)); // Update display. + speedSlider.setProgress(speedToProgressValue(roundedSpeed)); // Update slider. + return null; + }; + + // Set listener for slider to update playback speed. + speedSlider.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (fromUser) { + // Convert from progress value to video playback speed. + userSelectedSpeed.apply(customPlaybackSpeedsMin + (progress / PROGRESS_BAR_VALUE_SCALE)); + } + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) {} + + @Override + public void onStopTrackingTouch(SeekBar seekBar) {} + }); + + minusButton.setOnClickListener(v -> userSelectedSpeed.apply( + VideoInformation.getPlaybackSpeed() - 0.05f)); + plusButton.setOnClickListener(v -> userSelectedSpeed.apply( + VideoInformation.getPlaybackSpeed() + 0.05f)); + + // Create GridLayout for preset speed buttons. + GridLayout gridLayout = new GridLayout(context); + gridLayout.setColumnCount(5); // 5 columns for speed buttons. + gridLayout.setAlignmentMode(GridLayout.ALIGN_BOUNDS); + gridLayout.setRowCount((int) Math.ceil(customPlaybackSpeeds.length / 5.0)); + LinearLayout.LayoutParams gridParams = new LinearLayout.LayoutParams( + LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); + gridParams.setMargins(0, 0, 0, 0); // No margins around GridLayout. + gridLayout.setLayoutParams(gridParams); + + // For all buttons show at least 1 zero in decimal (2 -> "2.0"). + speedFormatter.setMinimumFractionDigits(1); + + // Add buttons for each preset playback speed. + for (float speed : customPlaybackSpeeds) { + // Container for button and optional label. + FrameLayout buttonContainer = new FrameLayout(context); + + // Set layout parameters for each grid cell. + GridLayout.LayoutParams containerParams = new GridLayout.LayoutParams(); + containerParams.width = 0; // Equal width for columns. + containerParams.columnSpec = GridLayout.spec(GridLayout.UNDEFINED, 1, 1f); + containerParams.setMargins(dip5, 0, dip5, 0); // Button margins. + containerParams.height = dip60; // Fixed height for button and label. + buttonContainer.setLayoutParams(containerParams); + + // Create speed button. + Button speedButton = new Button(context, null, 0); + speedButton.setText(speedFormatter.format(speed)); // Do not use 'x' speed format. + speedButton.setTextColor(ThemeHelper.getForegroundColor()); + speedButton.setTextSize(12); + speedButton.setAllCaps(false); + speedButton.setGravity(Gravity.CENTER); + + ShapeDrawable buttonBackground = new ShapeDrawable(new RoundRectShape( + createCornerRadii(20), null, null)); + buttonBackground.getPaint().setColor(getAdjustedBackgroundColor(false)); + speedButton.setBackground(buttonBackground); + speedButton.setPadding(dip5, dip5, dip5, dip5); + + // Center button vertically and stretch horizontally in container. + FrameLayout.LayoutParams buttonParams = new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, dip32, Gravity.CENTER); + speedButton.setLayoutParams(buttonParams); + + // Add speed buttons view to buttons container layout. + buttonContainer.addView(speedButton); + + // Add "Normal" label for 1.0x speed. + if (speed == 1.0f) { + TextView normalLabel = new TextView(context); + // Use same 'Normal' string as stock YouTube. + normalLabel.setText(str("normal_playback_rate_label")); + normalLabel.setTextColor(ThemeHelper.getForegroundColor()); + normalLabel.setTextSize(10); + normalLabel.setGravity(Gravity.CENTER); + + FrameLayout.LayoutParams labelParams = new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT, + Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL); + labelParams.bottomMargin = 0; // Position label below button. + normalLabel.setLayoutParams(labelParams); + + buttonContainer.addView(normalLabel); + } + + speedButton.setOnClickListener(v -> userSelectedSpeed.apply(speed)); + + gridLayout.addView(buttonContainer); + } + + // Add in-rows speed buttons layout to main layout. + mainLayout.addView(gridLayout); + + // Wrap mainLayout in another LinearLayout for side margins. + LinearLayout wrapperLayout = new LinearLayout(context); + wrapperLayout.setOrientation(LinearLayout.VERTICAL); + wrapperLayout.setPadding(dip8, 0, dip8, 0); // 8dp side margins. + wrapperLayout.addView(mainLayout); + dialog.setContentView(wrapperLayout); + + // Configure dialog window to appear at the bottom. + Window window = dialog.getWindow(); + if (window != null) { + WindowManager.LayoutParams params = window.getAttributes(); + params.gravity = Gravity.BOTTOM; // Position at bottom of screen. + params.y = dip6; // 6dp margin from bottom. + // In landscape, use the smaller dimension (height) as portrait width. + int portraitWidth = context.getResources().getDisplayMetrics().widthPixels; + if (context.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + portraitWidth = Math.min( + portraitWidth, + context.getResources().getDisplayMetrics().heightPixels); + } + params.width = portraitWidth; // Use portrait width. + params.height = WindowManager.LayoutParams.WRAP_CONTENT; + window.setAttributes(params); + window.setBackgroundDrawable(null); // Remove default dialog background. + } + + // Create observer for PlayerType changes. + Function1 playerTypeObserver = new Function1<>() { + @Override + public Unit invoke(PlayerType type) { + Dialog current = currentDialog.get(); + if (current == null || !current.isShowing()) { + // Should never happen. + PlayerType.getOnChange().removeObserver(this); + Logger.printException(() -> "Removing player type listener as dialog is null or closed"); + } else if (type == PlayerType.WATCH_WHILE_PICTURE_IN_PICTURE) { + current.dismiss(); + Logger.printDebug(() -> "Playback speed dialog dismissed due to PiP mode"); + } + return Unit.INSTANCE; + } + }; + + // Add observer to dismiss dialog when entering PiP mode. + PlayerType.getOnChange().addObserver(playerTypeObserver); + + // Remove observer when dialog is dismissed. + dialog.setOnDismissListener(d -> { + PlayerType.getOnChange().removeObserver(playerTypeObserver); + Logger.printDebug(() -> "PlayerType observer removed on dialog dismiss"); + }); + + // Apply slide-in animation when showing the dialog. + final int fadeDurationFast = Utils.getResourceInteger("fade_duration_fast"); + Animation slideInABottomAnimation = Utils.getResourceAnimation("slide_in_bottom"); + slideInABottomAnimation.setDuration(fadeDurationFast); + mainLayout.startAnimation(slideInABottomAnimation); + + dialog.show(); // Display the dialog. + } + + /** + * Creates an array of corner radii for a rounded rectangle shape. + * + * @param dp The radius in density-independent pixels (dp) to apply to all corners. + * @return An array of eight float values representing the corner radii + * (top-left, top-right, bottom-right, bottom-left). + */ + private static float[] createCornerRadii(float dp) { + final float radius = dipToPixels(dp); + return new float[]{radius, radius, radius, radius, radius, radius, radius, radius}; + } + + /** + * @param speed The playback speed value to format. + * @return A string representation of the speed with 'x' (e.g. "1.25x" or "1.00x"). + */ + private static String formatSpeedStringX(float speed, int minimumFractionDigits) { + speedFormatter.setMinimumFractionDigits(minimumFractionDigits); + return speedFormatter.format(speed) + 'x'; + } + + /** + * @return user speed converted to a value for {@link SeekBar#setProgress(int)}. + */ + private static int speedToProgressValue(float speed) { + return (int) ((speed - customPlaybackSpeedsMin) * PROGRESS_BAR_VALUE_SCALE); + } + + /** + * Rounds the given playback speed to the nearest 0.05 increment and ensures it is within valid bounds. + * + * @param speed The playback speed to round. + * @return The rounded speed, constrained to the specified bounds. + */ + private static float roundSpeedToNearestIncrement(float speed) { + // Round to nearest 0.05 speed. + final float roundedSpeed = Math.round(speed / 0.05f) * 0.05f; + return Utils.clamp(roundedSpeed, 0.05f, PLAYBACK_SPEED_MAXIMUM); + } + + /** + * Adjusts the background color based on the current theme. + * + * @param isHandleBar If true, applies a stronger darkening factor (0.9) for the handle bar in light theme; + * if false, applies a standard darkening factor (0.95) for other elements in light theme. + * @return A modified background color, lightened by 20% for dark themes or darkened by 5% (or 10% for handle bar) + * for light themes to ensure visual contrast. + */ + public static int getAdjustedBackgroundColor(boolean isHandleBar) { + final int baseColor = ThemeHelper.getDialogBackgroundColor(); + float darkThemeFactor = isHandleBar ? 1.25f : 1.115f; // 1.25f for handleBar, 1.115f for others in dark theme. + float lightThemeFactor = isHandleBar ? 0.9f : 0.95f; // 0.9f for handleBar, 0.95f for others in light theme. + return ThemeHelper.isDarkTheme() + ? ThemeHelper.adjustColorBrightness(baseColor, darkThemeFactor) // Lighten for dark theme. + : ThemeHelper.adjustColorBrightness(baseColor, lightThemeFactor); // Darken for light theme. + } +} + +/** + * Custom Drawable for rendering outlined plus and minus symbols on buttons. + */ +class OutlineSymbolDrawable extends Drawable { + private final boolean isPlus; // Determines if the symbol is a plus or minus. + private final Paint paint; + + OutlineSymbolDrawable(boolean isPlus) { + this.isPlus = isPlus; + paint = new Paint(Paint.ANTI_ALIAS_FLAG); // Enable anti-aliasing for smooth rendering. + paint.setColor(ThemeHelper.getForegroundColor()); + paint.setStyle(Paint.Style.STROKE); // Use stroke style for outline. + paint.setStrokeWidth(dipToPixels(1)); // 1dp stroke width. + } + + @Override + public void draw(Canvas canvas) { + Rect bounds = getBounds(); + final int width = bounds.width(); + final int height = bounds.height(); + final float centerX = width / 2f; // Center X coordinate. + final float centerY = height / 2f; // Center Y coordinate. + final float size = Math.min(width, height) * 0.25f; // Symbol size is 25% of button dimensions. + + // Draw horizontal line for both plus and minus symbols. + canvas.drawLine(centerX - size, centerY, centerX + size, centerY, paint); + if (isPlus) { + // Draw vertical line for plus symbol. + canvas.drawLine(centerX, centerY - size, centerX, centerY + size, paint); + } + } + + @Override + public void setAlpha(int alpha) { + paint.setAlpha(alpha); + } + + @Override + public void setColorFilter(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/playback/speed/RememberPlaybackSpeedPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/RememberPlaybackSpeedPatch.java index a6c86477c..04840c761 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/RememberPlaybackSpeedPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/speed/RememberPlaybackSpeedPatch.java @@ -33,10 +33,10 @@ public final class RememberPlaybackSpeedPatch { public static void userSelectedPlaybackSpeed(float playbackSpeed) { try { if (Settings.REMEMBER_PLAYBACK_SPEED_LAST_SELECTED.get()) { - // With the 0.05x menu, if the speed is set by integrations to higher than 2.0x + // With the 0.05x menu, if the speed is set by a patch to higher than 2.0x // then the menu will allow increasing without bounds but the max speed is - // still capped to under 8.0x. - playbackSpeed = Math.min(playbackSpeed, CustomPlaybackSpeedPatch.PLAYBACK_SPEED_MAXIMUM - 0.05f); + // still capped to 8.0x. + playbackSpeed = Math.min(playbackSpeed, CustomPlaybackSpeedPatch.PLAYBACK_SPEED_MAXIMUM); // Prevent toast spamming if using the 0.05x adjustments. // Show exactly one toast after the user stops interacting with the speed menu. @@ -57,7 +57,7 @@ public final class RememberPlaybackSpeedPatch { } Settings.PLAYBACK_SPEED_DEFAULT.save(finalPlaybackSpeed); - Utils.showToastLong(str("revanced_remember_playback_speed_toast", (finalPlaybackSpeed + "x"))); + Utils.showToastShort(str("revanced_remember_playback_speed_toast", (finalPlaybackSpeed + "x"))); }, TOAST_DELAY_MILLISECONDS); } } catch (Exception ex) { 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 1489ffd51..2156bc693 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 @@ -60,7 +60,7 @@ public final class SeekbarColorPatch { * this is the color value of {@link Settings#SEEKBAR_CUSTOM_COLOR_PRIMARY}. * Otherwise this is {@link #ORIGINAL_SEEKBAR_COLOR}. */ - private static int customSeekbarColor = ORIGINAL_SEEKBAR_COLOR; + private static final int customSeekbarColor; /** * Custom seekbar hue, saturation, and brightness values. @@ -77,24 +77,25 @@ public final class SeekbarColorPatch { Color.colorToHSV(ORIGINAL_SEEKBAR_COLOR, hsv); ORIGINAL_SEEKBAR_COLOR_BRIGHTNESS = hsv[2]; - if (SEEKBAR_CUSTOM_COLOR_ENABLED) { - loadCustomSeekbarColor(); - } + customSeekbarColor = SEEKBAR_CUSTOM_COLOR_ENABLED + ? loadCustomSeekbarColor() + : ORIGINAL_SEEKBAR_COLOR; } - private static void loadCustomSeekbarColor() { + private static int loadCustomSeekbarColor() { try { - customSeekbarColor = Color.parseColor(Settings.SEEKBAR_CUSTOM_COLOR_PRIMARY.get()); - Color.colorToHSV(customSeekbarColor, customSeekbarColorHSV); - - customSeekbarColorGradient[0] = customSeekbarColor; + final int color = Color.parseColor(Settings.SEEKBAR_CUSTOM_COLOR_PRIMARY.get()); + Color.colorToHSV(color, customSeekbarColorHSV); + customSeekbarColorGradient[0] = color; customSeekbarColorGradient[1] = Color.parseColor(Settings.SEEKBAR_CUSTOM_COLOR_ACCENT.get()); + + return color; } catch (Exception ex) { Utils.showToastShort(str("revanced_seekbar_custom_color_invalid")); Settings.SEEKBAR_CUSTOM_COLOR_PRIMARY.resetToDefault(); Settings.SEEKBAR_CUSTOM_COLOR_ACCENT.resetToDefault(); - loadCustomSeekbarColor(); + return loadCustomSeekbarColor(); } } @@ -114,6 +115,7 @@ public final class SeekbarColorPatch { : (int) channel3Bits; } + @SuppressWarnings("SameParameterValue") private static String get9BitStyleIdentifier(int color24Bit) { final int r3 = colorChannelTo3Bits(Color.red(color24Bit)); final int g3 = colorChannelTo3Bits(Color.green(color24Bit)); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index 92b222161..4613a5a14 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -63,7 +63,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting CUSTOM_SPEED_MENU = new BooleanSetting("revanced_custom_speed_menu", TRUE); public static final FloatSetting PLAYBACK_SPEED_DEFAULT = new FloatSetting("revanced_playback_speed_default", -2.0f); public static final StringSetting CUSTOM_PLAYBACK_SPEEDS = new StringSetting("revanced_custom_playback_speeds", - "0.25\n0.5\n0.75\n0.9\n0.95\n1.0\n1.05\n1.1\n1.25\n1.5\n1.75\n2.0\n3.0\n4.0\n5.0", true); + "0.25\n0.5\n0.75\n1.0\n1.25\n1.5\n1.75\n2.0\n2.5\n3.0\n4.0\n5.0\n6.0\n7.0\n8.0", true); // Audio public static final BooleanSetting FORCE_ORIGINAL_AUDIO = new BooleanSetting("revanced_force_original_audio", FALSE, new ForceOriginalAudioAvailability()); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/PlaybackSpeedDialogButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/PlaybackSpeedDialogButton.java index 3ac387061..a61ed679c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/PlaybackSpeedDialogButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/PlaybackSpeedDialogButton.java @@ -5,9 +5,13 @@ import android.view.View; import androidx.annotation.Nullable; import app.revanced.extension.shared.Logger; +import app.revanced.extension.youtube.patches.VideoInformation; import app.revanced.extension.youtube.patches.playback.speed.CustomPlaybackSpeedPatch; import app.revanced.extension.youtube.settings.Settings; +import static app.revanced.extension.shared.StringRef.str; +import static app.revanced.extension.shared.Utils.showToastShort; + @SuppressWarnings("unused") public class PlaybackSpeedDialogButton { @Nullable @@ -23,8 +27,27 @@ public class PlaybackSpeedDialogButton { "revanced_playback_speed_dialog_button", "revanced_playback_speed_dialog_button_placeholder", Settings.PLAYBACK_SPEED_DIALOG_BUTTON::get, - view -> CustomPlaybackSpeedPatch.showOldPlaybackSpeedMenu(), - null + view -> { + try { + CustomPlaybackSpeedPatch.showModernCustomPlaybackSpeedDialog(view.getContext()); + } catch (Exception ex) { + Logger.printException(() -> "speed button onClick failure", ex); + } + }, + view -> { + try { + final float speed = (!Settings.REMEMBER_PLAYBACK_SPEED_LAST_SELECTED.get() || + VideoInformation.getPlaybackSpeed() == Settings.PLAYBACK_SPEED_DEFAULT.get()) + ? 1.0f + : Settings.PLAYBACK_SPEED_DEFAULT.get(); + + VideoInformation.overridePlaybackSpeed(speed); + showToastShort(str("revanced_custom_playback_speeds_reset_toast", (speed + "x"))); + } catch (Exception ex) { + Logger.printException(() -> "speed button reset failure", ex); + } + return true; + } ); } catch (Exception ex) { Logger.printException(() -> "initializeButton failure", ex); diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt index 349f7300b..5157f9823 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt @@ -123,3 +123,13 @@ internal val playbackSpeedMenuSpeedChangedFingerprint = fingerprint { Opcode.RETURN_OBJECT, ) } + +internal val playbackSpeedClassFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + returns("L") + parameters("L") + opcodes( + Opcode.RETURN_OBJECT + ) + strings("PLAYBACK_RATE_MENU_BOTTOM_SHEET_FRAGMENT") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index a22934d1c..5a9c5e740 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -7,6 +7,7 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableClass import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable +import app.revanced.patcher.util.smali.toInstructions import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.shared.newVideoQualityChangedFingerprint import app.revanced.patches.youtube.video.playerresponse.Hook @@ -16,6 +17,8 @@ import app.revanced.patches.youtube.video.videoid.hookBackgroundPlayVideoId import app.revanced.patches.youtube.video.videoid.hookPlayerResponseVideoId import app.revanced.patches.youtube.video.videoid.hookVideoId import app.revanced.patches.youtube.video.videoid.videoIdPatch +import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.addStaticFieldToExtension import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.AccessFlags @@ -29,6 +32,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod +import com.android.tools.smali.dexlib2.immutable.ImmutableMethodImplementation import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter import com.android.tools.smali.dexlib2.util.MethodUtil @@ -189,6 +193,72 @@ val videoInformationPatch = bytecodePatch( proxy(classes.first { it.type == setPlaybackSpeedMethodReference.definingClass }) .mutableClass.methods.first { it.name == setPlaybackSpeedMethodReference.name } setPlaybackSpeedMethodIndex = 0 + + // Add override playback speed method. + onPlaybackSpeedItemClickFingerprint.classDef.methods.add( + ImmutableMethod( + definingClass, + "overridePlaybackSpeed", + listOf(ImmutableMethodParameter("F", annotations, null)), + "V", + AccessFlags.PUBLIC.value or AccessFlags.PUBLIC.value, + annotations, + null, + ImmutableMethodImplementation( + 4, + """ + # Check if the playback speed is not auto (-2.0f) + const/4 v0, 0x0 + cmpg-float v0, v3, v0 + if-lez v0, :ignore + + # Get the container class field. + iget-object v0, v2, $setPlaybackSpeedContainerClassFieldReference + + # For some reason, in YouTube 19.44.39 this value is sometimes null. + if-eqz v0, :ignore + + # Get the field from its class. + iget-object v1, v0, $setPlaybackSpeedClassFieldReference + + # Invoke setPlaybackSpeed on that class. + invoke-virtual {v1, v3}, $setPlaybackSpeedMethodReference + + :ignore + return-void + """.toInstructions(), null, null + ) + ).toMutable() + ) + } + + playbackSpeedClassFingerprint.method.apply { + val index = indexOfFirstInstructionOrThrow(Opcode.RETURN_OBJECT) + val register = getInstruction(index).registerA + val playbackSpeedClass = this.returnType + + // Set playback speed class. + addInstructionsAtControlFlowLabel( + index, + "sput-object v$register, $EXTENSION_CLASS_DESCRIPTOR->playbackSpeedClass:$playbackSpeedClass" + ) + + val smaliInstructions = + """ + if-eqz v0, :ignore + invoke-virtual {v0, p0}, $playbackSpeedClass->overridePlaybackSpeed(F)V + return-void + :ignore + nop + """ + + addStaticFieldToExtension( + EXTENSION_CLASS_DESCRIPTOR, + "overridePlaybackSpeed", + "playbackSpeedClass", + playbackSpeedClass, + smaliInstructions + ) } // Handle new playback speed menu. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index d6a7fb561..027be3a1b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -1,19 +1,11 @@ package app.revanced.patches.youtube.video.speed.custom -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get -import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference @@ -27,27 +19,11 @@ import app.revanced.patches.youtube.misc.recyclerviewtree.hook.addRecyclerViewTr import app.revanced.patches.youtube.misc.recyclerviewtree.hook.recyclerViewTreeHookPatch import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.video.speed.settingsMenuVideoSpeedGroup -import app.revanced.util.* -import com.android.tools.smali.dexlib2.AccessFlags +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstLiteralInstruction +import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.immutable.ImmutableField - -internal var speedUnavailableId = -1L - private set - -private val customPlaybackSpeedResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - speedUnavailableId = resourceMappings[ - "string", - "varispeed_unavailable_message", - ] - } -} private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilterPatch;" @@ -64,8 +40,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( addResourcesPatch, lithoFilterPatch, versionCheckPatch, - recyclerViewTreeHookPatch, - customPlaybackSpeedResourcePatch + recyclerViewTreeHookPatch ) execute { @@ -87,38 +62,6 @@ internal val customPlaybackSpeedPatch = bytecodePatch( ) } - // Replace the speeds float array with custom speeds. - speedArrayGeneratorFingerprint.method.apply { - val sizeCallIndex = indexOfFirstInstructionOrThrow { getReference()?.name == "size" } - val sizeCallResultRegister = getInstruction(sizeCallIndex + 1).registerA - - replaceInstruction(sizeCallIndex + 1, "const/4 v$sizeCallResultRegister, 0x0") - - val arrayLengthConstIndex = indexOfFirstLiteralInstructionOrThrow(7) - val arrayLengthConstDestination = getInstruction(arrayLengthConstIndex).registerA - val playbackSpeedsArrayType = "$EXTENSION_CLASS_DESCRIPTOR->customPlaybackSpeeds:[F" - - addInstructions( - arrayLengthConstIndex + 1, - """ - sget-object v$arrayLengthConstDestination, $playbackSpeedsArrayType - array-length v$arrayLengthConstDestination, v$arrayLengthConstDestination - """, - ) - - val originalArrayFetchIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.type == "[F" && reference.definingClass.endsWith("/PlayerConfigModel;") - } - val originalArrayFetchDestination = - getInstruction(originalArrayFetchIndex).registerA - - replaceInstruction( - originalArrayFetchIndex, - "sget-object v$originalArrayFetchDestination, $playbackSpeedsArrayType", - ) - } - // Override the min/max speeds that can be used. speedLimiterFingerprint.method.apply { val limitMinIndex = indexOfFirstLiteralInstructionOrThrow(0.25f) @@ -135,47 +78,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( replaceInstruction(limitMaxIndex, "const/high16 v$limitMaxRegister, 8.0f") } - // Add a static INSTANCE field to the class. - // This is later used to call "showOldPlaybackSpeedMenu" on the instance. - - val instanceField = ImmutableField( - getOldPlaybackSpeedsFingerprint.originalClassDef.type, - "INSTANCE", - getOldPlaybackSpeedsFingerprint.originalClassDef.type, - AccessFlags.PUBLIC.value or AccessFlags.STATIC.value, - null, - null, - null, - ).toMutable() - - getOldPlaybackSpeedsFingerprint.classDef.staticFields.add(instanceField) - // Set the INSTANCE field to the instance of the class. - // In order to prevent a conflict with another patch, add the instruction at index 1. - getOldPlaybackSpeedsFingerprint.method.addInstruction(1, "sput-object p0, $instanceField") - - // Get the "showOldPlaybackSpeedMenu" method. - // This is later called on the field INSTANCE. - val showOldPlaybackSpeedMenuMethod = showOldPlaybackSpeedMenuFingerprint.match( - getOldPlaybackSpeedsFingerprint.classDef, - ).method.toString() - - // Insert the call to the "showOldPlaybackSpeedMenu" method on the field INSTANCE. - showOldPlaybackSpeedMenuExtensionFingerprint.method.apply { - addInstructionsWithLabels( - instructions.lastIndex, - """ - sget-object v0, $instanceField - if-nez v0, :not_null - return-void - :not_null - invoke-virtual { v0 }, $showOldPlaybackSpeedMenuMethod - """, - ) - } - - // region Force old video quality menu. - // This is necessary, because there is no known way of adding custom playback speeds to the new menu. - + // Close the unpatched playback dialog and show the modern custom dialog. addRecyclerViewTreeHook(EXTENSION_CLASS_DESCRIPTOR) // Required to check if the playback speed menu is currently shown. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index 7d4b23ba4..120bb1df3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -1,30 +1,9 @@ package app.revanced.patches.youtube.video.speed.custom import app.revanced.patcher.fingerprint -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getOldPlaybackSpeedsFingerprint = fingerprint { - parameters("[L", "I") - strings("menu_item_playback_speed") -} - -internal val showOldPlaybackSpeedMenuFingerprint = fingerprint { - literal { speedUnavailableId } -} - -internal val showOldPlaybackSpeedMenuExtensionFingerprint = fingerprint { - custom { method, _ -> method.name == "showOldPlaybackSpeedMenu" } -} - -internal val speedArrayGeneratorFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("[L") - parameters("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;") - strings("0.0#") -} - internal val speedLimiterFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index 7e8c5ab21..afcae5f71 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -10,6 +10,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.PatchException import app.revanced.patcher.util.proxy.mutableTypes.MutableClass +import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.shared.misc.mapping.get @@ -31,6 +32,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.ThreeRegisterInstructio import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction import com.android.tools.smali.dexlib2.iface.reference.Reference +import com.android.tools.smali.dexlib2.immutable.ImmutableField import com.android.tools.smali.dexlib2.util.MethodUtil import java.util.EnumSet @@ -962,6 +964,43 @@ private fun MutableMethod.overrideReturnValue(value: String, returnLate: Boolean } } +internal fun BytecodePatchContext.addStaticFieldToExtension( + className: String, + methodName: String, + fieldName: String, + objectClass: String, + smaliInstructions: String +) { + val classDef = classes.find { classDef -> classDef.type == className } + ?: throw PatchException("No matching methods found in: $className") + val mutableClass = proxy(classDef).mutableClass + + val objectCall = "$mutableClass->$fieldName:$objectClass" + + mutableClass.apply { + methods.first { method -> method.name == methodName }.apply { + staticFields.add( + ImmutableField( + definingClass, + fieldName, + objectClass, + AccessFlags.PUBLIC.value or AccessFlags.STATIC.value, + null, + annotations, + null + ).toMutable() + ) + + addInstructionsWithLabels( + 0, + """ + sget-object v0, $objectCall + """ + smaliInstructions + ) + } + } +} + /** * Set the custom condition for this fingerprint to check for a literal value. * diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index 0a51eedb0..5e371ecf8 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -1466,7 +1466,7 @@ Enabling this can unlock higher video qualities" Show speed dialog button - Button is shown + Button is shown. Tap and hold to reset playback speed to default Button is not shown @@ -1478,6 +1478,7 @@ Enabling this can unlock higher video qualities" Custom speeds must be less than %s Invalid custom playback speeds Auto + Playback speed reset to: %s Custom tap and hold speed Playback speed between 0-8 From c33b8cfae1859b4c11abe280afdf18cbf0867edb Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Sun, 1 Jun 2025 09:15:51 +0000 Subject: [PATCH 08/21] chore: Release v5.26.0-dev.3 [skip ci] # [5.26.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.2...v5.26.0-dev.3) (2025-06-01) ### Features * **YouTube - Playback Speed:** Use modern custom speed dialog ([#5069](https://github.com/ReVanced/revanced-patches/issues/5069)) ([9a1e6ca](https://github.com/ReVanced/revanced-patches/commit/9a1e6ca178d9833ee2c681fb130b9290a4e89cd8)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a41e6153..c7cdfcaa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.26.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.2...v5.26.0-dev.3) (2025-06-01) + + +### Features + +* **YouTube - Playback Speed:** Use modern custom speed dialog ([#5069](https://github.com/ReVanced/revanced-patches/issues/5069)) ([9a1e6ca](https://github.com/ReVanced/revanced-patches/commit/9a1e6ca178d9833ee2c681fb130b9290a4e89cd8)) + # [5.26.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.1...v5.26.0-dev.2) (2025-06-01) diff --git a/gradle.properties b/gradle.properties index 1c4d0d024..c8d307c4a 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.26.0-dev.2 +version = 5.26.0-dev.3 From dbeda40ccbd8e6f863aa4217c0b7ffb39769058b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Jun 2025 20:57:25 +0200 Subject: [PATCH 09/21] chore(deps-dev): bump semantic-release from 24.2.1 to 24.2.5 (#5086) --- package-lock.json | 58 +++++++++++++++++++++++++++++------------------ package.json | 2 +- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/package-lock.json b/package-lock.json index f758b6bde..80bae02a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", "gradle-semantic-release-plugin": "^1.10.1", - "semantic-release": "^24.2.1" + "semantic-release": "^24.2.5" } }, "node_modules/@babel/code-frame": { @@ -1964,9 +1964,9 @@ } }, "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", + "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", "dev": true, "license": "MIT", "engines": { @@ -3460,9 +3460,9 @@ "license": "ISC" }, "node_modules/marked": { - "version": "12.0.2", - "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.2.tgz", - "integrity": "sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==", + "version": "15.0.12", + "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", + "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "dev": true, "license": "MIT", "bin": { @@ -3473,24 +3473,38 @@ } }, "node_modules/marked-terminal": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.1.0.tgz", - "integrity": "sha512-+pvwa14KZL74MVXjYdPR3nSInhGhNvPce/3mqLVZT2oUvt654sL1XImFuLZ1pkA866IYZ3ikDTOFUIC7XzpZZg==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-7.3.0.tgz", + "integrity": "sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==", "dev": true, "license": "MIT", "dependencies": { "ansi-escapes": "^7.0.0", - "chalk": "^5.3.0", + "ansi-regex": "^6.1.0", + "chalk": "^5.4.1", "cli-highlight": "^2.1.11", "cli-table3": "^0.6.5", - "node-emoji": "^2.1.3", - "supports-hyperlinks": "^3.0.0" + "node-emoji": "^2.2.0", + "supports-hyperlinks": "^3.1.0" }, "engines": { "node": ">=16.0.0" }, "peerDependencies": { - "marked": ">=1 <14" + "marked": ">=1 <16" + } + }, + "node_modules/marked-terminal/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, "node_modules/meow": { @@ -3607,9 +3621,9 @@ "license": "MIT" }, "node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "dev": true, "license": "MIT", "dependencies": { @@ -6760,9 +6774,9 @@ "license": "MIT" }, "node_modules/semantic-release": { - "version": "24.2.1", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.2.1.tgz", - "integrity": "sha512-z0/3cutKNkLQ4Oy0HTi3lubnjTsdjjgOqmxdPjeYWe6lhFqUPfwslZxRHv3HDZlN4MhnZitb9SLihDkZNxOXfQ==", + "version": "24.2.5", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.2.5.tgz", + "integrity": "sha512-9xV49HNY8C0/WmPWxTlaNleiXhWb//qfMzG2c5X8/k7tuWcu8RssbuS+sujb/h7PiWSXv53mrQvV9hrO9b7vuQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6784,8 +6798,8 @@ "hosted-git-info": "^8.0.0", "import-from-esm": "^2.0.0", "lodash-es": "^4.17.21", - "marked": "^12.0.0", - "marked-terminal": "^7.0.0", + "marked": "^15.0.0", + "marked-terminal": "^7.3.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", diff --git a/package.json b/package.json index 789e20fc8..5c21bb60c 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,6 @@ "@semantic-release/changelog": "^6.0.3", "@semantic-release/git": "^10.0.1", "gradle-semantic-release-plugin": "^1.10.1", - "semantic-release": "^24.2.1" + "semantic-release": "^24.2.5" } } From 32016819d2adbdfdd5e028941d56feda36d20b00 Mon Sep 17 00:00:00 2001 From: Nuckyz <61953774+Nuckyz@users.noreply.github.com> Date: Tue, 3 Jun 2025 04:15:52 -0300 Subject: [PATCH 10/21] feat(Spotify): Add `Hide Create button` patch (#5062) --- extensions/spotify/build.gradle.kts | 4 +- .../createbutton/HideCreateButtonPatch.java | 51 +++++++ .../spotify/misc/UnlockPremiumPatch.java | 65 ++++++-- extensions/spotify/stub/build.gradle.kts | 6 +- patches/api/patches.api | 4 + .../layout/hide/createbutton/Fingerprints.kt | 28 ++++ .../createbutton/HideCreateButtonPatch.kt | 110 ++++++++++++++ .../spotify/layout/theme/CustomThemePatch.kt | 2 +- .../patches/spotify/misc/Fingerprints.kt | 38 +++-- .../spotify/misc/UnlockPremiumPatch.kt | 53 +++++-- .../spotify/misc/extension/ExtensionPatch.kt | 18 +-- .../spotify/misc/privacy/Fingerprints.kt | 82 +++++----- .../misc/privacy/SanitizeSharingLinksPatch.kt | 140 +++++++++--------- .../widgets/FixThirdPartyLaunchersWidgets.kt | 10 ++ .../patches/spotify/shared/Fingerprints.kt | 17 +++ 15 files changed, 461 insertions(+), 167 deletions(-) create mode 100644 extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch.java create mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt diff --git a/extensions/spotify/build.gradle.kts b/extensions/spotify/build.gradle.kts index 4a5ce935d..f4da3ba6f 100644 --- a/extensions/spotify/build.gradle.kts +++ b/extensions/spotify/build.gradle.kts @@ -10,7 +10,7 @@ android { } compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } } diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch.java new file mode 100644 index 000000000..f3003bb31 --- /dev/null +++ b/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch.java @@ -0,0 +1,51 @@ +package app.revanced.extension.spotify.layout.hide.createbutton; + +import java.util.List; + +import app.revanced.extension.shared.Utils; + +@SuppressWarnings("unused") +public final class HideCreateButtonPatch { + + /** + * A list of ids of resources which contain the Create button title. + */ + private static final List CREATE_BUTTON_TITLE_RES_ID_LIST = List.of( + Integer.toString(Utils.getResourceIdentifier("navigationbar_musicappitems_create_title", "string")) + ); + + /** + * The old id of the resource which contained the Create button title. Used in older versions of the app. + */ + private static final int OLD_CREATE_BUTTON_TITLE_RES_ID = + Utils.getResourceIdentifier("bottom_navigation_bar_create_tab_title", "string"); + + /** + * Injection point. This method is called on every navigation bar item to check whether it is the Create button. + * If the navigation bar item is the Create button, it returns null to erase it. + * The method fingerprint used to patch ensures we can safely return null here. + */ + public static Object returnNullIfIsCreateButton(Object navigationBarItem) { + if (navigationBarItem == null) { + return null; + } + + String stringifiedNavigationBarItem = navigationBarItem.toString(); + boolean isCreateButton = CREATE_BUTTON_TITLE_RES_ID_LIST.stream() + .anyMatch(stringifiedNavigationBarItem::contains); + + if (isCreateButton) { + return null; + } + + return navigationBarItem; + } + + /** + * Injection point. Called in older versions of the app. Returns whether the old navigation bar item is the old + * Create button. + */ + public static boolean isOldCreateButton(int oldNavigationBarItemTitleResId) { + return oldNavigationBarItemTitleResId == OLD_CREATE_BUTTON_TITLE_RES_ID; + } +} diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/UnlockPremiumPatch.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/UnlockPremiumPatch.java index f9371db44..f01fee831 100644 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/UnlockPremiumPatch.java +++ b/extensions/spotify/src/main/java/app/revanced/extension/spotify/misc/UnlockPremiumPatch.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.Objects; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; @SuppressWarnings("unused") public final class UnlockPremiumPatch { @@ -22,15 +23,15 @@ public final class UnlockPremiumPatch { private static final boolean IS_SPOTIFY_LEGACY_APP_TARGET; static { - boolean legacy; + boolean isLegacy; try { Class.forName(SPOTIFY_MAIN_ACTIVITY_LEGACY); - legacy = true; + isLegacy = true; } catch (ClassNotFoundException ex) { - legacy = false; + isLegacy = false; } - IS_SPOTIFY_LEGACY_APP_TARGET = legacy; + IS_SPOTIFY_LEGACY_APP_TARGET = isLegacy; } private static class OverrideAttribute { @@ -61,11 +62,12 @@ public final class UnlockPremiumPatch { } } - private static final List OVERRIDES = List.of( + private static final List PREMIUM_OVERRIDES = List.of( // Disables player and app ads. new OverrideAttribute("ads", FALSE), // Works along on-demand, allows playing any song without restriction. new OverrideAttribute("player-license", "premium"), + new OverrideAttribute("player-license-v2", "premium", !IS_SPOTIFY_LEGACY_APP_TARGET), // Disables shuffle being initially enabled when first playing a playlist. new OverrideAttribute("shuffle", FALSE), // Allows playing any song on-demand, without a shuffled order. @@ -91,18 +93,46 @@ public final class UnlockPremiumPatch { new OverrideAttribute("tablet-free", FALSE, false) ); + /** + * A list of home sections feature types ids which should be removed. These ids match the ones from the protobuf + * response which delivers home sections. + */ private static final List REMOVED_HOME_SECTIONS = List.of( Section.VIDEO_BRAND_AD_FIELD_NUMBER, Section.IMAGE_BRAND_AD_FIELD_NUMBER ); + /** + * A list of lists which contain strings that match whether a context menu item should be filtered out. + * The main approach used is matching context menu items by the id of their text resource. + */ + private static final List> FILTERED_CONTEXT_MENU_ITEMS_BY_STRINGS = List.of( + // "Listen to music ad-free" upsell on playlists. + List.of(getResourceIdentifier("context_menu_remove_ads")), + // "Listen to music ad-free" upsell on albums. + List.of(getResourceIdentifier("playlist_entity_reinventfree_adsfree_context_menu_item")), + // "Start a Jam" context menu item, but only filtered if the user does not have premium and the item is + // being used as a Premium upsell (ad). + List.of( + getResourceIdentifier("group_session_context_menu_start"), + "isPremiumUpsell=true" + ) + ); + + /** + * Utility method for returning resources ids as strings. + */ + private static String getResourceIdentifier(String resourceIdentifierName) { + return Integer.toString(Utils.getResourceIdentifier(resourceIdentifierName, "id")); + } + /** * Injection point. Override account attributes. */ - public static void overrideAttribute(Map attributes) { + public static void overrideAttributes(Map attributes) { try { - for (var override : OVERRIDES) { - var attribute = attributes.get(override.key); + for (OverrideAttribute override : PREMIUM_OVERRIDES) { + Object attribute = attributes.get(override.key); if (attribute == null) { if (override.isExpected) { Logger.printException(() -> "'" + override.key + "' expected but not found"); @@ -117,12 +147,12 @@ public final class UnlockPremiumPatch { } } } catch (Exception ex) { - Logger.printException(() -> "overrideAttribute failure", ex); + Logger.printException(() -> "overrideAttributes failure", ex); } } /** - * Injection point. Remove station data from Google assistant URI. + * Injection point. Remove station data from Google Assistant URI. */ public static String removeStationString(String spotifyUriOrUrl) { return spotifyUriOrUrl.replace("spotify:station:", "spotify:"); @@ -130,7 +160,7 @@ public final class UnlockPremiumPatch { /** * Injection point. Remove ads sections from home. - * Depends on patching protobuffer list remove method. + * Depends on patching abstract protobuf list ensureIsMutable method. */ public static void removeHomeSections(List

sections) { try { @@ -139,4 +169,17 @@ public final class UnlockPremiumPatch { Logger.printException(() -> "Remove home sections failure", ex); } } + + /** + * Injection point. Returns whether the context menu item is a Premium ad. + */ + public static boolean isFilteredContextMenuItem(Object contextMenuItem) { + if (contextMenuItem == null) { + return false; + } + + String stringifiedContextMenuItem = contextMenuItem.toString(); + return FILTERED_CONTEXT_MENU_ITEMS_BY_STRINGS.stream() + .anyMatch(filters -> filters.stream().allMatch(stringifiedContextMenuItem::contains)); + } } diff --git a/extensions/spotify/stub/build.gradle.kts b/extensions/spotify/stub/build.gradle.kts index a8da923ed..61a9e204a 100644 --- a/extensions/spotify/stub/build.gradle.kts +++ b/extensions/spotify/stub/build.gradle.kts @@ -7,11 +7,11 @@ android { compileSdk = 34 defaultConfig { - minSdk = 26 + minSdk = 24 } compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } } diff --git a/patches/api/patches.api b/patches/api/patches.api index 83e6c7afe..233b3ad9f 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -873,6 +873,10 @@ public final class app/revanced/patches/soundcloud/offlinesync/EnableOfflineSync public static final fun getEnableOfflineSync ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatchKt { + public static final fun getHideCreateButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/spotify/layout/theme/CustomThemePatchKt { public static final fun getCustomThemePatch ()Lapp/revanced/patcher/patch/ResourcePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt new file mode 100644 index 000000000..5d555b187 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt @@ -0,0 +1,28 @@ +package app.revanced.patches.spotify.layout.hide.createbutton + +import app.revanced.patcher.fingerprint +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +internal val navigationBarItemSetClassFingerprint = fingerprint { + strings("NavigationBarItemSet(") +} + +internal val navigationBarItemSetConstructorFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + // Make sure the method checks whether navigation bar items are null before adding them. + // If this is not true, then we cannot patch the method and potentially transform the parameters into null. + opcodes(Opcode.IF_EQZ, Opcode.INVOKE_VIRTUAL) + custom { method, _ -> + method.indexOfFirstInstruction { + getReference()?.name == "add" + } >= 0 + } +} + +internal val oldNavigationBarAddItemFingerprint = fingerprint { + strings("Bottom navigation tabs exceeds maximum of 5 tabs") +} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt new file mode 100644 index 000000000..9685f0463 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt @@ -0,0 +1,110 @@ +package app.revanced.patches.spotify.layout.hide.createbutton + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch +import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import java.util.logging.Logger + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch;" + +@Suppress("unused") +val hideCreateButtonPatch = bytecodePatch( + name = "Hide Create button", + description = "Hides the \"Create\" button in the navigation bar." +) { + compatibleWith("com.spotify.music") + + dependsOn(sharedExtensionPatch) + + execute { + if (IS_SPOTIFY_LEGACY_APP_TARGET) { + Logger.getLogger(this::class.java.name).warning( + "Create button does not exist in legacy app target. No changes applied." + ) + return@execute + } + + val oldNavigationBarAddItemMethod = oldNavigationBarAddItemFingerprint.originalMethodOrNull + // Only throw the fingerprint error when oldNavigationBarAddItemMethod does not exist. + val navigationBarItemSetClassDef = if (oldNavigationBarAddItemMethod == null) { + navigationBarItemSetClassFingerprint.originalClassDef + } else { + navigationBarItemSetClassFingerprint.originalClassDefOrNull + } + + if (navigationBarItemSetClassDef != null) { + // Main patch for newest and most versions. + // The NavigationBarItemSet constructor accepts multiple parameters which represent each navigation bar item. + // Each item is manually checked whether it is not null and then added to a LinkedHashSet. + // Since the order of the items can differ, we are required to check every parameter to see whether it is the + // Create button. So, for every parameter passed to the method, invoke our extension method and overwrite it + // to null in case it is the Create button. + navigationBarItemSetConstructorFingerprint.match(navigationBarItemSetClassDef).method.apply { + // Add 1 to the index because the first parameter register is `this`. + val parameterTypesWithRegister = parameterTypes.mapIndexed { index, parameterType -> + parameterType to (index + 1) + } + + val returnNullIfIsCreateButtonDescriptor = + "$EXTENSION_CLASS_DESCRIPTOR->returnNullIfIsCreateButton(Ljava/lang/Object;)Ljava/lang/Object;" + + parameterTypesWithRegister.reversed().forEach { (parameterType, parameterRegister) -> + addInstructions( + 0, + """ + invoke-static { p$parameterRegister }, $returnNullIfIsCreateButtonDescriptor + move-result-object p$parameterRegister + check-cast p$parameterRegister, $parameterType + """ + ) + } + } + } + + if (oldNavigationBarAddItemMethod != null) { + // In case an older version of the app is being patched, hook the old method which adds navigation bar items. + // Return null early if the navigation bar item title resource id is old Create button title resource id. + oldNavigationBarAddItemFingerprint.methodOrNull?.apply { + val getNavigationBarItemTitleStringIndex = indexOfFirstInstructionOrThrow { + val reference = getReference() + reference?.definingClass == "Landroid/content/res/Resources;" && reference.name == "getString" + } + // This register is a parameter register, so it can be used at the start of the method when adding + // the new instructions. + val oldNavigationBarItemTitleResIdRegister = + getInstruction(getNavigationBarItemTitleStringIndex).registerD + + // The instruction where the normal method logic starts. + val firstInstruction = getInstruction(0) + + val isOldCreateButtonDescriptor = + "$EXTENSION_CLASS_DESCRIPTOR->isOldCreateButton(I)Z" + + addInstructionsWithLabels( + 0, + """ + invoke-static { v$oldNavigationBarItemTitleResIdRegister }, $isOldCreateButtonDescriptor + move-result v0 + + # If this navigation bar item is not the Create button, jump to the normal method logic. + if-eqz v0, :normal-method-logic + + # Return null early because this method return value is a BottomNavigationItemView. + const/4 v0, 0 + return-object v0 + """, + ExternalLabel("normal-method-logic", firstInstruction) + ) + } + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt index da0d8482d..67a5d65a7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt @@ -8,8 +8,8 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.stringOption import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.spotify.misc.extension.IS_SPOTIFY_LEGACY_APP_TARGET import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch +import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET import app.revanced.util.* import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt index 708ec7e77..a797763a0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt @@ -1,15 +1,18 @@ package app.revanced.patches.spotify.misc import app.revanced.patcher.fingerprint -import app.revanced.patches.spotify.misc.extension.IS_SPOTIFY_LEGACY_APP_TARGET +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.FieldReference +import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.TypeReference -internal val accountAttributeFingerprint = fingerprint { +context(BytecodePatchContext) +internal val accountAttributeFingerprint get() = fingerprint { custom { _, classDef -> classDef.type == if (IS_SPOTIFY_LEGACY_APP_TARGET) { "Lcom/spotify/useraccount/v1/AccountAttribute;" @@ -19,7 +22,8 @@ internal val accountAttributeFingerprint = fingerprint { } } -internal val productStateProtoGetMapFingerprint = fingerprint { +context(BytecodePatchContext) +internal val productStateProtoGetMapFingerprint get() = fingerprint { returns("Ljava/util/Map;") custom { _, classDef -> classDef.type == if (IS_SPOTIFY_LEGACY_APP_TARGET) { @@ -34,9 +38,22 @@ internal val buildQueryParametersFingerprint = fingerprint { strings("trackRows", "device_type:tablet") } -internal val contextMenuExperimentsFingerprint = fingerprint { +internal val contextMenuViewModelClassFingerprint = fingerprint { + strings("ContextMenuViewModel(header=") +} + +internal val contextMenuViewModelAddItemFingerprint = fingerprint { parameters("L") - strings("remove_ads_upsell_enabled") + returns("V") + custom { method, _ -> + method.indexOfFirstInstruction { + getReference()?.name == "add" + } >= 0 + } +} + +internal val getViewModelFingerprint = fingerprint { + custom { method, _ -> method.name == "getViewModel" } } internal val contextFromJsonFingerprint = fingerprint { @@ -47,15 +64,15 @@ internal val contextFromJsonFingerprint = fingerprint { Opcode.MOVE_RESULT_OBJECT, Opcode.INVOKE_STATIC ) - custom { methodDef, classDef -> - methodDef.name == "fromJson" && + custom { method, classDef -> + method.name == "fromJson" && classDef.endsWith("voiceassistants/playermodels/ContextJsonAdapter;") } } internal val readPlayerOptionOverridesFingerprint = fingerprint { - custom { methodDef, classDef -> - methodDef.name == "readPlayerOptionOverrides" && + custom { method, classDef -> + method.name == "readPlayerOptionOverrides" && classDef.endsWith("voiceassistants/playermodels/PreparePlayOptionsJsonAdapter;") } } @@ -91,7 +108,8 @@ internal val homeStructureGetSectionsFingerprint = fingerprint { internal fun reactivexFunctionApplyWithClassInitFingerprint(className: String) = fingerprint { returns("Ljava/lang/Object;") parameters("Ljava/lang/Object;") - custom { method, _ -> method.name == "apply" && method.indexOfFirstInstruction { + custom { method, _ -> + method.name == "apply" && method.indexOfFirstInstruction { opcode == Opcode.NEW_INSTANCE && getReference()?.type?.endsWith(className) == true } >= 0 } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/UnlockPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/UnlockPremiumPatch.kt index 3e16751ab..d32ce24b3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/UnlockPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/UnlockPremiumPatch.kt @@ -2,20 +2,21 @@ package app.revanced.patches.spotify.misc import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableClass import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.spotify.misc.extension.IS_SPOTIFY_LEGACY_APP_TARGET +import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch +import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET import app.revanced.util.* import app.revanced.util.toPublicAccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -60,7 +61,7 @@ val unlockPremiumPatch = bytecodePatch( addInstruction( getAttributesMapIndex + 1, "invoke-static { v$attributesMapRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->overrideAttribute(Ljava/util/Map;)V" + "$EXTENSION_CLASS_DESCRIPTOR->overrideAttributes(Ljava/util/Map;)V" ) } @@ -71,7 +72,7 @@ val unlockPremiumPatch = bytecodePatch( buildQueryParametersFingerprint.stringMatches!!.first().index, Opcode.IF_EQZ ) - replaceInstruction(addQueryParameterConditionIndex, "nop") + removeInstruction(addQueryParameterConditionIndex) } @@ -119,14 +120,42 @@ val unlockPremiumPatch = bytecodePatch( } - // Disable the "Spotify Premium" upsell experiment in context menus. - contextMenuExperimentsFingerprint.method.apply { - val moveIsEnabledIndex = indexOfFirstInstructionOrThrow( - contextMenuExperimentsFingerprint.stringMatches!!.first().index, Opcode.MOVE_RESULT - ) - val isUpsellEnabledRegister = getInstruction(moveIsEnabledIndex).registerA + val contextMenuViewModelClassDef = contextMenuViewModelClassFingerprint.originalClassDef - replaceInstruction(moveIsEnabledIndex, "const/4 v$isUpsellEnabledRegister, 0") + // Hook the method which adds context menu items and return before adding if the item is a Premium ad. + contextMenuViewModelAddItemFingerprint.match(contextMenuViewModelClassDef).method.apply { + val contextMenuItemClassType = parameterTypes.first() + val contextMenuItemClassDef = classes.find { + it.type == contextMenuItemClassType + } ?: throw PatchException("Could not find context menu item class.") + + // The class returned by ContextMenuItem->getViewModel, which represents the actual context menu item. + val viewModelClassType = getViewModelFingerprint.match(contextMenuItemClassDef).originalMethod.returnType + + // The instruction where the normal method logic starts. + val firstInstruction = getInstruction(0) + + val isFilteredContextMenuItemDescriptor = + "$EXTENSION_CLASS_DESCRIPTOR->isFilteredContextMenuItem(Ljava/lang/Object;)Z" + + addInstructionsWithLabels( + 0, + """ + # The first parameter is the context menu item being added. + # Invoke getViewModel to get the actual context menu item. + invoke-interface { p1 }, $contextMenuItemClassType->getViewModel()$viewModelClassType + move-result-object v0 + + # Check if this context menu item should be filtered out. + invoke-static { v0 }, $isFilteredContextMenuItemDescriptor + move-result v0 + + # If this context menu item should not be filtered out, jump to the normal method logic. + if-eqz v0, :normal-method-logic + return-void + """, + ExternalLabel("normal-method-logic", firstInstruction) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/ExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/ExtensionPatch.kt index 438fe49df..048228871 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/ExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/ExtensionPatch.kt @@ -1,21 +1,5 @@ package app.revanced.patches.spotify.misc.extension -import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.shared.misc.extension.sharedExtensionPatch -import app.revanced.patches.spotify.shared.SPOTIFY_MAIN_ACTIVITY_LEGACY -/** - * If patching a legacy 8.x target. This may also be set if patching slightly older/newer app targets, - * but the only legacy target of interest is 8.6.98.900 as it's the last version that - * supports Spotify integration on Kenwood/Pioneer car stereos. - */ -internal var IS_SPOTIFY_LEGACY_APP_TARGET = false - -val sharedExtensionPatch = bytecodePatch { - dependsOn(sharedExtensionPatch("spotify", mainActivityOnCreateHook)) - - execute { - IS_SPOTIFY_LEGACY_APP_TARGET = mainActivityOnCreateHook.fingerprint - .originalClassDef.type == SPOTIFY_MAIN_ACTIVITY_LEGACY - } -} +val sharedExtensionPatch = sharedExtensionPatch("spotify", mainActivityOnCreateHook) diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt index 3d60abf9b..a2d65561d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt @@ -1,41 +1,41 @@ -package app.revanced.patches.spotify.misc.privacy - -import app.revanced.patcher.fingerprint -import app.revanced.util.literal -import com.android.tools.smali.dexlib2.AccessFlags - -internal val shareCopyUrlFingerprint = fingerprint { - returns("Ljava/lang/Object;") - parameters("Ljava/lang/Object;") - strings("clipboard", "Spotify Link") - custom { method, _ -> - method.name == "invokeSuspend" - } -} - -internal val shareCopyUrlLegacyFingerprint = fingerprint { - returns("Ljava/lang/Object;") - parameters("Ljava/lang/Object;") - strings("clipboard", "createNewSession failed") - custom { method, _ -> - method.name == "apply" - } -} - -internal val formatAndroidShareSheetUrlFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Ljava/lang/String;") - parameters("L", "Ljava/lang/String;") - literal { - '\n'.code.toLong() - } -} - -internal val formatAndroidShareSheetUrlLegacyFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC) - returns("Ljava/lang/String;") - parameters("Lcom/spotify/share/social/sharedata/ShareData;", "Ljava/lang/String;") - literal { - '\n'.code.toLong() - } -} +package app.revanced.patches.spotify.misc.privacy + +import app.revanced.patcher.fingerprint +import app.revanced.util.literal +import com.android.tools.smali.dexlib2.AccessFlags + +internal val shareCopyUrlFingerprint = fingerprint { + returns("Ljava/lang/Object;") + parameters("Ljava/lang/Object;") + strings("clipboard", "Spotify Link") + custom { method, _ -> + method.name == "invokeSuspend" + } +} + +internal val shareCopyUrlLegacyFingerprint = fingerprint { + returns("Ljava/lang/Object;") + parameters("Ljava/lang/Object;") + strings("clipboard", "createNewSession failed") + custom { method, _ -> + method.name == "apply" + } +} + +internal val formatAndroidShareSheetUrlFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + returns("Ljava/lang/String;") + parameters("L", "Ljava/lang/String;") + literal { + '\n'.code.toLong() + } +} + +internal val formatAndroidShareSheetUrlLegacyFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC) + returns("Ljava/lang/String;") + parameters("Lcom/spotify/share/social/sharedata/ShareData;", "Ljava/lang/String;") + literal { + '\n'.code.toLong() + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt index 8df4c7720..7fe59394d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt @@ -1,70 +1,70 @@ -package app.revanced.patches.spotify.misc.privacy - -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.spotify.misc.extension.IS_SPOTIFY_LEGACY_APP_TARGET -import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference - -private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch;" - -@Suppress("unused") -val sanitizeSharingLinksPatch = bytecodePatch( - name = "Sanitize sharing links", - description = "Removes the tracking query parameters from links before they are shared.", -) { - compatibleWith("com.spotify.music") - - dependsOn(sharedExtensionPatch) - - execute { - val extensionMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->" + - "sanitizeUrl(Ljava/lang/String;)Ljava/lang/String;" - - val copyFingerprint = if (IS_SPOTIFY_LEGACY_APP_TARGET) { - shareCopyUrlLegacyFingerprint - } else { - shareCopyUrlFingerprint - } - - copyFingerprint.method.apply { - val newPlainTextInvokeIndex = indexOfFirstInstructionOrThrow { - getReference()?.name == "newPlainText" - } - val register = getInstruction(newPlainTextInvokeIndex).registerD - - addInstructions( - newPlainTextInvokeIndex, - """ - invoke-static { v$register }, $extensionMethodDescriptor - move-result-object v$register - """ - ) - } - - // Android native share sheet is used for all other quick share types (X, WhatsApp, etc). - val shareUrlParameter : String - val shareSheetFingerprint : Fingerprint - if (IS_SPOTIFY_LEGACY_APP_TARGET) { - shareSheetFingerprint = formatAndroidShareSheetUrlLegacyFingerprint - shareUrlParameter = "p2" - } else { - shareSheetFingerprint = formatAndroidShareSheetUrlFingerprint - shareUrlParameter = "p1" - } - - shareSheetFingerprint.method.addInstructions( - 0, - """ - invoke-static { $shareUrlParameter }, $extensionMethodDescriptor - move-result-object $shareUrlParameter - """ - ) - } -} +package app.revanced.patches.spotify.misc.privacy + +import app.revanced.patcher.Fingerprint +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch +import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +import com.android.tools.smali.dexlib2.iface.reference.MethodReference + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/spotify/misc/privacy/SanitizeSharingLinksPatch;" + +@Suppress("unused") +val sanitizeSharingLinksPatch = bytecodePatch( + name = "Sanitize sharing links", + description = "Removes the tracking query parameters from links before they are shared.", +) { + compatibleWith("com.spotify.music") + + dependsOn(sharedExtensionPatch) + + execute { + val extensionMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->" + + "sanitizeUrl(Ljava/lang/String;)Ljava/lang/String;" + + val copyFingerprint = if (IS_SPOTIFY_LEGACY_APP_TARGET) { + shareCopyUrlLegacyFingerprint + } else { + shareCopyUrlFingerprint + } + + copyFingerprint.method.apply { + val newPlainTextInvokeIndex = indexOfFirstInstructionOrThrow { + getReference()?.name == "newPlainText" + } + val urlRegister = getInstruction(newPlainTextInvokeIndex).registerD + + addInstructions( + newPlainTextInvokeIndex, + """ + invoke-static { v$urlRegister }, $extensionMethodDescriptor + move-result-object v$urlRegister + """ + ) + } + + // Android native share sheet is used for all other quick share types (X, WhatsApp, etc). + val shareUrlParameter : String + val shareSheetFingerprint : Fingerprint + if (IS_SPOTIFY_LEGACY_APP_TARGET) { + shareSheetFingerprint = formatAndroidShareSheetUrlLegacyFingerprint + shareUrlParameter = "p2" + } else { + shareSheetFingerprint = formatAndroidShareSheetUrlFingerprint + shareUrlParameter = "p1" + } + + shareSheetFingerprint.method.addInstructions( + 0, + """ + invoke-static { $shareUrlParameter }, $extensionMethodDescriptor + move-result-object $shareUrlParameter + """ + ) + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt index ad40f24e2..c84b43f71 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt @@ -1,7 +1,9 @@ package app.revanced.patches.spotify.misc.widgets import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET import app.revanced.util.returnEarly +import java.util.logging.Logger @Suppress("unused") val fixThirdPartyLaunchersWidgets = bytecodePatch( @@ -11,6 +13,14 @@ val fixThirdPartyLaunchersWidgets = bytecodePatch( compatibleWith("com.spotify.music") execute { + if (IS_SPOTIFY_LEGACY_APP_TARGET) { + // The permission check does not exist in legacy versions. + Logger.getLogger(this::class.java.name).warning( + "Legacy app target does not have any third party launcher restrictions. No changes applied." + ) + return@execute + } + // Only system app launchers are granted the BIND_APPWIDGET permission. // Override the method that checks for it to always return true, as this permission is not actually required // for the widgets to work. diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt index 1afbcde45..b107fd267 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt @@ -1,6 +1,8 @@ package app.revanced.patches.spotify.shared import app.revanced.patcher.fingerprint +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patches.spotify.misc.extension.mainActivityOnCreateHook private const val SPOTIFY_MAIN_ACTIVITY = "Lcom/spotify/music/SpotifyMainActivity;" @@ -15,3 +17,18 @@ internal val mainActivityOnCreateFingerprint = fingerprint { || classDef.type == SPOTIFY_MAIN_ACTIVITY_LEGACY) } } + +private var isLegacyAppTarget: Boolean? = null + +/** + * If patching a legacy 8.x target. This may also be set if patching slightly older/newer app targets, + * but the only legacy target of interest is 8.6.98.900 as it's the last version that + * supports Spotify integration on Kenwood/Pioneer car stereos. + */ +context(BytecodePatchContext) +internal val IS_SPOTIFY_LEGACY_APP_TARGET get(): Boolean { + if (isLegacyAppTarget == null) { + isLegacyAppTarget = mainActivityOnCreateHook.fingerprint.originalClassDef.type == SPOTIFY_MAIN_ACTIVITY_LEGACY + } + return isLegacyAppTarget!! +} From e02b585035e69e2ee83408662656eb38b8553488 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 3 Jun 2025 07:18:30 +0000 Subject: [PATCH 11/21] chore: Release v5.26.0-dev.4 [skip ci] # [5.26.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.3...v5.26.0-dev.4) (2025-06-03) ### Features * **Spotify:** Add `Hide Create button` patch ([#5062](https://github.com/ReVanced/revanced-patches/issues/5062)) ([3201681](https://github.com/ReVanced/revanced-patches/commit/32016819d2adbdfdd5e028941d56feda36d20b00)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c7cdfcaa7..d0c8ebd21 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.26.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.3...v5.26.0-dev.4) (2025-06-03) + + +### Features + +* **Spotify:** Add `Hide Create button` patch ([#5062](https://github.com/ReVanced/revanced-patches/issues/5062)) ([3201681](https://github.com/ReVanced/revanced-patches/commit/32016819d2adbdfdd5e028941d56feda36d20b00)) + # [5.26.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.2...v5.26.0-dev.3) (2025-06-01) diff --git a/gradle.properties b/gradle.properties index c8d307c4a..ab36898d2 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.26.0-dev.3 +version = 5.26.0-dev.4 From e8aa9c31ebb705721ef55fb71c273cf7aaed25f2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 09:59:31 +0200 Subject: [PATCH 12/21] chore: Sync translations (#5095) --- .../addresources/values-ar-rSA/strings.xml | 3 +- .../addresources/values-az-rAZ/strings.xml | 1 - .../addresources/values-be-rBY/strings.xml | 3 +- .../addresources/values-bg-rBG/strings.xml | 3 +- .../addresources/values-bn-rBD/strings.xml | 3 +- .../addresources/values-ca-rES/strings.xml | 3 +- .../addresources/values-cs-rCZ/strings.xml | 3 +- .../addresources/values-da-rDK/strings.xml | 3 +- .../addresources/values-de-rDE/strings.xml | 3 +- .../addresources/values-el-rGR/strings.xml | 3 +- .../addresources/values-es-rES/strings.xml | 3 +- .../addresources/values-et-rEE/strings.xml | 3 +- .../addresources/values-fi-rFI/strings.xml | 1 - .../addresources/values-fil-rPH/strings.xml | 3 +- .../addresources/values-fr-rFR/strings.xml | 3 +- .../addresources/values-ga-rIE/strings.xml | 3 +- .../addresources/values-hu-rHU/strings.xml | 3 +- .../addresources/values-hy-rAM/strings.xml | 3 +- .../addresources/values-in-rID/strings.xml | 7 +- .../addresources/values-it-rIT/strings.xml | 3 +- .../addresources/values-iw-rIL/strings.xml | 3 +- .../addresources/values-ja-rJP/strings.xml | 25 ++-- .../addresources/values-ko-rKR/strings.xml | 11 +- .../addresources/values-lt-rLT/strings.xml | 3 +- .../addresources/values-lv-rLV/strings.xml | 3 +- .../addresources/values-nl-rNL/strings.xml | 3 +- .../addresources/values-pl-rPL/strings.xml | 3 +- .../addresources/values-pt-rBR/strings.xml | 3 +- .../addresources/values-pt-rPT/strings.xml | 3 +- .../addresources/values-ro-rRO/strings.xml | 3 +- .../addresources/values-ru-rRU/strings.xml | 3 +- .../addresources/values-sk-rSK/strings.xml | 3 +- .../addresources/values-sl-rSI/strings.xml | 3 +- .../addresources/values-sq-rAL/strings.xml | 3 +- .../addresources/values-sr-rCS/strings.xml | 3 +- .../addresources/values-sr-rSP/strings.xml | 3 +- .../addresources/values-sv-rSE/strings.xml | 3 +- .../addresources/values-th-rTH/strings.xml | 3 +- .../addresources/values-tr-rTR/strings.xml | 3 +- .../addresources/values-uk-rUA/strings.xml | 3 +- .../addresources/values-vi-rVN/strings.xml | 121 +++++++++--------- .../addresources/values-zh-rCN/strings.xml | 2 +- .../addresources/values-zh-rTW/strings.xml | 2 +- 43 files changed, 156 insertions(+), 119 deletions(-) diff --git a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml index b79abddd2..c42ac772c 100644 --- a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml +++ b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml @@ -1398,7 +1398,7 @@ Second \"item\" text" عرض زر مربع حوار السرعة - يتم عرض الزر + الزر معروض. انقر مع الاستمرار لإعادة ضبط سرعة التشغيل إلى الوضع الافتراضي لا يتم عرض الزر @@ -1410,6 +1410,7 @@ Second \"item\" text" يجب أن تكون سرعات التشغيل المخصصة أقل من %s سرعة التشغيل المخصصة غير صالحة تلقائي + تمت إعادة ضبط سرعة التشغيل إلى: %s سرعة النقر مع الاستمرار المخصصة سرعة التشغيل بين 0-8 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 847da8130..d450a7dd7 100644 --- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml +++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml @@ -1397,7 +1397,6 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər Sürət dialoq düyməsini göstər - Düymə göstərilir Düymə göstərilmir diff --git a/patches/src/main/resources/addresources/values-be-rBY/strings.xml b/patches/src/main/resources/addresources/values-be-rBY/strings.xml index 0809d922d..2fa9a6b95 100644 --- a/patches/src/main/resources/addresources/values-be-rBY/strings.xml +++ b/patches/src/main/resources/addresources/values-be-rBY/strings.xml @@ -1399,7 +1399,7 @@ Second \"item\" text" Паказаць дыялогавую кнопку хуткасці - Паказана кнопка + Кнопка паказана. Націсніце і ўтрымлівайце, каб скінуць хуткасць прайгравання да стандартнай Кнопка не паказваецца @@ -1411,6 +1411,7 @@ Second \"item\" text" Нестандартныя хуткасці павінны быць менш за %s Несапраўдныя нестандартныя хуткасці прайгравання Аўто + Хуткасць прайгравання скінута да: %s Уласны хуткасць націску і ўтрымання Хуткасць прайгравання між 0-8 diff --git a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml index 6becb64f3..40d882f9b 100644 --- a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml +++ b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml @@ -1398,7 +1398,7 @@ Second \"item\" text" Показване бутон за скорост - Бутона \"Уведоми ме\" се показва. + Бутонът е показан. Докоснете и задръжте, за да върнете скоростта на възпроизвеждане към стойността по подразбиране Бутонът не е показан @@ -1410,6 +1410,7 @@ Second \"item\" text" Персонализираните скорости трябва да са по-малки от %s Невалидни персонализирани скорости на възпроизвеждане Авто + Скоростта на възпроизвеждане е нулирана на: %s Персонализирана скорост при докосване и задържане Скорост на възпроизвеждане между 0-8 diff --git a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml index e6506f291..03cab4f26 100644 --- a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml +++ b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml @@ -1394,7 +1394,7 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট স্পিড ডায়ালগ বোতাম দেখান - বোতাম প্রদর্শিত হয়েছে + বোতামটি দেখানো হয়েছে। প্লেব্যাক স্পীড ডিফল্টে রিসেট করতে ট্যাপ করে ধরে রাখুন। বোতাম প্রদর্শিত হয়নি @@ -1406,6 +1406,7 @@ DeArrow সম্পর্কে আরও জানতে এখানে ট কাস্টম গতি %s এর চেয়ে কম হতে হবে অবৈধ কাস্টম প্লেব্যাক গতি স্বতস্ফূর্তভাবে + প্লেব্যাক গতি রিসেট করা হয়েছে: %s কাস্টম ট্যাপ এন্ড হোল্ড স্পিড ০-৮ এর মধ্যে প্লেব্যাক স্পিড diff --git a/patches/src/main/resources/addresources/values-ca-rES/strings.xml b/patches/src/main/resources/addresources/values-ca-rES/strings.xml index 2f3a35345..365d1d73c 100644 --- a/patches/src/main/resources/addresources/values-ca-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-ca-rES/strings.xml @@ -1397,7 +1397,7 @@ Si actives aquesta opció, es poden desbloquejar qualitats de vídeo més altes" Mostra el botó del diàleg de velocitat - El botó es mostra + Es mostra el botó. Toqueu i manteniu premut per restablir la velocitat de reproducció per defecte El botó no es mostra @@ -1409,6 +1409,7 @@ Si actives aquesta opció, es poden desbloquejar qualitats de vídeo més altes" Les velocitats personalitzades han de ser inferiors a %s Velocitats de reproducció personalitzades no vàlides Automàtic + Velocitat de reproducció restablerta a: %s Velocitat personalitzada de mantenir premut Velocitat de reproducció entre 0 i 8 diff --git a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml index 763588f8c..78d4be64d 100644 --- a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml +++ b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml @@ -1397,7 +1397,7 @@ Povolením této funkce lze odemknout vyšší kvality videa" Zobrazit tlačítko dialogu rychlosti - Tlačítko je zobrazeno + Tlačítko je zobrazeno. Klepnutím a podržením obnovíte výchozí rychlost přehrávání Tlačítko se nezobrazuje @@ -1409,6 +1409,7 @@ Povolením této funkce lze odemknout vyšší kvality videa" Vlastní rychlosti musí být menší než %s Neplatné vlastní rychlosti přehrávání Automaticky + Rychlost přehrávání obnovena na: %s Vlastní rychlost stisknutí a podržení Rychlost přehrávání 0 až 8 diff --git a/patches/src/main/resources/addresources/values-da-rDK/strings.xml b/patches/src/main/resources/addresources/values-da-rDK/strings.xml index 5ae0ea6af..7dd636c4d 100644 --- a/patches/src/main/resources/addresources/values-da-rDK/strings.xml +++ b/patches/src/main/resources/addresources/values-da-rDK/strings.xml @@ -1342,7 +1342,7 @@ Aktivering af dette kan låse op for højere videokvalitet" Vis hastigheds dialogknap - Knap vises + Knappen vises. Tryk og hold for at nulstille afspilningshastigheden til standard. Knap vises ikke @@ -1354,6 +1354,7 @@ Aktivering af dette kan låse op for højere videokvalitet" Brugerdefinerede hastigheder skal være mindre end %s Ugyldige brugerdefinerede afspilningshastigheder Automatisk + Afspilningshastighed nulstillet til: %s Brugerdefineret hastighed, når du holder den nede Afspilningshastighed mellem 0-8 diff --git a/patches/src/main/resources/addresources/values-de-rDE/strings.xml b/patches/src/main/resources/addresources/values-de-rDE/strings.xml index 461502e85..74f508f4d 100644 --- a/patches/src/main/resources/addresources/values-de-rDE/strings.xml +++ b/patches/src/main/resources/addresources/values-de-rDE/strings.xml @@ -1391,7 +1391,7 @@ Durch Aktivieren dieser Option können höhere Videoqualitäten freigeschaltet w Zeige Geschwindigkeitsdialog Taste - Button wird angezeigt + Die Schaltfläche wird angezeigt. Tippen und halten, um die Wiedergabegeschwindigkeit auf die Standardeinstellung zurückzusetzen. Button wird nicht angezeigt @@ -1403,6 +1403,7 @@ Durch Aktivieren dieser Option können höhere Videoqualitäten freigeschaltet w Benutzerdefinierte Geschwindigkeiten müssen kleiner als %s sein Ungültige benutzerdefinierte Wiedergabegeschwindigkeiten Autom + Wiedergabegeschwindigkeit zurückgesetzt auf: %s Benutzerdefinierte Geschwindigkeit bei Tippen und Halten Abspielgeschwindigkeit zwischen 0-8x diff --git a/patches/src/main/resources/addresources/values-el-rGR/strings.xml b/patches/src/main/resources/addresources/values-el-rGR/strings.xml index 7a1b5cb81..f48350827 100644 --- a/patches/src/main/resources/addresources/values-el-rGR/strings.xml +++ b/patches/src/main/resources/addresources/values-el-rGR/strings.xml @@ -1397,7 +1397,7 @@ Second \"item\" text" Εμφάνιση κουμπιού αλλαγής ταχύτητας - Το κουμπί εμφανίζεται + Εμφανίζεται το κουμπί. Πατήστε παρατεταμένα για να επαναφέρετε την ταχύτητα αναπαραγωγής στην προεπιλογή Το κουμπί δεν εμφανίζεται @@ -1409,6 +1409,7 @@ Second \"item\" text" Οι ταχύτητες πρέπει να είναι μικρότερες από %sx Μη έγκυρες προσαρμοσμένες ταχύτητες αναπαραγωγής Αυτόματη + Η ταχύτητα αναπαραγωγής επαναφέρθηκε σε: %s Προσαρμοσμένη ταχύτητα παρατεταμένου πατήματος Ταχύτητα αναπαραγωγής μεταξύ 0-8 diff --git a/patches/src/main/resources/addresources/values-es-rES/strings.xml b/patches/src/main/resources/addresources/values-es-rES/strings.xml index 2c52ebaea..a3ca44207 100644 --- a/patches/src/main/resources/addresources/values-es-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-es-rES/strings.xml @@ -1386,7 +1386,7 @@ Habilitar esto puede desbloquear calidades de vídeo más altas" Mostrar botón de diálogo de velocidad - Se muestra el botón + Se muestra el botón. Mantén pulsado para restablecer la velocidad de reproducción predeterminada El botón no se muestra @@ -1398,6 +1398,7 @@ Habilitar esto puede desbloquear calidades de vídeo más altas" Las velocidades personalizadas deben ser menores que %s Velocidades de reproducción personalizadas no válidas Automático + Velocidad de reproducción restablecida a: %s Velocidad personalizada al tocar y mantener Velocidad de reproducción entre 0-8 diff --git a/patches/src/main/resources/addresources/values-et-rEE/strings.xml b/patches/src/main/resources/addresources/values-et-rEE/strings.xml index a5b98c054..f32c4ece9 100644 --- a/patches/src/main/resources/addresources/values-et-rEE/strings.xml +++ b/patches/src/main/resources/addresources/values-et-rEE/strings.xml @@ -1398,7 +1398,7 @@ Selle lubamine võib avada kõrgema video kvaliteedi" Kuva kiiruse dialoogi nupp - Nupp kuvatakse + Nupp on nähtaval. Puudutage ja hoidke all, et taastada taasesituse kiirus vaikeväärtusele Nuppi ei kuvata @@ -1410,6 +1410,7 @@ Selle lubamine võib avada kõrgema video kvaliteedi" Kohandatud kiirused peavad olema alla %s Kehtetud kohandatud video taasesituse kiirused Automaatne + Taasesituse kiirus on lähtestatud: %s Kohandatud puuduta ja hoia kiiruse tase Taasesituse kiirus vahemikus 0-8 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 80b2dd574..0f6b96e53 100644 --- a/patches/src/main/resources/addresources/values-fi-rFI/strings.xml +++ b/patches/src/main/resources/addresources/values-fi-rFI/strings.xml @@ -1398,7 +1398,6 @@ Tämä voi avata korkealaatuisemmat videot" Näytä nopeuden valintapainike - Painike näytetään Painiketta ei näytetä diff --git a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml index 6ff3030cf..be9ba2896 100644 --- a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml +++ b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml @@ -1396,7 +1396,7 @@ Ang pagpapagana nito ay maaaring magbukas ng mas mataas na kalidad ng video" Ipakita ang pindutan ng dialog ng bilis - Ang pindutan ay ipinapakita + Ipinapakita ang button. I-tap at i-hold para i-reset ang bilis ng pag-playback sa default Hindi ipinapakita ang button @@ -1408,6 +1408,7 @@ Ang pagpapagana nito ay maaaring magbukas ng mas mataas na kalidad ng video"Ang mga custom na bilis ay dapat na mas mababa sa %s Hindi wastong custom na bilis ng paglalaro Awtomatik + Na-reset ang bilis ng pag-playback sa: %s Custom speed para sa pag-tap at pag-hold Tugtugin ang bilis ng playback sa pagitan ng 0-8 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 9b138efe8..4d82970de 100644 --- a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml +++ b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml @@ -1397,7 +1397,7 @@ Activer cette option peut déverrouiller des qualités vidéo supérieures" Afficher un bouton Vitesse - Le bouton est affiché + Le bouton est affiché. Appuyez longuement dessus pour rétablir la vitesse de lecture par défaut. Le bouton n\'est pas affiché @@ -1409,6 +1409,7 @@ Activer cette option peut déverrouiller des qualités vidéo supérieures"Il doit y avoir moins de %s vitesses personnalisées Vitesses de lecture personnalisées invalides Automatique + Vitesse de lecture réinitialisée à : %s Vitesse personnalisée d\'accélération sur appui long Vitesse de lecture comprise entre 0 et 8 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 859399956..640eb5d42 100644 --- a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml +++ b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml @@ -1398,7 +1398,7 @@ Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil" Taispeáin cnaipe dialóg luais - Taispeántar an cnaipe + Taispeántar an cnaipe. Tapáil agus coinnigh chun luas athsheinm a athshocrú go réamhshocrú Ní thaispeántar an cnaipe @@ -1410,6 +1410,7 @@ Is féidir le seo caighdeáin físeáin níos airde a dhíghlasáil" Ní mór luas saincheaptha a bheith níos lú ná %s Luasanna athsheinm saincheaptha neamhbhailí Uathoibríoch + Athshocraíodh luas athsheinm go: %s Luas tap is agus greim Luas athsheinm eatarthu 0-8 diff --git a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml index 053bcd907..3f03caf7a 100644 --- a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml +++ b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml @@ -1395,7 +1395,7 @@ Ez a beállítás lehetővé teszi a magasabb videóminőségek feloldását" Sebesség párbeszédpanel megjelenítése - A gomb megjelenik + A gomb látható. Tartsa lenyomva a lejátszási sebesség alapértelmezettre állításához A gomb nem látható @@ -1407,6 +1407,7 @@ Ez a beállítás lehetővé teszi a magasabb videóminőségek feloldását"Az egyéni sebességeknek kevesebbnek kell lenniük, mint %s Érvénytelen egyéni lejátszási sebességek Automatikus + Lejátszási sebesség visszaállítva: %s Egyéni koppintás és tartás sebesség Lejátszási sebesség 0-8 között diff --git a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml index 9ade2d524..411728454 100644 --- a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml +++ b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml @@ -1398,7 +1398,7 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի Ցուցադրել արագության դիալոգի պատուհանի կոճակը - Կոճակը ցուցադրվում է + Կոճակը ցուցադրվում է: Հպեք և պահեք՝ նվագարկման արագությունը լռելյայնի վերականգնելու համար Կոճակը չի ցուցադրվում @@ -1410,6 +1410,7 @@ Mini-player-ը կարող է գրավվել էկրանից դուրս՝ դեպի Պատրաստված արագությունները պետք է լինեն ավելի քիչ քան %s Չի աշխատում պատրաստված վերարտադրման արագությունները։ Ավտո + Նվագարկման արագությունը վերականգնվել է. %s Զգայական վերահսկում՝ անվանափոխման համար Վերարտադրման արագությունը 0-8 միջակայքում diff --git a/patches/src/main/resources/addresources/values-in-rID/strings.xml b/patches/src/main/resources/addresources/values-in-rID/strings.xml index 8139cf013..cd4aa849e 100644 --- a/patches/src/main/resources/addresources/values-in-rID/strings.xml +++ b/patches/src/main/resources/addresources/values-in-rID/strings.xml @@ -41,7 +41,7 @@ Second \"item\" text" Mulai ulang Impor Salin - Pengaturan ReVanced diatur ke setelan awal + Pengaturan ReVanced diatur ke bawaan Mengimpor setelan %d Impor gagal: %s Pengaturan pencarian @@ -55,7 +55,7 @@ Second \"item\" text" "Terjemahan untuk beberapa bahasa mungkin hilang atau tidak lengkap. Untuk menerjemahkan bahasa baru kunjungi translate.revanced.app" - Bahasa Aplikasi + Bahasa aplikasi Impor / Ekspor Impor / Ekspor setelan ReVanced @@ -1397,7 +1397,7 @@ Mengaktifkan ini dapat membuka kualitas video yang lebih tinggi" Tampilkan tombol dialog kecepatan - Tombol ditampilkan + Tombol ditampilkan. Ketuk dan tahan untuk mengatur ulang kecepatan pemutaran ke bawaan Tombol tidak ditampilkan @@ -1409,6 +1409,7 @@ Mengaktifkan ini dapat membuka kualitas video yang lebih tinggi" Kecepatan khusus harus kurang dari %s Kecepatan pemutaran khusus tidak valid Otomatis + Kecepatan pemutaran diatur ulang ke: %s Kecepatan ketuk dan tahan khusus Kecepatan pemutaran antara 0-8 diff --git a/patches/src/main/resources/addresources/values-it-rIT/strings.xml b/patches/src/main/resources/addresources/values-it-rIT/strings.xml index c116844d0..02864c17e 100644 --- a/patches/src/main/resources/addresources/values-it-rIT/strings.xml +++ b/patches/src/main/resources/addresources/values-it-rIT/strings.xml @@ -1397,7 +1397,7 @@ Abilitare questa opzione può sbloccare qualità video più elevate" Mostra il pulsante Velocità Video - Il pulsante è visibile + Il pulsante è visualizzato. Tieni premuto per ripristinare la velocità di riproduzione predefinita Il pulsante non è visibile @@ -1409,6 +1409,7 @@ Abilitare questa opzione può sbloccare qualità video più elevate" Le velocità personalizzate devono essere inferiori a %s Velocità di riproduzione personalizzata non valida Automatico + Velocità di riproduzione reimpostata su: %s Velocità personalizzata di tocca e tieni premuto Velocità di riproduzione tra 0-8 diff --git a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml index 17cf445c1..a9a9221d5 100644 --- a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml +++ b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml @@ -1398,7 +1398,7 @@ Second \"item\" text" הצג לחצן דו-שיח של מהירות - הלחצן מוצג + הלחצן מוצג. יש להקיש ולהחזיק כדי לאפס את מהירות ההפעלה לברירת מחדל הלחצן אינו מוצג @@ -1410,6 +1410,7 @@ Second \"item\" text" מהירויות מותאמות אישית חייבות להיות קטנות מ-%s מהירויות הפעלה מותאמות אישית לא חוקיות אוטומטי + מהירות ההפעלה אופסה ל: %s מהירות הקשה והחזקה מותאמת אישית מהירות הפעלה בין 0 ל-8 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 f2e3772dd..b5bdf9c80 100644 --- a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml +++ b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml @@ -140,7 +140,7 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ ログのエクスポートに失敗: $s デバッグログを消去する 保存されている ReVanced のデバッグログをすべて消去します - ログが消去されました + ログを消去しました アルバム情報を非表示 @@ -428,10 +428,10 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ URL をクリップボードにコピーしました タイムスタンプ付きの URL がコピーされました - 「動画の URL をコピー」ボタンを表示 + 「動画の URL をコピー」ボタンを表示する ボタンはオーバーレイに表示されます。タップすると動画の URL を、長押しするとタイムスタンプ付きの URL をそれぞれコピーできます ボタンはオーバーレイに表示されません - 「動画のタイムスタンプ付き URL をコピー」ボタンを表示 + 「動画のタイムスタンプ付き URL をコピー」ボタンを表示する ボタンはオーバーレイに表示されます。タップするとタイムスタンプ付きの URL を、長押しするとタイムスタンプなしの URL をそれぞれコピーできます ボタンはオーバーレイに表示されません @@ -1371,9 +1371,9 @@ Automotive レイアウト 追跡パラメータはリンクから削除されません - デフォルトの吹き替えを無効にする - デフォルトの吹き替えは無効です - デフォルトの吹き替えは有効です + デフォルトの吹き替え再生を無効にする + デフォルトの吹き替え再生は無効です + デフォルトの吹き替え再生は有効です この機能を使用するには、「動画ストリームを偽装する」のクライアントを iOS TV に変更してください @@ -1396,9 +1396,9 @@ Automotive レイアウト ショートの画質 (%1$s): %2$s - 再生速度設定ボタンを非表示 - 再生速度設定ボタンはオーバーレイに表示されます - 再生速度設定ボタンはオーバーレイに表示されません + 再生速度設定ボタンを表示する + ボタンはオーバーレイに表示されます。長押しすると、再生速度がデフォルトの値にリセットされます + ボタンはオーバーレイに表示されません カスタムした再生速度リストを使用する @@ -1409,8 +1409,9 @@ Automotive レイアウト 再生速度は %s 未満である必要があります カスタム再生速度リストが無効です 自動 + 再生速度をリセットしました: %s 長押し倍速再生の速度 - 長押し倍速再生の速度の値は 0-8 の範囲で、0 および 8 は含まれません + 再生速度の範囲は 0-8 で、0 および 8 は含まれません 再生速度の変更を保存する @@ -1436,7 +1437,7 @@ Automotive レイアウト 動画ストリームを偽装する - 動画の再生に失敗しないために、クライアントの動画ストリームを偽装します + 動画再生の失敗を回避するために、クライアントの動画ストリームを偽装します 動画ストリームを偽装する 動画ストリームは偽装されます "動画ストリームは偽装されません @@ -1457,7 +1458,7 @@ AVC は、最大解像度が 1080p であり、Opus オーディオ コーデッ Android クライアントの副作用 "• 「音声トラック」がフライアウト メニューに表示されない • 「一定音量」が利用できない -• 「デフォルトの吹き替えを無効にする」が利用できない" +• 「デフォルトの吹き替え再生を無効にする」が利用できない" • AV1 コーデックが利用できない • ログアウト時またはシークレット モード時に、子ども向け動画が再生されない可能性がある 統計情報に表示する diff --git a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml index 8855203b5..55235cf9d 100644 --- a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml +++ b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml @@ -488,14 +488,14 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 스와이프 오버레이 타임아웃 오버레이가 표시되는 시간을 지정할 수 있습니다 (밀리초) 스와이프 오버레이 배경 불투명도 - 배경 불투명도 값을 지정할 수 있습니다 (0-100) + 배경 불투명도 값을 0-100 사이에서 지정할 수 있습니다 스와이프 배경 불투명도 값은 0-100 사이여야 합니다 스와이프 오버레이 밝기 조절바 색상 밝기 조절바 색상을 지정할 수 있습니다 스와이프 오버레이 볼륨 조절바 색상 볼륨 조절바 색상을 지정할 수 있습니다 스와이프 오버레이 텍스트 크기 - 텍스트 크기를 지정할 수 있습니다 (1-30) + 텍스트 크기를 1-30 사이에서 지정할 수 있습니다 텍스트 크기는 1-30 사이여야 합니다 스와이프 한계치 제스처 인식을 위해 얼마나 스와이프를 해야 할지를 지정할 수 있으며, 원하지 않은 제스처 인식을 방지할 수 있습니다 @@ -850,7 +850,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 플레이어 오버레이 불투명도 - 불투명도 값은 0-100 사이이며, 0은 투명입니다 + 불투명도 값을 0-100 사이에서 지정할 수 있습니다 (투명: 0) 플레이어 오버레이 불투명도는 0-100 사이여야 합니다 @@ -1249,7 +1249,7 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 화면 크기 초기값을 지정할 수 있습니다 (픽셀) 픽셀 크기는 %1$s-%2$s 사이여야 합니다 미니 플레이어 오버레이 불투명도 - 불투명도 값은 0-100 사이이며, 0은 투명입니다 + 불투명도 값을 0-100 사이에서 지정할 수 있습니다 (투명: 0) 미니 플레이어 오버레이 불투명도는 0-100 사이여야 합니다 @@ -1401,7 +1401,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요" 동영상 재생 속도 다이얼로그 버튼 표시하기 - 버튼을 표시합니다 + 버튼을 표시합니다\n\n• 버튼을 길게 누르면 동영상 재생 속도가 기본값으로 초기화됩니다 버튼을 표시하지 않습니다 @@ -1413,6 +1413,7 @@ DeArrow에 대해 자세히 알아보려면 여기를 누르세요" 재생 속도 값은 %s배속보다 작아야 합니다 잘못된 사용자 정의 재생 속도 값입니다 자동 + 동영상 재생 속도를 %s 으로 초기화하였습니다 사용자 정의 길게 눌러서 동영상 재생 속도 화면을 길게 누르는 동안에 변경되는 동영상 재생 속도를 0-8 사이에서 지정할 수 있습니다 diff --git a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml index b2c6b9330..451cf1af2 100644 --- a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml +++ b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml @@ -1397,7 +1397,7 @@ Gali būti atrakinta aukštesnės vaizdo įrašų kokybės, bet galite patirti v Rodyti greičio dialogo mygtuką - Mygtukas rodomas + Mygtukas rodomas. Palieskite ir palaikykite, kad atkūrimo greitį nustatytumėte į numatytąjį. Mygtukas nerodomas @@ -1409,6 +1409,7 @@ Gali būti atrakinta aukštesnės vaizdo įrašų kokybės, bet galite patirti v Pasirinktinis greitis turi būti mažesnis nei %s Netinkamas pasirinktinis atkūrimo greitis Automatinis + Atkūrimo greitis nustatytas iš naujo: %s Pritaikytas bakstelėjimo ir laikymo greitis Atkūrimo greitis: nuo 0 iki 8 diff --git a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml index 0c54cf662..63296a7c8 100644 --- a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml +++ b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml @@ -1397,7 +1397,7 @@ Var tikt atbloķētas augstākas video kvalitātes, taču var rasties video atsk Rādīt ātruma dialoga pogu - Poga tiek rādīta + Poga ir redzama. Pieskarieties un turiet, lai atiestatītu atskaņošanas ātrumu uz noklusējuma Poga netiek rādīta @@ -1409,6 +1409,7 @@ Var tikt atbloķētas augstākas video kvalitātes, taču var rasties video atsk Pielāgoti ātrumi ir jābūt mazākiem par %s Nederīgi pielāgoti video atskaņošanas ātrumi Automātiski + Atskaņošanas ātrums atiestatīts uz: %s Pielāgots pieskaršanās un turēšanas ātrums Atskaņošanas ātrums no 0 līdz 8 diff --git a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml index fb2b703ae..b8a20307e 100644 --- a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml +++ b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml @@ -1396,7 +1396,7 @@ Het inschakelen hiervan kan hogere videokwaliteiten ontgrendelen" Snelheidsdialoogknop weergeven - Knop wordt weergegeven + De knop wordt weergegeven. Tik en houd vast om de afspeelsnelheid terug te zetten naar de standaardwaarde Knop wordt niet weergegeven @@ -1408,6 +1408,7 @@ Het inschakelen hiervan kan hogere videokwaliteiten ontgrendelen" Aangepaste snelheden moeten lager zijn dan %s Ongeldige aangepaste afspeelsnelheden Automatisch + Afspeelsnelheid hersteld naar: %s De snelheid van aangepast tikken en vasthouden Afspeelsnelheid tussen 0-8 diff --git a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml index 2c46b57ff..06fa310ce 100644 --- a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml +++ b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml @@ -1394,7 +1394,7 @@ Włączenie tego może odblokować wyższe jakości wideo" Przycisk od prędkości - Przycisk jest widoczny + Przycisk jest widoczny. Dotknij i przytrzymaj, aby zresetować prędkość odtwarzania do domyślnej Przycisk nie jest widoczny @@ -1406,6 +1406,7 @@ Włączenie tego może odblokować wyższe jakości wideo" Prędkości niestandardowe muszą być mniejsze niż %s Nieprawidłowe prędkości odtwarzania niestandardowego Automatyczne + Prędkość odtwarzania zresetowana do: %s Szybkość dostosowywania dotknięciem i przytrzymaniem Prędkość odtwarzania w granicach 0-8 diff --git a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml index cfbd90e21..ec084134d 100644 --- a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml @@ -1395,7 +1395,7 @@ Habilitar isso pode desbloquear qualidades de vídeo mais altas" Mostrar botão de velocidade - Botão não esta oculto + O botão é exibido. Toque e mantenha pressionado para redefinir a velocidade de reprodução para o padrão Botão não está visível @@ -1407,6 +1407,7 @@ Habilitar isso pode desbloquear qualidades de vídeo mais altas" Velocidades personalizadas devem ser menores que %s Velocidades de reprodução personalizadas inválidas Automático + Velocidade de reprodução redefinida para: %s Velocidade personalizada de tocar e segurar Velocidade de reprodução entre 0-8 diff --git a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml index ec8c427c3..5e69bb4af 100644 --- a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml @@ -1398,7 +1398,7 @@ Bật tính năng này có thể mở khóa chất lượng video cao hơn" Mostrar botão de diálogo de velocidade - O botão está visível + O botão é mostrado. Toque e segure para redefinir a velocidade de reprodução para o padrão O botão não está visível @@ -1410,6 +1410,7 @@ Bật tính năng này có thể mở khóa chất lượng video cao hơn"Tốc độ tùy chỉnh phải nhỏ hơn %s Tốc độ phát lại tùy chỉnh không hợp lệ Automático + Velocidade de reprodução redefinida para: %s Velocidade personalizada ao tocar e segurar Velocidade de reprodução de 0 a 8 diff --git a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml index 0c2735d8f..80fa2f5e4 100644 --- a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml +++ b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml @@ -1397,7 +1397,7 @@ Activarea acestei opțiuni poate debloca calități video mai mari" Arată butonul de dialog de viteză - Butonul este afișat + Butonul este afișat. Atingeți și mențineți apăsat pentru a reseta viteza de redare la cea implicită Butonul nu este afișat @@ -1409,6 +1409,7 @@ Activarea acestei opțiuni poate debloca calități video mai mari" Vitezele personalizate trebuie să fie mai mici de %s Viteze de redare personalizate nevalide Automat + Viteza de redare a fost resetată la: %s Viteză personalizată de apăsare și menținere Viteză de redare între 0-8 diff --git a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml index 38ac46278..f4ee4dcfb 100644 --- a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml +++ b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml @@ -1398,7 +1398,7 @@ Second \"item\" text" Показать кнопку скорости воспроизведения - Кнопка выбора скорости воспроизведения показана + Кнопка показана. Нажмите и удерживайте, чтобы сбросить скорость воспроизведения до значения по умолчанию Кнопка выбора скорости воспроизведения скрыта @@ -1410,6 +1410,7 @@ Second \"item\" text" Кастомные скорости должны быть меньше, чем %s Недопустимые кастомные скорости воспроизведения Автоматически + Скорость воспроизведения сброшена до: %s Кастомная скорость при нажатии и удержании Значение кастомной скорости воспроизведения при нажатии и удержании от 0 до 8 diff --git a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml index f0aa28b6b..36e5cb695 100644 --- a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml +++ b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml @@ -1386,7 +1386,7 @@ Povolením tejto možnosti môžete odomknúť vyššie kvality videa" Zobraziť dialógové tlačidlo rýchlosti - Tlačidlo je zobrazené + Zobrazuje sa tlačidlo. Ťuknite a podržte, ak chcete obnoviť predvolenú rýchlosť prehrávania Tlačidlo nie je zobrazené @@ -1398,6 +1398,7 @@ Povolením tejto možnosti môžete odomknúť vyššie kvality videa" Vlastné rýchlosti musia byť menšie ako %s Neplatné vlastné rýchlosti prehrávania Automaticky + Rýchlosť prehrávania obnovená na: %s Vlastná rýchlosť ťuknutia a podržania Rýchlosť prehrávania medzi 0-8 diff --git a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml index 4715900d5..2e2c27b40 100644 --- a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml +++ b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml @@ -1397,7 +1397,7 @@ Omogočanje tega lahko odklene višje kakovosti videa" Pokaži gumb za pogovor o hitrosti - Gumb je prikazan + Gumb je prikazan. Dotaknite se ga in ga pridržite, da ponastavite hitrost predvajanja na privzeto. Gumb ni prikazan @@ -1409,6 +1409,7 @@ Omogočanje tega lahko odklene višje kakovosti videa" Hitrosti predvajanja po meri morajo biti manjše od %s Neveljavne hitrosti predvajanja po meri Samodejno + Hitrost predvajanja je bila ponastavljena na: %s Hitrost pritiska in pridržanja po meri Hitrost predvajanja med 0 in 8 diff --git a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml index 9cc7616f1..209e16234 100644 --- a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml +++ b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml @@ -1396,7 +1396,7 @@ Aktivizimi i kësaj mund të zhbllokojë cilësi më të larta video" Shfaq butonin e dialogut të shpejtësisë - Butoni shfaqet + Butoni shfaqet. Prekni dhe mbani për të rivendosur shpejtësinë e riprodhimit në atë të parazgjedhur Butoni nuk shfaqet @@ -1408,6 +1408,7 @@ Aktivizimi i kësaj mund të zhbllokojë cilësi më të larta video" Shpejtësitë e personalizuara duhet të jenë më të vogla se %s Shpejtësi të pavlefshme të personalizuar të riprodhimit Automatik + Shpejtësia e riprodhimit u rivendos në: %s Shpejtësia sipas dëshirës së përdoruesit gjatë përdorimit Shpejtësi e riprodhimit midis 0 dhe 8 diff --git a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml index 831ddad3d..20f08080e 100644 --- a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml @@ -1397,7 +1397,7 @@ Ako ovo omogućite, mogu biti otključani viši kvaliteti videa" Prikaži dugme dijaloga za brzinu - Dugme dijaloga za brzinu je prikazano + Dugme je prikazano. Dodirnite i držite da biste vratili brzinu reprodukcije na podrazumevanu Dugme dijaloga za brzinu nije prikazano @@ -1409,6 +1409,7 @@ Ako ovo omogućite, mogu biti otključani viši kvaliteti videa" Prilagođene brzine moraju biti manje od %s Nevažeće prilagođene brzine reprodukcije Automatski + Brzina reprodukcije resetovana na: %s Prilagođena brzina dodirivanja i zadržavanja Brzina reprodukcije između 0 i 8 diff --git a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml index 8639c3bab..2f10f9fac 100644 --- a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml @@ -1397,7 +1397,7 @@ Second \"item\" text" Прикажи дугме дијалога за брзину - Дугме дијалога за брзину је приказано + Дуго притисните дугме да бисте вратили подразумевану брзину репродукције Дугме дијалога за брзину није приказано @@ -1409,6 +1409,7 @@ Second \"item\" text" Прилагођене брзине морају бити мање од %s Неважеће прилагођене брзине репродукције Аутоматски + Брзина репродукције враћена на: %s Прилагођена брзина додиривања и задржавања Брзина репродукције између 0 и 8 diff --git a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml index 792e2247c..19d306b01 100644 --- a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml +++ b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml @@ -1397,7 +1397,7 @@ Att aktivera detta kan låsa upp högre videokvalitet" Visa hastighetsdialogruta knapp - Knappen är synlig + Knappen visas. Tryck och håll ned för att återställa uppspelningshastigheten till standard. Knappen är dold @@ -1409,6 +1409,7 @@ Att aktivera detta kan låsa upp högre videokvalitet" Anpassade hastigheter måste vara mindre än %s Ogiltiga anpassade uppspelningshastigheter Automatiskt + Uppspelningshastighet återställd till: %s Anpassad hastighet vid tryck och håll Uppspelningshastighet mellan 0 och 8. diff --git a/patches/src/main/resources/addresources/values-th-rTH/strings.xml b/patches/src/main/resources/addresources/values-th-rTH/strings.xml index 0d1e3c828..b5e714668 100644 --- a/patches/src/main/resources/addresources/values-th-rTH/strings.xml +++ b/patches/src/main/resources/addresources/values-th-rTH/strings.xml @@ -1396,7 +1396,7 @@ User id ของคุณเหมือนกับรหัสผ่าน แสดงปุ่มกล่องโต้ตอบความเร็ว - แสดงปุ่ม + ปุ่มจะปรากฏขึ้น แตะค้างไว้เพื่อรีเซ็ตความเร็วในการเล่นเป็นค่าเริ่มต้น ไม่แสดงปุ่ม @@ -1408,6 +1408,7 @@ User id ของคุณเหมือนกับรหัสผ่าน ความเร็วที่กําหนดเองต้องน้อยกว่า %s ความเร็วในการเล่นที่กําหนดเองไม่ถูกต้อง อัตโนมัติ + ความเร็วในการเล่นรีเซ็ตเป็น: %s **Custom tap and hold speed** ความเร็วในการเล่นระหว่าง 0-8 diff --git a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml index f673e1132..e8e873a3a 100644 --- a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml +++ b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml @@ -1398,7 +1398,7 @@ Bunu etkinleştirmek daha yüksek video kalitelerini açabilir" Hız diyaloğu düğmesini göster - Düğme gösterilir + Düğme gösteriliyor. Oynatma hızını varsayılana sıfırlamak için dokunup basılı tutun Düğme gösterilmez @@ -1410,6 +1410,7 @@ Bunu etkinleştirmek daha yüksek video kalitelerini açabilir" Özel hızlar %s\'den az olmalıdır Geçersiz özel oynatma hızları Oto + Oynatma hızı şu değere sıfırlandı: %s Dokunup basılı tutma özel hızı 0-8 arası oynatma hızı diff --git a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml index e92714e69..dffcb2746 100644 --- a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml +++ b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml @@ -1398,7 +1398,7 @@ Second \"item\" text" Кнопка швидкості відтворення - Кнопка швидкості відтворення показується + Кнопка показується. Натисніть і утримуйте, щоб відновити стандартну швидкість відтворення Кнопка швидкості відтворення не показується @@ -1410,6 +1410,7 @@ Second \"item\" text" Користувацькі швидкості повинні бути менші ніж %s Неправильні користувацькі швидкості відтворення Авто + Швидкість відтворення скинуто до: %s Користувацька швидкість при натисканні та утриманні Швидкість відтворення від 0 до 8 diff --git a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml index bc665941f..1fb61956e 100644 --- a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml +++ b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml @@ -49,12 +49,12 @@ Second \"item\" text" Thử một từ khóa khác Xóa khỏi lịch sử tìm kiếm? Hiện biểu tượng cài đặt ReVanced - Các biểu tượng cài đặt được hiển thị + Các biểu tượng cài đặt được hiện Các biểu tượng cài đặt không được hiển thị Ngôn ngữ ReVanced - "Một số ngôn ngữ có thể chưa được dịch đầy đủ hoặc bị thiếu. + "Bản dịch cho một số ngôn ngữ có thể bị thiếu hoặc không đầy đủ. -Để đóng góp bản dịch các ngôn ngữ mới, hãy truy cập translate.revanced.app" +Để dịch các ngôn ngữ mới, hãy truy cập translate.revanced.app" Ngôn ngữ ứng dụng Nhập / Xuất Nhập / Xuất cài đặt ReVanced @@ -76,11 +76,11 @@ Hãy làm theo hướng dẫn \"Don't kill my app\" dành cho điện thoại c Việc cấp quyền chạy nền là bắt buộc để ứng dụng hoạt động." Mở trang web - "Cần phải tắt tối ưu hóa pin cho MicroG GmsCore để tránh sự cố. + "Tối ưu hóa pin cho MicroG GmsCore phải được tắt để tránh sự cố. -Tắt tối ưu hóa pin cho MicroG sẽ không ảnh hưởng đáng kể đến hiệu suất sử dụng pin. +Tắt tối ưu hóa pin cho MicroG sẽ không ảnh hưởng tiêu cực đến việc sử dụng pin. -Nhấn nút tiếp tục và cho phép thay đổi lựa chọn tối ưu hóa." +Nhấn nút tiếp tục và cho phép thay đổi tối ưu hóa." Tiếp tục @@ -122,9 +122,9 @@ Nhấn nút tiếp tục và cho phép thay đổi lựa chọn tối ưu hóa." Điều này có thể giúp xác định các thành phần khi tạo bộ lọc tùy chỉnh. Tuy nhiên, việc bật tính năng này cũng sẽ ghi lại một số dữ liệu người dùng, chẳng hạn như địa chỉ IP của bạn." - Ghi nhật ký truy vết stack - Nhật ký gỡ lỗi bao gồm truy vết stack - Nhật ký gỡ lỗi không bao gồm truy vết stack + Ghi nhật ký truy vết ngăn xếp + Nhật ký gỡ lỗi bao gồm truy vết ngăn xếp + Nhật ký gỡ lỗi không bao gồm truy vết ngăn xếp Hiện thông báo nổi về lỗi ReVanced Thông báo nổi được hiển thị nếu xảy ra lỗi Thông báo nổi không được hiển thị nếu xảy ra lỗi @@ -169,7 +169,7 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n Nút được hiển thị Ẩn kệ \'Dành cho bạn\' - Kệ trên trang kênh đã bị ẩn + Kệ trên trang kênh được ẩn Kệ trên trang kênh được hiển thị @@ -178,16 +178,16 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n Nút được hiển thị Ẩn nhãn video đề xuất - Nhãn “Mọi người cũng xem” và “Bạn cũng có thể thích” đã bị ẩn - Nhãn “Mọi người cũng xem” và “Bạn cũng có thể thích” được hiển thị + Nhãn “Mọi người cũng xem” và “Bạn cũng có thể thích” được ẩn + Nhãn “Mọi người cũng xem” và “Bạn cũng có thể thích” được hiện Ẩn nút \'Hiện thêm\' Nút đã bị ẩn Nút được hiển thị Ẩn kệ vé - Kệ vé đã bị ẩn - Kệ vé đang hiển thị + Kệ vé được ẩn + Kệ vé được hiện Ẩn phản ứng theo thời gian Phản ứng theo thời gian đã bị ẩn Phản ứng theo thời gian được hiển thị @@ -198,8 +198,8 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n Kệ danh mục được đề xuất đã bị ẩn Kệ danh mục được đề xuất được hiển thị Ẩn thẻ có thể mở rộng bên dưới video - Thẻ có thể mở rộng đã bị ẩn - Thẻ có thể mở rộng được hiển thị + Thẻ có thể mở rộng được ẩn + Thẻ có thể mở rộng được hiện Ẩn bài đăng cộng đồng Bài đăng cộng đồng đã bị ẩn Bài đăng cộng đồng được hiển thị @@ -217,7 +217,7 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n Nguyên tắc cộng đồng được hiển thị Ẩn nguyên tắc cộng đồng cho người đăng ký Nguyên tắc cộng đồng cho người đăng ký đã bị ẩn - Nguyên tắc cộng đồng dành cho người đăng ký được hiển thị + Nguyên tắc cộng đồng dành cho người đăng ký được hiện Ẩn kệ hội viên kênh Kệ hội viên kênh đã bị ẩn Kệ hội viên kênh được hiển thị @@ -229,13 +229,13 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n Bảng thông tin được hiển thị Ẩn bảng thông tin y tế Bảng thông tin y tế đã bị ẩn - Bảng thông tin y tế được hiển thị + Bảng thông tin y tế được hiện Ẩn nút kênh Nút kênh đã bị ẩn Nút kênh được hiển thị - Ẩn Playables - Chơi game đã bị ẩn - Chơi game được hiển thị + Ẩn kệ Chơi trò chơi + Kệ Chơi trò chơi được ẩn + Kệ Chơi trò chơi được hiện Ẩn các hành động nhanh khi ở toàn màn hình Hành động nhanh đã bị ẩn Hành động nhanh được hiển thị @@ -255,20 +255,20 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n Thẻ nghệ sĩ đã bị ẩn Thẻ nghệ sĩ được hiển thị Ẩn \'Bản tóm tắt video do AI tạo\' - Phần tóm tắt video đã bị ẩn + Phần tóm tắt video được ẩn Phần tóm tắt video được hiển thị Ẩn Hỏi - Phần Hỏi đã bị ẩn - Phần Hỏi được hiển thị + Phần Hỏi được ẩn + Phần Hỏi được hiện Ẩn Thuộc tính - Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập đã bị ẩn + Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập được ẩn Phần Địa điểm nổi bật, Trò chơi, Âm nhạc và Người được đề cập được hiển thị Ẩn Chương Phần chương đã bị ẩn Phần chương được hiển thị Ẩn \'Cách nội dung này được tạo ra\' - Phần cách nội dung được tạo ra đã bị ẩn - Phần cách nội dung được tạo ra được hiển thị + Phần cách nội dung được tạo ra được ẩn + Phần cách nội dung được tạo ra được hiện Ẩn \'Khám phá podcast\' Phần Khám phá podcast đã bị ẩn Phần Khám phá podcast được hiển thị @@ -301,10 +301,10 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n Tóm tắt cuộc trò chuyện được hiển thị Ẩn tóm tắt Bình luận AI Tóm tắt bình luận đã bị ẩn - Tóm tắt bình luận được hiển thị + Tóm tắt bình luận được hiện Ẩn tiêu đề \'Bình luận của hội viên\' - Tiêu đề bình luận của hội viên đã bị ẩn - Tiêu đề bình luận của hội viên được hiển thị + Tiêu đề Bình luận của hội viên được ẩn + Tiêu đề Bình luận của hội viên được hiện Ẩn phần bình luận Phần Bình luận đã bị ẩn Phần Bình luận được hiển thị @@ -312,7 +312,7 @@ Bạn sẽ không được thông báo về bất kỳ sự kiện bất ngờ n Nút Tạo video ngắn đã bị ẩn Nút Tạo video ngắn được hiển thị Ẩn nút biểu tượng cảm xúc và dấu thời gian - Nút biểu tượng cảm xúc và dấu thời gian đã bị ẩn + Nút biểu tượng cảm xúc và dấu thời gian được ẩn Nút biểu tượng cảm xúc và dấu thời gian được hiển thị Ẩn xem trước bình luận Xem trước bình luận đã bị ẩn @@ -330,7 +330,7 @@ Nếu cài đặt này được bật và Doodle đang hiển thị tại khu v Bộ lọc tùy chỉnh Ẩn các thành phần bằng bộ lọc tùy chỉnh Bật bộ lọc tùy chỉnh - Bộ lọc tùy chỉnh đã bật + Bộ lọc tùy chỉnh được bật Bộ lọc tuỳ chỉnh đã tắt Bộ lọc tùy chỉnh @@ -426,10 +426,10 @@ Tính năng này chỉ khả dụng cho các thiết bị cũ hơn" Đã chép URL vào bảng nhớ tạm Đã chép URL với dấu thời gian Hiện nút sao chép URL video - Nút được hiển thị. Chạm để sao chép video URL. Chạm và giữ để sao chép với dấu thời gian + Nút được hiển thị. Chạm để sao chép URL video. Chạm và giữ để sao chép với dấu thời gian Nút không được hiển thị Hiện nút sao chép URL với dấu thời gian - Nút được hiển thị. Chạm để sao chép video URL với dấu thời gian. Chạm và giữ để sao chép video không kèm theo dấu thời gian + Nút được hiện. Chạm để sao chép video URL với dấu thời gian. Chạm và giữ để sao chép video không kèm theo dấu thời gian Nút không được hiển thị @@ -443,9 +443,9 @@ Tính năng này chỉ khả dụng cho các thiết bị cũ hơn" Các thiết lập trình tải xuống bên ngoài Hiện nút tải xuống bên ngoài Nút tải xuống trong trình phát đã được hiển thị - Nút tải xuống trong trình phát không được hiển thị + Nút tải xuống trong trình phát không được hiện - Thay thế nút hành động Tải xuống + Thay thế Nút hành động tải xuống Nút tải xuống mở trình tải xuống bên ngoài Nút tải xuống mở trình tải xuống nội bộ ứng dụng Tên gói trình tải xuống @@ -464,12 +464,12 @@ Tính năng này chỉ khả dụng cho các thiết bị cũ hơn" Bật cử chỉ độ sáng - "Đã bật vuốt độ sáng toàn màn hình + "Vuốt chỉnh độ sáng toàn màn hình đã bật Điều chỉnh độ sáng bằng cách vuốt dọc ở bên trái màn hình" - Đã tắt vuốt độ sáng toàn màn hình + Vuốt độ sáng toàn màn hình đã tắt Bật cử chỉ âm lượng - "Đã bật vuốt âm lượng toàn màn hình + "Vuốt âm lượng toàn màn hình đã bật Điều chỉnh âm lượng bằng cách vuốt dọc ở bên phải màn hình" Vuốt âm lượng toàn màn hình đã tắt @@ -568,23 +568,23 @@ Tính năng này chỉ khả dụng cho các thiết bị cũ hơn" Ẩn hoặc thay đổi các nút ở thanh điều hướng Ẩn Trang chủ - Nút trang chủ đã bị ẩn - Nút trang chủ được hiển thị + Nút trang chủ được ẩn + Nút trang chủ được hiện Ẩn Shorts Nút Shorts đã bị ẩn - Nút Shorts được hiển thị + Nút Shorts được hiện - Ẩn Tạo + Ẩn nút Tạo Nút tạo đã bị ẩn Nút tạo được hiển thị Ẩn Kênh đăng ký - Nút kênh đăng ký đã bị ẩn - Nút kênh đăng ký được hiển thị + Nút kênh đăng ký được ẩn + Nút kênh đăng ký được hiện Ẩn Thông báo - Nút thông báo đã bị ẩn - Nút thông báo được hiển thị + Nút thông báo được ẩn + Nút thông báo được hiện Chuyển vị nút Tạo với nút Thông báo "Nút tạo được chuyển đổi với nút Thông báo @@ -656,16 +656,16 @@ Nếu việc thay đổi cài đặt này không có hiệu lực, hãy thử ch Nút bản âm thanh đã bị ẩn Nút bản âm thanh được hiển thị - "Trình đơn bản âm thanh đã bị ẩn + "Menu theo dõi âm thanh được ẩn -Để hiển thị trình đơn Bản âm thanh, hãy thay đổi 'Giả mạo luồng phát video' thành iOS TV" +Để hiện trình đơn Theo dõi âm thanh, hãy thay đổi 'Giả mạo luồng video' thành iOS TV" Ẩn Xem trong thực tế ảo Trình đơn xem trong thực tế ảo đã bị ẩn Trình đơn xem trong thực tế ảo được hiển thị - Ẩn trình đơn chất lượng video dưới - Trình đơn chất lượng video bên dưới đã bị ẩn - Trình đơn chất lượng video bên dưới được hiển thị + Ẩn trình đơn chất lượng chân video + Trình đơn chất lượng chân video được ẩn + Trình đơn chất lượng chân video được hiện Ẩn các nút Trước & Tiếp theo @@ -673,12 +673,12 @@ Nếu việc thay đổi cài đặt này không có hiệu lực, hãy thử ch Các nút được hiển thị Ẩn nút truyền Nút Truyền đã bị ẩn - Nút Truyền được hiển thị + Nút Truyền được hiện Ẩn nút Chú thích Nút phụ đề đã bị ẩn Nút phụ đề được hiển thị - Ẩn nút Phát tự động + Ẩn nút Tự động phát Nút tự động phát đã bị ẩn Nút tự động phát được hiển thị @@ -695,11 +695,11 @@ Nếu việc thay đổi cài đặt này không có hiệu lực, hãy thử ch Ẩn thẻ thông tin Thẻ thông tin đã bị ẩn - Thẻ thông tin được hiển thị + Thẻ thông tin được hiện Tắt chuyển động cuộn số - Số cuộn không chuyển động + Số cuộn không được chuyển động Số cuộn được chuyển động @@ -771,9 +771,9 @@ Nếu việc thay đổi cài đặt này không có hiệu lực, hãy thử ch Ẩn nhãn dán Nhãn dán đã bị ẩn Nhãn dán được hiển thị - Ẩn hiệu ứng thị giác nút Thích - Hiệu ứng đài phun nút thích đã bị ẩn - Hiệu ứng đài phun nút thích được hiển thị + Ẩn hiệu ứng đài phun nút Thích + Hiệu ứng đài phun nút thích được ẩn + Hiệu ứng đài phun nút thích được hiện Ẩn nút Thích Nút thích đã bị ẩn Nút thích được hiển thị @@ -1397,7 +1397,7 @@ Bật tính năng này có thể mở khóa chất lượng video cao hơn" Hiện nút hộp thoại tốc độ phát - Nút được hiển thị + Nút được hiển thị. Nhấn và giữ để đặt lại tốc độ phát về mặc định Nút không được hiển thị @@ -1409,6 +1409,7 @@ Bật tính năng này có thể mở khóa chất lượng video cao hơn"Tốc độ tùy chỉnh phải nhỏ hơn %s Tốc độ phát lại tùy chỉnh không hợp lệ Tự động + Tốc độ phát đã được đặt lại thành: %s Tốc độ chạm và giữ tùy chỉnh Tốc độ phát từ 0 đến 8 diff --git a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml index 61a5fd8c0..bd51c6fe8 100644 --- a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml @@ -1398,7 +1398,6 @@ Second \"item\" text" 显示播放速度对话框按钮 - 按钮已显示 按钮未显示 @@ -1410,6 +1409,7 @@ Second \"item\" text" 自定义速度必须小于 %s 自定义播放速度无效 自动 + 已将播放速度重置为:%s 自定义长按速度 0-8之间的播放速度 diff --git a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml index 824471bb8..ccdf4dbe5 100644 --- a/patches/src/main/resources/addresources/values-zh-rTW/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rTW/strings.xml @@ -1347,7 +1347,6 @@ Second \"item\" text" 顯示速度對話方塊按鈕 - 已顯示按鈕 不顯示按鈕 @@ -1359,6 +1358,7 @@ Second \"item\" text" 自訂速度必須小於 %s 自訂播放速度格式不正確 自動 + 已將播放速度重設為:%s 自訂輕觸和按住的速度 播放速度介於 0 到 8 之間 From 9357887b6fca7aaf34dfb0163645b6a998e1db76 Mon Sep 17 00:00:00 2001 From: Cilly Leang Date: Tue, 3 Jun 2025 18:02:15 +1000 Subject: [PATCH 13/21] fix(Spotify - Custom theme): Apply accent color in more places (#5039) Co-authored-by: Nuckyz <61953774+Nuckyz@users.noreply.github.com> --- .../layout/theme/CustomThemePatch.java | 45 +++- .../spotify/layout/theme/CustomThemePatch.kt | 218 +++++++++--------- .../spotify/layout/theme/Fingerprints.kt | 35 ++- 3 files changed, 165 insertions(+), 133 deletions(-) diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/theme/CustomThemePatch.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/theme/CustomThemePatch.java index 8949b9b2d..ef3932501 100644 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/theme/CustomThemePatch.java +++ b/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/theme/CustomThemePatch.java @@ -8,15 +8,54 @@ import app.revanced.extension.shared.Utils; @SuppressWarnings("unused") public final class CustomThemePatch { + private static final int BACKGROUND_COLOR = getColorFromString("@color/gray_7"); + private static final int BACKGROUND_COLOR_SECONDARY = getColorFromString("@color/gray_15"); + private static final int ACCENT_COLOR = getColorFromString("@color/spotify_green_157"); + private static final int ACCENT_PRESSED_COLOR = + getColorFromString("@color/dark_brightaccent_background_press"); + /** - * Injection point. + * Returns an int representation of the color resource or hex code. */ - public static long getThemeColor(String colorString) { + private static int getColorFromString(String colorString) { try { return Utils.getColorFromString(colorString); } catch (Exception ex) { - Logger.printException(() -> "Invalid custom color: " + colorString, ex); + Logger.printException(() -> "Invalid color string: " + colorString, ex); return Color.BLACK; } } + + /** + * Injection point. Returns an int representation of the replaced color from the original color. + */ + public static int replaceColor(int originalColor) { + switch (originalColor) { + // Playlist background color. + case 0xFF121212: + return BACKGROUND_COLOR; + + // Share menu background color. + case 0xFF1F1F1F: + // Home category pills background color. + case 0xFF333333: + // Settings header background color. + case 0xFF282828: + // Spotify Connect device list background color. + case 0xFF2A2A2A: + return BACKGROUND_COLOR_SECONDARY; + + // Some Lottie animations have a color that's slightly off due to rounding errors. + case 0xFF1ED760: case 0xFF1ED75F: + // Intermediate color used in some animations, same rounding issue. + case 0xFF1DB954: case 0xFF1CB854: + return ACCENT_COLOR; + + case 0xFF1ABC54: + return ACCENT_PRESSED_COLOR; + + default: + return originalColor; + } + } } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt index 67a5d65a7..738db4dec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt @@ -2,65 +2,19 @@ package app.revanced.patches.spotify.layout.theme import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.booleanOption import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.stringOption -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch import app.revanced.patches.spotify.shared.IS_SPOTIFY_LEGACY_APP_TARGET import app.revanced.util.* -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference +import com.android.tools.smali.dexlib2.iface.reference.MethodReference import org.w3c.dom.Element private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/layout/theme/CustomThemePatch;" -internal val spotifyBackgroundColor = stringOption( - key = "backgroundColor", - default = "@android:color/black", - title = "Primary background color", - description = "The background color. Can be a hex color or a resource reference.", - required = true, -) - -internal val overridePlayerGradientColor = booleanOption( - key = "overridePlayerGradientColor", - default = false, - title = "Override player gradient color", - description = "Apply primary background color to the player gradient color, which changes dynamically with the song.", - required = false -) - -internal val spotifyBackgroundColorSecondary = stringOption( - key = "backgroundColorSecondary", - default = "#FF121212", - title = "Secondary background color", - description = - "The secondary background color. (e.g. playlist list in home, player artist, song credits). Can be a hex color or a resource reference.", - required = true, -) - -internal val spotifyAccentColor = stringOption( - key = "accentColor", - default = "#FF1ED760", - title = "Accent color", - description = "The accent color ('Spotify green' by default). Can be a hex color or a resource reference.", - required = true, -) - -internal val spotifyAccentColorPressed = stringOption( - key = "accentColorPressed", - default = "#FF169C46", - title = "Pressed dark theme accent color", - description = - "The color when accented buttons are pressed, by default slightly darker than accent. Can be a hex color or a resource reference.", - required = true, -) - private val customThemeBytecodePatch = bytecodePatch { dependsOn(sharedExtensionPatch) @@ -71,60 +25,60 @@ private val customThemeBytecodePatch = bytecodePatch { return@execute } - fun MutableMethod.addColorChangeInstructions(literal: Long, colorString: String) { - val index = indexOfFirstLiteralInstructionOrThrow(literal) - val register = getInstruction(index).registerA + val colorSpaceUtilsClassDef = colorSpaceUtilsClassFingerprint.originalClassDef + + // Hook a util method that converts ARGB to RGBA in the sRGB color space to replace hardcoded accent colors. + convertArgbToRgbaFingerprint.match(colorSpaceUtilsClassDef).method.apply { + addInstructions( + 0, + """ + long-to-int p0, p0 + invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->replaceColor(I)I + move-result p0 + int-to-long p0, p0 + """ + ) + } + + // Lottie JSON parser method. It parses the JSON Lottie animation into its own class, + // including the solid color of it. + parseLottieJsonFingerprint.method.apply { + val invokeParseColorIndex = indexOfFirstInstructionOrThrow { + val reference = getReference() + reference?.definingClass == "Landroid/graphics/Color;" + && reference.name == "parseColor" + } + val parsedColorRegister = getInstruction(invokeParseColorIndex + 1).registerA + + val replaceColorDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->replaceColor(I)I" addInstructions( - index + 1, + invokeParseColorIndex + 2, """ - const-string v$register, "$colorString" - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getThemeColor(Ljava/lang/String;)J - move-result-wide v$register + # Use invoke-static/range because the register number is too large. + invoke-static/range { v$parsedColorRegister .. v$parsedColorRegister }, $replaceColorDescriptor + move-result v$parsedColorRegister """ ) } - val encoreColorsClassName = with(encoreThemeFingerprint.originalMethod) { - // "Encore" colors are referenced right before the value of POSITIVE_INFINITY is returned. - // Begin the instruction find using the index of where POSITIVE_INFINITY is set into the register. - val positiveInfinityIndex = indexOfFirstLiteralInstructionOrThrow( - Float.POSITIVE_INFINITY - ) - val encoreColorsFieldReferenceIndex = indexOfFirstInstructionReversedOrThrow( - positiveInfinityIndex, - Opcode.SGET_OBJECT - ) - - getInstruction(encoreColorsFieldReferenceIndex) - .getReference()!!.definingClass - } - - val encoreColorsConstructorFingerprint = fingerprint { - accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - custom { method, classDef -> - classDef.type == encoreColorsClassName && - method.containsLiteralInstruction(PLAYLIST_BACKGROUND_COLOR_LITERAL) + // Lottie animated color parser. + parseAnimatedColorFingerprint.method.apply { + val invokeArgbIndex = indexOfFirstInstructionOrThrow { + val reference = getReference() + reference?.definingClass == "Landroid/graphics/Color;" + && reference.name == "argb" } + val argbColorRegister = getInstruction(invokeArgbIndex + 1).registerA + + addInstructions( + invokeArgbIndex + 2, + """ + invoke-static { v$argbColorRegister }, $EXTENSION_CLASS_DESCRIPTOR->replaceColor(I)I + move-result v$argbColorRegister + """ + ) } - - val backgroundColor by spotifyBackgroundColor - val backgroundColorSecondary by spotifyBackgroundColorSecondary - - encoreColorsConstructorFingerprint.method.apply { - addColorChangeInstructions(PLAYLIST_BACKGROUND_COLOR_LITERAL, backgroundColor!!) - addColorChangeInstructions(SHARE_MENU_BACKGROUND_COLOR_LITERAL, backgroundColorSecondary!!) - } - - homeCategoryPillColorsFingerprint.method.addColorChangeInstructions( - HOME_CATEGORY_PILL_COLOR_LITERAL, - backgroundColorSecondary!! - ) - - settingsHeaderColorFingerprint.method.addColorChangeInstructions( - SETTINGS_HEADER_COLOR_LITERAL, - backgroundColorSecondary!! - ) } } @@ -138,11 +92,48 @@ val customThemePatch = resourcePatch( dependsOn(customThemeBytecodePatch) - val backgroundColor by spotifyBackgroundColor() - val overridePlayerGradientColor by overridePlayerGradientColor() - val backgroundColorSecondary by spotifyBackgroundColorSecondary() - val accentColor by spotifyAccentColor() - val accentColorPressed by spotifyAccentColorPressed() + val backgroundColor by stringOption( + key = "backgroundColor", + default = "@android:color/black", + title = "Primary background color", + description = "The background color. Can be a hex color or a resource reference.", + required = true, + ) + + val overridePlayerGradientColor by booleanOption( + key = "overridePlayerGradientColor", + default = false, + title = "Override player gradient color", + description = + "Apply primary background color to the player gradient color, which changes dynamically with the song.", + required = false, + ) + + val backgroundColorSecondary by stringOption( + key = "backgroundColorSecondary", + default = "#FF121212", + title = "Secondary background color", + description = "The secondary background color. (e.g. playlist list in home, player artist, song credits). " + + "Can be a hex color or a resource reference.\",", + required = true, + ) + + val accentColor by stringOption( + key = "accentColor", + default = "#FF1ED760", + title = "Accent color", + description = "The accent color ('Spotify green' by default). Can be a hex color or a resource reference.", + required = true, + ) + + val accentColorPressed by stringOption( + key = "accentColorPressed", + default = "#FF1ABC54", + title = "Pressed dark theme accent color", + description = "The color when accented buttons are pressed, by default slightly darker than accent. " + + "Can be a hex color or a resource reference.", + required = true, + ) execute { document("res/values/colors.xml").use { document -> @@ -161,34 +152,41 @@ val customThemePatch = resourcePatch( } node.textContent = when (name) { + // Main background color. + "gray_7", + // Left sidebar background color in tablet mode. + "gray_10", // Gradient next to user photo and "All" in home page. "dark_base_background_base", - // Main background. - "gray_7", - // Left sidebar background in tablet mode. - "gray_10", - // "Add account", "Settings and privacy", "View Profile" left sidebar background. + // "Add account", "Settings and privacy", "View Profile" left sidebar background color. "dark_base_background_elevated_base", // Song/player gradient start/end color. "bg_gradient_start_color", "bg_gradient_end_color", - // Login screen background and gradient start. + // Login screen background color and gradient start. "sthlm_blk", "sthlm_blk_grad_start", // Misc. "image_placeholder_color", -> backgroundColor - // Track credits, merch background in song player. + // "About the artist" background color in song player. + "gray_15", + // Track credits, merch background color in song player. "track_credits_card_bg", "benefit_list_default_color", "merch_card_background", // Playlist list background in home page. "opacity_white_10", - // "About the artist" background in song player. - "gray_15", // "What's New" pills background. "dark_base_background_tinted_highlight" -> backgroundColorSecondary - "dark_brightaccent_background_base", "dark_base_text_brightaccent", "green_light" -> accentColor - "dark_brightaccent_background_press" -> accentColorPressed + "dark_brightaccent_background_base", + "dark_base_text_brightaccent", + "green_light", + "spotify_green_157" + -> accentColor + + "dark_brightaccent_background_press" + -> accentColorPressed + else -> continue } } @@ -198,8 +196,8 @@ val customThemePatch = resourcePatch( document("res/drawable/start_screen_gradient.xml").use { document -> val gradientNode = document.getElementsByTagName("gradient").item(0) as Element - gradientNode.setAttribute("android:startColor", backgroundColor) - gradientNode.setAttribute("android:endColor", backgroundColor) + gradientNode.setAttribute("android:startColor", "@color/gray_7") + gradientNode.setAttribute("android:endColor", "@color/gray_7") } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/Fingerprints.kt index 355422477..eb3ab7839 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/Fingerprints.kt @@ -4,30 +4,25 @@ import app.revanced.patcher.fingerprint import app.revanced.util.containsLiteralInstruction import com.android.tools.smali.dexlib2.AccessFlags -internal val encoreThemeFingerprint = fingerprint { - strings("Encore theme was not provided.") // Partial string match. - custom { method, _ -> - method.name == "invoke" - } +internal val colorSpaceUtilsClassFingerprint = fingerprint { + strings("The specified color must be encoded in an RGB color space.") // Partial string match. } -internal const val PLAYLIST_BACKGROUND_COLOR_LITERAL = 0xFF121212 -internal const val SHARE_MENU_BACKGROUND_COLOR_LITERAL = 0xFF1F1F1F -internal const val HOME_CATEGORY_PILL_COLOR_LITERAL = 0xFF333333 -internal const val SETTINGS_HEADER_COLOR_LITERAL = 0xFF282828 - -internal val homeCategoryPillColorsFingerprint = fingerprint{ - accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - custom { method, _ -> - method.containsLiteralInstruction(HOME_CATEGORY_PILL_COLOR_LITERAL) && - method.containsLiteralInstruction(0x33000000) - } +internal val convertArgbToRgbaFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) + returns("J") + parameters("J") } -internal val settingsHeaderColorFingerprint = fingerprint { - accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) +internal val parseLottieJsonFingerprint = fingerprint { + strings("Unsupported matte type: ") +} + +internal val parseAnimatedColorFingerprint = fingerprint { + parameters("L", "F") + returns("Ljava/lang/Object;") custom { method, _ -> - method.containsLiteralInstruction(SETTINGS_HEADER_COLOR_LITERAL) && - method.containsLiteralInstruction(0) + method.containsLiteralInstruction(255.0) && + method.containsLiteralInstruction(1.0) } } From 98626945644a274fce038f1ae4b87a05ef55bb50 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 3 Jun 2025 08:04:58 +0000 Subject: [PATCH 14/21] chore: Release v5.26.0-dev.5 [skip ci] # [5.26.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.4...v5.26.0-dev.5) (2025-06-03) ### Bug Fixes * **Spotify - Custom theme:** Apply accent color in more places ([#5039](https://github.com/ReVanced/revanced-patches/issues/5039)) ([9357887](https://github.com/ReVanced/revanced-patches/commit/9357887b6fca7aaf34dfb0163645b6a998e1db76)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d0c8ebd21..aeef323e5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.26.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.4...v5.26.0-dev.5) (2025-06-03) + + +### Bug Fixes + +* **Spotify - Custom theme:** Apply accent color in more places ([#5039](https://github.com/ReVanced/revanced-patches/issues/5039)) ([9357887](https://github.com/ReVanced/revanced-patches/commit/9357887b6fca7aaf34dfb0163645b6a998e1db76)) + # [5.26.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.3...v5.26.0-dev.4) (2025-06-03) diff --git a/gradle.properties b/gradle.properties index ab36898d2..092166e3c 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.26.0-dev.4 +version = 5.26.0-dev.5 From e1ec30c5b07560a39d7b8ab293b0c1f39fd59ef2 Mon Sep 17 00:00:00 2001 From: kolpazar Date: Tue, 3 Jun 2025 21:48:24 +0200 Subject: [PATCH 15/21] feat(Sync for Reddit): Add `Fix post thumbnails` patch --- patches/api/patches.api | 4 +++ .../fix/thumbnail/Fingerprints.kt | 12 +++++++ .../fix/thumbnail/FixPostThumbnailsPatch.kt | 31 +++++++++++++++++++ 3 files changed, 47 insertions(+) create mode 100644 patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/FixPostThumbnailsPatch.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index 233b3ad9f..978961283 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -575,6 +575,10 @@ public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/ public static final fun getFixSLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/FixPostThumbnailsPatchKt { + public static final fun getFixPostThumbnailsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/UseUserEndpointPatchKt { public static final fun getUseUserEndpointPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt new file mode 100644 index 000000000..7a64031f1 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt @@ -0,0 +1,12 @@ +package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.thumbnail + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal val customImageViewLoadFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC) + parameters("Ljava/lang/String;", "Z", "Z", "I", "I") + custom { _, classDef -> + classDef.endsWith("CustomImageView;") + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/FixPostThumbnailsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/FixPostThumbnailsPatch.kt new file mode 100644 index 000000000..4ac2fc3d0 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/FixPostThumbnailsPatch.kt @@ -0,0 +1,31 @@ +package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.thumbnail + +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.patch.bytecodePatch + +@Suppress("unused") +val fixPostThumbnailsPatch = bytecodePatch( + name = "Fix post thumbnails", + description = "Fixes loading post thumbnails by correcting their URLs.", +) { + + compatibleWith( + "com.laurencedawson.reddit_sync", + "com.laurencedawson.reddit_sync.pro", + "com.laurencedawson.reddit_sync.dev" + ) + + // Image URLs contain escaped ampersands (&), let's replace these with unescaped ones (&). + execute { + customImageViewLoadFingerprint.method.addInstructions( + 0, + """ + # url = url.replace("&", "&"); + const-string v0, "&" + const-string v1, "&" + invoke-virtual { p1, v0, v1 }, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String; + move-result-object p1 + """ + ) + } +} From 33a4798ba6e60203fa3e162ccf5ee8f7bf1316b7 Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Tue, 3 Jun 2025 19:50:57 +0000 Subject: [PATCH 16/21] chore: Release v5.26.0-dev.6 [skip ci] # [5.26.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.5...v5.26.0-dev.6) (2025-06-03) ### Features * **Sync for Reddit:** Add `Fix post thumbnails` patch ([e1ec30c](https://github.com/ReVanced/revanced-patches/commit/e1ec30c5b07560a39d7b8ab293b0c1f39fd59ef2)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aeef323e5..058bb957a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.26.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.5...v5.26.0-dev.6) (2025-06-03) + + +### Features + +* **Sync for Reddit:** Add `Fix post thumbnails` patch ([e1ec30c](https://github.com/ReVanced/revanced-patches/commit/e1ec30c5b07560a39d7b8ab293b0c1f39fd59ef2)) + # [5.26.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.4...v5.26.0-dev.5) (2025-06-03) diff --git a/gradle.properties b/gradle.properties index 092166e3c..9c6f27057 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.26.0-dev.5 +version = 5.26.0-dev.6 From 22b9beedd3243a8d6a5635f591b91cdcf307be37 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 4 Jun 2025 09:06:27 +0200 Subject: [PATCH 17/21] feat(YouTube - Hide Shorts components): Add option to hide comment panel (#5102) --- .../youtube/patches/ReturnYouTubeDislikePatch.java | 6 ++---- .../extension/youtube/patches/components/ShortsFilter.java | 6 ++++++ .../app/revanced/extension/youtube/settings/Settings.java | 1 + .../youtube/layout/hide/shorts/HideShortsComponentsPatch.kt | 1 + patches/src/main/resources/addresources/values/strings.xml | 3 +++ 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java index 862847410..bb351b66b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java @@ -153,14 +153,12 @@ public class ReturnYouTubeDislikePatch { } if (Utils.containsAny(conversionContextString, - "|shorts_dislike_button.eml", "|reel_dislike_button.eml" - )) { + "|shorts_dislike_button.eml", "|reel_dislike_button.eml")) { return getShortsSpan(original, true); } if (Utils.containsAny(conversionContextString, - "|shorts_like_button.eml", "|reel_like_button.eml" - )) { + "|shorts_like_button.eml", "|reel_like_button.eml")) { if (!Utils.containsNumber(original)) { Logger.printDebug(() -> "Replacing hidden likes count"); return getShortsSpan(original, false); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java index 142a27473..752cca7cb 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java @@ -217,6 +217,12 @@ public final class ShortsFilter extends Filter { // Suggested actions. // suggestedActionsGroupList.addAll( + new ByteArrayFilterGroup( + Settings.HIDE_SHORTS_COMMENT_PANEL, + // Preview comment that can popup while a Short is playing. + // Uses no bundled icons, and instead the users profile photo is shown. + "shorts-comments-panel" + ), new ByteArrayFilterGroup( Settings.HIDE_SHORTS_SHOP_BUTTON, "yt_outline_bag_" diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index 4613a5a14..f52865799 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -275,6 +275,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting HIDE_SHORTS_SEARCH = new BooleanSetting("revanced_hide_shorts_search", FALSE); public static final BooleanSetting HIDE_SHORTS_SEARCH_SUGGESTIONS = new BooleanSetting("revanced_hide_shorts_search_suggestions", TRUE); public static final BooleanSetting HIDE_SHORTS_SHARE_BUTTON = new BooleanSetting("revanced_hide_shorts_share_button", FALSE); + public static final BooleanSetting HIDE_SHORTS_COMMENT_PANEL = new BooleanSetting("revanced_hide_shorts_comment_panel", TRUE); public static final BooleanSetting HIDE_SHORTS_SHOP_BUTTON = new BooleanSetting("revanced_hide_shorts_shop_button", TRUE); public static final BooleanSetting HIDE_SHORTS_SOUND_BUTTON = new BooleanSetting("revanced_hide_shorts_sound_button", FALSE); public static final BooleanSetting HIDE_SHORTS_SOUND_METADATA_LABEL = new BooleanSetting("revanced_hide_shorts_sound_metadata_label", FALSE); diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 49e119357..61b29975b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -90,6 +90,7 @@ private val hideShortsComponentsResourcePatch = resourcePatch { SwitchPreference("revanced_hide_shorts_paused_overlay_buttons"), // Suggested actions. + SwitchPreference("revanced_hide_shorts_comment_panel"), SwitchPreference("revanced_hide_shorts_save_sound_button"), SwitchPreference("revanced_hide_shorts_use_template_button"), SwitchPreference("revanced_hide_shorts_upcoming_button"), diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index 5e371ecf8..2aed55eba 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -812,6 +812,9 @@ To show the Audio track menu, change \'Spoof video streams\' to iOS TV" Hide location label Location label is hidden Location label is shown + Hide Comment panel + Comment panel is hidden + Comment panel is shown Hide Save music button Save music button is hidden Save music button is shown From 866765cb4051c5a142051842929f46e3758526bd Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 4 Jun 2025 07:09:39 +0000 Subject: [PATCH 18/21] chore: Release v5.26.0-dev.7 [skip ci] # [5.26.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.6...v5.26.0-dev.7) (2025-06-04) ### Features * **YouTube - Hide Shorts components:** Add option to hide comment panel ([#5102](https://github.com/ReVanced/revanced-patches/issues/5102)) ([22b9bee](https://github.com/ReVanced/revanced-patches/commit/22b9beedd3243a8d6a5635f591b91cdcf307be37)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 058bb957a..fb4246e72 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.26.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.6...v5.26.0-dev.7) (2025-06-04) + + +### Features + +* **YouTube - Hide Shorts components:** Add option to hide comment panel ([#5102](https://github.com/ReVanced/revanced-patches/issues/5102)) ([22b9bee](https://github.com/ReVanced/revanced-patches/commit/22b9beedd3243a8d6a5635f591b91cdcf307be37)) + # [5.26.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.5...v5.26.0-dev.6) (2025-06-03) diff --git a/gradle.properties b/gradle.properties index 9c6f27057..7cba09727 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.26.0-dev.6 +version = 5.26.0-dev.7 From 8ccf7c881c357fb92e2081a245d7c50aad7426ee Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 4 Jun 2025 13:44:35 +0200 Subject: [PATCH 19/21] chore: Sync translations (#5106) --- .../addresources/values-ar-rSA/strings.xml | 5 +- .../addresources/values-az-rAZ/strings.xml | 2 + .../addresources/values-be-rBY/strings.xml | 3 + .../addresources/values-bg-rBG/strings.xml | 3 + .../addresources/values-bn-rBD/strings.xml | 3 + .../addresources/values-ca-rES/strings.xml | 3 + .../addresources/values-cs-rCZ/strings.xml | 3 + .../addresources/values-da-rDK/strings.xml | 59 +++++++++++++++++++ .../addresources/values-de-rDE/strings.xml | 3 + .../addresources/values-el-rGR/strings.xml | 5 +- .../addresources/values-es-rES/strings.xml | 3 + .../addresources/values-et-rEE/strings.xml | 3 + .../addresources/values-fil-rPH/strings.xml | 3 + .../addresources/values-fr-rFR/strings.xml | 3 + .../addresources/values-ga-rIE/strings.xml | 3 + .../addresources/values-hu-rHU/strings.xml | 3 + .../addresources/values-hy-rAM/strings.xml | 3 + .../addresources/values-in-rID/strings.xml | 3 + .../addresources/values-it-rIT/strings.xml | 3 + .../addresources/values-iw-rIL/strings.xml | 3 + .../addresources/values-ja-rJP/strings.xml | 3 + .../addresources/values-ko-rKR/strings.xml | 3 + .../addresources/values-lt-rLT/strings.xml | 3 + .../addresources/values-lv-rLV/strings.xml | 3 + .../addresources/values-nl-rNL/strings.xml | 3 + .../addresources/values-pl-rPL/strings.xml | 3 + .../addresources/values-pt-rBR/strings.xml | 3 + .../addresources/values-pt-rPT/strings.xml | 3 + .../addresources/values-ro-rRO/strings.xml | 3 + .../addresources/values-ru-rRU/strings.xml | 3 + .../addresources/values-sk-rSK/strings.xml | 3 + .../addresources/values-sl-rSI/strings.xml | 3 + .../addresources/values-sq-rAL/strings.xml | 3 + .../addresources/values-sr-rCS/strings.xml | 7 ++- .../addresources/values-sr-rSP/strings.xml | 5 +- .../addresources/values-sv-rSE/strings.xml | 3 + .../addresources/values-th-rTH/strings.xml | 3 + .../addresources/values-tr-rTR/strings.xml | 5 +- .../addresources/values-uk-rUA/strings.xml | 3 + .../addresources/values-vi-rVN/strings.xml | 3 + .../addresources/values-zh-rCN/strings.xml | 8 +++ 41 files changed, 189 insertions(+), 6 deletions(-) diff --git a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml index c42ac772c..0495f230e 100644 --- a/patches/src/main/resources/addresources/values-ar-rSA/strings.xml +++ b/patches/src/main/resources/addresources/values-ar-rSA/strings.xml @@ -35,7 +35,7 @@ Second \"item\" text" الإعدادات هل ترغب في المتابعة؟ إعادة التعيين - إعادة تعيين اللون + Reset color لون غير صالح تحديث وإعادة التشغيل إعادة التشغيل @@ -750,6 +750,9 @@ Second \"item\" text" إخفاء تسمية الموقع تم إخفاء تسمية الموقع يتم عرض تسمية الموقع + إخفاء لوحة التعليقات + تم إخفاء لوحة التعليقات + يتم عرض لوحة التعليقات إخفاء زر حفظ الموسيقى تم إخفاء زر حفظ الموسيقى يتم عرض زر حفظ الموسيقى 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 d450a7dd7..ef91a4e08 100644 --- a/patches/src/main/resources/addresources/values-az-rAZ/strings.xml +++ b/patches/src/main/resources/addresources/values-az-rAZ/strings.xml @@ -1397,6 +1397,7 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər Sürət dialoq düyməsini göstər + Düymə göstərilir. Oynatma sürətin standart olaraq qaytarmaq üçün toxunub saxla Düymə göstərilmir @@ -1408,6 +1409,7 @@ Bunu aktivləşdirmə daha yüksək video keyfiyyətləri əngəlin silə bilər Fərdi sürətlər %s dəyərindən az olmalıdır Fərdi oynatma sürətləri etibarsızdır Avtomatik + Oynatma sürəti sıfırlandı: %s Xüsusi toxunma və saxlanılma sürəti 0-8 arası oynatma sürəti diff --git a/patches/src/main/resources/addresources/values-be-rBY/strings.xml b/patches/src/main/resources/addresources/values-be-rBY/strings.xml index 2fa9a6b95..65bdc15b8 100644 --- a/patches/src/main/resources/addresources/values-be-rBY/strings.xml +++ b/patches/src/main/resources/addresources/values-be-rBY/strings.xml @@ -750,6 +750,9 @@ Second \"item\" text" Схаваць метку месцазнаходжання Метка месцазнаходжання схавана Паказана метка месцазнаходжання + Схаваць панэль каментарыяў + Панель каментарыяў схаваная + Панэль каментарыяў паказана Схаваць кнопку «Захаваць музыку» Кнопка захавання музыкі схавана Кнопка захавання музыкі паказана diff --git a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml index 40d882f9b..07d38ad75 100644 --- a/patches/src/main/resources/addresources/values-bg-rBG/strings.xml +++ b/patches/src/main/resources/addresources/values-bg-rBG/strings.xml @@ -750,6 +750,9 @@ Second \"item\" text" Етикет за местоположение Етикет за местоположение е скрит Етикет за местоположение се показва + Скриване на панела за коментари + Панелът за коментари е скрит + Панелът за коментари е показан Скриване на бутона Save music Бутонът за запазване на музика е скрит Показан е бутонът за запазване на музика diff --git a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml index 03cab4f26..1485da827 100644 --- a/patches/src/main/resources/addresources/values-bn-rBD/strings.xml +++ b/patches/src/main/resources/addresources/values-bn-rBD/strings.xml @@ -746,6 +746,9 @@ MicroG-এর জন্য ব্যাটারি অপ্টিমাইজ অবস্থান লেবেল লুকান অবস্থান লেবেল লুকিয়ে রয়েছে অবস্থান লেবেল প্রদর্শিত হয়েছে + মন্তব্য প্যানেল লুকান + মন্তব্য প্যানেল লুকানো আছে + মন্তব্য প্যানেল দেখানো হয়েছে সেভ মিউজিক বোতামটি লুকান Save music বোতাম লুকানো আছে Save music বোতাম দেখানো হচ্ছে diff --git a/patches/src/main/resources/addresources/values-ca-rES/strings.xml b/patches/src/main/resources/addresources/values-ca-rES/strings.xml index 365d1d73c..3b03d99fc 100644 --- a/patches/src/main/resources/addresources/values-ca-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-ca-rES/strings.xml @@ -750,6 +750,9 @@ Per mostrar el menú de la pista d'àudio, canvieu \"Suplanta els fluxos de víd Amaga l\'etiqueta de ubicació L\'etiqueta de ubicació està oculta L\'etiqueta de ubicació es mostra + Amaga el panell de comentaris + El panell de comentaris està ocult + Es mostra el panell de comentaris Amaga el botó Desa música El botó de desar música està ocult El botó de desar música es mostra diff --git a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml index 78d4be64d..188b4c6ab 100644 --- a/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml +++ b/patches/src/main/resources/addresources/values-cs-rCZ/strings.xml @@ -750,6 +750,9 @@ Chcete-li zobrazit nabídku zvukové stopy, změňte možnost „Zfalšovat stre Skrýt štítek umístění Štítek umístění je skrytý Štítek umístění je zobrazen + Skrýt panel Komentáře + Panel komentářů je skrytý + Panel Komentáře je zobrazen Skrýt tlačítko Uložit hudbu Tlačítko Uložit hudbu je skryté Tlačítko Uložit hudbu je zobrazeno diff --git a/patches/src/main/resources/addresources/values-da-rDK/strings.xml b/patches/src/main/resources/addresources/values-da-rDK/strings.xml index 7dd636c4d..529f2a9f6 100644 --- a/patches/src/main/resources/addresources/values-da-rDK/strings.xml +++ b/patches/src/main/resources/addresources/values-da-rDK/strings.xml @@ -169,6 +169,8 @@ Du modtager ikke notifikationer om uventede hændelser." Knappen er vist Skjul hylden \"Til dig\" + Hylde på kanalsiden er skjult + Hylde på kanalsiden vises Skjul knappen \'Underret mig\' @@ -196,6 +198,8 @@ Du modtager ikke notifikationer om uventede hændelser." Chips hylde er skjult Chips hylde er vist Skjul udvidelige kort under videoer + Udvidelseskort er skjult + Udvidelseskort vises Skjul fællesskabs indlæg Fællesskabs indlæg er skjult Fællesskabs indlæg er vist @@ -211,6 +215,7 @@ Du modtager ikke notifikationer om uventede hændelser." Skjul fællesskabs retningslinjer Fællesskabets retningslinjer er skjult Der er opstillet EF-retningslinjer + Skjul retningslinjer for abonnenter Abonnenter community retningslinjer er skjult Abonnenter community retningslinjer er vist Skjul kanalmedlems hylde @@ -255,10 +260,25 @@ Du modtager ikke notifikationer om uventede hændelser." Skjul Spørg Spørgsmål sektionen er skjult Spørgsmål sektionen vises + Skjul attributter + Fremhævede steder, spil, musik og sektioner med omtalte personer er skjult + Fremhævede steder, spil, musik og sektioner med omtalte personer vises + Skjul kapitler Kapitler sektion er skjult Kapitel afsnit er vist + Skjul \"Hvordan dette indhold blev lavet\" + Sektionen Sådan blev dette indhold lavet er skjult + Sektionen Sådan blev dette indhold lavet vises + Skjul \"Udforsk podcasten\" + Sektionen Udforsk podcasten er skjult + Sektionen Udforsk podcasten vises + Skjul infokort Info-kort sektion er skjult Info-kort sektion er vist + Skjul \"Nøglebegreber\" + Nøglebegrebssektionen er skjult + Nøglebegrebssektionen vises + Skjul udskrift Afsnittet er skjult Afsnittet er vist Video beskrivelse @@ -283,10 +303,17 @@ Du modtager ikke notifikationer om uventede hændelser." Kommentar-oversigt er skjult Kommentar-oversigt er vist Skjul \'Kommentarer fra medlemmer\' header + Kommentarer fra medlemmers overskrift er skjult + Kommentarer fra medlemmers overskrift vises Skjul kommentarsektion Kommentarer sektion er skjult Kommentarer sektion er vist Skjul knappen \"Opret en Short\" + Opret en Short knap er skjult + Opret en Short knap vises + Skjul emoji- og tidsstempelknapper + Emoji- og tidsstempelknapper er skjult + Emoji- og tidsstempelknapper vises Skjul forhåndsvisning kommentar Forhåndsvisning kommentar er skjult Forhåndsvis kommentar er vist @@ -370,8 +397,12 @@ Denne funktion er kun tilgængelig for ældre enheder" Shopping hylde er skjult Shopping hylde er vist Skjul shopping links i video beskrivelse + Shopping links i videobeskrivelsen er skjult + Shopping links i videobeskrivelsen vises Skjul knappen \'Besøg butik\' på kanalsider + Knap på kanalsiden er skjult + Knap på kanalsiden vises Skjul søgeresultater Websøgeresultater er skjult Websøgeresultater vises @@ -411,6 +442,8 @@ Denne funktion er kun tilgængelig for ældre enheder" Eksterne downloads Indstillinger for brug af en ekstern downloader Vis ekstern download-knap + Download-knappen i afspilleren vises + Download-knappen i afspilleren vises ikke Overskriv knappen Download-handling Download-knappen åbner din eksterne downloader @@ -489,6 +522,7 @@ Juster lydstyrken ved at swipe lodret i højre side af skærmen" Handlingsknapper Skjul eller vis knapper under videoer + Deaktiver Like og Abonner-knappen glød Lykke- og abonnér-knappen gløder ikke, når den nævnes Lykke- og abonnér-knappen gløder, når den nævnes Skjul Like og Dislike @@ -716,6 +750,9 @@ For at vise lydspormenuen skal du ændre \"Spoof videostream\" til iOS TV"Skjul placeringsetiket Placeringsetiket er skjult Placeringsetiket er vist + Skjul kommentarfeltet + Kommentarfeltet er skjult + Kommentarfeltet vises Skjul knappen Gem musik Gem musik knap er skjult Gem musik knap er vist @@ -823,6 +860,7 @@ Indstillinger → Afspilning → Afspil næste video automatisk" Dislikerer midlertidigt ikke tilgængelig (API-timeout ud) Dislikationer er ikke tilgængelige (status %d) + Synes ikke godt om er ikke tilgængelige (klient API-grænse) Dislikationer ikke tilgængelige (%s) Genindlæs video for at stemme ved hjælp af Return YouTube Dislike @@ -831,7 +869,13 @@ Indstillinger → Afspilning → Afspil næste video automatisk" Dislikationer vises Dislikationer vises ikke Vis ikke på Shorts + "Synes ikke godt om på Shorts vises + +Begrænsning: Synes ikke godt om vises muligvis ikke i inkognitotilstand" + Synes ikke godt om på Shorts vises ikke Synes ikke som procent + Synes ikke godt om vises som en procentdel + Synes ikke godt om vises som et tal Kompakt like-knap Lideknap stylet for mindste bredde @@ -892,15 +936,20 @@ Denne funktion fungerer bedst med en videokvalitet på 720p eller lavere og ved Knapper og kontrolelementer er firkantede Knapper og kontrolelementer er afrundede + Brug kompakt Spring over-knap Skip knap stylet for mindste bredde Skip knap stylet for bedste udseende + Skjul automatisk Spring over-knap Skip knap skjuler efter et par sekunder + Spring over-knappen vises for hele segmentet + Vis en toast ved spring Toast vises, når et segment automatisk springes over. Tryk her for at se et eksempel Toast er ikke vist. Tryk her for at se et eksempel Vis videolængde uden segmenter Videolængde minus alle segmenter, vist i parentes ved siden af den fulde videolængde Fuld videolængde vist Opretter nye segmenter + Vis Opret nyt segment-knap Opret ny segmentknap vises Opret ny segmentknap vises ikke Juster nyt segment trin @@ -994,6 +1043,7 @@ Dit bruger-id er som en adgangskode, og det må aldrig deles. Oversprunget over flere segmenter Spring automatisk over Spring automatisk over én gang + Vis en Spring over-knap Vis i søgelinjen Deaktivér Kan ikke indsende segment: %s @@ -1021,6 +1071,9 @@ Eksisterer allerede" Kategori er deaktiveret i indstillinger. Aktivér kategori for at indsende. Nyt SponsorBlock segment Sæt %s som start eller afslutning af et nyt segment? + Start + Slut + Nu Tidspunkt for segmentet begynder på Tidspunkt for segmentet slutter på Er tiderne korrekte? @@ -1041,6 +1094,7 @@ Er du klar til at indsende?" Ugyldig tid givet Statistik + Statistikker er midlertidigt ikke tilgængelige (API er nede) Indlæser... SponsorBloker er deaktiveret Dit brugernavn: <b>%s</b> @@ -1093,6 +1147,7 @@ Hvis det senere slås fra, anbefales det at rydde app-dataene for at forhindre U This is because the 'General layout' menu uses alphabetic sorting, and it functionally works better if the spoof target selector appears below the 'Spoof app version' UI switch --> Spoof app version mål 19.35.36 - Gendan gamle Shorts player ikoner + 19.01.34 - Gendan gamle navigationsikoner Skift startside @@ -1250,9 +1305,13 @@ Tryk her for at lære mere om DeArrow" Midten af video Slut på video + DeArrow er midlertidigt ikke tilgængelig (statuskode: %s) + DeArrow er midlertidigt ikke tilgængelig Vis ReVanced meddelelser + Meddelelser ved opstart vises + Meddelelser ved opstart vises ikke Vis meddelelser ved opstart Kunne ikke forbinde til udbyder af annonceringer Luk diff --git a/patches/src/main/resources/addresources/values-de-rDE/strings.xml b/patches/src/main/resources/addresources/values-de-rDE/strings.xml index 74f508f4d..4d8b24f29 100644 --- a/patches/src/main/resources/addresources/values-de-rDE/strings.xml +++ b/patches/src/main/resources/addresources/values-de-rDE/strings.xml @@ -743,6 +743,9 @@ Um das Audiotrack-Menü anzuzeigen, ändere \"Video-Streams fälschen\" zu iOS T Standortbezeichnung ausblenden Ortsbezeichnung ist ausgeblendet Ortsbezeichnung wird angezeigt + Kommentarbereich ausblenden + Das Kommentarfeld ist ausgeblendet + Kommentarbereich wird angezeigt \'Musik speichern\'-Button ausblenden Musikspeicher Button ist ausgeblendet Musikspeicher Button wird angezeigt diff --git a/patches/src/main/resources/addresources/values-el-rGR/strings.xml b/patches/src/main/resources/addresources/values-el-rGR/strings.xml index f48350827..5f0d4e4da 100644 --- a/patches/src/main/resources/addresources/values-el-rGR/strings.xml +++ b/patches/src/main/resources/addresources/values-el-rGR/strings.xml @@ -752,6 +752,9 @@ Second \"item\" text" Ετικέτα τοποθεσίας Κρυμμένη Εμφανίζεται + Απόκρυψη πίνακα σχολίων + Η καρτέλα σχολίων είναι κρυμμένη + Εμφανίζεται ο πίνακας σχολίων Κουμπί «Αποθήκευση μουσικής» Κρυμμένο Εμφανίζεται @@ -1397,7 +1400,7 @@ Second \"item\" text" Εμφάνιση κουμπιού αλλαγής ταχύτητας - Εμφανίζεται το κουμπί. Πατήστε παρατεταμένα για να επαναφέρετε την ταχύτητα αναπαραγωγής στην προεπιλογή + Το κουμπί εμφανίζεται. Πατήστε παρατεταμένα για επαναφορά της ταχύτητας αναπαραγωγής στην προεπιλογή Το κουμπί δεν εμφανίζεται diff --git a/patches/src/main/resources/addresources/values-es-rES/strings.xml b/patches/src/main/resources/addresources/values-es-rES/strings.xml index a3ca44207..c6f92c14a 100644 --- a/patches/src/main/resources/addresources/values-es-rES/strings.xml +++ b/patches/src/main/resources/addresources/values-es-rES/strings.xml @@ -747,6 +747,9 @@ Para mostrar el menú de la pista de audio, cambia \"Suplantar transmisiones de Ocultar etiqueta de ubicación Etiqueta de ubicación oculta Etiqueta de ubicación mostrada + Ocultar el panel de comentarios + El panel de comentarios est oculto + Se muestra el panel de comentarios Ocultar el botón Guardar música El botón Guardar música está oculto Mostrar el botón de guardar música diff --git a/patches/src/main/resources/addresources/values-et-rEE/strings.xml b/patches/src/main/resources/addresources/values-et-rEE/strings.xml index f32c4ece9..8c3725262 100644 --- a/patches/src/main/resources/addresources/values-et-rEE/strings.xml +++ b/patches/src/main/resources/addresources/values-et-rEE/strings.xml @@ -750,6 +750,9 @@ Heliriba menüü kuvamiseks muutke valikut „Võltsitud videovoogedastus“ vä Peida asukoha silt Asukoha silt on peidetud Asukoha silt on nähtav + Peida kommentaaripaneel + Kommentaaripaneel on peidetud + Kommentaaripaneel on nähtaval Peida Salvesta muusika nupp Muusika salvestamise nupp on peidetud Muusika salvestamise nupp on nähtav diff --git a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml index be9ba2896..ff0f2d86c 100644 --- a/patches/src/main/resources/addresources/values-fil-rPH/strings.xml +++ b/patches/src/main/resources/addresources/values-fil-rPH/strings.xml @@ -748,6 +748,9 @@ Upang ipakita ang menu ng Audio track, baguhin ang 'Spoof video streams' sa iOS Itago ang label ng lokasyon Nakatago ang label ng lokasyon Ipinapakita ang label ng lokasyon + Itago ang panel ng Komento + Nakatago ang panel ng mga komento + Ipinapakita ang panel ng Komento Itago ang Save music button Ang buton ng pag-save ng musika ay nakatago Ang buton ng pag-save ng musika ay ipinapakita 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 4d82970de..b59ec851c 100644 --- a/patches/src/main/resources/addresources/values-fr-rFR/strings.xml +++ b/patches/src/main/resources/addresources/values-fr-rFR/strings.xml @@ -750,6 +750,9 @@ Pour afficher le menu Piste audio, définissez \"Falsifier les flux vidéo\" sur Masquer le libellé de lieu Le libellé de lieu est masqué Le libellé de lieu est affiché + Masquer le panneau de commentaire + Le panneau de commentaire est masqué + Le panneau de commentaire est affiché Masquer le bouton Enregistrer la musique Le bouton Enregistrer la musique est masqué Le bouton Enregistrer la musique est affiché 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 640eb5d42..4bbbb061f 100644 --- a/patches/src/main/resources/addresources/values-ga-rIE/strings.xml +++ b/patches/src/main/resources/addresources/values-ga-rIE/strings.xml @@ -750,6 +750,9 @@ Chun roghchlár na rian fuaime a thaispeáint, athraigh 'Srutháin físeáin bhr Folaigh lipéad suímh Tá lipéad suímh i bhfolach Taispeántar lipéad suímh + Folaigh painéal na dtuairimí + Tá an painéal tuairimí i bhfolach + Taispeántar painéal na dtuairimí Folaigh cnaipe \'Sábháil ceol\' Tá an cnaipe Sábháil ceoil i bhfolach Taispeántar an cnaipe Sábháil ceoil diff --git a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml index 3f03caf7a..a5a084fb3 100644 --- a/patches/src/main/resources/addresources/values-hu-rHU/strings.xml +++ b/patches/src/main/resources/addresources/values-hu-rHU/strings.xml @@ -750,6 +750,9 @@ Az audiosáv menü megjelenítéséhez módosítsa a \"Videófolyamok hamisítá Helycímke elrejtése A helycízke címke el van rejtve A helycízke címke meg van jelenítve + Kommentpanel elrejtése + A megjegyzés panel rejtett + A Kommentpanel látható Zene mentése gomb elrejtése A zene mentés gomb el van rejtve A zene mentés gomb látható diff --git a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml index 411728454..092772bda 100644 --- a/patches/src/main/resources/addresources/values-hy-rAM/strings.xml +++ b/patches/src/main/resources/addresources/values-hy-rAM/strings.xml @@ -750,6 +750,9 @@ MicroG-ի համար մարտկոցի օպտիմալացումը անջատել Թաքցնել տեղանքի նշումը Տեղանքի նշումը թաքցված է Տեղանքի նշումը ցուցադրվում է + Թաքցնել մեկնաբանության վահանակը + Մեկնաբանությունների վահանակը թաքցված է + Ցուցադրվում է մեկնաբանության վահանակը Թաքցնել երաժշտությունը պահպանել կոճակը «Save music» կոճակը թաքցված է «Save music» կոճակը ցուցադրվում է diff --git a/patches/src/main/resources/addresources/values-in-rID/strings.xml b/patches/src/main/resources/addresources/values-in-rID/strings.xml index cd4aa849e..a074f7421 100644 --- a/patches/src/main/resources/addresources/values-in-rID/strings.xml +++ b/patches/src/main/resources/addresources/values-in-rID/strings.xml @@ -750,6 +750,9 @@ Untuk menampilkan menu trek Audio, ubah 'Spoof aliran video' ke iOS TV" Sembunyikan label lokasi Label lokasi disembunyikan Label lokasi ditampilkan + Sembunyikan panel Komentar + Panel komentar disembunyikan + Panel komentar ditampilkan Sembunyikan Simpan musik Tombol simpan musik disembunyikan Tombol simpan musik ditampilkan diff --git a/patches/src/main/resources/addresources/values-it-rIT/strings.xml b/patches/src/main/resources/addresources/values-it-rIT/strings.xml index 02864c17e..37298ba80 100644 --- a/patches/src/main/resources/addresources/values-it-rIT/strings.xml +++ b/patches/src/main/resources/addresources/values-it-rIT/strings.xml @@ -750,6 +750,9 @@ Per mostrare il menu della traccia audio, cambia \"Spoof video streams\" in iOS Nascondi etichetta di posizione L\'etichetta di posizione è nascosta L\'etichetta di posizione è visibile + Nascondi pannello dei commenti + Il pannello dei commenti è nascosto + Il pannello dei commenti è visibile Nascondi il pulsante Salva Musica Il pulsante Salva traccia è nascosto Il pulsante Salva traccia è visibile diff --git a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml index a9a9221d5..5332cefcd 100644 --- a/patches/src/main/resources/addresources/values-iw-rIL/strings.xml +++ b/patches/src/main/resources/addresources/values-iw-rIL/strings.xml @@ -750,6 +750,9 @@ Second \"item\" text" הסתר תווית מיקום תווית מיקום מוסתרת תווית מיקום מוצגת + הסתר את לוח התגובות + לוח התגובות מוסתר + לוח התגובות מוצג הסתר לחצן שמור מוזיקה לחצן שמור מוזיקה מוסתר לחצן שמור מוזיקה מוצג 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 b5bdf9c80..711b0f8aa 100644 --- a/patches/src/main/resources/addresources/values-ja-rJP/strings.xml +++ b/patches/src/main/resources/addresources/values-ja-rJP/strings.xml @@ -753,6 +753,9 @@ MicroG GmsCore に対する電池の最適化を無効にしても、バッテ 位置情報ラベルを非表示 位置情報ラベルは表示されません 位置情報ラベルは表示されます + コメント パネルを非表示 + コメント パネルは表示されません + コメント パネルが表示されます 「音楽を保存」ボタンを非表示 「音楽を保存」ボタンは表示されません 「音楽を保存」ボタンは表示されます diff --git a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml index 55235cf9d..4aee55458 100644 --- a/patches/src/main/resources/addresources/values-ko-rKR/strings.xml +++ b/patches/src/main/resources/addresources/values-ko-rKR/strings.xml @@ -750,6 +750,9 @@ MicroG 앱 배터리 최적화를 비활성화(제한 없음)하더라도, 배 위치 라벨 숨기기 위치 라벨이 숨겨집니다 위치 라벨이 표시됩니다 + 댓글 패널 숨기기 + 댓글 패널이 숨겨집니다 + 댓글 패널이 표시됩니다 (재생목록에) 음악 저장 버튼 숨기기 (재생목록에) 음악 저장 버튼이 숨겨집니다 (재생목록에) 음악 저장 버튼이 표시됩니다 diff --git a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml index 451cf1af2..a859643b6 100644 --- a/patches/src/main/resources/addresources/values-lt-rLT/strings.xml +++ b/patches/src/main/resources/addresources/values-lt-rLT/strings.xml @@ -748,6 +748,9 @@ Jei pakeitus šį nustatymą neįsigalioja, pabandykite perjungti į inkognito r Slėpti vietovės etiketę Vietovės etiketė paslėpta Vietovės etiketė rodoma + Slėpti komentarų skydelį + Komentarų skydelis yra paslėptas + Komentarų skydelis rodomas Paslėpti mygtuką „Įrašyti muziką\" \"Išsaugoti muziką\" mygtukas paslėptas \"Išsaugoti muziką\" mygtukas rodomas diff --git a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml index 63296a7c8..e4955efa5 100644 --- a/patches/src/main/resources/addresources/values-lv-rLV/strings.xml +++ b/patches/src/main/resources/addresources/values-lv-rLV/strings.xml @@ -750,6 +750,9 @@ Lai parādītu audio celiņu izvēlni, mainiet \"Video straumju viltošana\" uz Paslēpt atrašanās vietas nosaukumu Atrašanās vietas nosaukums ir paslēpts Atrašanās vietas nosaukums ir redzams + Slēpt komentāru paneli + Komentāru panelis ir paslēpts + Komentāru panelis ir redzams Paslēpt pogu \"Saglabāt mūziku\" “Saglabāt mūziku” poga ir paslēpta “Saglabāt mūziku” poga ir redzama diff --git a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml index b8a20307e..1512b5245 100644 --- a/patches/src/main/resources/addresources/values-nl-rNL/strings.xml +++ b/patches/src/main/resources/addresources/values-nl-rNL/strings.xml @@ -750,6 +750,9 @@ Om het audiotrackmenu weer te geven, wijzigt u 'Videostreams vervalsen' in iOS T Verberg locatie-etiket Locatie-etiket is verborgen Locatie-etiket wordt weergegeven + Commentaarvenster verbergen + Commentaarvenster is verborgen + Het commentaarvenster wordt weergegeven Verberg de knop \"Muziek opslaan\" Muziek opslaan-knop is verborgen Muziek opslaan-knop wordt weergegeven diff --git a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml index 06fa310ce..a284b13fc 100644 --- a/patches/src/main/resources/addresources/values-pl-rPL/strings.xml +++ b/patches/src/main/resources/addresources/values-pl-rPL/strings.xml @@ -746,6 +746,9 @@ Aby pokazać menu ścieżki audio, zmień opcję „Fałszuj strumienie wideo” Etykieta lokalizacji Etykieta lokalizacji jest ukryta Etykieta lokalizacji jest widoczna + Ukryj panel komentarzy + Panel komentarzy jest ukryty + Panel komentarzy jest wyświetlany Ukryj przycisk \"Zapisz muzykę\" Przycisk od zapisywania muzyki jest ukryty Przycisk od zapisywania muzyki jest widoczny diff --git a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml index ec084134d..707784227 100644 --- a/patches/src/main/resources/addresources/values-pt-rBR/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rBR/strings.xml @@ -748,6 +748,9 @@ Para exibir o menu da faixa de áudio, altere \"Spoof video streams\" para iOS T Ocultar rótulo de localização Rótulo de localização está oculto Rótulo de localização é mostrado + Ocultar painel de comentários + Painel de comentários está oculto + O painel de comentários é mostrado Ocultar botão Salvar música O botão Salvar música está oculto O botão Salvar música será exibido diff --git a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml index 5e69bb4af..af89ae2d2 100644 --- a/patches/src/main/resources/addresources/values-pt-rPT/strings.xml +++ b/patches/src/main/resources/addresources/values-pt-rPT/strings.xml @@ -750,6 +750,9 @@ Para mostrar o menu da faixa de áudio, altere \"Spoof video streams\" para iOS Ocultar rótulo de localização Rótulo de localização está oculto Rótulo de localização é mostrado + Ocultar painel de comentários + O painel de comentários está oculto + O painel de comentários está visível Ocultar botão de salvar música O botão salvar música está oculto O botão salvar música é mostrado diff --git a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml index 80fa2f5e4..17976ac7e 100644 --- a/patches/src/main/resources/addresources/values-ro-rRO/strings.xml +++ b/patches/src/main/resources/addresources/values-ro-rRO/strings.xml @@ -750,6 +750,9 @@ Pentru a afișa meniul pentru pista audio, schimbați opțiunea „Falsifică fl Ascunde eticheta locației Eticheta locației este ascunsă Eticheta locației este afișată + Ascunde panoul de comentarii + Panoul de comentarii este ascuns + Panoul de comentarii este afișat Ascunde butonul Salvează melodia Butonul de salvare a muzicii este ascuns Butonul de salvare a muzicii este afișat diff --git a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml index f4ee4dcfb..56c0a6aed 100644 --- a/patches/src/main/resources/addresources/values-ru-rRU/strings.xml +++ b/patches/src/main/resources/addresources/values-ru-rRU/strings.xml @@ -750,6 +750,9 @@ Second \"item\" text" Скрыть метку местоположения Метка местоположения в Shorts скрыта Метка местоположения в Shorts показана + Скрыть панель комментариев + Панель комментариев скрыта + Панель комментариев отображается Скрыть кнопку \"Сохранить музыку\" Кнопка \"Сохранить музыку\" в Shorts скрыта Кнопка \"Сохранить музыку\" в Shorts показана diff --git a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml index 36e5cb695..e1151bd2f 100644 --- a/patches/src/main/resources/addresources/values-sk-rSK/strings.xml +++ b/patches/src/main/resources/addresources/values-sk-rSK/strings.xml @@ -743,6 +743,9 @@ Ak chcete zobraziť ponuku zvukovej stopy, zmeňte možnosť „Oklamať videost Skryť štítok polohy Štítok miesta je skrytý Zobrazí sa štítok s umiestnením + Skryť panel komentárov + Panel komentárov je skrytý + Panel komentárov je zobrazený Skryť tlačidlo Uložiť hudbu Tlačidlo na uloženie hudby je skryté Tlačidlo na uloženie hudby sa zobrazuje diff --git a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml index 2e2c27b40..08050a5e4 100644 --- a/patches/src/main/resources/addresources/values-sl-rSI/strings.xml +++ b/patches/src/main/resources/addresources/values-sl-rSI/strings.xml @@ -750,6 +750,9 @@ Opomba: Omogočanje tega tudi prisilno skrije video oglase" Skrij oznako lokacije Oznaka lokacije je skrita Oznaka lokacije je prikazana + Skrij ploščo s komentarji + Plošča s komentarji je skrita + Plošča s komentarji je prikazana Skrij gumb \'Shrani glasbo\' Gumb za shranjevanje glasbe je skrit Gumb za shranjevanje glasbe je prikazan diff --git a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml index 209e16234..96222800b 100644 --- a/patches/src/main/resources/addresources/values-sq-rAL/strings.xml +++ b/patches/src/main/resources/addresources/values-sq-rAL/strings.xml @@ -750,6 +750,9 @@ Për të shfaqur menunë e pistës audio, ndryshoni 'Falsifiko transmetimet vide Fsheh etiketën e vendndodhjes Etiketë e vendndodhjes është e fshehur Etiketë e vendndodhjes shfaqet + Fshih panelin e komenteve + Paneli i komenteve është i fshehur + Paneli i komenteve është i dukshëm Fsheh butonin Ruaj muzikën Butoni \"Ruaj muzikën\" është i fshehur Butoni \"Ruaj muzikën\" shfaqet diff --git a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml index 20f08080e..6721c2110 100644 --- a/patches/src/main/resources/addresources/values-sr-rCS/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rCS/strings.xml @@ -750,6 +750,9 @@ Da biste prikazali meni „Audio snimak”, promenite opciju „Lažirani video Sakrij oznaku lokacije Oznaka lokacije je skrivena Oznaka lokacije je prikazana + Sakrij tablu sa komentarima + Panel sa komentarima je skriven + Tabla sa komentarima je prikazana Sakrij dugme „Sačuvaj muziku” Dugme „Sačuvaj zvuk” je skriveno Dugme „Sačuvaj zvuk” je prikazano @@ -1397,7 +1400,7 @@ Ako ovo omogućite, mogu biti otključani viši kvaliteti videa" Prikaži dugme dijaloga za brzinu - Dugme je prikazano. Dodirnite i držite da biste vratili brzinu reprodukcije na podrazumevanu + Dugme je prikazano. Dodirnite i zadržite da biste vratili brzinu reprodukcije na podrazumevanu vrednost Dugme dijaloga za brzinu nije prikazano @@ -1409,7 +1412,7 @@ Ako ovo omogućite, mogu biti otključani viši kvaliteti videa" Prilagođene brzine moraju biti manje od %s Nevažeće prilagođene brzine reprodukcije Automatski - Brzina reprodukcije resetovana na: %s + Brzina reprodukcije vraćena na: %s Prilagođena brzina dodirivanja i zadržavanja Brzina reprodukcije između 0 i 8 diff --git a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml index 2f10f9fac..debd8e046 100644 --- a/patches/src/main/resources/addresources/values-sr-rSP/strings.xml +++ b/patches/src/main/resources/addresources/values-sr-rSP/strings.xml @@ -750,6 +750,9 @@ Second \"item\" text" Сакриј ознаку локације Ознака локације је скривена Ознака локације је приказана + Сакриј панел за коментаре + Панел за коментаре је сакривен + „Резиме коментара” је приказан Сакриј дугме „Сачувај музику” Дугме „Сачувај звук” је скривено Дугме „Сачувај звук” је приказано @@ -1397,7 +1400,7 @@ Second \"item\" text" Прикажи дугме дијалога за брзину - Дуго притисните дугме да бисте вратили подразумевану брзину репродукције + Дугме је приказано. Додирните и задржите да бисте вратили брзину репродукције на подразумевану вредност Дугме дијалога за брзину није приказано diff --git a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml index 19d306b01..362ddcc09 100644 --- a/patches/src/main/resources/addresources/values-sv-rSE/strings.xml +++ b/patches/src/main/resources/addresources/values-sv-rSE/strings.xml @@ -750,6 +750,9 @@ För att visa ljudspårsmenyn, ändra \"Spoof video streams\" till iOS TV"Dölj platsetikett Platsetiketten är dold Platsetikett är synlig + Dölj kommentarsfältet + Kommentarsfältet är dolt + Kommentarsfältet visas Dölj knapp \'Spara musik\' Spara musikknappen är dold Spara musikknappen visas diff --git a/patches/src/main/resources/addresources/values-th-rTH/strings.xml b/patches/src/main/resources/addresources/values-th-rTH/strings.xml index b5e714668..5cbf5ac33 100644 --- a/patches/src/main/resources/addresources/values-th-rTH/strings.xml +++ b/patches/src/main/resources/addresources/values-th-rTH/strings.xml @@ -748,6 +748,9 @@ Second \"item\" text" ซ่อนป้ายกำกับสถานที่ ป้ายกำกับสถานที่ถูกซ่อน ป้ายกำกับสถานที่แสดงอยู่ + ซ่อนแผงความคิดเห็น + ส่วนความคิดเห็นถูกซ่อนไว้ + แผงความคิดเห็นจะแสดง ซ่อนปุ่มบันทึกเพลง ปุ่มบันทึกเพลงถูกซ่อน ปุ่มบันทึกเพลงแสดงอยู่ diff --git a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml index e8e873a3a..fc5545605 100644 --- a/patches/src/main/resources/addresources/values-tr-rTR/strings.xml +++ b/patches/src/main/resources/addresources/values-tr-rTR/strings.xml @@ -750,6 +750,9 @@ Ses parçası menüsünü göstermek için \"Video akışlarını taklit et\" ay Konum etiketini gizle Konum etiketi gizli Konum etiketi görünür + Yorum panelini gizle + Yorum paneli gizli + Yorum paneli görünür Müziği kaydet düğmesini gizle Müziği kaydet düğmesi gizli Müziği kaydet düğmesi görünür @@ -1398,7 +1401,7 @@ Bunu etkinleştirmek daha yüksek video kalitelerini açabilir" Hız diyaloğu düğmesini göster - Düğme gösteriliyor. Oynatma hızını varsayılana sıfırlamak için dokunup basılı tutun + Düğme görünür. Oynatma hızını varsayılana sıfırlamak için dokunup basılı tutun Düğme gösterilmez diff --git a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml index dffcb2746..e2fb0df6b 100644 --- a/patches/src/main/resources/addresources/values-uk-rUA/strings.xml +++ b/patches/src/main/resources/addresources/values-uk-rUA/strings.xml @@ -751,6 +751,9 @@ Second \"item\" text" Приховати мітку місцезнаходження Мітку місцезнаходження приховано Мітка місцезнаходження показується + Приховати панель коментарів + Панель коментарів приховано + Панель коментарів показується Приховати \"Зберегти музику\" Кнопку \"Зберегти музику\" приховано Кнопка \"Зберегти музику\" показується diff --git a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml index 1fb61956e..518d46319 100644 --- a/patches/src/main/resources/addresources/values-vi-rVN/strings.xml +++ b/patches/src/main/resources/addresources/values-vi-rVN/strings.xml @@ -750,6 +750,9 @@ Nếu việc thay đổi cài đặt này không có hiệu lực, hãy thử ch Ẩn nhãn vị trí Nhãn vị trí đã bị ẩn Nhãn vị trí được hiển thị + Ẩn bảng Bình luận + Đã ẩn bảng điều khiển bình luận + Bảng bình luận đang hiển thị Ẩn nút Lưu âm thanh Nút lưu nhạc đã bị ẩn Nút lưu nhạc được hiển thị diff --git a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml index bd51c6fe8..0150ac38b 100644 --- a/patches/src/main/resources/addresources/values-zh-rCN/strings.xml +++ b/patches/src/main/resources/addresources/values-zh-rCN/strings.xml @@ -491,6 +491,10 @@ Second \"item\" text" 滑动提示层背景的不透明度 不透明度值介于 0-100 之间 滑动不透明度必须介于 0-100 之间 + 滑动提示层亮度颜色 + 亮度控件进度条的颜色 + 滑动提示层音量颜色 + 音量控件进度条的颜色 滑动提示层文字大小 滑动提示层的文字大小,范围为 1-30 文字大小必须在 1-30 之间 @@ -746,6 +750,9 @@ Second \"item\" text" 隐藏位置标签 位置标签已隐藏 位置标签已显示 + 隐藏评论面板 + 已隐藏评论面板 + 评论面板已显示 隐藏「保存音乐」按钮 保存音乐按钮已隐藏 保存音乐按钮已显示 @@ -1398,6 +1405,7 @@ Second \"item\" text" 显示播放速度对话框按钮 + 按钮已显示。点住即可将播放速度重置为默认值 按钮未显示 From 835b7bd7bd667abd632822c98898972e5124dbb6 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 4 Jun 2025 13:45:48 +0200 Subject: [PATCH 20/21] fix(YouTube - Hide Shorts components): Disable A/B player that prevents hiding buttons (#5104) --- .../layout/hide/shorts/Fingerprints.kt | 18 ++++++++++++++ .../hide/shorts/HideShortsComponentsPatch.kt | 24 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt index f3a6244c3..cc883425b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt @@ -74,3 +74,21 @@ internal val setPivotBarVisibilityParentFingerprint = fingerprint { parameters("Z") strings("FEnotifications_inbox") } + +internal val shortsExperimentalPlayerFeatureFlagFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + parameters() + literal { + 45677719L + } +} + +internal val renderNextUIFeatureFlagFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + parameters() + literal { + 45649743L + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 61b29975b..551a109f7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -18,6 +18,7 @@ import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_41_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch @@ -26,6 +27,7 @@ import app.revanced.util.forEachLiteralValueInstruction import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstLiteralInstruction +import app.revanced.util.returnLate import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -252,5 +254,27 @@ val hideShortsComponentsPatch = bytecodePatch( } // endregion + + // region Disable experimental Shorts flags. + + // Flags might be present in earlier targets, but they are not found in 19.47.53. + // If these flags are forced on, the experimental layout is still not used and + // it appears the features requires additional server side data to fully use. + if (is_20_07_or_greater) { + // Experimental Shorts player uses Android native buttons and not Litho, + // and the layout is provided by the server. + // + // Since the buttons are native components and not Litho, it should be possible to + // fix the RYD Shorts loading delay by asynchronously loading RYD and updating + // the button text after RYD has loaded. + shortsExperimentalPlayerFeatureFlagFingerprint.method.returnLate(true) + + // Experimental UI renderer must also be disabled since it requires the + // experimental Shorts player. If this is enabled but Shorts player + // is disabled then the app crashes when the Shorts player is opened. + renderNextUIFeatureFlagFingerprint.method.returnLate(true) + } + + // endregion } } From 76984ed20f4fd4e3b88460526bd1d9d5af78e9ad Mon Sep 17 00:00:00 2001 From: semantic-release-bot Date: Wed, 4 Jun 2025 11:48:26 +0000 Subject: [PATCH 21/21] chore: Release v5.26.0-dev.8 [skip ci] # [5.26.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.7...v5.26.0-dev.8) (2025-06-04) ### Bug Fixes * **YouTube - Hide Shorts components:** Disable A/B player that prevents hiding buttons ([#5104](https://github.com/ReVanced/revanced-patches/issues/5104)) ([835b7bd](https://github.com/ReVanced/revanced-patches/commit/835b7bd7bd667abd632822c98898972e5124dbb6)) --- CHANGELOG.md | 7 +++++++ gradle.properties | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fb4246e72..753526973 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# [5.26.0-dev.8](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.7...v5.26.0-dev.8) (2025-06-04) + + +### Bug Fixes + +* **YouTube - Hide Shorts components:** Disable A/B player that prevents hiding buttons ([#5104](https://github.com/ReVanced/revanced-patches/issues/5104)) ([835b7bd](https://github.com/ReVanced/revanced-patches/commit/835b7bd7bd667abd632822c98898972e5124dbb6)) + # [5.26.0-dev.7](https://github.com/ReVanced/revanced-patches/compare/v5.26.0-dev.6...v5.26.0-dev.7) (2025-06-04) diff --git a/gradle.properties b/gradle.properties index 7cba09727..57a97e241 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.26.0-dev.7 +version = 5.26.0-dev.8