From 7b02a31e3fe20ccd06c1ee139f6941e5b4cfe635 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 25 Sep 2025 22:13:12 +0400 Subject: [PATCH] unofficial 20.39 work in progress (navigation bar notification tab icon fix is TODO) --- patches/api/patches.api | 1 + .../layout/shortsplayer/Fingerprints.kt | 30 +++++++++++++++++++ .../OpenShortsInRegularPlayerPatch.kt | 13 +++++--- .../misc/navigation/NavigationBarHookPatch.kt | 10 ++++++- .../misc/playservice/VersionCheckPatch.kt | 3 ++ 5 files changed, 52 insertions(+), 5 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 166ca34d7..9b0d50b4a 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1601,6 +1601,7 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_20_31_or_greater ()Z public static final fun is_20_34_or_greater ()Z public static final fun is_20_37_or_greater ()Z + public static final fun is_20_39_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt index 32228fa62..c1debb442 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt @@ -1,5 +1,7 @@ package app.revanced.patches.youtube.layout.shortsplayer +import app.revanced.patcher.checkCast +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint import app.revanced.patcher.literal import app.revanced.patcher.methodCall @@ -7,10 +9,12 @@ import app.revanced.patcher.string import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode /** * Purpose of this method is not clear, and it's only used to identify * the obfuscated name of the videoId() method in PlaybackStartDescriptor. + * 20.39 and lower. */ internal val playbackStartFeatureFlagFingerprint by fingerprint { returns("Z") @@ -26,6 +30,32 @@ internal val playbackStartFeatureFlagFingerprint by fingerprint { ) } +/** + * Purpose of this method is not entirely clear, and it's only used to identify + * the obfuscated name of the videoId() method in PlaybackStartDescriptor. + * 20.39+ + */ +internal val watchPanelVideoIdFingerprint by fingerprint { + returns("Ljava/lang/String;") + parameters() + instructions( + fieldAccess( + opcode = Opcode.IGET_OBJECT, + type = "Lcom/google/android/apps/youtube/app/common/player/queue/WatchPanelId;" + ), + checkCast("Lcom/google/android/apps/youtube/app/common/player/queue/DefaultWatchPanelId;"), + methodCall( + definingClass = "Lcom/google/android/apps/youtube/app/common/player/queue/DefaultWatchPanelId;", + returnType = "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" + ), + methodCall( + definingClass = "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;", + returnType = "Ljava/lang/String;" + ) + ) +} + + // Pre 19.25 internal val shortsPlaybackIntentLegacyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt index 3ecd2ad4a..604db5f8f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt @@ -13,6 +13,7 @@ import app.revanced.patches.youtube.layout.player.fullscreen.openVideosFullscree import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_39_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch @@ -67,12 +68,16 @@ val openShortsInRegularPlayerPatch = bytecodePatch( ) // Find the obfuscated method name for PlaybackStartDescriptor.videoId() - val playbackStartVideoIdMethodName = playbackStartFeatureFlagFingerprint.let { - val stringMethodIndex = it.instructionMatches.first().index - it.method.let { - navigate(it).to(stringMethodIndex).stop().name + val (videoIdStartMethod, videoIdIndex) = if (is_20_39_or_greater) { + watchPanelVideoIdFingerprint.let { + it.method to it.instructionMatches.last().index + } + } else { + playbackStartFeatureFlagFingerprint.let { + it.method to it.instructionMatches.first().index } } + val playbackStartVideoIdMethodName = navigate(videoIdStartMethod).to(videoIdIndex).stop().name fun extensionInstructions(playbackStartRegister: Int, freeRegister: Int) = """ diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt index cb2e76f97..77ed5ed7a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt @@ -14,6 +14,7 @@ import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_35_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_21_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_28_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_39_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.shared.mainActivityOnBackPressedFingerprint import app.revanced.util.findFreeRegister @@ -28,6 +29,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.util.MethodUtil +import java.util.logging.Logger internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/shared/NavigationBar;" @@ -193,8 +195,14 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig ) } + if (is_20_39_or_greater) { + return@execute Logger.getLogger(this::class.java.name).warning( + "20.39+ Navigation tab activity button selected state is not yet fixed." + ) + } + // Fix YT bug of notification tab missing the filled icon. - if (is_19_35_or_greater) { + if (is_19_35_or_greater && !is_20_39_or_greater) { // FIXME: 20.39+ needs this fix. val cairoNotificationEnumReference = imageEnumConstructorFingerprint .instructionMatches.last().getInstruction().reference diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index 074fcb553..40c8cef2c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -81,6 +81,8 @@ var is_20_34_or_greater = false private set var is_20_37_or_greater = false private set +var is_20_39_or_greater = false + private set val versionCheckPatch = resourcePatch( description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", @@ -125,5 +127,6 @@ val versionCheckPatch = resourcePatch( is_20_31_or_greater = 253205000 <= playStoreServicesVersion is_20_34_or_greater = 253505000 <= playStoreServicesVersion is_20_37_or_greater = 253805000 <= playStoreServicesVersion + is_20_39_or_greater = 253980000 <= playStoreServicesVersion } }