diff --git a/patches/api/patches.api b/patches/api/patches.api index d1267e26c..2cd0b9e94 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -501,6 +501,10 @@ public final class app/revanced/patches/music/misc/androidauto/BypassCertificate public static final fun getBypassCertificateChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } +public final class app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatchKt { + public static final fun getUnlockAndroidAutoMediaBrowserPatch ()Lapp/revanced/patcher/patch/BytecodePatch; +} + public final class app/revanced/patches/music/misc/backgroundplayback/BackgroundPlaybackPatchKt { public static final fun getBackgroundPlaybackPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt index 245569d9e..36a91466a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt @@ -5,24 +5,11 @@ import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.settingsPatch import app.revanced.util.returnEarly +@Deprecated("This patch is useless by itself and has been merged into another patch.", ReplaceWith("unlockAndroidAutoMediaBrowserPatch")) + @Suppress("unused") val bypassCertificateChecksPatch = bytecodePatch( - name = "Bypass certificate checks", description = "Bypasses certificate checks which prevent YouTube Music from working on Android Auto.", ) { - dependsOn( - sharedExtensionPatch, - settingsPatch - ) - - compatibleWith( - "com.google.android.apps.youtube.music"( - "7.29.52", - "8.10.52" - ) - ) - - execute { - checkCertificateFingerprint.method.returnEarly(true) - } + dependsOn(unlockAndroidAutoMediaBrowserPatch) } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt index 97dea5650..63c9de464 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt @@ -1,6 +1,5 @@ package app.revanced.patches.music.misc.androidauto -import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint internal val checkCertificateFingerprint = fingerprint { @@ -10,4 +9,13 @@ internal val checkCertificateFingerprint = fingerprint { "X509", "Failed to get certificate" // Partial String match. ) +} + +internal val searchMediaItemsConstructorFingerprint = fingerprint { + returns("V") + strings("ytm_media_browser/search_media_items") +} + +internal val searchMediaItemsExecuteFingerprint = fingerprint { + parameters() } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatch.kt new file mode 100644 index 000000000..55fb2bb12 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/UnlockAndroidAutoMediaBrowserPatch.kt @@ -0,0 +1,38 @@ +package app.revanced.patches.music.misc.androidauto + +import app.revanced.patcher.extensions.InstructionExtensions.instructions +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.util.getReference +import app.revanced.util.registersUsed +import app.revanced.util.returnEarly +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.reference.FieldReference + +@Suppress("unused") +val unlockAndroidAutoMediaBrowserPatch = bytecodePatch( + name = "Unlock Android Auto Media Browser", + description = "Unlocks Android Auto Media Browser which enables the search function including speech to text.", +) { + compatibleWith( + "com.google.android.apps.youtube.music"( + "7.29.52", + "8.10.52" + ) + ) + + execute { + checkCertificateFingerprint.method.returnEarly(true) + + searchMediaItemsExecuteFingerprint + .match(searchMediaItemsConstructorFingerprint.classDef) + .method.apply { + val targetIndex = instructions.indexOfFirst { + it.opcode == Opcode.IGET_OBJECT && it.getReference()?.type == "Ljava/lang/String;" + } + + val register = instructions[targetIndex].registersUsed.first() + replaceInstruction(targetIndex, "const-string v$register, \"com.google.android.apps.youtube.music\"") + } + } +}