mirror of
https://github.com/revanced/revanced-patches.git
synced 2025-12-14 13:21:02 +01:00
Compare commits
11 Commits
v4.10.0-de
...
v4.10.0-de
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
550ac09e32 | ||
|
|
e2409213d4 | ||
|
|
a8b14d560f | ||
|
|
d5c0b5ed65 | ||
|
|
343fdec796 | ||
|
|
2ea583c220 | ||
|
|
8dda8988ef | ||
|
|
b575fc68ff | ||
|
|
c979e92676 | ||
|
|
b78b7cfe6c | ||
|
|
4919cba478 |
36
CHANGELOG.md
36
CHANGELOG.md
@@ -1,3 +1,39 @@
|
|||||||
|
# [4.10.0-dev.6](https://github.com/ReVanced/revanced-patches/compare/v4.10.0-dev.5...v4.10.0-dev.6) (2024-06-09)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **YouTube - Comments:** Add `Hide Thanks button` and `Hide 'Comments by members' header` options ([#3317](https://github.com/ReVanced/revanced-patches/issues/3317)) ([9c4c4f0](https://github.com/ReVanced/revanced-patches/commit/9c4c4f05a762d745404101bbc3925ab4eba2deb8))
|
||||||
|
|
||||||
|
# [4.10.0-dev.5](https://github.com/ReVanced/revanced-patches/compare/v4.10.0-dev.4...v4.10.0-dev.5) (2024-06-09)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube - Client spoof:** Correctly play more livestreams using Android VR ([#3316](https://github.com/ReVanced/revanced-patches/issues/3316)) ([c05264a](https://github.com/ReVanced/revanced-patches/commit/c05264af3944cbfe8d9aa34fb0e0fddb05a1d42f))
|
||||||
|
|
||||||
|
# [4.10.0-dev.4](https://github.com/ReVanced/revanced-patches/compare/v4.10.0-dev.3...v4.10.0-dev.4) (2024-06-08)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **Boost for Reddit:** Add `Fix audio missing in video downloads` patch ([#3287](https://github.com/ReVanced/revanced-patches/issues/3287)) ([a9258d4](https://github.com/ReVanced/revanced-patches/commit/a9258d48d3ddf8552ab56219677a3b31ee553666))
|
||||||
|
|
||||||
|
# [4.10.0-dev.3](https://github.com/ReVanced/revanced-patches/compare/v4.10.0-dev.2...v4.10.0-dev.3) (2024-06-08)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* **Boost For Reddit:** Add `Fix /s/ links` patch ([#3154](https://github.com/ReVanced/revanced-patches/issues/3154)) ([5fa9fd2](https://github.com/ReVanced/revanced-patches/commit/5fa9fd2dfef43838d7311a967a3e805256a5d116))
|
||||||
|
|
||||||
|
# [4.10.0-dev.2](https://github.com/ReVanced/revanced-patches/compare/v4.10.0-dev.1...v4.10.0-dev.2) (2024-06-08)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* **YouTube Music:** Rename `Minimized playback` to `Remove background playback restrictions` ([#3315](https://github.com/ReVanced/revanced-patches/issues/3315)) ([3c31e55](https://github.com/ReVanced/revanced-patches/commit/3c31e55b13d9495e857f068f8cd2b4320112d763))
|
||||||
|
* **YouTube:** Rename `Minimized playback` to `Remove background playback restrictions` ([#3314](https://github.com/ReVanced/revanced-patches/issues/3314)) ([37d415b](https://github.com/ReVanced/revanced-patches/commit/37d415b53af4771d9c97a8b1c153be32bf3ac2e0))
|
||||||
|
|
||||||
# [4.10.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.9.0...v4.10.0-dev.1) (2024-06-07)
|
# [4.10.0-dev.1](https://github.com/ReVanced/revanced-patches/compare/v4.9.0...v4.10.0-dev.1) (2024-06-07)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -403,6 +403,12 @@ public final class app/revanced/patches/music/misc/androidauto/BypassCertificate
|
|||||||
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/music/misc/backgroundplayback/BackgroundPlaybackPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||||
|
public static final field INSTANCE Lapp/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatch;
|
||||||
|
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/music/misc/gms/Constants {
|
public final class app/revanced/patches/music/misc/gms/Constants {
|
||||||
public static final field INSTANCE Lapp/revanced/patches/music/misc/gms/Constants;
|
public static final field INSTANCE Lapp/revanced/patches/music/misc/gms/Constants;
|
||||||
}
|
}
|
||||||
@@ -529,6 +535,18 @@ public final class app/revanced/patches/reddit/ad/general/HideAdsPatch : app/rev
|
|||||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public abstract class app/revanced/patches/reddit/customclients/BaseFixSLinksPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||||
|
public fun <init> (Lapp/revanced/patcher/fingerprint/MethodFingerprint;Lapp/revanced/patcher/fingerprint/MethodFingerprint;Ljava/util/Set;Ljava/util/Set;)V
|
||||||
|
public synthetic fun <init> (Lapp/revanced/patcher/fingerprint/MethodFingerprint;Lapp/revanced/patcher/fingerprint/MethodFingerprint;Ljava/util/Set;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||||
|
public fun execute (Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||||
|
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||||
|
protected abstract fun getIntegrationsClassDescriptor ()Ljava/lang/String;
|
||||||
|
protected final fun getResolveSLinkMethod ()Ljava/lang/String;
|
||||||
|
protected final fun getSetAccessTokenMethod ()Ljava/lang/String;
|
||||||
|
protected abstract fun patchNavigationHandler (Lapp/revanced/patcher/fingerprint/MethodFingerprintResult;Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||||
|
protected abstract fun patchSetAccessToken (Lapp/revanced/patcher/fingerprint/MethodFingerprintResult;Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||||
|
}
|
||||||
|
|
||||||
public abstract class app/revanced/patches/reddit/customclients/BaseSpoofClientPatch : app/revanced/patcher/patch/BytecodePatch {
|
public abstract class app/revanced/patches/reddit/customclients/BaseSpoofClientPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||||
public fun <init> (Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;)V
|
public fun <init> (Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;)V
|
||||||
public synthetic fun <init> (Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
public synthetic fun <init> (Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||||
@@ -564,6 +582,20 @@ public final class app/revanced/patches/reddit/customclients/boostforreddit/api/
|
|||||||
public fun patchUserAgent (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V
|
public fun patchUserAgent (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||||
|
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch;
|
||||||
|
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/reddit/customclients/boostforreddit/fix/slink/FixSLinksPatch : app/revanced/patches/reddit/customclients/BaseFixSLinksPatch {
|
||||||
|
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/boostforreddit/fix/slink/FixSLinksPatch;
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class app/revanced/patches/reddit/customclients/boostforreddit/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch {
|
||||||
|
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/boostforreddit/misc/integrations/IntegrationsPatch;
|
||||||
|
}
|
||||||
|
|
||||||
public final class app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/BaseSpoofClientPatch {
|
public final class app/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch : app/revanced/patches/reddit/customclients/BaseSpoofClientPatch {
|
||||||
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch;
|
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/infinityforreddit/api/SpoofClientPatch;
|
||||||
public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V
|
public fun patchClientId (Ljava/util/Set;Lapp/revanced/patcher/data/BytecodeContext;)V
|
||||||
@@ -642,10 +674,12 @@ public final class app/revanced/patches/reddit/customclients/syncforreddit/detec
|
|||||||
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/reddit/customclients/syncforreddit/fix/slink/FixSLinksPatch : app/revanced/patcher/patch/BytecodePatch {
|
public final class app/revanced/patches/reddit/customclients/syncforreddit/fix/slink/FixSLinksPatch : app/revanced/patches/reddit/customclients/BaseFixSLinksPatch {
|
||||||
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/syncforreddit/fix/slink/FixSLinksPatch;
|
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/syncforreddit/fix/slink/FixSLinksPatch;
|
||||||
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/reddit/customclients/syncforreddit/misc/integrations/IntegrationsPatch : app/revanced/patches/shared/misc/integrations/BaseIntegrationsPatch {
|
||||||
|
public static final field INSTANCE Lapp/revanced/patches/reddit/customclients/syncforreddit/misc/integrations/IntegrationsPatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatch : app/revanced/patcher/patch/BytecodePatch {
|
public final class app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||||
@@ -1638,6 +1672,12 @@ public final class app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch
|
|||||||
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/youtube/misc/backgroundplayback/BackgroundPlaybackPatch : app/revanced/patcher/patch/BytecodePatch {
|
||||||
|
public static final field INSTANCE Lapp/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch;
|
||||||
|
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/youtube/misc/debugging/DebuggingPatch : app/revanced/patcher/patch/ResourcePatch {
|
public final class app/revanced/patches/youtube/misc/debugging/DebuggingPatch : app/revanced/patcher/patch/ResourcePatch {
|
||||||
public static final field INSTANCE Lapp/revanced/patches/youtube/misc/debugging/DebuggingPatch;
|
public static final field INSTANCE Lapp/revanced/patches/youtube/misc/debugging/DebuggingPatch;
|
||||||
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
public synthetic fun execute (Lapp/revanced/patcher/data/Context;)V
|
||||||
|
|||||||
@@ -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.10.0-dev.1
|
version = 4.10.0-dev.6
|
||||||
|
|||||||
@@ -1,50 +1,13 @@
|
|||||||
package app.revanced.patches.music.layout.minimizedplayback
|
package app.revanced.patches.music.layout.minimizedplayback
|
||||||
|
|
||||||
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.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
import app.revanced.patches.music.misc.backgroundplayback.BackgroundPlaybackPatch
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
|
||||||
import app.revanced.patches.music.layout.minimizedplayback.fingerprints.BackgroundPlaybackDisableFingerprint
|
|
||||||
import app.revanced.patches.music.layout.minimizedplayback.fingerprints.KidsMinimizedPlaybackPolicyControllerFingerprint
|
|
||||||
import app.revanced.util.exception
|
|
||||||
|
|
||||||
@Patch(
|
@Deprecated("This patch has been merged into BackgroundPlaybackPatch.")
|
||||||
name = "Minimized playback",
|
|
||||||
description = "Unlocks options for picture-in-picture and background playback.",
|
|
||||||
compatiblePackages = [
|
|
||||||
CompatiblePackage(
|
|
||||||
"com.google.android.apps.youtube.music",
|
|
||||||
[
|
|
||||||
"6.45.54",
|
|
||||||
"6.51.53",
|
|
||||||
"7.01.53",
|
|
||||||
"7.02.52",
|
|
||||||
"7.03.52",
|
|
||||||
]
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
@Suppress("unused")
|
|
||||||
object MinimizedPlaybackPatch : BytecodePatch(
|
object MinimizedPlaybackPatch : BytecodePatch(
|
||||||
setOf(
|
dependencies = setOf(BackgroundPlaybackPatch::class),
|
||||||
KidsMinimizedPlaybackPolicyControllerFingerprint,
|
|
||||||
BackgroundPlaybackDisableFingerprint,
|
|
||||||
),
|
|
||||||
) {
|
) {
|
||||||
override fun execute(context: BytecodeContext) {
|
override fun execute(context: BytecodeContext) {
|
||||||
KidsMinimizedPlaybackPolicyControllerFingerprint.result?.mutableMethod?.addInstruction(
|
|
||||||
0,
|
|
||||||
"return-void",
|
|
||||||
) ?: throw KidsMinimizedPlaybackPolicyControllerFingerprint.exception
|
|
||||||
|
|
||||||
BackgroundPlaybackDisableFingerprint.result?.mutableMethod?.addInstructions(
|
|
||||||
0,
|
|
||||||
"""
|
|
||||||
const/4 v0, 0x1
|
|
||||||
return v0
|
|
||||||
""",
|
|
||||||
) ?: throw BackgroundPlaybackDisableFingerprint.exception
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package app.revanced.patches.music.misc.backgroundplayback
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||||
|
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.music.misc.backgroundplayback.fingerprints.BackgroundPlaybackDisableFingerprint
|
||||||
|
import app.revanced.patches.music.misc.backgroundplayback.fingerprints.KidsBackgroundPlaybackPolicyControllerFingerprint
|
||||||
|
import app.revanced.util.resultOrThrow
|
||||||
|
|
||||||
|
@Patch(
|
||||||
|
name = "Remove background playback restrictions",
|
||||||
|
description = "Removes restrictions on background playback.",
|
||||||
|
compatiblePackages = [
|
||||||
|
CompatiblePackage(
|
||||||
|
"com.google.android.apps.youtube.music",
|
||||||
|
[
|
||||||
|
"6.45.54",
|
||||||
|
"6.51.53",
|
||||||
|
"7.01.53",
|
||||||
|
"7.02.52",
|
||||||
|
"7.03.52",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
@Suppress("unused")
|
||||||
|
object BackgroundPlaybackPatch : BytecodePatch(
|
||||||
|
setOf(
|
||||||
|
KidsBackgroundPlaybackPolicyControllerFingerprint,
|
||||||
|
BackgroundPlaybackDisableFingerprint,
|
||||||
|
),
|
||||||
|
) {
|
||||||
|
override fun execute(context: BytecodeContext) {
|
||||||
|
KidsBackgroundPlaybackPolicyControllerFingerprint.resultOrThrow().mutableMethod.addInstruction(
|
||||||
|
0,
|
||||||
|
"return-void",
|
||||||
|
)
|
||||||
|
|
||||||
|
BackgroundPlaybackDisableFingerprint.resultOrThrow().mutableMethod.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
const/4 v0, 0x1
|
||||||
|
return v0
|
||||||
|
""",
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package app.revanced.patches.music.layout.minimizedplayback.fingerprints
|
package app.revanced.patches.music.misc.backgroundplayback.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
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package app.revanced.patches.music.layout.minimizedplayback.fingerprints
|
package app.revanced.patches.music.misc.backgroundplayback.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
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
|
||||||
internal object KidsMinimizedPlaybackPolicyControllerFingerprint : MethodFingerprint(
|
internal object KidsBackgroundPlaybackPolicyControllerFingerprint : MethodFingerprint(
|
||||||
"V",
|
"V",
|
||||||
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
listOf("I", "L", "Z"),
|
listOf("I", "L", "Z"),
|
||||||
@@ -2,10 +2,11 @@ package app.revanced.patches.music.premium.backgroundplay
|
|||||||
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patches.music.layout.minimizedplayback.MinimizedPlaybackPatch
|
import app.revanced.patches.music.misc.backgroundplayback.BackgroundPlaybackPatch
|
||||||
@Deprecated("This patch has been merged into MinimizedPlaybackPatch.")
|
|
||||||
|
@Deprecated("This patch has been merged into BackgroundPlaybackPatch.")
|
||||||
object BackgroundPlayPatch : BytecodePatch(
|
object BackgroundPlayPatch : BytecodePatch(
|
||||||
dependencies = setOf(MinimizedPlaybackPatch::class),
|
dependencies = setOf(BackgroundPlaybackPatch::class),
|
||||||
) {
|
) {
|
||||||
override fun execute(context: BytecodeContext) {
|
override fun execute(context: BytecodeContext) {
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,49 @@
|
|||||||
|
package app.revanced.patches.reddit.customclients
|
||||||
|
|
||||||
|
import app.revanced.patcher.PatchClass
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprintResult
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.util.resultOrThrow
|
||||||
|
|
||||||
|
abstract class BaseFixSLinksPatch(
|
||||||
|
private val handleNavigationFingerprint: MethodFingerprint,
|
||||||
|
private val setAccessTokenFingerprint: MethodFingerprint,
|
||||||
|
compatiblePackages: Set<CompatiblePackage>,
|
||||||
|
dependencies: Set<PatchClass> = emptySet(),
|
||||||
|
) : BytecodePatch(
|
||||||
|
name = "Fix /s/ links",
|
||||||
|
fingerprints = setOf(handleNavigationFingerprint, setAccessTokenFingerprint),
|
||||||
|
compatiblePackages = compatiblePackages,
|
||||||
|
dependencies = dependencies,
|
||||||
|
) {
|
||||||
|
protected abstract val integrationsClassDescriptor: String
|
||||||
|
|
||||||
|
protected val resolveSLinkMethod =
|
||||||
|
"patchResolveSLink(Ljava/lang/String;)Z"
|
||||||
|
|
||||||
|
protected val setAccessTokenMethod =
|
||||||
|
"patchSetAccessToken(Ljava/lang/String;)V"
|
||||||
|
|
||||||
|
override fun execute(context: BytecodeContext) {
|
||||||
|
handleNavigationFingerprint.resultOrThrow().patchNavigationHandler(context)
|
||||||
|
setAccessTokenFingerprint.resultOrThrow().patchSetAccessToken(context)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Patch app's navigation handler to resolve /s/ links.
|
||||||
|
*
|
||||||
|
* @param context The current [BytecodeContext].
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected abstract fun MethodFingerprintResult.patchNavigationHandler(context: BytecodeContext)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Patch access token setup in app to resolve /s/ links with an access token
|
||||||
|
* in order to bypass API bans when making unauthorized requests.
|
||||||
|
*
|
||||||
|
* @param context The current [BytecodeContext].
|
||||||
|
*/
|
||||||
|
protected abstract fun MethodFingerprintResult.patchSetAccessToken(context: BytecodeContext)
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package app.revanced.patches.reddit.customclients.boostforreddit.fix.downloads
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction
|
||||||
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
|
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
||||||
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
|
import app.revanced.patches.reddit.customclients.boostforreddit.fix.downloads.fingerprints.DownloadAudioFingerprint
|
||||||
|
import app.revanced.util.resultOrThrow
|
||||||
|
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
|
||||||
|
|
||||||
|
@Patch(
|
||||||
|
name = "Fix missing audio in video downloads",
|
||||||
|
description = "Fixes audio missing in videos downloaded from v.redd.it.",
|
||||||
|
compatiblePackages = [CompatiblePackage("com.rubenmayayo.reddit")],
|
||||||
|
)
|
||||||
|
@Suppress("unused")
|
||||||
|
object FixAudioMissingInDownloadsPatch : BytecodePatch(
|
||||||
|
setOf(DownloadAudioFingerprint),
|
||||||
|
) {
|
||||||
|
private val endpointReplacements = mapOf(
|
||||||
|
"/DASH_audio.mp4" to "/DASH_AUDIO_128.mp4",
|
||||||
|
"/audio" to "/DASH_AUDIO_64.mp4",
|
||||||
|
)
|
||||||
|
override fun execute(context: BytecodeContext) {
|
||||||
|
DownloadAudioFingerprint.resultOrThrow().let { result ->
|
||||||
|
result.scanResult.stringsScanResult!!.matches.take(2).forEach { match ->
|
||||||
|
result.mutableMethod.apply {
|
||||||
|
val replacement = endpointReplacements[match.string]
|
||||||
|
val register = getInstruction<OneRegisterInstruction>(match.index).registerA
|
||||||
|
|
||||||
|
replaceInstruction(match.index, "const-string v$register, \"$replacement\"")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package app.revanced.patches.reddit.customclients.boostforreddit.fix.downloads.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
|
||||||
|
internal object DownloadAudioFingerprint : MethodFingerprint(
|
||||||
|
strings = setOf("/DASH_audio.mp4", "/audio", "v.redd.it", "/"),
|
||||||
|
)
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package app.revanced.patches.reddit.customclients.boostforreddit.fix.slink
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprintResult
|
||||||
|
import app.revanced.patcher.util.smali.ExternalLabel
|
||||||
|
import app.revanced.patches.reddit.customclients.BaseFixSLinksPatch
|
||||||
|
import app.revanced.patches.reddit.customclients.boostforreddit.fix.slink.fingerprints.GetOAuthAccessTokenFingerprint
|
||||||
|
import app.revanced.patches.reddit.customclients.boostforreddit.fix.slink.fingerprints.HandleNavigationFingerprint
|
||||||
|
import app.revanced.patches.reddit.customclients.boostforreddit.misc.integrations.IntegrationsPatch
|
||||||
|
|
||||||
|
@Suppress("unused")
|
||||||
|
object FixSLinksPatch : BaseFixSLinksPatch(
|
||||||
|
handleNavigationFingerprint = HandleNavigationFingerprint,
|
||||||
|
setAccessTokenFingerprint = GetOAuthAccessTokenFingerprint,
|
||||||
|
compatiblePackages = setOf(CompatiblePackage("com.rubenmayayo.reddit")),
|
||||||
|
dependencies = setOf(IntegrationsPatch::class),
|
||||||
|
) {
|
||||||
|
override val integrationsClassDescriptor = "Lapp/revanced/integrations/boostforreddit/FixSLinksPatch;"
|
||||||
|
|
||||||
|
override fun MethodFingerprintResult.patchNavigationHandler(context: BytecodeContext) {
|
||||||
|
mutableMethod.apply {
|
||||||
|
val urlRegister = "p1"
|
||||||
|
val tempRegister = "v1"
|
||||||
|
addInstructionsWithLabels(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
invoke-static { $urlRegister }, $integrationsClassDescriptor->$resolveSLinkMethod
|
||||||
|
move-result $tempRegister
|
||||||
|
if-eqz $tempRegister, :continue
|
||||||
|
return $tempRegister
|
||||||
|
""",
|
||||||
|
ExternalLabel("continue", getInstruction(0)),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun MethodFingerprintResult.patchSetAccessToken(context: BytecodeContext) = mutableMethod.addInstruction(
|
||||||
|
3,
|
||||||
|
"invoke-static { v0 }, $integrationsClassDescriptor->$setAccessTokenMethod",
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package app.revanced.patches.reddit.customclients.boostforreddit.fix.slink.fingerprints
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
internal object GetOAuthAccessTokenFingerprint : MethodFingerprint(
|
||||||
|
strings = listOf("access_token"),
|
||||||
|
accessFlags = AccessFlags.PUBLIC.value,
|
||||||
|
returnType = "Ljava/lang/String",
|
||||||
|
customFingerprint = { _, classDef -> classDef.type == "Lnet/dean/jraw/http/oauth/OAuthData;" },
|
||||||
|
)
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package app.revanced.patches.reddit.customclients.boostforreddit.fix.slink.fingerprints
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
|
||||||
|
internal object HandleNavigationFingerprint : MethodFingerprint(
|
||||||
|
strings = listOf(
|
||||||
|
"android.intent.action.SEARCH",
|
||||||
|
"subscription",
|
||||||
|
"sort",
|
||||||
|
"period",
|
||||||
|
"boostforreddit.com/themes",
|
||||||
|
),
|
||||||
|
)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package app.revanced.patches.reddit.customclients.boostforreddit.misc.integrations
|
||||||
|
|
||||||
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
|
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch
|
||||||
|
import app.revanced.patches.reddit.customclients.boostforreddit.misc.integrations.fingerprints.InitFingerprint
|
||||||
|
|
||||||
|
@Patch(requiresIntegrations = true)
|
||||||
|
object IntegrationsPatch : BaseIntegrationsPatch(
|
||||||
|
setOf(InitFingerprint)
|
||||||
|
)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package app.revanced.patches.reddit.customclients.boostforreddit.misc.integrations.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.extensions.or
|
||||||
|
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint
|
||||||
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
|
|
||||||
|
internal object InitFingerprint : IntegrationsFingerprint(
|
||||||
|
customFingerprint = { methodDef, _ -> methodDef.definingClass == "Lcom/rubenmayayo/reddit/MyApplication;" && methodDef.name == "onCreate" },
|
||||||
|
insertIndexResolver = { 1 } // Insert after call to super class.
|
||||||
|
)
|
||||||
@@ -1,32 +1,49 @@
|
|||||||
package app.revanced.patches.reddit.customclients.syncforreddit.fix.slink
|
package app.revanced.patches.reddit.customclients.syncforreddit.fix.slink
|
||||||
|
|
||||||
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.addInstruction
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels
|
||||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
import app.revanced.patcher.fingerprint.MethodFingerprintResult
|
||||||
|
import app.revanced.patcher.util.smali.ExternalLabel
|
||||||
|
import app.revanced.patches.reddit.customclients.BaseFixSLinksPatch
|
||||||
import app.revanced.patches.reddit.customclients.syncforreddit.fix.slink.fingerprints.LinkHelperOpenLinkFingerprint
|
import app.revanced.patches.reddit.customclients.syncforreddit.fix.slink.fingerprints.LinkHelperOpenLinkFingerprint
|
||||||
import app.revanced.util.exception
|
import app.revanced.patches.reddit.customclients.syncforreddit.fix.slink.fingerprints.SetAuthorizationHeaderFingerprint
|
||||||
|
import app.revanced.patches.reddit.customclients.syncforreddit.misc.integrations.IntegrationsPatch
|
||||||
|
|
||||||
@Patch(
|
@Suppress("unused")
|
||||||
name = "Fix /s/ links",
|
object FixSLinksPatch : BaseFixSLinksPatch(
|
||||||
description = "Fixes the issue where /s/ links do not work.",
|
handleNavigationFingerprint = LinkHelperOpenLinkFingerprint,
|
||||||
compatiblePackages = [
|
setAccessTokenFingerprint = SetAuthorizationHeaderFingerprint,
|
||||||
|
compatiblePackages = setOf(
|
||||||
CompatiblePackage("com.laurencedawson.reddit_sync"),
|
CompatiblePackage("com.laurencedawson.reddit_sync"),
|
||||||
CompatiblePackage("com.laurencedawson.reddit_sync.pro"),
|
CompatiblePackage("com.laurencedawson.reddit_sync.pro"),
|
||||||
CompatiblePackage("com.laurencedawson.reddit_sync.dev")
|
CompatiblePackage("com.laurencedawson.reddit_sync.dev"),
|
||||||
],
|
),
|
||||||
requiresIntegrations = true
|
dependencies = setOf(IntegrationsPatch::class),
|
||||||
)
|
|
||||||
object FixSLinksPatch : BytecodePatch(
|
|
||||||
setOf(LinkHelperOpenLinkFingerprint)
|
|
||||||
) {
|
) {
|
||||||
override fun execute(context: BytecodeContext) =
|
override val integrationsClassDescriptor = "Lapp/revanced/integrations/syncforreddit/FixSLinksPatch;"
|
||||||
LinkHelperOpenLinkFingerprint.result?.mutableMethod?.addInstructions(
|
|
||||||
1,
|
override fun MethodFingerprintResult.patchNavigationHandler(context: BytecodeContext) {
|
||||||
|
mutableMethod.apply {
|
||||||
|
val urlRegister = "p3"
|
||||||
|
val tempRegister = "v2"
|
||||||
|
|
||||||
|
addInstructionsWithLabels(
|
||||||
|
0,
|
||||||
"""
|
"""
|
||||||
invoke-static { p3 }, Lapp/revanced/integrations/syncforreddit/FixSLinksPatch;->resolveSLink(Ljava/lang/String;)Ljava/lang/String;
|
invoke-static { $urlRegister }, $integrationsClassDescriptor->$resolveSLinkMethod
|
||||||
move-result-object p3
|
move-result $tempRegister
|
||||||
"""
|
if-eqz $tempRegister, :continue
|
||||||
) ?: throw LinkHelperOpenLinkFingerprint.exception
|
return $tempRegister
|
||||||
|
""",
|
||||||
|
ExternalLabel("continue", getInstruction(0)),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun MethodFingerprintResult.patchSetAccessToken(context: BytecodeContext) = mutableMethod.addInstruction(
|
||||||
|
0,
|
||||||
|
"invoke-static { p0 }, $integrationsClassDescriptor->$setAccessTokenMethod",
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package app.revanced.patches.reddit.customclients.syncforreddit.fix.slink.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patcher.fingerprint.MethodFingerprint
|
||||||
|
|
||||||
|
internal object SetAuthorizationHeaderFingerprint : MethodFingerprint(
|
||||||
|
strings = listOf("Authorization", "bearer "),
|
||||||
|
returnType = "Ljava/util/HashMap;",
|
||||||
|
customFingerprint = { methodDef, _ -> methodDef.definingClass == "Lcom/laurencedawson/reddit_sync/singleton/a;" },
|
||||||
|
)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package app.revanced.patches.reddit.customclients.syncforreddit.misc.integrations
|
||||||
|
|
||||||
|
import app.revanced.patcher.patch.annotation.Patch
|
||||||
|
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch
|
||||||
|
import app.revanced.patches.reddit.customclients.syncforreddit.misc.integrations.fingerprints.InitFingerprint
|
||||||
|
|
||||||
|
@Patch(requiresIntegrations = true)
|
||||||
|
object IntegrationsPatch : BaseIntegrationsPatch(
|
||||||
|
setOf(InitFingerprint)
|
||||||
|
)
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
package app.revanced.patches.reddit.customclients.syncforreddit.misc.integrations.fingerprints
|
||||||
|
|
||||||
|
import app.revanced.patches.shared.misc.integrations.BaseIntegrationsPatch.IntegrationsFingerprint
|
||||||
|
|
||||||
|
internal object InitFingerprint : IntegrationsFingerprint(
|
||||||
|
customFingerprint = { methodDef, classDef ->
|
||||||
|
methodDef.name == "onCreate" && classDef.type == "Lcom/laurencedawson/reddit_sync/RedditApplication;"
|
||||||
|
},
|
||||||
|
insertIndexResolver = { 1 }, // Insert after call to super class.
|
||||||
|
)
|
||||||
@@ -62,9 +62,11 @@ object CommentsPatch : ResourcePatch() {
|
|||||||
PreferenceScreen(
|
PreferenceScreen(
|
||||||
"revanced_comments_screen",
|
"revanced_comments_screen",
|
||||||
preferences = setOf(
|
preferences = setOf(
|
||||||
SwitchPreference("revanced_hide_preview_comment"),
|
SwitchPreference("revanced_hide_comments_by_members_header"),
|
||||||
SwitchPreference("revanced_hide_comments_section"),
|
SwitchPreference("revanced_hide_comments_section"),
|
||||||
SwitchPreference("revanced_hide_comment_timestamp_and_emoji_buttons")
|
SwitchPreference("revanced_hide_comments_preview_comment"),
|
||||||
|
SwitchPreference("revanced_hide_comments_thanks_button"),
|
||||||
|
SwitchPreference("revanced_hide_comments_timestamp_and_emoji_buttons")
|
||||||
),
|
),
|
||||||
sorting = PreferenceScreen.Sorting.UNSORTED
|
sorting = PreferenceScreen.Sorting.UNSORTED
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -0,0 +1,112 @@
|
|||||||
|
package app.revanced.patches.youtube.misc.backgroundplayback
|
||||||
|
|
||||||
|
import app.revanced.patcher.data.BytecodeContext
|
||||||
|
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
|
||||||
|
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.patcher.util.proxy.mutableTypes.MutableMethod
|
||||||
|
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
||||||
|
import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference
|
||||||
|
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
||||||
|
import app.revanced.patches.youtube.misc.backgroundplayback.fingerprints.KidsBackgroundPlaybackPolicyControllerFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.backgroundplayback.fingerprints.BackgroundPlaybackManagerFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.backgroundplayback.fingerprints.BackgroundPlaybackSettingsFingerprint
|
||||||
|
import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch
|
||||||
|
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
||||||
|
import app.revanced.patches.youtube.video.information.VideoInformationPatch
|
||||||
|
import app.revanced.util.resultOrThrow
|
||||||
|
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
||||||
|
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
|
|
||||||
|
@Patch(
|
||||||
|
name = "Remove background playback restrictions",
|
||||||
|
description = "Removes restrictions on background playback, including playing kids videos in the background.",
|
||||||
|
dependencies = [
|
||||||
|
BackgroundPlaybackResourcePatch::class,
|
||||||
|
IntegrationsPatch::class,
|
||||||
|
PlayerTypeHookPatch::class,
|
||||||
|
VideoInformationPatch::class,
|
||||||
|
SettingsPatch::class,
|
||||||
|
AddResourcesPatch::class
|
||||||
|
],
|
||||||
|
compatiblePackages = [
|
||||||
|
CompatiblePackage(
|
||||||
|
"com.google.android.youtube",
|
||||||
|
[
|
||||||
|
"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.38",
|
||||||
|
"19.10.39",
|
||||||
|
"19.11.43",
|
||||||
|
"19.12.41",
|
||||||
|
"19.13.37",
|
||||||
|
"19.14.43",
|
||||||
|
"19.15.36",
|
||||||
|
"19.16.39",
|
||||||
|
]
|
||||||
|
)
|
||||||
|
]
|
||||||
|
)
|
||||||
|
@Suppress("unused")
|
||||||
|
object BackgroundPlaybackPatch : BytecodePatch(
|
||||||
|
setOf(
|
||||||
|
BackgroundPlaybackManagerFingerprint,
|
||||||
|
BackgroundPlaybackSettingsFingerprint,
|
||||||
|
KidsBackgroundPlaybackPolicyControllerFingerprint
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
||||||
|
"Lapp/revanced/integrations/youtube/patches/BackgroundPlaybackPatch;"
|
||||||
|
|
||||||
|
override fun execute(context: BytecodeContext) {
|
||||||
|
AddResourcesPatch(this::class)
|
||||||
|
|
||||||
|
SettingsPatch.PreferenceScreen.MISC.addPreferences(
|
||||||
|
NonInteractivePreference("revanced_background_playback")
|
||||||
|
)
|
||||||
|
|
||||||
|
BackgroundPlaybackManagerFingerprint.resultOrThrow().mutableMethod.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->playbackIsNotShort()Z
|
||||||
|
move-result v0
|
||||||
|
return v0
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
// Enable background playback option in YouTube settings
|
||||||
|
BackgroundPlaybackSettingsFingerprint.resultOrThrow().mutableMethod.apply {
|
||||||
|
val booleanCalls = implementation!!.instructions.withIndex()
|
||||||
|
.filter { ((it.value as? ReferenceInstruction)?.reference as? MethodReference)?.returnType == "Z" }
|
||||||
|
|
||||||
|
val settingsBooleanIndex = booleanCalls.elementAt(1).index
|
||||||
|
val settingsBooleanMethod =
|
||||||
|
context.toMethodWalker(this).nextMethod(settingsBooleanIndex, true).getMethod() as MutableMethod
|
||||||
|
|
||||||
|
settingsBooleanMethod.addInstructions(
|
||||||
|
0,
|
||||||
|
"""
|
||||||
|
invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->overrideBackgroundPlaybackAvailable()Z
|
||||||
|
move-result v0
|
||||||
|
return v0
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Force allowing background play for videos labeled for kids.
|
||||||
|
KidsBackgroundPlaybackPolicyControllerFingerprint.resultOrThrow().mutableMethod.addInstruction(
|
||||||
|
0,
|
||||||
|
"return-void"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package app.revanced.patches.youtube.misc.minimizedplayback
|
package app.revanced.patches.youtube.misc.backgroundplayback
|
||||||
|
|
||||||
import app.revanced.patcher.data.ResourceContext
|
import app.revanced.patcher.data.ResourceContext
|
||||||
import app.revanced.patcher.patch.ResourcePatch
|
import app.revanced.patcher.patch.ResourcePatch
|
||||||
@@ -8,7 +8,7 @@ import app.revanced.patches.shared.misc.mapping.ResourceMappingPatch
|
|||||||
@Patch(
|
@Patch(
|
||||||
dependencies = [ResourceMappingPatch::class],
|
dependencies = [ResourceMappingPatch::class],
|
||||||
)
|
)
|
||||||
internal object MinimizedPlaybackResourcePatch : ResourcePatch() {
|
internal object BackgroundPlaybackResourcePatch : ResourcePatch() {
|
||||||
internal var prefBackgroundAndOfflineCategoryId: Long = -1
|
internal var prefBackgroundAndOfflineCategoryId: Long = -1
|
||||||
|
|
||||||
override fun execute(context: ResourceContext) {
|
override fun execute(context: ResourceContext) {
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package app.revanced.patches.youtube.misc.minimizedplayback.fingerprints
|
package app.revanced.patches.youtube.misc.backgroundplayback.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
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
|
||||||
internal object MinimizedPlaybackManagerFingerprint : MethodFingerprint(
|
internal object BackgroundPlaybackManagerFingerprint : MethodFingerprint(
|
||||||
"Z",
|
"Z",
|
||||||
AccessFlags.PUBLIC or AccessFlags.STATIC,
|
AccessFlags.PUBLIC or AccessFlags.STATIC,
|
||||||
listOf("L"),
|
listOf("L"),
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
package app.revanced.patches.youtube.misc.minimizedplayback.fingerprints
|
package app.revanced.patches.youtube.misc.backgroundplayback.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patches.youtube.misc.minimizedplayback.MinimizedPlaybackResourcePatch
|
import app.revanced.patches.youtube.misc.backgroundplayback.BackgroundPlaybackResourcePatch
|
||||||
import app.revanced.util.patch.LiteralValueFingerprint
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
|
|
||||||
internal object MinimizedPlaybackSettingsFingerprint : LiteralValueFingerprint(
|
internal object BackgroundPlaybackSettingsFingerprint : LiteralValueFingerprint(
|
||||||
returnType = "Ljava/lang/String;",
|
returnType = "Ljava/lang/String;",
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
parameters = listOf(),
|
parameters = listOf(),
|
||||||
@@ -19,5 +19,5 @@ internal object MinimizedPlaybackSettingsFingerprint : LiteralValueFingerprint(
|
|||||||
Opcode.IF_NEZ,
|
Opcode.IF_NEZ,
|
||||||
Opcode.GOTO
|
Opcode.GOTO
|
||||||
),
|
),
|
||||||
literalSupplier = { MinimizedPlaybackResourcePatch.prefBackgroundAndOfflineCategoryId }
|
literalSupplier = { BackgroundPlaybackResourcePatch.prefBackgroundAndOfflineCategoryId }
|
||||||
)
|
)
|
||||||
@@ -1,12 +1,11 @@
|
|||||||
package app.revanced.patches.youtube.misc.minimizedplayback.fingerprints
|
package app.revanced.patches.youtube.misc.backgroundplayback.fingerprints
|
||||||
|
|
||||||
import app.revanced.patcher.extensions.or
|
import app.revanced.patcher.extensions.or
|
||||||
import app.revanced.patcher.fingerprint.MethodFingerprint
|
import app.revanced.util.patch.LiteralValueFingerprint
|
||||||
import com.android.tools.smali.dexlib2.AccessFlags
|
import com.android.tools.smali.dexlib2.AccessFlags
|
||||||
import com.android.tools.smali.dexlib2.Opcode
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction
|
|
||||||
|
|
||||||
internal object KidsMinimizedPlaybackPolicyControllerFingerprint : MethodFingerprint(
|
internal object KidsBackgroundPlaybackPolicyControllerFingerprint : LiteralValueFingerprint(
|
||||||
returnType = "V",
|
returnType = "V",
|
||||||
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
|
||||||
parameters = listOf("I", "L", "L"),
|
parameters = listOf("I", "L", "L"),
|
||||||
@@ -26,9 +25,5 @@ internal object KidsMinimizedPlaybackPolicyControllerFingerprint : MethodFingerp
|
|||||||
Opcode.INVOKE_VIRTUAL,
|
Opcode.INVOKE_VIRTUAL,
|
||||||
Opcode.RETURN_VOID
|
Opcode.RETURN_VOID
|
||||||
),
|
),
|
||||||
customFingerprint = { methodDef, _ ->
|
literalSupplier = { 5 },
|
||||||
methodDef.implementation!!.instructions.any {
|
|
||||||
((it as? NarrowLiteralInstruction)?.narrowLiteral == 5)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
@@ -8,11 +8,14 @@ import app.revanced.patches.all.misc.transformation.IMethodCall
|
|||||||
import app.revanced.patches.all.misc.transformation.Instruction35cInfo
|
import app.revanced.patches.all.misc.transformation.Instruction35cInfo
|
||||||
import app.revanced.patches.all.misc.transformation.filterMapInstruction35c
|
import app.revanced.patches.all.misc.transformation.filterMapInstruction35c
|
||||||
import app.revanced.util.getReference
|
import app.revanced.util.getReference
|
||||||
|
import app.revanced.util.indexOfFirstInstruction
|
||||||
|
import com.android.tools.smali.dexlib2.Opcode
|
||||||
import com.android.tools.smali.dexlib2.iface.ClassDef
|
import com.android.tools.smali.dexlib2.iface.ClassDef
|
||||||
import com.android.tools.smali.dexlib2.iface.Method
|
import com.android.tools.smali.dexlib2.iface.Method
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.Instruction
|
import com.android.tools.smali.dexlib2.iface.instruction.Instruction
|
||||||
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.reference.MethodReference
|
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
||||||
|
import com.android.tools.smali.dexlib2.iface.reference.StringReference
|
||||||
|
|
||||||
object UserAgentClientSpoofPatch : BaseTransformInstructionsPatch<Instruction35cInfo>() {
|
object UserAgentClientSpoofPatch : BaseTransformInstructionsPatch<Instruction35cInfo>() {
|
||||||
private const val ORIGINAL_PACKAGE_NAME = "com.google.android.youtube"
|
private const val ORIGINAL_PACKAGE_NAME = "com.google.android.youtube"
|
||||||
@@ -42,20 +45,31 @@ object UserAgentClientSpoofPatch : BaseTransformInstructionsPatch<Instruction35c
|
|||||||
as? OneRegisterInstruction ?: return
|
as? OneRegisterInstruction ?: return
|
||||||
).registerA
|
).registerA
|
||||||
|
|
||||||
// IndexOutOfBoundsException is not possible here,
|
// IndexOutOfBoundsException is possible here,
|
||||||
// but no such occurrences are present in the app.
|
// but no such occurrences are present in the app.
|
||||||
val referee = getInstruction(instructionIndex + 2).getReference<MethodReference>()?.toString()
|
val referee = getInstruction(instructionIndex + 2).getReference<MethodReference>()?.toString()
|
||||||
|
|
||||||
// This can technically also match non-user agent string builder append methods,
|
// Only replace string builder usage.
|
||||||
// but no such occurrences are present in the app.
|
|
||||||
if (referee != USER_AGENT_STRING_BUILDER_APPEND_METHOD_REFERENCE) {
|
if (referee != USER_AGENT_STRING_BUILDER_APPEND_METHOD_REFERENCE) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Do not change the package name in methods that use resources, or for methods that use GmsCore.
|
||||||
|
// Changing these package names will result in playback limitations,
|
||||||
|
// particularly Android VR background audio only playback.
|
||||||
|
val resourceOrGmsStringInstructionIndex = indexOfFirstInstruction {
|
||||||
|
val reference = getReference<StringReference>()
|
||||||
|
opcode == Opcode.CONST_STRING &&
|
||||||
|
(reference?.string == "android.resource://" || reference?.string == "gcore_")
|
||||||
|
}
|
||||||
|
if (resourceOrGmsStringInstructionIndex >= 0) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// Overwrite the result of context.getPackageName() with the original package name.
|
// Overwrite the result of context.getPackageName() with the original package name.
|
||||||
replaceInstruction(
|
replaceInstruction(
|
||||||
instructionIndex + 1,
|
instructionIndex + 1,
|
||||||
"const-string v$targetRegister, \"${ORIGINAL_PACKAGE_NAME}\"",
|
"const-string v$targetRegister, \"$ORIGINAL_PACKAGE_NAME\"",
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,117 +1,11 @@
|
|||||||
package app.revanced.patches.youtube.misc.minimizedplayback
|
package app.revanced.patches.youtube.misc.minimizedplayback
|
||||||
|
|
||||||
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.patch.BytecodePatch
|
import app.revanced.patcher.patch.BytecodePatch
|
||||||
import app.revanced.patcher.patch.annotation.CompatiblePackage
|
import app.revanced.patches.youtube.misc.backgroundplayback.BackgroundPlaybackPatch
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
|
||||||
import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod
|
|
||||||
import app.revanced.patches.all.misc.resources.AddResourcesPatch
|
|
||||||
import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference
|
|
||||||
import app.revanced.patches.youtube.misc.integrations.IntegrationsPatch
|
|
||||||
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.KidsMinimizedPlaybackPolicyControllerFingerprint
|
|
||||||
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackManagerFingerprint
|
|
||||||
import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackSettingsFingerprint
|
|
||||||
import app.revanced.patches.youtube.misc.playertype.PlayerTypeHookPatch
|
|
||||||
import app.revanced.patches.youtube.misc.settings.SettingsPatch
|
|
||||||
import app.revanced.patches.youtube.video.information.VideoInformationPatch
|
|
||||||
import app.revanced.util.exception
|
|
||||||
import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction
|
|
||||||
import com.android.tools.smali.dexlib2.iface.reference.MethodReference
|
|
||||||
|
|
||||||
@Patch(
|
|
||||||
name = "Minimized playback",
|
|
||||||
description = "Unlocks options for picture-in-picture and background playback.",
|
|
||||||
dependencies = [
|
|
||||||
MinimizedPlaybackResourcePatch::class,
|
|
||||||
IntegrationsPatch::class,
|
|
||||||
PlayerTypeHookPatch::class,
|
|
||||||
VideoInformationPatch::class,
|
|
||||||
SettingsPatch::class,
|
|
||||||
AddResourcesPatch::class
|
|
||||||
],
|
|
||||||
compatiblePackages = [
|
|
||||||
CompatiblePackage(
|
|
||||||
"com.google.android.youtube",
|
|
||||||
[
|
|
||||||
"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.38",
|
|
||||||
"19.10.39",
|
|
||||||
"19.11.43",
|
|
||||||
"19.12.41",
|
|
||||||
"19.13.37",
|
|
||||||
"19.14.43",
|
|
||||||
"19.15.36",
|
|
||||||
"19.16.39",
|
|
||||||
]
|
|
||||||
)
|
|
||||||
]
|
|
||||||
)
|
|
||||||
@Suppress("unused")
|
|
||||||
object MinimizedPlaybackPatch : BytecodePatch(
|
|
||||||
setOf(
|
|
||||||
MinimizedPlaybackManagerFingerprint,
|
|
||||||
MinimizedPlaybackSettingsFingerprint,
|
|
||||||
KidsMinimizedPlaybackPolicyControllerFingerprint
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
private const val INTEGRATIONS_CLASS_DESCRIPTOR =
|
|
||||||
"Lapp/revanced/integrations/youtube/patches/MinimizedPlaybackPatch;"
|
|
||||||
|
|
||||||
|
@Deprecated("This patch class has been renamed to BackgroundPlaybackPatch.")
|
||||||
|
object MinimizedPlaybackPatch : BytecodePatch(dependencies = setOf(BackgroundPlaybackPatch::class)) {
|
||||||
override fun execute(context: BytecodeContext) {
|
override fun execute(context: BytecodeContext) {
|
||||||
AddResourcesPatch(this::class)
|
|
||||||
|
|
||||||
SettingsPatch.PreferenceScreen.MISC.addPreferences(
|
|
||||||
NonInteractivePreference("revanced_minimized_playback")
|
|
||||||
)
|
|
||||||
|
|
||||||
MinimizedPlaybackManagerFingerprint.result?.apply {
|
|
||||||
mutableMethod.addInstructions(
|
|
||||||
0,
|
|
||||||
"""
|
|
||||||
invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->playbackIsNotShort()Z
|
|
||||||
move-result v0
|
|
||||||
return v0
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
} ?: throw MinimizedPlaybackManagerFingerprint.exception
|
|
||||||
|
|
||||||
// Enable minimized playback option in YouTube settings
|
|
||||||
MinimizedPlaybackSettingsFingerprint.result?.apply {
|
|
||||||
val booleanCalls = method.implementation!!.instructions.withIndex()
|
|
||||||
.filter { ((it.value as? ReferenceInstruction)?.reference as? MethodReference)?.returnType == "Z" }
|
|
||||||
|
|
||||||
val settingsBooleanIndex = booleanCalls.elementAt(1).index
|
|
||||||
val settingsBooleanMethod =
|
|
||||||
context.toMethodWalker(method).nextMethod(settingsBooleanIndex, true).getMethod() as MutableMethod
|
|
||||||
|
|
||||||
settingsBooleanMethod.addInstructions(
|
|
||||||
0,
|
|
||||||
"""
|
|
||||||
invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->overrideMinimizedPlaybackAvailable()Z
|
|
||||||
move-result v0
|
|
||||||
return v0
|
|
||||||
"""
|
|
||||||
)
|
|
||||||
} ?: throw MinimizedPlaybackSettingsFingerprint.exception
|
|
||||||
|
|
||||||
// Force allowing background play for videos labeled for kids.
|
|
||||||
// Some regions and YouTube accounts do not require this patch.
|
|
||||||
KidsMinimizedPlaybackPolicyControllerFingerprint.result?.apply {
|
|
||||||
mutableMethod.addInstruction(
|
|
||||||
0,
|
|
||||||
"return-void"
|
|
||||||
)
|
|
||||||
} ?: throw KidsMinimizedPlaybackPolicyControllerFingerprint.exception
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -502,15 +502,21 @@
|
|||||||
<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_preview_comment_title">Hide preview comment</string>
|
<string name="revanced_hide_comments_by_members_header_title">Hide \'Comments by members\' header</string>
|
||||||
<string name="revanced_hide_preview_comment_summary_on">Preview comment is hidden</string>
|
<string name="revanced_hide_comments_by_members_header_summary_on">\'Comments by members\' header is hidden</string>
|
||||||
<string name="revanced_hide_preview_comment_summary_off">Preview comment is shown</string>
|
<string name="revanced_hide_comments_by_members_header_summary_off">\'Comments by members\' header is shown</string>
|
||||||
<string name="revanced_hide_comments_section_title">Hide comments section</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_on">Comments section is hidden</string>
|
||||||
<string name="revanced_hide_comments_section_summary_off">Comment section is shown</string>
|
<string name="revanced_hide_comments_section_summary_off">Comments section is shown</string>
|
||||||
<string name="revanced_hide_comment_timestamp_and_emoji_buttons_title">Hide timestamp and emoji buttons</string>
|
<string name="revanced_hide_comments_preview_comment_title">Hide preview comment</string>
|
||||||
<string name="revanced_hide_comment_timestamp_and_emoji_buttons_summary_on">Comment timestamp and emoji buttons are hidden</string>
|
<string name="revanced_hide_comments_preview_comment_summary_on">Preview comment is hidden</string>
|
||||||
<string name="revanced_hide_comment_timestamp_and_emoji_buttons_summary_off">Comment timestamp and emoji buttons are shown</string>
|
<string name="revanced_hide_comments_preview_comment_summary_off">Preview comment is shown</string>
|
||||||
|
<string name="revanced_hide_comments_thanks_button_title">Hide thanks button</string>
|
||||||
|
<string name="revanced_hide_comments_thanks_button_summary_on">Thanks button is hidden</string>
|
||||||
|
<string name="revanced_hide_comments_thanks_button_summary_off">Thanks button is shown</string>
|
||||||
|
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_title">Hide timestamp and emoji buttons</string>
|
||||||
|
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_summary_on">Timestamp and emoji buttons are hidden</string>
|
||||||
|
<string name="revanced_hide_comments_timestamp_and_emoji_buttons_summary_off">Timestamp and emoji buttons are 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>
|
||||||
@@ -1051,9 +1057,9 @@
|
|||||||
<string name="revanced_external_browser_summary_on">Opening links externally</string>
|
<string name="revanced_external_browser_summary_on">Opening links externally</string>
|
||||||
<string name="revanced_external_browser_summary_off">Opening links in app</string>
|
<string name="revanced_external_browser_summary_off">Opening links in app</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="misc.minimizedplayback.MinimizedPlaybackPatch">
|
<patch id="misc.backgroundplayback.BackgroundPlaybackPatch">
|
||||||
<string name="revanced_minimized_playback_title">Minimized playback</string>
|
<string name="revanced_background_playback_title">Background playback</string>
|
||||||
<string name="revanced_minimized_playback_summary">This setting can be found in Settings -> Background</string>
|
<string name="revanced_background_playback_summary">This setting can be found in Settings -> Background</string>
|
||||||
</patch>
|
</patch>
|
||||||
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
|
<patch id="misc.privacy.RemoveTrackingQueryParameterPatch">
|
||||||
<string name="revanced_remove_tracking_query_parameter_title">Remove tracking query parameter</string>
|
<string name="revanced_remove_tracking_query_parameter_title">Remove tracking query parameter</string>
|
||||||
|
|||||||
Reference in New Issue
Block a user