diff --git a/src/main/kotlin/app/revanced/patches/strava/subscription/fingerprints/GetSubscribedFingerprint.kt b/src/main/kotlin/app/revanced/patches/strava/subscription/fingerprints/GetSubscribedFingerprint.kt new file mode 100644 index 000000000..a0f6ff393 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/strava/subscription/fingerprints/GetSubscribedFingerprint.kt @@ -0,0 +1,11 @@ +package app.revanced.patches.strava.subscription.fingerprints + +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import com.android.tools.smali.dexlib2.Opcode + +object GetSubscribedFingerprint : MethodFingerprint( + opcodes = listOf(Opcode.IGET_BOOLEAN), + customFingerprint = { methodDef, classDef -> + classDef.type.endsWith("SubscriptionDetailResponse;") && methodDef.name == "getSubscribed" + } +) diff --git a/src/main/kotlin/app/revanced/patches/strava/subscription/patch/UnlockSubscriptionPatch.kt b/src/main/kotlin/app/revanced/patches/strava/subscription/patch/UnlockSubscriptionPatch.kt new file mode 100644 index 000000000..42a462e34 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/strava/subscription/patch/UnlockSubscriptionPatch.kt @@ -0,0 +1,23 @@ +package app.revanced.patches.strava.subscription.patch + +import app.revanced.extensions.exception +import app.revanced.patcher.annotation.Compatibility +import app.revanced.patcher.annotation.Description +import app.revanced.patcher.annotation.Name +import app.revanced.patcher.annotation.Package +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.annotations.Patch +import app.revanced.patches.strava.subscription.fingerprints.GetSubscribedFingerprint + +@Patch +@Name("Unlock subscription features") +@Description("Unlocks \"Matched Runs\" and \"Segment Efforts\".") +@Compatibility([Package("com.strava", ["320.12"])]) +class UnlockSubscriptionPatch : BytecodePatch(listOf(GetSubscribedFingerprint)) { + override fun execute(context: BytecodeContext) = GetSubscribedFingerprint.result?.let { result -> + val isSubscribedIndex = result.scanResult.patternScanResult!!.startIndex + result.mutableMethod.replaceInstruction(isSubscribedIndex, "const/4 v0, 0x1") + } ?: throw GetSubscribedFingerprint.exception +} \ No newline at end of file