add share-button-hook patch

This commit is contained in:
inotia00 2023-04-16 13:38:49 +09:00
parent 0cab17189c
commit 4e244edd83
8 changed files with 140 additions and 0 deletions

View File

@ -0,0 +1,10 @@
package app.revanced.patches.music.layout.sharebuttonhook.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.Opcode
object ConnectionTrackerFingerprint : MethodFingerprint(
returnType = "Z",
opcodes = listOf(Opcode.THROW),
strings = listOf("ConnectionTracker")
)

View File

@ -0,0 +1,9 @@
package app.revanced.patches.music.layout.sharebuttonhook.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
object MusicSettingsFingerprint : MethodFingerprint(
customFingerprint = {
it.definingClass.endsWith("MusicSettings;") && it.name == "getDownloaderPackageName"
}
)

View File

@ -0,0 +1,10 @@
package app.revanced.patches.music.layout.sharebuttonhook.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.Opcode
object SharePanelFingerprint : MethodFingerprint(
returnType = "V",
opcodes = listOf(Opcode.INVOKE_VIRTUAL),
strings = listOf("share/get_share_panel")
)

View File

@ -0,0 +1,10 @@
package app.revanced.patches.music.layout.sharebuttonhook.fingerprints
import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint
import org.jf.dexlib2.Opcode
object ShowToastFingerprint : MethodFingerprint(
returnType = "V",
parameters = listOf("Landroid/content/Context;","Ljava/lang/CharSequence;","I"),
opcodes = listOf(Opcode.IF_EQZ)
)

View File

@ -0,0 +1,83 @@
package app.revanced.patches.music.layout.sharebuttonhook.patch
import app.revanced.extensions.toErrorResult
import app.revanced.patcher.annotation.Description
import app.revanced.patcher.annotation.Name
import app.revanced.patcher.annotation.Version
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.addInstruction
import app.revanced.patcher.extensions.addInstructions
import app.revanced.patcher.extensions.instruction
import app.revanced.patcher.extensions.replaceInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.PatchResult
import app.revanced.patcher.patch.PatchResultSuccess
import app.revanced.patcher.patch.annotations.DependsOn
import app.revanced.patcher.patch.annotations.Patch
import app.revanced.patcher.util.smali.ExternalLabel
import app.revanced.patches.music.layout.sharebuttonhook.fingerprints.*
import app.revanced.patches.music.misc.settings.patch.MusicSettingsPatch
import app.revanced.patches.music.misc.videoid.patch.MusicVideoIdPatch
import app.revanced.patches.shared.annotation.YouTubeMusicCompatibility
import app.revanced.patches.shared.patch.options.PatchOptions
import app.revanced.patches.shared.patch.options.PatchOptions.Companion.MusicDownloaderPackageName
import app.revanced.util.integrations.Constants.MUSIC_PATH
@Patch
@Name("share-button-hook")
@Description("Replace share button with external download button.")
@DependsOn(
[
MusicSettingsPatch::class,
MusicVideoIdPatch::class,
PatchOptions::class
]
)
@YouTubeMusicCompatibility
@Version("0.0.1")
class ShareButtonHookPatch : BytecodePatch(
listOf(
ConnectionTrackerFingerprint,
MusicSettingsFingerprint,
SharePanelFingerprint,
ShowToastFingerprint
)
) {
override fun execute(context: BytecodeContext): PatchResult {
SharePanelFingerprint.result?.let {
with (it.mutableMethod) {
val targetIndex = it.scanResult.patternScanResult!!.startIndex
addInstructions(
targetIndex,"""
invoke-static {}, $MUSIC_PATH/HookShareButtonPatch;->overrideSharePanel()Z
move-result p1
if-eqz p1, :default
return-void
""", listOf(ExternalLabel("default", instruction(targetIndex)))
)
}
} ?: return SharePanelFingerprint.toErrorResult()
ConnectionTrackerFingerprint.result?.mutableMethod?.addInstruction(
0,
"sput-object p1, $MUSIC_PATH/HookShareButtonPatch;->context:Landroid/content/Context;"
) ?: return ConnectionTrackerFingerprint.toErrorResult()
ShowToastFingerprint.result?.mutableMethod?.addInstructions(
0,"""
invoke-static {p0}, $MUSIC_PATH/HookShareButtonPatch;->dismissContext(Landroid/content/Context;)Landroid/content/Context;
move-result-object p0
"""
) ?: return ShowToastFingerprint.toErrorResult()
MusicSettingsFingerprint.result?.mutableMethod?.replaceInstruction(
0,
"const-string v0, \"$MusicDownloaderPackageName\""
)?: return MusicSettingsFingerprint.toErrorResult()
MusicSettingsPatch.addMusicPreference("navigation", "revanced_hook_share_button", "false")
return PatchResultSuccess()
}
}

View File

@ -60,6 +60,18 @@ class PatchOptions : ResourcePatch {
)
)
/**
* Downloader Package Name (YouTube Music)
*/
internal var MusicDownloaderPackageName: String? by option(
PatchOption.StringOption(
key = "MusicDownloaderPackageName",
default = "ussr.razar.youtube_dl",
title = "Downloader Package Name for YouTube Music",
description = "Downloader package name of the YouTube Music. (default: PowerTube)"
)
)
/**
* Custom Speed Values
*/

View File

@ -19,6 +19,8 @@ internal object Constants {
const val MISC_PATH = "$PATCHES_PATH/misc"
const val MUSIC_PATH = "$PATCHES_PATH/music"
const val BUTTON_PATH = "$PATCHES_PATH/button"
const val VIDEO_PATH = "$PATCHES_PATH/video"

View File

@ -6,6 +6,7 @@
<string name="revanced_category_navigation">Navigation</string>
<string name="revanced_disable_auto_captions_summary">Disable forced captions from automatically enabling in video player.</string>
<string name="revanced_disable_auto_captions_title">Disable auto captions</string>
<string name="revanced_downloader_not_installed" formatted="false">%s is not installed. Please install it.</string>
<string name="revanced_enable_black_navbar_summary">Sets the navigation bar color to black.</string>
<string name="revanced_enable_black_navbar_title">Enable black navbar</string>
<string name="revanced_enable_color_match_player_summary">Matches the fullscreen player color with the minimized one.</string>
@ -41,4 +42,7 @@
<string name="revanced_hide_playlist_card_summary">"Hides the playlist card from homepage.
(requires an app restart)"</string>
<string name="revanced_hide_playlist_card_title">Hide playlist card</string>
<string name="revanced_hook_share_button_summary">"Replace share button with external download button.
(Experimental Flags)"</string>
<string name="revanced_hook_share_button_title">Hook share button</string>
</resources>