Skip to content

Commit dad0ff4

Browse files
committed
fix(Spotify - Unlock Premium): Fix hiding context menu ads on newest versions by simplifying fingerprint (#5318)
1 parent b801606 commit dad0ff4

File tree

2 files changed

+11
-13
lines changed

2 files changed

+11
-13
lines changed

patches/src/main/kotlin/app/revanced/patches/spotify/misc/Fingerprints.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ internal val oldContextMenuViewModelAddItemFingerprint = fingerprint {
5757

5858
internal val contextMenuViewModelConstructorFingerprint = fingerprint {
5959
accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR)
60-
parameters("L", "Z", "Ljava/util/List;")
6160
}
6261

6362
/**
@@ -67,7 +66,7 @@ internal val browsePodcastsContextMenuItemClassFingerprint = fingerprint {
6766
strings("browse_podcast_item", "ui_navigate")
6867
}
6968

70-
internal const val CONTEXT_MENU_ITEM_PLACEHOLDER_CLASS_NAME = "Lapp/revanced/ContextMenuItemPlaceholder;"
69+
internal const val CONTEXT_MENU_ITEM_CLASS_DESCRIPTOR_PLACEHOLDER = "Lapp/revanced/ContextMenuItemPlaceholder;"
7170
internal val extensionFilterContextMenuItemsFingerprint = fingerprint {
7271
accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC)
7372
returns("Ljava/util/List;")
@@ -134,7 +133,7 @@ internal val homeStructureGetSectionsFingerprint =
134133
structureGetSectionsFingerprint("homeapi/proto/HomeStructure;")
135134

136135
internal val browseSectionFingerprint = fingerprint {
137-
custom { _, classDef -> classDef.endsWith("browsita/v1/resolved/Section;") }
136+
custom { _, classDef-> classDef.endsWith("browsita/v1/resolved/Section;") }
138137
}
139138

140139
internal val browseStructureGetSectionsFingerprint =

patches/src/main/kotlin/app/revanced/patches/spotify/misc/UnlockPremiumPatch.kt

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -178,29 +178,27 @@ val unlockPremiumPatch = bytecodePatch(
178178
?.let { interfaceName -> classes.find { it.type == interfaceName } }
179179
?: throw PatchException("Could not find context menu item interface.")
180180

181-
val contextMenuItemInterfaceName = contextMenuItemInterfaceClassDef.type
182-
183181
val contextMenuItemViewModelClassName = getViewModelFingerprint
184182
.matchOrNull(contextMenuItemInterfaceClassDef)
185183
?.originalMethod
186184
?.returnType
187185
?: throw PatchException("Could not find context menu item view model class.")
188186

189187
val castContextMenuItemStubIndex = indexOfFirstInstructionOrThrow {
190-
getReference<TypeReference>()?.type == CONTEXT_MENU_ITEM_PLACEHOLDER_CLASS_NAME
188+
getReference<TypeReference>()?.type == CONTEXT_MENU_ITEM_CLASS_DESCRIPTOR_PLACEHOLDER
191189
}
192190
val contextMenuItemRegister = getInstruction<OneRegisterInstruction>(castContextMenuItemStubIndex)
193191
.registerA
194192
val getContextMenuItemStubViewModelIndex = indexOfFirstInstructionOrThrow {
195-
getReference<MethodReference>()?.definingClass == CONTEXT_MENU_ITEM_PLACEHOLDER_CLASS_NAME
193+
getReference<MethodReference>()?.definingClass == CONTEXT_MENU_ITEM_CLASS_DESCRIPTOR_PLACEHOLDER
196194
}
197195

198196
val getViewModelDescriptor =
199-
"$contextMenuItemInterfaceName->getViewModel()$contextMenuItemViewModelClassName"
197+
"$contextMenuItemInterfaceClassDef->getViewModel()$contextMenuItemViewModelClassName"
200198

201199
replaceInstruction(
202200
castContextMenuItemStubIndex,
203-
"check-cast v$contextMenuItemRegister, $contextMenuItemInterfaceName"
201+
"check-cast v$contextMenuItemRegister, $contextMenuItemInterfaceClassDef"
204202
)
205203
replaceInstruction(
206204
getContextMenuItemStubViewModelIndex,
@@ -209,14 +207,15 @@ val unlockPremiumPatch = bytecodePatch(
209207
}
210208

211209
contextMenuViewModelConstructorFingerprint.match(contextMenuViewModelClassDef).method.apply {
210+
val itemsListParameter = parameters.indexOfFirst { it.type == "Ljava/util/List;" } + 1
212211
val filterContextMenuItemsDescriptor =
213212
"$EXTENSION_CLASS_DESCRIPTOR->filterContextMenuItems(Ljava/util/List;)Ljava/util/List;"
214213

215214
addInstructions(
216215
0,
217216
"""
218-
invoke-static { p3 }, $filterContextMenuItemsDescriptor
219-
move-result-object p3
217+
invoke-static { p$itemsListParameter }, $filterContextMenuItemsDescriptor
218+
move-result-object p$itemsListParameter
220219
"""
221220
)
222221
}
@@ -306,8 +305,8 @@ val unlockPremiumPatch = bytecodePatch(
306305
onErrorReturnCallIndex,
307306
"invoke-static { v$onErrorReturnValueRegister }, " +
308307
"$singleClassName->just(Ljava/lang/Object;)$singleClassName\n" +
309-
"move-result-object v$onErrorReturnValueRegister\n" +
310-
"return-object v$onErrorReturnValueRegister"
308+
"move-result-object v$onErrorReturnValueRegister\n" +
309+
"return-object v$onErrorReturnValueRegister"
311310
)
312311

313312
// Remove every instruction from the request call to right before the error static value construction.

0 commit comments

Comments
 (0)