From 9ce734ffd7976084e5e17bda8c36cb0ad558af7f Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Sat, 2 Dec 2023 11:46:55 +0900 Subject: [PATCH] feat(YouTube): add compatibility for next year's release --- .../ads/general/GeneralAdsBytecodePatch.kt | 1 - .../NewSplashAnimationPatch.kt | 13 +++--- ...atchWhileActivityWithInFlagsFingerprint.kt | 3 +- ...tchWhileActivityWithOutFlagsFingerprint.kt | 3 +- .../swipe/controls/SwipeControlsPatch.kt | 12 ++--- .../WatchWhileActivityFingerprint.kt | 11 ----- .../DoubleBackToClosePatch.kt | 33 ++++++++------ .../fingerprint/OnBackPressedFingerprint.kt | 16 ------- .../mainactivity/MainActivityResolvePatch.kt | 44 +++++++++++++++++++ .../fingerprints/MainActivityFingerprint.kt | 17 +++++++ .../utils/microg/MicroGBytecodePatch.kt | 6 ++- .../utils/settings/SettingsBytecodePatch.kt | 8 ++-- 12 files changed, 104 insertions(+), 63 deletions(-) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/WatchWhileActivityFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/OnBackPressedFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/mainactivity/MainActivityResolvePatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/mainactivity/fingerprints/MainActivityFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/youtube/ads/general/GeneralAdsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ads/general/GeneralAdsBytecodePatch.kt index a7d49ae32..5e5220ef8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ads/general/GeneralAdsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ads/general/GeneralAdsBytecodePatch.kt @@ -41,6 +41,5 @@ object GeneralAdsBytecodePatch : BytecodePatch() { } } } - } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/NewSplashAnimationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/NewSplashAnimationPatch.kt index 3089d2583..7f3dd3a95 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/NewSplashAnimationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/NewSplashAnimationPatch.kt @@ -10,6 +10,8 @@ import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.misc.splashanimation.fingerprints.WatchWhileActivityWithInFlagsFingerprint import app.revanced.patches.youtube.misc.splashanimation.fingerprints.WatchWhileActivityWithOutFlagsFingerprint +import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch +import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch.mainActivityClassDef import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.DarkSplashAnimation import app.revanced.patches.youtube.utils.settings.SettingsPatch @@ -24,6 +26,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction name = "Enable new splash animation", description = "Enables a new type of splash animation.", dependencies = [ + MainActivityResolvePatch::class, SettingsPatch::class, SharedResourceIdPatch::class ], @@ -55,14 +58,12 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction ] ) @Suppress("unused") -object NewSplashAnimationPatch : BytecodePatch( - setOf( - WatchWhileActivityWithInFlagsFingerprint, - WatchWhileActivityWithOutFlagsFingerprint - ) -) { +object NewSplashAnimationPatch : BytecodePatch() { override fun execute(context: BytecodeContext) { + WatchWhileActivityWithInFlagsFingerprint.resolve(context, mainActivityClassDef) + WatchWhileActivityWithOutFlagsFingerprint.resolve(context, mainActivityClassDef) + WatchWhileActivityWithInFlagsFingerprint.result ?: WatchWhileActivityWithOutFlagsFingerprint.result ?: throw PatchException("Failed to resolve fingerprints") diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/fingerprints/WatchWhileActivityWithInFlagsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/fingerprints/WatchWhileActivityWithInFlagsFingerprint.kt index 2c89ee368..c802d5ef2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/fingerprints/WatchWhileActivityWithInFlagsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/fingerprints/WatchWhileActivityWithInFlagsFingerprint.kt @@ -7,8 +7,7 @@ object WatchWhileActivityWithInFlagsFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("Landroid/os/Bundle;"), customFingerprint = { methodDef, _ -> - methodDef.definingClass.endsWith("/WatchWhileActivity;") - && methodDef.name == "onCreate" + methodDef.name == "onCreate" && methodDef.isWide32LiteralExists(45407550) } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/fingerprints/WatchWhileActivityWithOutFlagsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/fingerprints/WatchWhileActivityWithOutFlagsFingerprint.kt index 775035e2d..31d0e570b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/fingerprints/WatchWhileActivityWithOutFlagsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/fingerprints/WatchWhileActivityWithOutFlagsFingerprint.kt @@ -20,8 +20,7 @@ object WatchWhileActivityWithOutFlagsFingerprint : MethodFingerprint( Opcode.IF_EQZ // target ), customFingerprint = { methodDef, _ -> - methodDef.definingClass.endsWith("/WatchWhileActivity;") - && methodDef.name == "onCreate" + methodDef.name == "onCreate" && methodDef.isWideLiteralExists(DarkSplashAnimation) } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/SwipeControlsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/SwipeControlsPatch.kt index b5c995aa2..f51f4084e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/SwipeControlsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/SwipeControlsPatch.kt @@ -13,8 +13,9 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMu import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.swipe.controls.fingerprints.HDRBrightnessFingerprint import app.revanced.patches.youtube.swipe.controls.fingerprints.SwipeControlsHostActivityFingerprint -import app.revanced.patches.youtube.swipe.controls.fingerprints.WatchWhileActivityFingerprint import app.revanced.patches.youtube.utils.lockmodestate.LockModeStateHookPatch +import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch +import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch.mainActivityMutableClass import app.revanced.patches.youtube.utils.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch.contexts @@ -29,6 +30,7 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod description = "Adds volume and brightness swipe controls.", dependencies = [ LockModeStateHookPatch::class, + MainActivityResolvePatch::class, PlayerTypeHookPatch::class, SettingsPatch::class ], @@ -63,17 +65,15 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableMethod object SwipeControlsPatch : BytecodePatch( setOf( HDRBrightnessFingerprint, - SwipeControlsHostActivityFingerprint, - WatchWhileActivityFingerprint + SwipeControlsHostActivityFingerprint ) ) { override fun execute(context: BytecodeContext) { val wrapperClass = SwipeControlsHostActivityFingerprint.result?.mutableClass ?: throw SwipeControlsHostActivityFingerprint.exception - val targetClass = WatchWhileActivityFingerprint.result?.mutableClass - ?: throw WatchWhileActivityFingerprint.exception + val targetClass = mainActivityMutableClass - // inject the wrapper class from integrations into the class hierarchy of WatchWhileActivity + // inject the wrapper class from integrations into the class hierarchy of MainActivity (WatchWhileActivity) wrapperClass.setSuperClass(targetClass.superclass) targetClass.setSuperClass(wrapperClass.type) diff --git a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/WatchWhileActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/WatchWhileActivityFingerprint.kt deleted file mode 100644 index a197808c6..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/WatchWhileActivityFingerprint.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.youtube.swipe.controls.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.AccessFlags - -object WatchWhileActivityFingerprint : MethodFingerprint( - accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - parameters = emptyList(), - customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/WatchWhileActivity;") } -) diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/DoubleBackToClosePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/DoubleBackToClosePatch.kt index 5e1baed47..1734114e3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/DoubleBackToClosePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/DoubleBackToClosePatch.kt @@ -4,16 +4,21 @@ import app.revanced.extensions.exception import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.youtube.utils.fix.doublebacktoclose.fingerprint.OnBackPressedFingerprint +import app.revanced.patches.youtube.utils.mainactivity.fingerprints.MainActivityFingerprint import app.revanced.patches.youtube.utils.fix.doublebacktoclose.fingerprint.ScrollPositionFingerprint import app.revanced.patches.youtube.utils.fix.doublebacktoclose.fingerprint.ScrollTopFingerprint import app.revanced.patches.youtube.utils.fix.doublebacktoclose.fingerprint.ScrollTopParentFingerprint +import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch +import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch.onBackPressedMethod import app.revanced.util.integrations.Constants.UTILS_PATH +import com.android.tools.smali.dexlib2.Opcode +@Patch(dependencies = [MainActivityResolvePatch::class]) object DoubleBackToClosePatch : BytecodePatch( setOf( - OnBackPressedFingerprint, + MainActivityFingerprint, ScrollPositionFingerprint, ScrollTopParentFingerprint ) @@ -21,20 +26,20 @@ object DoubleBackToClosePatch : BytecodePatch( override fun execute(context: BytecodeContext) { /** - * Hook onBackPressed method inside WatchWhileActivity + * Hook onBackPressed method inside MainActivity (WatchWhileActivity) */ - OnBackPressedFingerprint.result?.let { - it.mutableMethod.apply { - val insertIndex = it.scanResult.patternScanResult!!.endIndex - - addInstruction( - insertIndex, - "invoke-static {p0}, $INTEGRATIONS_CLASS_DESCRIPTOR" + - "->" + - "closeActivityOnBackPressed(Landroid/app/Activity;)V" - ) + onBackPressedMethod.apply { + val insertIndex = implementation!!.instructions.indexOfFirst { instruction -> + instruction.opcode == Opcode.RETURN_VOID } - } ?: throw OnBackPressedFingerprint.exception + + addInstruction( + insertIndex, + "invoke-static {p0}, $INTEGRATIONS_CLASS_DESCRIPTOR" + + "->" + + "closeActivityOnBackPressed(Landroid/app/Activity;)V" + ) + } /** diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/OnBackPressedFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/OnBackPressedFingerprint.kt deleted file mode 100644 index f62d974c6..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/OnBackPressedFingerprint.kt +++ /dev/null @@ -1,16 +0,0 @@ -package app.revanced.patches.youtube.utils.fix.doublebacktoclose.fingerprint - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -object OnBackPressedFingerprint : MethodFingerprint( - returnType = "V", - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - opcodes = listOf(Opcode.RETURN_VOID), - customFingerprint = { methodDef, _ -> - methodDef.definingClass.endsWith("WatchWhileActivity;") - && methodDef.name == "onBackPressed" - } -) diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/mainactivity/MainActivityResolvePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/mainactivity/MainActivityResolvePatch.kt new file mode 100644 index 000000000..738300217 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/mainactivity/MainActivityResolvePatch.kt @@ -0,0 +1,44 @@ +package app.revanced.patches.youtube.utils.mainactivity + +import app.revanced.extensions.exception +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.PatchException +import app.revanced.patcher.util.proxy.mutableTypes.MutableClass +import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod +import app.revanced.patches.youtube.utils.mainactivity.fingerprints.MainActivityFingerprint +import app.revanced.util.integrations.Constants.UTILS_PATH +import com.android.tools.smali.dexlib2.iface.ClassDef + +object MainActivityResolvePatch : BytecodePatch( + setOf(MainActivityFingerprint) +) { + lateinit var mainActivityClassDef: ClassDef + lateinit var mainActivityMutableClass: MutableClass + lateinit var onBackPressedMethod: MutableMethod + private lateinit var onCreateMethod: MutableMethod + + override fun execute(context: BytecodeContext) { + MainActivityFingerprint.result?.let { + mainActivityClassDef = it.classDef + mainActivityMutableClass = it.mutableClass + onBackPressedMethod = + mainActivityMutableClass.methods.find { method -> method.name == "onBackPressed" } + ?: throw PatchException("Could not find onBackPressedMethod") + onCreateMethod = it.mutableMethod + } ?: throw MainActivityFingerprint.exception + } + + fun injectInit( + methods: String, + descriptor: String + ) { + onCreateMethod.apply { + addInstruction( + 2, + "invoke-static/range {p0 .. p0}, $UTILS_PATH/$methods;->$descriptor(Landroid/content/Context;)V" + ) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/mainactivity/fingerprints/MainActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/mainactivity/fingerprints/MainActivityFingerprint.kt new file mode 100644 index 000000000..f5e0706cf --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/mainactivity/fingerprints/MainActivityFingerprint.kt @@ -0,0 +1,17 @@ +package app.revanced.patches.youtube.utils.mainactivity.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint + +/** + * 'WatchWhileActivity' has been renamed to 'MainActivity' in YouTube v18.48.xx+ + * This fingerprint was added to prepare for YouTube v18.48.xx+ + */ +object MainActivityFingerprint : MethodFingerprint( + returnType = "V", + parameters = listOf("Landroid/os/Bundle;"), + strings = listOf("PostCreateCalledKey"), + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("Activity;") + && methodDef.name == "onCreate" + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/microg/MicroGBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/microg/MicroGBytecodePatch.kt index c5ba08786..3b4514fea 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/microg/MicroGBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/microg/MicroGBytecodePatch.kt @@ -7,6 +7,8 @@ import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.patch.packagename.PackageNamePatch import app.revanced.patches.youtube.utils.fix.clientspoof.ClientSpoofPatch import app.revanced.patches.youtube.utils.fix.parameter.SpoofPlayerParameterPatch +import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch +import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch.injectInit import app.revanced.patches.youtube.utils.microg.Constants.PACKAGE_NAME import app.revanced.patches.youtube.utils.microg.fingerprints.CastContextFetchFingerprint import app.revanced.patches.youtube.utils.microg.fingerprints.CastDynamiteModuleFingerprint @@ -14,12 +16,12 @@ import app.revanced.patches.youtube.utils.microg.fingerprints.CastDynamiteModule import app.revanced.patches.youtube.utils.microg.fingerprints.GooglePlayUtilityFingerprint import app.revanced.patches.youtube.utils.microg.fingerprints.PrimeFingerprint import app.revanced.patches.youtube.utils.microg.fingerprints.ServiceCheckFingerprint -import app.revanced.util.bytecode.BytecodeHelper.injectInit import app.revanced.util.microg.MicroGBytecodeHelper @Patch( dependencies = [ ClientSpoofPatch::class, + MainActivityResolvePatch::class, PackageNamePatch::class, SpoofPlayerParameterPatch::class ] @@ -64,7 +66,7 @@ object MicroGBytecodePatch : BytecodePatch( ) ) - context.injectInit("MicroGPatch", "checkAvailability", true) + injectInit("MicroGPatch", "checkAvailability") } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsBytecodePatch.kt index 1f6ff8f6f..3e509ce5b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsBytecodePatch.kt @@ -8,14 +8,16 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.patch.mapping.ResourceMappingPatch import app.revanced.patches.youtube.utils.integrations.IntegrationsPatch +import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch +import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch.injectInit import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.fingerprints.ThemeSetterSystemFingerprint -import app.revanced.util.bytecode.BytecodeHelper.injectInit import app.revanced.util.integrations.Constants.INTEGRATIONS_PATH @Patch( dependencies = [ IntegrationsPatch::class, + MainActivityResolvePatch::class, ResourceMappingPatch::class, SharedResourceIdPatch::class ] @@ -45,8 +47,8 @@ object SettingsBytecodePatch : BytecodePatch( } } ?: throw ThemeSetterSystemFingerprint.exception - context.injectInit("InitializationPatch", "setDeviceInformation", true) - context.injectInit("InitializationPatch", "initializeReVancedSettings", true) + injectInit("InitializationPatch", "setDeviceInformation") + injectInit("InitializationPatch", "initializeReVancedSettings") }