feat(YouTube Music): add Hide general ads patch

This commit is contained in:
inotia00
2023-12-03 15:15:30 +09:00
parent 4f21f4c586
commit 1b57096357
7 changed files with 154 additions and 53 deletions

View File

@ -0,0 +1,87 @@
package app.revanced.patches.music.ads.general
import app.revanced.extensions.exception
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.extensions.InstructionExtensions.addInstruction
import app.revanced.patcher.extensions.InstructionExtensions.getInstruction
import app.revanced.patcher.patch.BytecodePatch
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.music.ads.general.fingerprints.FloatingLayoutFingerprint
import app.revanced.patches.music.ads.general.fingerprints.NotifierShelfFingerprint
import app.revanced.patches.music.ads.music.MusicAdsPatch
import app.revanced.patches.music.utils.litho.LithoFilterPatch
import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch
import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.FloatingLayout
import app.revanced.patches.music.utils.settings.SettingsPatch
import app.revanced.util.bytecode.getWideLiteralIndex
import app.revanced.util.enum.CategoryType
import app.revanced.util.integrations.Constants.MUSIC_ADS_PATH
import app.revanced.util.integrations.Constants.MUSIC_COMPONENTS_PATH
import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction
import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction
@Patch(
name = "Hide general ads",
description = "Hides general ads.",
dependencies = [
LithoFilterPatch::class,
MusicAdsPatch::class,
SettingsPatch::class,
SharedResourceIdPatch::class
],
compatiblePackages = [CompatiblePackage("com.google.android.apps.youtube.music")]
)
@Suppress("unused")
object GeneralAdsPatch : BytecodePatch(
setOf(
FloatingLayoutFingerprint,
NotifierShelfFingerprint
)
) {
override fun execute(context: BytecodeContext) {
LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR)
/**
* Hides premium promotion popup
*/
FloatingLayoutFingerprint.result?.let {
it.mutableMethod.apply {
val targetIndex = getWideLiteralIndex(FloatingLayout) + 2
val targetRegister = getInstruction<OneRegisterInstruction>(targetIndex).registerA
addInstruction(
targetIndex + 1,
"invoke-static {v$targetRegister}, $MUSIC_ADS_PATH/PremiumPromotionPatch;->hidePremiumPromotion(Landroid/view/View;)V"
)
}
} ?: throw FloatingLayoutFingerprint.exception
/**
* Hides premium renewal banner
*/
NotifierShelfFingerprint.result?.let {
it.mutableMethod.apply {
val linearLayoutIndex = it.scanResult.patternScanResult!!.startIndex
val linearLayoutRegister = getInstruction<FiveRegisterInstruction>(linearLayoutIndex).registerC
val textViewIndex = linearLayoutIndex + 2
val textViewRegister = getInstruction<OneRegisterInstruction>(textViewIndex).registerA
addInstruction(
textViewIndex,
"invoke-static {v$linearLayoutRegister, v$textViewRegister}, $MUSIC_ADS_PATH/PremiumRenewalPatch;->hidePremiumRenewal(Landroid/widget/LinearLayout;Landroid/view/View;)V"
)
}
} ?: throw NotifierShelfFingerprint.exception
SettingsPatch.addMusicPreference(CategoryType.ADS, "revanced_close_interstitial_ads", "true")
SettingsPatch.addMusicPreference(CategoryType.ADS, "revanced_hide_general_ads", "true")
SettingsPatch.addMusicPreference(CategoryType.ADS, "revanced_hide_music_ads", "true")
SettingsPatch.addMusicPreference(CategoryType.ADS, "revanced_hide_premium_promotion", "true")
SettingsPatch.addMusicPreference(CategoryType.ADS, "revanced_hide_premium_renewal", "true")
}
private const val FILTER_CLASS_DESCRIPTOR =
"$MUSIC_COMPONENTS_PATH/AdsFilter;"
}

View File

@ -0,0 +1,14 @@
package app.revanced.patches.music.ads.general.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.FloatingLayout
import app.revanced.util.bytecode.isWideLiteralExists
import com.android.tools.smali.dexlib2.AccessFlags
object FloatingLayoutFingerprint : MethodFingerprint(
returnType = "Landroid/view/View;",
accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL,
parameters = emptyList(),
customFingerprint = { methodDef, _ -> methodDef.isWideLiteralExists(FloatingLayout) }
)

View File

@ -0,0 +1,20 @@
package app.revanced.patches.music.ads.general.fingerprints
import app.revanced.patcher.extensions.or
import app.revanced.patcher.fingerprint.MethodFingerprint
import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MusicNotifierShelf
import app.revanced.util.bytecode.isWideLiteralExists
import com.android.tools.smali.dexlib2.AccessFlags
import com.android.tools.smali.dexlib2.Opcode
object NotifierShelfFingerprint : MethodFingerprint(
returnType = "V",
accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR,
opcodes = listOf(
Opcode.INVOKE_VIRTUAL,
Opcode.MOVE_RESULT_OBJECT,
Opcode.CHECK_CAST,
Opcode.IPUT_OBJECT
),
customFingerprint = { methodDef, _ -> methodDef.isWideLiteralExists(MusicNotifierShelf) }
)

View File

@ -1,37 +1,8 @@
package app.revanced.patches.music.ads.music
import app.revanced.patcher.data.BytecodeContext
import app.revanced.patcher.patch.annotation.CompatiblePackage
import app.revanced.patcher.patch.annotation.Patch
import app.revanced.patches.music.utils.litho.LithoFilterPatch
import app.revanced.patches.music.utils.settings.SettingsPatch
import app.revanced.patches.shared.patch.ads.AbstractAdsPatch
import app.revanced.util.enum.CategoryType
import app.revanced.util.integrations.Constants.MUSIC_ADS_PATH
import app.revanced.util.integrations.Constants.MUSIC_COMPONENTS_PATH
@Patch(
name = "Hide music ads",
description = "Hides ads before playing a music.",
dependencies = [
LithoFilterPatch::class,
SettingsPatch::class
],
compatiblePackages = [CompatiblePackage("com.google.android.apps.youtube.music")]
)
@Suppress("unused")
object MusicAdsPatch : AbstractAdsPatch(
"$MUSIC_ADS_PATH/MusicAdsPatch;->hideMusicAds()Z"
) {
override fun execute(context: BytecodeContext) {
super.execute(context)
LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR)
SettingsPatch.addMusicPreference(CategoryType.ADS, "revanced_close_interstitial_ads", "false")
SettingsPatch.addMusicPreference(CategoryType.ADS, "revanced_hide_music_ads", "true")
}
private const val FILTER_CLASS_DESCRIPTOR =
"$MUSIC_COMPONENTS_PATH/AdsFilter;"
}
)

View File

@ -15,25 +15,27 @@ import app.revanced.util.enum.ResourceType.STYLE
@Patch(dependencies = [ResourceMappingPatch::class])
object SharedResourceIdPatch : ResourcePatch() {
internal var AccountSwitcherAccessibility = -1L
internal var ActionsContainer = -1L
internal var ButtonIconPaddingMedium = -1L
internal var ChipCloud = -1L
internal var ColorGrey = -1L
internal var DialogSolid = -1L
internal var HistoryMenuItem = -1L
internal var InlineTimeBarAdBreakMarkerColor = -1L
internal var IsTablet = -1L
internal var MenuEntry = -1L
internal var MusicMenuLikeButtons = -1L
internal var NamesInactiveAccountThumbnailSize = -1L
internal var PlayerCastMediaRouteButton = -1L
internal var PlayerOverlayChip = -1L
internal var PrivacyTosFooter = -1L
internal var QualityAuto = -1L
internal var Text1 = -1L
internal var ToolTipContentView = -1L
internal var TosFooter = -1L
var AccountSwitcherAccessibility: Long = -1
var ActionsContainer: Long = -1
var ButtonIconPaddingMedium: Long = -1
var ChipCloud: Long = -1
var ColorGrey: Long = -1
var DialogSolid: Long = -1
var FloatingLayout: Long = -1
var HistoryMenuItem: Long = -1
var InlineTimeBarAdBreakMarkerColor: Long = -1
var IsTablet: Long = -1
var MenuEntry: Long = -1
var MusicMenuLikeButtons: Long = -1
var MusicNotifierShelf: Long = -1
var NamesInactiveAccountThumbnailSize: Long = -1
var PlayerCastMediaRouteButton: Long = -1
var PlayerOverlayChip: Long = -1
var PrivacyTosFooter: Long = -1
var QualityAuto: Long = -1
var Text1: Long = -1
var ToolTipContentView: Long = -1
var TosFooter: Long = -1
override fun execute(context: ResourceContext) {
@ -48,11 +50,13 @@ object SharedResourceIdPatch : ResourcePatch() {
ChipCloud = find(LAYOUT, "chip_cloud")
ColorGrey = find(COLOR, "ytm_color_grey_12")
DialogSolid = find(STYLE, "Theme.YouTubeMusic.Dialog.Solid")
FloatingLayout = find(ID, "floating_layout")
HistoryMenuItem = find(ID, "history_menu_item")
InlineTimeBarAdBreakMarkerColor = find(COLOR, "inline_time_bar_ad_break_marker_color")
IsTablet = find(BOOL, "is_tablet")
MenuEntry = find(LAYOUT, "menu_entry")
MusicMenuLikeButtons = find(LAYOUT, "music_menu_like_buttons")
MusicNotifierShelf = find(LAYOUT, "music_notifier_shelf")
NamesInactiveAccountThumbnailSize = find(DIMEN, "names_inactive_account_thumbnail_size")
PlayerCastMediaRouteButton = find(LAYOUT, "player_cast_media_route_button")
PlayerOverlayChip = find(ID, "player_overlay_chip")