mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-08 10:23:55 +01:00
Compare commits
41 Commits
v4.5.0-dev
...
v4.7.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa1c616014 | ||
|
|
e97aaf4aae | ||
|
|
92c90ec208 | ||
|
|
b4e8beb8ec | ||
|
|
f2fe0d5c6f | ||
|
|
3d3197701c | ||
|
|
1ac612798b | ||
|
|
e1ed1aee69 | ||
|
|
795ccac990 | ||
|
|
da55410a2b | ||
|
|
e7983411a7 | ||
|
|
182748cb16 | ||
|
|
122f04219f | ||
|
|
80763bcef6 | ||
|
|
b80bb8969c | ||
|
|
2a86a670f0 | ||
|
|
dba37b834d | ||
|
|
3ad4eb8dbc | ||
|
|
0e88306f3f | ||
|
|
87cb63f2e7 | ||
|
|
0fead38701 | ||
|
|
19a31019c2 | ||
|
|
61758414c2 | ||
|
|
b4ee8b6da4 | ||
|
|
e86e3d88cf | ||
|
|
8cf444962c | ||
|
|
48bf632dbe | ||
|
|
03e91d4251 | ||
|
|
8caf70719e | ||
|
|
2f28e95252 | ||
|
|
d819e7bbe9 | ||
|
|
fef5f35788 | ||
|
|
80034bc70a | ||
|
|
c40911a815 | ||
|
|
1a53a93cd2 | ||
|
|
2e68c65c9f | ||
|
|
6f8d92827b | ||
|
|
ab2260acfd | ||
|
|
9b3c060acb | ||
|
|
bbc4a6bfa0 | ||
|
|
4df9b9d5b1 |
34
.github/workflows/pull_strings.yml
vendored
Normal file
34
.github/workflows/pull_strings.yml
vendored
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
name: Pull strings
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: 0 0 1 * *
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
pull:
|
||||||
|
name: Pull strings
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Pull strings
|
||||||
|
uses: crowdin/github-action@v1
|
||||||
|
with:
|
||||||
|
config: crowdin.yml
|
||||||
|
download_translations: true
|
||||||
|
localization_branch_name: feat/translations
|
||||||
|
create_pull_request: true
|
||||||
|
pull_request_title: "chore: Sync translations"
|
||||||
|
pull_request_body: "Sync translations from [crowdin.com/project/revanced](https://crowdin.com/project/revanced)"
|
||||||
|
pull_request_base_branch_name: "dev"
|
||||||
|
commit_message: "chore: Sync translations"
|
||||||
|
github_user_name: revanced-bot
|
||||||
|
github_user_email: github@revanced.app
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }}
|
||||||
|
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
|
||||||
|
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
|
||||||
27
.github/workflows/push_strings.yml
vendored
Normal file
27
.github/workflows/push_strings.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
name: Push strings
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- /src/main/resources/addresources/values/strings.xml
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
push:
|
||||||
|
name: Push strings
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Push strings
|
||||||
|
uses: crowdin/github-action@v1
|
||||||
|
with:
|
||||||
|
config: crowdin.yml
|
||||||
|
upload_sources: true
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }}
|
||||||
|
CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }}
|
||||||
|
CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }}
|
||||||
106
CHANGELOG.md
106
CHANGELOG.md
@@ -1,3 +1,109 @@
|
|||||||
|
# [4.7.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v4.7.0-dev.4...v4.7.0-dev.5) (2024-04-10)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube - Hide Shorts components:** Correctly hide Shorts if navigation tab is changed using device back button ([#3007](https://github.com/ReVanced/revanced-patches/issues/3007)) ([e5848e9](https://github.com/ReVanced/revanced-patches/commit/e5848e99c4cc838595164ef673a77fe60d28086b))
|
||||||
|
|
||||||
|
# [4.7.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v4.7.0-dev.3...v4.7.0-dev.4) (2024-04-09)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **Amazon:** Add `Always allow deep-linking` patch ([#3000](https://github.com/ReVanced/revanced-patches/issues/3000)) ([a92b7fb](https://github.com/ReVanced/revanced-patches/commit/a92b7fb43c8b1b45577360cdc6d883fe2815c2f2))
|
||||||
|
* **Twitter:** Add `Sanitize sharing links` patch ([#3003](https://github.com/ReVanced/revanced-patches/issues/3003)) ([186b887](https://github.com/ReVanced/revanced-patches/commit/186b8874157eef1b882b05d491ba1d4ca2809535))
|
||||||
|
|
||||||
|
# [4.7.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v4.7.0-dev.2...v4.7.0-dev.3) (2024-04-09)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **Tumblr - Fix old versions:** Improve reliability by removing remnances of Tumblr Live ([#2988](https://github.com/ReVanced/revanced-patches/issues/2988)) ([897b4db](https://github.com/ReVanced/revanced-patches/commit/897b4dbce984270ae1fd7de5bd30bd05153e45f2))
|
||||||
|
|
||||||
|
# [4.7.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.7.0-dev.1...v4.7.0-dev.2) (2024-04-06)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **Strava - Unlock subscription:** Remove compatible version constraint ([80a5599](https://github.com/ReVanced/revanced-patches/commit/80a55991683d7b22626224fa2935a5bf9bfcbfee))
|
||||||
|
|
||||||
|
# [4.7.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.6.1-dev.3...v4.7.0-dev.1) (2024-04-06)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **YouTube - Hide layout components:** Add option to hide horizontal shelves ([#2951](https://github.com/ReVanced/revanced-patches/issues/2951)) ([9ae0650](https://github.com/ReVanced/revanced-patches/commit/9ae0650c0005d882299996aa442410bab4261395))
|
||||||
|
|
||||||
|
## [4.6.1-dev.3](https://github.com/ReVanced/revanced-patches/compare/v4.6.1-dev.2...v4.6.1-dev.3) (2024-04-06)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube - GmsCore support:** Prompt to disable battery optimizations, if not done already ([#2958](https://github.com/ReVanced/revanced-patches/issues/2958)) ([82acb84](https://github.com/ReVanced/revanced-patches/commit/82acb84b5f6ff0722a2eb080b53da9dd3622502f))
|
||||||
|
|
||||||
|
## [4.6.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.6.1-dev.1...v4.6.1-dev.2) (2024-04-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube - Hide load more button:** Include patch with `Hide layout components`, and hide button only in search feed ([#2959](https://github.com/ReVanced/revanced-patches/issues/2959)) ([b007e8e](https://github.com/ReVanced/revanced-patches/commit/b007e8e06a3afad79b40bec1c6a14604f059049c))
|
||||||
|
|
||||||
|
## [4.6.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.6.0...v4.6.1-dev.1) (2024-04-04)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube - Player flyout menu:** Add hide Lock screen menu ([#2985](https://github.com/ReVanced/revanced-patches/issues/2985)) ([308de4a](https://github.com/ReVanced/revanced-patches/commit/308de4a63ca99b8d30d6b3242f98d6f0e2aefb37))
|
||||||
|
|
||||||
|
# [4.6.0](https://github.com/ReVanced/revanced-patches/compare/v4.5.0...v4.6.0) (2024-04-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **Mi Fitness - Fix login:** Patch correct register ([#2942](https://github.com/ReVanced/revanced-patches/issues/2942)) ([dc96942](https://github.com/ReVanced/revanced-patches/commit/dc969422b5d50f21e6ea7a64b67dfc650fee6e36))
|
||||||
|
* **Tumblr:** Restore compatibility with latest versions ([#2955](https://github.com/ReVanced/revanced-patches/issues/2955)) ([2954ba7](https://github.com/ReVanced/revanced-patches/commit/2954ba78d21d77308404961f79234bbec606d42e))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **Tumblr:** Add `Fix old versions` patch ([#2954](https://github.com/ReVanced/revanced-patches/issues/2954)) ([2fde60e](https://github.com/ReVanced/revanced-patches/commit/2fde60eceb0a96fa857c32cd55c1fd7fe776a679))
|
||||||
|
|
||||||
|
# [4.6.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.5.1-dev.2...v4.6.0-dev.1) (2024-03-31)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **Tumblr:** Add `Fix old versions` patch ([#2954](https://github.com/ReVanced/revanced-patches/issues/2954)) ([2fde60e](https://github.com/ReVanced/revanced-patches/commit/2fde60eceb0a96fa857c32cd55c1fd7fe776a679))
|
||||||
|
|
||||||
|
## [4.5.1-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.5.1-dev.1...v4.5.1-dev.2) (2024-03-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **Mi Fitness - Fix login:** Patch correct register ([#2942](https://github.com/ReVanced/revanced-patches/issues/2942)) ([dc96942](https://github.com/ReVanced/revanced-patches/commit/dc969422b5d50f21e6ea7a64b67dfc650fee6e36))
|
||||||
|
|
||||||
|
## [4.5.1-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.5.0...v4.5.1-dev.1) (2024-03-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **Tumblr:** Restore compatibility with latest versions ([#2955](https://github.com/ReVanced/revanced-patches/issues/2955)) ([2954ba7](https://github.com/ReVanced/revanced-patches/commit/2954ba78d21d77308404961f79234bbec606d42e))
|
||||||
|
|
||||||
|
# [4.5.0](https://github.com/ReVanced/revanced-patches/compare/v4.4.0...v4.5.0) (2024-03-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **YouTube - Alternative thumbnails:** Selectively enable for home / subscription / search ([#2926](https://github.com/ReVanced/revanced-patches/issues/2926)) ([8549e1b](https://github.com/ReVanced/revanced-patches/commit/8549e1ba58ad1e1608f5e3ceacd31eeb94578949))
|
||||||
|
* **YouTube - GmsCore:** Require ignoring battery optimizations ([#2952](https://github.com/ReVanced/revanced-patches/issues/2952)) ([c0bef25](https://github.com/ReVanced/revanced-patches/commit/c0bef255909ca884838675ca6f7ac5b0e2e21730))
|
||||||
|
|
||||||
|
# [4.5.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.5.0-dev.1...v4.5.0-dev.2) (2024-03-30)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **YouTube - GmsCore:** Require ignoring battery optimizations ([#2952](https://github.com/ReVanced/revanced-patches/issues/2952)) ([c0bef25](https://github.com/ReVanced/revanced-patches/commit/c0bef255909ca884838675ca6f7ac5b0e2e21730))
|
||||||
|
|
||||||
# [4.5.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.4.0...v4.5.0-dev.1) (2024-03-29)
|
# [4.5.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.4.0...v4.5.0-dev.1) (2024-03-29)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -152,6 +152,12 @@ public final class app/revanced/patches/all/telephony/sim/spoof/SpoofSimCountryP
|
|||||||
public fun transform (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Lkotlin/Pair;)V
|
public fun transform (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Lkotlin/Pair;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class app/revanced/patches/amazon/deeplinking/DeepLinkingPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||||
|
public static final field INSTANCE Lapp/revanced/patches/amazon/deeplinking/DeepLinkingPatch;
|
||||||
|
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||||
|
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||||
|
}
|
||||||
|
|
||||||
public final class app/revanced/patches/backdrops/misc/pro/ProUnlockPatch : app/revanced/patcher/patch/BytecodePatch {
|
public final class app/revanced/patches/backdrops/misc/pro/ProUnlockPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||||
public static final field INSTANCE Lapp/revanced/patches/backdrops/misc/pro/ProUnlockPatch;
|
public static final field INSTANCE Lapp/revanced/patches/backdrops/misc/pro/ProUnlockPatch;
|
||||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||||
@@ -1056,6 +1062,12 @@ public final class app/revanced/patches/tumblr/featureflags/OverrideFeatureFlags
|
|||||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class app/revanced/patches/tumblr/fixes/FixOldVersionsPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||||
|
public static final field INSTANCE Lapp/revanced/patches/tumblr/fixes/FixOldVersionsPatch;
|
||||||
|
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||||
|
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||||
|
}
|
||||||
|
|
||||||
public final class app/revanced/patches/tumblr/live/DisableTumblrLivePatch : app/revanced/patcher/patch/BytecodePatch {
|
public final class app/revanced/patches/tumblr/live/DisableTumblrLivePatch : app/revanced/patcher/patch/BytecodePatch {
|
||||||
public static final field INSTANCE Lapp/revanced/patches/tumblr/live/DisableTumblrLivePatch;
|
public static final field INSTANCE Lapp/revanced/patches/tumblr/live/DisableTumblrLivePatch;
|
||||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||||
@@ -1190,6 +1202,12 @@ public final class app/revanced/patches/twitter/misc/links/OpenLinksWithAppChoos
|
|||||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||||
|
public static final field INSTANCE Lapp/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch;
|
||||||
|
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||||
|
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||||
|
}
|
||||||
|
|
||||||
public final class app/revanced/patches/vsco/misc/pro/UnlockProPatch : app/revanced/patcher/patch/BytecodePatch {
|
public final class app/revanced/patches/vsco/misc/pro/UnlockProPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||||
public static final field INSTANCE Lapp/revanced/patches/vsco/misc/pro/UnlockProPatch;
|
public static final field INSTANCE Lapp/revanced/patches/vsco/misc/pro/UnlockProPatch;
|
||||||
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ repositories {
|
|||||||
mavenLocal()
|
mavenLocal()
|
||||||
google()
|
google()
|
||||||
maven {
|
maven {
|
||||||
// A repository must be speficied for some reason. "registry" is a dummy.
|
// A repository must be specified for some reason. "registry" is a dummy.
|
||||||
url = uri("https://maven.pkg.github.com/revanced/registry")
|
url = uri("https://maven.pkg.github.com/revanced/registry")
|
||||||
credentials {
|
credentials {
|
||||||
username = project.findProperty("gpr.user") as String? ?: System.getenv("GITHUB_ACTOR")
|
username = project.findProperty("gpr.user") as String? ?: System.getenv("GITHUB_ACTOR")
|
||||||
|
|||||||
8
crowdin.yml
Normal file
8
crowdin.yml
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
project_id_env: "CROWDIN_PROJECT_ID"
|
||||||
|
api_token_env: "CROWDIN_PERSONAL_TOKEN"
|
||||||
|
|
||||||
|
preserve_hierarchy: false
|
||||||
|
files:
|
||||||
|
- source: src/main/resources/addresources/values/strings.xml
|
||||||
|
translation: src/main/resources/addresources/values-%android_code%/strings.xml
|
||||||
|
skip_untranslated_strings: true
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
org.gradle.parallel = true
|
org.gradle.parallel = true
|
||||||
org.gradle.caching = true
|
org.gradle.caching = true
|
||||||
kotlin.code.style = official
|
kotlin.code.style = official
|
||||||
version = 4.5.0-dev.1
|
version = 4.7.0-dev.5
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package app.revanced.patches.amazon.deeplinking
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
internal object DeepLinkingFingerprint : MethodFingerprint(
|
||||||
|
"Z",
|
||||||
|
parameters = listOf("L"),
|
||||||
|
accessFlags = AccessFlags.PRIVATE.value,
|
||||||
|
strings = listOf("https://www.", "android.intent.action.VIEW")
|
||||||
|
)
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
package app.revanced.patches.amazon.deeplinking
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||||
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
|
import app.revanced.util.exception
|
||||||
|
|
||||||
|
@Patch(
|
||||||
|
name = "Always allow deep-linking",
|
||||||
|
description = "Open Amazon links, even if the app is not set to handle Amazon links.",
|
||||||
|
compatiblePackages = [CompatiblePackage("com.amazon.mShop.android.shopping")]
|
||||||
|
)
|
||||||
|
@Suppress("unused")
|
||||||
|
object DeepLinkingPatch : BytecodePatch(
|
||||||
|
setOf(DeepLinkingFingerprint)
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext) {
|
||||||
|
DeepLinkingFingerprint.result?.mutableMethod?.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
const/4 v0, 0x1
|
||||||
|
return v0
|
||||||
|
"""
|
||||||
|
) ?: throw DeepLinkingFingerprint.exception
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,13 +2,11 @@ package app.revanced.patches.mifitness.misc.login
|
|||||||
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
import app.revanced.patches.mifitness.misc.login.fingerprints.XiaomiAccountManagerConstructorFingerprint
|
import app.revanced.patches.mifitness.misc.login.fingerprints.XiaomiAccountManagerConstructorFingerprint
|
||||||
import app.revanced.util.exception
|
import app.revanced.util.exception
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
|
||||||
|
|
||||||
@Patch(
|
@Patch(
|
||||||
name = "Fix login",
|
name = "Fix login",
|
||||||
@@ -20,16 +18,9 @@ object FixLoginPatch : BytecodePatch(
|
|||||||
setOf(XiaomiAccountManagerConstructorFingerprint),
|
setOf(XiaomiAccountManagerConstructorFingerprint),
|
||||||
) {
|
) {
|
||||||
override fun execute(context: BytecodeContext) {
|
override fun execute(context: BytecodeContext) {
|
||||||
XiaomiAccountManagerConstructorFingerprint.result?.let {
|
XiaomiAccountManagerConstructorFingerprint.result?.mutableMethod?.addInstruction(
|
||||||
it.mutableMethod.apply {
|
0,
|
||||||
val isCertifiedIndex = it.scanResult.patternScanResult!!.startIndex
|
"const/16 p2, 0x0",
|
||||||
val isCertifiedRegister = getInstruction<OneRegisterInstruction>(isCertifiedIndex).registerA
|
) ?: throw XiaomiAccountManagerConstructorFingerprint.exception
|
||||||
|
|
||||||
addInstruction(
|
|
||||||
isCertifiedIndex,
|
|
||||||
"const/4 p$isCertifiedRegister, 0x0",
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} ?: throw XiaomiAccountManagerConstructorFingerprint.exception
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,12 +3,14 @@ package app.revanced.patches.mifitness.misc.login.fingerprints
|
|||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
|
||||||
|
|
||||||
internal object XiaomiAccountManagerConstructorFingerprint : MethodFingerprint(
|
internal object XiaomiAccountManagerConstructorFingerprint : MethodFingerprint(
|
||||||
accessFlags = AccessFlags.PRIVATE or AccessFlags.CONSTRUCTOR,
|
accessFlags = AccessFlags.PRIVATE or AccessFlags.CONSTRUCTOR,
|
||||||
customFingerprint = { methodDef, _ ->
|
customFingerprint = { methodDef, _ ->
|
||||||
methodDef.definingClass == "Lcom/xiaomi/passport/accountmanager/XiaomiAccountManager;"
|
methodDef.definingClass == "Lcom/xiaomi/passport/accountmanager/XiaomiAccountManager;"
|
||||||
},
|
},
|
||||||
opcodes = listOf(Opcode.IF_NEZ),
|
parameters = listOf(
|
||||||
|
"Landroid/content/Context;",
|
||||||
|
"Z",
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import app.revanced.patches.music.misc.gms.Constants.REVANCED_MUSIC_PACKAGE_NAME
|
|||||||
import app.revanced.patches.music.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorGroupIdOption
|
import app.revanced.patches.music.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorGroupIdOption
|
||||||
import app.revanced.patches.music.misc.gms.fingerprints.*
|
import app.revanced.patches.music.misc.gms.fingerprints.*
|
||||||
import app.revanced.patches.music.misc.integrations.IntegrationsPatch
|
import app.revanced.patches.music.misc.integrations.IntegrationsPatch
|
||||||
import app.revanced.patches.music.misc.integrations.fingerprints.ApplicationInitFingerprint
|
|
||||||
import app.revanced.patches.shared.fingerprints.CastContextFetchFingerprint
|
import app.revanced.patches.shared.fingerprints.CastContextFetchFingerprint
|
||||||
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch
|
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch
|
||||||
|
|
||||||
@@ -21,7 +20,7 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
|||||||
CastDynamiteModuleV2Fingerprint,
|
CastDynamiteModuleV2Fingerprint,
|
||||||
CastContextFetchFingerprint,
|
CastContextFetchFingerprint,
|
||||||
),
|
),
|
||||||
mainActivityOnCreateFingerprint = ApplicationInitFingerprint,
|
mainActivityOnCreateFingerprint = MusicActivityOnCreateFingerprint,
|
||||||
integrationsPatchDependency = IntegrationsPatch::class,
|
integrationsPatchDependency = IntegrationsPatch::class,
|
||||||
gmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch,
|
gmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch,
|
||||||
compatiblePackages = setOf(CompatiblePackage("com.google.android.apps.youtube.music")),
|
compatiblePackages = setOf(CompatiblePackage("com.google.android.apps.youtube.music")),
|
||||||
@@ -34,5 +33,5 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
|||||||
PrimeMethodFingerprint,
|
PrimeMethodFingerprint,
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
override val gmsCoreVendor by gmsCoreVendorGroupIdOption
|
override val gmsCoreVendorGroupId by gmsCoreVendorGroupIdOption
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package app.revanced.patches.music.misc.gms.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
|
||||||
|
internal object MusicActivityOnCreateFingerprint : MethodFingerprint(
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf("Landroid/os/Bundle;"),
|
||||||
|
customFingerprint = { methodDef, classDef ->
|
||||||
|
methodDef.name == "onCreate" && classDef.type.endsWith("/MusicActivity;")
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -2,7 +2,7 @@ package app.revanced.patches.shared.misc.gms
|
|||||||
|
|
||||||
import app.revanced.patcher.PatchClass
|
import app.revanced.patcher.PatchClass
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
|
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
@@ -12,7 +12,7 @@ import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.AC
|
|||||||
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.AUTHORITIES
|
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.AUTHORITIES
|
||||||
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.PERMISSIONS
|
import app.revanced.patches.shared.misc.gms.BaseGmsCoreSupportPatch.Constants.PERMISSIONS
|
||||||
import app.revanced.patches.shared.misc.gms.fingerprints.GmsCoreSupportFingerprint
|
import app.revanced.patches.shared.misc.gms.fingerprints.GmsCoreSupportFingerprint
|
||||||
import app.revanced.patches.shared.misc.gms.fingerprints.GmsCoreSupportFingerprint.GET_GMS_CORE_VENDOR_METHOD_NAME
|
import app.revanced.patches.shared.misc.gms.fingerprints.GmsCoreSupportFingerprint.GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME
|
||||||
import app.revanced.util.exception
|
import app.revanced.util.exception
|
||||||
import app.revanced.util.getReference
|
import app.revanced.util.getReference
|
||||||
import app.revanced.util.returnEarly
|
import app.revanced.util.returnEarly
|
||||||
@@ -32,7 +32,7 @@ import com.android.tools.smali.dexlib2.util.MethodUtil
|
|||||||
* @param toPackageName The package name to fall back to if no custom package name is specified in patch options.
|
* @param toPackageName The package name to fall back to if no custom package name is specified in patch options.
|
||||||
* @param primeMethodFingerprint The fingerprint of the "prime" method that needs to be patched.
|
* @param primeMethodFingerprint The fingerprint of the "prime" method that needs to be patched.
|
||||||
* @param earlyReturnFingerprints The fingerprints of methods that need to be returned early.
|
* @param earlyReturnFingerprints The fingerprints of methods that need to be returned early.
|
||||||
* @param mainActivityOnCreateFingerprint The fingerprint of the main activity's onCreate method.
|
* @param mainActivityOnCreateFingerprint The fingerprint of the main activity onCreate method.
|
||||||
* @param integrationsPatchDependency The patch responsible for the integrations.
|
* @param integrationsPatchDependency The patch responsible for the integrations.
|
||||||
* @param gmsCoreSupportResourcePatch The corresponding resource patch that is used to patch the resources.
|
* @param gmsCoreSupportResourcePatch The corresponding resource patch that is used to patch the resources.
|
||||||
* @param dependencies Additional dependencies of this patch.
|
* @param dependencies Additional dependencies of this patch.
|
||||||
@@ -60,7 +60,10 @@ abstract class BaseGmsCoreSupportPatch(
|
|||||||
integrationsPatchDependency,
|
integrationsPatchDependency,
|
||||||
) + dependencies,
|
) + dependencies,
|
||||||
compatiblePackages = compatiblePackages,
|
compatiblePackages = compatiblePackages,
|
||||||
fingerprints = setOf(GmsCoreSupportFingerprint, mainActivityOnCreateFingerprint) + fingerprints,
|
fingerprints = setOf(
|
||||||
|
GmsCoreSupportFingerprint,
|
||||||
|
mainActivityOnCreateFingerprint,
|
||||||
|
) + fingerprints,
|
||||||
requiresIntegrations = true,
|
requiresIntegrations = true,
|
||||||
) {
|
) {
|
||||||
init {
|
init {
|
||||||
@@ -68,7 +71,7 @@ abstract class BaseGmsCoreSupportPatch(
|
|||||||
gmsCoreSupportResourcePatch.options.values.forEach(options::register)
|
gmsCoreSupportResourcePatch.options.values.forEach(options::register)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal abstract val gmsCoreVendor: String?
|
internal abstract val gmsCoreVendorGroupId: String?
|
||||||
|
|
||||||
override fun execute(context: BytecodeContext) {
|
override fun execute(context: BytecodeContext) {
|
||||||
val packageName = ChangePackageNamePatch.setOrGetFallbackPackageName(toPackageName)
|
val packageName = ChangePackageNamePatch.setOrGetFallbackPackageName(toPackageName)
|
||||||
@@ -93,16 +96,17 @@ abstract class BaseGmsCoreSupportPatch(
|
|||||||
// Return these methods early to prevent the app from crashing.
|
// Return these methods early to prevent the app from crashing.
|
||||||
earlyReturnFingerprints.toList().returnEarly()
|
earlyReturnFingerprints.toList().returnEarly()
|
||||||
|
|
||||||
// Check the availability of GmsCore.
|
// Verify GmsCore is installed and whitelisted for power optimizations and background usage.
|
||||||
mainActivityOnCreateFingerprint.result?.mutableMethod?.addInstruction(
|
mainActivityOnCreateFingerprint.result?.mutableMethod?.addInstructions(
|
||||||
1, // Hack to not disturb other patches (such as the integrations patch).
|
0,
|
||||||
"invoke-static {}, Lapp/revanced/integrations/shared/GmsCoreSupport;->checkAvailability()V",
|
"invoke-static/range { p0 .. p0 }, Lapp/revanced/integrations/shared/GmsCoreSupport;->" +
|
||||||
|
"checkGmsCore(Landroid/app/Activity;)V",
|
||||||
) ?: throw mainActivityOnCreateFingerprint.exception
|
) ?: throw mainActivityOnCreateFingerprint.exception
|
||||||
|
|
||||||
// Change the vendor of GmsCore in ReVanced Integrations.
|
// Change the vendor of GmsCore in ReVanced Integrations.
|
||||||
GmsCoreSupportFingerprint.result?.mutableClass?.methods
|
GmsCoreSupportFingerprint.result?.mutableClass?.methods
|
||||||
?.single { it.name == GET_GMS_CORE_VENDOR_METHOD_NAME }
|
?.single { it.name == GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME }
|
||||||
?.replaceInstruction(0, "const-string v0, \"$gmsCoreVendor\"")
|
?.replaceInstruction(0, "const-string v0, \"$gmsCoreVendorGroupId\"")
|
||||||
?: throw GmsCoreSupportFingerprint.exception
|
?: throw GmsCoreSupportFingerprint.exception
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,10 +150,10 @@ abstract class BaseGmsCoreSupportPatch(
|
|||||||
in PERMISSIONS,
|
in PERMISSIONS,
|
||||||
in ACTIONS,
|
in ACTIONS,
|
||||||
in AUTHORITIES,
|
in AUTHORITIES,
|
||||||
-> referencedString.replace("com.google", gmsCoreVendor!!)
|
-> referencedString.replace("com.google", gmsCoreVendorGroupId!!)
|
||||||
|
|
||||||
// No vendor prefix for whatever reason...
|
// No vendor prefix for whatever reason...
|
||||||
"subscribedfeeds" -> "$gmsCoreVendor.subscribedfeeds"
|
"subscribedfeeds" -> "$gmsCoreVendorGroupId.subscribedfeeds"
|
||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -162,7 +166,7 @@ abstract class BaseGmsCoreSupportPatch(
|
|||||||
if (str.startsWith(uriPrefix)) {
|
if (str.startsWith(uriPrefix)) {
|
||||||
return str.replace(
|
return str.replace(
|
||||||
uriPrefix,
|
uriPrefix,
|
||||||
"content://${authority.replace("com.google", gmsCoreVendor!!)}",
|
"content://${authority.replace("com.google", gmsCoreVendorGroupId!!)}",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -170,7 +174,7 @@ abstract class BaseGmsCoreSupportPatch(
|
|||||||
// gms also has a 'subscribedfeeds' authority, check for that one too
|
// gms also has a 'subscribedfeeds' authority, check for that one too
|
||||||
val subFeedsUriPrefix = "content://subscribedfeeds"
|
val subFeedsUriPrefix = "content://subscribedfeeds"
|
||||||
if (str.startsWith(subFeedsUriPrefix)) {
|
if (str.startsWith(subFeedsUriPrefix)) {
|
||||||
return str.replace(subFeedsUriPrefix, "content://$gmsCoreVendor.subscribedfeeds")
|
return str.replace(subFeedsUriPrefix, "content://$gmsCoreVendorGroupId.subscribedfeeds")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -121,7 +121,6 @@ abstract class BaseGmsCoreSupportResourcePatch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private companion object {
|
private companion object {
|
||||||
private const val VANCED_VENDOR = "com.mgoogle"
|
|
||||||
private const val PACKAGE_NAME_REGEX_PATTERN = "^[a-z]\\w*(\\.[a-z]\\w*)+\$"
|
private const val PACKAGE_NAME_REGEX_PATTERN = "^[a-z]\\w*(\\.[a-z]\\w*)+\$"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint
|
|||||||
internal object GmsCoreSupportFingerprint : MethodFingerprint(
|
internal object GmsCoreSupportFingerprint : MethodFingerprint(
|
||||||
customFingerprint = { _, classDef ->
|
customFingerprint = { _, classDef ->
|
||||||
classDef.type.endsWith("GmsCoreSupport;")
|
classDef.type.endsWith("GmsCoreSupport;")
|
||||||
}
|
},
|
||||||
) {
|
) {
|
||||||
const val GET_GMS_CORE_VENDOR_METHOD_NAME = "getGmsCoreVendor"
|
const val GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME = "getGmsCoreVendorGroupId"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,17 +1,16 @@
|
|||||||
package app.revanced.patches.strava.subscription
|
package app.revanced.patches.strava.subscription
|
||||||
|
|
||||||
import app.revanced.util.exception
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
import app.revanced.patches.strava.subscription.fingerprints.GetSubscribedFingerprint
|
import app.revanced.patches.strava.subscription.fingerprints.GetSubscribedFingerprint
|
||||||
|
import app.revanced.util.exception
|
||||||
|
|
||||||
@Patch(
|
@Patch(
|
||||||
name = "Unlock subscription features",
|
name = "Unlock subscription features",
|
||||||
description = "Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".",
|
description = "Unlocks \"Routes\", \"Matched Runs\" and \"Segment Efforts\".",
|
||||||
compatiblePackages = [CompatiblePackage("com.strava", ["320.12"])]
|
compatiblePackages = [CompatiblePackage("com.strava")],
|
||||||
)
|
)
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object UnlockSubscriptionPatch : BytecodePatch(setOf(GetSubscribedFingerprint)) {
|
object UnlockSubscriptionPatch : BytecodePatch(setOf(GetSubscribedFingerprint)) {
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
package app.revanced.patches.tumblr.annoyances.popups.fingerprints
|
package app.revanced.patches.tumblr.annoyances.popups.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
|
|
||||||
// This method is responsible for loading and displaying the visual Layout of the Gift Message Popup.
|
// This method is responsible for loading and displaying the visual Layout of the Gift Message Popup.
|
||||||
internal object ShowGiftMessagePopupFingerprint : MethodFingerprint(
|
internal object ShowGiftMessagePopupFingerprint : MethodFingerprint(
|
||||||
strings = listOf("activity", "anchorView"),
|
strings = listOf("activity", "anchorView", "textMessage"),
|
||||||
customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("GiftMessagePopup;") }
|
returnType = "V",
|
||||||
|
accessFlags = AccessFlags.FINAL or AccessFlags.PUBLIC
|
||||||
)
|
)
|
||||||
@@ -28,6 +28,9 @@ object OverrideFeatureFlagsPatch : BytecodePatch(
|
|||||||
internal lateinit var addOverride: (name: String, value: String) -> Unit private set
|
internal lateinit var addOverride: (name: String, value: String) -> Unit private set
|
||||||
|
|
||||||
override fun execute(context: BytecodeContext) = GetFeatureValueFingerprint.result?.let {
|
override fun execute(context: BytecodeContext) = GetFeatureValueFingerprint.result?.let {
|
||||||
|
val configurationClass = it.method.definingClass
|
||||||
|
val featureClass = it.method.parameterTypes[0].toString()
|
||||||
|
|
||||||
// The method we want to inject into does not have enough registers, so we inject a helper method
|
// The method we want to inject into does not have enough registers, so we inject a helper method
|
||||||
// and inject more instructions into it later, see addOverride.
|
// and inject more instructions into it later, see addOverride.
|
||||||
// This is not in an integration since the unused variable would get compiled away and the method would
|
// This is not in an integration since the unused variable would get compiled away and the method would
|
||||||
@@ -35,7 +38,7 @@ object OverrideFeatureFlagsPatch : BytecodePatch(
|
|||||||
val helperMethod = ImmutableMethod(
|
val helperMethod = ImmutableMethod(
|
||||||
it.method.definingClass,
|
it.method.definingClass,
|
||||||
"getValueOverride",
|
"getValueOverride",
|
||||||
listOf(ImmutableMethodParameter("Lcom/tumblr/configuration/Feature;", null, "feature")),
|
listOf(ImmutableMethodParameter(featureClass, null, "feature")),
|
||||||
"Ljava/lang/String;",
|
"Ljava/lang/String;",
|
||||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
null,
|
null,
|
||||||
@@ -50,7 +53,7 @@ object OverrideFeatureFlagsPatch : BytecodePatch(
|
|||||||
0,
|
0,
|
||||||
"""
|
"""
|
||||||
# toString() the enum value
|
# toString() the enum value
|
||||||
invoke-virtual {p1}, Lcom/tumblr/configuration/Feature;->toString()Ljava/lang/String;
|
invoke-virtual {p1}, $featureClass->toString()Ljava/lang/String;
|
||||||
move-result-object v0
|
move-result-object v0
|
||||||
|
|
||||||
# !!! If you add more instructions above this line, update helperInsertIndex below!
|
# !!! If you add more instructions above this line, update helperInsertIndex below!
|
||||||
@@ -75,7 +78,7 @@ object OverrideFeatureFlagsPatch : BytecodePatch(
|
|||||||
getFeatureIndex,
|
getFeatureIndex,
|
||||||
"""
|
"""
|
||||||
# Call the Helper Method with the Feature
|
# Call the Helper Method with the Feature
|
||||||
invoke-virtual {p0, p1}, Lcom/tumblr/configuration/Configuration;->getValueOverride(Lcom/tumblr/configuration/Feature;)Ljava/lang/String;
|
invoke-virtual {p0, p1}, $configurationClass->getValueOverride($featureClass)Ljava/lang/String;
|
||||||
move-result-object v0
|
move-result-object v0
|
||||||
# If it returned null, skip
|
# If it returned null, skip
|
||||||
if-eqz v0, :is_null
|
if-eqz v0, :is_null
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package app.revanced.patches.tumblr.featureflags.fingerprints
|
package app.revanced.patches.tumblr.featureflags.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
|
||||||
// This fingerprint targets the method to get the value of a Feature in the class "com.tumblr.configuration.Feature".
|
// This fingerprint targets the method to get the value of a Feature in the class "com.tumblr.configuration.Feature".
|
||||||
@@ -19,5 +21,7 @@ internal object GetFeatureValueFingerprint : MethodFingerprint(
|
|||||||
Opcode.INVOKE_STATIC,
|
Opcode.INVOKE_STATIC,
|
||||||
Opcode.MOVE_RESULT
|
Opcode.MOVE_RESULT
|
||||||
),
|
),
|
||||||
customFingerprint = { method, _ -> method.definingClass == "Lcom/tumblr/configuration/Configuration;" }
|
returnType = "Ljava/lang/String;",
|
||||||
|
parameters = listOf("L", "Z"),
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL
|
||||||
)
|
)
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
package app.revanced.patches.tumblr.fixes
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||||
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
|
import app.revanced.patches.tumblr.fixes.fingerprints.AddQueryParamFingerprint
|
||||||
|
import app.revanced.patches.tumblr.fixes.fingerprints.HttpPathParserFingerprint
|
||||||
|
import app.revanced.util.exception
|
||||||
|
|
||||||
|
@Patch(
|
||||||
|
name = "Fix old versions",
|
||||||
|
description = "Fixes old versions of the app (v33.2 and earlier) breaking due to Tumblr removing remnants of Tumblr" +
|
||||||
|
" Live from the API, which causes many requests to fail. This patch has no effect on newer versions of the app.",
|
||||||
|
compatiblePackages = [CompatiblePackage("com.tumblr")],
|
||||||
|
use = false,
|
||||||
|
)
|
||||||
|
@Suppress("unused")
|
||||||
|
object FixOldVersionsPatch : BytecodePatch(
|
||||||
|
setOf(HttpPathParserFingerprint, AddQueryParamFingerprint),
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext) {
|
||||||
|
val liveQueryParameters = listOf(
|
||||||
|
",?live_now",
|
||||||
|
",?live_streaming_user_id",
|
||||||
|
)
|
||||||
|
|
||||||
|
HttpPathParserFingerprint.result?.let {
|
||||||
|
val endIndex = it.scanResult.patternScanResult!!.endIndex
|
||||||
|
// Remove the live query parameters from the path when it's specified via a @METHOD annotation.
|
||||||
|
for (liveQueryParameter in liveQueryParameters) {
|
||||||
|
it.mutableMethod.addInstructions(
|
||||||
|
endIndex + 1,
|
||||||
|
"""
|
||||||
|
# urlPath = urlPath.replace(liveQueryParameter, "")
|
||||||
|
const-string p1, "$liveQueryParameter"
|
||||||
|
const-string p3, ""
|
||||||
|
invoke-virtual {p2, p1, p3}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;
|
||||||
|
move-result-object p2
|
||||||
|
""",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} ?: throw HttpPathParserFingerprint.exception
|
||||||
|
|
||||||
|
AddQueryParamFingerprint.result?.let {
|
||||||
|
// Remove the live query parameters when passed via a parameter which has the @Query annotation.
|
||||||
|
// e.g. an API call could be defined like this:
|
||||||
|
// @GET("api/me/info")
|
||||||
|
// ApiResponse getCurrentUserInfo(@Query("fields[blog]") String value)
|
||||||
|
// which would result in the path "api/me/inf0?fields[blog]=${value}"
|
||||||
|
// Here we make sure that this value doesn't contain the broken query parameters.
|
||||||
|
for (liveQueryParameter in liveQueryParameters) {
|
||||||
|
it.mutableMethod.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
# queryParameterValue = queryParameterValue.replace(liveQueryParameter, "")
|
||||||
|
const-string v0, "$liveQueryParameter"
|
||||||
|
const-string v1, ""
|
||||||
|
invoke-virtual {p2, v0, v1}, Ljava/lang/String;->replace(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Ljava/lang/String;
|
||||||
|
move-result-object p2
|
||||||
|
""",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} ?: throw AddQueryParamFingerprint.exception
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
package app.revanced.patches.tumblr.fixes.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
|
||||||
|
// Fingerprint for the addQueryParam method from retrofit2
|
||||||
|
// https://github.com/square/retrofit/blob/trunk/retrofit/src/main/java/retrofit2/RequestBuilder.java#L186
|
||||||
|
// Injecting here allows modifying dynamically set query parameters
|
||||||
|
internal object AddQueryParamFingerprint : MethodFingerprint(
|
||||||
|
strings = listOf("Malformed URL. Base: ", ", Relative: "),
|
||||||
|
parameters = listOf("Ljava/lang/String;", "Ljava/lang/String;", "Z"),
|
||||||
|
)
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package app.revanced.patches.tumblr.fixes.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
|
||||||
|
// Fingerprint for the parseHttpMethodAndPath method from retrofit2
|
||||||
|
// https://github.com/square/retrofit/blob/ebf87b10997e2136af4d335276fa950221852c64/retrofit/src/main/java/retrofit2/RequestFactory.java#L270-L302
|
||||||
|
// Injecting here allows modifying the path/query params of API endpoints defined via annotations
|
||||||
|
internal object HttpPathParserFingerprint : MethodFingerprint(
|
||||||
|
strings = listOf("Only one HTTP method is allowed. Found: %s and %s."),
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.IPUT_OBJECT,
|
||||||
|
Opcode.IPUT_BOOLEAN,
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -8,11 +8,11 @@ import app.revanced.patches.tumblr.featureflags.OverrideFeatureFlagsPatch
|
|||||||
import app.revanced.patches.tumblr.timelinefilter.TimelineFilterPatch
|
import app.revanced.patches.tumblr.timelinefilter.TimelineFilterPatch
|
||||||
|
|
||||||
@Patch(
|
@Patch(
|
||||||
name = "Disable Tumblr Live",
|
|
||||||
description = "Disable the Tumblr Live tab button and dashboard carousel.",
|
description = "Disable the Tumblr Live tab button and dashboard carousel.",
|
||||||
dependencies = [OverrideFeatureFlagsPatch::class, TimelineFilterPatch::class],
|
dependencies = [OverrideFeatureFlagsPatch::class, TimelineFilterPatch::class],
|
||||||
compatiblePackages = [CompatiblePackage("com.tumblr")],
|
compatiblePackages = [CompatiblePackage("com.tumblr")],
|
||||||
)
|
)
|
||||||
|
@Deprecated("Tumblr Live was removed and is no longer served in the feed, making this patch useless.")
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object DisableTumblrLivePatch : BytecodePatch(emptySet()) {
|
object DisableTumblrLivePatch : BytecodePatch(emptySet()) {
|
||||||
override fun execute(context: BytecodeContext) {
|
override fun execute(context: BytecodeContext) {
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package app.revanced.patches.twitter.misc.links
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||||
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
|
import app.revanced.patches.twitter.misc.links.fingerprints.SanitizeSharingLinksFingerprint
|
||||||
|
import app.revanced.util.exception
|
||||||
|
|
||||||
|
@Patch(
|
||||||
|
name = "Sanitize sharing links",
|
||||||
|
description = "Removes the tracking query parameters from links before they are shared.",
|
||||||
|
compatiblePackages = [CompatiblePackage("com.twitter.android")],
|
||||||
|
)
|
||||||
|
object SanitizeSharingLinksPatch : BytecodePatch(
|
||||||
|
setOf(SanitizeSharingLinksFingerprint),
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext) {
|
||||||
|
SanitizeSharingLinksFingerprint.result?.mutableMethod?.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
# Method takes in a link (string, param 0) and then appends the tracking query params,
|
||||||
|
# so all we need to do is return back the passed-in string
|
||||||
|
return-object p0
|
||||||
|
""",
|
||||||
|
) ?: throw SanitizeSharingLinksFingerprint.exception
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
package app.revanced.patches.twitter.misc.links.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
|
||||||
|
internal object SanitizeSharingLinksFingerprint : MethodFingerprint(
|
||||||
|
strings = listOf("<this>", "shareParam", "sessionToken"),
|
||||||
|
returnType = "Ljava/lang/String;",
|
||||||
|
)
|
||||||
@@ -1,73 +1,13 @@
|
|||||||
package app.revanced.patches.youtube.layout.hide.breakingnews
|
package app.revanced.patches.youtube.layout.hide.breakingnews
|
||||||
|
|
||||||
import app.revanced.util.exception
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
import app.revanced.patches.youtube.layout.hide.general.HideLayoutComponentsPatch
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
|
||||||
import app.revanced.patches.youtube.layout.hide.breakingnews.fingerprints.BreakingNewsFingerprint
|
|
||||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
|
||||||
|
|
||||||
@Patch(
|
@Deprecated("This patch has been merged to HideLayoutComponentsPatch.")
|
||||||
name = "Hide breaking news shelf",
|
|
||||||
description = "Adds an option to hide the breaking news shelf on the homepage tab.",
|
|
||||||
dependencies = [
|
|
||||||
IntegrationsPatch::class,
|
|
||||||
BreakingNewsResourcePatch::class
|
|
||||||
],
|
|
||||||
compatiblePackages = [
|
|
||||||
CompatiblePackage(
|
|
||||||
"com.google.android.youtube",
|
|
||||||
[
|
|
||||||
"18.32.39",
|
|
||||||
"18.37.36",
|
|
||||||
"18.38.44",
|
|
||||||
"18.43.45",
|
|
||||||
"18.44.41",
|
|
||||||
"18.45.43",
|
|
||||||
"18.48.39",
|
|
||||||
"18.49.37",
|
|
||||||
"19.01.34",
|
|
||||||
"19.02.39",
|
|
||||||
"19.03.36",
|
|
||||||
"19.04.38",
|
|
||||||
"19.05.36",
|
|
||||||
"19.06.39",
|
|
||||||
"19.07.40",
|
|
||||||
"19.08.36",
|
|
||||||
"19.09.37"
|
|
||||||
]
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
@Suppress("unused")
|
|
||||||
object BreakingNewsPatch : BytecodePatch(
|
object BreakingNewsPatch : BytecodePatch(
|
||||||
setOf(BreakingNewsFingerprint)
|
dependencies = setOf(HideLayoutComponentsPatch::class),
|
||||||
) {
|
) {
|
||||||
override fun execute(context: BytecodeContext) {
|
override fun execute(context: BytecodeContext) {
|
||||||
BreakingNewsFingerprint.result?.let {
|
|
||||||
val insertIndex = it.scanResult.patternScanResult!!.endIndex - 1
|
|
||||||
val moveResultIndex = insertIndex - 1
|
|
||||||
|
|
||||||
it.mutableMethod.apply {
|
|
||||||
val breakingNewsViewRegister =
|
|
||||||
getInstruction<OneRegisterInstruction>(moveResultIndex).registerA
|
|
||||||
|
|
||||||
addInstruction(
|
|
||||||
insertIndex,
|
|
||||||
"""
|
|
||||||
invoke-static {v$breakingNewsViewRegister},
|
|
||||||
Lapp/revanced/integrations/youtube/patches/HideBreakingNewsPatch;
|
|
||||||
->
|
|
||||||
hideBreakingNews(Landroid/view/View;)V
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
} ?: throw BreakingNewsFingerprint.exception
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
package app.revanced.patches.youtube.layout.hide.breakingnews
|
|
||||||
|
|
||||||
import app.revanced.patcher.data.ResourceContext
|
|
||||||
import app.revanced.patcher.patch.ResourcePatch
|
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
|
||||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
|
||||||
import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
|
|
||||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
|
||||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
|
||||||
|
|
||||||
@Patch(
|
|
||||||
dependencies = [
|
|
||||||
SettingsPatch::class,
|
|
||||||
ResourceMappingPatch::class,
|
|
||||||
AddResourcesPatch::class
|
|
||||||
],
|
|
||||||
)
|
|
||||||
internal object BreakingNewsResourcePatch : ResourcePatch() {
|
|
||||||
internal var horizontalCardListId: Long = -1
|
|
||||||
|
|
||||||
override fun execute(context: ResourceContext) {
|
|
||||||
AddResourcesPatch(this::class)
|
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.FEED.addPreferences(
|
|
||||||
SwitchPreference("revanced_hide_breaking_news")
|
|
||||||
)
|
|
||||||
|
|
||||||
horizontalCardListId = ResourceMappingPatch.resourceMappings.single {
|
|
||||||
it.type == "layout" && it.name == "horizontal_card_list"
|
|
||||||
}.id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package app.revanced.patches.youtube.layout.hide.breakingnews.fingerprints
|
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
|
||||||
import app.revanced.patches.youtube.layout.hide.breakingnews.BreakingNewsResourcePatch
|
|
||||||
import app.revanced.util.patch.LiteralValueFingerprint
|
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
|
||||||
|
|
||||||
internal object BreakingNewsFingerprint : LiteralValueFingerprint(
|
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
|
|
||||||
opcodes = listOf(
|
|
||||||
Opcode.CONST,
|
|
||||||
Opcode.CONST_4,
|
|
||||||
Opcode.INVOKE_VIRTUAL,
|
|
||||||
Opcode.MOVE_RESULT_OBJECT,
|
|
||||||
Opcode.CHECK_CAST,
|
|
||||||
Opcode.IPUT_OBJECT,
|
|
||||||
),
|
|
||||||
literalSupplier = { BreakingNewsResourcePatch.horizontalCardListId }
|
|
||||||
)
|
|
||||||
@@ -55,9 +55,10 @@ object CommentsPatch : ResourcePatch() {
|
|||||||
PreferenceScreen(
|
PreferenceScreen(
|
||||||
"revanced_comments_screen",
|
"revanced_comments_screen",
|
||||||
preferences = setOf(
|
preferences = setOf(
|
||||||
SwitchPreference("revanced_hide_comments_section"),
|
SwitchPreference("revanced_hide_preview_comment"),
|
||||||
SwitchPreference("revanced_hide_preview_comment")
|
SwitchPreference("revanced_hide_comments_section")
|
||||||
)
|
),
|
||||||
|
sorting = PreferenceScreen.Sorting.UNSORTED
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package app.revanced.patches.youtube.layout.hide.general
|
package app.revanced.patches.youtube.layout.hide.general
|
||||||
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||||
@@ -17,16 +18,17 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen
|
|||||||
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen.Sorting
|
import app.revanced.patches.shared.misc.settings.preference.PreferenceScreen.Sorting
|
||||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||||
import app.revanced.patches.shared.misc.settings.preference.TextPreference
|
import app.revanced.patches.shared.misc.settings.preference.TextPreference
|
||||||
|
import app.revanced.patches.youtube.layout.hide.general.fingerprints.HideShowMoreButtonFingerprint
|
||||||
import app.revanced.patches.youtube.layout.hide.general.fingerprints.ParseElementFromBufferFingerprint
|
import app.revanced.patches.youtube.layout.hide.general.fingerprints.ParseElementFromBufferFingerprint
|
||||||
import app.revanced.patches.youtube.layout.hide.general.fingerprints.PlayerOverlayFingerprint
|
import app.revanced.patches.youtube.layout.hide.general.fingerprints.PlayerOverlayFingerprint
|
||||||
import app.revanced.patches.youtube.layout.hide.general.fingerprints.ShowWatermarkFingerprint
|
import app.revanced.patches.youtube.layout.hide.general.fingerprints.ShowWatermarkFingerprint
|
||||||
import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch
|
import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch
|
||||||
import app.revanced.patches.youtube.misc.navigation.NavigationBarHookPatch
|
import app.revanced.patches.youtube.misc.navigation.NavigationBarHookPatch
|
||||||
import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch
|
|
||||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
import app.revanced.util.resultOrThrow
|
import app.revanced.util.resultOrThrow
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
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.instruction.TwoRegisterInstruction
|
||||||
|
|
||||||
@Patch(
|
@Patch(
|
||||||
@@ -36,8 +38,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
|||||||
LithoFilterPatch::class,
|
LithoFilterPatch::class,
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
AddResourcesPatch::class,
|
AddResourcesPatch::class,
|
||||||
|
HideLayoutComponentsResourcePatch::class,
|
||||||
NavigationBarHookPatch::class,
|
NavigationBarHookPatch::class,
|
||||||
PlayerTypeHookPatch::class // Used by Keyword Content filter.
|
|
||||||
],
|
],
|
||||||
compatiblePackages = [
|
compatiblePackages = [
|
||||||
CompatiblePackage(
|
CompatiblePackage(
|
||||||
@@ -66,7 +68,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
|||||||
)
|
)
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object HideLayoutComponentsPatch : BytecodePatch(
|
object HideLayoutComponentsPatch : BytecodePatch(
|
||||||
setOf(ParseElementFromBufferFingerprint, PlayerOverlayFingerprint),
|
setOf(ParseElementFromBufferFingerprint, PlayerOverlayFingerprint, HideShowMoreButtonFingerprint),
|
||||||
) {
|
) {
|
||||||
private const val LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR =
|
private const val LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR =
|
||||||
"Lapp/revanced/integrations/youtube/patches/components/LayoutComponentsFilter;"
|
"Lapp/revanced/integrations/youtube/patches/components/LayoutComponentsFilter;"
|
||||||
@@ -115,6 +117,7 @@ object HideLayoutComponentsPatch : BytecodePatch(
|
|||||||
SwitchPreference("revanced_hide_compact_banner"),
|
SwitchPreference("revanced_hide_compact_banner"),
|
||||||
SwitchPreference("revanced_hide_feed_survey"),
|
SwitchPreference("revanced_hide_feed_survey"),
|
||||||
SwitchPreference("revanced_hide_for_you_shelf"),
|
SwitchPreference("revanced_hide_for_you_shelf"),
|
||||||
|
SwitchPreference("revanced_hide_horizontal_shelves"),
|
||||||
SwitchPreference("revanced_hide_image_shelf"),
|
SwitchPreference("revanced_hide_image_shelf"),
|
||||||
SwitchPreference("revanced_hide_latest_posts_ads"),
|
SwitchPreference("revanced_hide_latest_posts_ads"),
|
||||||
SwitchPreference("revanced_hide_mix_playlists"),
|
SwitchPreference("revanced_hide_mix_playlists"),
|
||||||
@@ -122,9 +125,7 @@ object HideLayoutComponentsPatch : BytecodePatch(
|
|||||||
SwitchPreference("revanced_hide_notify_me_button"),
|
SwitchPreference("revanced_hide_notify_me_button"),
|
||||||
SwitchPreference("revanced_hide_search_result_recommendations"),
|
SwitchPreference("revanced_hide_search_result_recommendations"),
|
||||||
SwitchPreference("revanced_hide_search_result_shelf_header"),
|
SwitchPreference("revanced_hide_search_result_shelf_header"),
|
||||||
)
|
SwitchPreference("revanced_hide_show_more_button"),
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.FEED.addPreferences(
|
|
||||||
PreferenceScreen(
|
PreferenceScreen(
|
||||||
key = "revanced_hide_keyword_content_screen",
|
key = "revanced_hide_keyword_content_screen",
|
||||||
sorting = Sorting.UNSORTED,
|
sorting = Sorting.UNSORTED,
|
||||||
@@ -133,9 +134,9 @@ object HideLayoutComponentsPatch : BytecodePatch(
|
|||||||
SwitchPreference("revanced_hide_keyword_content_subscriptions"),
|
SwitchPreference("revanced_hide_keyword_content_subscriptions"),
|
||||||
SwitchPreference("revanced_hide_keyword_content_search"),
|
SwitchPreference("revanced_hide_keyword_content_search"),
|
||||||
TextPreference("revanced_hide_keyword_content_phrases", inputType = InputType.TEXT_MULTI_LINE),
|
TextPreference("revanced_hide_keyword_content_phrases", inputType = InputType.TEXT_MULTI_LINE),
|
||||||
NonInteractivePreference("revanced_hide_keyword_content_about")
|
NonInteractivePreference("revanced_hide_keyword_content_about"),
|
||||||
)
|
),
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.GENERAL_LAYOUT.addPreferences(
|
SettingsPatch.PreferenceScreen.GENERAL_LAYOUT.addPreferences(
|
||||||
@@ -203,5 +204,24 @@ object HideLayoutComponentsPatch : BytecodePatch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// endregion
|
// endregion
|
||||||
|
|
||||||
|
// region Show more button
|
||||||
|
|
||||||
|
HideShowMoreButtonFingerprint.resultOrThrow().let {
|
||||||
|
it.mutableMethod.apply {
|
||||||
|
val moveRegisterIndex = it.scanResult.patternScanResult!!.endIndex
|
||||||
|
val viewRegister =
|
||||||
|
getInstruction<OneRegisterInstruction>(moveRegisterIndex).registerA
|
||||||
|
|
||||||
|
val insertIndex = moveRegisterIndex + 1
|
||||||
|
addInstruction(
|
||||||
|
insertIndex,
|
||||||
|
"invoke-static { v$viewRegister }, " +
|
||||||
|
"$LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideShowMoreButton(Landroid/view/View;)V",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// endregion
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
package app.revanced.patches.youtube.layout.hide.loadmorebutton
|
package app.revanced.patches.youtube.layout.hide.general
|
||||||
|
|
||||||
import app.revanced.patcher.data.ResourceContext
|
import app.revanced.patcher.data.ResourceContext
|
||||||
import app.revanced.patcher.patch.ResourcePatch
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
@@ -15,16 +15,10 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
|||||||
AddResourcesPatch::class
|
AddResourcesPatch::class
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
internal object HideLoadMoreButtonResourcePatch : ResourcePatch() {
|
internal object HideLayoutComponentsResourcePatch : ResourcePatch() {
|
||||||
internal var expandButtonDownId: Long = -1
|
internal var expandButtonDownId: Long = -1
|
||||||
|
|
||||||
override fun execute(context: ResourceContext) {
|
override fun execute(context: ResourceContext) {
|
||||||
AddResourcesPatch(this::class)
|
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.FEED.addPreferences(
|
|
||||||
SwitchPreference("revanced_hide_load_more_button")
|
|
||||||
)
|
|
||||||
|
|
||||||
expandButtonDownId = ResourceMappingPatch.resourceMappings.single {
|
expandButtonDownId = ResourceMappingPatch.resourceMappings.single {
|
||||||
it.type == "layout" && it.name == "expand_button_down"
|
it.type == "layout" && it.name == "expand_button_down"
|
||||||
}.id
|
}.id
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
package app.revanced.patches.youtube.layout.hide.general.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patches.youtube.layout.hide.general.HideLayoutComponentsResourcePatch
|
||||||
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
|
||||||
|
internal object HideShowMoreButtonFingerprint : LiteralValueFingerprint(
|
||||||
|
opcodes = listOf(
|
||||||
|
Opcode.CONST,
|
||||||
|
Opcode.CONST_4,
|
||||||
|
Opcode.INVOKE_STATIC,
|
||||||
|
Opcode.MOVE_RESULT_OBJECT
|
||||||
|
),
|
||||||
|
literalSupplier = { HideLayoutComponentsResourcePatch.expandButtonDownId }
|
||||||
|
)
|
||||||
@@ -1,65 +1,12 @@
|
|||||||
package app.revanced.patches.youtube.layout.hide.loadmorebutton
|
package app.revanced.patches.youtube.layout.hide.loadmorebutton
|
||||||
|
|
||||||
import app.revanced.util.exception
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
import app.revanced.patches.youtube.layout.hide.general.HideLayoutComponentsPatch
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
|
||||||
import app.revanced.patches.youtube.layout.hide.loadmorebutton.fingerprints.HideLoadMoreButtonFingerprint
|
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
|
||||||
|
|
||||||
@Patch(
|
@Deprecated("This patch class has been merged into HideLayoutComponentsPatch.")
|
||||||
name = "Hide \'Load more\' button",
|
|
||||||
description = "Adds an option to hide the button under videos that loads similar videos.",
|
|
||||||
dependencies = [HideLoadMoreButtonResourcePatch::class],
|
|
||||||
compatiblePackages = [
|
|
||||||
CompatiblePackage(
|
|
||||||
"com.google.android.youtube",
|
|
||||||
[
|
|
||||||
"18.32.39",
|
|
||||||
"18.37.36",
|
|
||||||
"18.38.44",
|
|
||||||
"18.43.45",
|
|
||||||
"18.44.41",
|
|
||||||
"18.45.43",
|
|
||||||
"18.48.39",
|
|
||||||
"18.49.37",
|
|
||||||
"19.01.34",
|
|
||||||
"19.02.39",
|
|
||||||
"19.03.36",
|
|
||||||
"19.04.38",
|
|
||||||
"19.05.36",
|
|
||||||
"19.06.39",
|
|
||||||
"19.07.40",
|
|
||||||
"19.08.36",
|
|
||||||
"19.09.37"
|
|
||||||
]
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
@Suppress("unused")
|
|
||||||
object HideLoadMoreButtonPatch : BytecodePatch(
|
object HideLoadMoreButtonPatch : BytecodePatch(
|
||||||
setOf(HideLoadMoreButtonFingerprint)
|
dependencies = setOf(HideLayoutComponentsPatch::class)
|
||||||
) {
|
) {
|
||||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
override fun execute(context: BytecodeContext) {}
|
||||||
"Lapp/revanced/integrations/youtube/patches/HideLoadMoreButtonPatch;"
|
}
|
||||||
|
|
||||||
override fun execute(context: BytecodeContext) {
|
|
||||||
HideLoadMoreButtonFingerprint.result?.let {
|
|
||||||
it.mutableMethod.apply {
|
|
||||||
val moveRegisterIndex = it.scanResult.patternScanResult!!.endIndex
|
|
||||||
val viewRegister =
|
|
||||||
getInstruction<OneRegisterInstruction>(moveRegisterIndex).registerA
|
|
||||||
|
|
||||||
val insertIndex = moveRegisterIndex + 1
|
|
||||||
addInstruction(
|
|
||||||
insertIndex,
|
|
||||||
"invoke-static { v$viewRegister }, " +
|
|
||||||
"$INTEGRATIONS_CLASS_DESCRIPTOR->hideLoadMoreButton(Landroid/view/View;)V"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} ?: throw HideLoadMoreButtonFingerprint.exception
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
package app.revanced.patches.youtube.layout.hide.loadmorebutton.fingerprints
|
|
||||||
|
|
||||||
import app.revanced.patches.youtube.layout.hide.loadmorebutton.HideLoadMoreButtonResourcePatch
|
|
||||||
import app.revanced.util.patch.LiteralValueFingerprint
|
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
|
||||||
|
|
||||||
internal object HideLoadMoreButtonFingerprint : LiteralValueFingerprint(
|
|
||||||
opcodes = listOf(
|
|
||||||
Opcode.CONST,
|
|
||||||
Opcode.CONST_4,
|
|
||||||
Opcode.INVOKE_STATIC,
|
|
||||||
Opcode.MOVE_RESULT_OBJECT
|
|
||||||
),
|
|
||||||
literalSupplier = { HideLoadMoreButtonResourcePatch.expandButtonDownId }
|
|
||||||
)
|
|
||||||
@@ -46,7 +46,6 @@ import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
|||||||
)
|
)
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object HidePlayerFlyoutMenuPatch : ResourcePatch() {
|
object HidePlayerFlyoutMenuPatch : ResourcePatch() {
|
||||||
private const val KEY = "revanced_hide_player_flyout"
|
|
||||||
|
|
||||||
private const val FILTER_CLASS_DESCRIPTOR =
|
private const val FILTER_CLASS_DESCRIPTOR =
|
||||||
"Lapp/revanced/integrations/youtube/patches/components/PlayerFlyoutMenuItemsFilter;"
|
"Lapp/revanced/integrations/youtube/patches/components/PlayerFlyoutMenuItemsFilter;"
|
||||||
@@ -55,21 +54,22 @@ object HidePlayerFlyoutMenuPatch : ResourcePatch() {
|
|||||||
AddResourcesPatch(this::class)
|
AddResourcesPatch(this::class)
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.PLAYER.addPreferences(
|
SettingsPatch.PreferenceScreen.PLAYER.addPreferences(
|
||||||
PreferenceScreen(
|
PreferenceScreen(
|
||||||
key = KEY,
|
key = "revanced_hide_player_flyout",
|
||||||
preferences = setOf(
|
preferences = setOf(
|
||||||
SwitchPreference("${KEY}_captions"),
|
SwitchPreference("revanced_hide_player_flyout_captions"),
|
||||||
SwitchPreference("${KEY}_additional_settings"),
|
SwitchPreference("revanced_hide_player_flyout_additional_settings"),
|
||||||
SwitchPreference("${KEY}_loop_video"),
|
SwitchPreference("revanced_hide_player_flyout_loop_video"),
|
||||||
SwitchPreference("${KEY}_ambient_mode"),
|
SwitchPreference("revanced_hide_player_flyout_ambient_mode"),
|
||||||
SwitchPreference("${KEY}_report"),
|
SwitchPreference("revanced_hide_player_flyout_report"),
|
||||||
SwitchPreference("${KEY}_help"),
|
SwitchPreference("revanced_hide_player_flyout_help"),
|
||||||
SwitchPreference("${KEY}_speed"),
|
SwitchPreference("revanced_hide_player_flyout_speed"),
|
||||||
SwitchPreference("${KEY}_more_info"),
|
SwitchPreference("revanced_hide_player_flyout_lock_screen"),
|
||||||
SwitchPreference("${KEY}_audio_track"),
|
SwitchPreference("revanced_hide_player_flyout_more_info"),
|
||||||
SwitchPreference("${KEY}_watch_in_vr"),
|
SwitchPreference("revanced_hide_player_flyout_audio_track"),
|
||||||
),
|
SwitchPreference("revanced_hide_player_flyout_watch_in_vr"),
|
||||||
)
|
)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR)
|
LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR)
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ import app.revanced.patches.youtube.layout.hide.shorts.fingerprints.*
|
|||||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||||
import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch
|
import app.revanced.patches.youtube.misc.litho.filter.LithoFilterPatch
|
||||||
import app.revanced.patches.youtube.misc.navigation.NavigationBarHookPatch
|
import app.revanced.patches.youtube.misc.navigation.NavigationBarHookPatch
|
||||||
import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch
|
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
|
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.OneRegisterInstruction
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
||||||
@@ -28,8 +27,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction
|
|||||||
LithoFilterPatch::class,
|
LithoFilterPatch::class,
|
||||||
HideShortsComponentsResourcePatch::class,
|
HideShortsComponentsResourcePatch::class,
|
||||||
ResourceMappingPatch::class,
|
ResourceMappingPatch::class,
|
||||||
NavigationBarHookPatch::class,
|
NavigationBarHookPatch::class
|
||||||
PlayerTypeHookPatch::class
|
|
||||||
],
|
],
|
||||||
compatiblePackages = [
|
compatiblePackages = [
|
||||||
CompatiblePackage(
|
CompatiblePackage(
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.reques
|
|||||||
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback.OnSucceededFingerprint
|
import app.revanced.patches.youtube.layout.thumbnails.fingerprints.cronet.request.callback.OnSucceededFingerprint
|
||||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||||
import app.revanced.patches.youtube.misc.navigation.NavigationBarHookPatch
|
import app.revanced.patches.youtube.misc.navigation.NavigationBarHookPatch
|
||||||
import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch
|
|
||||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
import app.revanced.util.resultOrThrow
|
import app.revanced.util.resultOrThrow
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
@@ -40,8 +39,7 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod
|
|||||||
IntegrationsPatch::class,
|
IntegrationsPatch::class,
|
||||||
SettingsPatch::class,
|
SettingsPatch::class,
|
||||||
AddResourcesPatch::class,
|
AddResourcesPatch::class,
|
||||||
NavigationBarHookPatch::class,
|
NavigationBarHookPatch::class
|
||||||
PlayerTypeHookPatch::class
|
|
||||||
],
|
],
|
||||||
compatiblePackages = [
|
compatiblePackages = [
|
||||||
CompatiblePackage(
|
CompatiblePackage(
|
||||||
|
|||||||
@@ -2,16 +2,14 @@ package app.revanced.patches.youtube.misc.announcements
|
|||||||
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructions
|
||||||
import app.revanced.patcher.extensions.InstructionExtensions.getInstructions
|
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||||
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
import app.revanced.patches.shared.misc.settings.preference.SwitchPreference
|
||||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
import app.revanced.patches.youtube.shared.fingerprints.MainActivityFingerprint
|
import app.revanced.patches.youtube.shared.fingerprints.MainActivityOnCreateFingerprint
|
||||||
import app.revanced.util.exception
|
import app.revanced.util.resultOrThrow
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
|
||||||
|
|
||||||
@Patch(
|
@Patch(
|
||||||
name = "Announcements",
|
name = "Announcements",
|
||||||
@@ -21,7 +19,7 @@ import com.android.tools.smali.dexlib2.Opcode
|
|||||||
)
|
)
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object AnnouncementsPatch : BytecodePatch(
|
object AnnouncementsPatch : BytecodePatch(
|
||||||
setOf(MainActivityFingerprint)
|
setOf(MainActivityOnCreateFingerprint)
|
||||||
) {
|
) {
|
||||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||||
"Lapp/revanced/integrations/youtube/patches/announcements/AnnouncementsPatch;"
|
"Lapp/revanced/integrations/youtube/patches/announcements/AnnouncementsPatch;"
|
||||||
@@ -33,16 +31,11 @@ object AnnouncementsPatch : BytecodePatch(
|
|||||||
SwitchPreference("revanced_announcements")
|
SwitchPreference("revanced_announcements")
|
||||||
)
|
)
|
||||||
|
|
||||||
val onCreateMethod = MainActivityFingerprint.result?.let {
|
MainActivityOnCreateFingerprint.resultOrThrow().mutableMethod.addInstructions(
|
||||||
it.mutableClass.methods.find { method -> method.name == "onCreate" }
|
// Insert index must be great than the insert index used by GmsCoreSupport,
|
||||||
} ?: throw MainActivityFingerprint.exception
|
// as both patch the same method and GmsCore check should be first.
|
||||||
|
1,
|
||||||
val superCallIndex = onCreateMethod.getInstructions().indexOfFirst { it.opcode == Opcode.INVOKE_SUPER_RANGE }
|
"invoke-static/range { p0 .. p0 }, $INTEGRATIONS_CLASS_DESCRIPTOR->showAnnouncement(Landroid/app/Activity;)V"
|
||||||
|
|
||||||
onCreateMethod.addInstructions(
|
|
||||||
superCallIndex + 1,
|
|
||||||
"invoke-static { v1 }, $INTEGRATIONS_CLASS_DESCRIPTOR->showAnnouncement(Landroid/app/Activity;)V"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import app.revanced.patches.youtube.misc.gms.Constants.YOUTUBE_PACKAGE_NAME
|
|||||||
import app.revanced.patches.youtube.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorGroupIdOption
|
import app.revanced.patches.youtube.misc.gms.GmsCoreSupportResourcePatch.gmsCoreVendorGroupIdOption
|
||||||
import app.revanced.patches.youtube.misc.gms.fingerprints.*
|
import app.revanced.patches.youtube.misc.gms.fingerprints.*
|
||||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||||
import app.revanced.patches.youtube.shared.fingerprints.HomeActivityFingerprint
|
import app.revanced.patches.youtube.shared.fingerprints.MainActivityOnCreateFingerprint
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
||||||
@@ -23,7 +23,7 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
|||||||
CastDynamiteModuleV2Fingerprint,
|
CastDynamiteModuleV2Fingerprint,
|
||||||
CastContextFetchFingerprint,
|
CastContextFetchFingerprint,
|
||||||
),
|
),
|
||||||
mainActivityOnCreateFingerprint = HomeActivityFingerprint,
|
mainActivityOnCreateFingerprint = MainActivityOnCreateFingerprint,
|
||||||
integrationsPatchDependency = IntegrationsPatch::class,
|
integrationsPatchDependency = IntegrationsPatch::class,
|
||||||
dependencies = setOf(
|
dependencies = setOf(
|
||||||
HideCastButtonPatch::class,
|
HideCastButtonPatch::class,
|
||||||
@@ -57,5 +57,5 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch(
|
|||||||
PrimeMethodFingerprint,
|
PrimeMethodFingerprint,
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
override val gmsCoreVendor by gmsCoreVendorGroupIdOption
|
override val gmsCoreVendorGroupId by gmsCoreVendorGroupIdOption
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import app.revanced.patcher.patch.annotation.Patch
|
|||||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
||||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||||
import app.revanced.patches.youtube.misc.navigation.fingerprints.*
|
import app.revanced.patches.youtube.misc.navigation.fingerprints.*
|
||||||
|
import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch
|
||||||
import app.revanced.util.getReference
|
import app.revanced.util.getReference
|
||||||
import app.revanced.util.indexOfFirstInstruction
|
import app.revanced.util.indexOfFirstInstruction
|
||||||
import app.revanced.util.resultOrThrow
|
import app.revanced.util.resultOrThrow
|
||||||
@@ -25,6 +26,7 @@ import com.android.tools.smali.dexlib2.util.MethodUtil
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
IntegrationsPatch::class,
|
IntegrationsPatch::class,
|
||||||
NavigationBarHookResourcePatch::class,
|
NavigationBarHookResourcePatch::class,
|
||||||
|
PlayerTypeHookPatch::class // Required to detect the search bar in all situations.
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
@@ -34,7 +36,9 @@ object NavigationBarHookPatch : BytecodePatch(
|
|||||||
NavigationEnumFingerprint,
|
NavigationEnumFingerprint,
|
||||||
PivotBarButtonsCreateDrawableViewFingerprint,
|
PivotBarButtonsCreateDrawableViewFingerprint,
|
||||||
PivotBarButtonsCreateResourceViewFingerprint,
|
PivotBarButtonsCreateResourceViewFingerprint,
|
||||||
|
PivotBarButtonsViewSetSelectedFingerprint,
|
||||||
NavigationBarHookCallbackFingerprint,
|
NavigationBarHookCallbackFingerprint,
|
||||||
|
MainActivityOnBackPressedFingerprint,
|
||||||
ActionBarSearchResultsFingerprint,
|
ActionBarSearchResultsFingerprint,
|
||||||
),
|
),
|
||||||
) {
|
) {
|
||||||
@@ -88,6 +92,29 @@ object NavigationBarHookPatch : BytecodePatch(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PivotBarButtonsViewSetSelectedFingerprint.resultOrThrow().mutableMethod.apply {
|
||||||
|
val index = PivotBarButtonsViewSetSelectedFingerprint.indexOfSetViewSelectedInstruction(this)
|
||||||
|
val instruction = getInstruction<FiveRegisterInstruction>(index)
|
||||||
|
val viewRegister = instruction.registerC
|
||||||
|
val isSelectedRegister = instruction.registerD
|
||||||
|
|
||||||
|
addInstruction(
|
||||||
|
index + 1,
|
||||||
|
"invoke-static { v$viewRegister, v$isSelectedRegister }, " +
|
||||||
|
"$INTEGRATIONS_CLASS_DESCRIPTOR->navigationTabSelected(Landroid/view/View;Z)V",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hook onto back button pressed. Needed to fix race problem with
|
||||||
|
// litho filtering based on navigation tab before the tab is updated.
|
||||||
|
MainActivityOnBackPressedFingerprint.resultOrThrow().mutableMethod.apply {
|
||||||
|
addInstruction(
|
||||||
|
0,
|
||||||
|
"invoke-static { p0 }, " +
|
||||||
|
"$INTEGRATIONS_CLASS_DESCRIPTOR->onBackPressed(Landroid/app/Activity;)V",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// Hook the search bar.
|
// Hook the search bar.
|
||||||
|
|
||||||
// Two different layouts are used at the hooked code.
|
// Two different layouts are used at the hooked code.
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.navigation.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
internal object MainActivityOnBackPressedFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf(),
|
||||||
|
customFingerprint = { methodDef, _ ->
|
||||||
|
(methodDef.definingClass.endsWith("MainActivity;") ||
|
||||||
|
// Old versions of YouTube called this class "WatchWhileActivity" instead.
|
||||||
|
methodDef.definingClass.endsWith("WatchWhileActivity;"))
|
||||||
|
&& methodDef.name == "onBackPressed"
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.navigation.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.navigation.fingerprints.PivotBarButtonsViewSetSelectedFingerprint.indexOfSetViewSelectedInstruction
|
||||||
|
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.Method
|
||||||
|
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
|
|
||||||
|
internal object PivotBarButtonsViewSetSelectedFingerprint : MethodFingerprint(
|
||||||
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
|
parameters = listOf("I", "Z"),
|
||||||
|
returnType = "V",
|
||||||
|
customFingerprint = { methodDef, classDef ->
|
||||||
|
classDef.type == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" &&
|
||||||
|
indexOfSetViewSelectedInstruction(methodDef) >= 0
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
fun indexOfSetViewSelectedInstruction(methodDef: Method) =
|
||||||
|
methodDef.indexOfFirstInstruction {
|
||||||
|
opcode == Opcode.INVOKE_VIRTUAL && getReference<MethodReference>()?.name == "setSelected"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
package app.revanced.patches.youtube.shared.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
|
||||||
|
internal object MainActivityOnCreateFingerprint : MethodFingerprint(
|
||||||
|
returnType = "V",
|
||||||
|
parameters = listOf("Landroid/os/Bundle;"),
|
||||||
|
customFingerprint = { methodDef, classDef ->
|
||||||
|
methodDef.name == "onCreate" &&
|
||||||
|
(classDef.type.endsWith("MainActivity;")
|
||||||
|
// Old versions of YouTube called this class "WatchWhileActivity" instead.
|
||||||
|
|| classDef.type.endsWith("WatchWhileActivity;"))
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -1,3 +1,31 @@
|
|||||||
|
<!--
|
||||||
|
|
||||||
|
# General guidelines and information for translating
|
||||||
|
|
||||||
|
## Strings parameters can be reordered to allow more flexible translations if the grammar should be changed.
|
||||||
|
|
||||||
|
For example, the patches string:
|
||||||
|
<string name="revanced_patches_string">You will arrive at %1$s in %2$s hours from now</string>
|
||||||
|
Could be translated to another language using a rearranged grammar:
|
||||||
|
<string name="revanced_patches_string">You will arrive %2$s hours from now at %1$s</string>
|
||||||
|
|
||||||
|
For Manager strings:
|
||||||
|
You will arrive at ${destination} in ${count} hours from now
|
||||||
|
Could be rearranged by changing the order of the ${} parameters:
|
||||||
|
You will arrive ${count} hours from now at ${destination}
|
||||||
|
|
||||||
|
Reordering is particularly relevant when translating into right to left languages, or for any language with grammar that is noticeably different from English.
|
||||||
|
|
||||||
|
## Single and double quotation marks must be escaped for patch strings (Manager does not require escaping any quotes).
|
||||||
|
|
||||||
|
All _patches_ single and double quotation marks must be escaped as \" or \'
|
||||||
|
Forgetting to do this will cause that string to appear in app with no quotation characters.
|
||||||
|
|
||||||
|
Correct:
|
||||||
|
<string name="revanced_string">You\'re correct. This is the \"correct\" way and this text will appear as expected in the app</string>
|
||||||
|
Not correct:
|
||||||
|
<string name="revanced_string">You're not correct. This is not the "correct" way and this text will not appear as expected the in app</string>
|
||||||
|
-->
|
||||||
<resources>
|
<resources>
|
||||||
<app id="shared">
|
<app id="shared">
|
||||||
<patch id="misc.settings.BaseSettingsResourcePatch">
|
<patch id="misc.settings.BaseSettingsResourcePatch">
|
||||||
@@ -13,8 +41,13 @@
|
|||||||
<string name="revanced_settings_import_failure_parse">Import failed: %s</string>
|
<string name="revanced_settings_import_failure_parse">Import failed: %s</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="misc.gms.BaseGmsCoreSupportResourcePatch">
|
<patch id="misc.gms.BaseGmsCoreSupportResourcePatch">
|
||||||
<string name="gms_core_not_installed_warning">GmsCore is not installed. Please install.</string>
|
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||||
<string name="gms_core_not_running_warning">GmsCore is failing to run. Please follow the \"Don\'t kill my app\" guide for GmsCore.</string>
|
<string name="gms_core_toast_not_installed_message">MicroG GmsCore is not installed. Install it.</string>
|
||||||
|
<string name="gms_core_dialog_title">Action needed</string>
|
||||||
|
<string name="gms_core_dialog_not_whitelisted_not_allowed_in_background_message">MicroG GmsCore does not have permission to run in the background.\n\nFollow the \"Don\'t kill my app\" guide for your phone, and apply the instructions to your MicroG installation.\n\nThis is required for the app to work.</string>
|
||||||
|
<string name="gms_core_dialog_open_website_text">Open website</string>
|
||||||
|
<string name="gms_core_dialog_not_whitelisted_using_battery_optimizations_message">MicroG GmsCore battery optimizations must be disabled to prevent issues.\n\nTap on the continue button and disable battery optimizations.</string>
|
||||||
|
<string name="gms_core_dialog_continue_text">Continue</string>
|
||||||
</patch>
|
</patch>
|
||||||
</app>
|
</app>
|
||||||
<app id="youtube">
|
<app id="youtube">
|
||||||
@@ -56,24 +89,38 @@
|
|||||||
<string name="revanced_hide_gray_separator_title">Hide gray separator</string>
|
<string name="revanced_hide_gray_separator_title">Hide gray separator</string>
|
||||||
<string name="revanced_hide_gray_separator_summary_on">Gray separators are hidden</string>
|
<string name="revanced_hide_gray_separator_summary_on">Gray separators are hidden</string>
|
||||||
<string name="revanced_hide_gray_separator_summary_off">Gray separators are shown</string>
|
<string name="revanced_hide_gray_separator_summary_off">Gray separators are shown</string>
|
||||||
<string name="revanced_hide_join_membership_button_title">Hide \'Join\' button</string>
|
|
||||||
<string name="revanced_hide_join_membership_button_summary_on">Button is hidden</string>
|
|
||||||
<string name="revanced_hide_join_membership_button_summary_off">Button is shown</string>
|
|
||||||
<string name="revanced_hide_channel_watermark_title">Hide channel watermark</string>
|
<string name="revanced_hide_channel_watermark_title">Hide channel watermark</string>
|
||||||
<string name="revanced_hide_channel_watermark_summary_on">Watermark is hidden</string>
|
<string name="revanced_hide_channel_watermark_summary_on">Watermark is hidden</string>
|
||||||
<string name="revanced_hide_channel_watermark_summary_off">Watermark is shown</string>
|
<string name="revanced_hide_channel_watermark_summary_off">Watermark is shown</string>
|
||||||
|
<string name="revanced_hide_horizontal_shelves_title">Hide horizontal shelves</string>
|
||||||
|
<string name="revanced_hide_horizontal_shelves_summary_on">Shelves are hidden such as:\n• Breaking news\n• Continue watching\n• Explore more channels\n• Shopping\n• Watch it Again</string>
|
||||||
|
<string name="revanced_hide_horizontal_shelves_summary_off">Shelves are shown</string>
|
||||||
|
<!-- 'Join' should be translated using the same localized wording YouTube displays.
|
||||||
|
This appears in the video player for certain videos. -->
|
||||||
|
<string name="revanced_hide_join_membership_button_title">Hide \'Join\' button</string>
|
||||||
|
<string name="revanced_hide_join_membership_button_summary_on">Button is hidden</string>
|
||||||
|
<string name="revanced_hide_join_membership_button_summary_off">Button is shown</string>
|
||||||
|
<!-- 'For you' should be translated using the same localized wording YouTube displays. -->
|
||||||
<string name="revanced_hide_for_you_shelf_title">Hide \'For you\' shelf in channel page</string>
|
<string name="revanced_hide_for_you_shelf_title">Hide \'For you\' shelf in channel page</string>
|
||||||
<string name="revanced_hide_for_you_shelf_summary_on">Shelf is hidden</string>
|
<string name="revanced_hide_for_you_shelf_summary_on">Shelf is hidden</string>
|
||||||
<string name="revanced_hide_for_you_shelf_summary_off">Shelf is shown</string>
|
<string name="revanced_hide_for_you_shelf_summary_off">Shelf is shown</string>
|
||||||
|
<!-- 'Notify me' should be translated using the same localized wording YouTube displays.
|
||||||
|
This item appear in the subscription feed for future livestreams or unreleased videos. -->
|
||||||
<string name="revanced_hide_notify_me_button_title">Hide \'Notify me\' button</string>
|
<string name="revanced_hide_notify_me_button_title">Hide \'Notify me\' button</string>
|
||||||
<string name="revanced_hide_notify_me_button_summary_on">Button is hidden</string>
|
<string name="revanced_hide_notify_me_button_summary_on">Button is hidden</string>
|
||||||
<string name="revanced_hide_notify_me_button_summary_off">Button is shown</string>
|
<string name="revanced_hide_notify_me_button_summary_off">Button is shown</string>
|
||||||
<string name="revanced_hide_timed_reactions_title">Hide timed reactions</string>
|
<!-- 'People also watch' should be translated using the same localized wording YouTube displays. -->
|
||||||
<string name="revanced_hide_timed_reactions_summary_on">Timed reactions are hidden</string>
|
|
||||||
<string name="revanced_hide_timed_reactions_summary_off">Timed reactions are shown</string>
|
|
||||||
<string name="revanced_hide_search_result_recommendations_title">Hide \'People also watched\' recommendations</string>
|
<string name="revanced_hide_search_result_recommendations_title">Hide \'People also watched\' recommendations</string>
|
||||||
<string name="revanced_hide_search_result_recommendations_summary_on">Recommendations are hidden</string>
|
<string name="revanced_hide_search_result_recommendations_summary_on">Recommendations are hidden</string>
|
||||||
<string name="revanced_hide_search_result_recommendations_summary_off">Recommendations are shown</string>
|
<string name="revanced_hide_search_result_recommendations_summary_off">Recommendations are shown</string>
|
||||||
|
<!-- 'Show more' should be translated with the same localized wording that YouTube displays.
|
||||||
|
This button usually appears when searching for a YT creator. -->
|
||||||
|
<string name="revanced_hide_show_more_button_title">Hide \'Show more\' button</string>
|
||||||
|
<string name="revanced_hide_show_more_button_summary_on">Button is hidden</string>
|
||||||
|
<string name="revanced_hide_show_more_button_summary_off">Button is shown</string>
|
||||||
|
<string name="revanced_hide_timed_reactions_title">Hide timed reactions</string>
|
||||||
|
<string name="revanced_hide_timed_reactions_summary_on">Timed reactions are hidden</string>
|
||||||
|
<string name="revanced_hide_timed_reactions_summary_off">Timed reactions are shown</string>
|
||||||
<string name="revanced_hide_search_result_shelf_header_title">Hide search result shelf header</string>
|
<string name="revanced_hide_search_result_shelf_header_title">Hide search result shelf header</string>
|
||||||
<string name="revanced_hide_search_result_shelf_header_summary_on">Shelf header is hidden</string>
|
<string name="revanced_hide_search_result_shelf_header_summary_on">Shelf header is hidden</string>
|
||||||
<string name="revanced_hide_search_result_shelf_header_summary_off">Shelf header is shown</string>
|
<string name="revanced_hide_search_result_shelf_header_summary_off">Shelf header is shown</string>
|
||||||
@@ -166,6 +213,7 @@
|
|||||||
<string name="revanced_custom_filter_summary_on">Custom filter is enabled</string>
|
<string name="revanced_custom_filter_summary_on">Custom filter is enabled</string>
|
||||||
<string name="revanced_custom_filter_summary_off">Custom filter is disabled</string>
|
<string name="revanced_custom_filter_summary_off">Custom filter is disabled</string>
|
||||||
<string name="revanced_custom_filter_strings_title">Custom filter</string>
|
<string name="revanced_custom_filter_strings_title">Custom filter</string>
|
||||||
|
<!-- 'Component path builder strings' is the technical name for identifying the Litho UI layout items to hide. This is an advanced feature and most users will never use this. -->
|
||||||
<string name="revanced_custom_filter_strings_summary">List of component path builder strings to filter separated by new line</string>
|
<string name="revanced_custom_filter_strings_summary">List of component path builder strings to filter separated by new line</string>
|
||||||
<string name="revanced_custom_filter_toast_invalid_syntax">Invalid custom filter: %s</string>
|
<string name="revanced_custom_filter_toast_invalid_syntax">Invalid custom filter: %s</string>
|
||||||
<string name="revanced_hide_keyword_content_screen_title">Hide keyword content</string>
|
<string name="revanced_hide_keyword_content_screen_title">Hide keyword content</string>
|
||||||
@@ -180,11 +228,13 @@
|
|||||||
<string name="revanced_hide_keyword_content_search_summary_on">Search results are filtered by keywords</string>
|
<string name="revanced_hide_keyword_content_search_summary_on">Search results are filtered by keywords</string>
|
||||||
<string name="revanced_hide_keyword_content_search_summary_off">Search results are not filtered by keywords</string>
|
<string name="revanced_hide_keyword_content_search_summary_off">Search results are not filtered by keywords</string>
|
||||||
<string name="revanced_hide_keyword_content_phrases_title">Keywords to hide</string>
|
<string name="revanced_hide_keyword_content_phrases_title">Keywords to hide</string>
|
||||||
|
<!-- For localization it is preferred, but not required, if 'LeBlanc' is replaced with a localized name or a familiar word that has upper case letters in the middle of the word.
|
||||||
|
This is because keywords can be in any language, and showing an example in the localized script helps convey this. -->
|
||||||
<string name="revanced_hide_keyword_content_phrases_summary">Keywords and phrases to hide, separated by new lines\n\nWords with uppercase letters in the middle must be entered with the casing (ie: iPhone, TikTok, LeBlanc)</string>
|
<string name="revanced_hide_keyword_content_phrases_summary">Keywords and phrases to hide, separated by new lines\n\nWords with uppercase letters in the middle must be entered with the casing (ie: iPhone, TikTok, LeBlanc)</string>
|
||||||
<string name="revanced_hide_keyword_content_about_title">About keyword filtering</string>
|
<string name="revanced_hide_keyword_content_about_title">About keyword filtering</string>
|
||||||
<string name="revanced_hide_keyword_content_about_summary">Home/Subscription/Search results are filtered to hide content that matches keyword phrases\n\nLimitations\n• Some Shorts may not be hidden\n• Some UI components may not be hidden\n• Searching for a keyword may show no results</string>
|
<string name="revanced_hide_keyword_content_about_summary">Home/Subscription/Search results are filtered to hide content that matches keyword phrases\n\nLimitations\n• Some Shorts may not be hidden\n• Some UI components may not be hidden\n• Searching for a keyword may show no results</string>
|
||||||
<string name="revanced_hide_keyword_toast_invalid_common" formatted="false">Invalid keyword. Cannot use: \'%s\' as a filter</string>
|
<string name="revanced_hide_keyword_toast_invalid_common">Invalid keyword. Cannot use: \'%s\' as a filter</string>
|
||||||
<string name="revanced_hide_keyword_toast_invalid_length" formatted="false">Invalid keyword. \'%s\' is less than %s characters</string>
|
<string name="revanced_hide_keyword_toast_invalid_length">Invalid keyword. \'%1$s\' is less than %2$d characters</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="ad.general.HideAdsResourcePatch">
|
<patch id="ad.general.HideAdsResourcePatch">
|
||||||
<string name="revanced_hide_general_ads_title">Hide general ads</string>
|
<string name="revanced_hide_general_ads_title">Hide general ads</string>
|
||||||
@@ -193,7 +243,7 @@
|
|||||||
<string name="revanced_hide_fullscreen_ads_title">Hide fullscreen ads</string>
|
<string name="revanced_hide_fullscreen_ads_title">Hide fullscreen ads</string>
|
||||||
<string name="revanced_hide_fullscreen_ads_summary_on">Fullscreen ads are hidden</string>
|
<string name="revanced_hide_fullscreen_ads_summary_on">Fullscreen ads are hidden</string>
|
||||||
<string name="revanced_hide_fullscreen_ads_summary_off">Fullscreen ads are shown</string>
|
<string name="revanced_hide_fullscreen_ads_summary_off">Fullscreen ads are shown</string>
|
||||||
<string name="revanced_hide_buttoned_ads_title">Hide buttoned ad</string>
|
<string name="revanced_hide_buttoned_ads_title">Hide buttoned ads</string>
|
||||||
<string name="revanced_hide_buttoned_ads_summary_on">Buttoned ads are hidden</string>
|
<string name="revanced_hide_buttoned_ads_summary_on">Buttoned ads are hidden</string>
|
||||||
<string name="revanced_hide_buttoned_ads_summary_off">Buttoned ads are shown</string>
|
<string name="revanced_hide_buttoned_ads_summary_off">Buttoned ads are shown</string>
|
||||||
<string name="revanced_hide_paid_content_ads_title">Hide paid content</string>
|
<string name="revanced_hide_paid_content_ads_title">Hide paid content</string>
|
||||||
@@ -214,7 +264,7 @@
|
|||||||
<string name="revanced_hide_merchandise_banners_title">Hide merchandise banners</string>
|
<string name="revanced_hide_merchandise_banners_title">Hide merchandise banners</string>
|
||||||
<string name="revanced_hide_merchandise_banners_summary_on">Merchandise banners are hidden</string>
|
<string name="revanced_hide_merchandise_banners_summary_on">Merchandise banners are hidden</string>
|
||||||
<string name="revanced_hide_merchandise_banners_summary_off">Merchandise banners are shown</string>
|
<string name="revanced_hide_merchandise_banners_summary_off">Merchandise banners are shown</string>
|
||||||
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Failed to hide full-screen ad. Disabling to prevent issues</string>
|
<string name="revanced_hide_fullscreen_ads_feature_not_available_toast">Could not hide fullscreen ad. Hide setting disabled to prevent issues.</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="ad.getpremium.HideGetPremiumPatch">
|
<patch id="ad.getpremium.HideGetPremiumPatch">
|
||||||
<string name="revanced_hide_get_premium_title">Hide YouTube Premium promotions</string>
|
<string name="revanced_hide_get_premium_title">Hide YouTube Premium promotions</string>
|
||||||
@@ -248,6 +298,7 @@
|
|||||||
<string name="revanced_external_downloader_title">Show external download button</string>
|
<string name="revanced_external_downloader_title">Show external download button</string>
|
||||||
<string name="revanced_external_downloader_summary_on">Download button shown in player</string>
|
<string name="revanced_external_downloader_summary_on">Download button shown in player</string>
|
||||||
<string name="revanced_external_downloader_summary_off">Download button not shown in player</string>
|
<string name="revanced_external_downloader_summary_off">Download button not shown in player</string>
|
||||||
|
<!-- 'download action button' should be translated using the same wording as the translation of 'revanced_hide_download_button_title' -->
|
||||||
<string name="revanced_external_downloader_action_button_title">Override download action button</string>
|
<string name="revanced_external_downloader_action_button_title">Override download action button</string>
|
||||||
<string name="revanced_external_downloader_action_button_summary_on">Download button opens your external downloader</string>
|
<string name="revanced_external_downloader_action_button_summary_on">Download button opens your external downloader</string>
|
||||||
<string name="revanced_external_downloader_action_button_summary_off">Download button opens the native in-app downloader</string>
|
<string name="revanced_external_downloader_action_button_summary_off">Download button opens the native in-app downloader</string>
|
||||||
@@ -301,27 +352,37 @@
|
|||||||
<string name="revanced_hide_like_dislike_button_title">Hide Like and Dislike</string>
|
<string name="revanced_hide_like_dislike_button_title">Hide Like and Dislike</string>
|
||||||
<string name="revanced_hide_like_dislike_button_summary_on">Like and Dislike buttons are hidden</string>
|
<string name="revanced_hide_like_dislike_button_summary_on">Like and Dislike buttons are hidden</string>
|
||||||
<string name="revanced_hide_like_dislike_button_summary_off">Like and Dislike buttons are shown</string>
|
<string name="revanced_hide_like_dislike_button_summary_off">Like and Dislike buttons are shown</string>
|
||||||
|
<!-- 'Share' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_share_button_title">Hide Share</string>
|
<string name="revanced_hide_share_button_title">Hide Share</string>
|
||||||
<string name="revanced_hide_share_button_summary_on">Share button is hidden</string>
|
<string name="revanced_hide_share_button_summary_on">Share button is hidden</string>
|
||||||
<string name="revanced_hide_share_button_summary_off">Share button is shown</string>
|
<string name="revanced_hide_share_button_summary_off">Share button is shown</string>
|
||||||
|
<!-- 'Report' should be translated with the same localized wording that YouTube displays.
|
||||||
|
This button usually appears only on live streams. -->
|
||||||
<string name="revanced_hide_report_button_title">Hide Report</string>
|
<string name="revanced_hide_report_button_title">Hide Report</string>
|
||||||
<string name="revanced_hide_report_button_summary_on">Report button is hidden</string>
|
<string name="revanced_hide_report_button_summary_on">Report button is hidden</string>
|
||||||
<string name="revanced_hide_report_button_summary_off">Report button is shown</string>
|
<string name="revanced_hide_report_button_summary_off">Report button is shown</string>
|
||||||
|
<!-- 'Remix' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_remix_button_title">Hide Remix</string>
|
<string name="revanced_hide_remix_button_title">Hide Remix</string>
|
||||||
<string name="revanced_hide_remix_button_summary_on">Remix button is hidden</string>
|
<string name="revanced_hide_remix_button_summary_on">Remix button is hidden</string>
|
||||||
<string name="revanced_hide_remix_button_summary_off">Remix button is shown</string>
|
<string name="revanced_hide_remix_button_summary_off">Remix button is shown</string>
|
||||||
|
<!-- 'Download' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_download_button_title">Hide Download</string>
|
<string name="revanced_hide_download_button_title">Hide Download</string>
|
||||||
<string name="revanced_hide_download_button_summary_on">Download button is hidden</string>
|
<string name="revanced_hide_download_button_summary_on">Download button is hidden</string>
|
||||||
<string name="revanced_hide_download_button_summary_off">Download button is shown</string>
|
<string name="revanced_hide_download_button_summary_off">Download button is shown</string>
|
||||||
|
<!-- 'Thanks' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_thanks_button_title">Hide Thanks</string>
|
<string name="revanced_hide_thanks_button_title">Hide Thanks</string>
|
||||||
<string name="revanced_hide_thanks_button_summary_on">Thanks button is hidden</string>
|
<string name="revanced_hide_thanks_button_summary_on">Thanks button is hidden</string>
|
||||||
<string name="revanced_hide_thanks_button_summary_off">Thanks button is shown</string>
|
<string name="revanced_hide_thanks_button_summary_off">Thanks button is shown</string>
|
||||||
|
<!-- 'Clip' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_clip_button_title">Hide Clip</string>
|
<string name="revanced_hide_clip_button_title">Hide Clip</string>
|
||||||
<string name="revanced_hide_clip_button_summary_on">Clip button is hidden</string>
|
<string name="revanced_hide_clip_button_summary_on">Clip button is hidden</string>
|
||||||
<string name="revanced_hide_clip_button_summary_off">Clip button is shown</string>
|
<string name="revanced_hide_clip_button_summary_off">Clip button is shown</string>
|
||||||
|
<!-- 'Save' should be translated with the same localized wording that YouTube displays. -->
|
||||||
<string name="revanced_hide_playlist_button_title">Hide Save to playlist</string>
|
<string name="revanced_hide_playlist_button_title">Hide Save to playlist</string>
|
||||||
<string name="revanced_hide_playlist_button_summary_on">Save to playlist button is hidden</string>
|
<string name="revanced_hide_playlist_button_summary_on">Save to playlist button is hidden</string>
|
||||||
<string name="revanced_hide_playlist_button_summary_off">Save to playlist button is shown</string>
|
<string name="revanced_hide_playlist_button_summary_off">Save to playlist button is shown</string>
|
||||||
|
<!-- 'Shop' should be translated with the same localized wording that YouTube displays.
|
||||||
|
Shop button appears only for some videos in certain regions. Translate the button name normally if this menu is never shown. -->
|
||||||
<string name="revanced_hide_shop_button_title">Hide Shop</string>
|
<string name="revanced_hide_shop_button_title">Hide Shop</string>
|
||||||
<string name="revanced_hide_shop_button_summary_on">Shop button is hidden</string>
|
<string name="revanced_hide_shop_button_summary_on">Shop button is hidden</string>
|
||||||
<string name="revanced_hide_shop_button_summary_off">Shop button is shown</string>
|
<string name="revanced_hide_shop_button_summary_off">Shop button is shown</string>
|
||||||
@@ -332,6 +393,7 @@
|
|||||||
<string name="revanced_hide_autoplay_button_summary_off">Autoplay button is shown</string>
|
<string name="revanced_hide_autoplay_button_summary_off">Autoplay button is shown</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.buttons.captions.HideCaptionsButtonPatch">
|
<patch id="layout.buttons.captions.HideCaptionsButtonPatch">
|
||||||
|
<!-- This button does not display any text, but 'captions' should be translated using the same wording used as the translation of 'revanced_hide_player_flyout_captions_title' -->
|
||||||
<string name="revanced_hide_captions_button_title">Hide captions button</string>
|
<string name="revanced_hide_captions_button_title">Hide captions button</string>
|
||||||
<string name="revanced_hide_captions_button_summary_on">Captions button is hidden</string>
|
<string name="revanced_hide_captions_button_summary_on">Captions button is hidden</string>
|
||||||
<string name="revanced_hide_captions_button_summary_off">Captions button is shown</string>
|
<string name="revanced_hide_captions_button_summary_off">Captions button is shown</string>
|
||||||
@@ -344,18 +406,23 @@
|
|||||||
<patch id="layout.buttons.navigation.NavigationButtonsPatch">
|
<patch id="layout.buttons.navigation.NavigationButtonsPatch">
|
||||||
<string name="revanced_navigation_buttons_screen_title">Navigation buttons</string>
|
<string name="revanced_navigation_buttons_screen_title">Navigation buttons</string>
|
||||||
<string name="revanced_navigation_buttons_screen_summary">Hide or change buttons in the navigation bar</string>
|
<string name="revanced_navigation_buttons_screen_summary">Hide or change buttons in the navigation bar</string>
|
||||||
|
<!-- 'Home' should be translated using the same localized wording YouTube displays for the tab. -->
|
||||||
<string name="revanced_hide_home_button_title">Hide Home</string>
|
<string name="revanced_hide_home_button_title">Hide Home</string>
|
||||||
<string name="revanced_hide_home_button_summary_on">Home button is hidden</string>
|
<string name="revanced_hide_home_button_summary_on">Home button is hidden</string>
|
||||||
<string name="revanced_hide_home_button_summary_off">Home button is shown</string>
|
<string name="revanced_hide_home_button_summary_off">Home button is shown</string>
|
||||||
|
<!-- 'Shorts' should be translated using the same localized wording YouTube displays the tab. -->
|
||||||
<string name="revanced_hide_shorts_button_title">Hide Shorts</string>
|
<string name="revanced_hide_shorts_button_title">Hide Shorts</string>
|
||||||
<string name="revanced_hide_shorts_button_summary_on">Shorts button is hidden</string>
|
<string name="revanced_hide_shorts_button_summary_on">Shorts button is hidden</string>
|
||||||
<string name="revanced_hide_shorts_button_summary_off">Shorts button is shown</string>
|
<string name="revanced_hide_shorts_button_summary_off">Shorts button is shown</string>
|
||||||
|
<!-- The Create button has no display name. Translate normally. -->
|
||||||
<string name="revanced_hide_create_button_title">Hide Create</string>
|
<string name="revanced_hide_create_button_title">Hide Create</string>
|
||||||
<string name="revanced_hide_create_button_summary_on">Create button is hidden</string>
|
<string name="revanced_hide_create_button_summary_on">Create button is hidden</string>
|
||||||
<string name="revanced_hide_create_button_summary_off">Create button is shown</string>
|
<string name="revanced_hide_create_button_summary_off">Create button is shown</string>
|
||||||
|
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays the tab. -->
|
||||||
<string name="revanced_hide_subscriptions_button_title">Hide Subscriptions</string>
|
<string name="revanced_hide_subscriptions_button_title">Hide Subscriptions</string>
|
||||||
<string name="revanced_hide_subscriptions_button_summary_on">Subscriptions button is hidden</string>
|
<string name="revanced_hide_subscriptions_button_summary_on">Subscriptions button is hidden</string>
|
||||||
<string name="revanced_hide_subscriptions_button_summary_off">Subscriptions button is shown</string>
|
<string name="revanced_hide_subscriptions_button_summary_off">Subscriptions button is shown</string>
|
||||||
|
<!-- 'Notifications' should be translated using the same localized wording YouTube displays the tab. -->
|
||||||
<string name="revanced_switch_create_with_notifications_button_title">Switch Create with Notifications</string>
|
<string name="revanced_switch_create_with_notifications_button_title">Switch Create with Notifications</string>
|
||||||
<string name="revanced_switch_create_with_notifications_button_summary_on">Create button is switched with Notifications button</string>
|
<string name="revanced_switch_create_with_notifications_button_summary_on">Create button is switched with Notifications button</string>
|
||||||
<string name="revanced_switch_create_with_notifications_button_summary_off">Create button is not switched with Notifications button</string>
|
<string name="revanced_switch_create_with_notifications_button_summary_off">Create button is not switched with Notifications button</string>
|
||||||
@@ -363,33 +430,49 @@
|
|||||||
<patch id="layout.hide.player.flyoutmenupanel.HidePlayerFlyoutMenuPatch">
|
<patch id="layout.hide.player.flyoutmenupanel.HidePlayerFlyoutMenuPatch">
|
||||||
<string name="revanced_hide_player_flyout_title">Flyout menu</string>
|
<string name="revanced_hide_player_flyout_title">Flyout menu</string>
|
||||||
<string name="revanced_hide_player_flyout_summary">Hide or show player flyout menu items</string>
|
<string name="revanced_hide_player_flyout_summary">Hide or show player flyout menu items</string>
|
||||||
|
<!-- 'Captions' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||||
<string name="revanced_hide_player_flyout_captions_title">Hide Captions</string>
|
<string name="revanced_hide_player_flyout_captions_title">Hide Captions</string>
|
||||||
<string name="revanced_hide_player_flyout_captions_summary_on">Captions menu is hidden</string>
|
<string name="revanced_hide_player_flyout_captions_summary_on">Captions menu is hidden</string>
|
||||||
<string name="revanced_hide_player_flyout_captions_summary_off">Captions menu is shown</string>
|
<string name="revanced_hide_player_flyout_captions_summary_off">Captions menu is shown</string>
|
||||||
|
<!-- 'Additional settings' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||||
<string name="revanced_hide_player_flyout_additional_settings_title">Hide Additional settings</string>
|
<string name="revanced_hide_player_flyout_additional_settings_title">Hide Additional settings</string>
|
||||||
<string name="revanced_hide_player_flyout_additional_settings_summary_on">Additional settings menu is hidden</string>
|
<string name="revanced_hide_player_flyout_additional_settings_summary_on">Additional settings menu is hidden</string>
|
||||||
<string name="revanced_hide_player_flyout_additional_settings_summary_off">Additional settings menu is shown</string>
|
<string name="revanced_hide_player_flyout_additional_settings_summary_off">Additional settings menu is shown</string>
|
||||||
|
<!-- 'Loop video' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||||
<string name="revanced_hide_player_flyout_loop_video_title">Hide Loop video</string>
|
<string name="revanced_hide_player_flyout_loop_video_title">Hide Loop video</string>
|
||||||
<string name="revanced_hide_player_flyout_loop_video_summary_on">Loop video menu is hidden</string>
|
<string name="revanced_hide_player_flyout_loop_video_summary_on">Loop video menu is hidden</string>
|
||||||
<string name="revanced_hide_player_flyout_loop_video_summary_off">Loop video menu is shown</string>
|
<string name="revanced_hide_player_flyout_loop_video_summary_off">Loop video menu is shown</string>
|
||||||
|
<!-- 'Ambient mode' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||||
<string name="revanced_hide_player_flyout_ambient_mode_title">Hide Ambient mode</string>
|
<string name="revanced_hide_player_flyout_ambient_mode_title">Hide Ambient mode</string>
|
||||||
<string name="revanced_hide_player_flyout_ambient_mode_summary_on">Ambient mode menu is hidden</string>
|
<string name="revanced_hide_player_flyout_ambient_mode_summary_on">Ambient mode menu is hidden</string>
|
||||||
<string name="revanced_hide_player_flyout_ambient_mode_summary_off">Ambient mode menu is shown</string>
|
<string name="revanced_hide_player_flyout_ambient_mode_summary_off">Ambient mode menu is shown</string>
|
||||||
|
<!-- 'Report' should be translated using the same localized wording YouTube displays for the menu item.
|
||||||
|
This item may not appear in some regions. Translate the name normally if the menu cannot be found. -->
|
||||||
<string name="revanced_hide_player_flyout_report_title">Hide Report</string>
|
<string name="revanced_hide_player_flyout_report_title">Hide Report</string>
|
||||||
<string name="revanced_hide_player_flyout_report_summary_on">Report menu is hidden</string>
|
<string name="revanced_hide_player_flyout_report_summary_on">Report menu is hidden</string>
|
||||||
<string name="revanced_hide_player_flyout_report_summary_off">Report menu is shown</string>
|
<string name="revanced_hide_player_flyout_report_summary_off">Report menu is shown</string>
|
||||||
|
<!-- 'Help & feedback' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||||
<string name="revanced_hide_player_flyout_help_title">Hide Help & feedback</string>
|
<string name="revanced_hide_player_flyout_help_title">Hide Help & feedback</string>
|
||||||
<string name="revanced_hide_player_flyout_help_summary_on">Help & feedback menu is hidden</string>
|
<string name="revanced_hide_player_flyout_help_summary_on">Help & feedback menu is hidden</string>
|
||||||
<string name="revanced_hide_player_flyout_help_summary_off">Help & feedback menu is shown</string>
|
<string name="revanced_hide_player_flyout_help_summary_off">Help & feedback menu is shown</string>
|
||||||
|
<!-- 'Playback speed' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||||
<string name="revanced_hide_player_flyout_speed_title">Hide Playback speed</string>
|
<string name="revanced_hide_player_flyout_speed_title">Hide Playback speed</string>
|
||||||
<string name="revanced_hide_player_flyout_speed_summary_on">Playback speed menu is hidden</string>
|
<string name="revanced_hide_player_flyout_speed_summary_on">Playback speed menu is hidden</string>
|
||||||
<string name="revanced_hide_player_flyout_speed_summary_off">Playback speed menu is shown</string>
|
<string name="revanced_hide_player_flyout_speed_summary_off">Playback speed menu is shown</string>
|
||||||
|
<!-- 'More info' should be translated using the same localized wording YouTube displays for the menu item.
|
||||||
|
This menu only appears for some videos. Translate the name normally if the menu cannot be found. -->
|
||||||
<string name="revanced_hide_player_flyout_more_info_title">Hide More info</string>
|
<string name="revanced_hide_player_flyout_more_info_title">Hide More info</string>
|
||||||
<string name="revanced_hide_player_flyout_more_info_summary_on">More info menu is hidden</string>
|
<string name="revanced_hide_player_flyout_more_info_summary_on">More info menu is hidden</string>
|
||||||
<string name="revanced_hide_player_flyout_more_info_summary_off">More info menu is shown</string>
|
<string name="revanced_hide_player_flyout_more_info_summary_off">More info menu is shown</string>
|
||||||
|
<!-- 'Lock screen' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||||
|
<string name="revanced_hide_player_flyout_lock_screen_title">Hide Lock screen</string>
|
||||||
|
<string name="revanced_hide_player_flyout_lock_screen_summary_on">Lock screen menu is hidden</string>
|
||||||
|
<string name="revanced_hide_player_flyout_lock_screen_summary_off">Lock screen menu is shown</string>
|
||||||
|
<!-- 'Audio track' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||||
<string name="revanced_hide_player_flyout_audio_track_title">Hide Audio track</string>
|
<string name="revanced_hide_player_flyout_audio_track_title">Hide Audio track</string>
|
||||||
<string name="revanced_hide_player_flyout_audio_track_summary_on">Audio track menu is hidden</string>
|
<string name="revanced_hide_player_flyout_audio_track_summary_on">Audio track menu is hidden</string>
|
||||||
<string name="revanced_hide_player_flyout_audio_track_summary_off">Audio track menu is shown</string>
|
<string name="revanced_hide_player_flyout_audio_track_summary_off">Audio track menu is shown</string>
|
||||||
|
<!-- 'Watch in VR' should be translated using the same localized wording YouTube displays for the menu item. -->
|
||||||
<string name="revanced_hide_player_flyout_watch_in_vr_title">Hide Watch in VR</string>
|
<string name="revanced_hide_player_flyout_watch_in_vr_title">Hide Watch in VR</string>
|
||||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Watch in VR menu is hidden</string>
|
<string name="revanced_hide_player_flyout_watch_in_vr_summary_on">Watch in VR menu is hidden</string>
|
||||||
<string name="revanced_hide_player_flyout_watch_in_vr_summary_off">Watch in VR menu is shown</string>
|
<string name="revanced_hide_player_flyout_watch_in_vr_summary_off">Watch in VR menu is shown</string>
|
||||||
@@ -404,20 +487,15 @@
|
|||||||
<string name="revanced_hide_album_cards_summary_on">Album cards are hidden</string>
|
<string name="revanced_hide_album_cards_summary_on">Album cards are hidden</string>
|
||||||
<string name="revanced_hide_album_cards_summary_off">Album cards are shown</string>
|
<string name="revanced_hide_album_cards_summary_off">Album cards are shown</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.hide.breakingnews.BreakingNewsResourcePatch">
|
|
||||||
<string name="revanced_hide_breaking_news_title">Hide breaking news</string>
|
|
||||||
<string name="revanced_hide_breaking_news_summary_on">Breaking news are hidden</string>
|
|
||||||
<string name="revanced_hide_breaking_news_summary_off">Breaking news are shown</string>
|
|
||||||
</patch>
|
|
||||||
<patch id="layout.hide.comments.CommentsPatch">
|
<patch id="layout.hide.comments.CommentsPatch">
|
||||||
<string name="revanced_comments_screen_title">Comments</string>
|
<string name="revanced_comments_screen_title">Comments</string>
|
||||||
<string name="revanced_comments_screen_summary">Hide or show comments section components</string>
|
<string name="revanced_comments_screen_summary">Hide or show comments section components</string>
|
||||||
<string name="revanced_hide_comments_section_title">Hide comments section</string>
|
|
||||||
<string name="revanced_hide_comments_section_summary_on">Comment section is hidden</string>
|
|
||||||
<string name="revanced_hide_comments_section_summary_off">Comment section is shown</string>
|
|
||||||
<string name="revanced_hide_preview_comment_title">Hide preview comment</string>
|
<string name="revanced_hide_preview_comment_title">Hide preview comment</string>
|
||||||
<string name="revanced_hide_preview_comment_summary_on">Preview comment is hidden</string>
|
<string name="revanced_hide_preview_comment_summary_on">Preview comment is hidden</string>
|
||||||
<string name="revanced_hide_preview_comment_summary_off">Preview comment is shown</string>
|
<string name="revanced_hide_preview_comment_summary_off">Preview comment is shown</string>
|
||||||
|
<string name="revanced_hide_comments_section_title">Hide comments section</string>
|
||||||
|
<string name="revanced_hide_comments_section_summary_on">Comment section is hidden</string>
|
||||||
|
<string name="revanced_hide_comments_section_summary_off">Comment section is shown</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.hide.crowdfundingbox.CrowdfundingBoxResourcePatch">
|
<patch id="layout.hide.crowdfundingbox.CrowdfundingBoxResourcePatch">
|
||||||
<string name="revanced_hide_crowdfunding_box_title">Hide crowdfunding box</string>
|
<string name="revanced_hide_crowdfunding_box_title">Hide crowdfunding box</string>
|
||||||
@@ -457,14 +535,6 @@
|
|||||||
<string name="revanced_hide_info_cards_summary_on">Info cards are hidden</string>
|
<string name="revanced_hide_info_cards_summary_on">Info cards are hidden</string>
|
||||||
<string name="revanced_hide_info_cards_summary_off">Info cards are shown</string>
|
<string name="revanced_hide_info_cards_summary_off">Info cards are shown</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.hide.loadmorebutton.HideLoadMoreButtonResourcePatch">
|
|
||||||
<string name="revanced_hide_load_more_button_title">Hide \'Load More\' button</string>
|
|
||||||
<string name="revanced_hide_load_more_button_summary_on">Button is hidden</string>
|
|
||||||
<string name="revanced_hide_load_more_button_summary_off">Button is shown</string>
|
|
||||||
</patch>
|
|
||||||
<patch id="layout.hide.player.flyoutmenupanel.HidePlayerFlyoutMenuPatch">
|
|
||||||
<string name="video_title">Video</string>
|
|
||||||
</patch>
|
|
||||||
<patch id="layout.hide.rollingnumber.DisableRollingNumberAnimationPatch">
|
<patch id="layout.hide.rollingnumber.DisableRollingNumberAnimationPatch">
|
||||||
<string name="revanced_disable_rolling_number_animations_title">Disable rolling number animations</string>
|
<string name="revanced_disable_rolling_number_animations_title">Disable rolling number animations</string>
|
||||||
<string name="revanced_disable_rolling_number_animations_summary_on">Rolling numbers are not animated</string>
|
<string name="revanced_disable_rolling_number_animations_summary_on">Rolling numbers are not animated</string>
|
||||||
@@ -479,24 +549,31 @@
|
|||||||
<string name="revanced_hide_seekbar_thumbnail_summary_off">Thumbnail seekbar is shown</string>
|
<string name="revanced_hide_seekbar_thumbnail_summary_off">Thumbnail seekbar is shown</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.hide.shorts.HideShortsComponentsResourcePatch">
|
<patch id="layout.hide.shorts.HideShortsComponentsResourcePatch">
|
||||||
|
<!-- 'home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||||
<string name="revanced_hide_shorts_home_title">Hide Shorts in home feed</string>
|
<string name="revanced_hide_shorts_home_title">Hide Shorts in home feed</string>
|
||||||
<string name="revanced_hide_shorts_home_summary_on">Shorts in home feed are hidden</string>
|
<string name="revanced_hide_shorts_home_summary_on">Shorts in home feed are hidden</string>
|
||||||
<string name="revanced_hide_shorts_home_summary_off">Shorts in home feed are shown</string>
|
<string name="revanced_hide_shorts_home_summary_off">Shorts in home feed are shown</string>
|
||||||
|
<!-- 'subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
|
||||||
<string name="revanced_hide_shorts_subscriptions_title">Hide Shorts in subscription feed</string>
|
<string name="revanced_hide_shorts_subscriptions_title">Hide Shorts in subscription feed</string>
|
||||||
<string name="revanced_hide_shorts_subscriptions_summary_on">Shorts in subscription feed are hidden</string>
|
<string name="revanced_hide_shorts_subscriptions_summary_on">Shorts in subscription feed are hidden</string>
|
||||||
<string name="revanced_hide_shorts_subscriptions_summary_off">Shorts in subscription feed are shown</string>
|
<string name="revanced_hide_shorts_subscriptions_summary_off">Shorts in subscription feed are shown</string>
|
||||||
<string name="revanced_hide_shorts_search_title">Hide Shorts in search results</string>
|
<string name="revanced_hide_shorts_search_title">Hide Shorts in search results</string>
|
||||||
<string name="revanced_hide_shorts_search_summary_on">Shorts in search results are hidden</string>
|
<string name="revanced_hide_shorts_search_summary_on">Shorts in search results are hidden</string>
|
||||||
<string name="revanced_hide_shorts_search_summary_off">Shorts in search results are shown</string>
|
<string name="revanced_hide_shorts_search_summary_off">Shorts in search results are shown</string>
|
||||||
|
<!-- 'join' should be translated using the same localized wording YouTube displays for the button. -->
|
||||||
<string name="revanced_hide_shorts_join_button_title">Hide join button</string>
|
<string name="revanced_hide_shorts_join_button_title">Hide join button</string>
|
||||||
<string name="revanced_hide_shorts_join_button_summary_on">Join button is hidden</string>
|
<string name="revanced_hide_shorts_join_button_summary_on">Join button is hidden</string>
|
||||||
<string name="revanced_hide_shorts_join_button_summary_off">Join button is shown</string>
|
<string name="revanced_hide_shorts_join_button_summary_off">Join button is shown</string>
|
||||||
|
<!-- 'subscribe' should be translated using the same localized wording YouTube displays for the button. -->
|
||||||
<string name="revanced_hide_shorts_subscribe_button_title">Hide subscribe button</string>
|
<string name="revanced_hide_shorts_subscribe_button_title">Hide subscribe button</string>
|
||||||
<string name="revanced_hide_shorts_subscribe_button_summary_on">Subscribe button is hidden</string>
|
<string name="revanced_hide_shorts_subscribe_button_summary_on">Subscribe button is hidden</string>
|
||||||
<string name="revanced_hide_shorts_subscribe_button_summary_off">Subscribe button is shown</string>
|
<string name="revanced_hide_shorts_subscribe_button_summary_off">Subscribe button is shown</string>
|
||||||
|
<!-- 'subscribe' should be translated using the same localized wording YouTube displays for the button. -->
|
||||||
<string name="revanced_hide_shorts_subscribe_button_paused_title">Hide subscribe button when paused</string>
|
<string name="revanced_hide_shorts_subscribe_button_paused_title">Hide subscribe button when paused</string>
|
||||||
<string name="revanced_hide_shorts_subscribe_button_paused_summary_on">Subscribe button is hidden</string>
|
<string name="revanced_hide_shorts_subscribe_button_paused_summary_on">Subscribe button is hidden</string>
|
||||||
<string name="revanced_hide_shorts_subscribe_button_paused_summary_off">Subscribe button is shown</string>
|
<string name="revanced_hide_shorts_subscribe_button_paused_summary_off">Subscribe button is shown</string>
|
||||||
|
<!-- 'thanks' should be translated using the same localized wording YouTube displays for the button.
|
||||||
|
If the button never shows up, then translate the button name normally. -->
|
||||||
<string name="revanced_hide_shorts_thanks_button_title">Hide thanks button</string>
|
<string name="revanced_hide_shorts_thanks_button_title">Hide thanks button</string>
|
||||||
<string name="revanced_hide_shorts_thanks_button_summary_on">Thanks button is hidden</string>
|
<string name="revanced_hide_shorts_thanks_button_summary_on">Thanks button is hidden</string>
|
||||||
<string name="revanced_hide_shorts_thanks_button_summary_off">Thanks button is shown</string>
|
<string name="revanced_hide_shorts_thanks_button_summary_off">Thanks button is shown</string>
|
||||||
@@ -509,9 +586,11 @@
|
|||||||
<string name="revanced_hide_shorts_comments_button_title">Hide comments button</string>
|
<string name="revanced_hide_shorts_comments_button_title">Hide comments button</string>
|
||||||
<string name="revanced_hide_shorts_comments_button_summary_on">Comments button is hidden</string>
|
<string name="revanced_hide_shorts_comments_button_summary_on">Comments button is hidden</string>
|
||||||
<string name="revanced_hide_shorts_comments_button_summary_off">Comments button is shown</string>
|
<string name="revanced_hide_shorts_comments_button_summary_off">Comments button is shown</string>
|
||||||
|
<!-- 'remix' should be translated using the same localized wording YouTube displays for the button. -->
|
||||||
<string name="revanced_hide_shorts_remix_button_title">Hide remix button</string>
|
<string name="revanced_hide_shorts_remix_button_title">Hide remix button</string>
|
||||||
<string name="revanced_hide_shorts_remix_button_summary_on">Remix button is hidden</string>
|
<string name="revanced_hide_shorts_remix_button_summary_on">Remix button is hidden</string>
|
||||||
<string name="revanced_hide_shorts_remix_button_summary_off">Remix button is shown</string>
|
<string name="revanced_hide_shorts_remix_button_summary_off">Remix button is shown</string>
|
||||||
|
<!-- 'share' should be translated using the same localized wording YouTube displays for the button. -->
|
||||||
<string name="revanced_hide_shorts_share_button_title">Hide share button</string>
|
<string name="revanced_hide_shorts_share_button_title">Hide share button</string>
|
||||||
<string name="revanced_hide_shorts_share_button_summary_on">Share button is hidden</string>
|
<string name="revanced_hide_shorts_share_button_summary_on">Share button is hidden</string>
|
||||||
<string name="revanced_hide_shorts_share_button_summary_off">Share button is shown</string>
|
<string name="revanced_hide_shorts_share_button_summary_off">Share button is shown</string>
|
||||||
@@ -525,11 +604,11 @@
|
|||||||
<string name="revanced_hide_shorts_video_title_summary_on">Title is hidden</string>
|
<string name="revanced_hide_shorts_video_title_summary_on">Title is hidden</string>
|
||||||
<string name="revanced_hide_shorts_video_title_summary_off">Title is shown</string>
|
<string name="revanced_hide_shorts_video_title_summary_off">Title is shown</string>
|
||||||
<string name="revanced_hide_shorts_sound_metadata_label_title">Hide sound metadata label</string>
|
<string name="revanced_hide_shorts_sound_metadata_label_title">Hide sound metadata label</string>
|
||||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Label is hidden</string>
|
<string name="revanced_hide_shorts_sound_metadata_label_summary_on">Metadata label is hidden</string>
|
||||||
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Label is shown</string>
|
<string name="revanced_hide_shorts_sound_metadata_label_summary_off">Metadata label is shown</string>
|
||||||
<string name="revanced_hide_shorts_full_video_link_label_title">Hide full video link label</string>
|
<string name="revanced_hide_shorts_full_video_link_label_title">Hide full video link label</string>
|
||||||
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Label is hidden</string>
|
<string name="revanced_hide_shorts_full_video_link_label_summary_on">Video link label is hidden</string>
|
||||||
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Label is shown</string>
|
<string name="revanced_hide_shorts_full_video_link_label_summary_off">Video link label is shown</string>
|
||||||
<string name="revanced_hide_shorts_sound_button_title">Hide sound button</string>
|
<string name="revanced_hide_shorts_sound_button_title">Hide sound button</string>
|
||||||
<string name="revanced_hide_shorts_sound_button_summary_on">Sound button is hidden</string>
|
<string name="revanced_hide_shorts_sound_button_summary_on">Sound button is hidden</string>
|
||||||
<string name="revanced_hide_shorts_sound_button_summary_off">Sound button is shown</string>
|
<string name="revanced_hide_shorts_sound_button_summary_off">Sound button is shown</string>
|
||||||
@@ -559,23 +638,24 @@
|
|||||||
<patch id="layout.returnyoutubedislike.ReturnYouTubeDislikeResourcePatch">
|
<patch id="layout.returnyoutubedislike.ReturnYouTubeDislikeResourcePatch">
|
||||||
<string name="revanced_ryd_settings_title">Return YouTube Dislike</string>
|
<string name="revanced_ryd_settings_title">Return YouTube Dislike</string>
|
||||||
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Hidden</string>
|
<string name="revanced_ryd_video_likes_hidden_by_video_owner">Hidden</string>
|
||||||
|
<!-- Toast shown if network connection times out. Translations of this should not be longer than the original English or the text can be clipped and not entirely shown. -->
|
||||||
<string name="revanced_ryd_failure_connection_timeout">Dislikes temporarily not available (API timed out)</string>
|
<string name="revanced_ryd_failure_connection_timeout">Dislikes temporarily not available (API timed out)</string>
|
||||||
<string name="revanced_ryd_failure_connection_status_code" formatted="false">Dislikes not available (status %d)</string>
|
<string name="revanced_ryd_failure_connection_status_code">Dislikes not available (status %d)</string>
|
||||||
<string name="revanced_ryd_failure_client_rate_limit_requested">Dislikes not available (client API limit reached)</string>
|
<string name="revanced_ryd_failure_client_rate_limit_requested">Dislikes not available (client API limit reached)</string>
|
||||||
<string name="revanced_ryd_failure_generic">Dislikes not available (%s)</string>
|
<string name="revanced_ryd_failure_generic">Dislikes not available (%s)</string>
|
||||||
<!-- corner case situation, where user enables RYD while video is playing and then tries
|
<!-- Toast shown if the user enables RYD while a video is opened, and then tries to vote for the video. -->
|
||||||
to vote for the video -->
|
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Reload video to vote using Return YouTube Dislike</string>
|
||||||
<string name="revanced_ryd_failure_ryd_enabled_while_playing_video_then_user_voted">Reload video to vote using ReturnYouTubeDislike</string>
|
|
||||||
<string name="revanced_ryd_enable_title">Return YouTube Dislike</string>
|
<string name="revanced_ryd_enable_title">Return YouTube Dislike</string>
|
||||||
<string name="revanced_ryd_enable_summary_on">Dislikes are shown</string>
|
<string name="revanced_ryd_enable_summary_on">Dislikes are shown</string>
|
||||||
<string name="revanced_ryd_enable_summary_off">Dislikes are not shown</string>
|
<string name="revanced_ryd_enable_summary_off">Dislikes are not shown</string>
|
||||||
<string name="revanced_ryd_shorts_title">Show dislikes on Shorts</string>
|
<string name="revanced_ryd_shorts_title">Show dislikes on Shorts</string>
|
||||||
<string name="revanced_ryd_shorts_summary_on">Dislikes shown on Shorts %s</string>
|
<string name="revanced_ryd_shorts_summary_on">Dislikes shown on Shorts</string>
|
||||||
|
<string name="revanced_ryd_shorts_summary_on_disclaimer">Dislikes shown on Shorts\n\nLimitation: Dislikes may not appear in incognito mode</string>
|
||||||
<string name="revanced_ryd_shorts_summary_off">Dislikes hidden on Shorts</string>
|
<string name="revanced_ryd_shorts_summary_off">Dislikes hidden on Shorts</string>
|
||||||
<string name="revanced_ryd_shorts_summary_disclaimer">Limitation: Dislikes may not appear in incognito mode</string>
|
|
||||||
<string name="revanced_ryd_dislike_percentage_title">Dislikes as percentage</string>
|
<string name="revanced_ryd_dislike_percentage_title">Dislikes as percentage</string>
|
||||||
<string name="revanced_ryd_dislike_percentage_summary_on">Dislikes shown as percentage</string>
|
<string name="revanced_ryd_dislike_percentage_summary_on">Dislikes shown as percentage</string>
|
||||||
<string name="revanced_ryd_dislike_percentage_summary_off">Dislikes shown as number</string>
|
<string name="revanced_ryd_dislike_percentage_summary_off">Dislikes shown as number</string>
|
||||||
|
<!-- Translations should use language similar to 'revanced_sb_enable_compact_skip_button' -->
|
||||||
<string name="revanced_ryd_compact_layout_title">Compact like button</string>
|
<string name="revanced_ryd_compact_layout_title">Compact like button</string>
|
||||||
<string name="revanced_ryd_compact_layout_summary_on">Like button styled for minimum width</string>
|
<string name="revanced_ryd_compact_layout_summary_on">Like button styled for minimum width</string>
|
||||||
<string name="revanced_ryd_compact_layout_summary_off">Like button styled for best appearance</string>
|
<string name="revanced_ryd_compact_layout_summary_off">Like button styled for best appearance</string>
|
||||||
@@ -585,6 +665,7 @@
|
|||||||
<string name="revanced_ryd_about">About</string>
|
<string name="revanced_ryd_about">About</string>
|
||||||
<string name="revanced_ryd_attribution_title">ReturnYouTubeDislike.com</string>
|
<string name="revanced_ryd_attribution_title">ReturnYouTubeDislike.com</string>
|
||||||
<string name="revanced_ryd_attribution_summary">Data is provided by the Return YouTube Dislike API. Tap here to learn more</string>
|
<string name="revanced_ryd_attribution_summary">Data is provided by the Return YouTube Dislike API. Tap here to learn more</string>
|
||||||
|
<!-- Statistic strings are shown in the settings only when ReVanced debug mode is enabled. Typical users will never see these. -->
|
||||||
<string name="revanced_ryd_statistics_category_title">ReturnYouTubeDislike API statistics of this device</string>
|
<string name="revanced_ryd_statistics_category_title">ReturnYouTubeDislike API statistics of this device</string>
|
||||||
<string name="revanced_ryd_statistics_getFetchCallResponseTimeAverage_title">API response time, average</string>
|
<string name="revanced_ryd_statistics_getFetchCallResponseTimeAverage_title">API response time, average</string>
|
||||||
<string name="revanced_ryd_statistics_getFetchCallResponseTimeMin_title">API response time, minimum</string>
|
<string name="revanced_ryd_statistics_getFetchCallResponseTimeMin_title">API response time, minimum</string>
|
||||||
@@ -595,8 +676,7 @@
|
|||||||
<string name="revanced_ryd_statistics_getFetchCallCount_zero_summary">No network calls made</string>
|
<string name="revanced_ryd_statistics_getFetchCallCount_zero_summary">No network calls made</string>
|
||||||
<string name="revanced_ryd_statistics_getFetchCallCount_non_zero_summary">%d network calls made</string>
|
<string name="revanced_ryd_statistics_getFetchCallCount_non_zero_summary">%d network calls made</string>
|
||||||
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_title">API fetch votes, number of timeouts</string>
|
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_title">API fetch votes, number of timeouts</string>
|
||||||
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_zero_summary">No
|
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_zero_summary">No network calls timed out</string>
|
||||||
network calls timed out</string>
|
|
||||||
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_non_zero_summary">%d network calls timed out</string>
|
<string name="revanced_ryd_statistics_getFetchCallNumberOfFailures_non_zero_summary">%d network calls timed out</string>
|
||||||
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_title">API client rate limits</string>
|
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_title">API client rate limits</string>
|
||||||
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_zero_summary">No client rate limits encountered</string>
|
<string name="revanced_ryd_statistics_getNumberOfRateLimitRequestsEncountered_zero_summary">No client rate limits encountered</string>
|
||||||
@@ -621,6 +701,7 @@
|
|||||||
<string name="revanced_sb_enable_voting">Show voting button</string>
|
<string name="revanced_sb_enable_voting">Show voting button</string>
|
||||||
<string name="revanced_sb_enable_voting_sum_on">Segment voting button is shown</string>
|
<string name="revanced_sb_enable_voting_sum_on">Segment voting button is shown</string>
|
||||||
<string name="revanced_sb_enable_voting_sum_off">Segment voting button is not shown</string>
|
<string name="revanced_sb_enable_voting_sum_off">Segment voting button is not shown</string>
|
||||||
|
<!-- Translations should use language similar to 'revanced_ryd_compact_layout_title' -->
|
||||||
<string name="revanced_sb_enable_compact_skip_button">Use compact skip button</string>
|
<string name="revanced_sb_enable_compact_skip_button">Use compact skip button</string>
|
||||||
<string name="revanced_sb_enable_compact_skip_button_sum_on">Skip button styled for minimum width</string>
|
<string name="revanced_sb_enable_compact_skip_button_sum_on">Skip button styled for minimum width</string>
|
||||||
<string name="revanced_sb_enable_compact_skip_button_sum_off">Skip button styled for best appearance</string>
|
<string name="revanced_sb_enable_compact_skip_button_sum_off">Skip button styled for best appearance</string>
|
||||||
@@ -654,19 +735,19 @@
|
|||||||
<string name="revanced_sb_general_skipcount_sum_on">Lets the SponsorBlock leaderboard know how much time is saved. A message is sent to the leaderboard each time a segment is skipped</string>
|
<string name="revanced_sb_general_skipcount_sum_on">Lets the SponsorBlock leaderboard know how much time is saved. A message is sent to the leaderboard each time a segment is skipped</string>
|
||||||
<string name="revanced_sb_general_skipcount_sum_off">Skip count tracking is not enabled</string>
|
<string name="revanced_sb_general_skipcount_sum_off">Skip count tracking is not enabled</string>
|
||||||
<string name="revanced_sb_general_min_duration">Minimum segment duration</string>
|
<string name="revanced_sb_general_min_duration">Minimum segment duration</string>
|
||||||
<string name="revanced_sb_general_min_duration_sum">Segments shorter than this value (in seconds) will not be shown or skipped </string>
|
<string name="revanced_sb_general_min_duration_sum">Segments shorter than this value (in seconds) will not be shown or skipped</string>
|
||||||
<string name="revanced_sb_general_uuid">Your private user id</string>
|
<string name="revanced_sb_general_uuid">Your private user id</string>
|
||||||
<string name="revanced_sb_general_uuid_sum">This should be kept private. This is like a password and should not be shared with anyone. If someone has this, they can impersonate you</string>
|
<string name="revanced_sb_general_uuid_sum">This should be kept private. This is like a password and should not be shared with anyone. If someone has this, they can impersonate you</string>
|
||||||
<string name="revanced_sb_general_uuid_invalid">Private user id must be at least 30 characters long</string>
|
<string name="revanced_sb_general_uuid_invalid">Private user id must be at least 30 characters long</string>
|
||||||
<string name="revanced_sb_general_api_url">Change API URL</string>
|
<string name="revanced_sb_general_api_url">Change API URL</string>
|
||||||
<string name="revanced_sb_general_api_url_sum">The address SponsorBlock uses to make calls to the server. Do not change this unless you know what you\'re doing</string>
|
<string name="revanced_sb_general_api_url_sum">The address SponsorBlock uses to make calls to the server</string>
|
||||||
<string name="revanced_sb_api_url_reset">API URL reset</string>
|
<string name="revanced_sb_api_url_reset">API URL reset</string>
|
||||||
<string name="revanced_sb_api_url_invalid">API URL is invalid</string>
|
<string name="revanced_sb_api_url_invalid">API URL is invalid</string>
|
||||||
<string name="revanced_sb_api_url_changed">API URL changed</string>
|
<string name="revanced_sb_api_url_changed">API URL changed</string>
|
||||||
<string name="revanced_sb_settings_ie">Import/Export settings</string>
|
<string name="revanced_sb_settings_ie">Import/Export settings</string>
|
||||||
<string name="revanced_sb_settings_copy">Copy</string>
|
<string name="revanced_sb_settings_copy">Copy</string>
|
||||||
<string name="revanced_sb_settings_ie_sum">Your SponsorBlock JSON configuration that can be imported/exported to ReVanced and other SponsorBlock platforms %s</string>
|
<string name="revanced_sb_settings_ie_sum">Your SponsorBlock JSON configuration that can be imported/exported to ReVanced and other SponsorBlock platforms</string>
|
||||||
<string name="revanced_sb_settings_ie_sum_warning">This includes your private user id. Be sure to share this wisely</string>
|
<string name="revanced_sb_settings_ie_sum_warning">Your SponsorBlock JSON configuration that can be imported/exported to ReVanced and other SponsorBlock platforms. This includes your private user id. Be sure to share this wisely</string>
|
||||||
<string name="revanced_sb_settings_import_successful">Settings imported successfully</string>
|
<string name="revanced_sb_settings_import_successful">Settings imported successfully</string>
|
||||||
<string name="revanced_sb_settings_import_failed">Failed to import: %s</string>
|
<string name="revanced_sb_settings_import_failed">Failed to import: %s</string>
|
||||||
<string name="revanced_sb_settings_export_failed">Failed to export: %s</string>
|
<string name="revanced_sb_settings_export_failed">Failed to export: %s</string>
|
||||||
@@ -727,19 +808,20 @@
|
|||||||
<string name="revanced_sb_skip_showbutton">Show a skip button</string>
|
<string name="revanced_sb_skip_showbutton">Show a skip button</string>
|
||||||
<string name="revanced_sb_skip_seekbaronly">Show in seek bar</string>
|
<string name="revanced_sb_skip_seekbaronly">Show in seek bar</string>
|
||||||
<string name="revanced_sb_skip_ignore">Disable</string>
|
<string name="revanced_sb_skip_ignore">Disable</string>
|
||||||
<string name="revanced_sb_submit_failed_invalid" formatted="false">Unable to submit segment: %s</string>
|
<string name="revanced_sb_submit_failed_invalid">Unable to submit segment: %s</string>
|
||||||
<string name="revanced_sb_submit_failed_timeout">SponsorBlock is temporarily down</string>
|
<string name="revanced_sb_submit_failed_timeout">SponsorBlock is temporarily down</string>
|
||||||
<string name="revanced_sb_submit_failed_unknown_error" formatted="false">Unable to submit segment (status: %d %s)</string>
|
<string name="revanced_sb_submit_failed_unknown_error">Unable to submit segment (status: %1$d %2$s)</string>
|
||||||
<string name="revanced_sb_submit_failed_rate_limit">Unable to submit segment.\nRate Limited (too many from the same user or IP)</string>
|
<string name="revanced_sb_submit_failed_rate_limit">Unable to submit segment.\nRate Limited (too many from the same user or IP)</string>
|
||||||
<string name="revanced_sb_submit_failed_forbidden" formatted="false">Can\'t submit the segment: %s</string>
|
<string name="revanced_sb_submit_failed_forbidden">Can\'t submit the segment: %s</string>
|
||||||
<string name="revanced_sb_submit_failed_duplicate">Can\'t submit the segment.\nAlready exists</string>
|
<string name="revanced_sb_submit_failed_duplicate">Can\'t submit the segment.\nAlready exists</string>
|
||||||
<string name="revanced_sb_submit_succeeded">Segment submitted successfully</string>
|
<string name="revanced_sb_submit_succeeded">Segment submitted successfully</string>
|
||||||
<string name="revanced_sb_sponsorblock_connection_failure_generic">SponsorBlock temporarily not available</string>
|
<!-- Toast shown if network connection times out. Translations of this should not be longer than the original English or the text can be clipped and not entirely shown. -->
|
||||||
<string name="revanced_sb_sponsorblock_connection_failure_status" formatted="false">SponsorBlock temporarily not available (status %d)</string>
|
|
||||||
<string name="revanced_sb_sponsorblock_connection_failure_timeout">SponsorBlock temporarily not available (API timed out)</string>
|
<string name="revanced_sb_sponsorblock_connection_failure_timeout">SponsorBlock temporarily not available (API timed out)</string>
|
||||||
|
<string name="revanced_sb_sponsorblock_connection_failure_status">SponsorBlock temporarily not available (status %d)</string>
|
||||||
|
<string name="revanced_sb_sponsorblock_connection_failure_generic">SponsorBlock temporarily not available</string>
|
||||||
<string name="revanced_sb_vote_failed_timeout">Unable to vote for segment (API timed out)</string>
|
<string name="revanced_sb_vote_failed_timeout">Unable to vote for segment (API timed out)</string>
|
||||||
<string name="revanced_sb_vote_failed_unknown_error" formatted="false">Unable to vote for segment (status: %d %s)</string>
|
<string name="revanced_sb_vote_failed_unknown_error">Unable to vote for segment (status: %1$d %2$s)</string>
|
||||||
<string name="revanced_sb_vote_failed_forbidden" formatted="false">Unable to vote for segment: %s</string>
|
<string name="revanced_sb_vote_failed_forbidden">Unable to vote for segment: %s</string>
|
||||||
<string name="revanced_sb_vote_upvote">Upvote</string>
|
<string name="revanced_sb_vote_upvote">Upvote</string>
|
||||||
<string name="revanced_sb_vote_downvote">Downvote</string>
|
<string name="revanced_sb_vote_downvote">Downvote</string>
|
||||||
<string name="revanced_sb_vote_category">Change category</string>
|
<string name="revanced_sb_vote_category">Change category</string>
|
||||||
@@ -747,14 +829,18 @@
|
|||||||
<string name="revanced_sb_new_segment_choose_category">Choose the segment category</string>
|
<string name="revanced_sb_new_segment_choose_category">Choose the segment category</string>
|
||||||
<string name="revanced_sb_new_segment_disabled_category">Category is disabled in settings. Enable category to submit.</string>
|
<string name="revanced_sb_new_segment_disabled_category">Category is disabled in settings. Enable category to submit.</string>
|
||||||
<string name="revanced_sb_new_segment_title">New SponsorBlock segment</string>
|
<string name="revanced_sb_new_segment_title">New SponsorBlock segment</string>
|
||||||
<string name="revanced_sb_new_segment_mark_time_as_question" formatted="false">Set %02d:%02d:%03d as the start or end of a new segment?</string>
|
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||||
|
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||||
|
<string name="revanced_sb_new_segment_mark_time_as_question">Set %1$02d:%2$02d:%3$03d as the start or end of a new segment?</string>
|
||||||
<string name="revanced_sb_new_segment_mark_start">start</string>
|
<string name="revanced_sb_new_segment_mark_start">start</string>
|
||||||
<string name="revanced_sb_new_segment_mark_end">end</string>
|
<string name="revanced_sb_new_segment_mark_end">end</string>
|
||||||
<string name="revanced_sb_new_segment_now">now</string>
|
<string name="revanced_sb_new_segment_now">now</string>
|
||||||
<string name="revanced_sb_new_segment_time_start">Time the segment begins at</string>
|
<string name="revanced_sb_new_segment_time_start">Time the segment begins at</string>
|
||||||
<string name="revanced_sb_new_segment_time_end">Time the segment ends at</string>
|
<string name="revanced_sb_new_segment_time_end">Time the segment ends at</string>
|
||||||
<string name="revanced_sb_new_segment_confirm_title">Are the times correct?</string>
|
<string name="revanced_sb_new_segment_confirm_title">Are the times correct?</string>
|
||||||
<string name="revanced_sb_new_segment_confirm_content" formatted="false">The segment lasts from %02d:%02d to %02d:%02d (%d minutes %02d seconds)\nIs it ready to submit?</string>
|
<!-- Do not rearrange the (hour):(minute):second) time format operators here.
|
||||||
|
YT shows the same seekbar time format for all languages, and this string is confirming the segment time as it appears in the seekbar. -->
|
||||||
|
<string name="revanced_sb_new_segment_confirm_content">The segment lasts from %1$02d:%2$02d to %3$02d:%4$02d (%5$d minutes %6$02d seconds)\nIs it ready to submit?</string>
|
||||||
<string name="revanced_sb_new_segment_start_is_before_end">Start must be before the end</string>
|
<string name="revanced_sb_new_segment_start_is_before_end">Start must be before the end</string>
|
||||||
<string name="revanced_sb_new_segment_mark_locations_first">Mark two locations on the time bar first</string>
|
<string name="revanced_sb_new_segment_mark_locations_first">Mark two locations on the time bar first</string>
|
||||||
<string name="revanced_sb_new_segment_preview_segment_first">Preview the segment, and ensure it skips smoothly</string>
|
<string name="revanced_sb_new_segment_preview_segment_first">Preview the segment, and ensure it skips smoothly</string>
|
||||||
@@ -762,25 +848,26 @@
|
|||||||
<string name="revanced_sb_new_segment_edit_by_hand_content">Do you want to edit the timing for the start or end of the segment?</string>
|
<string name="revanced_sb_new_segment_edit_by_hand_content">Do you want to edit the timing for the start or end of the segment?</string>
|
||||||
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Invalid time given</string>
|
<string name="revanced_sb_new_segment_edit_by_hand_parse_error">Invalid time given</string>
|
||||||
<string name="revanced_sb_stats">Stats</string>
|
<string name="revanced_sb_stats">Stats</string>
|
||||||
|
<!-- Shown in the settings preferences, and translations can be any text length. -->
|
||||||
<string name="revanced_sb_stats_connection_failure">Stats temporarily not available (API is down)</string>
|
<string name="revanced_sb_stats_connection_failure">Stats temporarily not available (API is down)</string>
|
||||||
<string name="revanced_sb_stats_loading">Loading...</string>
|
<string name="revanced_sb_stats_loading">Loading...</string>
|
||||||
<string name="revanced_sb_stats_sb_disabled">SponsorBlock is disabled</string>
|
<string name="revanced_sb_stats_sb_disabled">SponsorBlock is disabled</string>
|
||||||
<string name="revanced_sb_stats_username" formatted="false">Your username: <b>%s</b></string>
|
<string name="revanced_sb_stats_username">Your username: <b>%s</b></string>
|
||||||
<string name="revanced_sb_stats_username_change">Tap here to change your username</string>
|
<string name="revanced_sb_stats_username_change">Tap here to change your username</string>
|
||||||
<string name="revanced_sb_stats_username_change_unknown_error" formatted="false">Unable to change username: Status: %d %s</string>
|
<string name="revanced_sb_stats_username_change_unknown_error">Unable to change username: Status: %1$d %2$s</string>
|
||||||
<string name="revanced_sb_stats_username_changed">Username successfully changed</string>
|
<string name="revanced_sb_stats_username_changed">Username successfully changed</string>
|
||||||
<string name="revanced_sb_stats_reputation" formatted="false">Your reputation is <b>%.2f</b></string>
|
<string name="revanced_sb_stats_reputation">Your reputation is <b>%.2f</b></string>
|
||||||
<string name="revanced_sb_stats_submissions" formatted="false">You\'ve created <b>%s</b> segments</string>
|
<string name="revanced_sb_stats_submissions">You\'ve created <b>%s</b> segments</string>
|
||||||
<string name="revanced_sb_stats_saved_zero">SponsorBlock leaderboard</string>
|
<string name="revanced_sb_stats_saved_zero">SponsorBlock leaderboard</string>
|
||||||
<string name="revanced_sb_stats_saved" formatted="false">You\'ve saved people from <b>%s</b> segments</string>
|
<string name="revanced_sb_stats_saved">You\'ve saved people from <b>%s</b> segments</string>
|
||||||
<string name="revanced_sb_stats_saved_sum_zero">Tap here to see the global stats and top contributors</string>
|
<string name="revanced_sb_stats_saved_sum_zero">Tap here to see the global stats and top contributors</string>
|
||||||
<string name="revanced_sb_stats_saved_sum" formatted="false">That\'s <b>%s</b> of their lives.<br>Tap here to see the leaderboard</string>
|
<string name="revanced_sb_stats_saved_sum">That\'s <b>%s</b> of their lives.<br>Tap here to see the leaderboard</string>
|
||||||
<string name="revanced_sb_stats_self_saved" formatted="false">You\'ve skipped <b>%s</b> segments</string>
|
<string name="revanced_sb_stats_self_saved">You\'ve skipped <b>%s</b> segments</string>
|
||||||
<string name="revanced_sb_stats_self_saved_sum" formatted="false">That\'s <b>%s</b></string>
|
<string name="revanced_sb_stats_self_saved_sum">That\'s <b>%s</b></string>
|
||||||
<string name="revanced_sb_stats_self_saved_reset_title">Reset skipped segments counter?</string>
|
<string name="revanced_sb_stats_self_saved_reset_title">Reset skipped segments counter?</string>
|
||||||
<string name="revanced_sb_stats_saved_hour_format" formatted="false">%s hours %s minutes</string>
|
<string name="revanced_sb_stats_saved_hour_format">%1$s hours %2$s minutes</string>
|
||||||
<string name="revanced_sb_stats_saved_minute_format" formatted="false">%s minutes %s seconds</string>
|
<string name="revanced_sb_stats_saved_minute_format">%1$s minutes %2$s seconds</string>
|
||||||
<string name="revanced_sb_stats_saved_second_format" formatted="false">%s seconds</string>
|
<string name="revanced_sb_stats_saved_second_format">%s seconds</string>
|
||||||
<string name="revanced_sb_color_dot_label">Color:</string>
|
<string name="revanced_sb_color_dot_label">Color:</string>
|
||||||
<string name="revanced_sb_color_changed">Color changed</string>
|
<string name="revanced_sb_color_changed">Color changed</string>
|
||||||
<string name="revanced_sb_color_reset">Color reset</string>
|
<string name="revanced_sb_color_reset">Color reset</string>
|
||||||
@@ -796,7 +883,10 @@
|
|||||||
<string name="revanced_spoof_app_version_summary_on">Version spoofed</string>
|
<string name="revanced_spoof_app_version_summary_on">Version spoofed</string>
|
||||||
<string name="revanced_spoof_app_version_summary_off">Version not spoofed</string>
|
<string name="revanced_spoof_app_version_summary_off">Version not spoofed</string>
|
||||||
<string name="revanced_spoof_app_version_user_dialog_message">App version will be spoofed to an older version of YouTube.\n\nThis will change the appearance and features of the app, but unknown side effects may occur.\n\nIf later turned off, it is recommended to clear the app data to prevent UI bugs.</string>
|
<string name="revanced_spoof_app_version_user_dialog_message">App version will be spoofed to an older version of YouTube.\n\nThis will change the appearance and features of the app, but unknown side effects may occur.\n\nIf later turned off, it is recommended to clear the app data to prevent UI bugs.</string>
|
||||||
|
<!-- It is ideal, but not required, if the text here appears alphabetically after the text used for 'revanced_spoof_app_version_title'.
|
||||||
|
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 -->
|
||||||
<string name="revanced_spoof_app_version_target_title">Spoof app version target</string>
|
<string name="revanced_spoof_app_version_target_title">Spoof app version target</string>
|
||||||
|
<!-- 'RYD' is 'Return YouTube Dislike' -->
|
||||||
<string name="revanced_spoof_app_version_target_entry_1">18.33.40 - Restore RYD on Shorts incognito mode</string>
|
<string name="revanced_spoof_app_version_target_entry_1">18.33.40 - Restore RYD on Shorts incognito mode</string>
|
||||||
<string name="revanced_spoof_app_version_target_entry_2">18.20.39 - Restore wide video speed & quality menu</string>
|
<string name="revanced_spoof_app_version_target_entry_2">18.20.39 - Restore wide video speed & quality menu</string>
|
||||||
<string name="revanced_spoof_app_version_target_entry_3">18.09.39 - Restore library tab</string>
|
<string name="revanced_spoof_app_version_target_entry_3">18.09.39 - Restore library tab</string>
|
||||||
@@ -806,13 +896,17 @@
|
|||||||
<patch id="layout.startpage.ChangeStartPagePatch">
|
<patch id="layout.startpage.ChangeStartPagePatch">
|
||||||
<string name="revanced_start_page_title">Set start page</string>
|
<string name="revanced_start_page_title">Set start page</string>
|
||||||
<string name="revanced_start_page_entry_0">Default</string>
|
<string name="revanced_start_page_entry_0">Default</string>
|
||||||
|
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||||
<string name="revanced_start_page_entry_1">Home</string>
|
<string name="revanced_start_page_entry_1">Home</string>
|
||||||
<string name="revanced_start_page_entry_2">Search</string>
|
<string name="revanced_start_page_entry_2">Search</string>
|
||||||
|
<!-- 'Subscriptions' should be translated using the same localized wording YouTube displays for the subscriptions tab. -->
|
||||||
<string name="revanced_start_page_entry_3">Subscriptions</string>
|
<string name="revanced_start_page_entry_3">Subscriptions</string>
|
||||||
<string name="revanced_start_page_entry_4">Explore</string>
|
<string name="revanced_start_page_entry_4">Explore</string>
|
||||||
<string name="revanced_start_page_entry_5">Shorts</string>
|
<string name="revanced_start_page_entry_5">Shorts</string>
|
||||||
<string name="revanced_start_page_entry_6">Library</string>
|
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (library) tab. -->
|
||||||
|
<string name="revanced_start_page_entry_6">You tab</string>
|
||||||
<string name="revanced_start_page_entry_7">Liked videos</string>
|
<string name="revanced_start_page_entry_7">Liked videos</string>
|
||||||
|
<!-- 'History' should be translated using the same localized wording YouTube displays for the 'history' section in the 'You' tab. -->
|
||||||
<string name="revanced_start_page_entry_8">History</string>
|
<string name="revanced_start_page_entry_8">History</string>
|
||||||
<string name="revanced_start_page_entry_9">Trending</string>
|
<string name="revanced_start_page_entry_9">Trending</string>
|
||||||
</patch>
|
</patch>
|
||||||
@@ -823,7 +917,6 @@
|
|||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.tablet.EnableTabletLayoutPatch">
|
<patch id="layout.tablet.EnableTabletLayoutPatch">
|
||||||
<string name="revanced_tablet_layout_title">Enable tablet layout</string>
|
<string name="revanced_tablet_layout_title">Enable tablet layout</string>
|
||||||
<string name="layout_summary">Settings related to the layout</string>
|
|
||||||
<string name="revanced_tablet_layout_summary_on">Tablet layout is enabled</string>
|
<string name="revanced_tablet_layout_summary_on">Tablet layout is enabled</string>
|
||||||
<string name="revanced_tablet_layout_summary_off">Tablet layout is disabled</string>
|
<string name="revanced_tablet_layout_summary_off">Tablet layout is disabled</string>
|
||||||
<string name="revanced_tablet_layout_user_dialog_message">Community posts do not show up on tablet layouts</string>
|
<string name="revanced_tablet_layout_user_dialog_message">Community posts do not show up on tablet layouts</string>
|
||||||
@@ -847,9 +940,12 @@
|
|||||||
<string name="revanced_seekbar_custom_color_invalid">Invalid seekbar color value. Using default value.</string>
|
<string name="revanced_seekbar_custom_color_invalid">Invalid seekbar color value. Using default value.</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="layout.thumbnails.AlternativeThumbnailsPatch">
|
<patch id="layout.thumbnails.AlternativeThumbnailsPatch">
|
||||||
|
<!-- 'Home' should be translated using the same localized wording YouTube displays for the home tab. -->
|
||||||
<string name="revanced_alt_thumbnail_home_title">Home tab</string>
|
<string name="revanced_alt_thumbnail_home_title">Home tab</string>
|
||||||
|
<!-- 'Subscription' should be translated using the same localized wording YouTube displays for the subscription tab. -->
|
||||||
<string name="revanced_alt_thumbnail_subscription_title">Subscription tab</string>
|
<string name="revanced_alt_thumbnail_subscription_title">Subscription tab</string>
|
||||||
<string name="revanced_alt_thumbnail_library_title">\'You\' tab</string>
|
<!-- 'You' should be translated using the same localized wording YouTube displays for the You (library) tab. -->
|
||||||
|
<string name="revanced_alt_thumbnail_library_title">You tab</string>
|
||||||
<string name="revanced_alt_thumbnail_player_title">Player playlists, recommendations</string>
|
<string name="revanced_alt_thumbnail_player_title">Player playlists, recommendations</string>
|
||||||
<string name="revanced_alt_thumbnail_search_title">Search results</string>
|
<string name="revanced_alt_thumbnail_search_title">Search results</string>
|
||||||
<string name="revanced_alt_thumbnail_options_entry_1">Original thumbnails</string>
|
<string name="revanced_alt_thumbnail_options_entry_1">Original thumbnails</string>
|
||||||
@@ -872,6 +968,7 @@
|
|||||||
<string name="revanced_alt_thumbnail_stills_time_entry_1">Beginning of video</string>
|
<string name="revanced_alt_thumbnail_stills_time_entry_1">Beginning of video</string>
|
||||||
<string name="revanced_alt_thumbnail_stills_time_entry_2">Middle of video</string>
|
<string name="revanced_alt_thumbnail_stills_time_entry_2">Middle of video</string>
|
||||||
<string name="revanced_alt_thumbnail_stills_time_entry_3">End of video</string>
|
<string name="revanced_alt_thumbnail_stills_time_entry_3">End of video</string>
|
||||||
|
<!-- Translations of this should not be longer than the original English text, otherwise the text can be clipped and not entirely shown. -->
|
||||||
<string name="revanced_alt_thumbnail_dearrow_error">DeArrow temporarily not available (status code: %s)</string>
|
<string name="revanced_alt_thumbnail_dearrow_error">DeArrow temporarily not available (status code: %s)</string>
|
||||||
<string name="revanced_alt_thumbnail_dearrow_error_generic">DeArrow temporarily not available</string>
|
<string name="revanced_alt_thumbnail_dearrow_error_generic">DeArrow temporarily not available</string>
|
||||||
</patch>
|
</patch>
|
||||||
@@ -881,6 +978,7 @@
|
|||||||
<string name="revanced_announcements_summary_off">Announcements are not shown on startup</string>
|
<string name="revanced_announcements_summary_off">Announcements are not shown on startup</string>
|
||||||
<string name="revanced_announcements_enabled_summary">Show announcements on startup</string>
|
<string name="revanced_announcements_enabled_summary">Show announcements on startup</string>
|
||||||
<string name="revanced_announcements_connection_failed">Failed connecting to announcements provider</string>
|
<string name="revanced_announcements_connection_failed">Failed connecting to announcements provider</string>
|
||||||
|
<string name="revanced_announcements_dialog_dismiss">Dismiss</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="misc.autorepeat.AutoRepeatPatch">
|
<patch id="misc.autorepeat.AutoRepeatPatch">
|
||||||
<string name="revanced_auto_repeat_title">Enable auto-repeat</string>
|
<string name="revanced_auto_repeat_title">Enable auto-repeat</string>
|
||||||
@@ -892,22 +990,6 @@
|
|||||||
<string name="revanced_spoof_device_dimensions_summary_on">Device dimensions spoofed</string>
|
<string name="revanced_spoof_device_dimensions_summary_on">Device dimensions spoofed</string>
|
||||||
<string name="revanced_spoof_device_dimensions_summary_off">Device dimensions not spoofed\n\nSpoofing the device dimensions can unlock higher video qualities but unknown side effects may occur</string>
|
<string name="revanced_spoof_device_dimensions_summary_off">Device dimensions not spoofed\n\nSpoofing the device dimensions can unlock higher video qualities but unknown side effects may occur</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
|
||||||
<string name="revanced_spoof_signature_verification_screen_title">Spoof app signature</string>
|
|
||||||
<string name="revanced_spoof_signature_verification_screen_summary">Spoof the app signature to prevent playback issues</string>
|
|
||||||
<string name="revanced_spoof_signature_verification_enabled_title">Spoof app signature</string>
|
|
||||||
<string name="revanced_spoof_signature_verification_enabled_summary_on">App signature spoofed\n\nSide effects include:\n• Enhanced bitrate is not available\n• Videos cannot be downloaded\n• No seekbar thumbnails for paid videos</string>
|
|
||||||
<string name="revanced_spoof_signature_verification_enabled_summary_off">App signature not spoofed\n\nVideo playback may not work</string>
|
|
||||||
<string name="revanced_spoof_signature_verification_enabled_user_dialog_message">Turning off this setting will cause video playback issues.</string>
|
|
||||||
<string name="revanced_spoof_signature_in_feed_enabled_title">Spoof app signature in feed</string>
|
|
||||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_on">App signature spoofed\n\nSide effects include:\n• Feed videos are missing subtitles\n• Automatically played feed videos will show up in your watch history</string>
|
|
||||||
<string name="revanced_spoof_signature_in_feed_enabled_summary_off">App signature not spoofed for feed videos\n\nFeed videos will play for less than 1 minute before encountering playback issues</string>
|
|
||||||
<string name="revanced_spoof_storyboard_title">Spoof storyboard</string>
|
|
||||||
<string name="revanced_spoof_storyboard_summary_on">Storyboard spoofed</string>
|
|
||||||
<string name="revanced_spoof_storyboard_summary_off">Storyboard not spoofed\n\nSide effects include:\n• No ambient mode\n• Seekbar thumbnails are hidden</string>
|
|
||||||
<string name="revanced_spoof_storyboard_timeout">Spoof storyboard temporarily not available (API timed out)</string>
|
|
||||||
<string name="revanced_spoof_storyboard_io_exception">Spoof storyboard temporarily not available: %s</string>
|
|
||||||
</patch>
|
|
||||||
<patch id="misc.gms.GmsCoreSupportResourcePatch">
|
<patch id="misc.gms.GmsCoreSupportResourcePatch">
|
||||||
<string name="microg_settings_title">GmsCore Settings</string>
|
<string name="microg_settings_title">GmsCore Settings</string>
|
||||||
<string name="microg_settings_summary">Settings for GmsCore</string>
|
<string name="microg_settings_summary">Settings for GmsCore</string>
|
||||||
@@ -936,11 +1018,6 @@
|
|||||||
<string name="revanced_disable_zoom_haptics_summary_on">Haptics are disabled</string>
|
<string name="revanced_disable_zoom_haptics_summary_on">Haptics are disabled</string>
|
||||||
<string name="revanced_disable_zoom_haptics_summary_off">Haptics are enabled</string>
|
<string name="revanced_disable_zoom_haptics_summary_off">Haptics are enabled</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
|
||||||
<string name="revanced_hdr_auto_brightness_title">Enable auto HDR brightness</string>
|
|
||||||
<string name="revanced_hdr_auto_brightness_summary_on">Auto HDR brightness is enabled</string>
|
|
||||||
<string name="revanced_hdr_auto_brightness_summary_off">Auto HDR brightness is disabled</string>
|
|
||||||
</patch>
|
|
||||||
<patch id="video.quality.RememberVideoQualityPatch">
|
<patch id="video.quality.RememberVideoQualityPatch">
|
||||||
<string name="revanced_video_quality_default_entry_1">Automatic quality</string>
|
<string name="revanced_video_quality_default_entry_1">Automatic quality</string>
|
||||||
<string name="revanced_video_quality_default_entry_2">2160p</string>
|
<string name="revanced_video_quality_default_entry_2">2160p</string>
|
||||||
@@ -958,12 +1035,12 @@
|
|||||||
<string name="revanced_video_quality_default_mobile_title">Default video quality on mobile network</string>
|
<string name="revanced_video_quality_default_mobile_title">Default video quality on mobile network</string>
|
||||||
<string name="revanced_remember_video_quality_mobile">mobile</string>
|
<string name="revanced_remember_video_quality_mobile">mobile</string>
|
||||||
<string name="revanced_remember_video_quality_wifi">wifi</string>
|
<string name="revanced_remember_video_quality_wifi">wifi</string>
|
||||||
<string name="revanced_remember_video_quality_toast" formatted="false">Changed default %s quality to: %s</string>
|
<string name="revanced_remember_video_quality_toast">Changed default %1$s quality to: %2$s</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="video.speed.custom.CustomPlaybackSpeedPatch">
|
<patch id="video.speed.custom.CustomPlaybackSpeedPatch">
|
||||||
<string name="revanced_custom_playback_speeds_title">Custom playback speeds</string>
|
<string name="revanced_custom_playback_speeds_title">Custom playback speeds</string>
|
||||||
<string name="revanced_custom_playback_speeds_summary">Add or change the available playback speeds</string>
|
<string name="revanced_custom_playback_speeds_summary">Add or change the available playback speeds</string>
|
||||||
<string name="revanced_custom_playback_speeds_invalid" formatted="false">Custom speeds must be less than %s Using default values.</string>
|
<string name="revanced_custom_playback_speeds_invalid">Custom speeds must be less than %s. Using default values.</string>
|
||||||
<string name="revanced_custom_playback_speeds_parse_exception">Invalid custom playback speeds. Using default values.</string>
|
<string name="revanced_custom_playback_speeds_parse_exception">Invalid custom playback speeds. Using default values.</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="video.speed.remember.RememberPlaybackSpeedPatch">
|
<patch id="video.speed.remember.RememberPlaybackSpeedPatch">
|
||||||
@@ -971,7 +1048,7 @@
|
|||||||
<string name="revanced_remember_playback_speed_last_selected_summary_on">Playback speed changes apply to all videos</string>
|
<string name="revanced_remember_playback_speed_last_selected_summary_on">Playback speed changes apply to all videos</string>
|
||||||
<string name="revanced_remember_playback_speed_last_selected_summary_off">Playback speed changes only apply to the current video</string>
|
<string name="revanced_remember_playback_speed_last_selected_summary_off">Playback speed changes only apply to the current video</string>
|
||||||
<string name="revanced_playback_speed_default_title">Default playback speed</string>
|
<string name="revanced_playback_speed_default_title">Default playback speed</string>
|
||||||
<string name="revanced_remember_playback_speed_toast" formatted="false">Changed default speed to: %s</string>
|
<string name="revanced_remember_playback_speed_toast">Changed default speed to: %s</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="video.videoqualitymenu.RestoreOldVideoQualityMenuResourcePatch">
|
<patch id="video.videoqualitymenu.RestoreOldVideoQualityMenuResourcePatch">
|
||||||
<string name="revanced_restore_old_video_quality_menu_title">Restore old video quality menu</string>
|
<string name="revanced_restore_old_video_quality_menu_title">Restore old video quality menu</string>
|
||||||
@@ -983,6 +1060,29 @@
|
|||||||
<string name="revanced_slide_to_seek_summary_on">Slide to seek is enabled</string>
|
<string name="revanced_slide_to_seek_summary_on">Slide to seek is enabled</string>
|
||||||
<string name="revanced_slide_to_seek_summary_off">Slide to seek is not enabled</string>
|
<string name="revanced_slide_to_seek_summary_off">Slide to seek is not enabled</string>
|
||||||
</patch>
|
</patch>
|
||||||
|
<!-- This patch is no longer used, these strings are not in use, and these strings will be deleted in the future. -->
|
||||||
|
<patch id="misc.fix.playback.SpoofSignaturePatch">
|
||||||
|
<string name="revanced_spoof_signature_verification_screen_title">Spoof app signature</string>
|
||||||
|
<string name="revanced_spoof_signature_verification_screen_summary">Spoof the app signature to prevent playback issues</string>
|
||||||
|
<string name="revanced_spoof_signature_verification_enabled_title">Spoof app signature</string>
|
||||||
|
<string name="revanced_spoof_signature_verification_enabled_summary_on">App signature spoofed\n\nSide effects include:\n• Enhanced bitrate is not available\n• Videos cannot be downloaded\n• No seekbar thumbnails for paid videos</string>
|
||||||
|
<string name="revanced_spoof_signature_verification_enabled_summary_off">App signature not spoofed\n\nVideo playback may not work</string>
|
||||||
|
<string name="revanced_spoof_signature_verification_enabled_user_dialog_message">Turning off this setting will cause video playback issues.</string>
|
||||||
|
<string name="revanced_spoof_signature_in_feed_enabled_title">Spoof app signature in feed</string>
|
||||||
|
<string name="revanced_spoof_signature_in_feed_enabled_summary_on">App signature spoofed\n\nSide effects include:\n• Feed videos are missing subtitles\n• Automatically played feed videos will show up in your watch history</string>
|
||||||
|
<string name="revanced_spoof_signature_in_feed_enabled_summary_off">App signature not spoofed for feed videos\n\nFeed videos will play for less than 1 minute before encountering playback issues</string>
|
||||||
|
<string name="revanced_spoof_storyboard_title">Spoof storyboard</string>
|
||||||
|
<string name="revanced_spoof_storyboard_summary_on">Storyboard spoofed</string>
|
||||||
|
<string name="revanced_spoof_storyboard_summary_off">Storyboard not spoofed\n\nSide effects include:\n• No ambient mode\n• Seekbar thumbnails are hidden</string>
|
||||||
|
<string name="revanced_spoof_storyboard_timeout">Spoof storyboard temporarily not available (API timed out)</string>
|
||||||
|
<string name="revanced_spoof_storyboard_io_exception">Spoof storyboard temporarily not available: %s</string>
|
||||||
|
</patch>
|
||||||
|
<!-- This patch is no longer used and these strings will soon be deleted. -->
|
||||||
|
<patch id="video.hdrbrightness.HDRBrightnessPatch">
|
||||||
|
<string name="revanced_hdr_auto_brightness_title">Enable auto HDR brightness</string>
|
||||||
|
<string name="revanced_hdr_auto_brightness_summary_on">Auto HDR brightness is enabled</string>
|
||||||
|
<string name="revanced_hdr_auto_brightness_summary_off">Auto HDR brightness is disabled</string>
|
||||||
|
</patch>
|
||||||
</app>
|
</app>
|
||||||
<app id="twitch">
|
<app id="twitch">
|
||||||
<patch id="ad.audio.AudioAdsPatch">
|
<patch id="ad.audio.AudioAdsPatch">
|
||||||
@@ -1016,6 +1116,7 @@
|
|||||||
<string name="revanced_auto_claim_channel_points_summary_off">Channel Points are not claimed automatically</string>
|
<string name="revanced_auto_claim_channel_points_summary_off">Channel Points are not claimed automatically</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="debug.DebugModePatch">
|
<patch id="debug.DebugModePatch">
|
||||||
|
<!-- Twitch specific internal debug mode, and not the same as 'revanced_debug_title' -->
|
||||||
<string name="revanced_twitch_debug_mode_title">Enable Twitch debug mode</string>
|
<string name="revanced_twitch_debug_mode_title">Enable Twitch debug mode</string>
|
||||||
<string name="revanced_twitch_debug_mode_summary_on">Twitch debug mode is enabled (not recommended)</string>
|
<string name="revanced_twitch_debug_mode_summary_on">Twitch debug mode is enabled (not recommended)</string>
|
||||||
<string name="revanced_twitch_debug_mode_summary_off">Twitch debug mode is disabled</string>
|
<string name="revanced_twitch_debug_mode_summary_off">Twitch debug mode is disabled</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user