From 604165116aa74eadbe3e694da4a16db731706f6a Mon Sep 17 00:00:00 2001 From: inotia00 Date: Thu, 29 Jun 2023 18:08:57 +0900 Subject: [PATCH] fix(music/litho-filter): don't include all Litho patches, when not included --- .../music/ads/music/patch/MusicAdsPatch.kt | 6 ++++ .../buttonshelf/patch/HideButtonShelfPatch.kt | 7 ++++ .../patch/HideCarouselShelfPatch.kt | 7 ++++ .../patch/ColorMatchPlayerPatch.kt | 2 +- .../patch/HidePlaylistCardPatch.kt | 7 ++++ .../fingerprints/LithoFilterFingerprint.kt | 13 +++++++ .../utils/litho/patch/LithoFilterPatch.kt | 36 ++++++++++++++++++- 7 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/app/revanced/patches/music/utils/litho/fingerprints/LithoFilterFingerprint.kt diff --git a/src/main/kotlin/app/revanced/patches/music/ads/music/patch/MusicAdsPatch.kt b/src/main/kotlin/app/revanced/patches/music/ads/music/patch/MusicAdsPatch.kt index 5d9aaf134..648e4fa34 100644 --- a/src/main/kotlin/app/revanced/patches/music/ads/music/patch/MusicAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/ads/music/patch/MusicAdsPatch.kt @@ -34,6 +34,12 @@ class MusicAdsPatch : AbstractAdsPatch( SettingsPatch.addMusicPreference(CategoryType.ADS, "revanced_hide_music_ads", "true") + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) + return PatchResultSuccess() } + private companion object { + private const val FILTER_CLASS_DESCRIPTOR = + "$MUSIC_ADS_PATH/AdsFilter;" + } } diff --git a/src/main/kotlin/app/revanced/patches/music/layout/buttonshelf/patch/HideButtonShelfPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/buttonshelf/patch/HideButtonShelfPatch.kt index 1f482b78c..85911f7c2 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/buttonshelf/patch/HideButtonShelfPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/buttonshelf/patch/HideButtonShelfPatch.kt @@ -13,6 +13,7 @@ import app.revanced.patches.music.utils.annotations.MusicCompatibility import app.revanced.patches.music.utils.litho.patch.LithoFilterPatch import app.revanced.patches.music.utils.settings.resource.patch.SettingsPatch import app.revanced.util.enum.CategoryType +import app.revanced.util.integrations.Constants.MUSIC_ADS_PATH @Patch @Name("hide-button-shelf") @@ -34,6 +35,12 @@ class HideButtonShelfPatch : BytecodePatch() { "false" ) + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) + return PatchResultSuccess() } + private companion object { + private const val FILTER_CLASS_DESCRIPTOR = + "$MUSIC_ADS_PATH/ButtonShelfFilter;" + } } diff --git a/src/main/kotlin/app/revanced/patches/music/layout/carouselshelf/patch/HideCarouselShelfPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/carouselshelf/patch/HideCarouselShelfPatch.kt index b88b2fec3..62234f191 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/carouselshelf/patch/HideCarouselShelfPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/carouselshelf/patch/HideCarouselShelfPatch.kt @@ -13,6 +13,7 @@ import app.revanced.patches.music.utils.annotations.MusicCompatibility import app.revanced.patches.music.utils.litho.patch.LithoFilterPatch import app.revanced.patches.music.utils.settings.resource.patch.SettingsPatch import app.revanced.util.enum.CategoryType +import app.revanced.util.integrations.Constants.MUSIC_ADS_PATH @Patch @Name("hide-carousel-shelf") @@ -34,6 +35,12 @@ class HideCarouselShelfPatch : BytecodePatch() { "false" ) + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) + return PatchResultSuccess() } + private companion object { + private const val FILTER_CLASS_DESCRIPTOR = + "$MUSIC_ADS_PATH/CarouselShelfFilter;" + } } diff --git a/src/main/kotlin/app/revanced/patches/music/layout/colormatchplayer/patch/ColorMatchPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/colormatchplayer/patch/ColorMatchPlayerPatch.kt index 57d028806..126bbd530 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/colormatchplayer/patch/ColorMatchPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/colormatchplayer/patch/ColorMatchPlayerPatch.kt @@ -27,7 +27,7 @@ import org.jf.dexlib2.iface.instruction.ReferenceInstruction @Patch @Name("enable-color-match-player") -@Description("Matches the fullscreen player color with the minimized one.") +@Description("Matches the color of the mini player and the fullscreen player.") @DependsOn([SettingsPatch::class]) @MusicCompatibility @Version("0.0.1") diff --git a/src/main/kotlin/app/revanced/patches/music/layout/playlistcard/patch/HidePlaylistCardPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/playlistcard/patch/HidePlaylistCardPatch.kt index fad245f76..20ab225a4 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/playlistcard/patch/HidePlaylistCardPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/playlistcard/patch/HidePlaylistCardPatch.kt @@ -13,6 +13,7 @@ import app.revanced.patches.music.utils.annotations.MusicCompatibility import app.revanced.patches.music.utils.litho.patch.LithoFilterPatch import app.revanced.patches.music.utils.settings.resource.patch.SettingsPatch import app.revanced.util.enum.CategoryType +import app.revanced.util.integrations.Constants.MUSIC_ADS_PATH @Patch @Name("hide-playlist-card") @@ -34,6 +35,12 @@ class HidePlaylistCardPatch : BytecodePatch() { "false" ) + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) + return PatchResultSuccess() } + private companion object { + private const val FILTER_CLASS_DESCRIPTOR = + "$MUSIC_ADS_PATH/PlaylistCardFilter;" + } } diff --git a/src/main/kotlin/app/revanced/patches/music/utils/litho/fingerprints/LithoFilterFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/litho/fingerprints/LithoFilterFingerprint.kt new file mode 100644 index 000000000..ed9df4f9a --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/utils/litho/fingerprints/LithoFilterFingerprint.kt @@ -0,0 +1,13 @@ +package app.revanced.patches.music.utils.litho.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.method.impl.MethodFingerprint +import org.jf.dexlib2.AccessFlags + +object LithoFilterFingerprint : MethodFingerprint( + returnType = "V", + accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC or AccessFlags.CONSTRUCTOR, + customFingerprint = { methodDef, _ -> + methodDef.definingClass == "Lapp/revanced/music/patches/ads/LithoFilterPatch;" + } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/litho/patch/LithoFilterPatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/litho/patch/LithoFilterPatch.kt index 94c27d132..d6e1ffeea 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/litho/patch/LithoFilterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/litho/patch/LithoFilterPatch.kt @@ -1,23 +1,57 @@ package app.revanced.patches.music.utils.litho.patch +import app.revanced.extensions.toErrorResult import app.revanced.patcher.annotation.Version import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions +import app.revanced.patcher.extensions.InstructionExtensions.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.patches.music.utils.annotations.MusicCompatibility +import app.revanced.patches.music.utils.litho.fingerprints.LithoFilterFingerprint import app.revanced.patches.shared.patch.litho.ComponentParserPatch import app.revanced.patches.shared.patch.litho.ComponentParserPatch.Companion.identifierHook import app.revanced.util.integrations.Constants.MUSIC_ADS_PATH +import java.io.Closeable @DependsOn([ComponentParserPatch::class]) @MusicCompatibility @Version("0.0.1") -class LithoFilterPatch : BytecodePatch() { +class LithoFilterPatch : BytecodePatch( + listOf(LithoFilterFingerprint) +), Closeable { override fun execute(context: BytecodeContext): PatchResult { identifierHook("$MUSIC_ADS_PATH/LithoFilterPatch;->filter") + LithoFilterFingerprint.result?.mutableMethod?.apply { + removeInstructions(2, 4) // Remove dummy filter. + + addFilter = { classDescriptor -> + addInstructions( + 2, + """ + new-instance v1, $classDescriptor + invoke-direct {v1}, $classDescriptor->()V + const/4 v2, ${filterCount++} + aput-object v1, v0, v2 + """ + ) + } + } ?: return LithoFilterFingerprint.toErrorResult() + return PatchResultSuccess() } + + override fun close() = LithoFilterFingerprint.result!! + .mutableMethod.replaceInstruction(0, "const/4 v0, $filterCount") + + companion object { + internal lateinit var addFilter: (String) -> Unit + private set + + private var filterCount = 0 + } }