diff --git a/extensions/spotify/stub/src/main/java/app/revanced/ContextMenuItemPlaceholder.java b/extensions/spotify/stub/src/main/java/app/revanced/ContextMenuItemPlaceholder.java new file mode 100644 index 000000000..404be907c --- /dev/null +++ b/extensions/spotify/stub/src/main/java/app/revanced/ContextMenuItemPlaceholder.java @@ -0,0 +1,5 @@ +package app.revanced; + +public interface ContextMenuItemPlaceholder { + Object getViewModel(); +} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt index 3ac589fc8..1d42c29de 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt @@ -42,7 +42,10 @@ internal val contextMenuViewModelClassFingerprint = fingerprint { strings("ContextMenuViewModel(header=") } -internal val contextMenuViewModelAddItemFingerprint = fingerprint { +/** + * Used in versions older than "9.0.60.128". + */ +internal val oldContextMenuViewModelAddItemFingerprint = fingerprint { parameters("L") returns("V") custom { method, _ -> @@ -52,6 +55,28 @@ internal val contextMenuViewModelAddItemFingerprint = fingerprint { } } +internal val contextMenuViewModelConstructorFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + parameters("L", "Z", "Ljava/util/List;") +} + +/** + * Used to find the interface name of a context menu item. + */ +internal val browsePodcastsContextMenuItemClassFingerprint = fingerprint { + strings("browse_podcast_item", "ui_navigate") +} + +internal const val CONTEXT_MENU_ITEM_PLACEHOLDER_CLASS_NAME = "Lapp/revanced/ContextMenuItemPlaceholder;" +internal val extensionFilterContextMenuItemsFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) + returns("Ljava/util/List;") + parameters("Ljava/util/List;") + custom { method, classDef -> + method.name == "filterContextMenuItems" && classDef.type == EXTENSION_CLASS_DESCRIPTOR + } +} + internal val getViewModelFingerprint = fingerprint { custom { method, _ -> method.name == "getViewModel" } } @@ -93,7 +118,7 @@ internal val abstractProtobufListEnsureIsMutableFingerprint = fingerprint { } } -private fun structureGetSectionsFingerprint(className: String) = fingerprint { +internal fun structureGetSectionsFingerprint(className: String) = fingerprint { custom { method, classDef -> classDef.endsWith(className) && method.indexOfFirstInstruction { opcode == Opcode.IGET_OBJECT && getReference()?.name == "sections_"