From 466043132afc704d00587ecf118025a9a0ef64c2 Mon Sep 17 00:00:00 2001 From: oSumAtrIX Date: Fri, 23 Jan 2026 23:26:14 +0100 Subject: [PATCH] regex --- .../com/sbs/ondemand/tv/Fingerprints.kt | 12 ++- .../feed/LimitFeedToFollowedProfiles.kt | 5 +- .../instagram/hide/navigation/Fingerprints.kt | 10 ++- .../hide/navigation/HideNavigationButtons.kt | 43 ++++----- .../instagram/hide/stories/HideStories.kt | 2 +- .../misc/devmenu/EnableDeveloperMenuPatch.kt | 13 ++- .../instagram/misc/devmenu/Fingerprints.kt | 4 +- .../misc/share/EditShareLinksPatch.kt | 14 +-- .../PermalinkResponseJsonParserFingerprint.kt | 9 +- .../domain/ChangeLinkSharingDomainPatch.kt | 8 +- .../misc/share/domain/Fingerprint.kt | 8 +- .../instagram/misc/signature/Fingerprints.kt | 13 ++- .../misc/signature/SignatureCheckPatch.kt | 8 +- .../patches/music/ad/video/Fingerprints.kt | 11 ++- .../patches/music/ad/video/HideVideoAds.kt | 10 +-- .../EnableExclusiveAudioPlayback.kt | 6 +- .../audio/exclusiveaudio/Fingerprints.kt | 11 ++- .../layout/compactheader/Fingerprints.kt | 11 ++- .../layout/compactheader/HideCategoryBar.kt | 4 +- .../miniplayercolor/ChangeMiniplayerColor.kt | 33 +++---- .../layout/miniplayercolor/Fingerprints.kt | 15 +++- .../layout/navigationbar/Fingerprints.kt | 11 ++- .../navigationbar/NavigationBarPatch.kt | 4 +- .../revanced/patches/nunl/ads/Fingerprints.kt | 11 ++- .../branding/BaseCustomBrandingPatch.kt | 87 ++++++++++--------- .../shared/layout/branding/Fingerprints.kt | 13 ++- .../shared/layout/theme/Fingerprints.kt | 11 ++- .../layout/theme/LithoColorHookPatch.kt | 6 +- .../misc/fix/verticalscroll/Fingerprints.kt | 11 ++- .../fix/verticalscroll/VerticalScrollPatch.kt | 2 +- .../patches/shared/misc/gms/Fingerprints.kt | 17 ++-- .../shared/misc/gms/GmsCoreSupportPatch.kt | 25 +++--- .../license/DisableLicenseCheckPatch.kt | 8 +- .../misc/pairip/license/Fingerprints.kt | 10 +-- .../shared/misc/settings/Fingerprints.kt | 13 ++- .../shared/misc/settings/SettingsPatch.kt | 32 ++++--- .../patches/shared/misc/spoof/Fingerprints.kt | 12 +-- .../misc/spoof/SpoofVideoStreamsPatch.kt | 9 +- .../patches/songpal/badge/BadgeTabPatch.kt | 2 +- .../patches/songpal/badge/Fingerprints.kt | 13 ++- .../badge/RemoveNotificationBadgePatch.kt | 2 +- .../spotify/layout/theme/CustomThemePatch.kt | 44 +++++----- .../spotify/layout/theme/Fingerprints.kt | 17 ++-- .../spotify/misc/extension/Fingerprints.kt | 4 +- .../patches/spotify/misc/extension/Hooks.kt | 4 +- .../spotify/misc/fix/login/Fingerprints.kt | 13 ++- .../misc/fix/login/FixFacebookLoginPatch.kt | 6 +- .../misc/lyrics/ChangeLyricsProviderPatch.kt | 5 +- .../spotify/misc/lyrics/Fingerprints.kt | 11 ++- .../spotify/misc/privacy/Fingerprints.kt | 17 ++-- .../misc/privacy/SanitizeSharingLinksPatch.kt | 20 ++--- .../spotify/misc/widgets/Fingerprints.kt | 11 ++- .../widgets/FixThirdPartyLaunchersWidgets.kt | 2 +- .../patches/spotify/shared/Fingerprints.kt | 7 +- .../strava/mediaupload/Fingerprints.kt | 8 +- .../OverwriteMediaUploadParametersPatch.kt | 6 +- .../ticktick/misc/themeunlock/Fingerprints.kt | 9 +- .../misc/themeunlock/UnlockThemePatch.kt | 2 +- .../tiktok/feedfilter/FeedFilterPatch.kt | 11 ++- .../cleardisplay/RememberClearDisplayPatch.kt | 8 +- .../interaction/downloads/DownloadsPatch.kt | 4 +- .../interaction/speed/PlaybackSpeedPatch.kt | 8 +- .../DisableLoginRequirementPatch.kt | 4 +- .../login/disablerequirement/Fingerprints.kt | 6 +- .../tiktok/misc/settings/Fingerprints.kt | 12 ++- .../tiktok/misc/settings/SettingsPatch.kt | 20 ++--- .../tiktok/misc/spoof/sim/SpoofSimPatch.kt | 4 +- .../patches/tiktok/shared/Fingerprints.kt | 13 ++- .../tudortmund/lockscreen/Fingerprints.kt | 11 ++- .../lockscreen/ShowOnLockscreenPatch.kt | 10 +-- .../DisableBlogNotificationReminderPatch.kt | 2 +- .../annoyances/notifications/Fingerprints.kt | 4 +- .../tumblr/featureflags/Fingerprints.kt | 11 ++- .../featureflags/OverrideFeatureFlagsPatch.kt | 14 +-- .../patches/tumblr/fixes/Fingerprints.kt | 13 ++- .../tumblr/fixes/FixOldVersionsPatch.kt | 8 +- .../FilterTimelineObjectsPatch.kt | 8 +- .../tumblr/timelinefilter/Fingerprints.kt | 17 ++-- .../twitch/misc/settings/SettingsPatch.kt | 7 +- .../interaction/downloads/Fingerprints.kt | 15 +++- .../downloads/UnlockDownloadsPatch.kt | 7 +- .../links/ChangeLinkSharingDomainPatch.kt | 16 ++-- .../twitter/misc/links/Fingerprints.kt | 17 ++-- .../misc/links/SanitizeSharingLinksPatch.kt | 4 +- .../patches/viber/ads/Fingerprints.kt | 4 +- .../patches/viber/ads/HideAdsPatch.kt | 5 +- .../patches/viber/misc/navbar/Fingerprints.kt | 12 ++- .../youtube/ad/general/Fingerprints.kt | 11 ++- .../youtube/ad/general/HideAdsPatch.kt | 2 +- .../youtube/ad/getpremium/Fingerprints.kt | 11 ++- .../ad/getpremium/HideGetPremiumPatch.kt | 6 +- .../patches/youtube/ad/video/Fingerprints.kt | 4 +- .../patches/youtube/ad/video/VideoAdsPatch.kt | 6 +- .../interaction/dialog/Fingerprints.kt | 11 ++- .../RemoveViewerDiscretionDialogPatch.kt | 6 +- .../DisableChapterSkipDoubleTapPatch.kt | 5 +- .../interaction/doubletap/Fingerprints.kt | 13 ++- .../interaction/downloads/DownloadsPatch.kt | 8 +- .../interaction/downloads/Fingerprints.kt | 11 ++- .../seekbar/EnableSeekbarTappingPatch.kt | 16 ++-- .../seekbar/EnableSlideToSeekPatch.kt | 12 +-- .../interaction/seekbar/Fingerprints.kt | 14 +-- .../seekbar/SeekbarThumbnailsPatch.kt | 4 +- .../interaction/swipecontrols/Fingerprints.kt | 13 ++- .../swipecontrols/SwipeControlsPatch.kt | 18 ++-- .../layout/autocaptions/AutoCaptionsPatch.kt | 12 +-- .../layout/autocaptions/Fingerprints.kt | 15 +++- .../layout/buttons/navigation/Fingerprints.kt | 21 +++-- .../navigation/NavigationButtonsPatch.kt | 28 +++--- .../overlay/HidePlayerOverlayButtonsPatch.kt | 4 +- .../formfactor/ChangeFormFactorPatch.kt | 3 +- .../youtube/layout/formfactor/Fingerprints.kt | 13 ++- .../hide/endscreencards/Fingerprints.kt | 17 ++-- .../endscreencards/HideEndScreenCardsPatch.kt | 8 +- .../hide/endscreensuggestion/Fingerprints.kt | 15 +++- .../HideEndScreenSuggestedVideoPatch.kt | 14 +-- .../DisableFullscreenAmbientModePatch.kt | 4 +- .../fullscreenambientmode/Fingerprints.kt | 11 ++- .../layout/hide/general/Fingerprints.kt | 39 +++++---- .../hide/general/HideLayoutComponentsPatch.kt | 37 ++++---- .../layout/hide/infocards/Fingerprints.kt | 11 ++- .../hide/infocards/HideInfoCardsPatch.kt | 8 +- .../hide/relatedvideooverlay/Fingerprints.kt | 13 ++- .../HideRelatedVideoOverlayPatch.kt | 10 +-- .../DisableRollingNumberAnimationPatch.kt | 6 +- .../layout/hide/shorts/Fingerprints.kt | 29 ++++--- .../hide/shorts/HideShortsComponentsPatch.kt | 18 ++-- .../DisableSignInToTvPatchPopup.kt | 8 +- .../hide/signintotvpopup/Fingerprints.kt | 11 ++- .../youtube/layout/hide/time/Fingerprints.kt | 11 ++- .../layout/hide/time/HideTimestampPatch.kt | 6 +- .../youtube/layout/miniplayer/Fingerprints.kt | 63 ++++++++------ .../layout/miniplayer/MiniplayerPatch.kt | 59 +++++++------ .../layout/panels/popup/Fingerprints.kt | 4 +- .../panels/popup/PlayerPopupPanelsPatch.kt | 6 +- .../layout/player/fullscreen/Fingerprints.kt | 15 +++- .../OpenVideosFullscreenHookPatch.kt | 13 ++- .../fullscreen/OpenVideosFullscreenPatch.kt | 8 +- .../CustomPlayerOverlayOpacityPatch.kt | 6 +- .../layout/player/overlay/Fingerprints.kt | 11 ++- .../returnyoutubedislike/Fingerprints.kt | 37 ++++---- .../ReturnYouTubeDislikePatch.kt | 70 +++++++-------- .../youtube/layout/searchbar/Fingerprints.kt | 17 ++-- .../layout/searchbar/WideSearchbarPatch.kt | 22 ++--- .../youtube/layout/seekbar/Fingerprints.kt | 37 ++++---- .../layout/seekbar/SeekbarColorPatch.kt | 36 ++++---- .../layout/shortsautoplay/Fingerprints.kt | 19 ++-- .../shortsautoplay/ShortsAutoplayPatch.kt | 36 ++++---- .../layout/spoofappversion/Fingerprints.kt | 13 ++- .../spoofappversion/SpoofAppVersionPatch.kt | 24 ++--- .../layout/startpage/ChangeStartPagePatch.kt | 16 ++-- .../youtube/layout/startpage/Fingerprints.kt | 13 ++- .../DisableResumingShortsOnStartupPatch.kt | 18 ++-- .../layout/startupshortsreset/Fingerprints.kt | 15 +++- .../youtube/layout/theme/Fingerprints.kt | 15 +++- .../youtube/layout/theme/ThemePatch.kt | 46 +++++----- .../BackgroundPlaybackPatch.kt | 12 +-- .../misc/backgroundplayback/Fingerprints.kt | 21 +++-- .../misc/dimensions/spoof/Fingerprints.kt | 11 ++- .../spoof/SpoofDeviceDimensionsPatch.kt | 4 +- .../fix/backtoexitgesture/Fingerprints.kt | 13 ++- .../FixBackToExitGesturePatch.kt | 18 ++-- .../FIxContentProviderPatch.kt | 10 +-- .../misc/fix/contentprovider/Fingerprints.kt | 11 ++- .../misc/fix/playbackspeed/Fingerprints.kt | 11 ++- .../FixPlaybackSpeedWhilePlayingPatch.kt | 6 +- .../gms/AccountCredentialsInvalidTextPatch.kt | 8 +- .../patches/youtube/misc/gms/Fingerprints.kt | 13 ++- .../DisableHapticFeedbackPatch.kt | 16 ++-- .../misc/hapticfeedback/Fingerprints.kt | 10 +-- .../misc/imageurlhook/CronetImageUrlHook.kt | 20 ++--- .../youtube/misc/imageurlhook/Fingerprints.kt | 21 +++-- .../misc/links/BypassURLRedirectsPatch.kt | 10 +-- .../youtube/misc/links/Fingerprints.kt | 15 +++- .../youtube/misc/litho/filter/Fingerprints.kt | 25 ++++-- .../misc/litho/filter/LithoFilterPatch.kt | 36 ++++---- .../youtube/misc/loopvideo/Fingerprints.kt | 11 ++- .../youtube/misc/loopvideo/LoopVideoPatch.kt | 6 +- .../youtube/misc/navigation/Fingerprints.kt | 36 +++++--- .../misc/navigation/NavigationBarHookPatch.kt | 60 ++++++------- .../misc/playercontrols/Fingerprints.kt | 41 +++++---- .../PlayerControlsOverlayVisibilityPatch.kt | 4 +- .../playercontrols/PlayerControlsPatch.kt | 36 ++++---- .../youtube/misc/playertype/Fingerprints.kt | 17 ++-- .../misc/playertype/PlayerTypeHookPatch.kt | 9 +- .../recyclerviewtree/hook/Fingerprints.kt | 11 ++- .../hook/RecyclerViewTreeHookPatch.kt | 4 +- .../youtube/misc/settings/Fingerprints.kt | 17 ++-- .../youtube/misc/settings/SettingsPatch.kt | 66 +++++++------- .../patches/youtube/shared/Fingerprints.kt | 10 +-- .../video/codecs/DisableVideoCodecsPatch.kt | 54 +++++++----- .../youtube/video/codecs/Fingerprints.kt | 11 ++- .../video/playerresponse/Fingerprints.kt | 23 +++-- .../PlayerResponseMethodHookPatch.kt | 19 ++-- .../quality/AdvancedVideoQualityMenuPatch.kt | 4 +- .../youtube/video/quality/Fingerprints.kt | 19 ++-- .../quality/RememberVideoQualityPatch.kt | 16 ++-- .../speed/custom/CustomPlaybackSpeedPatch.kt | 42 ++++----- .../video/speed/custom/Fingerprints.kt | 25 ++++-- .../video/speed/remember/Fingerprints.kt | 11 ++- .../remember/RememberPlaybackSpeedPatch.kt | 12 +-- .../youtube/video/videoid/Fingerprints.kt | 13 ++- .../youtube/video/videoid/VideoIdPatch.kt | 8 +- 203 files changed, 1786 insertions(+), 1262 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/Fingerprints.kt index 533294d492..af716a22aa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/com/sbs/ondemand/tv/Fingerprints.kt @@ -1,12 +1,17 @@ package app.revanced.patches.com.sbs.ondemand.tv +import app.revanced.patcher.accessFlags import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.name +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.returnType - -internal val BytecodePatchContext.shouldShowAdvertisingTVMethod by gettingFirstMutableMethodDeclaratively { +import app.revanced.patcher.returnTypeinternal val BytecodePatchContext.shouldShowAdvertisingTVMethod by gettingFirstMutableMethodDeclaratively { name("getShouldShowAdvertisingTV") definingClass("Lcom/sbs/ondemand/common/InMemoryStorage;") returnType("Z") @@ -16,11 +21,10 @@ internal val BytecodePatchContext.shouldShowPauseAdMethod by gettingFirstMutable name("shouldShowPauseAd") definingClass("Lcom/sbs/ondemand/player/viewmodels/PauseAdController;") returnType("Z") - } internal val BytecodePatchContext.requestAdStreamMethod by gettingFirstMutableMethodDeclaratively { name("requestAdStream\$player_googleStoreTvRelease") definingClass("Lcom/sbs/ondemand/player/viewmodels/AdsController;") returnType("V") -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/LimitFeedToFollowedProfiles.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/LimitFeedToFollowedProfiles.kt index df5d95eed3..3c149ea62c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/LimitFeedToFollowedProfiles.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/LimitFeedToFollowedProfiles.kt @@ -3,7 +3,6 @@ package app.revanced.patches.instagram.feed import app.revanced.patcher.classDef import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction -import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch import app.revanced.util.getReference @@ -41,13 +40,13 @@ val `Limit feed to followed profiles` by creatingBytecodePatch( } } - val initMainFeedRequestFingerprint = fingerprint { + val initMainFeedRequestMethod = fingerprint { custom { method, classDef -> method.name == "" && classDef == mainFeedRequestClassMethod.classDef } } - initMainFeedRequestFingerprint.method.apply { + initMainFeedRequestMethod.apply { // Finds the instruction where the map is being initialized in the constructor val getHeaderIndex = indexOfFirstInstructionOrThrow { getReference().let { diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt index b9a8165aba..64af27690d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/Fingerprints.kt @@ -1,11 +1,17 @@ package app.revanced.patches.instagram.hide.navigation -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val initializeNavigationButtonsListFingerprint = fingerprint { +internal val BytecodePatchContext.initializeNavigationButtonsListMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes("Lcom/instagram/common/session/UserSession;", "Z") returnType("Ljava/util/List;") diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt index 95ca430fe2..d2380e65cc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/navigation/HideNavigationButtons.kt @@ -1,7 +1,6 @@ package app.revanced.patches.instagram.hide.navigation import app.revanced.patcher.extensions.getInstruction -import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.booleanOption import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch @@ -21,7 +20,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = @Suppress("unused", "ObjectPropertyName") val `Hide navigation buttons` by creatingBytecodePatch( description = "Hides navigation bar buttons, such as the Reels and Create button.", - use = false + use = false, ) { compatibleWith("com.instagram.android"("401.0.0.48.79")) @@ -30,53 +29,52 @@ val `Hide navigation buttons` by creatingBytecodePatch( val hideHome by booleanOption( default = false, name = "Hide Home", - description = "Permanently hides the Home button. App starts at next available tab." // On the "homecoming" / current instagram layout. + description = "Permanently hides the Home button. App starts at next available tab.", // On the "homecoming" / current instagram layout. ) val hideReels by booleanOption( default = true, name = "Hide Reels", - description = "Permanently hides the Reels button." + description = "Permanently hides the Reels button.", ) val hideDirect by booleanOption( default = false, name = "Hide Direct", - description = "Permanently hides the Direct button." + description = "Permanently hides the Direct button.", ) val hideSearch by booleanOption( default = false, name = "Hide Search", - description = "Permanently hides the Search button." + description = "Permanently hides the Search button.", ) val hideProfile by booleanOption( default = false, name = "Hide Profile", - description = "Permanently hides the Profile button." + description = "Permanently hides the Profile button.", ) val hideCreate by booleanOption( default = true, name = "Hide Create", - description = "Permanently hides the Create button." + description = "Permanently hides the Create button.", ) apply { if (!hideHome!! && !hideReels!! && !hideDirect!! && !hideSearch!! && !hideProfile!! && !hideCreate!!) { return@apply Logger.getLogger(this::class.java.name).warning( - "No hide navigation buttons options are enabled. No changes made." + "No hide navigation buttons options are enabled. No changes made.", ) } - // Get the field name which contains the name of the enum for the navigation button // ("fragment_clips", "fragment_share", ...) val navigationButtonsEnumInitFingerprint = fingerprint { custom { method, classDef -> - method.name == "" - && classDef == navigationButtonsEnumClassDef.classDef + method.name == "" && + classDef == navigationButtonsEnumClassDef.classDef } } @@ -84,68 +82,65 @@ val `Hide navigation buttons` by creatingBytecodePatch( with(navigationButtonsEnumInitFingerprint.method) { enumNameField = indexOfFirstInstructionOrThrow { opcode == Opcode.IPUT_OBJECT && - (this as TwoRegisterInstruction).registerA == 2 // p2 register. + (this as TwoRegisterInstruction).registerA == 2 // p2 register. }.let { getInstruction(it).getReference()!!.name } } - initializeNavigationButtonsListFingerprint.method.apply { + initializeNavigationButtonsListMethod.apply { val returnIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN_OBJECT) val buttonsListRegister = getInstruction(returnIndex).registerA val freeRegister = findFreeRegister(returnIndex) val freeRegister2 = findFreeRegister(returnIndex, freeRegister) - fun instructionsRemoveButtonByName(buttonEnumName: String): String { - return """ + fun instructionsRemoveButtonByName(buttonEnumName: String): String = """ const-string v$freeRegister, "$buttonEnumName" const-string v$freeRegister2, "$enumNameField" invoke-static { v$buttonsListRegister, v$freeRegister, v$freeRegister2 }, $EXTENSION_CLASS_DESCRIPTOR->removeNavigationButtonByName(Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)Ljava/util/List; move-result-object v$buttonsListRegister """ - } if (hideHome!!) { addInstructionsAtControlFlowLabel( returnIndex, - instructionsRemoveButtonByName("fragment_feed") + instructionsRemoveButtonByName("fragment_feed"), ) } if (hideReels!!) { addInstructionsAtControlFlowLabel( returnIndex, - instructionsRemoveButtonByName("fragment_clips") + instructionsRemoveButtonByName("fragment_clips"), ) } if (hideDirect!!) { addInstructionsAtControlFlowLabel( returnIndex, - instructionsRemoveButtonByName("fragment_direct_tab") + instructionsRemoveButtonByName("fragment_direct_tab"), ) } if (hideSearch!!) { addInstructionsAtControlFlowLabel( returnIndex, - instructionsRemoveButtonByName("fragment_search") + instructionsRemoveButtonByName("fragment_search"), ) } if (hideCreate!!) { addInstructionsAtControlFlowLabel( returnIndex, - instructionsRemoveButtonByName("fragment_share") + instructionsRemoveButtonByName("fragment_share"), ) } if (hideProfile!!) { addInstructionsAtControlFlowLabel( returnIndex, - instructionsRemoveButtonByName("fragment_profile") + instructionsRemoveButtonByName("fragment_profile"), ) } - } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt index 1c3d23b7a6..2af9dd5e4c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/HideStories.kt @@ -14,6 +14,6 @@ val `Hide Stories from Home` by creatingBytecodePatch( val addStoryEndIndex = getOrCreateAvatarViewMethod.indices.last() // Remove addView of Story. - getOrCreateAvatarViewMethod.method.removeInstruction(addStoryEndIndex) + getOrCreateAvatarViewMethod.removeInstruction(addStoryEndIndex) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt index 138b8be789..bd897e7866 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/EnableDeveloperMenuPatch.kt @@ -15,22 +15,21 @@ val `Enable developer menu` by creatingBytecodePatch( It is recommended to use this patch with an alpha/beta Instagram release. Patching a stable release works, but the developer menu shows the developer flags as numbers and does not show a human readable description. """.trimIndentMultiline(), - use = false + use = false, ) { compatibleWith("com.instagram.android") apply { - with(clearNotificationReceiverFingerprint.method) { - indexOfFirstInstructionReversedOrThrow(clearNotificationReceiverFingerprint.stringMatches.first().index) { + with(clearNotificationReceiverMethod) { + indexOfFirstInstructionReversedOrThrow(clearNotificationReceiverMethod.stringMatches.first().index) { val reference = getReference() opcode in listOf(Opcode.INVOKE_STATIC, Opcode.INVOKE_STATIC_RANGE) && - reference?.parameterTypes?.size == 1 && - reference.parameterTypes.first() == "Lcom/instagram/common/session/UserSession;" && - reference.returnType == "Z" + reference?.parameterTypes?.size == 1 && + reference.parameterTypes.first() == "Lcom/instagram/common/session/UserSession;" && + reference.returnType == "Z" }.let { index -> navigate(this).to(index).stop().returnEarly(true) } } } } - diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt index 8b84606f00..7b53e29368 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/devmenu/Fingerprints.kt @@ -1,9 +1,7 @@ package app.revanced.patches.instagram.misc.devmenu -import app.revanced.patcher.fingerprint - -internal val clearNotificationReceiverFingerprint = fingerprint { +internal val BytecodePatchContext.clearNotificationReceiverMethod by gettingFirstMethodDeclaratively { custom { method, classDef -> method.name == "onReceive" && classDef.type == "Lcom/instagram/notifications/push/ClearNotificationReceiver;" diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt index 61ba7ea423..dfdea56022 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/EditShareLinksPatch.kt @@ -2,25 +2,25 @@ package app.revanced.patches.instagram.misc.share import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.BytecodePatchContext -import com.android.tools.smali.dexlib2.mutable.MutableMethod import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import com.android.tools.smali.dexlib2.mutable.MutableMethod context(BytecodePatchContext) internal fun editShareLinksPatch(block: MutableMethod.(index: Int, register: Int) -> Unit) { val fingerprintsToPatch = arrayOf( - permalinkResponseJsonParserFingerprint, - storyUrlResponseJsonParserFingerprint, - profileUrlResponseJsonParserFingerprint, - liveUrlResponseJsonParserFingerprint + permalinkResponseJsonParserMethod, + storyUrlResponseJsonParserMethod, + profileUrlResponseJsonParserMethod, + liveUrlResponseJsonParserMethod, ) for (fingerprint in fingerprintsToPatch) { fingerprint.method.apply { val putSharingUrlIndex = indexOfFirstInstruction( - permalinkResponseJsonParserFingerprint.stringMatches.first().index, - Opcode.IPUT_OBJECT + permalinkResponseJsonParserMethod.stringMatches.first().index, + Opcode.IPUT_OBJECT, ) val sharingUrlRegister = getInstruction(putSharingUrlIndex).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt index 801ce5693b..c11bbd028f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/PermalinkResponseJsonParserFingerprint.kt @@ -1,24 +1,23 @@ package app.revanced.patches.instagram.misc.share -import app.revanced.patcher.fingerprint import com.google.common.util.concurrent.Striped.custom -internal val permalinkResponseJsonParserFingerprint = fingerprint { +internal val BytecodePatchContext.permalinkResponseJsonParserMethod by gettingFirstMethodDeclaratively { strings("permalink", "PermalinkResponse") custom { method, _ -> method.name == "parseFromJson" } } -internal val storyUrlResponseJsonParserFingerprint = fingerprint { +internal val BytecodePatchContext.storyUrlResponseJsonParserMethod by gettingFirstMethodDeclaratively { strings("story_item_to_share_url", "StoryItemUrlResponse") custom { method, _ -> method.name == "parseFromJson" } } -internal val profileUrlResponseJsonParserFingerprint = fingerprint { +internal val BytecodePatchContext.profileUrlResponseJsonParserMethod by gettingFirstMethodDeclaratively { strings("profile_to_share_url", "ProfileUrlResponse") custom { method, _ -> method.name == "parseFromJson" } } -internal val liveUrlResponseJsonParserFingerprint = fingerprint { +internal val BytecodePatchContext.liveUrlResponseJsonParserMethod by gettingFirstMethodDeclaratively { strings("live_to_share_url", "LiveItemLinkUrlResponse") custom { method, _ -> method.name == "parseFromJson" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt index e3b2abab50..5f301f07f5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/ChangeLinkSharingDomainPatch.kt @@ -13,7 +13,7 @@ internal const val EXTENSION_CLASS_DESCRIPTOR = @Suppress("unused") val `Change link sharing domain` by creatingBytecodePatch( description = "Replaces the domain name of shared links.", - use = false + use = false, ) { compatibleWith("com.instagram.android") @@ -22,11 +22,11 @@ val `Change link sharing domain` by creatingBytecodePatch( val customDomainHost by stringOption( default = "imginn.com", name = "Domain name", - description = "The domain name to use when sharing links." + description = "The domain name to use when sharing links.", ) apply { - getCustomShareDomainFingerprint.method.returnEarly(customDomainHost!!) + getCustomShareDomainMethod.returnEarly(customDomainHost!!) editShareLinksPatch { index, register -> addInstructions( @@ -34,7 +34,7 @@ val `Change link sharing domain` by creatingBytecodePatch( """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setCustomShareDomain(Ljava/lang/String;)Ljava/lang/String; move-result-object v$register - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt index 92d403fbd9..5bcf40e6a3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt @@ -1,9 +1,13 @@ package app.revanced.patches.instagram.misc.share.domain -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val getCustomShareDomainFingerprint = fingerprint { +internal val BytecodePatchContext.getCustomShareDomainMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("Ljava/lang/String;") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt index 6be7ae8801..f0385ac5f8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/Fingerprints.kt @@ -1,15 +1,22 @@ package app.revanced.patches.instagram.misc.signature -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val isValidSignatureClassFingerprint = fingerprint { +internal val BytecodePatchContext.isValidSignatureClassMethod by gettingFirstMethodDeclaratively { strings("The provider for uri '", "' is not trusted: ") } -internal val isValidSignatureMethodFingerprint = fingerprint { +internal val BytecodePatchContext.isValidSignatureMethodMethod by gettingFirstMethodDeclaratively { parameterTypes("L", "Z") returnType("Z") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt index 507cfaae88..2f3aaa85fa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt @@ -6,14 +6,14 @@ import app.revanced.util.returnEarly @Suppress("unused") val `Disable signature check` by creatingBytecodePatch( description = "Disables the signature check that can cause the app to crash on startup. " + - "Using this patch may cause issues with sharing or opening external Instagram links.", - use = false + "Using this patch may cause issues with sharing or opening external Instagram links.", + use = false, ) { compatibleWith("com.instagram.android") apply { - isValidSignatureMethodFingerprint - .match(isValidSignatureClassFingerprint.classDef) + isValidSignatureMethodMethod + .match(isValidSignatureClassMethod.classDef) .method .returnEarly(true) } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt index 6ce0519ada..8b9f4e48b9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt @@ -1,9 +1,16 @@ package app.revanced.patches.music.ad.video -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.Opcode -internal val showVideoAdsParentFingerprint = fingerprint { +internal val BytecodePatchContext.showVideoAdsParentMethod by gettingFirstMethodDeclaratively { opcodes( Opcode.MOVE_RESULT_OBJECT, Opcode.INVOKE_VIRTUAL, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt index b4457d728c..e57c06a442 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/ad/video/HideVideoAds.kt @@ -24,8 +24,8 @@ val `Hide music video ads` by creatingBytecodePatch( compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) apply { @@ -35,15 +35,15 @@ val `Hide music video ads` by creatingBytecodePatch( SwitchPreference("revanced_music_hide_video_ads"), ) - navigate(showVideoAdsParentFingerprint.originalMethod) - .to(showVideoAdsParentFingerprint.instructionMatches.first().index + 1) + navigate(showVideoAdsParentMethod.originalMethod) + .to(showVideoAdsParentMethod.instructionMatches.first().index + 1) .stop() .addInstructions( 0, """ invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->showVideoAds(Z)Z move-result p1 - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt b/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt index 1545a86952..466cef576a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt @@ -17,11 +17,11 @@ val `Enable exclusive audio playback` by creatingBytecodePatch( compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) apply { - allowExclusiveAudioPlaybackFingerprint.method.returnEarly(true) + allowExclusiveAudioPlaybackMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/Fingerprints.kt index 036b3ea5e8..ae99ad68b2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/Fingerprints.kt @@ -1,10 +1,17 @@ package app.revanced.patches.music.audio.exclusiveaudio -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val allowExclusiveAudioPlaybackFingerprint = fingerprint { +internal val BytecodePatchContext.allowExclusiveAudioPlaybackMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt index 43f7257db6..a21e228204 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/Fingerprints.kt @@ -1,10 +1,17 @@ package app.revanced.patches.music.layout.compactheader -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.literal import com.android.tools.smali.dexlib2.Opcode -internal val chipCloudFingerprint = fingerprint { +internal val BytecodePatchContext.chipCloudMethod by gettingFirstMethodDeclaratively { returnType("V") opcodes( Opcode.CONST, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt index 994572f9c9..01a22ae436 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/compactheader/HideCategoryBar.kt @@ -43,8 +43,8 @@ val `Hide category bar` by creatingBytecodePatch( chipCloud = ResourceType.LAYOUT["chip_cloud"] - chipCloudFingerprint.method.apply { - val targetIndex = chipCloudFingerprint.patternMatch.endIndex + chipCloudMethod.apply { + val targetIndex = chipCloudMethod.patternMatch.endIndex val targetRegister = getInstruction(targetIndex).registerA addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColor.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColor.kt index 9d34c06715..cef2c083ce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColor.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/ChangeMiniplayerColor.kt @@ -22,20 +22,20 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/pa @Suppress("unused") val `Change miniplayer color` by creatingBytecodePatch( - description = "Adds an option to change the miniplayer background color to match the fullscreen player." + description = "Adds an option to change the miniplayer background color to match the fullscreen player.", ) { dependsOn( sharedExtensionPatch, settingsPatch, addResourcesPatch, - resourceMappingPatch + resourceMappingPatch, ) compatibleWith( "com.google.android.apps.youtube.music"( "7.29.52", - "8.10.52" - ) + "8.10.52", + ), ) apply { @@ -45,34 +45,37 @@ val `Change miniplayer color` by creatingBytecodePatch( SwitchPreference("revanced_music_change_miniplayer_color"), ) - switchToggleColorFingerprint.match(miniPlayerConstructorFingerprint.classDef).let { + switchToggleColorMethod.match(miniPlayerConstructorMethod.classDef).let { val relativeIndex = it.patternMatch.endIndex + 1 val invokeVirtualIndex = it.method.indexOfFirstInstructionOrThrow( - relativeIndex, Opcode.INVOKE_VIRTUAL + relativeIndex, + Opcode.INVOKE_VIRTUAL, ) val colorMathPlayerInvokeVirtualReference = it.method .getInstruction(invokeVirtualIndex).reference val iGetIndex = it.method.indexOfFirstInstructionOrThrow( - relativeIndex, Opcode.IGET + relativeIndex, + Opcode.IGET, ) val colorMathPlayerIGetReference = it.method .getInstruction(iGetIndex).reference as FieldReference - val colorGreyIndex = miniPlayerConstructorFingerprint.method.indexOfFirstInstructionReversedOrThrow { + val colorGreyIndex = miniPlayerConstructorMethod.indexOfFirstInstructionReversedOrThrow { getReference()?.name == "getColor" } - val iPutIndex = miniPlayerConstructorFingerprint.method.indexOfFirstInstructionOrThrow( - colorGreyIndex, Opcode.IPUT + val iPutIndex = miniPlayerConstructorMethod.indexOfFirstInstructionOrThrow( + colorGreyIndex, + Opcode.IPUT, ) - val colorMathPlayerIPutReference = miniPlayerConstructorFingerprint.method + val colorMathPlayerIPutReference = miniPlayerConstructorMethod .getInstruction(iPutIndex).reference - miniPlayerConstructorFingerprint.classDef.methods.single { method -> + miniPlayerConstructorMethod.classDef.methods.single { method -> method.accessFlags == AccessFlags.PUBLIC.value or AccessFlags.FINAL.value && - method.returnType == "V" && - method.parameters == it.originalMethod.parameters + method.returnType == "V" && + method.parameters == it.originalMethod.parameters }.apply { val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.INVOKE_DIRECT) val freeRegister = findFreeRegister(insertIndex) @@ -90,7 +93,7 @@ val `Change miniplayer color` by creatingBytecodePatch( iput v$freeRegister, p0, $colorMathPlayerIPutReference :off nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/Fingerprints.kt index 53ac7a4e8e..fdd81a396d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/miniplayercolor/Fingerprints.kt @@ -1,11 +1,18 @@ package app.revanced.patches.music.layout.miniplayercolor -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val miniPlayerConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.miniPlayerConstructorMethod by gettingFirstMethodDeclaratively { returnType("V") instructions( ResourceType.ID("mpp_player_bottom_sheet"), @@ -14,9 +21,9 @@ internal val miniPlayerConstructorFingerprint = fingerprint { } /** - * Matches to the class found in [miniPlayerConstructorFingerprint]. + * Matches to the class found in [miniPlayerConstructorMethod]. */ -internal val switchToggleColorFingerprint = fingerprint { +internal val BytecodePatchContext.switchToggleColorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returnType("V") parameterTypes("L", "J") diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt index c42ca0bb7b..b9e913ca24 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/Fingerprints.kt @@ -1,6 +1,13 @@ package app.revanced.patches.music.layout.navigationbar -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.containsLiteralInstruction import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction @@ -9,7 +16,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val tabLayoutTextFingerprint = fingerprint { +internal val BytecodePatchContext.tabLayoutTextMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt index 921cca7577..bd8fbae7be 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/navigationbar/NavigationBarPatch.kt @@ -82,7 +82,7 @@ val `Navigation bar` by creatingBytecodePatch( ), ) - tabLayoutTextFingerprint.method.apply { + tabLayoutTextMethod.apply { // Hide navigation labels. val constIndex = indexOfFirstLiteralInstructionOrThrow(text1) val targetIndex = indexOfFirstInstructionOrThrow(constIndex, Opcode.CHECK_CAST) @@ -99,7 +99,7 @@ val `Navigation bar` by creatingBytecodePatch( ) // Set navigation enum and hide navigation buttons. - val enumIndex = tabLayoutTextFingerprint.patternMatch.startIndex + 3 + val enumIndex = tabLayoutTextMethod.patternMatch.startIndex + 3 val enumRegister = getInstruction(enumIndex).registerA val insertEnumIndex = indexOfFirstInstructionOrThrow(Opcode.AND_INT_LIT8) - 2 diff --git a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Fingerprints.kt index 4b085e1d83..435e80f872 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Fingerprints.kt @@ -1,12 +1,17 @@ package app.revanced.patches.nunl.ads import app.revanced.patcher.* +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnTypeinternal import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -internal val BytecodePatchContext.jwPlayerConfigMethod by gettingFirstMutableMethodDeclaratively { +import com.android.tools.smali.dexlib2.Opcode val BytecodePatchContext.jwPlayerConfigMethod by gettingFirstMutableMethodDeclaratively { name("advertisingConfig") definingClass($$"Lcom/jwplayer/pub/api/configuration/PlayerConfig$Builder;") accessFlags(AccessFlags.PUBLIC) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt index 43892dd119..3721cb9989 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/BaseCustomBrandingPatch.kt @@ -27,13 +27,13 @@ private val mipmapDirectories = mapOf( "mipmap-hdpi" to "162x162 px", "mipmap-xhdpi" to "216x216 px", "mipmap-xxhdpi" to "324x324 px", - "mipmap-xxxhdpi" to "432x432 px" + "mipmap-xxxhdpi" to "432x432 px", ) private val iconStyleNames = arrayOf( "rounded", "minimal", - "scaled" + "scaled", ) private const val ORIGINAL_USER_ICON_STYLE_NAME = "original" @@ -47,7 +47,7 @@ private const val NOTIFICATION_ICON_NAME = "revanced_notification_icon" private val USER_CUSTOM_ADAPTIVE_FILE_NAMES = arrayOf( "$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", - "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png" + "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", ) private const val USER_CUSTOM_MONOCHROME_FILE_NAME = @@ -71,15 +71,15 @@ internal fun baseCustomBrandingPatch( activityAliasNameWithIntents: String, preferenceScreen: BasePreferenceScreen.Screen, block: ResourcePatchBuilder.() -> Unit, - executeBlock: ResourcePatchContext.() -> Unit = {} + executeBlock: ResourcePatchContext.() -> Unit = {}, ) = resourcePatch( name = "Custom branding", description = "Adds options to change the app icon and app name. " + - "Branding cannot be changed for mounted (root) installations." + "Branding cannot be changed for mounted (root) installations.", ) { val customName by stringOption( name = "App name", - description = "Custom app name." + description = "Custom app name.", ) val customIcon by stringOption( @@ -99,7 +99,7 @@ internal fun baseCustomBrandingPatch( Optionally, the path contains a 'drawable' folder with any of the monochrome icon files: $USER_CUSTOM_MONOCHROME_FILE_NAME $USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME - """.trimIndentMultiline() + """.trimIndentMultiline(), ) block() @@ -112,12 +112,12 @@ internal fun baseCustomBrandingPatch( apply { getMainActivityOnCreate().addInstruction( 0, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setBranding()V" + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->setBranding()V", ) - numberOfPresetAppNamesExtensionFingerprint.method.returnEarly(numberOfPresetAppNames) + numberOfPresetAppNamesExtensionMethod.returnEarly(numberOfPresetAppNames) - notificationFingerprint.method.apply { + notificationMethod.apply { val getBuilderIndex = if (isYouTubeMusic) { // YT Music the field is not a plain object type. indexOfFirstInstructionOrThrow { @@ -128,7 +128,7 @@ internal fun baseCustomBrandingPatch( val builderCastIndex = indexOfFirstInstructionOrThrow { val reference = getReference() opcode == Opcode.CHECK_CAST && - reference?.type == "Landroid/app/Notification\$Builder;" + reference?.type == "Landroid/app/Notification\$Builder;" } indexOfFirstInstructionReversedOrThrow(builderCastIndex) { getReference()?.type == "Ljava/lang/Object;" @@ -139,7 +139,7 @@ internal fun baseCustomBrandingPatch( .getReference() findInstructionIndicesReversedOrThrow( - Opcode.RETURN_VOID + Opcode.RETURN_VOID, ).forEach { index -> addInstructionsAtControlFlowLabel( index, @@ -148,7 +148,7 @@ internal fun baseCustomBrandingPatch( iget-object v0, v0, $builderFieldName check-cast v0, Landroid/app/Notification${'$'}Builder; invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->setNotificationIcon(Landroid/app/Notification${'$'}Builder;)V - """ + """, ) } } @@ -166,7 +166,7 @@ internal fun baseCustomBrandingPatch( if (customName != null || customIcon != null) { if (setOrGetFallbackPackageName(originalAppPackageName) == originalAppPackageName) { Logger.getLogger(this::class.java.name).warning( - "Custom branding does not work with root installation. No changes applied." + "Custom branding does not work with root installation. No changes applied.", ) } } @@ -181,7 +181,7 @@ internal fun baseCustomBrandingPatch( ListPreference( key = "revanced_custom_branding_name", entriesKey = "revanced_custom_branding_name_custom_entries", - entryValuesKey = "revanced_custom_branding_name_custom_entry_values" + entryValuesKey = "revanced_custom_branding_name_custom_entry_values", ) } else { ListPreference("revanced_custom_branding_name") @@ -190,11 +190,11 @@ internal fun baseCustomBrandingPatch( ListPreference( key = "revanced_custom_branding_icon", entriesKey = "revanced_custom_branding_icon_custom_entries", - entryValuesKey = "revanced_custom_branding_icon_custom_entry_values" + entryValuesKey = "revanced_custom_branding_icon_custom_entry_values", ) } else { ListPreference("revanced_custom_branding_icon") - } + }, ) val useCustomName = customName != null @@ -211,8 +211,8 @@ internal fun baseCustomBrandingPatch( ), ResourceGroup( "mipmap-anydpi", - "$LAUNCHER_RESOURCE_NAME_PREFIX$style.xml" - ) + "$LAUNCHER_RESOURCE_NAME_PREFIX$style.xml", + ), ) } @@ -221,19 +221,19 @@ internal fun baseCustomBrandingPatch( // Push notification 'small' icon. ResourceGroup( "drawable", - "$NOTIFICATION_ICON_NAME.xml" + "$NOTIFICATION_ICON_NAME.xml", ), // Copy template user icon, because the aliases must be added even if no user icon is provided. ResourceGroup( "drawable", USER_CUSTOM_MONOCHROME_FILE_NAME, - USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME + USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME, ), ResourceGroup( "mipmap-anydpi", - "$LAUNCHER_RESOURCE_NAME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml" - ) + "$LAUNCHER_RESOURCE_NAME_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.xml", + ), ) // Copy template icon files. @@ -244,7 +244,7 @@ internal fun baseCustomBrandingPatch( dpi, "$LAUNCHER_ADAPTIVE_BACKGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", "$LAUNCHER_ADAPTIVE_FOREGROUND_PREFIX$CUSTOM_USER_ICON_STYLE_NAME.png", - ) + ), ) } @@ -256,7 +256,7 @@ internal fun baseCustomBrandingPatch( appNameIndex: Int, useCustomName: Boolean, enabled: Boolean, - intents: NodeList + intents: NodeList, ): Element { val label = if (useCustomName) { if (customName == null) { @@ -293,7 +293,7 @@ internal fun baseCustomBrandingPatch( } else { for (i in 0 until intents.length) { alias.appendChild( - intents.item(i).cloneNode(true) + intents.item(i).cloneNode(true), ) } } @@ -304,7 +304,7 @@ internal fun baseCustomBrandingPatch( val application = document.getElementsByTagName("application").item(0) as Element val intentFilters = document.childNodes.findElementByAttributeValueOrThrow( "android:name", - activityAliasNameWithIntents + activityAliasNameWithIntents, ).childNodes // The YT application name can appear in some places along side the system @@ -313,7 +313,7 @@ internal fun baseCustomBrandingPatch( // use a custom name for this situation to disambiguate which app is which. application.setAttribute( "android:label", - "@string/revanced_custom_branding_name_entry_2" + "@string/revanced_custom_branding_name_entry_2", ) for (appNameIndex in 1..numberOfPresetAppNames) { @@ -329,8 +329,8 @@ internal fun baseCustomBrandingPatch( appNameIndex = appNameIndex, useCustomName = useCustomNameLabel, enabled = (appNameIndex == 1), - intentFilters - ) + intentFilters, + ), ) // Bundled icons. @@ -342,8 +342,8 @@ internal fun baseCustomBrandingPatch( appNameIndex = appNameIndex, useCustomName = useCustomNameLabel, enabled = false, - intentFilters - ) + intentFilters, + ), ) } @@ -362,8 +362,8 @@ internal fun baseCustomBrandingPatch( appNameIndex = appNameIndex, useCustomName = useCustomNameLabel, enabled = false, - intentFilters - ) + intentFilters, + ), ) } @@ -371,7 +371,7 @@ internal fun baseCustomBrandingPatch( // can be shown in the launcher. Can only be done after adding the new aliases. intentFilters.findElementByAttributeValueOrThrow( "android:name", - "android.intent.action.MAIN" + "android.intent.action.MAIN", ).removeFromParent() } @@ -383,13 +383,13 @@ internal fun baseCustomBrandingPatch( if (!iconPathFile.exists()) { throw PatchException( - "The custom icon path cannot be found: " + iconPathFile.absolutePath + "The custom icon path cannot be found: " + iconPathFile.absolutePath, ) } if (!iconPathFile.isDirectory) { throw PatchException( - "The custom icon path must be a folder: " + iconPathFile.absolutePath + "The custom icon path must be a folder: " + iconPathFile.absolutePath, ) } @@ -413,7 +413,8 @@ internal fun baseCustomBrandingPatch( if (customFiles.isNotEmpty() && customFiles.size != USER_CUSTOM_ADAPTIVE_FILE_NAMES.size) { throw PatchException( "Must include all required icon files " + - "but only found " + customFiles.map { it.name }) + "but only found " + customFiles.map { it.name }, + ) } customFiles.forEach { imgSourceFile -> @@ -427,14 +428,14 @@ internal fun baseCustomBrandingPatch( // Copy monochrome and small notification icon if it provided. arrayOf( USER_CUSTOM_MONOCHROME_FILE_NAME, - USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME + USER_CUSTOM_NOTIFICATION_ICON_FILE_NAME, ).forEach { fileName -> val relativePath = "drawable/$fileName" val file = iconPathFile.resolve(relativePath) if (file.exists()) { file.copyTo( target = resourceDirectory.resolve(relativePath), - overwrite = true + overwrite = true, ) copiedFiles = true } @@ -442,9 +443,9 @@ internal fun baseCustomBrandingPatch( if (!copiedFiles) { throw PatchException( - "Expected to find directories and files: " - + USER_CUSTOM_ADAPTIVE_FILE_NAMES.contentToString() - + "\nBut none were found in the provided option file path: " + iconPathFile.absolutePath + "Expected to find directories and files: " + + USER_CUSTOM_ADAPTIVE_FILE_NAMES.contentToString() + + "\nBut none were found in the provided option file path: " + iconPathFile.absolutePath, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt index aae4284549..a2a3a55706 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/branding/Fingerprints.kt @@ -1,9 +1,16 @@ package app.revanced.patches.shared.layout.branding -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val numberOfPresetAppNamesExtensionFingerprint = fingerprint { +internal val BytecodePatchContext.numberOfPresetAppNamesExtensionMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("I") parameterTypes() @@ -14,7 +21,7 @@ internal val numberOfPresetAppNamesExtensionFingerprint = fingerprint { // A much simpler fingerprint exists that can set the small icon (contains string "414843287017"), // but that has limited usage and this fingerprint allows changing any part of the notification. -internal val notificationFingerprint = fingerprint { +internal val BytecodePatchContext.notificationMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes("L") strings("key_action_priority") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/Fingerprints.kt index b0411b5851..82f54fb0a8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/Fingerprints.kt @@ -2,13 +2,20 @@ package app.revanced.patches.shared.layout.theme import app.revanced.patcher.InstructionLocation.MatchAfterImmediately import app.revanced.patcher.InstructionLocation.MatchAfterWithin +import app.revanced.patcher.accessFlags import app.revanced.patcher.fieldAccess -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.methodCall +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val lithoOnBoundsChangeFingerprint = fingerprint { +internal val BytecodePatchContext.lithoOnBoundsChangeMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returnType("V") parameterTypes("Landroid/graphics/Rect;") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/LithoColorHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/LithoColorHookPatch.kt index 5b6a9986f1..c0f085bde0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/LithoColorHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/layout/theme/LithoColorHookPatch.kt @@ -11,15 +11,15 @@ val lithoColorHookPatch = bytecodePatch( ) { apply { - var insertionIndex = lithoOnBoundsChangeFingerprint.patternMatch.endIndex - 1 + var insertionIndex = lithoOnBoundsChangeMethod.patternMatch.endIndex - 1 lithoColorOverrideHook = { targetMethodClass, targetMethodName -> - lithoOnBoundsChangeFingerprint.method.addInstructions( + lithoOnBoundsChangeMethod.addInstructions( insertionIndex, """ invoke-static { p1 }, $targetMethodClass->$targetMethodName(I)I move-result p1 - """ + """, ) insertionIndex += 2 } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt index bd6fba8339..f3dc8728b5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt @@ -1,10 +1,17 @@ package app.revanced.patches.shared.misc.fix.verticalscroll -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val canScrollVerticallyFingerprint = fingerprint { +internal val BytecodePatchContext.canScrollVerticallyMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt index 502add6a77..3244ccb95e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatch.kt @@ -10,7 +10,7 @@ val verticalScrollPatch = bytecodePatch( ) { apply { - canScrollVerticallyFingerprint.let { + canScrollVerticallyMethod.let { it.method.apply { val moveResultIndex = it.instructionMatches.last().index val moveResultRegister = getInstruction(moveResultIndex).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt index 1717cd7293..d008566bf0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/Fingerprints.kt @@ -1,9 +1,16 @@ package app.revanced.patches.shared.misc.gms -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val googlePlayUtilityFingerprint = fingerprint { +internal val BytecodePatchContext.googlePlayUtilityMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("I") parameterTypes("L", "I") @@ -14,14 +21,14 @@ internal val googlePlayUtilityFingerprint = fingerprint { ) } -internal val serviceCheckFingerprint = fingerprint { +internal val BytecodePatchContext.serviceCheckMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("V") parameterTypes("L", "I") strings("Google Play Services not available") } -internal val gmsCoreSupportFingerprint = fingerprint { +internal val BytecodePatchContext.gmsCoreSupportMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("Ljava/lang/String;") parameterTypes() @@ -30,7 +37,7 @@ internal val gmsCoreSupportFingerprint = fingerprint { } } -internal val originalPackageNameExtensionFingerprint = fingerprint { +internal val BytecodePatchContext.originalPackageNameExtensionMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("Ljava/lang/String;") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt index f796b12d80..642920146a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/gms/GmsCoreSupportPatch.kt @@ -57,14 +57,14 @@ fun gmsCoreSupportPatch( ) = bytecodePatch( name = "GmsCore support", // TODO description = "Allows the app to work without root by using a different package name when patched " + - "using a GmsCore instead of Google Play Services.", + "using a GmsCore instead of Google Play Services.", ) { val gmsCoreVendorGroupIdOption = stringOption( default = "app.revanced", values = - mapOf( - "ReVanced" to "app.revanced", - ), + mapOf( + "ReVanced" to "app.revanced", + ), name = "GmsCore vendor group ID", description = "The vendor's group ID for GmsCore.", required = true, @@ -124,10 +124,11 @@ fun gmsCoreSupportPatch( in PERMISSIONS, in ACTIONS, in AUTHORITIES, - -> referencedString.replace("com.google", gmsCoreVendorGroupId!!) + -> referencedString.replace("com.google", gmsCoreVendorGroupId!!) // No vendor prefix for whatever reason... "subscribedfeeds" -> "$gmsCoreVendorGroupId.subscribedfeeds" + else -> null } @@ -159,7 +160,7 @@ fun gmsCoreSupportPatch( when (string) { "$fromPackageName.SuggestionProvider", "$fromPackageName.fileprovider", - -> string.replace(fromPackageName, toPackageName) + -> string.replace(fromPackageName, toPackageName) else -> null } @@ -203,25 +204,25 @@ fun gmsCoreSupportPatch( // Return these methods early to prevent the app from crashing. getEarlyReturnMethods().forEach { it.returnEarly() } - serviceCheckFingerprint.method.returnEarly() + serviceCheckMethod.returnEarly() // Google Play Utility is not present in all apps, so we need to check if it's present. - if (googlePlayUtilityFingerprint.methodOrNull != null) { - googlePlayUtilityFingerprint.method.returnEarly(0) + if (googlePlayUtilityMethodOrNull != null) { + googlePlayUtilityMethod.returnEarly(0) } // Set original and patched package names for extension to use. - originalPackageNameExtensionFingerprint.method.returnEarly(fromPackageName) + originalPackageNameExtensionMethod.returnEarly(fromPackageName) // Verify GmsCore is installed and whitelisted for power optimizations and background usage. getMainActivityOnCreateMethod().addInstruction( 0, "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->" + - "checkGmsCore(Landroid/app/Activity;)V" + "checkGmsCore(Landroid/app/Activity;)V", ) // Change the vendor of GmsCore in the extension. - gmsCoreSupportFingerprint.method.returnEarly(gmsCoreVendorGroupId!!) + gmsCoreSupportMethod.returnEarly(gmsCoreVendorGroupId!!) executeBlock() } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatch.kt index 0a2ad8026b..04e42b8329 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatch.kt @@ -8,19 +8,19 @@ import java.util.logging.Logger @Suppress("unused") val `Disable Pairip license check` by creatingBytecodePatch( description = "Disables Play Integrity API (Pairip) client-side license check.", - use = false + use = false, ) { apply { - if (processLicenseResponseFingerprint.methodOrNull == null || validateLicenseResponseFingerprint.methodOrNull == null) { + if (processLicenseResponseMethodOrNull == null || validateLicenseResponseMethodOrNull == null) { return@apply Logger.getLogger(this::class.java.name) .warning("Could not find Pairip licensing check. No changes applied.") } // Set first parameter (responseCode) to 0 (success status). - processLicenseResponseFingerprint.method.addInstruction(0, "const/4 p1, 0x0") + processLicenseResponseMethod.addInstruction(0, "const/4 p1, 0x0") // Short-circuit the license response validation. - validateLicenseResponseFingerprint.method.returnEarly() + validateLicenseResponseMethod.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/Fingerprints.kt index 344fd02dab..09375f3ed3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/Fingerprints.kt @@ -1,17 +1,15 @@ package app.revanced.patches.shared.misc.pairip.license -import app.revanced.patcher.fingerprint - -internal val processLicenseResponseFingerprint = fingerprint { +internal val BytecodePatchContext.processLicenseResponseMethod by gettingFirstMethodDeclaratively { custom { method, classDef -> classDef.type == "Lcom/pairip/licensecheck/LicenseClient;" && - method.name == "processResponse" + method.name == "processResponse" } } -internal val validateLicenseResponseFingerprint = fingerprint { +internal val BytecodePatchContext.validateLicenseResponseMethod by gettingFirstMethodDeclaratively { custom { method, classDef -> classDef.type == "Lcom/pairip/licensecheck/ResponseValidator;" && - method.name == "validateResponse" + method.name == "validateResponse" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/Fingerprints.kt index aa85f1a2e3..885efa81b4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/Fingerprints.kt @@ -1,10 +1,17 @@ package app.revanced.patches.shared.misc.settings -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.extension.EXTENSION_CLASS_DESCRIPTOR import com.android.tools.smali.dexlib2.AccessFlags -internal val themeLightColorResourceNameFingerprint = fingerprint { +internal val BytecodePatchContext.themeLightColorResourceNameMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("Ljava/lang/String;") parameterTypes() @@ -13,7 +20,7 @@ internal val themeLightColorResourceNameFingerprint = fingerprint { } } -internal val themeDarkColorResourceNameFingerprint = fingerprint { +internal val BytecodePatchContext.themeDarkColorResourceNameMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("Ljava/lang/String;") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt index c3080fe0e4..efcb89c14b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/SettingsPatch.kt @@ -17,8 +17,8 @@ import app.revanced.util.insertFirst import app.revanced.util.returnEarly import org.w3c.dom.Node -private var lightThemeColor : String? = null -private var darkThemeColor : String? = null +private var lightThemeColor: String? = null +private var darkThemeColor: String? = null /** * Sets the default theme colors used in various ReVanced specific settings menus. @@ -33,10 +33,10 @@ fun overrideThemeColors(lightThemeColorString: String?, darkThemeColorString: St private val settingsColorPatch = bytecodePatch { afterDependents { if (lightThemeColor != null) { - themeLightColorResourceNameFingerprint.method.returnEarly(lightThemeColor!!) + themeLightColorResourceNameMethod.returnEarly(lightThemeColor!!) } if (darkThemeColor != null) { - themeDarkColorResourceNameFingerprint.method.returnEarly(darkThemeColor!!) + themeDarkColorResourceNameMethod.returnEarly(darkThemeColor!!) } } } @@ -48,28 +48,31 @@ private val settingsColorPatch = bytecodePatch { * File names that do not exist are ignored and not processed. * @param preferences A set of preferences to add to the ReVanced fragment. */ -fun settingsPatch ( +fun settingsPatch( rootPreferences: List>? = null, preferences: Set, ) = resourcePatch { dependsOn( addResourcesPatch, settingsColorPatch, - addBrandLicensePatch + addBrandLicensePatch, ) apply { copyResources( "settings", - ResourceGroup("xml", + ResourceGroup( + "xml", "revanced_prefs.xml", "revanced_prefs_icons.xml", - "revanced_prefs_icons_bold.xml" + "revanced_prefs_icons_bold.xml", ), - ResourceGroup("menu", - "revanced_search_menu.xml" + ResourceGroup( + "menu", + "revanced_search_menu.xml", ), - ResourceGroup("drawable", + ResourceGroup( + "drawable", // CustomListPreference resources. "revanced_ic_dialog_alert.xml", // Search resources. @@ -84,7 +87,8 @@ fun settingsPatch ( "revanced_settings_toolbar_arrow_left.xml", "revanced_settings_toolbar_arrow_left_bold.xml", ), - ResourceGroup("layout", + ResourceGroup( + "layout", "revanced_custom_list_item_checked.xml", // Color picker. "revanced_color_dot_widget.xml", @@ -98,8 +102,8 @@ fun settingsPatch ( "revanced_preference_search_result_list.xml", "revanced_preference_search_result_regular.xml", "revanced_preference_search_result_switch.xml", - "revanced_settings_with_toolbar.xml" - ) + "revanced_settings_with_toolbar.xml", + ), ) addResources("shared", "misc.settings.settingsResourcePatch") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt index 3691dde88c..80c131a226 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/Fingerprints.kt @@ -3,13 +3,15 @@ package app.revanced.patches.shared.misc.spoof import app.revanced.patcher.accessFlags import app.revanced.patcher.custom import app.revanced.patcher.extensions.methodReference -import app.revanced.patcher.fingerprint import app.revanced.patcher.firstMethodComposite +import app.revanced.patcher.gettingFirstMethodDeclaratively import app.revanced.patcher.immutableClassDef import app.revanced.patcher.instructions import app.revanced.patcher.invoke import app.revanced.patcher.method +import app.revanced.patcher.opcodes import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.returnType import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.AccessFlags @@ -80,7 +82,7 @@ internal val buildRequestMethodMatch = firstMethodComposite { } } -internal val protobufClassParseByteBufferFingerprint = fingerprint { +internal val BytecodePatchContext.protobufClassParseByteBufferMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PROTECTED, AccessFlags.STATIC) returnType("L") parameterTypes("L", "Ljava/nio/ByteBuffer;") @@ -110,7 +112,7 @@ internal val createStreamingDataMethodMatch = firstMethodComposite { } } -internal val buildMediaDataSourceFingerprint = fingerprint { +internal val BytecodePatchContext.buildMediaDataSourceMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes( "Landroid/net/Uri;", @@ -145,7 +147,7 @@ internal val mediaFetchEnumConstructorMethodMatch = firstMethodComposite { ) } -internal val nerdsStatsVideoFormatBuilderFingerprint = fingerprint { +internal val BytecodePatchContext.nerdsStatsVideoFormatBuilderMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("Ljava/lang/String;") parameterTypes("L") @@ -154,7 +156,7 @@ internal val nerdsStatsVideoFormatBuilderFingerprint = fingerprint { ) } -internal val patchIncludedExtensionMethodFingerprint = fingerprint { +internal val BytecodePatchContext.patchIncludedExtensionMethodMethod by gettingFirstMethodDeclaratively { returnType("Z") parameterTypes() custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt index f6dfbb3097..8d1ab17157 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/spoof/SpoofVideoStreamsPatch.kt @@ -1,7 +1,6 @@ package app.revanced.patches.shared.misc.spoof import app.revanced.patcher.extensions.* -import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.BytecodePatchBuilder import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch @@ -55,7 +54,7 @@ internal fun spoofVideoStreamsPatch( // region Enable extension helper method used by other patches - patchIncludedExtensionMethodFingerprint.method.returnEarly(true) + patchIncludedExtensionMethodMethod.returnEarly(true) // endregion @@ -128,7 +127,7 @@ internal fun spoofVideoStreamsPatch( "$resultMethodType->$setStreamDataMethodName($videoDetailsClass)V", ) - val protobufClass = protobufClassParseByteBufferFingerprint.method.definingClass + val protobufClass = protobufClassParseByteBufferMethod.definingClass val setStreamingDataIndex = createStreamingDataMethodMatch.indices.first() val playerProtoClass = getInstruction(setStreamingDataIndex + 1) @@ -212,7 +211,7 @@ internal fun spoofVideoStreamsPatch( // Requesting streams intended for other platforms with a body tuned for Android could be the cause of 400 errors. // A proper fix may include modifying the request body to match the platforms expected body. - buildMediaDataSourceFingerprint.method.apply { + buildMediaDataSourceMethod.apply { val targetIndex = instructions.lastIndex // Instructions are added just before the method returns, @@ -238,7 +237,7 @@ internal fun spoofVideoStreamsPatch( // region Append spoof info. - nerdsStatsVideoFormatBuilderFingerprint.method.apply { + nerdsStatsVideoFormatBuilderMethod.apply { findInstructionIndicesReversedOrThrow(Opcode.RETURN_OBJECT).forEach { index -> val register = getInstruction(index).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/BadgeTabPatch.kt b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/BadgeTabPatch.kt index 8624e35cef..fe07cf3b43 100644 --- a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/BadgeTabPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/BadgeTabPatch.kt @@ -15,7 +15,7 @@ val `Remove badge tab` by creatingBytecodePatch( val arrayTabs = listOf("Log", "HealthCare") apply { - createTabsFingerprint.method.apply { + createTabsMethod.apply { removeInstructions(0, 2) val arrayRegister = 0 diff --git a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/Fingerprints.kt index 0038c9a248..852f33d4b7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/Fingerprints.kt @@ -1,6 +1,13 @@ package app.revanced.patches.songpal.badge -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction @@ -8,7 +15,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.reference.ImmutableMethodReference // Located @ ub.i0.h#p (9.5.0) -internal val createTabsFingerprint = fingerprint { +internal val BytecodePatchContext.createTabsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE) returnType("Ljava/util/List;") custom { method, _ -> @@ -26,7 +33,7 @@ internal val createTabsFingerprint = fingerprint { } // Located @ com.sony.songpal.mdr.vim.activity.MdrRemoteBaseActivity.e#run (9.5.0) -internal val showNotificationFingerprint = fingerprint { +internal val BytecodePatchContext.showNotificationMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC) returnType("V") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/RemoveNotificationBadgePatch.kt b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/RemoveNotificationBadgePatch.kt index 198e52ac7c..198d4a0ab2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/songpal/badge/RemoveNotificationBadgePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/songpal/badge/RemoveNotificationBadgePatch.kt @@ -10,6 +10,6 @@ val `Remove notification badge` by creatingBytecodePatch( compatibleWith("com.sony.songpal.mdr"("10.1.0")) apply { - showNotificationFingerprint.method.addInstructions(0, "return-void") + showNotificationMethod.addInstructions(0, "return-void") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt index b79f99d5bb..30330f7b75 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/CustomThemePatch.kt @@ -19,10 +19,10 @@ private val customThemeBytecodePatch = bytecodePatch { dependsOn(sharedExtensionPatch) apply { - val colorSpaceUtilsClassDef = colorSpaceUtilsClassFingerprint.originalClassDef + val colorSpaceUtilsClassDef = colorSpaceUtilsClassMethod.originalClassDef // Hook a util method that converts ARGB to RGBA in the sRGB color space to replace hardcoded accent colors. - convertArgbToRgbaFingerprint.match(colorSpaceUtilsClassDef).method.apply { + convertArgbToRgbaMethod.match(colorSpaceUtilsClassDef).method.apply { addInstructions( 0, """ @@ -30,21 +30,21 @@ private val customThemeBytecodePatch = bytecodePatch { invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->replaceColor(I)I move-result p0 int-to-long p0, p0 - """ + """, ) } // Lottie JSON parser method. It parses the JSON Lottie animation into its own class, // including the solid color of it. - parseLottieJsonFingerprint.method.apply { + parseLottieJsonMethod.apply { val invokeParseColorIndex = indexOfFirstInstructionOrThrow { val reference = getReference() - reference?.definingClass == "Landroid/graphics/Color;" - && reference.name == "parseColor" + reference?.definingClass == "Landroid/graphics/Color;" && + reference.name == "parseColor" } val parsedColorRegister = getInstruction(invokeParseColorIndex + 1).registerA - val replaceColorDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->replaceColor(I)I" + val replaceColorDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->replaceColor(I)I" addInstructions( invokeParseColorIndex + 2, @@ -52,16 +52,16 @@ private val customThemeBytecodePatch = bytecodePatch { # Use invoke-static/range because the register number is too large. invoke-static/range { v$parsedColorRegister .. v$parsedColorRegister }, $replaceColorDescriptor move-result v$parsedColorRegister - """ + """, ) } // Lottie animated color parser. - parseAnimatedColorFingerprint.method.apply { + parseAnimatedColorMethod.apply { val invokeArgbIndex = indexOfFirstInstructionOrThrow { val reference = getReference() - reference?.definingClass == "Landroid/graphics/Color;" - && reference.name == "argb" + reference?.definingClass == "Landroid/graphics/Color;" && + reference.name == "argb" } val argbColorRegister = getInstruction(invokeArgbIndex + 1).registerA @@ -70,7 +70,7 @@ private val customThemeBytecodePatch = bytecodePatch { """ invoke-static { v$argbColorRegister }, $EXTENSION_CLASS_DESCRIPTOR->replaceColor(I)I move-result v$argbColorRegister - """ + """, ) } } @@ -97,7 +97,7 @@ val customThemePatch = resourcePatch( default = false, name = "Override player gradient color", description = - "Apply primary background color to the player gradient color, which changes dynamically with the song.", + "Apply primary background color to the player gradient color, which changes dynamically with the song.", required = false, ) @@ -105,7 +105,7 @@ val customThemePatch = resourcePatch( default = "#FF121212", name = "Secondary background color", description = "The secondary background color. (e.g. playlist list in home, player artist, song credits). " + - "Can be a hex color or a resource reference.\",", + "Can be a hex color or a resource reference.\",", required = true, ) @@ -120,7 +120,7 @@ val customThemePatch = resourcePatch( default = "#FF1ABC54", name = "Pressed accent color", description = "The color when accented buttons are pressed, by default slightly darker than accent. " + - "Can be a hex color or a resource reference.", + "Can be a hex color or a resource reference.", required = true, ) @@ -155,7 +155,7 @@ val customThemePatch = resourcePatch( "sthlm_blk", "sthlm_blk_grad_start", // Misc. "image_placeholder_color", - -> backgroundColor + -> backgroundColor // "About the artist" background color in song player. "gray_15", @@ -164,17 +164,17 @@ val customThemePatch = resourcePatch( // Playlist list background in home page. "opacity_white_10", // "What's New" pills background. - "dark_base_background_tinted_highlight" - -> backgroundColorSecondary + "dark_base_background_tinted_highlight", + -> backgroundColorSecondary "dark_brightaccent_background_base", "dark_base_text_brightaccent", "green_light", - "spotify_green_157" - -> accentColor + "spotify_green_157", + -> accentColor - "dark_brightaccent_background_press" - -> accentColorPressed + "dark_brightaccent_background_press", + -> accentColorPressed else -> continue } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/Fingerprints.kt index 396317c055..aee08eed51 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/theme/Fingerprints.kt @@ -1,24 +1,31 @@ package app.revanced.patches.spotify.layout.theme -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.containsLiteralInstruction import com.android.tools.smali.dexlib2.AccessFlags -internal val colorSpaceUtilsClassFingerprint = fingerprint { +internal val BytecodePatchContext.colorSpaceUtilsClassMethod by gettingFirstMethodDeclaratively { strings("The specified color must be encoded in an RGB color space.") // Partial string match. } -internal val convertArgbToRgbaFingerprint = fingerprint { +internal val BytecodePatchContext.convertArgbToRgbaMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) returnType("J") parameterTypes("J") } -internal val parseLottieJsonFingerprint = fingerprint { +internal val BytecodePatchContext.parseLottieJsonMethod by gettingFirstMethodDeclaratively { strings("Unsupported matte type: ") } -internal val parseAnimatedColorFingerprint = fingerprint { +internal val BytecodePatchContext.parseAnimatedColorMethod by gettingFirstMethodDeclaratively { parameterTypes("L", "F") returnType("Ljava/lang/Object;") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Fingerprints.kt index 4f1c48e83d..9392830d29 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Fingerprints.kt @@ -1,7 +1,5 @@ package app.revanced.patches.spotify.misc.extension -import app.revanced.patcher.fingerprint - -internal val loadOrbitLibraryFingerprint = fingerprint { +internal val BytecodePatchContext.loadOrbitLibraryMethod by gettingFirstMethodDeclaratively { strings("orbit_library_load", "orbit-jni-spotify") } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Hooks.kt index 2d7c820e96..7ccbe492b7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Hooks.kt @@ -14,7 +14,7 @@ internal val loadOrbitLibraryHook = extensionHook { // FIXME: Creating this is a mess and needs refactoring. extensionHook( getInsertIndex = { - loadOrbitLibraryFingerprint.stringMatches.last().index + loadOrbitLibraryMethod.stringMatches.last().index }, getContextRegister = { method -> val contextReferenceIndex = method.indexOfFirstInstruction { @@ -25,6 +25,6 @@ internal val loadOrbitLibraryHook = extensionHook { "v$contextRegister" }, - fingerprint = loadOrbitLibraryFingerprint, + fingerprint = loadOrbitLibraryMethod, ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/Fingerprints.kt index be6b4165a1..d6c7a0fcbf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/Fingerprints.kt @@ -1,14 +1,21 @@ package app.revanced.patches.spotify.misc.fix.login -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.literal -internal val katanaProxyLoginMethodHandlerClassFingerprint = fingerprint { +internal val BytecodePatchContext.katanaProxyLoginMethodHandlerClassMethod by gettingFirstMethodDeclaratively { strings("katana_proxy_auth") } -internal val katanaProxyLoginMethodTryAuthorizeFingerprint = fingerprint { +internal val BytecodePatchContext.katanaProxyLoginMethodTryAuthorizeMethod by gettingFirstMethodDeclaratively { strings("e2e") literal { 0 } } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatch.kt index d3c0157eec..00df99748f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatch.kt @@ -6,7 +6,7 @@ import app.revanced.util.returnEarly @Suppress("unused") val `Fix Facebook login` by creatingBytecodePatch( description = - "Fix logging in with Facebook when the app is patched by always opening the login in a web browser window.", + "Fix logging in with Facebook when the app is patched by always opening the login in a web browser window.", ) { compatibleWith("com.spotify.music") @@ -17,10 +17,10 @@ val `Fix Facebook login` by creatingBytecodePatch( // Override the Facebook SDK to always handle the login using the web browser, which does not perform // signature checks. - val katanaProxyLoginMethodHandlerClass = katanaProxyLoginMethodHandlerClassFingerprint.originalClassDef + val katanaProxyLoginMethodHandlerClass = katanaProxyLoginMethodHandlerClassMethod.originalClassDef // Always return 0 (no Intent was launched) as the result of trying to authorize with the Facebook app to // make the login fallback to a web browser window. - katanaProxyLoginMethodTryAuthorizeFingerprint + katanaProxyLoginMethodTryAuthorizeMethod .match(katanaProxyLoginMethodHandlerClass) .method .returnEarly(0) diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/ChangeLyricsProviderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/ChangeLyricsProviderPatch.kt index 6549e97d4e..d725b712fd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/ChangeLyricsProviderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/ChangeLyricsProviderPatch.kt @@ -3,7 +3,6 @@ package app.revanced.patches.spotify.misc.lyrics import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.extensions.replaceInstruction -import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.patcher.patch.stringOption import app.revanced.util.getReference @@ -60,7 +59,7 @@ val `Change lyrics provider` by creatingBytecodePatch( } apply { - val httpClientBuilderMethod = httpClientBuilderFingerprint.originalMethod + val httpClientBuilderMethod = httpClientBuilderMethod.originalMethod // region Create a modified copy of the HTTP client builder method with the custom lyrics provider host. @@ -83,7 +82,7 @@ val `Change lyrics provider` by creatingBytecodePatch( ) // Add the patched method to the class. - httpClientBuilderFingerprint.classDef.methods.add(this) + httpClientBuilderMethod.classDef.methods.add(this) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/Fingerprints.kt index c5cd052ae6..4bdb5e76b5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/lyrics/Fingerprints.kt @@ -1,11 +1,18 @@ package app.revanced.patches.spotify.misc.lyrics -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val httpClientBuilderFingerprint = fingerprint { +internal val BytecodePatchContext.httpClientBuilderMethod by gettingFirstMethodDeclaratively { strings("client == null", "scheduler == null") } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt index 72c0a0b9f3..1cae0c4571 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/Fingerprints.kt @@ -1,11 +1,18 @@ package app.revanced.patches.spotify.misc.privacy -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val shareCopyUrlFingerprint = fingerprint { +internal val BytecodePatchContext.shareCopyUrlMethod by gettingFirstMethodDeclaratively { returnType("Ljava/lang/Object;") parameterTypes("Ljava/lang/Object;") strings("clipboard", "Spotify Link") @@ -14,7 +21,7 @@ internal val shareCopyUrlFingerprint = fingerprint { } } -internal val oldShareCopyUrlFingerprint = fingerprint { +internal val BytecodePatchContext.oldShareCopyUrlMethod by gettingFirstMethodDeclaratively { returnType("Ljava/lang/Object;") parameterTypes("Ljava/lang/Object;") strings("clipboard", "createNewSession failed") @@ -23,7 +30,7 @@ internal val oldShareCopyUrlFingerprint = fingerprint { } } -internal val formatAndroidShareSheetUrlFingerprint = fingerprint { +internal val BytecodePatchContext.formatAndroidShareSheetUrlMethod by gettingFirstMethodDeclaratively { returnType("Ljava/lang/String;") parameterTypes("L", "Ljava/lang/String;") opcodes( @@ -38,7 +45,7 @@ internal val formatAndroidShareSheetUrlFingerprint = fingerprint { } } -internal val oldFormatAndroidShareSheetUrlFingerprint = fingerprint { +internal val BytecodePatchContext.oldFormatAndroidShareSheetUrlMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC) returnType("Ljava/lang/String;") parameterTypes("Lcom/spotify/share/social/sharedata/ShareData;", "Ljava/lang/String;") diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt index c7057a69dd..74d94575cb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/privacy/SanitizeSharingLinksPatch.kt @@ -24,12 +24,12 @@ val `Sanitize sharing links` by creatingBytecodePatch( apply { val extensionMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->" + - "sanitizeSharingLink(Ljava/lang/String;)Ljava/lang/String;" + "sanitizeSharingLink(Ljava/lang/String;)Ljava/lang/String;" - val copyFingerprint = if (shareCopyUrlFingerprint.originalMethodOrNull != null) { - shareCopyUrlFingerprint + val copyFingerprint = if (shareCopyUrlMethod.originalMethodOrNull != null) { + shareCopyUrlMethod } else { - oldShareCopyUrlFingerprint + oldShareCopyUrlMethod } copyFingerprint.method.apply { @@ -43,14 +43,14 @@ val `Sanitize sharing links` by creatingBytecodePatch( """ invoke-static { v$urlRegister }, $extensionMethodDescriptor move-result-object v$urlRegister - """ + """, ) } // Android native share sheet is used for all other quick share types (X, WhatsApp, etc). val shareUrlParameter: String - val shareSheetFingerprint = if (formatAndroidShareSheetUrlFingerprint.originalMethodOrNull != null) { - val methodAccessFlags = formatAndroidShareSheetUrlFingerprint.originalMethod + val shareSheetFingerprint = if (formatAndroidShareSheetUrlMethod.originalMethodOrNull != null) { + val methodAccessFlags = formatAndroidShareSheetUrlMethod.originalMethod shareUrlParameter = if (AccessFlags.STATIC.isSet(methodAccessFlags.accessFlags)) { // In newer implementations the method is static, so p0 is not `this`. "p1" @@ -60,10 +60,10 @@ val `Sanitize sharing links` by creatingBytecodePatch( "p2" } - formatAndroidShareSheetUrlFingerprint + formatAndroidShareSheetUrlMethod } else { shareUrlParameter = "p2" - oldFormatAndroidShareSheetUrlFingerprint + oldFormatAndroidShareSheetUrlMethod } shareSheetFingerprint.method.addInstructions( @@ -71,7 +71,7 @@ val `Sanitize sharing links` by creatingBytecodePatch( """ invoke-static { $shareUrlParameter }, $extensionMethodDescriptor move-result-object $shareUrlParameter - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/Fingerprints.kt index 3566512e84..23750ccdb4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/Fingerprints.kt @@ -1,9 +1,16 @@ package app.revanced.patches.spotify.misc.widgets -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.Opcode -internal val canBindAppWidgetPermissionFingerprint = fingerprint { +internal val BytecodePatchContext.canBindAppWidgetPermissionMethod by gettingFirstMethodDeclaratively { strings("android.permission.BIND_APPWIDGET") opcodes(Opcode.AND_INT_LIT8) } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt index b330fc794c..20b2e46a4c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunchersWidgets.kt @@ -13,6 +13,6 @@ val `Fix third party launchers widgets` by creatingBytecodePatch( // Only system app launchers are granted the BIND_APPWIDGET permission. // Override the method that checks for it to always return true, as this permission is not actually required // for the widgets to work. - canBindAppWidgetPermissionFingerprint.method.returnEarly(true) + canBindAppWidgetPermissionMethod.returnEarly(true) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt index 42b8a1ac6a..5a3bca65b4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt @@ -1,10 +1,13 @@ package app.revanced.patches.spotify.shared -import app.revanced.patcher.gettingFirstMutableMethodDeclaratively import app.revanced.patcher.accessFlags import app.revanced.patcher.definingClass -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.name +import app.revanced.patcher.opcodes import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.returnType diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/mediaupload/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/mediaupload/Fingerprints.kt index 7901d6cc52..1c4453cea0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/mediaupload/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/mediaupload/Fingerprints.kt @@ -1,20 +1,18 @@ package app.revanced.patches.strava.mediaupload -import app.revanced.patcher.fingerprint - -internal val getCompressionQualityFingerprint = fingerprint { +internal val BytecodePatchContext.getCompressionQualityMethod by gettingFirstMethodDeclaratively { custom { method, _ -> method.name == "getCompressionQuality" } } -internal val getMaxDurationFingerprint = fingerprint { +internal val BytecodePatchContext.getMaxDurationMethod by gettingFirstMethodDeclaratively { custom { method, _ -> method.name == "getMaxDuration" } } -internal val getMaxSizeFingerprint = fingerprint { +internal val BytecodePatchContext.getMaxSizeMethod by gettingFirstMethodDeclaratively { custom { method, _ -> method.name == "getMaxSize" } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/mediaupload/OverwriteMediaUploadParametersPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/mediaupload/OverwriteMediaUploadParametersPatch.kt index d377e149fe..f77b64c1c3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/mediaupload/OverwriteMediaUploadParametersPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/mediaupload/OverwriteMediaUploadParametersPatch.kt @@ -31,15 +31,15 @@ val `Overwrite media upload parameters` by creatingBytecodePatch( val mediaUploadParametersClass = firstClassDef { type.endsWith("/MediaUploadParameters;") } compressionQuality?.let { compressionQuality -> - getCompressionQualityFingerprint.match(mediaUploadParametersClass).method.returnEarly(compressionQuality / 100f) + getCompressionQualityMethod.match(mediaUploadParametersClass).method.returnEarly(compressionQuality / 100f) } maxDuration?.let { maxDuration -> - getMaxDurationFingerprint.match(mediaUploadParametersClass).method.returnEarly(maxDuration) + getMaxDurationMethod.match(mediaUploadParametersClass).method.returnEarly(maxDuration) } maxSize?.let { - getMaxSizeFingerprint.match(mediaUploadParametersClass).method.returnEarly(it) + getMaxSizeMethod.match(mediaUploadParametersClass).method.returnEarly(it) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt index 6549019d02..53d3f4ec02 100644 --- a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt @@ -1,16 +1,23 @@ package app.revanced.patches.ticktick.misc.themeunlock +import app.revanced.patcher.accessFlags import app.revanced.patcher.definingClass +import app.revanced.patcher.gettingFirstMethodDeclaratively import app.revanced.patcher.gettingFirstMutableMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.name +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType internal val BytecodePatchContext.checkLockedThemesFingerprint by gettingFirstMutableMethodDeclaratively { name("isLockedTheme") definingClass("Theme;"::endsWith) } -internal val BytecodePatchContext.setThemeFingerprint by gettingFirstMutableMethodDeclaratively { +internal val BytecodePatchContext.setThemeMethod by gettingFirstMutableMethodDeclaratively { name("lambda\$updateUserBtn\$1") definingClass("ThemePreviewActivity;"::endsWith) } diff --git a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatch.kt index 22877d8b13..6fc2926b5a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/UnlockThemePatch.kt @@ -19,6 +19,6 @@ val `Unlock themes` by creatingBytecodePatch( """, ) - setThemeFingerprint.removeInstructions(0, 10) + setThemeMethod.removeInstructions(0, 10) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt index bfdae9a537..84cc121eab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/FeedFilterPatch.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.extensions.instructions import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.patches.tiktok.misc.extension.sharedExtensionPatch import app.revanced.patches.tiktok.misc.settings.Settings -import app.revanced.patches.tiktok.misc.settings.settingsStatusLoadFingerprint +import app.revanced.patches.tiktok.misc.settings.settingsStatusLoadMethod import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -14,7 +14,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/tiktok/f @Suppress("unused") val `Feed filter` by creatingBytecodePatch( description = "Removes ads, livestreams, stories, image videos " + - "and videos with a specific amount of views or likes from the feed.", + "and videos with a specific amount of views or likes from the feed.", ) { dependsOn( sharedExtensionPatch, @@ -29,20 +29,19 @@ val `Feed filter` by creatingBytecodePatch( apply { arrayOf( feedApiServiceLIZMethod to "$EXTENSION_CLASS_DESCRIPTOR->filter(Lcom/ss/android/ugc/aweme/feed/model/FeedItemList;)V", - followFeedMethod to "$EXTENSION_CLASS_DESCRIPTOR->filter(Lcom/ss/android/ugc/aweme/follow/presenter/FollowFeedList;)V" + followFeedMethod to "$EXTENSION_CLASS_DESCRIPTOR->filter(Lcom/ss/android/ugc/aweme/follow/presenter/FollowFeedList;)V", ).forEach { (method, filterSignature) -> val returnInstruction = method.instructions.first { it.opcode == Opcode.RETURN_OBJECT } val register = (returnInstruction as OneRegisterInstruction).registerA method.addInstruction( returnInstruction.location.index, - "invoke-static { v$register }, $filterSignature" + "invoke-static { v$register }, $filterSignature", ) } - settingsStatusLoadFingerprint.method.addInstruction( + settingsStatusLoadMethod.addInstruction( 0, "invoke-static {}, Lapp/revanced/extension/tiktok/settings/SettingsStatus;->enableFeedFilter()V", ) } - } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt index 517c897d14..8421b0eeef 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/RememberClearDisplayPatch.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.creatingBytecodePatch -import app.revanced.patches.tiktok.shared.onRenderFirstFrameFingerprint +import app.revanced.patches.tiktok.shared.onRenderFirstFrameMethod import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction @@ -29,7 +29,7 @@ val `Remember clear display` by creatingBytecodePatch( addInstructions( isEnabledIndex, "invoke-static { v$isEnabledRegister }, " + - "Lapp/revanced/extension/tiktok/cleardisplay/RememberClearDisplayPatch;->rememberClearDisplayState(Z)V", + "Lapp/revanced/extension/tiktok/cleardisplay/RememberClearDisplayPatch;->rememberClearDisplayState(Z)V", ) // endregion @@ -37,7 +37,7 @@ val `Remember clear display` by creatingBytecodePatch( // region Override the "Clear display" configuration load event to load the state of clear display. val clearDisplayEventClass = parameters[0].type - onRenderFirstFrameFingerprint.method.addInstructionsWithLabels( + onRenderFirstFrameMethod.addInstructionsWithLabels( 0, """ # Create a new clearDisplayEvent and post it to the EventBus (https://github.com/greenrobot/EventBus) @@ -60,7 +60,7 @@ val `Remember clear display` by creatingBytecodePatch( invoke-direct { v0, v1, v2, v3, v4 }, $clearDisplayEventClass->(ILjava/lang/String;Ljava/lang/String;Z)V invoke-virtual { v0 }, $clearDisplayEventClass->post()Lcom/ss/android/ugc/governance/eventbus/IEvent; """, - ExternalLabel("clear_display_disabled", onRenderFirstFrameFingerprint.method.getInstruction(0)), + ExternalLabel("clear_display_disabled", onRenderFirstFrameMethod.getInstruction(0)), ) // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt index ec040ebace..852b02e3e6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/DownloadsPatch.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.* import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.patches.tiktok.misc.extension.sharedExtensionPatch import app.revanced.patches.tiktok.misc.settings.Settings -import app.revanced.patches.tiktok.misc.settings.settingsStatusLoadFingerprint +import app.revanced.patches.tiktok.misc.settings.settingsStatusLoadMethod import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.getReference import app.revanced.util.returnEarly @@ -70,7 +70,7 @@ val Downloads by creatingBytecodePatch( } } - settingsStatusLoadFingerprint.method.addInstruction( + settingsStatusLoadMethod.addInstruction( 0, "invoke-static {}, Lapp/revanced/extension/tiktok/settings/SettingsStatus;->enableDownload()V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt index 8f4d23a791..39d3996389 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/PlaybackSpeedPatch.kt @@ -5,8 +5,8 @@ import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.creatingBytecodePatch -import app.revanced.patches.tiktok.shared.getEnterFromFingerprint -import app.revanced.patches.tiktok.shared.onRenderFirstFrameFingerprint +import app.revanced.patches.tiktok.shared.getEnterFromMethod +import app.revanced.patches.tiktok.shared.onRenderFirstFrameMethod import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.returnEarly @@ -38,12 +38,12 @@ val `Playback speed` by creatingBytecodePatch( // By default, the playback speed will reset to 1.0 at the start of each video. // Instead, override it with the desired playback speed. - onRenderFirstFrameFingerprint.method.addInstructions( + onRenderFirstFrameMethod.addInstructions( 0, """ # Video playback location (e.g. home page, following page or search result page) retrieved using getEnterFrom method. const/4 v0, 0x1 - invoke-virtual { p0, v0 }, ${getEnterFromFingerprint.originalMethod} + invoke-virtual { p0, v0 }, ${getEnterFromMethod.originalMethod} move-result-object v0 # Model of current video retrieved using getCurrentAweme method. diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/DisableLoginRequirementPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/DisableLoginRequirementPatch.kt index c20750973c..d1df9bc357 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/DisableLoginRequirementPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/DisableLoginRequirementPatch.kt @@ -12,8 +12,8 @@ val `Disable login requirement` by creatingBytecodePatch { apply { listOf( - mandatoryLoginServiceFingerprint, - mandatoryLoginService2Fingerprint, + mandatoryLoginServiceMethod, + mandatoryLoginService2Method, ).forEach { fingerprint -> fingerprint.method.addInstructions( 0, diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt index 929ef86729..01ed945417 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt @@ -1,15 +1,13 @@ package app.revanced.patches.tiktok.misc.login.disablerequirement -import app.revanced.patcher.fingerprint - -internal val mandatoryLoginServiceFingerprint = fingerprint { +internal val BytecodePatchContext.mandatoryLoginServiceMethod by gettingFirstMethodDeclaratively { custom { method, classDef -> classDef.endsWith("/MandatoryLoginService;") && method.name == "enableForcedLogin" } } -internal val mandatoryLoginService2Fingerprint = fingerprint { +internal val BytecodePatchContext.mandatoryLoginService2Method by gettingFirstMethodDeclaratively { custom { method, classDef -> classDef.endsWith("/MandatoryLoginService;") && method.name == "shouldShowForcedLogin" diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/Fingerprints.kt index d1c4d6de68..0e89e12935 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/Fingerprints.kt @@ -1,33 +1,31 @@ package app.revanced.patches.tiktok.misc.settings -import app.revanced.patcher.fingerprint - -internal val addSettingsEntryFingerprint = fingerprint { +internal val BytecodePatchContext.addSettingsEntryMethod by gettingFirstMethodDeclaratively { custom { method, classDef -> classDef.endsWith("/SettingNewVersionFragment;") && method.name == "initUnitManger" } } -internal val adPersonalizationActivityOnCreateFingerprint = fingerprint { +internal val BytecodePatchContext.adPersonalizationActivityOnCreateMethod by gettingFirstMethodDeclaratively { custom { method, classDef -> classDef.endsWith("/AdPersonalizationActivity;") && method.name == "onCreate" } } -internal val settingsEntryFingerprint = fingerprint { +internal val BytecodePatchContext.settingsEntryMethod by gettingFirstMethodDeclaratively { strings("pls pass item or extends the EventUnit") } -internal val settingsEntryInfoFingerprint = fingerprint { +internal val BytecodePatchContext.settingsEntryInfoMethod by gettingFirstMethodDeclaratively { strings( "ExposeItem(title=", ", icon=", ) } -internal val settingsStatusLoadFingerprint = fingerprint { +internal val BytecodePatchContext.settingsStatusLoadMethod by gettingFirstMethodDeclaratively { custom { method, classDef -> classDef.endsWith("Lapp/revanced/extension/tiktok/settings/SettingsStatus;") && method.name == "load" diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/SettingsPatch.kt index 48b87ccb5d..ea72f61e24 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/settings/SettingsPatch.kt @@ -28,23 +28,23 @@ val Settings by creatingBytecodePatch( apply { val initializeSettingsMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->initialize(" + - "Lcom/bytedance/ies/ugc/aweme/commercialize/compliance/personalization/AdPersonalizationActivity;" + - ")Z" + "Lcom/bytedance/ies/ugc/aweme/commercialize/compliance/personalization/AdPersonalizationActivity;" + + ")Z" val createSettingsEntryMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->createSettingsEntry(" + - "Ljava/lang/String;" + - "Ljava/lang/String;" + - ")Ljava/lang/Object;" + "Ljava/lang/String;" + + "Ljava/lang/String;" + + ")Ljava/lang/Object;" fun String.toClassName(): String = substring(1, this.length - 1).replace("/", ".") // Find the class name of classes which construct a settings entry - val settingsButtonClass = settingsEntryFingerprint.originalClassDef.type.toClassName() - val settingsButtonInfoClass = settingsEntryInfoFingerprint.originalClassDef.type.toClassName() + val settingsButtonClass = settingsEntryMethod.originalClassDef.type.toClassName() + val settingsButtonInfoClass = settingsEntryInfoMethod.originalClassDef.type.toClassName() // Create a settings entry for 'revanced settings' and add it to settings fragment - addSettingsEntryFingerprint.method.apply { + addSettingsEntryMethod.apply { val markIndex = implementation!!.instructions.indexOfFirst { it.opcode == Opcode.IGET_OBJECT && ((it as Instruction22c).reference as FieldReference).name == "headerUnit" } @@ -67,13 +67,13 @@ val Settings by creatingBytecodePatch( const-string v1, "$settingsButtonInfoClass" invoke-static {v0, v1}, $createSettingsEntryMethodDescriptor move-result-object v0 - check-cast v0, ${settingsEntryFingerprint.originalClassDef.type} + check-cast v0, ${settingsEntryMethod.originalClassDef.type} """, ) } // Initialize the settings menu once the replaced setting entry is clicked. - adPersonalizationActivityOnCreateFingerprint.method.apply { + adPersonalizationActivityOnCreateMethod.apply { val initializeSettingsIndex = implementation!!.instructions.indexOfFirst { it.opcode == Opcode.INVOKE_SUPER } + 1 diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt index 4cb0f943b3..21f19d7c8c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt @@ -6,7 +6,7 @@ import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.patches.tiktok.misc.extension.sharedExtensionPatch import app.revanced.patches.tiktok.misc.settings.Settings -import app.revanced.patches.tiktok.misc.settings.settingsStatusLoadFingerprint +import app.revanced.patches.tiktok.misc.settings.settingsStatusLoadMethod import app.revanced.util.findMutableMethodOf import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -91,7 +91,7 @@ val `SIM spoof` by creatingBytecodePatch( } // Enable patch in settings. - settingsStatusLoadFingerprint.method.addInstruction( + settingsStatusLoadMethod.addInstruction( 0, "invoke-static {}, Lapp/revanced/extension/tiktok/settings/SettingsStatus;->enableSimSpoof()V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/shared/Fingerprints.kt index 6eb32c518b..264a8596db 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/shared/Fingerprints.kt @@ -1,10 +1,17 @@ package app.revanced.patches.tiktok.shared -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getEnterFromFingerprint = fingerprint { +internal val BytecodePatchContext.getEnterFromMethod by gettingFirstMethodDeclaratively { returnType("Ljava/lang/String;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes("Z") @@ -22,7 +29,7 @@ internal val getEnterFromFingerprint = fingerprint { } } -internal val onRenderFirstFrameFingerprint = fingerprint { +internal val BytecodePatchContext.onRenderFirstFrameMethod by gettingFirstMethodDeclaratively { strings("method_enable_viewpager_preload_duration") custom { _, classDef -> classDef.endsWith("/BaseListFragmentPanel;") diff --git a/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt index 87f0f16e03..b75e7b7407 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt @@ -1,9 +1,16 @@ package app.revanced.patches.tudortmund.lockscreen -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val brightnessFingerprint = fingerprint { +internal val BytecodePatchContext.brightnessMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC) returnType("V") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/ShowOnLockscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/ShowOnLockscreenPatch.kt index 071ad2f428..75b1e62834 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/ShowOnLockscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/ShowOnLockscreenPatch.kt @@ -24,7 +24,7 @@ val `Show on lockscreen` by creatingBytecodePatch( compatibleWith("de.tudortmund.app") apply { - brightnessFingerprint.method.apply { + brightnessMethod.apply { // Find the instruction where the brightness value is loaded into a register val brightnessInstruction = instructions.firstNotNullOf { instruction -> if (instruction.opcode != Opcode.IGET_OBJECT) return@firstNotNullOf null @@ -61,10 +61,10 @@ val `Show on lockscreen` by creatingBytecodePatch( replaceInstruction( windowIndex, "invoke-static { v$activityRegister, v$brightnessRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->" + - "getWindow" + - "(Landroidx/appcompat/app/AppCompatActivity;F)" + - "Landroid/view/Window;", + "$EXTENSION_CLASS_DESCRIPTOR->" + + "getWindow" + + "(Landroidx/appcompat/app/AppCompatActivity;F)" + + "Landroid/view/Window;", ) // Normally, the brightness is loaded into a register after the getWindow call. diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/DisableBlogNotificationReminderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/DisableBlogNotificationReminderPatch.kt index 0992cd21bc..e83b0db8a0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/DisableBlogNotificationReminderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/DisableBlogNotificationReminderPatch.kt @@ -10,7 +10,7 @@ val `Disable blog notification reminder` by creatingBytecodePatch( compatibleWith("com.tumblr") apply { - isBlogNotifyEnabledFingerprint.method.addInstructions( + isBlogNotifyEnabledMethod.addInstructions( 0, """ # Return false for BlogNotifyCtaDialog.isEnabled() method. diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt index 67e051a7ba..2ad41c0288 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt @@ -1,11 +1,9 @@ package app.revanced.patches.tumblr.annoyances.notifications -import app.revanced.patcher.fingerprint - // The BlogNotifyCtaDialog asks you if you want to enable notifications for a blog. // It shows whenever you visit a certain blog for the second time and disables itself // if it was shown a total of 3 times (stored in app storage). // This targets the BlogNotifyCtaDialog.isEnabled() method to let it always return false. -internal val isBlogNotifyEnabledFingerprint = fingerprint { +internal val BytecodePatchContext.isBlogNotifyEnabledMethod by gettingFirstMethodDeclaratively { strings("isEnabled --> ", "blog_notify_enabled") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/Fingerprints.kt index 0222db800c..07e0cdf833 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/Fingerprints.kt @@ -1,6 +1,13 @@ package app.revanced.patches.tumblr.featureflags -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -13,7 +20,7 @@ import com.android.tools.smali.dexlib2.Opcode // Some features seem to be very old and never removed, though, such as Google Login. // The startIndex of the opcode pattern is at the start of the function after the arg null check. // we want to insert our instructions there. -internal val getFeatureValueFingerprint = fingerprint { +internal val BytecodePatchContext.getFeatureValueMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/String;") parameterTypes("L", "Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt index 5569aea82c..3510cb5151 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/featureflags/OverrideFeatureFlagsPatch.kt @@ -3,11 +3,11 @@ package app.revanced.patches.tumblr.featureflags import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter +import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable /** * Override a feature flag with a value. @@ -24,15 +24,15 @@ val overrideFeatureFlagsPatch = bytecodePatch( ) { apply { - val configurationClass = getFeatureValueFingerprint.originalMethod.definingClass - val featureClass = getFeatureValueFingerprint.originalMethod.parameterTypes[0].toString() + val configurationClass = getFeatureValueMethod.originalMethod.definingClass + val featureClass = getFeatureValueMethod.originalMethod.parameterTypes[0].toString() // The method we want to inject into does not have enough registers, so we inject a helper method // and inject more instructions into it later, see addOverride. // This is not in an extension since the unused variable would get compiled away and the method would // get compiled to only have one register, which is not enough for our later injected instructions. val helperMethod = ImmutableMethod( - getFeatureValueFingerprint.originalMethod.definingClass, + getFeatureValueMethod.originalMethod.definingClass, "getValueOverride", listOf(ImmutableMethodParameter(featureClass, null, "feature")), "Ljava/lang/String;", @@ -62,15 +62,15 @@ val overrideFeatureFlagsPatch = bytecodePatch( """, ) }.also { helperMethod -> - getFeatureValueFingerprint.classDef.methods.add(helperMethod) + getFeatureValueMethod.classDef.methods.add(helperMethod) } // Here we actually insert the hook to call our helper method and return its value if it returns not null // This is equivalent to // String forcedValue = getValueOverride(feature) // if (forcedValue != null) return forcedValue - val getFeatureIndex = getFeatureValueFingerprint.instructionMatches.first().index - getFeatureValueFingerprint.method.addInstructionsWithLabels( + val getFeatureIndex = getFeatureValueMethod.instructionMatches.first().index + getFeatureValueMethod.addInstructionsWithLabels( getFeatureIndex, """ # Call the Helper Method with the Feature diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/Fingerprints.kt index c9cdd6d4ef..bd996f81d4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/Fingerprints.kt @@ -1,12 +1,19 @@ package app.revanced.patches.tumblr.fixes -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.Opcode // Fingerprint for the addQueryParam method from retrofit2 // https://github.com/square/retrofit/blob/trunk/retrofit/src/main/java/retrofit2/RequestBuilder.java#L186 // Injecting here allows modifying dynamically set query parameters -internal val addQueryParamFingerprint = fingerprint { +internal val BytecodePatchContext.addQueryParamMethod by gettingFirstMethodDeclaratively { parameterTypes("Ljava/lang/String;", "Ljava/lang/String;", "Z") strings("Malformed URL. Base: ", ", Relative: ") } @@ -14,7 +21,7 @@ internal val addQueryParamFingerprint = fingerprint { // Fingerprint for the parseHttpMethodAndPath method from retrofit2 // https://github.com/square/retrofit/blob/ebf87b10997e2136af4d335276fa950221852c64/retrofit/src/main/java/retrofit2/RequestFactory.java#L270-L302 // Injecting here allows modifying the path/query params of API endpoints defined via annotations -internal val httpPathParserFingerprint = fingerprint { +internal val BytecodePatchContext.httpPathParserMethod by gettingFirstMethodDeclaratively { opcodes( Opcode.IPUT_OBJECT, Opcode.IPUT_BOOLEAN, diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt index ba8c62a88e..33118b474e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/fixes/FixOldVersionsPatch.kt @@ -6,7 +6,7 @@ import app.revanced.patcher.patch.creatingBytecodePatch @Suppress("unused") val `Fix old versions` by creatingBytecodePatch( description = "Fixes old versions of the app (v33.2 and earlier) breaking due to Tumblr removing remnants of Tumblr" + - " Live from the API, which causes many requests to fail. This patch has no effect on newer versions of the app.", + " Live from the API, which causes many requests to fail. This patch has no effect on newer versions of the app.", use = false, ) { compatibleWith("com.tumblr") @@ -19,8 +19,8 @@ val `Fix old versions` by creatingBytecodePatch( // Remove the live query parameters from the path when it's specified via a @METHOD annotation. for (liveQueryParameter in liveQueryParameters) { - httpPathParserFingerprint.method.addInstructions( - httpPathParserFingerprint.instructionMatches.last().index + 1, + httpPathParserMethod.addInstructions( + httpPathParserMethod.instructionMatches.last().index + 1, """ # urlPath = urlPath.replace(liveQueryParameter, "") const-string p1, "$liveQueryParameter" @@ -38,7 +38,7 @@ val `Fix old versions` by creatingBytecodePatch( // which would result in the path "api/me/inf0?fields[blog]=${value}" // Here we make sure that this value doesn't contain the broken query parameters. for (liveQueryParameter in liveQueryParameters) { - addQueryParamFingerprint.method.addInstructions( + addQueryParamMethod.addInstructions( 0, """ # queryParameterValue = queryParameterValue.replace(liveQueryParameter, "") diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt index 01ba7793c7..e5130eff2b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/FilterTimelineObjectsPatch.kt @@ -24,9 +24,9 @@ val filterTimelineObjectsPatch = bytecodePatch( dependsOn(sharedExtensionPatch) apply { - val filterInsertIndex = timelineFilterExtensionFingerprint.instructionMatches.first().index + val filterInsertIndex = timelineFilterExtensionMethod.instructionMatches.first().index - timelineFilterExtensionFingerprint.method.apply { + timelineFilterExtensionMethod.apply { val addInstruction = getInstruction(filterInsertIndex + 1) val filterListRegister = addInstruction.registerC @@ -48,8 +48,8 @@ val filterTimelineObjectsPatch = bytecodePatch( } arrayOf( - timelineConstructorFingerprint to 1, - postsResponseConstructorFingerprint to 2, + timelineConstructorMethod to 1, + postsResponseConstructorMethod to 2, ).forEach { (fingerprint, timelineObjectsRegister) -> fingerprint.method.addInstructions( 0, diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/Fingerprints.kt index b8ed3bfc4e..b68f192f71 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/timelinefilter/Fingerprints.kt @@ -1,12 +1,19 @@ package app.revanced.patches.tumblr.timelinefilter -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode // This is the constructor of the PostsResponse class. -// The same applies here as with the TimelineConstructorFingerprint. -internal val postsResponseConstructorFingerprint = fingerprint { +// The same applies here as with the TimelineConstructorMethod. +internal val BytecodePatchContext.postsResponseConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.CONSTRUCTOR, AccessFlags.PUBLIC) custom { method, classDef -> classDef.endsWith("/PostsResponse;") && method.parameters.size == 4 } } @@ -14,7 +21,7 @@ internal val postsResponseConstructorFingerprint = fingerprint { // This is the constructor of the Timeline class. // It receives the List as an argument with a @Json annotation, so this should be the first time // that the List is exposed in non-library code. -internal val timelineConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.timelineConstructorMethod by gettingFirstMethodDeclaratively { strings("timelineObjectsList") custom { method, classDef -> classDef.endsWith("/Timeline;") && method.parameters[0].type == "Ljava/util/List;" @@ -24,7 +31,7 @@ internal val timelineConstructorFingerprint = fingerprint { // This fingerprints the extension TimelineFilterPatch.filterTimeline method. // The opcode fingerprint is searching for // if ("BLOCKED_OBJECT_DUMMY".equals(elementType)) iterator.remove(); -internal val timelineFilterExtensionFingerprint = fingerprint { +internal val BytecodePatchContext.timelineFilterExtensionMethod by gettingFirstMethodDeclaratively { opcodes( Opcode.CONST_STRING, // "BLOCKED_OBJECT_DUMMY" Opcode.INVOKE_VIRTUAL, // HashSet.add(^) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt index c53c0f159e..21785aaf67 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/SettingsPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.twitch.misc.settings -import app.revanced.patcher.Fingerprint import app.revanced.patcher.extensions.ExternalLabel import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.addInstructionsWithLabels @@ -98,9 +97,9 @@ val Settings by creatingBytecodePatch( name, MENU_ITEM_ENUM_CLASS_DESCRIPTOR, AccessFlags.PUBLIC.value or - AccessFlags.FINAL.value or - AccessFlags.ENUM.value or - AccessFlags.STATIC.value, + AccessFlags.FINAL.value or + AccessFlags.ENUM.value or + AccessFlags.STATIC.value, null, null, null, diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt index 5cc97e7a2b..b89714e51c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/Fingerprints.kt @@ -1,10 +1,17 @@ package app.revanced.patches.twitter.interaction.downloads -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val buildMediaOptionsSheetFingerprint = fingerprint { +internal val BytecodePatchContext.buildMediaOptionsSheetMethod by gettingFirstMethodDeclaratively { opcodes( Opcode.IF_EQ, Opcode.SGET_OBJECT, @@ -14,12 +21,12 @@ internal val buildMediaOptionsSheetFingerprint = fingerprint { strings("mediaEntity", "media_options_sheet") } -internal val constructMediaOptionsSheetFingerprint = fingerprint { +internal val BytecodePatchContext.constructMediaOptionsSheetMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) strings("captionsState") } -internal val showDownloadVideoUpsellBottomSheetFingerprint = fingerprint { +internal val BytecodePatchContext.showDownloadVideoUpsellBottomSheetMethod by gettingFirstMethodDeclaratively { returnType("Z") strings("mediaEntity", "url") opcodes(Opcode.IF_EQZ) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt index ee54e98bc1..15d916459c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/interaction/downloads/UnlockDownloadsPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.twitter.interaction.downloads -import app.revanced.patcher.Fingerprint import app.revanced.patcher.extensions.* import app.revanced.patcher.patch.creatingBytecodePatch import com.android.tools.smali.dexlib2.Opcode @@ -20,7 +19,7 @@ val `Unlock downloads` by creatingBytecodePatch( } // Allow downloads for non-premium users. - showDownloadVideoUpsellBottomSheetFingerprint.patch { + showDownloadVideoUpsellBottomSheetMethod.patch { val checkIndex = instructionMatches.first().index val register = method.getInstruction(checkIndex).registerA @@ -28,7 +27,7 @@ val `Unlock downloads` by creatingBytecodePatch( } // Force show the download menu item. - constructMediaOptionsSheetFingerprint.patch { + constructMediaOptionsSheetMethod.patch { val showDownloadButtonIndex = method.instructions.lastIndex - 1 val register = method.getInstruction(showDownloadButtonIndex).registerA @@ -36,7 +35,7 @@ val `Unlock downloads` by creatingBytecodePatch( } // Make GIFs downloadable. - buildMediaOptionsSheetFingerprint.let { + buildMediaOptionsSheetMethod.let { it.method.apply { val checkMediaTypeIndex = it.instructionMatches.first().index val checkMediaTypeInstruction = getInstruction(checkMediaTypeIndex) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt index b29a777715..c78b74f337 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/ChangeLinkSharingDomainPatch.kt @@ -30,7 +30,7 @@ internal val domainNameOption = stringOption( InetAddress.getByName(it) } catch (_: UnknownHostException) { Logger.getLogger(this::class.java.name).warning( - "Host \"$it\" did not resolve to any domain." + "Host \"$it\" did not resolve to any domain.", ) } catch (_: Exception) { // Must ignore any kind of exception. Trying to resolve network @@ -61,7 +61,7 @@ internal val changeLinkSharingDomainResourcePatch = resourcePatch { @Suppress("unused") val `Change link sharing domain` by creatingBytecodePatch( description = "Replaces the domain name of shared links. Using this patch can prevent making posts that quote other posts.", - use = false + use = false, ) { dependsOn( sharedExtensionPatch, @@ -71,28 +71,28 @@ val `Change link sharing domain` by creatingBytecodePatch( "com.twitter.android"( "10.60.0-release.0", "10.86.0-release.0", - ) + ), ) val domainName by domainNameOption() apply { // Replace the domain name in the link sharing extension methods. - linkSharingDomainHelperFingerprint.method.returnEarly(domainName!!) + linkSharingDomainHelperMethod.returnEarly(domainName!!) // Replace the domain name when copying a link with "Copy link" button. - linkBuilderFingerprint.method.addInstructions( + linkBuilderMethod.addInstructions( 0, """ invoke-static { p0, p1, p2 }, $EXTENSION_CLASS_DESCRIPTOR->formatLink(JLjava/lang/String;)Ljava/lang/String; move-result-object p0 return-object p0 - """ + """, ) // TODO remove this once changeLinkSharingDomainResourcePatch is restored // Replace the domain name in the "Share via..." dialog. - linkResourceGetterFingerprint.method.apply { + linkResourceGetterMethod.apply { val templateIdConstIndex = indexOfFirstInstructionOrThrow(Opcode.CONST) // Format the link with the new domain name register (1 instruction below the const). @@ -103,7 +103,7 @@ val `Change link sharing domain` by creatingBytecodePatch( replaceInstruction( formatLinkCallIndex, "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->" + - "formatResourceLink([Ljava/lang/Object;)Ljava/lang/String;", + "formatResourceLink([Ljava/lang/Object;)Ljava/lang/String;", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt index 433803fa3d..957f92d9da 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/Fingerprints.kt @@ -1,21 +1,28 @@ package app.revanced.patches.twitter.misc.links -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val sanitizeSharingLinksFingerprint = fingerprint { +internal val BytecodePatchContext.sanitizeSharingLinksMethod by gettingFirstMethodDeclaratively { returnType("Ljava/lang/String;") strings("", "shareParam", "sessionToken") } // Returns a shareable link string based on a tweet ID and a username. -internal val linkBuilderFingerprint = fingerprint { +internal val BytecodePatchContext.linkBuilderMethod by gettingFirstMethodDeclaratively { strings("/%1\$s/status/%2\$d") } // TODO remove this once changeLinkSharingDomainResourcePatch is restored // Returns a shareable link for the "Share via..." dialog. -internal val linkResourceGetterFingerprint = fingerprint { +internal val BytecodePatchContext.linkResourceGetterMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes("Landroid/content/res/Resources;") custom { _, classDef -> @@ -25,7 +32,7 @@ internal val linkResourceGetterFingerprint = fingerprint { } } -internal val linkSharingDomainHelperFingerprint = fingerprint { +internal val BytecodePatchContext.linkSharingDomainHelperMethod by gettingFirstMethodDeclaratively { custom { method, classDef -> method.name == "getShareDomain" && classDef.type == EXTENSION_CLASS_DESCRIPTOR } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt index 6ca6e51423..2d87a0a00c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatch.kt @@ -11,11 +11,11 @@ val `Sanitize sharing links` by creatingBytecodePatch( "com.twitter.android"( "10.60.0-release.0", "10.86.0-release.0", - ) + ), ) apply { - sanitizeSharingLinksFingerprint.method.addInstructions( + sanitizeSharingLinksMethod.addInstructions( 0, """ # Method takes in a link (string, param 0) and then appends the tracking query params, diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/viber/ads/Fingerprints.kt index 29b752cf84..58537345e3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/viber/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/viber/ads/Fingerprints.kt @@ -1,7 +1,5 @@ package app.revanced.patches.viber.ads -import app.revanced.patcher.fingerprint - -internal val findAdStringFingerprint = fingerprint { +internal val BytecodePatchContext.findAdStringMethod by gettingFirstMethodDeclaratively { strings("viber_plus_debug_ads_free_flag") } diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt index ab62bc3469..92999f5a06 100644 --- a/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/viber/ads/HideAdsPatch.kt @@ -1,7 +1,6 @@ package app.revanced.patches.viber.ads import app.revanced.patcher.extensions.getInstruction -import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.returnEarly @@ -16,10 +15,10 @@ val `Hide Ads` by creatingBytecodePatch( compatibleWith("com.viber.voip"("25.9.2.0", "26.1.2.0")) apply { - val method = findAdStringFingerprint.method + val method = findAdStringMethod // Find the ads free string index - val stringIndex = findAdStringFingerprint.stringMatches.first().index + val stringIndex = findAdStringMethod.stringMatches.first().index // Search backwards from the string to find the `new-instance` (TypeReference) instruction val typeRefIndex = diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt index f4f6d9b0d5..87641063af 100644 --- a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/Fingerprints.kt @@ -1,8 +1,14 @@ package app.revanced.patches.viber.misc.navbar -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val tabIdClassFingerprint = fingerprint { +internal val BytecodePatchContext.tabIdClassMethod by gettingFirstMethodDeclaratively { strings("shouldShowTabId") } @@ -11,6 +17,6 @@ internal val shouldShowTabIdMethodFingerprint get() = fingerprint { parameterTypes("I", "I") returnType("Z") custom { methodDef, classDef -> - classDef == tabIdClassFingerprint.classDef + classDef == tabIdClassMethod.classDef } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/Fingerprints.kt index 70be03549a..ed686c0861 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/Fingerprints.kt @@ -1,6 +1,13 @@ package app.revanced.patches.youtube.ad.general -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.containsLiteralInstruction import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionReversed @@ -8,7 +15,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val fullScreenEngagementAdContainerFingerprint = fingerprint { +internal val BytecodePatchContext.fullScreenEngagementAdContainerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt index 1f552ca7d2..fdcdcfe6ab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/general/HideAdsPatch.kt @@ -84,7 +84,7 @@ val `Hide ads` by creatingBytecodePatch( apply { // Hide end screen store banner. - fullScreenEngagementAdContainerFingerprint.method.apply { + fullScreenEngagementAdContainerMethod.apply { val addListIndex = indexOfAddListInstruction(this) val addListInstruction = getInstruction(addListIndex) val listRegister = addListInstruction.registerC diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt index 09f348cfa1..c72854817d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/Fingerprints.kt @@ -1,10 +1,17 @@ package app.revanced.patches.youtube.ad.getpremium -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getPremiumViewFingerprint = fingerprint { +internal val BytecodePatchContext.getPremiumViewMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returnType("V") parameterTypes("I", "I") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt index 4739a53d54..39a5e3eeed 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/getpremium/HideGetPremiumPatch.kt @@ -29,7 +29,7 @@ val hideGetPremiumPatch = bytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -39,8 +39,8 @@ val hideGetPremiumPatch = bytecodePatch( SwitchPreference("revanced_hide_get_premium"), ) - getPremiumViewFingerprint.method.apply { - val startIndex = getPremiumViewFingerprint.instructionMatches.first().index + getPremiumViewMethod.apply { + val startIndex = getPremiumViewMethod.instructionMatches.first().index val measuredWidthRegister = getInstruction(startIndex).registerA val measuredHeightInstruction = getInstruction(startIndex + 1) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt index de155fbb29..7d0adf6e28 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt @@ -1,8 +1,6 @@ package app.revanced.patches.youtube.ad.video -import app.revanced.patcher.fingerprint - -internal val loadVideoAdsFingerprint = fingerprint { +internal val BytecodePatchContext.loadVideoAdsMethod by gettingFirstMethodDeclaratively { strings( "TriggerBundle doesn't have the required metadata specified by the trigger ", "Ping migration no associated ping bindings for activated trigger: ", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt index 2353f276d1..6bced697fc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/VideoAdsPatch.kt @@ -26,7 +26,7 @@ val `Video ads` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -36,7 +36,7 @@ val `Video ads` by creatingBytecodePatch( SwitchPreference("revanced_hide_video_ads"), ) - loadVideoAdsFingerprint.method.addInstructionsWithLabels( + loadVideoAdsMethod.addInstructionsWithLabels( 0, """ invoke-static { }, Lapp/revanced/extension/youtube/patches/VideoAdsPatch;->shouldShowAds()Z @@ -44,7 +44,7 @@ val `Video ads` by creatingBytecodePatch( if-nez v0, :show_video_ads return-void """, - ExternalLabel("show_video_ads", loadVideoAdsFingerprint.method.getInstruction(0)), + ExternalLabel("show_video_ads", loadVideoAdsMethod.getInstruction(0)), ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt index 03721bd85b..ece3f0a863 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt @@ -1,9 +1,16 @@ package app.revanced.patches.youtube.interaction.dialog -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.methodCall +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val createDialogFingerprint = fingerprint { +internal val BytecodePatchContext.createDialogMethod by gettingFirstMethodDeclaratively { returnType("V") parameterTypes("L", "L", "Ljava/lang/String;") instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt index 091b3fc815..1f12a37a6b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/RemoveViewerDiscretionDialogPatch.kt @@ -16,7 +16,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = val `Remove viewer discretion dialog` by creatingBytecodePatch( description = "Adds an option to remove the dialog that appears when opening a video that has been age-restricted " + - "by accepting it automatically. This does not bypass the age restriction.", + "by accepting it automatically. This does not bypass the age restriction.", ) { dependsOn( sharedExtensionPatch, @@ -30,7 +30,7 @@ val `Remove viewer discretion dialog` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -40,7 +40,7 @@ val `Remove viewer discretion dialog` by creatingBytecodePatch( SwitchPreference("revanced_remove_viewer_discretion_dialog"), ) - createDialogFingerprint.let { + createDialogMethod.let { it.method.apply { val showDialogIndex = it.instructionMatches.last().index // TODO val dialogRegister = getInstruction(showDialogIndex).registerC diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatch.kt index 34360b5318..b7def33490 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatch.kt @@ -1,7 +1,6 @@ package app.revanced.patches.youtube.interaction.doubletap import app.revanced.patcher.extensions.addInstructions -import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -57,7 +56,7 @@ val `Disable double tap actions` by creatingBytecodePatch( val doubleTapInfoGetSeekSourceFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes("Z") - returnType(seekTypeEnumFingerprint.originalClassDef.type) + returnType(seekTypeEnumMethod.originalClassDef.type) opcodes( Opcode.IF_EQZ, Opcode.SGET_OBJECT, @@ -79,7 +78,7 @@ val `Disable double tap actions` by creatingBytecodePatch( """, ) - doubleTapInfoCtorFingerprint.match( + doubleTapInfoCtorMethod.match( doubleTapInfoGetSeekSourceFingerprint.classDef, ).method.addInstructions( 0, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/Fingerprints.kt index 3fb153b63e..693a1d7428 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/doubletap/Fingerprints.kt @@ -1,9 +1,16 @@ package app.revanced.patches.youtube.interaction.doubletap -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val seekTypeEnumFingerprint = fingerprint { +internal val BytecodePatchContext.seekTypeEnumMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "SEEK_SOURCE_SEEK_TO_NEXT_CHAPTER", @@ -11,7 +18,7 @@ internal val seekTypeEnumFingerprint = fingerprint { ) } -internal val doubleTapInfoCtorFingerprint = fingerprint { +internal val BytecodePatchContext.doubleTapInfoCtorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes( "Landroid/view/MotionEvent;", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt index 76347f0827..83d466ff20 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/DownloadsPatch.kt @@ -62,7 +62,7 @@ internal const val BUTTON_DESCRIPTOR = "Lapp/revanced/extension/youtube/videopla @Suppress("unused") val Downloads by creatingBytecodePatch( description = "Adds support to download videos with an external downloader app " + - "using the in-app download button or a video player action button.", + "using the in-app download button or a video player action button.", ) { dependsOn( downloadsResourcePatch, @@ -76,7 +76,7 @@ val Downloads by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -86,10 +86,10 @@ val Downloads by creatingBytecodePatch( // Main activity is used to launch downloader intent. mainActivityOnCreateMethod.addInstruction( 0, - "invoke-static/range { p0 .. p0 }, ${EXTENSION_CLASS_DESCRIPTOR}->setMainActivity(Landroid/app/Activity;)V" + "invoke-static/range { p0 .. p0 }, ${EXTENSION_CLASS_DESCRIPTOR}->setMainActivity(Landroid/app/Activity;)V", ) - offlineVideoEndpointFingerprint.method.apply { + offlineVideoEndpointMethod.apply { addInstructionsWithLabels( 0, """ diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt index 3c0bb1c6b7..bbbcf8f140 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt @@ -1,10 +1,17 @@ package app.revanced.patches.youtube.interaction.downloads +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val offlineVideoEndpointFingerprint = fingerprint { +internal val BytecodePatchContext.offlineVideoEndpointMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt index 50d5065906..3bb74bcd78 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSeekbarTappingPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.youtube.interaction.seekbar +import app.revanced.patcher.extensions.ExternalLabel import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.extensions.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference @@ -34,30 +34,32 @@ val enableSeekbarTappingPatch = bytecodePatch( ) // Find the required methods to tap the seekbar. - val seekbarTappingMethods = onTouchEventHandlerFingerprint.let { + val seekbarTappingMethods = onTouchEventHandlerMethod.let { fun getReference(index: Int) = it.method.getInstruction(index) .reference as MethodReference listOf( getReference(it.instructionMatches.first().index), - getReference(it.instructionMatches.last().index) + getReference(it.instructionMatches.last().index), ) } - seekbarTappingFingerprint.let { + seekbarTappingMethod.let { val insertIndex = it.instructionMatches.last().index + 1 it.method.apply { val thisInstanceRegister = getInstruction( - insertIndex - 1 + insertIndex - 1, ).registerC val xAxisRegister = this.getInstruction( - it.instructionMatches[2].index + it.instructionMatches[2].index, ).registerD val freeRegister = findFreeRegister( - insertIndex, thisInstanceRegister, xAxisRegister + insertIndex, + thisInstanceRegister, + xAxisRegister, ) val oMethod = seekbarTappingMethods[0] diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt index 832a22cd23..cb77a6527c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/EnableSlideToSeekPatch.kt @@ -22,7 +22,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/ val enableSlideToSeekPatch = bytecodePatch( description = "Adds an option to enable slide to seek " + - "instead of playing at 2x speed when pressing and holding in the video player." + "instead of playing at 2x speed when pressing and holding in the video player.", ) { dependsOn( sharedExtensionPatch, @@ -42,14 +42,14 @@ val enableSlideToSeekPatch = bytecodePatch( // Restore the behaviour to slide to seek. - val checkIndex = slideToSeekFingerprint.instructionMatches.first().index - val checkReference = slideToSeekFingerprint.method.getInstruction(checkIndex) + val checkIndex = slideToSeekMethod.instructionMatches.first().index + val checkReference = slideToSeekMethod.getInstruction(checkIndex) .getReference()!! val extensionMethodDescriptor = "$EXTENSION_CLASS_DESCRIPTOR->isSlideToSeekDisabled(Z)Z" // A/B check method was only called on this class. - slideToSeekFingerprint.classDef.methods.forEach { method -> + slideToSeekMethod.classDef.methods.forEach { method -> method.findInstructionIndicesReversed { opcode == Opcode.INVOKE_VIRTUAL && getReference() == checkReference }.forEach { index -> @@ -73,7 +73,7 @@ val enableSlideToSeekPatch = bytecodePatch( // Disable the double speed seek gesture. if (is_19_17_or_greater) { - disableFastForwardGestureFingerprint.let { + disableFastForwardGestureMethod.let { it.method.apply { val targetIndex = it.instructionMatches.last().index val targetRegister = getInstruction(targetIndex).registerA @@ -88,7 +88,7 @@ val enableSlideToSeekPatch = bytecodePatch( } } } else { - disableFastForwardLegacyFingerprint.let { + disableFastForwardLegacyMethod.let { it.method.apply { val insertIndex = it.instructionMatches.last().index + 1 val targetRegister = getInstruction(insertIndex).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt index a580bab102..52f98812e4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/Fingerprints.kt @@ -4,7 +4,6 @@ import app.revanced.patcher.InstructionLocation.MatchAfterImmediately import app.revanced.patcher.InstructionLocation.MatchAfterWithin import app.revanced.patcher.accessFlags import app.revanced.patcher.fieldAccess -import app.revanced.patcher.fingerprint import app.revanced.patcher.firstMethodComposite import app.revanced.patcher.firstMutableMethodDeclaratively import app.revanced.patcher.gettingFirstMethodDeclaratively @@ -14,6 +13,7 @@ import app.revanced.patcher.invoke import app.revanced.patcher.methodCall import app.revanced.patcher.newInstance import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.returnType @@ -59,7 +59,7 @@ internal fun ClassDef.getAllowSwipingUpGestureMethod() = firstMutableMethodDecla parameterTypes("L") } -internal val disableFastForwardLegacyFingerprint = fingerprint { +internal val BytecodePatchContext.disableFastForwardLegacyMethod by gettingFirstMethodDeclaratively { returnType("Z") parameterTypes() opcodes(Opcode.MOVE_RESULT) @@ -67,7 +67,7 @@ internal val disableFastForwardLegacyFingerprint = fingerprint { literal { 45411330 } } -internal val disableFastForwardGestureFingerprint = fingerprint { +internal val BytecodePatchContext.disableFastForwardGestureMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() @@ -82,7 +82,7 @@ internal val disableFastForwardGestureFingerprint = fingerprint { } } -internal val customTapAndHoldFingerprint = fingerprint { +internal val BytecodePatchContext.customTapAndHoldMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes() @@ -102,7 +102,7 @@ internal val customTapAndHoldFingerprint = fingerprint { } } -internal val onTouchEventHandlerFingerprint = fingerprint { +internal val BytecodePatchContext.onTouchEventHandlerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.PUBLIC) returnType("Z") parameterTypes("L") @@ -125,7 +125,7 @@ internal val onTouchEventHandlerFingerprint = fingerprint { custom { method, _ -> method.name == "onTouchEvent" } } -internal val seekbarTappingFingerprint = fingerprint { +internal val BytecodePatchContext.seekbarTappingMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes("Landroid/view/MotionEvent;") @@ -146,7 +146,7 @@ internal val seekbarTappingFingerprint = fingerprint { custom { method, _ -> method.name == "onTouchEvent" } } -internal val slideToSeekFingerprint = fingerprint { +internal val BytecodePatchContext.slideToSeekMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returnType("V") parameterTypes("Landroid/view/View;", "F") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt index 6904d96152..2ffae0d6b9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarThumbnailsPatch.kt @@ -7,7 +7,7 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.patches.youtube.layout.seekbar.fullscreenSeekbarThumbnailsFingerprint +import app.revanced.patches.youtube.layout.seekbar.fullscreenSeekbarThumbnailsMethod import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_17_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_09_or_greater @@ -49,7 +49,7 @@ val seekbarThumbnailsPatch = bytecodePatch( ), ) - fullscreenSeekbarThumbnailsFingerprint.method.apply { + fullscreenSeekbarThumbnailsMethod.apply { val moveResultIndex = instructions.lastIndex - 1 addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt index bcd0c745ce..ee3df159c9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/Fingerprints.kt @@ -1,10 +1,17 @@ package app.revanced.patches.youtube.interaction.swipecontrols -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val swipeControlsHostActivityFingerprint = fingerprint { +internal val BytecodePatchContext.swipeControlsHostActivityMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes() custom { method, _ -> @@ -12,7 +19,7 @@ internal val swipeControlsHostActivityFingerprint = fingerprint { } } -internal val swipeChangeVideoFingerprint = fingerprint { +internal val BytecodePatchContext.swipeChangeVideoMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( 45631116L(), // Swipe to change fullscreen video feature flag. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt index ee648e6935..1ec0668603 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/swipecontrols/SwipeControlsPatch.kt @@ -16,7 +16,7 @@ import app.revanced.patches.youtube.misc.playservice.is_20_34_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.mainActivityConstructorFingerprint +import app.revanced.patches.youtube.shared.mainActivityConstructorMethod import app.revanced.util.* import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.immutable.ImmutableMethod @@ -40,7 +40,7 @@ private val swipeControlsResourcePatch = resourcePatch { // Flag was completely removed in 20.34+ if (is_19_43_or_greater && !is_20_22_or_greater) { PreferenceScreen.SWIPE_CONTROLS.addPreferences( - SwitchPreference("revanced_swipe_change_video") + SwitchPreference("revanced_swipe_change_video"), ) } @@ -56,12 +56,12 @@ private val swipeControlsResourcePatch = resourcePatch { TextPreference( "revanced_swipe_overlay_progress_brightness_color", tag = "app.revanced.extension.shared.settings.preference.ColorPickerWithOpacitySliderPreference", - inputType = InputType.TEXT_CAP_CHARACTERS + inputType = InputType.TEXT_CAP_CHARACTERS, ), TextPreference( "revanced_swipe_overlay_progress_volume_color", tag = "app.revanced.extension.shared.settings.preference.ColorPickerWithOpacitySliderPreference", - inputType = InputType.TEXT_CAP_CHARACTERS + inputType = InputType.TEXT_CAP_CHARACTERS, ), TextPreference("revanced_swipe_text_overlay_size", inputType = InputType.NUMBER), TextPreference("revanced_swipe_overlay_timeout", inputType = InputType.NUMBER), @@ -103,12 +103,12 @@ val `Swipe controls` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { - val wrapperClass = swipeControlsHostActivityFingerprint.classDef - val targetClass = mainActivityConstructorFingerprint.classDef + val wrapperClass = swipeControlsHostActivityMethod.classDef + val targetClass = mainActivityConstructorMethod.classDef // Inject the wrapper class from the extension into the class hierarchy of MainActivity. wrapperClass.setSuperClass(targetClass.superclass) @@ -134,10 +134,10 @@ val `Swipe controls` by creatingBytecodePatch( // region patch to enable/disable swipe to change video. if (is_19_43_or_greater && !is_20_34_or_greater) { - swipeChangeVideoFingerprint.let { + swipeChangeVideoMethod.let { it.method.insertLiteralOverride( it.instructionMatches.last().index, // TODO - "$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z" + "$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt index f6a2407404..da40121847 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/AutoCaptionsPatch.kt @@ -27,7 +27,7 @@ val `Disable auto captions` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -37,7 +37,7 @@ val `Disable auto captions` by creatingBytecodePatch( SwitchPreference("revanced_disable_auto_captions"), ) - subtitleTrackFingerprint.method.addInstructions( + subtitleTrackMethod.addInstructions( 0, """ invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->disableAutoCaptions()Z @@ -47,19 +47,19 @@ val `Disable auto captions` by creatingBytecodePatch( return v0 :auto_captions_enabled nop - """ + """, ) arrayOf( - startVideoInformerFingerprint to 0, - storyboardRendererDecoderRecommendedLevelFingerprint to 1 + startVideoInformerMethod to 0, + storyboardRendererDecoderRecommendedLevelMethod to 1, ).forEach { (fingerprint, enabled) -> fingerprint.method.addInstructions( 0, """ const/4 v0, 0x$enabled invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->setCaptionsButtonStatus(Z)V - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt index 09f926af8f..5644b745dc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/autocaptions/Fingerprints.kt @@ -1,10 +1,17 @@ package app.revanced.patches.youtube.layout.autocaptions -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val startVideoInformerFingerprint = fingerprint { +internal val BytecodePatchContext.startVideoInformerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") opcodes( @@ -14,14 +21,14 @@ internal val startVideoInformerFingerprint = fingerprint { strings("pc") } -internal val storyboardRendererDecoderRecommendedLevelFingerprint = fingerprint { +internal val BytecodePatchContext.storyboardRendererDecoderRecommendedLevelMethod by gettingFirstMethodDeclaratively { returnType("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes("L") strings("#-1#") } -internal val subtitleTrackFingerprint = fingerprint { +internal val BytecodePatchContext.subtitleTrackMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt index 65dad0cfb6..3c8c561ffa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/Fingerprints.kt @@ -1,15 +1,22 @@ package app.revanced.patches.youtube.layout.buttons.navigation import app.revanced.patcher.InstructionLocation.MatchAfterImmediately +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val addCreateButtonViewFingerprint = fingerprint { +internal val BytecodePatchContext.addCreateButtonViewMethod by gettingFirstMethodDeclaratively { instructions( addString("Android Wear"), opcode(Opcode.IF_EQZ), @@ -17,7 +24,7 @@ internal val addCreateButtonViewFingerprint = fingerprint { ) } -internal val createPivotBarFingerprint = fingerprint { +internal val BytecodePatchContext.createPivotBarMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes( "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;", @@ -30,7 +37,7 @@ internal val createPivotBarFingerprint = fingerprint { ) } -internal val animatedNavigationTabsFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.animatedNavigationTabsFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") instructions( @@ -38,7 +45,7 @@ internal val animatedNavigationTabsFeatureFlagFingerprint = fingerprint { ) } -internal val translucentNavigationStatusBarFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.translucentNavigationStatusBarFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") instructions( @@ -49,7 +56,7 @@ internal val translucentNavigationStatusBarFeatureFlagFingerprint = fingerprint /** * YouTube nav buttons. */ -internal val translucentNavigationButtonsFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.translucentNavigationButtonsFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") instructions( @@ -60,7 +67,7 @@ internal val translucentNavigationButtonsFeatureFlagFingerprint = fingerprint { /** * Device on screen back/home/recent buttons. */ -internal val translucentNavigationButtonsSystemFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.translucentNavigationButtonsSystemFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt index f4b8c41b4b..b12c1463a7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/navigation/NavigationButtonsPatch.kt @@ -32,7 +32,7 @@ val `Navigation buttons` by creatingBytecodePatch( settingsPatch, addResourcesPatch, navigationBarHookPatch, - versionCheckPatch + versionCheckPatch, ) compatibleWith( @@ -41,7 +41,7 @@ val `Navigation buttons` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -62,13 +62,13 @@ val `Navigation buttons` by creatingBytecodePatch( preferences += SwitchPreference("revanced_disable_translucent_navigation_bar_dark") PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_disable_translucent_status_bar") + SwitchPreference("revanced_disable_translucent_status_bar"), ) } if (is_20_15_or_greater) { PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_navigation_bar_animations") + SwitchPreference("revanced_navigation_bar_animations"), ) } @@ -76,12 +76,12 @@ val `Navigation buttons` by creatingBytecodePatch( PreferenceScreenPreference( key = "revanced_navigation_buttons_screen", sorting = Sorting.UNSORTED, - preferences = preferences - ) + preferences = preferences, + ), ) // Switch create with notifications button. - addCreateButtonViewFingerprint.let { + addCreateButtonViewMethod.let { it.method.apply { val conditionalCheckIndex = it.instructionMatches[1].index val conditionRegister = @@ -98,7 +98,7 @@ val `Navigation buttons` by creatingBytecodePatch( } // Hide navigation button labels. - createPivotBarFingerprint.let { + createPivotBarMethod.let { it.method.apply { val setTextIndex = it.instructionMatches.first().index val targetRegister = getInstruction(setTextIndex).registerC @@ -106,7 +106,7 @@ val `Navigation buttons` by creatingBytecodePatch( addInstruction( setTextIndex, "invoke-static { v$targetRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->hideNavigationButtonLabels(Landroid/widget/TextView;)V", + "$EXTENSION_CLASS_DESCRIPTOR->hideNavigationButtonLabels(Landroid/widget/TextView;)V", ) } } @@ -116,21 +116,21 @@ val `Navigation buttons` by creatingBytecodePatch( // Force on/off translucent effect on status bar and navigation buttons. if (is_19_25_or_greater) { - translucentNavigationStatusBarFeatureFlagFingerprint.let { + translucentNavigationStatusBarFeatureFlagMethod.let { it.method.insertLiteralOverride( it.instructionMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationStatusBar(Z)Z", ) } - translucentNavigationButtonsFeatureFlagFingerprint.let { + translucentNavigationButtonsFeatureFlagMethod.let { it.method.insertLiteralOverride( it.instructionMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", ) } - translucentNavigationButtonsSystemFeatureFlagFingerprint.let { + translucentNavigationButtonsSystemFeatureFlagMethod.let { it.method.insertLiteralOverride( it.instructionMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", @@ -139,10 +139,10 @@ val `Navigation buttons` by creatingBytecodePatch( } if (is_20_15_or_greater) { - animatedNavigationTabsFeatureFlagFingerprint.let { + animatedNavigationTabsFeatureFlagMethod.let { it.method.insertLiteralOverride( it.instructionMatches.first().index, - "$EXTENSION_CLASS_DESCRIPTOR->useAnimatedNavigationButtons(Z)Z" + "$EXTENSION_CLASS_DESCRIPTOR->useAnimatedNavigationButtons(Z)Z", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt index 412e51b456..0879eea2cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/HidePlayerOverlayButtonsPatch.kt @@ -12,7 +12,7 @@ import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.getLayoutConstructorMethodMatch -import app.revanced.patches.youtube.shared.subtitleButtonControllerFingerprint +import app.revanced.patches.youtube.shared.subtitleButtonControllerMethod import app.revanced.util.* import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @@ -96,7 +96,7 @@ val `Hide player overlay buttons` by creatingBytecodePatch( // region Hide captions button. - subtitleButtonControllerFingerprint.method.apply { + subtitleButtonControllerMethod.apply { val insertIndex = indexOfFirstInstructionOrThrow(Opcode.IGET_BOOLEAN) + 1 addInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt index fc585e2e8b..dd7bc0f21d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/ChangeFormFactorPatch.kt @@ -4,7 +4,6 @@ import app.revanced.patcher.InstructionLocation.* import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.fieldAccess -import app.revanced.patcher.fingerprint import app.revanced.patcher.instructions import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.patches.all.misc.resources.addResources @@ -56,7 +55,7 @@ val `Change form factor` by creatingBytecodePatch( instructions( fieldAccess(smali = "Landroid/os/Build;->MODEL:Ljava/lang/String;"), fieldAccess( - definingClass = formFactorEnumConstructorFingerprint.originalClassDef.type, + definingClass = formFactorEnumConstructorMethod.originalClassDef.type, type = "I", location = MatchAfterWithin(50), ), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt index 457d19116e..4f6de85f46 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/formfactor/Fingerprints.kt @@ -1,14 +1,21 @@ package app.revanced.patches.youtube.layout.formfactor -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val formFactorEnumConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.formFactorEnumConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "UNKNOWN_FORM_FACTOR", "SMALL_FORM_FACTOR", "LARGE_FORM_FACTOR", - "AUTOMOTIVE_FORM_FACTOR" + "AUTOMOTIVE_FORM_FACTOR", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt index a307829363..20426a4125 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/Fingerprints.kt @@ -1,6 +1,13 @@ package app.revanced.patches.youtube.layout.hide.endscreencards -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.containsLiteralInstruction import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction @@ -9,7 +16,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.FieldReference -internal val layoutCircleFingerprint = fingerprint { +internal val BytecodePatchContext.layoutCircleMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes() returnType("Landroid/view/View;") @@ -23,7 +30,7 @@ internal val layoutCircleFingerprint = fingerprint { literal { layoutCircle } } -internal val layoutIconFingerprint = fingerprint { +internal val BytecodePatchContext.layoutIconMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes() returnType("Landroid/view/View;") @@ -36,7 +43,7 @@ internal val layoutIconFingerprint = fingerprint { literal { layoutIcon } } -internal val layoutVideoFingerprint = fingerprint { +internal val BytecodePatchContext.layoutVideoMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC) parameterTypes() returnType("Landroid/view/View;") @@ -50,7 +57,7 @@ internal val layoutVideoFingerprint = fingerprint { literal { layoutVideo } } -internal val showEndscreenCardsFingerprint = fingerprint { +internal val BytecodePatchContext.showEndscreenCardsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt index 2aaa409774..479ea26a76 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreencards/HideEndScreenCardsPatch.kt @@ -70,9 +70,9 @@ val `Hide end screen cards` by creatingBytecodePatch( apply { listOf( - layoutCircleFingerprint, - layoutIconFingerprint, - layoutVideoFingerprint, + layoutCircleMethod, + layoutIconMethod, + layoutVideoMethod, ).forEach { fingerprint -> fingerprint.method.apply { val insertIndex = fingerprint.instructionMatches.last().index + 1 // TODO @@ -87,7 +87,7 @@ val `Hide end screen cards` by creatingBytecodePatch( } if (is_19_43_or_greater) { - showEndscreenCardsFingerprint.method.addInstructionsWithLabels( + showEndscreenCardsMethod.addInstructionsWithLabels( 0, """ invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->hideEndScreenCards()Z diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/Fingerprints.kt index 2b609acc35..ea04436844 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/Fingerprints.kt @@ -1,25 +1,32 @@ package app.revanced.patches.youtube.layout.hide.endscreensuggestion -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val autoNavConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.autoNavConstructorMethod by gettingFirstMethodDeclaratively { returnType("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) strings("main_app_autonav") } -internal val autoNavStatusFingerprint = fingerprint { +internal val BytecodePatchContext.autoNavStatusMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() } -internal val removeOnLayoutChangeListenerFingerprint = fingerprint { +internal val BytecodePatchContext.removeOnLayoutChangeListenerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt index 1b7ac00914..e8593c6344 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/endscreensuggestion/HideEndScreenSuggestedVideoPatch.kt @@ -34,7 +34,7 @@ val `Hide end screen suggested video` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -44,19 +44,19 @@ val `Hide end screen suggested video` by creatingBytecodePatch( SwitchPreference("revanced_end_screen_suggested_video"), ) - removeOnLayoutChangeListenerFingerprint.let { + removeOnLayoutChangeListenerMethod.let { val endScreenMethod = navigate(it.originalMethod).to(it.instructionMatches.last().index).stop() // TODO endScreenMethod.apply { - val autoNavStatusMethodName = autoNavStatusFingerprint.match( - autoNavConstructorFingerprint.classDef + val autoNavStatusMethodName = autoNavStatusMethod.match( + autoNavConstructorMethod.classDef, ).originalMethod.name val invokeIndex = indexOfFirstInstructionOrThrow { val reference = getReference() reference?.name == autoNavStatusMethodName && - reference.returnType == "Z" && - reference.parameterTypes.isEmpty() + reference.returnType == "Z" && + reference.parameterTypes.isEmpty() } val iGetObjectIndex = indexOfFirstInstructionReversedOrThrow(invokeIndex, Opcode.IGET_OBJECT) val invokeReference = getInstruction(invokeIndex).reference @@ -80,7 +80,7 @@ val `Hide end screen suggested video` by creatingBytecodePatch( if-nez v0, :show_end_screen_recommendation return-void """, - ExternalLabel("show_end_screen_recommendation", getInstruction(0)) + ExternalLabel("show_end_screen_recommendation", getInstruction(0)), ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt index b8fa62576c..c985ae2a85 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/DisableFullscreenAmbientModePatch.kt @@ -32,7 +32,7 @@ val `Disable fullscreen ambient mode` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -42,7 +42,7 @@ val `Disable fullscreen ambient mode` by creatingBytecodePatch( SwitchPreference("revanced_disable_fullscreen_ambient_mode"), ) - setFullScreenBackgroundColorFingerprint.method.apply { + setFullScreenBackgroundColorMethod.apply { val insertIndex = indexOfFirstInstructionReversedOrThrow { getReference()?.name == "setBackgroundColor" } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt index 469caa03ce..687ff4a779 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt @@ -1,9 +1,16 @@ package app.revanced.patches.youtube.layout.hide.fullscreenambientmode -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val setFullScreenBackgroundColorFingerprint = fingerprint { +internal val BytecodePatchContext.setFullScreenBackgroundColorMethod by gettingFirstMethodDeclaratively { returnType("V") accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) parameterTypes("Z", "I", "I", "I", "I") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt index 0e12eb0903..aa4c8965dd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/Fingerprints.kt @@ -2,13 +2,20 @@ package app.revanced.patches.youtube.layout.hide.general import app.revanced.patcher.InstructionLocation.* import app.revanced.patcher.StringComparisonType +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString import app.revanced.patcher.checkCast -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType -import app.revanced.patches.youtube.layout.searchbar.wideSearchbarLayoutFingerprint +import app.revanced.patches.youtube.layout.searchbar.wideSearchbarLayoutMethod import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -16,7 +23,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * 20.26+ */ -internal val hideShowMoreButtonFingerprint = fingerprint { +internal val BytecodePatchContext.hideShowMoreButtonMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL, AccessFlags.SYNTHETIC) returnType("V") parameterTypes("L", "Ljava/lang/Object;") @@ -27,7 +34,7 @@ internal val hideShowMoreButtonFingerprint = fingerprint { ) } -internal val hideShowMoreLegacyButtonFingerprint = fingerprint { +internal val BytecodePatchContext.hideShowMoreLegacyButtonMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( ResourceType.LAYOUT("expand_button_down"), @@ -36,7 +43,7 @@ internal val hideShowMoreLegacyButtonFingerprint = fingerprint { ) } -internal val parseElementFromBufferFingerprint = fingerprint { +internal val BytecodePatchContext.parseElementFromBufferMethod by gettingFirstMethodDeclaratively { parameterTypes("L", "L", "[B", "L", "L") instructions( opcode(Opcode.IGET_OBJECT), @@ -48,7 +55,7 @@ internal val parseElementFromBufferFingerprint = fingerprint { ) } -internal val playerOverlayFingerprint = fingerprint { +internal val BytecodePatchContext.playerOverlayMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") instructions( @@ -56,16 +63,16 @@ internal val playerOverlayFingerprint = fingerprint { ) } -internal val showWatermarkFingerprint = fingerprint { +internal val BytecodePatchContext.showWatermarkMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L", "L") } /** - * Matches same method as [wideSearchbarLayoutFingerprint]. + * Matches same method as [wideSearchbarLayoutMethod]. */ -internal val yoodlesImageViewFingerprint = fingerprint { +internal val BytecodePatchContext.yoodlesImageViewMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Landroid/view/View;") parameterTypes("L", "L") @@ -74,7 +81,7 @@ internal val yoodlesImageViewFingerprint = fingerprint { ) } -internal val crowdfundingBoxFingerprint = fingerprint { +internal val BytecodePatchContext.crowdfundingBoxMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.INVOKE_VIRTUAL, @@ -84,7 +91,7 @@ internal val crowdfundingBoxFingerprint = fingerprint { literal { crowdfundingBoxId } } -internal val albumCardsFingerprint = fingerprint { +internal val BytecodePatchContext.albumCardsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.MOVE_RESULT_OBJECT, @@ -97,7 +104,7 @@ internal val albumCardsFingerprint = fingerprint { literal { albumCardId } } -internal val filterBarHeightFingerprint = fingerprint { +internal val BytecodePatchContext.filterBarHeightMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.CONST, @@ -108,7 +115,7 @@ internal val filterBarHeightFingerprint = fingerprint { literal { filterBarHeightId } } -internal val relatedChipCloudFingerprint = fingerprint { +internal val BytecodePatchContext.relatedChipCloudMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.CONST, @@ -118,7 +125,7 @@ internal val relatedChipCloudFingerprint = fingerprint { literal { relatedChipCloudMarginId } } -internal val searchResultsChipBarFingerprint = fingerprint { +internal val BytecodePatchContext.searchResultsChipBarMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.CONST, @@ -130,7 +137,7 @@ internal val searchResultsChipBarFingerprint = fingerprint { literal { barContainerHeightId } } -internal val showFloatingMicrophoneButtonFingerprint = fingerprint { +internal val BytecodePatchContext.showFloatingMicrophoneButtonMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes() @@ -141,7 +148,7 @@ internal val showFloatingMicrophoneButtonFingerprint = fingerprint { ) } -internal val hideViewCountFingerprint = fingerprint { +internal val BytecodePatchContext.hideViewCountMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("Ljava/lang/CharSequence;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt index 319678fc03..27db61f1ce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.layout.hide.general -import app.revanced.patcher.Fingerprint import app.revanced.patcher.extensions.* import app.revanced.patcher.patch.creatingBytecodePatch import app.revanced.patcher.patch.resourcePatch @@ -83,7 +82,7 @@ private const val KEYWORD_FILTER_CLASS_NAME = val `Hide layout components` by creatingBytecodePatch( description = "Adds options to hide general layout components.", - ) { +) { dependsOn( lithoFilterPatch, settingsPatch, @@ -240,8 +239,8 @@ val `Hide layout components` by creatingBytecodePatch( // region Mix playlists - parseElementFromBufferFingerprint.method.apply { - val startIndex = parseElementFromBufferFingerprint.instructionMatches.first().index + parseElementFromBufferMethod.apply { + val startIndex = parseElementFromBufferMethod.instructionMatches.first().index val insertIndex = startIndex + 1 val byteArrayParameter = "p3" @@ -269,8 +268,8 @@ val `Hide layout components` by creatingBytecodePatch( // region Watermark (legacy code for old versions of YouTube) - showWatermarkFingerprint.match( - playerOverlayFingerprint.originalClassDef, + showWatermarkMethod.match( + playerOverlayMethod.originalClassDef, ).method.apply { val index = implementation!!.instructions.size - 5 @@ -288,7 +287,7 @@ val `Hide layout components` by creatingBytecodePatch( // region Show more button - (if (is_20_26_or_greater) hideShowMoreButtonFingerprint else hideShowMoreLegacyButtonFingerprint).let { + (if (is_20_26_or_greater) hideShowMoreButtonMethod else hideShowMoreLegacyButtonMethod).let { it.method.apply { val moveRegisterIndex = it.instructionMatches.last().index val viewRegister = getInstruction(moveRegisterIndex).registerA @@ -305,7 +304,7 @@ val `Hide layout components` by creatingBytecodePatch( // endregion // region crowdfunding box - crowdfundingBoxFingerprint.let { + crowdfundingBoxMethod.let { it.method.apply { val insertIndex = it.instructionMatches.last().index val objectRegister = getInstruction(insertIndex).registerA @@ -313,7 +312,7 @@ val `Hide layout components` by creatingBytecodePatch( addInstruction( insertIndex, "invoke-static {v$objectRegister}, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + - "->hideCrowdfundingBox(Landroid/view/View;)V", + "->hideCrowdfundingBox(Landroid/view/View;)V", ) } } @@ -322,7 +321,7 @@ val `Hide layout components` by creatingBytecodePatch( // region hide album cards - albumCardsFingerprint.let { + albumCardsMethod.let { it.method.apply { val checkCastAnchorIndex = it.instructionMatches.last().index val insertIndex = checkCastAnchorIndex + 1 @@ -331,7 +330,7 @@ val `Hide layout components` by creatingBytecodePatch( addInstruction( insertIndex, "invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + - "->hideAlbumCard(Landroid/view/View;)V", + "->hideAlbumCard(Landroid/view/View;)V", ) } } @@ -340,7 +339,7 @@ val `Hide layout components` by creatingBytecodePatch( // region hide floating microphone - showFloatingMicrophoneButtonFingerprint.let { + showFloatingMicrophoneButtonMethod.let { it.method.apply { val index = it.instructionMatches.last().index val register = getInstruction(index).registerA @@ -359,7 +358,7 @@ val `Hide layout components` by creatingBytecodePatch( // region 'Yoodles' - yoodlesImageViewFingerprint.method.apply { + yoodlesImageViewMethod.apply { findInstructionIndicesReversedOrThrow { getReference()?.name == "setImageDrawable" }.forEach { insertIndex -> @@ -378,8 +377,8 @@ val `Hide layout components` by creatingBytecodePatch( // region hide view count - hideViewCountFingerprint.method.apply { - val startIndex = hideViewCountFingerprint.patternMatch.startIndex + hideViewCountMethod.apply { + val startIndex = hideViewCountMethod.patternMatch.startIndex var returnStringRegister = getInstruction(startIndex).registerA // Find the instruction where the text dimension is retrieved. @@ -430,23 +429,23 @@ val `Hide layout components` by creatingBytecodePatch( addInstructions(insertIndex, instructions(register)) } - filterBarHeightFingerprint.patch { register -> + filterBarHeightMethod.patch { register -> """ invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideInFeed(I)I move-result v$register """ } - searchResultsChipBarFingerprint.patch(-1, -2) { register -> + searchResultsChipBarMethod.patch(-1, -2) { register -> """ invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideInSearch(I)I move-result v$register """ } - relatedChipCloudFingerprint.patch(1) { register -> + relatedChipCloudMethod.patch(1) { register -> "invoke-static { v$register }, " + - "$LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideInRelatedVideos(Landroid/view/View;)V" + "$LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideInRelatedVideos(Landroid/view/View;)V" } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt index 97b558655b..ff0fbf3e1a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/Fingerprints.kt @@ -2,17 +2,20 @@ package app.revanced.patches.youtube.layout.hide.infocards import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint import app.revanced.patcher.firstMethodBuilder +import app.revanced.patcher.gettingFirstMethodDeclaratively import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.returnType import app.revanced.patcher.string import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val infocardsIncognitoFingerprint = fingerprint { +internal val BytecodePatchContext.infocardsIncognitoMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/Boolean;") parameterTypes("L", "J") @@ -21,7 +24,7 @@ internal val infocardsIncognitoFingerprint = fingerprint { ) } -internal val infocardsIncognitoParentFingerprint = fingerprint { +internal val BytecodePatchContext.infocardsIncognitoParentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/String;") instructions( @@ -29,7 +32,7 @@ internal val infocardsIncognitoParentFingerprint = fingerprint { ) } -internal val infocardsMethodCallFingerprint = fingerprint { +internal val BytecodePatchContext.infocardsMethodCallMethod by gettingFirstMethodDeclaratively { opcodes( Opcode.INVOKE_VIRTUAL, Opcode.IGET_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt index e0e908702d..85573f4aa5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatch.kt @@ -63,21 +63,21 @@ val `Hide info cards` by creatingBytecodePatch( ) // Edit: This old non litho code may be obsolete and no longer used by any supported versions. - infocardsIncognitoFingerprint.match(infocardsIncognitoParentFingerprint.originalClassDef).method.apply { + infocardsIncognitoMethod.match(infocardsIncognitoParentMethod.originalClassDef).method.apply { val invokeInstructionIndex = implementation!!.instructions.indexOfFirst { it.opcode.ordinal == Opcode.INVOKE_VIRTUAL.ordinal && - ((it as ReferenceInstruction).reference.toString() == "Landroid/view/View;->setVisibility(I)V") + ((it as ReferenceInstruction).reference.toString() == "Landroid/view/View;->setVisibility(I)V") } addInstruction( invokeInstructionIndex, "invoke-static {v${getInstruction(invokeInstructionIndex).registerC}}," + - " Lapp/revanced/extension/youtube/patches/HideInfoCardsPatch;->hideInfoCardsIncognito(Landroid/view/View;)V", + " Lapp/revanced/extension/youtube/patches/HideInfoCardsPatch;->hideInfoCardsIncognito(Landroid/view/View;)V", ) } // Edit: This old non litho code may be obsolete and no longer used by any supported versions. - infocardsMethodCallFingerprint.let { + infocardsMethodCallMethod.let { val invokeInterfaceIndex = it.instructionMatches.last().index it.method.apply { val register = implementation!!.registerCount - 1 diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt index c337c5358e..3711e78fe8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt @@ -1,16 +1,23 @@ package app.revanced.patches.youtube.layout.hide.relatedvideooverlay -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType -internal val relatedEndScreenResultsParentFingerprint = fingerprint { +internal val BytecodePatchContext.relatedEndScreenResultsParentMethod by gettingFirstMethodDeclaratively { returnType("V") instructions( ResourceType.LAYOUT("app_related_endscreen_results"), ) } -internal val relatedEndScreenResultsFingerprint = fingerprint { +internal val BytecodePatchContext.relatedEndScreenResultsMethod by gettingFirstMethodDeclaratively { returnType("V") parameterTypes( "I", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt index 4692972e92..ce3053c8f3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/HideRelatedVideoOverlayPatch.kt @@ -32,18 +32,18 @@ val `Hide related video overlay` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { addResources("youtube", "layout.hide.relatedvideooverlay.hideRelatedVideoOverlayPatch") PreferenceScreen.PLAYER.addPreferences( - SwitchPreference("revanced_hide_related_videos_overlay") + SwitchPreference("revanced_hide_related_videos_overlay"), ) - relatedEndScreenResultsFingerprint.match( - relatedEndScreenResultsParentFingerprint.originalClassDef + relatedEndScreenResultsMethod.match( + relatedEndScreenResultsParentMethod.originalClassDef, ).method.apply { addInstructionsWithLabels( 0, @@ -53,7 +53,7 @@ val `Hide related video overlay` by creatingBytecodePatch( if-eqz v0, :show return-void """, - ExternalLabel("show", getInstruction(0)) + ExternalLabel("show", getInstruction(0)), ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt index 7a60fda270..b834a10a4a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/rollingnumber/DisableRollingNumberAnimationPatch.kt @@ -11,7 +11,7 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.rollingNumberTextViewAnimationUpdateFingerprint +import app.revanced.patches.youtube.shared.rollingNumberTextViewAnimationUpdateMethod import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction private const val EXTENSION_CLASS_DESCRIPTOR = @@ -32,7 +32,7 @@ val `Disable rolling number animations` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -44,7 +44,7 @@ val `Disable rolling number animations` by creatingBytecodePatch( // Animations are disabled by preventing an Image from being applied to the text span, // which prevents the animations from appearing. - rollingNumberTextViewAnimationUpdateFingerprint.let { + rollingNumberTextViewAnimationUpdateMethod.let { val blockStartIndex = it.instructionMatches.first().index val blockEndIndex = it.instructionMatches.last().index + 1 it.method.apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt index acb57f634d..6ad7030966 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/Fingerprints.kt @@ -1,16 +1,23 @@ package app.revanced.patches.youtube.layout.hide.shorts import app.revanced.patcher.InstructionLocation.* +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val shortsBottomBarContainerFingerprint = fingerprint { +internal val BytecodePatchContext.shortsBottomBarContainerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("Landroid/view/View;", "Landroid/os/Bundle;") @@ -25,7 +32,7 @@ internal val shortsBottomBarContainerFingerprint = fingerprint { /** * 19.41 to 20.44. */ -internal val renderBottomNavigationBarFingerprint = fingerprint { +internal val BytecodePatchContext.renderBottomNavigationBarMethod by gettingFirstMethodDeclaratively { returnType("V") parameterTypes("Ljava/lang/String;") instructions( @@ -46,7 +53,7 @@ internal val renderBottomNavigationBarFingerprint = fingerprint { /** * Less than 19.41. */ -internal val legacyRenderBottomNavigationBarLegacyParentFingerprint = fingerprint { +internal val BytecodePatchContext.legacyRenderBottomNavigationBarLegacyParentMethod by gettingFirstMethodDeclaratively { parameterTypes( "I", "I", @@ -61,10 +68,10 @@ internal val legacyRenderBottomNavigationBarLegacyParentFingerprint = fingerprin } /** - * Identical to [legacyRenderBottomNavigationBarLegacyParentFingerprint] + * Identical to [legacyRenderBottomNavigationBarLegacyParentMethod] * except this has an extra parameter. */ -internal val renderBottomNavigationBarLegacy1941ParentFingerprint = fingerprint { +internal val BytecodePatchContext.renderBottomNavigationBarLegacy1941ParentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes( "I", @@ -80,7 +87,7 @@ internal val renderBottomNavigationBarLegacy1941ParentFingerprint = fingerprint ) } -internal val renderBottomNavigationBarParentFingerprint = fingerprint { +internal val BytecodePatchContext.renderBottomNavigationBarParentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("[Ljava/lang/Class;") parameterTypes( @@ -93,7 +100,7 @@ internal val renderBottomNavigationBarParentFingerprint = fingerprint { ) } -internal val setPivotBarVisibilityFingerprint = fingerprint { +internal val BytecodePatchContext.setPivotBarVisibilityMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returnType("V") parameterTypes("Z") @@ -103,14 +110,14 @@ internal val setPivotBarVisibilityFingerprint = fingerprint { ) } -internal val setPivotBarVisibilityParentFingerprint = fingerprint { +internal val BytecodePatchContext.setPivotBarVisibilityParentMethod by gettingFirstMethodDeclaratively { parameterTypes("Z") instructions( addString("FEnotifications_inbox"), ) } -internal val shortsExperimentalPlayerFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.shortsExperimentalPlayerFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() @@ -119,7 +126,7 @@ internal val shortsExperimentalPlayerFeatureFlagFingerprint = fingerprint { ) } -internal val renderNextUIFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.renderNextUIFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt index 903e84734c..a1f9935442 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatch.kt @@ -207,8 +207,8 @@ val `Hide Shorts componentsby creatingBytecodePatch( // region Hide the navigation bar. // Hook to get the pivotBar view. - setPivotBarVisibilityFingerprint.match( - setPivotBarVisibilityParentFingerprint.originalClassDef, + setPivotBarVisibilityMethod.match( + setPivotBarVisibilityParentMethod.originalClassDef, ).let { result -> result.method.apply { val insertIndex = result.instructionMatches.last().index @@ -222,14 +222,14 @@ val `Hide Shorts componentsby creatingBytecodePatch( } // Hook to hide the shared navigation bar when the Shorts player is opened. - renderBottomNavigationBarFingerprint.match( + renderBottomNavigationBarMethod.match( ( if (is_20_45_or_greater) { - renderBottomNavigationBarParentFingerprint + renderBottomNavigationBarParentMethod } else if (is_19_41_or_greater) { - renderBottomNavigationBarLegacy1941ParentFingerprint + renderBottomNavigationBarLegacy1941ParentMethod } else { - legacyRenderBottomNavigationBarLegacyParentFingerprint + legacyRenderBottomNavigationBarLegacyParentMethod } ).originalClassDef, ).method.addInstruction( @@ -238,7 +238,7 @@ val `Hide Shorts componentsby creatingBytecodePatch( ) // Hide the bottom bar container of the Shorts player. - shortsBottomBarContainerFingerprint.let { + shortsBottomBarContainerMethod.let { it.method.apply { val targetIndex = it.instructionMatches.last().index val heightRegister = getInstruction(targetIndex).registerA @@ -267,12 +267,12 @@ val `Hide Shorts componentsby creatingBytecodePatch( // Since the buttons are native components and not Litho, it should be possible to // fix the RYD Shorts loading delay by asynchronously loading RYD and updating // the button text after RYD has loaded. - shortsExperimentalPlayerFeatureFlagFingerprint.method.returnLate(false) + shortsExperimentalPlayerFeatureFlagMethod.returnLate(false) // Experimental UI renderer must also be disabled since it requires the // experimental Shorts player. If this is enabled but Shorts player // is disabled then the app crashes when the Shorts player is opened. - renderNextUIFeatureFlagFingerprint.method.returnLate(false) + renderNextUIFeatureFlagMethod.returnLate(false) } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt index 399b4d1a89..63809b5a1f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/DisableSignInToTvPatchPopup.kt @@ -20,7 +20,7 @@ val `Disable sign in to TV popup` by creatingBytecodePatch( settingsPatch, sharedExtensionPatch, addResourcesPatch, - resourceMappingPatch + resourceMappingPatch, ) compatibleWith( @@ -29,7 +29,7 @@ val `Disable sign in to TV popup` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -39,7 +39,7 @@ val `Disable sign in to TV popup` by creatingBytecodePatch( SwitchPreference("revanced_disable_signin_to_tv_popup"), ) - signInToTvPopupFingerprint.method.addInstructionsWithLabels( + signInToTvPopupMethod.addInstructionsWithLabels( 0, """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableSignInToTvPopup()Z @@ -49,7 +49,7 @@ val `Disable sign in to TV popup` by creatingBytecodePatch( return v0 :allow_sign_in_popup nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt index 2cd5136030..2d0f4126dc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/signintotvpopup/Fingerprints.kt @@ -1,9 +1,16 @@ package app.revanced.patches.youtube.layout.hide.signintotvpopup -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType -internal val signInToTvPopupFingerprint = fingerprint { +internal val BytecodePatchContext.signInToTvPopupMethod by gettingFirstMethodDeclaratively { returnType("Z") parameterTypes("Ljava/lang/String;", "Z", "L") instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt index 993c56d2ec..949329cc49 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt @@ -1,14 +1,21 @@ package app.revanced.patches.youtube.layout.hide.time import app.revanced.patcher.InstructionLocation.* +import app.revanced.patcher.accessFlags import app.revanced.patcher.fieldAccess -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val timeCounterFingerprint = fingerprint { +internal val BytecodePatchContext.timeCounterMethod by gettingFirstMethodDeclaratively { returnType("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt index fc3f88c323..4569bd6976 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/HideTimestampPatch.kt @@ -26,7 +26,7 @@ val `Hide timestamp` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -36,7 +36,7 @@ val `Hide timestamp` by creatingBytecodePatch( SwitchPreference("revanced_hide_timestamp"), ) - timeCounterFingerprint.method.addInstructionsWithLabels( + timeCounterMethod.addInstructionsWithLabels( 0, """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->hideTimestamp()Z @@ -45,7 +45,7 @@ val `Hide timestamp` by creatingBytecodePatch( return-void :hide_time nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt index 8b06d92ed6..6f4f5f6201 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/Fingerprints.kt @@ -3,12 +3,19 @@ package app.revanced.patches.youtube.layout.miniplayer import app.revanced.patcher.InstructionLocation.MatchAfterWithin +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString import app.revanced.patcher.checkCast -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -25,14 +32,14 @@ internal const val MINIPLAYER_INITIAL_SIZE_FEATURE_KEY = 45640023L internal const val MINIPLAYER_DISABLED_FEATURE_KEY = 45657015L internal const val MINIPLAYER_ANIMATED_EXPAND_FEATURE_KEY = 45644360L -internal val miniplayerModernConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerModernConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( 45623000L(), // Magic number found in the constructor. ) } -internal val miniplayerDimensionsCalculatorParentFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerDimensionsCalculatorParentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L") @@ -41,7 +48,7 @@ internal val miniplayerDimensionsCalculatorParentFingerprint = fingerprint { ) } -internal val miniplayerModernViewParentFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerModernViewParentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/String;") parameterTypes() @@ -51,18 +58,18 @@ internal val miniplayerModernViewParentFingerprint = fingerprint { } /** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. + * Matches using the class found in [miniplayerModernViewParentMethod]. */ -internal val miniplayerModernAddViewListenerFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerModernAddViewListenerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("Landroid/view/View;") } /** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. + * Matches using the class found in [miniplayerModernViewParentMethod]. */ -internal val miniplayerModernCloseButtonFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerModernCloseButtonMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes() @@ -73,9 +80,9 @@ internal val miniplayerModernCloseButtonFingerprint = fingerprint { } /** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. + * Matches using the class found in [miniplayerModernViewParentMethod]. */ -internal val miniplayerModernExpandButtonFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerModernExpandButtonMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes() @@ -86,9 +93,9 @@ internal val miniplayerModernExpandButtonFingerprint = fingerprint { } /** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. + * Matches using the class found in [miniplayerModernViewParentMethod]. */ -internal val miniplayerModernExpandCloseDrawablesFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerModernExpandCloseDrawablesMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L") @@ -98,9 +105,9 @@ internal val miniplayerModernExpandCloseDrawablesFingerprint = fingerprint { } /** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. + * Matches using the class found in [miniplayerModernViewParentMethod]. */ -internal val miniplayerModernForwardButtonFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerModernForwardButtonMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes() @@ -110,7 +117,7 @@ internal val miniplayerModernForwardButtonFingerprint = fingerprint { ) } -internal val miniplayerModernOverlayViewFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerModernOverlayViewMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes() instructions( @@ -120,9 +127,9 @@ internal val miniplayerModernOverlayViewFingerprint = fingerprint { } /** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. + * Matches using the class found in [miniplayerModernViewParentMethod]. */ -internal val miniplayerModernRewindButtonFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerModernRewindButtonMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes() @@ -133,9 +140,9 @@ internal val miniplayerModernRewindButtonFingerprint = fingerprint { } /** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. + * Matches using the class found in [miniplayerModernViewParentMethod]. */ -internal val miniplayerModernActionButtonFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerModernActionButtonMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes() @@ -145,16 +152,16 @@ internal val miniplayerModernActionButtonFingerprint = fingerprint { ) } -internal val miniplayerMinimumSizeFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerMinimumSizeMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( ResourceType.DIMEN("miniplayer_max_size"), - 192(), // Default miniplayer width constant. - 128(), // Default miniplayer height constant. + 192L(), // Default miniplayer width constant. + 128L(), // Default miniplayer height constant. ) } -internal val miniplayerOverrideFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerOverrideMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") instructions( @@ -167,7 +174,7 @@ internal val miniplayerOverrideFingerprint = fingerprint { ) } -internal val miniplayerOverrideNoContextFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerOverrideNoContextMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returnType("Z") instructions( @@ -178,7 +185,7 @@ internal val miniplayerOverrideNoContextFingerprint = fingerprint { /** * 20.36 and lower. Codes appears to be removed in 20.37+ */ -internal val miniplayerResponseModelSizeCheckFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerResponseModelSizeCheckMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes("Ljava/lang/Object;", "Ljava/lang/Object;") @@ -192,7 +199,7 @@ internal val miniplayerResponseModelSizeCheckFingerprint = fingerprint { ) } -internal val miniplayerOnCloseHandlerFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerOnCloseHandlerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") instructions( @@ -203,13 +210,13 @@ internal val miniplayerOnCloseHandlerFingerprint = fingerprint { internal const val YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME = "Lcom/google/android/apps/youtube/app/common/player/overlay/YouTubePlayerOverlaysLayout;" -internal val playerOverlaysLayoutFingerprint = fingerprint { +internal val BytecodePatchContext.playerOverlaysLayoutMethod by gettingFirstMethodDeclaratively { custom { method, _ -> method.definingClass == YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME } } -internal val miniplayerSetIconsFingerprint = fingerprint { +internal val BytecodePatchContext.miniplayerSetIconsMethod by gettingFirstMethodDeclaratively { returnType("V") parameterTypes("I", "Ljava/lang/Runnable;") instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt index 1a3ab1858c..9e51b76294 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/miniplayer/MiniplayerPatch.kt @@ -2,7 +2,6 @@ package app.revanced.patches.youtube.layout.miniplayer -import app.revanced.patcher.Fingerprint import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction @@ -236,8 +235,8 @@ val Miniplayer by creatingBytecodePatch( // Parts of the YT code is removed in 20.37+ and the legacy player no longer works. if (!is_20_37_or_greater) { - miniplayerOverrideNoContextFingerprint.match( - miniplayerDimensionsCalculatorParentFingerprint.originalClassDef, + miniplayerOverrideNoContextMethod.match( + miniplayerDimensionsCalculatorParentMethod.originalClassDef, ).method.apply { findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride( @@ -249,7 +248,7 @@ val Miniplayer by creatingBytecodePatch( // endregion // region Legacy tablet miniplayer hooks. - miniplayerOverrideFingerprint.let { + miniplayerOverrideMethod.let { val appNameStringIndex = it.instructionMatches.last().index navigate(it.originalMethod).to(appNameStringIndex).stop().apply { findReturnIndicesReversed().forEach { index -> @@ -260,7 +259,7 @@ val Miniplayer by creatingBytecodePatch( } } - miniplayerResponseModelSizeCheckFingerprint.let { + miniplayerResponseModelSizeCheckMethod.let { it.method.insertLegacyTabletMiniplayerOverride(it.instructionMatches.last().index) } } @@ -269,7 +268,7 @@ val Miniplayer by creatingBytecodePatch( // region Enable modern miniplayer. - miniplayerModernConstructorFingerprint.classDef.methods.forEach { + miniplayerModernConstructorMethod.classDef.methods.forEach { it.apply { if (AccessFlags.CONSTRUCTOR.isSet(accessFlags)) { val iPutIndex = indexOfFirstInstructionOrThrow { @@ -284,31 +283,31 @@ val Miniplayer by creatingBytecodePatch( } if (is_19_23_or_greater) { - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_DRAG_DROP_FEATURE_KEY, "getMiniplayerDragAndDrop", ) } if (is_19_25_or_greater) { - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_MODERN_FEATURE_LEGACY_KEY, "getModernMiniplayerOverride", ) - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_MODERN_FEATURE_KEY, "getModernFeatureFlagsActiveOverride", ) - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_DOUBLE_TAP_FEATURE_KEY, "getMiniplayerDoubleTapAction", ) } if (is_19_26_or_greater) { - miniplayerModernConstructorFingerprint.method.apply { + miniplayerModernConstructorMethod.apply { val literalIndex = indexOfFirstLiteralInstructionOrThrow( MINIPLAYER_INITIAL_SIZE_FEATURE_KEY, ) @@ -325,7 +324,7 @@ val Miniplayer by creatingBytecodePatch( } // Override a minimum size constant. - miniplayerMinimumSizeFingerprint.let { + miniplayerMinimumSizeMethod.let { it.method.apply { val index = it.instructionMatches[1].index val register = getInstruction(index).registerA @@ -339,24 +338,24 @@ val Miniplayer by creatingBytecodePatch( } if (is_19_36_or_greater) { - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY, "getRoundedCorners", ) } if (is_19_43_or_greater) { - miniplayerOnCloseHandlerFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerOnCloseHandlerMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_DISABLED_FEATURE_KEY, "getMiniplayerOnCloseHandler", ) - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY, "getHorizontalDrag", ) - miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + miniplayerModernConstructorMethod.insertMiniplayerFeatureFlagBooleanOverride( MINIPLAYER_ANIMATED_EXPAND_FEATURE_KEY, "getMaximizeAnimation", ) @@ -368,8 +367,8 @@ val Miniplayer by creatingBytecodePatch( // YT fixed this mistake in 19.17. // Fix this, by swapping the drawable resource values with each other. if (!is_19_17_or_greater) { - miniplayerModernExpandCloseDrawablesFingerprint.match( - miniplayerModernViewParentFingerprint.originalClassDef, + miniplayerModernExpandCloseDrawablesMethod.match( + miniplayerModernViewParentMethod.originalClassDef, ).method.apply { listOf( ytOutlinePictureInPictureWhite24 to ytOutlineXWhite24, @@ -388,7 +387,7 @@ val Miniplayer by creatingBytecodePatch( // region fix minimal miniplayer using the wrong pause/play bold icons. if (is_20_31_or_greater) { - miniplayerSetIconsFingerprint.method.apply { + miniplayerSetIconsMethod.apply { findInstructionIndicesReversedOrThrow { val reference = getReference() opcode == Opcode.INVOKE_INTERFACE && @@ -412,15 +411,15 @@ val Miniplayer by creatingBytecodePatch( // region Add hooks to hide modern miniplayer buttons. listOf( - miniplayerModernExpandButtonFingerprint to "hideMiniplayerExpandClose", - miniplayerModernCloseButtonFingerprint to "hideMiniplayerExpandClose", - miniplayerModernActionButtonFingerprint to "hideMiniplayerActionButton", - miniplayerModernRewindButtonFingerprint to "hideMiniplayerRewindForward", - miniplayerModernForwardButtonFingerprint to "hideMiniplayerRewindForward", - miniplayerModernOverlayViewFingerprint to "adjustMiniplayerOpacity", + miniplayerModernExpandButtonMethod to "hideMiniplayerExpandClose", + miniplayerModernCloseButtonMethod to "hideMiniplayerExpandClose", + miniplayerModernActionButtonMethod to "hideMiniplayerActionButton", + miniplayerModernRewindButtonMethod to "hideMiniplayerRewindForward", + miniplayerModernForwardButtonMethod to "hideMiniplayerRewindForward", + miniplayerModernOverlayViewMethod to "adjustMiniplayerOpacity", ).forEach { (fingerprint, methodName) -> fingerprint.match( - miniplayerModernViewParentFingerprint.classDef, + miniplayerModernViewParentMethod.classDef, ).method.apply { val index = fingerprint.instructionMatches.last().index val register = getInstruction(index).registerA @@ -432,12 +431,12 @@ val Miniplayer by creatingBytecodePatch( } } - miniplayerModernAddViewListenerFingerprint.match( - miniplayerModernViewParentFingerprint.classDef, + miniplayerModernAddViewListenerMethod.match( + miniplayerModernViewParentMethod.classDef, ).method.addInstruction( 0, "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->" + - "hideMiniplayerSubTexts(Landroid/view/View;)V", + "hideMiniplayerSubTexts(Landroid/view/View;)V", ) // Modern 2 has a broken overlay subtitle view that is always present. @@ -449,7 +448,7 @@ val Miniplayer by creatingBytecodePatch( // NOTE: Modern 2 uses the same video UI as the regular player except resized to smaller. // This patch code could be used to hide other player overlays that do not use Litho. if (!is_19_17_or_greater) { - playerOverlaysLayoutFingerprint.classDef.methods.add( + playerOverlaysLayoutMethod.classDef.methods.add( ImmutableMethod( YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME, "addView", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt index 4a5089e8ab..58bd75c8df 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt @@ -1,8 +1,6 @@ package app.revanced.patches.youtube.layout.panels.popup -import app.revanced.patcher.fingerprint - -internal val engagementPanelControllerFingerprint = fingerprint { +internal val BytecodePatchContext.engagementPanelControllerMethod by gettingFirstMethodDeclaratively { returnType("L") strings( "EngagementPanelController: cannot show EngagementPanel before EngagementPanelController.init() has been called.", diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt index bacae8c472..7f1e1d7583 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/PlayerPopupPanelsPatch.kt @@ -26,7 +26,7 @@ val `Disable player popup panels` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -36,7 +36,7 @@ val `Disable player popup panels` by creatingBytecodePatch( SwitchPreference("revanced_hide_player_popup_panels"), ) - engagementPanelControllerFingerprint.method.addInstructionsWithLabels( + engagementPanelControllerMethod.addInstructionsWithLabels( 0, """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disablePlayerPopupPanels()Z @@ -47,7 +47,7 @@ val `Disable player popup panels` by creatingBytecodePatch( return-object v0 :player_popup_panels nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt index 978d216a46..e6bf0dcbe6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/Fingerprints.kt @@ -1,16 +1,23 @@ package app.revanced.patches.youtube.layout.player.fullscreen import app.revanced.patcher.InstructionLocation.MatchAfterWithin -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode /** * 19.46+ */ -internal val openVideosFullscreenPortraitFingerprint = fingerprint { +internal val BytecodePatchContext.openVideosFullscreenPortraitMethod by gettingFirstMethodDeclaratively { returnType("V") parameterTypes("L", "Lj\$/util/Optional;") instructions( @@ -24,7 +31,7 @@ internal val openVideosFullscreenPortraitFingerprint = fingerprint { /** * Pre 19.46. */ -internal val openVideosFullscreenPortraitLegacyFingerprint = fingerprint { +internal val BytecodePatchContext.openVideosFullscreenPortraitLegacyMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L", "Lj\$/util/Optional;") @@ -43,7 +50,7 @@ internal val openVideosFullscreenPortraitLegacyFingerprint = fingerprint { ) } -internal val openVideosFullscreenHookPatchExtensionFingerprint = fingerprint { +internal val BytecodePatchContext.openVideosFullscreenHookPatchExtensionMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("Z") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt index 45ed7b1010..dda4d04de4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenHookPatch.kt @@ -1,6 +1,5 @@ package app.revanced.patches.youtube.layout.player.fullscreen -import app.revanced.patcher.Fingerprint import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch @@ -20,7 +19,7 @@ internal const val EXTENSION_CLASS_DESCRIPTOR = internal val openVideosFullscreenHookPatch = bytecodePatch { dependsOn( sharedExtensionPatch, - versionCheckPatch + versionCheckPatch, ) apply { @@ -28,21 +27,21 @@ internal val openVideosFullscreenHookPatch = bytecodePatch { var insertIndex: Int if (is_19_46_or_greater) { - fingerprint = openVideosFullscreenPortraitFingerprint + fingerprint = openVideosFullscreenPortraitMethod insertIndex = fingerprint.instructionMatches.first().index - openVideosFullscreenPortraitFingerprint.let { + openVideosFullscreenPortraitMethod.let { // Remove A/B feature call that forces what this patch already does. // Cannot use the A/B flag to accomplish the same goal because 19.50+ // Shorts fullscreen regular player does not use fullscreen // if the player is minimized and it must be forced using other conditional check. it.method.insertLiteralOverride( it.instructionMatches.last().index, - false + false, ) } } else { - fingerprint = openVideosFullscreenPortraitLegacyFingerprint + fingerprint = openVideosFullscreenPortraitLegacyMethod insertIndex = fingerprint.instructionMatches.last().index } @@ -55,7 +54,7 @@ internal val openVideosFullscreenHookPatch = bytecodePatch { """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->doNotOpenVideoFullscreenPortrait(Z)Z move-result v$register - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt index a97bc076cc..3d732ccf16 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatch.kt @@ -26,17 +26,17 @@ val `Open videos fullscreen` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { addResources("youtube", "layout.player.fullscreen.openVideosFullscreen") PreferenceScreen.PLAYER.addPreferences( - SwitchPreference("revanced_open_videos_fullscreen_portrait") + SwitchPreference("revanced_open_videos_fullscreen_portrait"), ) // Enable the logic for the user Setting to open regular videos fullscreen. - openVideosFullscreenHookPatchExtensionFingerprint.method.returnEarly(true) + openVideosFullscreenHookPatchExtensionMethod.returnEarly(true) } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt index eb2fd8165d..a842deecb8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/CustomPlayerOverlayOpacityPatch.kt @@ -31,7 +31,7 @@ val `Custom player overlay opacity` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -41,7 +41,7 @@ val `Custom player overlay opacity` by creatingBytecodePatch( TextPreference("revanced_player_overlay_opacity", inputType = InputType.NUMBER), ) - createPlayerOverviewFingerprint.let { + createPlayerOverviewMethod.let { it.method.apply { val viewRegisterIndex = it.instructionMatches.last().index val viewRegister = getInstruction(viewRegisterIndex).registerA @@ -49,7 +49,7 @@ val `Custom player overlay opacity` by creatingBytecodePatch( addInstruction( viewRegisterIndex + 1, "invoke-static { v$viewRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->changeOpacity(Landroid/widget/ImageView;)V", + "$EXTENSION_CLASS_DESCRIPTOR->changeOpacity(Landroid/widget/ImageView;)V", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt index cc01dedcbe..c7c179208a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt @@ -1,11 +1,18 @@ package app.revanced.patches.youtube.layout.player.overlay import app.revanced.patcher.InstructionLocation.MatchAfterWithin +import app.revanced.patcher.accessFlags import app.revanced.patcher.checkCast -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType -internal val createPlayerOverviewFingerprint = fingerprint { +internal val BytecodePatchContext.createPlayerOverviewMethod by gettingFirstMethodDeclaratively { returnType("V") instructions( ResourceType.ID("scrim_overlay"), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt index eb0f8880c2..7ac689f394 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/Fingerprints.kt @@ -1,33 +1,40 @@ package app.revanced.patches.youtube.layout.returnyoutubedislike +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val dislikeFingerprint = fingerprint { +internal val BytecodePatchContext.dislikeMethod by gettingFirstMethodDeclaratively { returnType("V") instructions( addString("like/dislike"), ) } -internal val likeFingerprint = fingerprint { +internal val BytecodePatchContext.likeMethod by gettingFirstMethodDeclaratively { returnType("V") instructions( addString("like/like"), ) } -internal val removeLikeFingerprint = fingerprint { +internal val BytecodePatchContext.removeLikeMethod by gettingFirstMethodDeclaratively { returnType("V") instructions( addString("like/removelike"), ) } -internal val rollingNumberMeasureAnimatedTextFingerprint = fingerprint { +internal val BytecodePatchContext.rollingNumberMeasureAnimatedTextMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("Lj\$/util/Optional;") parameterTypes("L", "Ljava/lang/String;", "L") @@ -46,9 +53,9 @@ internal val rollingNumberMeasureAnimatedTextFingerprint = fingerprint { } /** - * Matches to class found in [rollingNumberMeasureStaticLabelParentFingerprint]. + * Matches to class found in [rollingNumberMeasureStaticLabelParentMethod]. */ -internal val rollingNumberMeasureStaticLabelFingerprint = fingerprint { +internal val BytecodePatchContext.rollingNumberMeasureStaticLabelMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("F") parameterTypes("Ljava/lang/String;") @@ -60,7 +67,7 @@ internal val rollingNumberMeasureStaticLabelFingerprint = fingerprint { ) } -internal val rollingNumberMeasureStaticLabelParentFingerprint = fingerprint { +internal val BytecodePatchContext.rollingNumberMeasureStaticLabelParentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/String;") parameterTypes() @@ -69,7 +76,7 @@ internal val rollingNumberMeasureStaticLabelParentFingerprint = fingerprint { ) } -internal val rollingNumberSetterFingerprint = fingerprint { +internal val BytecodePatchContext.rollingNumberSetterMethod by gettingFirstMethodDeclaratively { opcodes( Opcode.INVOKE_DIRECT, Opcode.IGET_OBJECT, @@ -78,7 +85,7 @@ internal val rollingNumberSetterFingerprint = fingerprint { strings("RollingNumberType required properties missing! Need") } -internal val rollingNumberTextViewFingerprint = fingerprint { +internal val BytecodePatchContext.rollingNumberTextViewMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L", "F", "F") @@ -96,14 +103,14 @@ internal val rollingNumberTextViewFingerprint = fingerprint { } } -internal val textComponentConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.textComponentConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.CONSTRUCTOR, AccessFlags.PRIVATE) instructions( addString("TextComponent"), ) } -internal val textComponentDataFingerprint = fingerprint { +internal val BytecodePatchContext.textComponentDataMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes("L", "L") instructions( @@ -115,9 +122,9 @@ internal val textComponentDataFingerprint = fingerprint { } /** - * Matches against the same class found in [textComponentConstructorFingerprint]. + * Matches against the same class found in [textComponentConstructorMethod]. */ -internal val textComponentLookupFingerprint = fingerprint { +internal val BytecodePatchContext.textComponentLookupMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returnType("L") parameterTypes("L") @@ -126,7 +133,7 @@ internal val textComponentLookupFingerprint = fingerprint { ) } -internal val textComponentFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.textComponentFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.FINAL) returnType("Z") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 12c12acc30..095d7688a2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -18,7 +18,7 @@ import app.revanced.patches.youtube.misc.playservice.* import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.conversionContextFingerprintToString -import app.revanced.patches.youtube.shared.rollingNumberTextViewAnimationUpdateFingerprint +import app.revanced.patches.youtube.shared.rollingNumberTextViewAnimationUpdateMethod import app.revanced.patches.youtube.video.videoid.hookPlayerResponseVideoId import app.revanced.patches.youtube.video.videoid.hookVideoId import app.revanced.patches.youtube.video.videoid.videoIdPatch @@ -60,7 +60,7 @@ val `Return YouTube Dislike` by creatingBytecodePatch( "20.21.37", "20.31.40", // 20.40+ does not support yet support the Shorts player. - ) + ), ) apply { @@ -82,8 +82,8 @@ val `Return YouTube Dislike` by creatingBytecodePatch( key = "revanced_ryd_statistics_category", sorting = PreferenceScreenPreference.Sorting.UNSORTED, preferences = emptySet(), // Preferences are added by custom class at runtime. - tag = "app.revanced.extension.youtube.returnyoutubedislike.ui.ReturnYouTubeDislikeDebugStatsPreferenceCategory" - ) + tag = "app.revanced.extension.youtube.returnyoutubedislike.ui.ReturnYouTubeDislikeDebugStatsPreferenceCategory", + ), ) // region Inject newVideoLoaded event handler to update dislikes when a new video is loaded. @@ -98,9 +98,9 @@ val `Return YouTube Dislike` by creatingBytecodePatch( // region Hook like/dislike/remove like button clicks to send votes to the API. arrayOf( - likeFingerprint to Vote.LIKE, - dislikeFingerprint to Vote.DISLIKE, - removeLikeFingerprint to Vote.REMOVE_LIKE, + likeMethod to Vote.LIKE, + dislikeMethod to Vote.DISLIKE, + removeLikeMethod to Vote.REMOVE_LIKE, ).forEach { (fingerprint, vote) -> fingerprint.method.addInstructions( 0, @@ -121,40 +121,40 @@ val `Return YouTube Dislike` by creatingBytecodePatch( // Find the field name of the conversion context. val conversionContextClass = conversionContextFingerprintToString.originalClassDef - val textComponentConversionContextField = textComponentConstructorFingerprint.originalClassDef.fields.find { - it.type == conversionContextClass.type - // 20.41+ uses superclass field type. - || it.type == conversionContextClass.superclass + val textComponentConversionContextField = textComponentConstructorMethod.originalClassDef.fields.find { + it.type == conversionContextClass.type || + // 20.41+ uses superclass field type. + it.type == conversionContextClass.superclass } ?: throw PatchException("Could not find conversion context field") - textComponentLookupFingerprint.match(textComponentConstructorFingerprint.originalClassDef).method.apply { + textComponentLookupMethod.match(textComponentConstructorMethod.originalClassDef).method.apply { // Find the instruction for creating the text data object. - val textDataClassType = textComponentDataFingerprint.originalClassDef.type + val textDataClassType = textComponentDataMethod.originalClassDef.type val insertIndex: Int val charSequenceRegister: Int if (is_19_33_or_greater && !is_20_10_or_greater) { val index = indexOfFirstInstructionOrThrow { - (opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE) - && getReference()?.returnType == textDataClassType + (opcode == Opcode.INVOKE_STATIC || opcode == Opcode.INVOKE_STATIC_RANGE) && + getReference()?.returnType == textDataClassType } insertIndex = indexOfFirstInstructionOrThrow(index) { opcode == Opcode.INVOKE_VIRTUAL && - getReference()?.parameterTypes?.firstOrNull() == "Ljava/lang/CharSequence;" + getReference()?.parameterTypes?.firstOrNull() == "Ljava/lang/CharSequence;" } charSequenceRegister = getInstruction(insertIndex).registerD } else { insertIndex = indexOfFirstInstructionOrThrow { opcode == Opcode.NEW_INSTANCE && - getReference()?.type == textDataClassType + getReference()?.type == textDataClassType } val charSequenceIndex = indexOfFirstInstructionOrThrow(insertIndex) { opcode == Opcode.IPUT_OBJECT && - getReference()?.type == "Ljava/lang/CharSequence;" + getReference()?.type == "Ljava/lang/CharSequence;" } charSequenceRegister = getInstruction(charSequenceIndex).registerA } @@ -179,7 +179,7 @@ val `Return YouTube Dislike` by creatingBytecodePatch( :ignore nop - """ + """, ) } @@ -200,16 +200,16 @@ val `Return YouTube Dislike` by creatingBytecodePatch( // Turning off this flag on later versions can break the Shorts overlay and nothing is shown. Logger.getLogger(this::class.java.name).warning( "\n!!!" + - "\n!!! Dislikes are not yet fully supported when patching YouTube 20.40+" + - "\n!!! Patch 20.21.37 or lower if you want to see dislikes" + - "\n!!!" + "\n!!! Dislikes are not yet fully supported when patching YouTube 20.40+" + + "\n!!! Patch 20.21.37 or lower if you want to see dislikes" + + "\n!!!", ) Logger.getLogger(this::class.java.name).warning( - "20.40+ Shorts player is not fully supported yet. Shorts Dislikes may not show." + "20.40+ Shorts player is not fully supported yet. Shorts Dislikes may not show.", ) } else { - textComponentFeatureFlagFingerprint.method.returnLate(false) + textComponentFeatureFlagMethod.returnLate(false) } } @@ -220,9 +220,9 @@ val `Return YouTube Dislike` by creatingBytecodePatch( // region Hook rolling numbers. - rollingNumberSetterFingerprint.method.apply { + rollingNumberSetterMethod.apply { val insertIndex = 1 - val dislikesIndex = rollingNumberSetterFingerprint.instructionMatches.last().index + val dislikesIndex = rollingNumberSetterMethod.instructionMatches.last().index val charSequenceInstanceRegister = getInstruction(0).registerA val charSequenceFieldReference = @@ -239,13 +239,13 @@ val `Return YouTube Dislike` by creatingBytecodePatch( invoke-static {v$conversionContextRegister, v$freeRegister}, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberLoaded(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/String; move-result-object v$freeRegister iput-object v$freeRegister, v$charSequenceInstanceRegister, $charSequenceFieldReference - """ + """, ) } // Rolling Number text views use the measured width of the raw string for layout. // Modify the measure text calculation to include the left drawable separator if needed. - rollingNumberMeasureAnimatedTextFingerprint.let { + rollingNumberMeasureAnimatedTextMethod.let { // Additional check to verify the opcodes are at the start of the method if (it.instructionMatches.first().index != 0) throw PatchException("Unexpected opcode location") val endIndex = it.instructionMatches.last().index @@ -258,15 +258,15 @@ val `Return YouTube Dislike` by creatingBytecodePatch( """ invoke-static {p1, v$measuredTextWidthRegister}, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F move-result v$measuredTextWidthRegister - """ + """, ) } } // Additional text measurement method. Used if YouTube decides not to animate the likes count // and sometimes used for initial video load. - rollingNumberMeasureStaticLabelFingerprint.match( - rollingNumberMeasureStaticLabelParentFingerprint.originalClassDef, + rollingNumberMeasureStaticLabelMethod.match( + rollingNumberMeasureStaticLabelParentMethod.originalClassDef, ).let { val measureTextIndex = it.instructionMatches.first().index + 1 it.method.apply { @@ -277,7 +277,7 @@ val `Return YouTube Dislike` by creatingBytecodePatch( """ move-result v$freeRegister invoke-static {p1, v$freeRegister}, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F - """ + """, ) } } @@ -286,10 +286,10 @@ val `Return YouTube Dislike` by creatingBytecodePatch( // The rolling number Span is missing styling since it's initially set as a String. // Modify the UI text view and use the styled like/dislike Span. // Initial TextView is set in this method. - rollingNumberTextViewFingerprint.method, + rollingNumberTextViewMethod, // Videos less than 24 hours after uploaded, like counts will be updated in real time. // Whenever like counts are updated, TextView is set in this method. - rollingNumberTextViewAnimationUpdateFingerprint.method, + rollingNumberTextViewAnimationUpdateMethod, ).forEach { insertMethod -> insertMethod.apply { val setTextIndex = indexOfFirstInstructionOrThrow { @@ -304,7 +304,7 @@ val `Return YouTube Dislike` by creatingBytecodePatch( """ invoke-static {v$textViewRegister, v$textSpanRegister}, $EXTENSION_CLASS_DESCRIPTOR->updateRollingNumber(Landroid/widget/TextView;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; move-result-object v$textSpanRegister - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt index 45d5dc15e4..ae8eec0314 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/Fingerprints.kt @@ -1,11 +1,18 @@ package app.revanced.patches.youtube.layout.searchbar -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType -import app.revanced.patches.youtube.layout.hide.general.yoodlesImageViewFingerprint +import app.revanced.patches.youtube.layout.hide.general.yoodlesImageViewMethod import com.android.tools.smali.dexlib2.AccessFlags -internal val setWordmarkHeaderFingerprint = fingerprint { +internal val BytecodePatchContext.setWordmarkHeaderMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("Landroid/widget/ImageView;") @@ -16,9 +23,9 @@ internal val setWordmarkHeaderFingerprint = fingerprint { } /** - * Matches the same method as [yoodlesImageViewFingerprint]. + * Matches the same method as [yoodlesImageViewMethod]. */ -internal val wideSearchbarLayoutFingerprint = fingerprint { +internal val BytecodePatchContext.wideSearchbarLayoutMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Landroid/view/View;") parameterTypes("L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt index 96914e9a82..1e381416c3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/searchbar/WideSearchbarPatch.kt @@ -26,14 +26,14 @@ private const val EXTENSION_CLASS_DESCRIPTOR = val `Wide search bar` by creatingBytecodePatch( description = "Adds an option to replace the search icon with a wide search bar. " + - "This will hide the YouTube logo when active.", + "This will hide the YouTube logo when active.", ) { dependsOn( sharedExtensionPatch, settingsPatch, addResourcesPatch, resourceMappingPatch, - versionCheckPatch + versionCheckPatch, ) compatibleWith( @@ -42,7 +42,7 @@ val `Wide search bar` by creatingBytecodePatch( "20.14.43", "20.21.37", // 20.31.40+ not supported. YouTube code was removed. - ) + ), ) apply { @@ -51,7 +51,7 @@ val `Wide search bar` by creatingBytecodePatch( // This functionality could be restored by adding a search text field to the toolbar // with a listener that artificially clicks the toolbar search button. return@apply Logger.getLogger(this::class.java.name).warning( - "Wide searchbar is not compatible with 20.31+" + "Wide searchbar is not compatible with 20.31+", ) } @@ -61,12 +61,12 @@ val `Wide search bar` by creatingBytecodePatch( SwitchPreference("revanced_wide_searchbar"), ) - setWordmarkHeaderFingerprint.let { + setWordmarkHeaderMethod.let { // Navigate to the method that checks if the YT logo is shown beside the search bar. val shouldShowLogoMethod = with(it.originalMethod) { val invokeStaticIndex = indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_STATIC && - getReference()?.returnType == "Z" + getReference()?.returnType == "Z" } navigate(this).to(invokeStaticIndex).stop() } @@ -80,24 +80,24 @@ val `Wide search bar` by creatingBytecodePatch( """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->enableWideSearchbar(Z)Z move-result v$register - """ + """, ) } } } // Fix missing left padding when using wide searchbar. - wideSearchbarLayoutFingerprint.method.apply { + wideSearchbarLayoutMethod.apply { findInstructionIndicesReversedOrThrow { val reference = getReference() - reference?.definingClass == "Landroid/view/LayoutInflater;" - && reference.name == "inflate" + reference?.definingClass == "Landroid/view/LayoutInflater;" && + reference.name == "inflate" }.forEach { inflateIndex -> val register = getInstruction(inflateIndex + 1).registerA addInstruction( inflateIndex + 2, - "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setActionBar(Landroid/view/View;)V" + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setActionBar(Landroid/view/View;)V", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt index 89c1b7d108..e1cc1d6d63 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/Fingerprints.kt @@ -2,17 +2,24 @@ package app.revanced.patches.youtube.layout.seekbar import app.revanced.patcher.InstructionLocation.MatchAfterImmediately import app.revanced.patcher.InstructionLocation.MatchAfterWithin +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString import app.revanced.patcher.anyInstruction -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val fullscreenSeekbarThumbnailsFingerprint = fingerprint { +internal val BytecodePatchContext.fullscreenSeekbarThumbnailsMethod by gettingFirstMethodDeclaratively { returnType("Z") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes() @@ -21,7 +28,7 @@ internal val fullscreenSeekbarThumbnailsFingerprint = fingerprint { ) } -internal val playerSeekbarColorFingerprint = fingerprint { +internal val BytecodePatchContext.playerSeekbarColorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( ResourceType.COLOR("inline_time_bar_played_not_highlighted_color"), @@ -30,19 +37,19 @@ internal val playerSeekbarColorFingerprint = fingerprint { } // class is ControlsOverlayStyle in 20.32 and lower, and obfuscated in 20.33+ -internal val setSeekbarClickedColorFingerprint = fingerprint { +internal val BytecodePatchContext.setSeekbarClickedColorMethod by gettingFirstMethodDeclaratively { opcodes(Opcode.CONST_HIGH16) strings("YOUTUBE", "PREROLL", "POSTROLL", "REMOTE_LIVE", "AD_LARGE_CONTROLS") } -internal val shortsSeekbarColorFingerprint = fingerprint { +internal val BytecodePatchContext.shortsSeekbarColorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( ResourceType.COLOR("reel_time_bar_played_color"), ) } -internal val playerSeekbarHandle1ColorFingerprint = fingerprint { +internal val BytecodePatchContext.playerSeekbarHandle1ColorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( ResourceType.COLOR("inline_time_bar_live_seekable_range"), @@ -50,7 +57,7 @@ internal val playerSeekbarHandle1ColorFingerprint = fingerprint { ) } -internal val playerSeekbarHandle2ColorFingerprint = fingerprint { +internal val BytecodePatchContext.playerSeekbarHandle2ColorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes("Landroid/content/Context;") instructions( @@ -59,7 +66,7 @@ internal val playerSeekbarHandle2ColorFingerprint = fingerprint { ) } -internal val watchHistoryMenuUseProgressDrawableFingerprint = fingerprint { +internal val BytecodePatchContext.watchHistoryMenuUseProgressDrawableMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L") @@ -70,7 +77,7 @@ internal val watchHistoryMenuUseProgressDrawableFingerprint = fingerprint { ) } -internal val lithoLinearGradientFingerprint = fingerprint { +internal val BytecodePatchContext.lithoLinearGradientMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.STATIC) returnType("Landroid/graphics/LinearGradient;") parameterTypes("F", "F", "F", "F", "[I", "[F") @@ -79,7 +86,7 @@ internal val lithoLinearGradientFingerprint = fingerprint { /** * 19.49+ */ -internal val playerLinearGradientFingerprint = fingerprint { +internal val BytecodePatchContext.playerLinearGradientMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) parameterTypes("I", "I", "I", "I", "Landroid/content/Context;", "I") returnType("Landroid/graphics/LinearGradient;") @@ -94,7 +101,7 @@ internal val playerLinearGradientFingerprint = fingerprint { /** * 19.25 - 19.47 */ -internal val playerLinearGradientLegacyFingerprint = fingerprint { +internal val BytecodePatchContext.playerLinearGradientLegacyMethod by gettingFirstMethodDeclaratively { returnType("V") instructions( ResourceType.COLOR("yt_youtube_magenta"), @@ -106,7 +113,7 @@ internal val playerLinearGradientLegacyFingerprint = fingerprint { internal const val LOTTIE_ANIMATION_VIEW_CLASS_TYPE = "Lcom/airbnb/lottie/LottieAnimationView;" -internal val lottieAnimationViewSetAnimationIntFingerprint = fingerprint { +internal val BytecodePatchContext.lottieAnimationViewSetAnimationIntMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes("I") returnType("V") @@ -118,7 +125,7 @@ internal val lottieAnimationViewSetAnimationIntFingerprint = fingerprint { } } -internal val lottieCompositionFactoryZipFingerprint = fingerprint { +internal val BytecodePatchContext.lottieCompositionFactoryZipMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) parameterTypes("Landroid/content/Context;", "Ljava/util/zip/ZipInputStream;", "Ljava/lang/String;") returnType("L") @@ -129,11 +136,11 @@ internal val lottieCompositionFactoryZipFingerprint = fingerprint { } /** - * Resolves using class found in [lottieCompositionFactoryZipFingerprint]. + * Resolves using class found in [lottieCompositionFactoryZipMethod]. * * [Original method](https://github.com/airbnb/lottie-android/blob/26ad8bab274eac3f93dccccfa0cafc39f7408d13/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java#L386) */ -internal val lottieCompositionFactoryFromJsonInputStreamFingerprint = fingerprint { +internal val BytecodePatchContext.lottieCompositionFactoryFromJsonInputStreamMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) parameterTypes("Ljava/io/InputStream;", "Ljava/lang/String;") returnType("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt index 357ada3848..61cea61e3c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/SeekbarColorPatch.kt @@ -1,10 +1,8 @@ package app.revanced.patches.youtube.layout.seekbar -import app.revanced.patcher.Fingerprint import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.extensions.replaceInstruction -import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.shared.layout.theme.lithoColorHookPatch import app.revanced.patches.shared.layout.theme.lithoColorOverrideHook @@ -49,19 +47,19 @@ val seekbarColorPatch = bytecodePatch( ) } - playerSeekbarColorFingerprint.let { + playerSeekbarColorMethod.let { it.method.apply { addColorChangeInstructions(it.instructionMatches.last().index) addColorChangeInstructions(it.instructionMatches.first().index) } } - shortsSeekbarColorFingerprint.let { + shortsSeekbarColorMethod.let { it.method.addColorChangeInstructions(it.instructionMatches.first().index) } - setSeekbarClickedColorFingerprint.originalMethod.let { - val setColorMethodIndex = setSeekbarClickedColorFingerprint.instructionMatches.first().index + 1 + setSeekbarClickedColorMethod.originalMethod.let { + val setColorMethodIndex = setSeekbarClickedColorMethod.instructionMatches.first().index + 1 navigate(it).to(setColorMethodIndex).stop().apply { val colorRegister = getInstruction(0).registerA @@ -79,9 +77,9 @@ val seekbarColorPatch = bytecodePatch( // 19.25+ changes - var handleBarColorFingerprints = mutableListOf(playerSeekbarHandle1ColorFingerprint) + var handleBarColorFingerprints = mutableListOf(playerSeekbarHandle1ColorMethod) if (!is_20_34_or_greater) { - handleBarColorFingerprints += playerSeekbarHandle2ColorFingerprint + handleBarColorFingerprints += playerSeekbarHandle2ColorMethod } handleBarColorFingerprints.forEach { it.method.addColorChangeInstructions(it.instructionMatches.last().index) @@ -91,7 +89,7 @@ val seekbarColorPatch = bytecodePatch( // of the watch history menu items as they use the same gradient as the // player and there is no easy way to distinguish which to use a transparent color. if (is_19_34_or_greater) { - watchHistoryMenuUseProgressDrawableFingerprint.let { + watchHistoryMenuUseProgressDrawableMethod.let { it.method.apply { val index = it.instructionMatches[1].index val register = getInstruction(index).registerA @@ -107,7 +105,7 @@ val seekbarColorPatch = bytecodePatch( } } - lithoLinearGradientFingerprint.method.addInstructions( + lithoLinearGradientMethod.addInstructions( 0, """ invoke-static/range { p4 .. p5 }, $EXTENSION_CLASS_DESCRIPTOR->getLithoLinearGradient([I[F)[I @@ -118,10 +116,10 @@ val seekbarColorPatch = bytecodePatch( val playerFingerprint: Fingerprint val checkGradientCoordinates: Boolean if (is_19_49_or_greater) { - playerFingerprint = playerLinearGradientFingerprint + playerFingerprint = playerLinearGradientMethod checkGradientCoordinates = true } else { - playerFingerprint = playerLinearGradientLegacyFingerprint + playerFingerprint = playerLinearGradientLegacyMethod checkGradientCoordinates = false } @@ -154,9 +152,9 @@ val seekbarColorPatch = bytecodePatch( } // Hook the splash animation to set the a seekbar color. - mainActivityOnCreateMethod.method.apply { + mainActivityOnCreateMethod.apply { val setAnimationIntMethodName = - lottieAnimationViewSetAnimationIntFingerprint.originalMethod.name + lottieAnimationViewSetAnimationIntMethod.originalMethod.name findInstructionIndicesReversedOrThrow { val reference = getReference() @@ -175,9 +173,9 @@ val seekbarColorPatch = bytecodePatch( // Add non obfuscated method aliases for `setAnimation(int)` // and `setAnimation(InputStream, String)` so extension code can call them. - lottieAnimationViewSetAnimationIntFingerprint.classDef.methods.apply { + lottieAnimationViewSetAnimationIntMethod.classDef.methods.apply { val addedMethodName = "patch_setAnimation" - val setAnimationIntName = lottieAnimationViewSetAnimationIntFingerprint + val setAnimationIntName = lottieAnimationViewSetAnimationIntMethod .originalMethod.name add( @@ -203,8 +201,8 @@ val seekbarColorPatch = bytecodePatch( val factoryStreamClass: CharSequence val factoryStreamName: CharSequence val factoryStreamReturnType: CharSequence - lottieCompositionFactoryFromJsonInputStreamFingerprint.match( - lottieCompositionFactoryZipFingerprint.originalClassDef, + lottieCompositionFactoryFromJsonInputStreamMethod.match( + lottieCompositionFactoryZipMethod.originalClassDef, ).originalMethod.apply { factoryStreamClass = definingClass factoryStreamName = name @@ -216,7 +214,7 @@ val seekbarColorPatch = bytecodePatch( parameterTypes(factoryStreamReturnType.toString()) returnType("V") custom { _, classDef -> - classDef.type == lottieAnimationViewSetAnimationIntFingerprint.originalClassDef.type + classDef.type == lottieAnimationViewSetAnimationIntMethod.originalClassDef.type } } val setAnimationStreamName = lottieAnimationViewSetAnimationStreamFingerprint diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt index f64a382b10..dca0370b13 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/Fingerprints.kt @@ -1,15 +1,22 @@ package app.revanced.patches.youtube.layout.shortsautoplay import app.revanced.patcher.InstructionLocation.* +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString import app.revanced.patcher.fieldAccess -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val reelEnumConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.reelEnumConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) instructions( addString("REEL_LOOP_BEHAVIOR_UNKNOWN"), @@ -20,7 +27,7 @@ internal val reelEnumConstructorFingerprint = fingerprint { ) } -internal val reelPlaybackRepeatParentFingerprint = fingerprint { +internal val BytecodePatchContext.reelPlaybackRepeatParentMethod by gettingFirstMethodDeclaratively { returnType("V") parameterTypes("Ljava/lang/String;", "J") instructions( @@ -29,9 +36,9 @@ internal val reelPlaybackRepeatParentFingerprint = fingerprint { } /** - * Matches class found in [reelPlaybackRepeatParentFingerprint]. + * Matches class found in [reelPlaybackRepeatParentMethod]. */ -internal val reelPlaybackRepeatFingerprint = fingerprint { +internal val BytecodePatchContext.reelPlaybackRepeatMethod by gettingFirstMethodDeclaratively { returnType("V") parameterTypes("L") instructions( @@ -39,7 +46,7 @@ internal val reelPlaybackRepeatFingerprint = fingerprint { ) } -internal val reelPlaybackFingerprint = fingerprint { +internal val BytecodePatchContext.reelPlaybackMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes("J") returnType("V") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt index 487e932a64..17260d099b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsautoplay/ShortsAutoplayPatch.kt @@ -5,7 +5,6 @@ import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.creatingBytecodePatch -import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference @@ -28,6 +27,7 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter +import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ShortsAutoplayPatch;" @@ -48,7 +48,7 @@ val `Shorts autoplay` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -72,7 +72,7 @@ val `Shorts autoplay` by creatingBytecodePatch( var reelEnumClass: String - reelEnumConstructorFingerprint.let { + reelEnumConstructorMethod.let { reelEnumClass = it.originalClassDef.type it.method.addInstructions( @@ -82,19 +82,19 @@ val `Shorts autoplay` by creatingBytecodePatch( # Any enum value of this type will work. sget-object v0, $reelEnumClass->a:$reelEnumClass invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->setYTShortsRepeatEnum(Ljava/lang/Enum;)V - """ + """, ) } - reelPlaybackRepeatFingerprint.match( - reelPlaybackRepeatParentFingerprint.originalClassDef + reelPlaybackRepeatMethod.match( + reelPlaybackRepeatParentMethod.originalClassDef, ).method.apply { // The behavior enums are looked up from an ordinal value to an enum type. findInstructionIndicesReversedOrThrow { val reference = getReference() reference?.definingClass == reelEnumClass && - reference.parameterTypes.firstOrNull() == "I" && - reference.returnType == reelEnumClass + reference.parameterTypes.firstOrNull() == "I" && + reference.returnType == reelEnumClass }.forEach { index -> val register = getInstruction(index + 1).registerA @@ -103,7 +103,7 @@ val `Shorts autoplay` by creatingBytecodePatch( """ invoke-static {v$register}, $EXTENSION_CLASS_DESCRIPTOR->changeShortsRepeatBehavior(Ljava/lang/Enum;)Ljava/lang/Enum; move-result-object v$register - """ + """, ) } } @@ -112,23 +112,23 @@ val `Shorts autoplay` by creatingBytecodePatch( // Manually restore the removed 'Autoplay' code. if (is_20_09_or_greater) { // Variable names are only a rough guess of what these methods do. - val userActionMethodReference = reelPlaybackFingerprint.instructionMatches[1] + val userActionMethodReference = reelPlaybackMethod.instructionMatches[1] .getInstruction().reference as MethodReference - val reelSequenceControllerMethodReference = reelPlaybackFingerprint.instructionMatches[2] + val reelSequenceControllerMethodReference = reelPlaybackMethod.instructionMatches[2] .getInstruction().reference as MethodReference - reelPlaybackRepeatFingerprint.method.apply { + reelPlaybackRepeatMethod.apply { // Find the first call modified by extension code above. val extensionReturnResultIndex = indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_STATIC && - getReference()?.definingClass == EXTENSION_CLASS_DESCRIPTOR + getReference()?.definingClass == EXTENSION_CLASS_DESCRIPTOR } + 1 val enumRegister = getInstruction(extensionReturnResultIndex).registerA val getReelSequenceControllerIndex = indexOfFirstInstructionOrThrow { val reference = getReference() opcode == Opcode.IGET_OBJECT && - reference?.definingClass == definingClass && - reference.type == reelSequenceControllerMethodReference.definingClass + reference?.definingClass == definingClass && + reference.type == reelSequenceControllerMethodReference.definingClass } val getReelSequenceControllerReference = getInstruction(getReelSequenceControllerIndex).reference @@ -165,10 +165,10 @@ val `Shorts autoplay` by creatingBytecodePatch( return-object v4 :ignore return-object p1 - """ + """, ) } - reelPlaybackRepeatFingerprint.classDef.methods.add(helperMethod) + reelPlaybackRepeatMethod.classDef.methods.add(helperMethod) addInstructionsWithLabels( extensionReturnResultIndex + 1, @@ -179,7 +179,7 @@ val `Shorts autoplay` by creatingBytecodePatch( return-void # Autoplay was performed. :ignore nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt index 7bf424f107..296d938fb8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/Fingerprints.kt @@ -1,15 +1,22 @@ package app.revanced.patches.youtube.layout.spoofappversion import app.revanced.patcher.InstructionLocation.* +import app.revanced.patcher.accessFlags import app.revanced.patcher.fieldAccess -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val toolBarButtonFingerprint = fingerprint { +internal val BytecodePatchContext.toolBarButtonMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") instructions( @@ -28,7 +35,7 @@ internal val toolBarButtonFingerprint = fingerprint { } } -internal val spoofAppVersionFingerprint = fingerprint { +internal val BytecodePatchContext.spoofAppVersionMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("L") parameterTypes("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt index dcc32e37a9..0b0c0c9e00 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/spoofappversion/SpoofAppVersionPatch.kt @@ -25,14 +25,14 @@ private const val EXTENSION_CLASS_DESCRIPTOR = val `Spoof app version` by creatingBytecodePatch( description = "Adds an option to trick YouTube into thinking you are running an older version of the app. " + - "This can be used to restore old UI elements and features." + "This can be used to restore old UI elements and features.", ) { dependsOn( resourceMappingPatch, sharedExtensionPatch, settingsPatch, addResourcesPatch, - versionCheckPatch + versionCheckPatch, ) compatibleWith( @@ -41,7 +41,7 @@ val `Spoof app version` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -62,17 +62,17 @@ val `Spoof app version` by creatingBytecodePatch( ListPreference( key = "revanced_spoof_app_version_target", entriesKey = "revanced_spoof_app_version_target_legacy_20_13_entries", - entryValuesKey = "revanced_spoof_app_version_target_legacy_20_13_entry_values" + entryValuesKey = "revanced_spoof_app_version_target_legacy_20_13_entry_values", ) } else { ListPreference( key = "revanced_spoof_app_version_target", entriesKey = "revanced_spoof_app_version_target_legacy_19_34_entries", - entryValuesKey = "revanced_spoof_app_version_target_legacy_19_34_entry_values" + entryValuesKey = "revanced_spoof_app_version_target_legacy_19_34_entry_values", ) - } - ) - ) + }, + ), + ), ) /** @@ -80,7 +80,7 @@ val `Spoof app version` by creatingBytecodePatch( * missing image resources. As a workaround, do not set an image in the * toolbar when the enum name is UNKNOWN. */ - toolBarButtonFingerprint.apply { + toolBarButtonMethod.apply { val imageResourceIndex = instructionMatches[2].index val register = method.getInstruction(imageResourceIndex).registerA val jumpIndex = instructionMatches.last().index + 1 @@ -88,11 +88,11 @@ val `Spoof app version` by creatingBytecodePatch( method.addInstructionsWithLabels( imageResourceIndex + 1, "if-eqz v$register, :ignore", - ExternalLabel("ignore", method.getInstruction(jumpIndex)) + ExternalLabel("ignore", method.getInstruction(jumpIndex)), ) } - spoofAppVersionFingerprint.apply { + spoofAppVersionMethod.apply { val index = instructionMatches.first().index val register = method.getInstruction(index).registerA @@ -101,7 +101,7 @@ val `Spoof app version` by creatingBytecodePatch( """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getYouTubeVersionOverride(Ljava/lang/String;)Ljava/lang/String; move-result-object v$register - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt index feb2d49493..8da6349f25 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/ChangeStartPagePatch.kt @@ -32,7 +32,7 @@ val `Change start page` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -46,15 +46,15 @@ val `Change start page` by creatingBytecodePatch( preferences = setOf( ListPreference( key = "revanced_change_start_page", - tag = "app.revanced.extension.shared.settings.preference.SortedListPreference" + tag = "app.revanced.extension.shared.settings.preference.SortedListPreference", ), - SwitchPreference("revanced_change_start_page_always") - ) - ) + SwitchPreference("revanced_change_start_page_always"), + ), + ), ) // Hook browseId. - browseIdFingerprint.let { + browseIdMethod.let { it.method.apply { val browseIdIndex = it.instructionMatches.first().index val browseIdRegister = getInstruction(browseIdIndex).registerA @@ -64,14 +64,14 @@ val `Change start page` by creatingBytecodePatch( """ invoke-static { v$browseIdRegister }, $EXTENSION_CLASS_DESCRIPTOR->overrideBrowseId(Ljava/lang/String;)Ljava/lang/String; move-result-object v$browseIdRegister - """ + """, ) } } // There is no browserId assigned to Shorts and Search. // Just hook the Intent action. - intentActionFingerprint.method.addInstruction( + intentActionMethod.addInstruction( 0, "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->overrideIntentAction(Landroid/content/Intent;)V", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt index 3ee36e1504..5b74f994f9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt @@ -1,19 +1,26 @@ package app.revanced.patches.youtube.layout.startpage +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString import app.revanced.patcher.fieldAccess -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.Opcode -internal val intentActionFingerprint = fingerprint { +internal val BytecodePatchContext.intentActionMethod by gettingFirstMethodDeclaratively { parameterTypes("Landroid/content/Intent;") instructions( addString("has_handled_intent"), ) } -internal val browseIdFingerprint = fingerprint { +internal val BytecodePatchContext.browseIdMethod by gettingFirstMethodDeclaratively { returnType("Lcom/google/android/apps/youtube/app/common/ui/navigation/PaneDescriptor;") // parameterTypes() // 20.30 and earlier is no parameters. 20.31+ parameter is L. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt index 9ac49c170b..2c24ca1521 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/DisableResumingShortsOnStartupPatch.kt @@ -28,7 +28,7 @@ val `Disable resuming Shorts on startup` by creatingBytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, - versionCheckPatch + versionCheckPatch, ) compatibleWith( @@ -37,7 +37,7 @@ val `Disable resuming Shorts on startup` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -48,7 +48,7 @@ val `Disable resuming Shorts on startup` by creatingBytecodePatch( ) if (is_20_03_or_greater) { - userWasInShortsAlternativeFingerprint.let { + userWasInShortsAlternativeMethod.let { it.method.apply { val match = it.instructionMatches[2] val insertIndex = match.index + 1 @@ -59,16 +59,16 @@ val `Disable resuming Shorts on startup` by creatingBytecodePatch( """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer(Z)Z move-result v$register - """ + """, ) } } } else { - userWasInShortsLegacyFingerprint.method.apply { + userWasInShortsLegacyMethod.apply { val listenableInstructionIndex = indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_INTERFACE && - getReference()?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && - getReference()?.name == "isDone" + getReference()?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && + getReference()?.name == "isDone" } val freeRegister = findFreeRegister(listenableInstructionIndex) @@ -86,7 +86,7 @@ val `Disable resuming Shorts on startup` by creatingBytecodePatch( } } - userWasInShortsConfigFingerprint.method.addInstructions( + userWasInShortsConfigMethod.addInstructions( 0, """ invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z @@ -96,7 +96,7 @@ val `Disable resuming Shorts on startup` by creatingBytecodePatch( return v0 :show nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt index 6ab623759d..dfebaf06f3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt @@ -2,19 +2,26 @@ package app.revanced.patches.youtube.layout.startupshortsreset import app.revanced.patcher.InstructionLocation.* import app.revanced.patcher.StringComparisonType +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString import app.revanced.patcher.checkCast -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode /** * 20.02+ */ -internal val userWasInShortsAlternativeFingerprint = fingerprint { +internal val BytecodePatchContext.userWasInShortsAlternativeMethod by gettingFirstMethodDeclaratively { returnType("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes("Ljava/lang/Object;") @@ -30,7 +37,7 @@ internal val userWasInShortsAlternativeFingerprint = fingerprint { /** * Pre 20.02 */ -internal val userWasInShortsLegacyFingerprint = fingerprint { +internal val BytecodePatchContext.userWasInShortsLegacyMethod by gettingFirstMethodDeclaratively { returnType("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes("Ljava/lang/Object;") @@ -42,7 +49,7 @@ internal val userWasInShortsLegacyFingerprint = fingerprint { /** * 18.15.40+ */ -internal val userWasInShortsConfigFingerprint = fingerprint { +internal val BytecodePatchContext.userWasInShortsConfigMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt index d1fd0b4685..f97f856669 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/Fingerprints.kt @@ -1,22 +1,29 @@ package app.revanced.patches.youtube.layout.theme +import app.revanced.patcher.accessFlags import app.revanced.patcher.anyInstruction -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.youtube.shared.YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE -internal val useGradientLoadingScreenFingerprint = fingerprint { +internal val BytecodePatchContext.useGradientLoadingScreenMethod by gettingFirstMethodDeclaratively { instructions( 45412406L(), ) } -internal val splashScreenStyleFingerprint = fingerprint { +internal val BytecodePatchContext.splashScreenStyleMethod by gettingFirstMethodDeclaratively { returnType("V") parameterTypes("Landroid/os/Bundle;") instructions( anyInstruction( - 1074339245(), // 20.30+ + 1074339245L(), // 20.30+ 269032877L(), // 20.29 and lower. ), ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt index acf0351608..8bdb9ee165 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt @@ -35,7 +35,7 @@ val themePatch = baseThemePatch( val lightThemeBackgroundColor by stringOption( key = "lightThemeBackgroundColor", default = "@android:color/white", - values = mapOf( + values = mapOf( "White" to "@android:color/white", "Material You" to "@android:color/system_neutral1_50", "Catppuccin (Latte)" to "#E6E9EF", @@ -47,7 +47,7 @@ val themePatch = baseThemePatch( "Light red" to "#FFD6D6", ), name = "Light theme background color", - description = THEME_COLOR_OPTION_DESCRIPTION + description = THEME_COLOR_OPTION_DESCRIPTION, ) val themeResourcePatch = resourcePatch { @@ -56,7 +56,7 @@ val themePatch = baseThemePatch( apply { overrideThemeColors( lightThemeBackgroundColor!!, - darkThemeBackgroundColorOption.value!! + darkThemeBackgroundColorOption.value!!, ) fun addColorResource( @@ -73,7 +73,7 @@ val themePatch = baseThemePatch( setAttribute("name", colorName) setAttribute("category", "color") textContent = colorValue - } + }, ) } } @@ -83,12 +83,12 @@ val themePatch = baseThemePatch( addColorResource( "res/values/colors.xml", splashBackgroundColorKey, - lightThemeBackgroundColor!! + lightThemeBackgroundColor!!, ) addColorResource( "res/values-night/colors.xml", splashBackgroundColorKey, - darkThemeBackgroundColorOption.value!! + darkThemeBackgroundColorOption.value!!, ) // Edit splash screen files and change the background color. @@ -98,12 +98,12 @@ val themePatch = baseThemePatch( ).forEach editSplashScreen@{ resourceFileName -> document(resourceFileName).use { document -> document.getElementsByTagName( - "layer-list" + "layer-list", ).item(0).forEachChildElement { node -> if (node.hasAttribute("android:drawable")) { node.setAttribute( "android:drawable", - "@color/$splashBackgroundColorKey" + "@color/$splashBackgroundColorKey", ) return@editSplashScreen } @@ -149,9 +149,9 @@ val themePatch = baseThemePatch( addResourcesPatch, seekbarColorPatch, baseThemeResourcePatch( - lightColorReplacement = { lightThemeBackgroundColor!! } + lightColorReplacement = { lightThemeBackgroundColor!! }, ), - themeResourcePatch + themeResourcePatch, ) compatibleWith( @@ -160,7 +160,7 @@ val themePatch = baseThemePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) }, @@ -168,7 +168,7 @@ val themePatch = baseThemePatch( addResources("youtube", "layout.theme.themePatch") PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_gradient_loading_screen") + SwitchPreference("revanced_gradient_loading_screen"), ) val preferences = mutableSetOf( @@ -176,13 +176,13 @@ val themePatch = baseThemePatch( TextPreference( "revanced_seekbar_custom_color_primary", tag = "app.revanced.extension.shared.settings.preference.ColorPickerPreference", - inputType = InputType.TEXT_CAP_CHARACTERS + inputType = InputType.TEXT_CAP_CHARACTERS, ), TextPreference( "revanced_seekbar_custom_color_accent", tag = "app.revanced.extension.shared.settings.preference.ColorPickerPreference", - inputType = InputType.TEXT_CAP_CHARACTERS - ) + inputType = InputType.TEXT_CAP_CHARACTERS, + ), ) PreferenceScreen.SEEKBAR.addPreferences( @@ -190,31 +190,31 @@ val themePatch = baseThemePatch( titleKey = null, sorting = Sorting.UNSORTED, tag = "app.revanced.extension.shared.settings.preference.NoTitlePreferenceCategory", - preferences = preferences - ) + preferences = preferences, + ), ) if (is_19_47_or_greater) { PreferenceScreen.GENERAL_LAYOUT.addPreferences( - ListPreference("revanced_splash_screen_animation_style") + ListPreference("revanced_splash_screen_animation_style"), ) } - useGradientLoadingScreenFingerprint.let { + useGradientLoadingScreenMethod.let { it.method.insertLiteralOverride( it.instructionMatches.first().index, - "$EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled(Z)Z" + "$EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled(Z)Z", ) } if (is_19_47_or_greater) { // Lottie splash screen exists in earlier versions, but it may not be always on. - splashScreenStyleFingerprint.let { + splashScreenStyleMethod.let { it.method.insertLiteralOverride( it.instructionMatches.first().index, - "$EXTENSION_CLASS_DESCRIPTOR->getLoadingScreenType(I)I" + "$EXTENSION_CLASS_DESCRIPTOR->getLoadingScreenType(I)I", ) } } - } + }, ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt index 638ec8399d..77bc454de0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatch.kt @@ -61,8 +61,8 @@ val `Remove background playback restrictions` by creatingBytecodePatch( ) arrayOf( - backgroundPlaybackManagerFingerprint to "isBackgroundPlaybackAllowed", - backgroundPlaybackManagerShortsFingerprint to "isBackgroundShortsPlaybackAllowed", + backgroundPlaybackManagerMethod to "isBackgroundPlaybackAllowed", + backgroundPlaybackManagerShortsMethod to "isBackgroundShortsPlaybackAllowed", ).forEach { (fingerprint, integrationsMethod) -> fingerprint.method.apply { findInstructionIndicesReversedOrThrow(Opcode.RETURN).forEach { index -> @@ -80,7 +80,7 @@ val `Remove background playback restrictions` by creatingBytecodePatch( } // Enable background playback option in YouTube settings - backgroundPlaybackSettingsFingerprint.originalMethod.apply { + backgroundPlaybackSettingsMethod.originalMethod.apply { val booleanCalls = instructions.withIndex().filter { it.value.getReference()?.returnType == "Z" } @@ -93,14 +93,14 @@ val `Remove background playback restrictions` by creatingBytecodePatch( } // Force allowing background play for Shorts. - shortsBackgroundPlaybackFeatureFlagFingerprint.method.returnEarly(true) + shortsBackgroundPlaybackFeatureFlagMethod.returnEarly(true) // Force allowing background play for videos labeled for kids. - kidsBackgroundPlaybackPolicyControllerFingerprint.method.returnEarly() + kidsBackgroundPlaybackPolicyControllerMethod.returnEarly() // Fix PiP buttons not working after locking/unlocking device screen. if (is_19_34_or_greater) { - pipInputConsumerFeatureFlagFingerprint.let { + pipInputConsumerFeatureFlagMethod.let { it.method.insertLiteralOverride( it.instructionMatches.first().index, false, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt index 0d6a27a84a..2779ce67b8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/backgroundplayback/Fingerprints.kt @@ -1,11 +1,18 @@ package app.revanced.patches.youtube.misc.backgroundplayback -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val backgroundPlaybackManagerFingerprint = fingerprint { +internal val BytecodePatchContext.backgroundPlaybackManagerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("Z") parameterTypes("L") @@ -38,7 +45,7 @@ internal val backgroundPlaybackManagerFingerprint = fingerprint { ) } -internal val backgroundPlaybackSettingsFingerprint = fingerprint { +internal val BytecodePatchContext.backgroundPlaybackSettingsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/String;") parameterTypes() @@ -54,7 +61,7 @@ internal val backgroundPlaybackSettingsFingerprint = fingerprint { literal { prefBackgroundAndOfflineCategoryId } } -internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { +internal val BytecodePatchContext.kidsBackgroundPlaybackPolicyControllerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("I", "L", "L") @@ -71,7 +78,7 @@ internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { literal { 5 } } -internal val backgroundPlaybackManagerShortsFingerprint = fingerprint { +internal val BytecodePatchContext.backgroundPlaybackManagerShortsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("Z") parameterTypes("L") @@ -80,7 +87,7 @@ internal val backgroundPlaybackManagerShortsFingerprint = fingerprint { ) } -internal val shortsBackgroundPlaybackFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.shortsBackgroundPlaybackFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() @@ -90,7 +97,7 @@ internal val shortsBackgroundPlaybackFeatureFlagFingerprint = fingerprint { } // Fix 'E/InputDispatcher: Window handle pip_input_consumer has no registered input channel' -internal val pipInputConsumerFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.pipInputConsumerFeatureFlagMethod by gettingFirstMethodDeclaratively { instructions( // PiP input consumer feature flag. app.revanced.patcher.literal(45638483L), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt index 25926de702..1bcfecb2c8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt @@ -1,9 +1,16 @@ package app.revanced.patches.youtube.misc.dimensions.spoof +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val deviceDimensionsModelToStringFingerprint = fingerprint { +internal val BytecodePatchContext.deviceDimensionsModelToStringMethod by gettingFirstMethodDeclaratively { returnType("L") instructions( addString("minh."), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt index 1483a293b1..d9091b4de9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/SpoofDeviceDimensionsPatch.kt @@ -27,7 +27,7 @@ val `Spoof device dimensions` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -37,7 +37,7 @@ val `Spoof device dimensions` by creatingBytecodePatch( SwitchPreference("revanced_spoof_device_dimensions"), ) - deviceDimensionsModelToStringFingerprint + deviceDimensionsModelToStringMethod .classDef.methods.first { method -> method.name == "" } // Override the parameters containing the dimensions. .addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt index 5768232d33..856338bb0e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/Fingerprints.kt @@ -1,15 +1,22 @@ package app.revanced.patches.youtube.misc.fix.backtoexitgesture import app.revanced.patcher.InstructionLocation.* +import app.revanced.patcher.accessFlags import app.revanced.patcher.checkCast -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val scrollPositionFingerprint = fingerprint { +internal val BytecodePatchContext.scrollPositionMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returnType("V") parameterTypes("L") @@ -21,7 +28,7 @@ internal val scrollPositionFingerprint = fingerprint { strings("scroll_position") } -internal val recyclerViewTopScrollingFingerprint = fingerprint { +internal val BytecodePatchContext.recyclerViewTopScrollingMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt index c953d1a04a..e95703416e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/backtoexitgesture/FixBackToExitGesturePatch.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.misc.fix.backtoexitgesture import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.shared.mainActivityOnBackPressedFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnBackPressedMethod import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -12,38 +12,38 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/FixBackToExitGesturePatch;" internal val fixBackToExitGesturePatch = bytecodePatch( - description = "Fixes the swipe back to exit gesture." + description = "Fixes the swipe back to exit gesture.", ) { apply { - recyclerViewTopScrollingFingerprint.let { + recyclerViewTopScrollingMethod.let { it.method.addInstructionsAtControlFlowLabel( it.instructionMatches.last().index + 1, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V" + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V", ) } - scrollPositionFingerprint.let { + scrollPositionMethod.let { navigate(it.originalMethod) .to(it.patternMatch.startIndex + 1) .stop().apply { val index = indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_VIRTUAL && getReference()?.definingClass == - "Landroid/support/v7/widget/RecyclerView;" + "Landroid/support/v7/widget/RecyclerView;" } addInstruction( index, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onScrollingViews()V" + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onScrollingViews()V", ) } } - mainActivityOnBackPressedFingerprint.method.apply { + mainActivityOnBackPressedMethod.apply { val index = indexOfFirstInstructionOrThrow(Opcode.RETURN_VOID) addInstruction( index, - "invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->onBackPressed(Landroid/app/Activity;)V" + "invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->onBackPressed(Landroid/app/Activity;)V", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/FIxContentProviderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/FIxContentProviderPatch.kt index d8eb6af8aa..28bdf00073 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/FIxContentProviderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/FIxContentProviderPatch.kt @@ -13,13 +13,13 @@ private const val EXTENSION_CLASS_DESCRIPTOR = * Fixes crashing for some users with a beta release where the YouTube content provider uses null map values. * It unknown if this crash can happen on stable releases. */ -internal val fixContentProviderPatch = bytecodePatch{ +internal val fixContentProviderPatch = bytecodePatch { dependsOn( - sharedExtensionPatch + sharedExtensionPatch, ) apply { - unstableContentProviderFingerprint.let { + unstableContentProviderMethod.let { val insertIndex = it.instructionMatches.first().index it.method.apply { @@ -27,9 +27,9 @@ internal val fixContentProviderPatch = bytecodePatch{ it.method.addInstruction( insertIndex, - "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->removeNullMapEntries(Ljava/util/Map;)V" + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->removeNullMapEntries(Ljava/util/Map;)V", ) } } } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/Fingerprints.kt index dbb2ebe54e..6d6a018172 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/Fingerprints.kt @@ -1,11 +1,18 @@ package app.revanced.patches.youtube.misc.fix.contentprovider +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.methodCall +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val unstableContentProviderFingerprint = fingerprint { +internal val BytecodePatchContext.unstableContentProviderMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("Landroid/content/ContentResolver;", "[Ljava/lang/String;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/Fingerprints.kt index f2102ecc4d..1a23eda8cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/Fingerprints.kt @@ -1,6 +1,13 @@ package app.revanced.patches.youtube.misc.fix.playbackspeed -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionReversed import com.android.tools.smali.dexlib2.AccessFlags @@ -12,7 +19,7 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference * This method is usually used to set the initial speed (1.0x) when playback starts from the feed. * For some reason, in the latest YouTube, it is invoked even after the video has already started. */ -internal val playbackSpeedInFeedsFingerprint = fingerprint { +internal val BytecodePatchContext.playbackSpeedInFeedsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/FixPlaybackSpeedWhilePlayingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/FixPlaybackSpeedWhilePlayingPatch.kt index 3a2c5b1545..a1b00e22e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/FixPlaybackSpeedWhilePlayingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playbackspeed/FixPlaybackSpeedWhilePlayingPatch.kt @@ -41,7 +41,7 @@ val fixPlaybackSpeedWhilePlayingPatch = bytecodePatch { return@apply } - playbackSpeedInFeedsFingerprint.method.apply { + playbackSpeedInFeedsMethod.apply { val playbackSpeedIndex = indexOfGetPlaybackSpeedInstruction(this) val playbackSpeedRegister = getInstruction(playbackSpeedIndex).registerA val returnIndex = indexOfFirstInstructionOrThrow(playbackSpeedIndex, Opcode.RETURN_VOID) @@ -55,8 +55,8 @@ val fixPlaybackSpeedWhilePlayingPatch = bytecodePatch { move-result v$freeRegister if-nez v$freeRegister, :do_not_change """, - ExternalLabel("do_not_change", getInstruction(returnIndex)) + ExternalLabel("do_not_change", getInstruction(returnIndex)), ) } } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt index 0dd38409ee..e92115bd0a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/AccountCredentialsInvalidTextPatch.kt @@ -14,7 +14,7 @@ private const val EXTENSION_CLASS_DESCRIPTOR = internal val accountCredentialsInvalidTextPatch = bytecodePatch { dependsOn( sharedExtensionPatch, - addResourcesPatch + addResourcesPatch, ) apply { @@ -30,8 +30,8 @@ internal val accountCredentialsInvalidTextPatch = bytecodePatch { // MicroG accounts look almost identical to Google device accounts // and it's more foolproof to instead uninstall/reinstall. arrayOf( - specificNetworkErrorViewControllerFingerprint, - loadingFrameLayoutControllerFingerprint + specificNetworkErrorViewControllerMethod, + loadingFrameLayoutControllerMethod, ).forEach { fingerprint -> fingerprint.apply { val index = instructionMatches.last().index @@ -42,7 +42,7 @@ internal val accountCredentialsInvalidTextPatch = bytecodePatch { """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getOfflineNetworkErrorString(Ljava/lang/String;)Ljava/lang/String; move-result-object v$register - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt index 67c21207fe..f18a860aa5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Fingerprints.kt @@ -1,14 +1,21 @@ package app.revanced.patches.youtube.misc.gms import app.revanced.patcher.InstructionLocation.* -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val specificNetworkErrorViewControllerFingerprint = fingerprint { +internal val BytecodePatchContext.specificNetworkErrorViewControllerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes() @@ -22,7 +29,7 @@ internal val specificNetworkErrorViewControllerFingerprint = fingerprint { // It's not clear if this second class is ever used and it may be dead code, // but it the layout image/text is identical to the network error fingerprint above. -internal val loadingFrameLayoutControllerFingerprint = fingerprint { +internal val BytecodePatchContext.loadingFrameLayoutControllerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt index e44569740f..a7ec91811c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/DisableHapticFeedbackPatch.kt @@ -29,7 +29,7 @@ val `Disable haptic feedback` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -43,15 +43,15 @@ val `Disable haptic feedback` by creatingBytecodePatch( SwitchPreference("revanced_disable_haptic_feedback_precise_seeking"), SwitchPreference("revanced_disable_haptic_feedback_seek_undo"), SwitchPreference("revanced_disable_haptic_feedback_zoom"), - ) - ) + ), + ), ) arrayOf( - markerHapticsFingerprint to "disableChapterVibrate", - scrubbingHapticsFingerprint to "disablePreciseSeekingVibrate", - seekUndoHapticsFingerprint to "disableSeekUndoVibrate", - zoomHapticsFingerprint to "disableZoomVibrate" + markerHapticsMethod to "disableChapterVibrate", + scrubbingHapticsMethod to "disablePreciseSeekingVibrate", + seekUndoHapticsMethod to "disableSeekUndoVibrate", + zoomHapticsMethod to "disableZoomVibrate", ).forEach { (fingerprint, methodName) -> fingerprint.method.apply { addInstructionsWithLabels( @@ -62,7 +62,7 @@ val `Disable haptic feedback` by creatingBytecodePatch( if-eqz v0, :vibrate return-void """, - ExternalLabel("vibrate", getInstruction(0)) + ExternalLabel("vibrate", getInstruction(0)), ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt index 527a7be97b..d124a969f8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/hapticfeedback/Fingerprints.kt @@ -1,23 +1,21 @@ package app.revanced.patches.youtube.misc.hapticfeedback -import app.revanced.patcher.fingerprint - -internal val markerHapticsFingerprint = fingerprint { +internal val BytecodePatchContext.markerHapticsMethod by gettingFirstMethodDeclaratively { returnType("V") strings("Failed to execute markers haptics vibrate.") } -internal val scrubbingHapticsFingerprint = fingerprint { +internal val BytecodePatchContext.scrubbingHapticsMethod by gettingFirstMethodDeclaratively { returnType("V") strings("Failed to haptics vibrate for fine scrubbing.") } -internal val seekUndoHapticsFingerprint = fingerprint { +internal val BytecodePatchContext.seekUndoHapticsMethod by gettingFirstMethodDeclaratively { returnType("V") strings("Failed to execute seek undo haptics vibrate.") } -internal val zoomHapticsFingerprint = fingerprint { +internal val BytecodePatchContext.zoomHapticsMethod by gettingFirstMethodDeclaratively { returnType("V") strings("Failed to haptics vibrate for video zoom") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt index 729f9a1137..242c1d6dd6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/CronetImageUrlHook.kt @@ -4,8 +4,6 @@ import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.instructions import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.mutable.MutableMethod -import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.util.getReference import com.android.tools.smali.dexlib2.AccessFlags @@ -14,6 +12,8 @@ import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod +import com.android.tools.smali.dexlib2.mutable.MutableMethod +import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable private lateinit var loadImageUrlMethod: MutableMethod private var loadImageUrlIndex = 0 @@ -30,18 +30,18 @@ val cronetImageUrlHookPatch = bytecodePatch( dependsOn(sharedExtensionPatch) apply { - loadImageUrlMethod = messageDigestImageUrlFingerprint - .match(messageDigestImageUrlParentFingerprint.originalClassDef).method + loadImageUrlMethod = messageDigestImageUrlMethod + .match(messageDigestImageUrlParentMethod.originalClassDef).method - loadImageSuccessCallbackMethod = onSucceededFingerprint - .match(onResponseStartedFingerprint.originalClassDef).method + loadImageSuccessCallbackMethod = onSucceededMethod + .match(onResponseStartedMethod.originalClassDef).method - loadImageErrorCallbackMethod = onFailureFingerprint - .match(onResponseStartedFingerprint.originalClassDef).method + loadImageErrorCallbackMethod = onFailureMethod + .match(onResponseStartedMethod.originalClassDef).method // The URL is required for the failure callback hook, but the URL field is obfuscated. // Add a helper get method that returns the URL field. - val urlFieldInstruction = requestFingerprint.method.instructions.first { + val urlFieldInstruction = requestMethod.instructions.first { val reference = it.getReference() it.opcode == Opcode.IPUT_OBJECT && reference?.type == "Ljava/lang/String;" } as ReferenceInstruction @@ -49,7 +49,7 @@ val cronetImageUrlHookPatch = bytecodePatch( val urlFieldName = (urlFieldInstruction.reference as FieldReference).name val definingClass = CRONET_URL_REQUEST_CLASS_DESCRIPTOR val addedMethodName = "getHookedUrl" - requestFingerprint.classDef.methods.add( + requestMethod.classDef.methods.add( ImmutableMethod( definingClass, addedMethodName, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt index e8d9e37561..3409b50c76 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/imageurlhook/Fingerprints.kt @@ -1,11 +1,18 @@ package app.revanced.patches.youtube.misc.imageurlhook +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString import app.revanced.patcher.anyInstruction -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val onFailureFingerprint = fingerprint { +internal val BytecodePatchContext.onFailureMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes( @@ -19,7 +26,7 @@ internal val onFailureFingerprint = fingerprint { } // Acts as a parent fingerprint. -internal val onResponseStartedFingerprint = fingerprint { +internal val BytecodePatchContext.onResponseStartedMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") @@ -34,7 +41,7 @@ internal val onResponseStartedFingerprint = fingerprint { } } -internal val onSucceededFingerprint = fingerprint { +internal val BytecodePatchContext.onSucceededMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") @@ -45,19 +52,19 @@ internal val onSucceededFingerprint = fingerprint { internal const val CRONET_URL_REQUEST_CLASS_DESCRIPTOR = "Lorg/chromium/net/impl/CronetUrlRequest;" -internal val requestFingerprint = fingerprint { +internal val BytecodePatchContext.requestMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) custom { _, classDef -> classDef.type == CRONET_URL_REQUEST_CLASS_DESCRIPTOR } } -internal val messageDigestImageUrlFingerprint = fingerprint { +internal val BytecodePatchContext.messageDigestImageUrlMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes("Ljava/lang/String;", "L") } -internal val messageDigestImageUrlParentFingerprint = fingerprint { +internal val BytecodePatchContext.messageDigestImageUrlParentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/String;") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt index 0ba4b6886f..02899bffb9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/BypassURLRedirectsPatch.kt @@ -29,7 +29,7 @@ val `Bypass URL redirects` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -41,11 +41,11 @@ val `Bypass URL redirects` by creatingBytecodePatch( arrayOf( if (is_20_37_or_greater) { - (abUriParserFingerprint to 2) + (abUriParserMethod to 2) } else { - (abUriParserLegacyFingerprint to 2) + (abUriParserLegacyMethod to 2) }, - httpUriParserFingerprint to 0 + httpUriParserMethod to 0, ).forEach { (fingerprint, index) -> fingerprint.method.apply { val insertIndex = fingerprint.instructionMatches[index].index @@ -54,7 +54,7 @@ val `Bypass URL redirects` by creatingBytecodePatch( replaceInstruction( insertIndex, "invoke-static { v$uriStringRegister }, $EXTENSION_CLASS_DESCRIPTOR->" + - "parseRedirectUri(Ljava/lang/String;)Landroid/net/Uri;", + "parseRedirectUri(Ljava/lang/String;)Landroid/net/Uri;", ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt index 9f4173de39..2a940d013e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/Fingerprints.kt @@ -1,15 +1,22 @@ package app.revanced.patches.youtube.misc.links import app.revanced.patcher.StringComparisonType +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.methodCall +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags /** * 20.36 and lower. */ -internal val abUriParserLegacyFingerprint = fingerprint { +internal val BytecodePatchContext.abUriParserLegacyMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/Object;") parameterTypes("Ljava/lang/Object;") @@ -23,7 +30,7 @@ internal val abUriParserLegacyFingerprint = fingerprint { /** * 20.37+ */ -internal val abUriParserFingerprint = fingerprint { +internal val BytecodePatchContext.abUriParserMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Ljava/lang/Object;") parameterTypes("Ljava/lang/Object;") @@ -37,7 +44,7 @@ internal val abUriParserFingerprint = fingerprint { ) } -internal val httpUriParserFingerprint = fingerprint { +internal val BytecodePatchContext.httpUriParserMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("Landroid/net/Uri;") parameterTypes("Ljava/lang/String;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt index 62eb67022c..228704ef1e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/Fingerprints.kt @@ -1,29 +1,36 @@ package app.revanced.patches.youtube.misc.litho.filter +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString import app.revanced.patcher.fieldAccess -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal import app.revanced.patcher.methodCall +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.containsLiteralInstruction import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val componentCreateFingerprint = fingerprint { +internal val BytecodePatchContext.componentCreateMethod by gettingFirstMethodDeclaratively { instructions( addString("Element missing correct type extension"), addString("Element missing type"), ) } -internal val lithoFilterFingerprint = fingerprint { +internal val BytecodePatchContext.lithoFilterMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) custom { _, classDef -> classDef.endsWith("/LithoFilterPatch;") } } -internal val protobufBufferReferenceFingerprint = fingerprint { +internal val BytecodePatchContext.protobufBufferReferenceMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("[B") @@ -40,7 +47,7 @@ internal val protobufBufferReferenceFingerprint = fingerprint { ) } -internal val protobufBufferReferenceLegacyFingerprint = fingerprint { +internal val BytecodePatchContext.protobufBufferReferenceLegacyMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("I", "Ljava/nio/ByteBuffer;") @@ -52,7 +59,7 @@ internal val protobufBufferReferenceLegacyFingerprint = fingerprint { ) } -internal val emptyComponentFingerprint = fingerprint { +internal val BytecodePatchContext.emptyComponentMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) parameterTypes() instructions( @@ -63,7 +70,7 @@ internal val emptyComponentFingerprint = fingerprint { } } -internal val lithoThreadExecutorFingerprint = fingerprint { +internal val BytecodePatchContext.lithoThreadExecutorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes("I", "I", "I") custom { method, classDef -> @@ -72,7 +79,7 @@ internal val lithoThreadExecutorFingerprint = fingerprint { } } -internal val lithoComponentNameUpbFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.lithoComponentNameUpbFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() @@ -81,7 +88,7 @@ internal val lithoComponentNameUpbFeatureFlagFingerprint = fingerprint { ) } -internal val lithoConverterBufferUpbFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.lithoConverterBufferUpbFeatureFlagMethod by gettingFirstMethodDeclaratively { returnType("L") instructions( 45419603L(), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt index d0582b5bbe..ad61757f73 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/litho/filter/LithoFilterPatch.kt @@ -69,7 +69,7 @@ val lithoFilterPatch = bytecodePatch( apply { // Remove dummy filter from extenion static field // and add the filters included during patching. - lithoFilterFingerprint.method.apply { + lithoFilterMethod.apply { removeInstructions(2, 4) // Remove dummy filter. addLithoFilter = { classDescriptor -> @@ -80,7 +80,7 @@ val lithoFilterPatch = bytecodePatch( invoke-direct { v1 }, $classDescriptor->()V const/16 v2, ${filterCount++} aput-object v1, v0, v2 - """ + """, ) } } @@ -90,7 +90,7 @@ val lithoFilterPatch = bytecodePatch( if (is_20_22_or_greater) { // Hook method that bridges between UPB buffer native code and FB Litho. // Method is found in 19.25+, but is forcefully turned off for 20.21 and lower. - protobufBufferReferenceFingerprint.let { + protobufBufferReferenceMethod.let { // Hook the buffer after the call to jniDecode(). it.method.addInstruction( it.instructionMatches.last().index + 1, @@ -100,14 +100,13 @@ val lithoFilterPatch = bytecodePatch( } // Legacy Non native buffer. - protobufBufferReferenceLegacyFingerprint.method.addInstruction( + protobufBufferReferenceLegacyMethod.addInstruction( 0, "invoke-static { p2 }, $EXTENSION_CLASS_DESCRIPTOR->setProtoBuffer(Ljava/nio/ByteBuffer;)V", ) // endregion - // region Modify the create component method and // if the component is filtered then return an empty component. @@ -120,14 +119,15 @@ val lithoFilterPatch = bytecodePatch( .fields.single { field -> field.type == "Ljava/lang/StringBuilder;" } // Find class and methods to create an empty component. - val builderMethodDescriptor = emptyComponentFingerprint.classDef.methods.single { - // The only static method in the class. - method -> AccessFlags.STATIC.isSet(method.accessFlags) + val builderMethodDescriptor = emptyComponentMethod.classDef.methods.single { + // The only static method in the class. + method -> + AccessFlags.STATIC.isSet(method.accessFlags) } val emptyComponentField = firstClassDef(builderMethodDescriptor.returnType).fields.single() - componentCreateFingerprint.method.apply { + componentCreateMethod.apply { val insertIndex = if (is_19_17_or_greater) { indexOfFirstInstructionOrThrow(Opcode.RETURN_OBJECT) } else { @@ -164,28 +164,26 @@ val lithoFilterPatch = bytecodePatch( :unfiltered nop - """ + """, ) } // endregion - // region Change Litho thread executor to 1 thread to fix layout issue in unpatched YouTube. - lithoThreadExecutorFingerprint.method.addInstructions( + lithoThreadExecutorMethod.addInstructions( 0, """ invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->getExecutorCorePoolSize(I)I move-result p1 invoke-static { p2 }, $EXTENSION_CLASS_DESCRIPTOR->getExecutorMaxThreads(I)I move-result p2 - """ + """, ) // endregion - // region A/B test of new Litho native code. // Turn off native code that handles litho component names. If this feature is on then nearly @@ -194,16 +192,16 @@ val lithoFilterPatch = bytecodePatch( // Flag was removed in 20.05. It appears a new flag might be used instead (45660109L), // but if the flag is forced on then litho filtering still works correctly. if (is_19_25_or_greater && !is_20_05_or_greater) { - lithoComponentNameUpbFeatureFlagFingerprint.method.returnLate(false) + lithoComponentNameUpbFeatureFlagMethod.returnLate(false) } // Turn off a feature flag that enables native code of protobuf parsing (Upb protobuf). - lithoConverterBufferUpbFeatureFlagFingerprint.let { + lithoConverterBufferUpbFeatureFlagMethod.let { // 20.22 the flag is still enabled in one location, but what it does is not known. // Disable it anyway. it.method.insertLiteralOverride( it.instructionMatches.first().index, - false + false, ) } @@ -211,6 +209,6 @@ val lithoFilterPatch = bytecodePatch( } afterDependents { - lithoFilterFingerprint.method.replaceInstruction(0, "const/16 v0, $filterCount") + lithoFilterMethod.replaceInstruction(0, "const/16 v0, $filterCount") } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt index f09e231709..6ab3981f71 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt @@ -1,10 +1,17 @@ package app.revanced.patches.youtube.misc.loopvideo +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val videoStartPlaybackFingerprint = fingerprint { +internal val BytecodePatchContext.videoStartPlaybackMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatch.kt index add74ed229..a50fd526b9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/LoopVideoPatch.kt @@ -22,7 +22,7 @@ val `Loop video` by creatingBytecodePatch( sharedExtensionPatch, addResourcesPatch, loopVideoButtonPatch, - videoInformationPatch + videoInformationPatch, ) compatibleWith( @@ -31,7 +31,7 @@ val `Loop video` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { @@ -56,7 +56,7 @@ val `Loop video` by creatingBytecodePatch( return-void :do_not_loop nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt index 849d2595a4..0bfa72403f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/Fingerprints.kt @@ -3,12 +3,20 @@ package app.revanced.patches.youtube.misc.navigation import app.revanced.patcher.* import app.revanced.patcher.InstructionLocation.MatchAfterImmediately import app.revanced.patcher.InstructionLocation.MatchAfterWithin +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.youtube.layout.buttons.navigation.`Navigation buttons` import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val actionBarSearchResultsFingerprint = fingerprint { +internal val BytecodePatchContext.actionBarSearchResultsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Landroid/view/View;") instructions( @@ -17,7 +25,7 @@ internal val actionBarSearchResultsFingerprint = fingerprint { ) } -internal val toolbarLayoutFingerprint = fingerprint { +internal val BytecodePatchContext.toolbarLayoutMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PROTECTED, AccessFlags.CONSTRUCTOR) instructions( ResourceType.ID("toolbar_container"), @@ -28,7 +36,7 @@ internal val toolbarLayoutFingerprint = fingerprint { /** * Matches to https://android.googlesource.com/platform/frameworks/support/+/9eee6ba/v7/appcompat/src/android/support/v7/widget/Toolbar.java#963 */ -internal val appCompatToolbarBackButtonFingerprint = fingerprint { +internal val BytecodePatchContext.appCompatToolbarBackButtonMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Landroid/graphics/drawable/Drawable;") parameterTypes() @@ -38,9 +46,9 @@ internal val appCompatToolbarBackButtonFingerprint = fingerprint { } /** - * Matches to the class found in [pivotBarConstructorFingerprint]. + * Matches to the class found in [pivotBarConstructorMethod]. */ -internal val initializeButtonsFingerprint = fingerprint { +internal val BytecodePatchContext.initializeButtonsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") instructions( @@ -52,7 +60,7 @@ internal val initializeButtonsFingerprint = fingerprint { * Extension method, used for callback into to other patches. * Specifically, [navigationButtonsPatch]. */ -internal val navigationBarHookCallbackFingerprint = fingerprint { +internal val BytecodePatchContext.navigationBarHookCallbackMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("V") parameterTypes(EXTENSION_NAVIGATION_BUTTON_DESCRIPTOR, "Landroid/view/View;") @@ -65,7 +73,7 @@ internal val navigationBarHookCallbackFingerprint = fingerprint { /** * Matches to the Enum class that looks up ordinal -> instance. */ -internal val navigationEnumFingerprint = fingerprint { +internal val BytecodePatchContext.navigationEnumMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "PIVOT_HOME", @@ -79,7 +87,7 @@ internal val navigationEnumFingerprint = fingerprint { ) } -internal val pivotBarButtonsCreateDrawableViewFingerprint = fingerprint { +internal val BytecodePatchContext.pivotBarButtonsCreateDrawableViewMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Landroid/view/View;") custom { method, _ -> @@ -89,7 +97,7 @@ internal val pivotBarButtonsCreateDrawableViewFingerprint = fingerprint { } } -internal val pivotBarButtonsCreateResourceStyledViewFingerprint = fingerprint { +internal val BytecodePatchContext.pivotBarButtonsCreateResourceStyledViewMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Landroid/view/View;") parameterTypes("L", "Z", "I", "L") @@ -101,7 +109,7 @@ internal val pivotBarButtonsCreateResourceStyledViewFingerprint = fingerprint { /** * 20.21+ */ -internal val pivotBarButtonsCreateResourceIntViewFingerprint = fingerprint { +internal val BytecodePatchContext.pivotBarButtonsCreateResourceIntViewMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Landroid/view/View;") custom { method, _ -> @@ -111,7 +119,7 @@ internal val pivotBarButtonsCreateResourceIntViewFingerprint = fingerprint { } } -internal val pivotBarButtonsViewSetSelectedFingerprint = fingerprint { +internal val BytecodePatchContext.pivotBarButtonsViewSetSelectedMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("I", "Z") @@ -123,14 +131,14 @@ internal val pivotBarButtonsViewSetSelectedFingerprint = fingerprint { } } -internal val pivotBarConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.pivotBarConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( addString("com.google.android.apps.youtube.app.endpoint.flags"), ) } -internal val imageEnumConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.imageEnumConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) instructions( addString("TAB_ACTIVITY_CAIRO"), @@ -139,7 +147,7 @@ internal val imageEnumConstructorFingerprint = fingerprint { ) } -internal val setEnumMapFingerprint = fingerprint { +internal val BytecodePatchContext.setEnumMapMethod by gettingFirstMethodDeclaratively { instructions( ResourceType.DRAWABLE("yt_fill_bell_black_24"), methodCall(smali = "Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;", location = MatchAfterWithin(10)), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt index 689f2309a0..8ec6c148f4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/navigation/NavigationBarHookPatch.kt @@ -1,7 +1,5 @@ package app.revanced.patches.youtube.misc.navigation -import com.android.tools.smali.dexlib2.mutable.MutableMethod -import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction @@ -13,7 +11,7 @@ import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.* -import app.revanced.patches.youtube.shared.mainActivityOnBackPressedFingerprint +import app.revanced.patches.youtube.shared.mainActivityOnBackPressedMethod import app.revanced.util.ResourceGroup import app.revanced.util.copyResources import app.revanced.util.findFreeRegister @@ -27,6 +25,8 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod +import com.android.tools.smali.dexlib2.mutable.MutableMethod +import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable import com.android.tools.smali.dexlib2.util.MethodUtil import java.util.logging.Logger @@ -52,11 +52,11 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig "navigationbuttons", ResourceGroup( "drawable", - "revanced_fill_bell_cairo_black_24.xml" - ) + "revanced_fill_bell_cairo_black_24.xml", + ), ) } - } + }, ) apply { @@ -70,21 +70,21 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig addInstruction( insertIndex, "invoke-static { v$register }, " + - "$EXTENSION_CLASS_DESCRIPTOR->${hook.methodName}(${hook.parameters})V", + "$EXTENSION_CLASS_DESCRIPTOR->${hook.methodName}(${hook.parameters})V", ) } } - initializeButtonsFingerprint.match(pivotBarConstructorFingerprint.originalClassDef).method.apply { + initializeButtonsMethod.match(pivotBarConstructorMethod.originalClassDef).method.apply { // Hook the current navigation bar enum value. Note, the 'You' tab does not have an enum value. - val navigationEnumClassName = navigationEnumFingerprint.classDef.type + val navigationEnumClassName = navigationEnumMethod.classDef.type addHook(NavigationHook.SET_LAST_APP_NAVIGATION_ENUM) { opcode == Opcode.INVOKE_STATIC && - getReference()?.definingClass == navigationEnumClassName + getReference()?.definingClass == navigationEnumClassName } // Hook the creation of navigation tab views. - val drawableTabMethod = pivotBarButtonsCreateDrawableViewFingerprint.method + val drawableTabMethod = pivotBarButtonsCreateDrawableViewMethod addHook(NavigationHook.NAVIGATION_TAB_LOADED) predicate@{ MethodUtil.methodSignaturesMatch( getReference() ?: return@predicate false, @@ -93,7 +93,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig } if (is_20_21_or_greater && !is_20_28_or_greater) { - val imageResourceIntTabMethod = pivotBarButtonsCreateResourceIntViewFingerprint.originalMethod + val imageResourceIntTabMethod = pivotBarButtonsCreateResourceIntViewMethod.originalMethod addHook(NavigationHook.NAVIGATION_TAB_LOADED) predicate@{ MethodUtil.methodSignaturesMatch( getReference() ?: return@predicate false, @@ -102,7 +102,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig } } - val imageResourceTabMethod = pivotBarButtonsCreateResourceStyledViewFingerprint.originalMethod + val imageResourceTabMethod = pivotBarButtonsCreateResourceStyledViewMethod.originalMethod addHook(NavigationHook.NAVIGATION_IMAGE_RESOURCE_TAB_LOADED) predicate@{ MethodUtil.methodSignaturesMatch( getReference() ?: return@predicate false, @@ -111,7 +111,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig } } - pivotBarButtonsViewSetSelectedFingerprint.let { + pivotBarButtonsViewSetSelectedMethod.let { it.method.apply { val index = it.instructionMatches.first().index val instruction = getInstruction(index) @@ -121,14 +121,14 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig addInstruction( index + 1, "invoke-static { v$viewRegister, v$isSelectedRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->navigationTabSelected(Landroid/view/View;Z)V", + "$EXTENSION_CLASS_DESCRIPTOR->navigationTabSelected(Landroid/view/View;Z)V", ) } } // Hook onto back button pressed. Needed to fix race problem with // Litho filtering based on navigation tab before the tab is updated. - mainActivityOnBackPressedFingerprint.method.addInstruction( + mainActivityOnBackPressedMethod.addInstruction( 0, "invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->onBackPressed(Landroid/app/Activity;)V", ) @@ -138,7 +138,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig // Two different layouts are used at the hooked code. // Insert before the first ViewGroup method call after inflating, // so this works regardless which layout is used. - actionBarSearchResultsFingerprint.let { + actionBarSearchResultsMethod.let { it.method.apply { val instructionIndex = it.instructionMatches.last().index val viewRegister = getInstruction(instructionIndex).registerC @@ -146,27 +146,27 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig addInstruction( instructionIndex, "invoke-static { v$viewRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->searchBarResultsViewLoaded(Landroid/view/View;)V", + "$EXTENSION_CLASS_DESCRIPTOR->searchBarResultsViewLoaded(Landroid/view/View;)V", ) } } // Hook the back button visibility. - toolbarLayoutFingerprint.let { + toolbarLayoutMethod.let { it.method.apply { val index = it.instructionMatches.last().index val register = getInstruction(index).registerA addInstruction( index + 1, - "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setToolbar(Landroid/widget/FrameLayout;)V" + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->setToolbar(Landroid/widget/FrameLayout;)V", ) } } // Add interface for extensions code to call obfuscated methods. - appCompatToolbarBackButtonFingerprint.let { + appCompatToolbarBackButtonMethod.let { it.classDef.apply { interfaces.add(EXTENSION_TOOLBAR_INTERFACE) @@ -191,34 +191,34 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig invoke-virtual { p0 }, $definingClass->$obfuscatedMethodName()$returnType move-result-object v0 return-object v0 - """ + """, ) - } + }, ) } } hookNavigationButtonCreated = { extensionClassDescriptor -> - navigationBarHookCallbackFingerprint.method.addInstruction( + navigationBarHookCallbackMethod.addInstruction( 0, "invoke-static { p0, p1 }, $extensionClassDescriptor->navigationTabCreated" + - "(${EXTENSION_NAVIGATION_BUTTON_DESCRIPTOR}Landroid/view/View;)V", + "(${EXTENSION_NAVIGATION_BUTTON_DESCRIPTOR}Landroid/view/View;)V", ) } if (is_20_39_or_greater) { return@apply Logger.getLogger(this::class.java.name).warning( - "20.39+ Navigation tab activity button selected state is not yet fixed." + "20.39+ Navigation tab activity button selected state is not yet fixed.", ) } // Fix YT bug of notification tab missing the filled icon. if (is_19_35_or_greater && !is_20_39_or_greater) { // FIXME: 20.39+ needs this fix. - val cairoNotificationEnumReference = imageEnumConstructorFingerprint + val cairoNotificationEnumReference = imageEnumConstructorMethod .instructionMatches.last().getInstruction().reference - setEnumMapFingerprint.method.apply { - val setEnumIntegerIndex = setEnumMapFingerprint.instructionMatches.last().index + setEnumMapMethod.apply { + val setEnumIntegerIndex = setEnumMapMethod.instructionMatches.last().index val enumMapRegister = getInstruction(setEnumIntegerIndex).registerC val insertIndex = setEnumIntegerIndex + 1 val freeRegister = findFreeRegister(insertIndex, enumMapRegister) @@ -228,7 +228,7 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig """ sget-object v$freeRegister, $cairoNotificationEnumReference invoke-static { v$enumMapRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->setCairoNotificationFilledIcon(Ljava/util/EnumMap;Ljava/lang/Enum;)V - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt index 33768c1f86..86f0e608f1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/Fingerprints.kt @@ -1,16 +1,23 @@ package app.revanced.patches.youtube.misc.playercontrols import app.revanced.patcher.InstructionLocation.MatchAfterImmediately +import app.revanced.patcher.accessFlags import app.revanced.patcher.checkCast -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val playerControlsVisibilityEntityModelFingerprint = fingerprint { +internal val BytecodePatchContext.playerControlsVisibilityEntityModelMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC) returnType("L") parameterTypes() @@ -23,7 +30,7 @@ internal val playerControlsVisibilityEntityModelFingerprint = fingerprint { } } -internal val youtubeControlsOverlayFingerprint = fingerprint { +internal val BytecodePatchContext.youtubeControlsOverlayMethod by gettingFirstMethodDeclaratively { returnType("V") parameterTypes() instructions( @@ -33,7 +40,7 @@ internal val youtubeControlsOverlayFingerprint = fingerprint { ) } -internal val motionEventFingerprint = fingerprint { +internal val BytecodePatchContext.motionEventMethod by gettingFirstMethodDeclaratively { returnType("V") parameterTypes("Landroid/view/MotionEvent;") instructions( @@ -41,7 +48,7 @@ internal val motionEventFingerprint = fingerprint { ) } -internal val playerControlsExtensionHookListenersExistFingerprint = fingerprint { +internal val BytecodePatchContext.playerControlsExtensionHookListenersExistMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("Z") parameterTypes() @@ -51,7 +58,7 @@ internal val playerControlsExtensionHookListenersExistFingerprint = fingerprint } } -internal val playerControlsExtensionHookFingerprint = fingerprint { +internal val BytecodePatchContext.playerControlsExtensionHookMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returnType("V") parameterTypes("Z") @@ -61,7 +68,7 @@ internal val playerControlsExtensionHookFingerprint = fingerprint { } } -internal val playerTopControlsInflateFingerprint = fingerprint { +internal val BytecodePatchContext.playerTopControlsInflateMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes() @@ -72,7 +79,7 @@ internal val playerTopControlsInflateFingerprint = fingerprint { ) } -internal val playerBottomControlsInflateFingerprint = fingerprint { +internal val BytecodePatchContext.playerBottomControlsInflateMethod by gettingFirstMethodDeclaratively { returnType("Ljava/lang/Object;") parameterTypes() instructions( @@ -82,7 +89,7 @@ internal val playerBottomControlsInflateFingerprint = fingerprint { ) } -internal val overlayViewInflateFingerprint = fingerprint { +internal val BytecodePatchContext.overlayViewInflateMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("Landroid/view/View;") @@ -94,15 +101,15 @@ internal val overlayViewInflateFingerprint = fingerprint { } /** - * Resolves to the class found in [playerTopControlsInflateFingerprint]. + * Resolves to the class found in [playerTopControlsInflateMethod]. */ -internal val controlsOverlayVisibilityFingerprint = fingerprint { +internal val BytecodePatchContext.controlsOverlayVisibilityMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returnType("V") parameterTypes("Z", "Z") } -internal val playerBottomControlsExploderFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.playerBottomControlsExploderFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() @@ -111,7 +118,7 @@ internal val playerBottomControlsExploderFeatureFlagFingerprint = fingerprint { ) } -internal val playerTopControlsExperimentalLayoutFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.playerTopControlsExperimentalLayoutFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("I") parameterTypes() @@ -120,7 +127,7 @@ internal val playerTopControlsExperimentalLayoutFeatureFlagFingerprint = fingerp ) } -internal val playerControlsLargeOverlayButtonsFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.playerControlsLargeOverlayButtonsFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() @@ -129,7 +136,7 @@ internal val playerControlsLargeOverlayButtonsFeatureFlagFingerprint = fingerpri ) } -internal val playerControlsFullscreenLargeButtonsFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.playerControlsFullscreenLargeButtonsFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() @@ -138,11 +145,11 @@ internal val playerControlsFullscreenLargeButtonsFeatureFlagFingerprint = finger ) } -internal val playerControlsButtonStrokeFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.playerControlsButtonStrokeFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() instructions( - 45713296(), + 45713296L(), ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsOverlayVisibilityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsOverlayVisibilityPatch.kt index 749334e044..cd7edebeb1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsOverlayVisibilityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsOverlayVisibilityPatch.kt @@ -16,7 +16,7 @@ val playerControlsOverlayVisibilityPatch = bytecodePatch { dependsOn(sharedExtensionPatch) apply { - playerControlsVisibilityEntityModelFingerprint.let { + playerControlsVisibilityEntityModelMethod.let { it.method.apply { val startIndex = it.instructionMatches.first().index val iGetReference = getInstruction(startIndex).reference @@ -33,7 +33,7 @@ val playerControlsOverlayVisibilityPatch = bytecodePatch { invoke-static { v$targetRegister }, $staticReference move-result-object v$targetRegister invoke-static { v$targetRegister }, $EXTENSION_PLAYER_CONTROLS_VISIBILITY_HOOK_CLASS_DESCRIPTOR->setPlayerControlsVisibility(Ljava/lang/Enum;)V - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt index dbbb431e87..16b19b9df8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatch.kt @@ -6,7 +6,6 @@ import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.Document -import com.android.tools.smali.dexlib2.mutable.MutableMethod import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater @@ -25,6 +24,7 @@ import app.revanced.util.returnEarly import app.revanced.util.returnLate import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.mutable.MutableMethod import org.w3c.dom.Node /** @@ -78,7 +78,7 @@ internal val playerControlsResourcePatch = resourcePatch { // do no harm to earlier releases. bottomTargetDocumentChildNodes.findElementByAttributeValueOrThrow( "android:id", - "@id/youtube_controls_fullscreen_button_stub" + "@id/youtube_controls_fullscreen_button_stub", ).apply { setAttribute("android:layout_marginBottom", "6.0dip") setAttribute("android:layout_width", "48.0dip") @@ -220,7 +220,7 @@ private lateinit var inflateBottomControlMethod: MutableMethod private var inflateBottomControlInsertIndex = -1 private var inflateBottomControlRegister = -1 -private lateinit var visibilityImmediateCallbacksExistMethod : MutableMethod +private lateinit var visibilityImmediateCallbacksExistMethod: MutableMethod private var visibilityImmediateCallbacksExistModified = false private lateinit var visibilityMethod: MutableMethod @@ -240,11 +240,11 @@ val playerControlsPatch = bytecodePatch( sharedExtensionPatch, resourceMappingPatch, // Used by fingerprints. playerControlsOverlayVisibilityPatch, - versionCheckPatch + versionCheckPatch, ) apply { - playerBottomControlsInflateFingerprint.let { + playerBottomControlsInflateMethod.let { it.method.apply { inflateBottomControlMethod = this @@ -254,7 +254,7 @@ val playerControlsPatch = bytecodePatch( } } - playerTopControlsInflateFingerprint.let { + playerTopControlsInflateMethod.let { it.method.apply { inflateTopControlMethod = this @@ -264,13 +264,13 @@ val playerControlsPatch = bytecodePatch( } } - visibilityMethod = controlsOverlayVisibilityFingerprint.match( - playerTopControlsInflateFingerprint.originalClassDef, + visibilityMethod = controlsOverlayVisibilityMethod.match( + playerTopControlsInflateMethod.originalClassDef, ).method // Hook the fullscreen close button. Used to fix visibility // when seeking and other situations. - overlayViewInflateFingerprint.let { + overlayViewInflateMethod.let { it.method.apply { val index = it.instructionMatches.last().index val register = getInstruction(index).registerA @@ -278,15 +278,15 @@ val playerControlsPatch = bytecodePatch( addInstruction( index + 1, "invoke-static { v$register }, " + - "$EXTENSION_CLASS_DESCRIPTOR->setFullscreenCloseButton(Landroid/widget/ImageView;)V", + "$EXTENSION_CLASS_DESCRIPTOR->setFullscreenCloseButton(Landroid/widget/ImageView;)V", ) } } - visibilityImmediateCallbacksExistMethod = playerControlsExtensionHookListenersExistFingerprint.method - visibilityImmediateMethod = playerControlsExtensionHookFingerprint.method + visibilityImmediateCallbacksExistMethod = playerControlsExtensionHookListenersExistMethod + visibilityImmediateMethod = playerControlsExtensionHookMethod - motionEventFingerprint.match(youtubeControlsOverlayFingerprint.originalClassDef).let { + motionEventMethod.match(youtubeControlsOverlayMethod.originalClassDef).let { visibilityNegatedImmediateMethod = it.method visibilityNegatedImmediateInsertIndex = it.instructionMatches.first().index + 1 } @@ -296,7 +296,7 @@ val playerControlsPatch = bytecodePatch( // The change to support this is simple and only requires adding buttons to both layout files, // but for now force this different layout off since it's still an experimental test. if (is_19_35_or_greater) { - playerBottomControlsExploderFeatureFlagFingerprint.method.returnLate(false) + playerBottomControlsExploderFeatureFlagMethod.returnLate(false) } // A/B test of different top overlay controls. Two different layouts can be used: @@ -305,7 +305,7 @@ val playerControlsPatch = bytecodePatch( // // Flag was removed in 20.19+ if (is_19_25_or_greater && !is_20_19_or_greater) { - playerTopControlsExperimentalLayoutFeatureFlagFingerprint.method.apply { + playerTopControlsExperimentalLayoutFeatureFlagMethod.apply { val index = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_OBJECT) val register = getInstruction(index).registerA @@ -315,14 +315,14 @@ val playerControlsPatch = bytecodePatch( // Turn off a/b tests of ugly player buttons that don't match the style of custom player buttons. if (is_20_20_or_greater) { - playerControlsFullscreenLargeButtonsFeatureFlagFingerprint.method.returnLate(false) + playerControlsFullscreenLargeButtonsFeatureFlagMethod.returnLate(false) if (is_20_28_or_greater) { - playerControlsLargeOverlayButtonsFeatureFlagFingerprint.method.returnLate(false) + playerControlsLargeOverlayButtonsFeatureFlagMethod.returnLate(false) } if (is_20_30_or_greater) { - playerControlsButtonStrokeFeatureFlagFingerprint.method.returnLate(false) + playerControlsButtonStrokeFeatureFlagMethod.returnLate(false) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt index d41230db29..c51f18df59 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/Fingerprints.kt @@ -1,14 +1,21 @@ package app.revanced.patches.youtube.misc.playertype import app.revanced.patcher.InstructionLocation.MatchAfterWithin +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val playerTypeEnumFingerprint = fingerprint { +internal val BytecodePatchContext.playerTypeEnumMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "NONE", @@ -25,7 +32,7 @@ internal val playerTypeEnumFingerprint = fingerprint { ) } -internal val reelWatchPagerFingerprint = fingerprint { +internal val BytecodePatchContext.reelWatchPagerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Landroid/view/View;") instructions( @@ -34,7 +41,7 @@ internal val reelWatchPagerFingerprint = fingerprint { ) } -internal val videoStateEnumFingerprint = fingerprint { +internal val BytecodePatchContext.videoStateEnumMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) parameterTypes() strings( @@ -48,7 +55,7 @@ internal val videoStateEnumFingerprint = fingerprint { } // 20.33 and lower class name ControlsState. 20.34+ class name is obfuscated. -internal val controlsStateToStringFingerprint = fingerprint { +internal val BytecodePatchContext.controlsStateToStringMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameterTypes() returnType("Ljava/lang/String;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt index 8544d65ed1..f3b6ab43e6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPatch.kt @@ -4,7 +4,6 @@ import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.fieldAccess -import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceMappingPatch @@ -24,7 +23,7 @@ val playerTypeHookPatch = bytecodePatch( val playerOverlaysSetPlayerTypeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") - parameterTypes(playerTypeEnumFingerprint.originalClassDef.type) + parameterTypes(playerTypeEnumMethod.originalClassDef.type) custom { _, classDef -> classDef.endsWith("/YouTubePlayerOverlaysLayout;") } @@ -35,7 +34,7 @@ val playerTypeHookPatch = bytecodePatch( "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->setPlayerType(Ljava/lang/Enum;)V", ) - reelWatchPagerFingerprint.let { + reelWatchPagerMethod.let { it.method.apply { val index = it.instructionMatches.last().index val register = getInstruction(index).registerA @@ -47,7 +46,7 @@ val playerTypeHookPatch = bytecodePatch( } } - val controlStateType = controlsStateToStringFingerprint.originalClassDef.type + val controlStateType = controlsStateToStringMethod.originalClassDef.type val videoStateFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) @@ -57,7 +56,7 @@ val playerTypeHookPatch = bytecodePatch( // Obfuscated parameter field name. fieldAccess( definingClass = controlStateType, - type = videoStateEnumFingerprint.originalClassDef.type, + type = videoStateEnumMethod.originalClassDef.type, ), ResourceType.STRING("accessibility_play"), ResourceType.STRING("accessibility_pause"), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt index fb2df5e382..005994c2d7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt @@ -1,10 +1,17 @@ package app.revanced.patches.youtube.misc.recyclerviewtree.hook -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val recyclerViewTreeObserverFingerprint = fingerprint { +internal val BytecodePatchContext.recyclerViewTreeObserverMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.CHECK_CAST, diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt index fa5adde94d..c35be29b87 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/RecyclerViewTreeHookPatch.kt @@ -11,8 +11,8 @@ val recyclerViewTreeHookPatch = bytecodePatch { dependsOn(sharedExtensionPatch) apply { - recyclerViewTreeObserverFingerprint.method.apply { - val insertIndex = recyclerViewTreeObserverFingerprint.instructionMatches.first().index + 1 + recyclerViewTreeObserverMethod.apply { + val insertIndex = recyclerViewTreeObserverMethod.instructionMatches.first().index + 1 val recyclerViewParameter = 2 addRecyclerViewTreeHook = { classDescriptor -> diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt index 1055c5b1b1..8c2cd31c9d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/Fingerprints.kt @@ -1,14 +1,21 @@ package app.revanced.patches.youtube.misc.settings import app.revanced.patcher.InstructionLocation.MatchAfterWithin -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val licenseActivityOnCreateFingerprint = fingerprint { +internal val BytecodePatchContext.licenseActivityOnCreateMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("Landroid/os/Bundle;") @@ -17,7 +24,7 @@ internal val licenseActivityOnCreateFingerprint = fingerprint { } } -internal val setThemeFingerprint = fingerprint { +internal val BytecodePatchContext.setThemeMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes() @@ -26,7 +33,7 @@ internal val setThemeFingerprint = fingerprint { ) } -internal val cairoFragmentConfigFingerprint = fingerprint { +internal val BytecodePatchContext.cairoFragmentConfigMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") instructions( @@ -37,7 +44,7 @@ internal val cairoFragmentConfigFingerprint = fingerprint { // Flag is present in 20.23, but bold icons are missing and forcing them crashes the app. // 20.31 is the first target with all the bold icons present. -internal val boldIconsFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.boldIconsFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") parameterTypes() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt index 646dfea6ca..cc37bb3408 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/settings/SettingsPatch.kt @@ -1,8 +1,5 @@ package app.revanced.patches.youtube.misc.settings -import com.android.tools.smali.dexlib2.mutable.MutableClassDef -import com.android.tools.smali.dexlib2.mutable.MutableMethod -import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch @@ -29,6 +26,9 @@ import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter +import com.android.tools.smali.dexlib2.mutable.MutableClassDef +import com.android.tools.smali.dexlib2.mutable.MutableMethod +import com.android.tools.smali.dexlib2.mutable.MutableMethod.Companion.toMutable import com.android.tools.smali.dexlib2.util.MethodUtil private const val BASE_ACTIVITY_HOOK_CLASS_DESCRIPTOR = @@ -46,7 +46,7 @@ private val settingsResourcePatch = resourcePatch { IntentPreference( titleKey = "revanced_settings_title", summaryKey = null, - intent = newIntent("revanced_settings_intent") + intent = newIntent("revanced_settings_intent"), ) to "settings_fragment", PreferenceCategory( @@ -58,13 +58,13 @@ private val settingsResourcePatch = resourcePatch { summaryKey = null, icon = "@drawable/revanced_settings_icon_dynamic", layout = "@layout/preference_with_icon", - intent = newIntent("revanced_settings_intent") - ) - ) - ) to "settings_fragment_cairo" + intent = newIntent("revanced_settings_intent"), + ), + ), + ) to "settings_fragment_cairo", ), - preferences = preferences - ) + preferences = preferences, + ), ) apply { @@ -73,7 +73,8 @@ private val settingsResourcePatch = resourcePatch { copyResources( "settings", - ResourceGroup("drawable", + ResourceGroup( + "drawable", "revanced_settings_icon_dynamic.xml", "revanced_settings_icon.xml", "revanced_settings_icon_bold.xml", @@ -103,7 +104,7 @@ private val settingsResourcePatch = resourcePatch { "revanced_settings_screen_11_misc_bold.xml", "revanced_settings_screen_12_video.xml", "revanced_settings_screen_12_video_bold.xml", - ) + ), ) // Remove horizontal divider from the settings Preferences @@ -141,7 +142,7 @@ private val settingsResourcePatch = resourcePatch { licenseElement.setAttribute( "android:configChanges", - "orientation|screenSize|keyboardHidden" + "orientation|screenSize|keyboardHidden", ) val mimeType = document.createElement("data") @@ -186,7 +187,7 @@ val settingsPatch = bytecodePatch( if (is_19_34_or_greater) { PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_restore_old_settings_menus") + SwitchPreference("revanced_restore_old_settings_menus"), ) } @@ -194,7 +195,6 @@ val settingsPatch = bytecodePatch( SwitchPreference("revanced_settings_search_history"), ) - PreferenceScreen.GENERAL_LAYOUT.addPreferences( if (is_20_31_or_greater) { PreferenceCategory( @@ -203,12 +203,12 @@ val settingsPatch = bytecodePatch( tag = "app.revanced.extension.shared.settings.preference.NoTitlePreferenceCategory", preferences = setOf( SwitchPreference("revanced_show_menu_icons"), - SwitchPreference("revanced_settings_disable_bold_icons") - ) + SwitchPreference("revanced_settings_disable_bold_icons"), + ), ) } else { SwitchPreference("revanced_show_menu_icons") - } + }, ) PreferenceScreen.MISC.addPreferences( @@ -221,14 +221,14 @@ val settingsPatch = bytecodePatch( ), ListPreference( key = "revanced_language", - tag = "app.revanced.extension.shared.settings.preference.SortedListPreference" - ) + tag = "app.revanced.extension.shared.settings.preference.SortedListPreference", + ), ) // Update shared dark mode status based on YT theme. // This is needed because YT allows forcing light/dark mode // which then differs from the system dark mode status. - setThemeFingerprint.method.apply { + setThemeMethod.apply { findInstructionIndicesReversedOrThrow(Opcode.RETURN_OBJECT).forEach { index -> val register = getInstruction(index).registerA addInstructionsAtControlFlowLabel( @@ -239,27 +239,27 @@ val settingsPatch = bytecodePatch( } // Add setting to force Cairo settings fragment on/off. - cairoFragmentConfigFingerprint.method.insertLiteralOverride( - cairoFragmentConfigFingerprint.instructionMatches.first().index, - "$YOUTUBE_ACTIVITY_HOOK_CLASS_DESCRIPTOR->useCairoSettingsFragment(Z)Z" + cairoFragmentConfigMethod.insertLiteralOverride( + cairoFragmentConfigMethod.instructionMatches.first().index, + "$YOUTUBE_ACTIVITY_HOOK_CLASS_DESCRIPTOR->useCairoSettingsFragment(Z)Z", ) // Bold icon resources are found starting in 20.23, but many YT icons are not bold. // 20.31 is the first version that seems to have all the bold icons. if (is_20_31_or_greater) { - boldIconsFeatureFlagFingerprint.let { + boldIconsFeatureFlagMethod.let { it.method.insertLiteralOverride( it.instructionMatches.first().index, - "$YOUTUBE_ACTIVITY_HOOK_CLASS_DESCRIPTOR->useBoldIcons(Z)Z" + "$YOUTUBE_ACTIVITY_HOOK_CLASS_DESCRIPTOR->useBoldIcons(Z)Z", ) } } modifyActivityForSettingsInjection( - licenseActivityOnCreateFingerprint.classDef, - licenseActivityOnCreateFingerprint.method, + licenseActivityOnCreateMethod.classDef, + licenseActivityOnCreateMethod, YOUTUBE_ACTIVITY_HOOK_CLASS_DESCRIPTOR, - false + false, ) } @@ -275,7 +275,7 @@ internal fun modifyActivityForSettingsInjection( activityOnCreateClass: MutableClassDef, activityOnCreateMethod: MutableMethod, extensionClassType: String, - isYouTubeMusic: Boolean + isYouTubeMusic: Boolean, ) { // Modify Activity and remove all existing layout code. // Must modify an existing activity and cannot add a new activity to the manifest, @@ -286,7 +286,7 @@ internal fun modifyActivityForSettingsInjection( invoke-super { p0, p1 }, ${activityOnCreateClass.superclass}->onCreate(Landroid/os/Bundle;)V invoke-static { p0 }, $extensionClassType->initialize(Landroid/app/Activity;)V return-void - """ + """, ) // Remove other methods as they will break as the onCreate method is modified above. @@ -311,7 +311,7 @@ internal fun modifyActivityForSettingsInjection( move-result-object p1 invoke-super { p0, p1 }, ${activityOnCreateClass.superclass}->attachBaseContext(Landroid/content/Context;)V return-void - """ + """, ) }.let(activityOnCreateClass.methods::add) @@ -338,7 +338,7 @@ internal fun modifyActivityForSettingsInjection( $invokeFinishOpcode { p0 }, Landroid/app/Activity;->finish()V :search_handled return-void - """ + """, ) }.let(activityOnCreateClass.methods::add) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt index 0fdf8071e3..95ac9d19f5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/shared/Fingerprints.kt @@ -5,7 +5,6 @@ import app.revanced.patcher.after import app.revanced.patcher.allOf import app.revanced.patcher.definingClass import app.revanced.patcher.field -import app.revanced.patcher.fingerprint import app.revanced.patcher.firstMethodComposite import app.revanced.patcher.firstMethodDeclaratively import app.revanced.patcher.firstMutableMethodDeclaratively @@ -16,6 +15,7 @@ import app.revanced.patcher.instructions import app.revanced.patcher.invoke import app.revanced.patcher.method import app.revanced.patcher.name +import app.revanced.patcher.opcodes import app.revanced.patcher.parameterTypes import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.returnType @@ -60,7 +60,7 @@ internal fun getLayoutConstructorMethodMatch() = firstMethodComposite { ) } -internal val mainActivityConstructorFingerprint = fingerprint { +internal val BytecodePatchContext.mainActivityConstructorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameterTypes() custom { _, classDef -> @@ -68,7 +68,7 @@ internal val mainActivityConstructorFingerprint = fingerprint { } } -internal val mainActivityOnBackPressedFingerprint = fingerprint { +internal val BytecodePatchContext.mainActivityOnBackPressedMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes() @@ -84,7 +84,7 @@ internal val BytecodePatchContext.mainActivityOnCreateMethod by gettingFirstMuta parameterTypes("Landroid/os/Bundle;") } -internal val rollingNumberTextViewAnimationUpdateFingerprint = fingerprint { +internal val BytecodePatchContext.rollingNumberTextViewAnimationUpdateMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("Landroid/graphics/Bitmap;") @@ -126,7 +126,7 @@ internal fun getSeekbarOnDrawMethodMatch() = firstMethodComposite { ) } -internal val subtitleButtonControllerFingerprint = fingerprint { +internal val BytecodePatchContext.subtitleButtonControllerMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("Lcom/google/android/libraries/youtube/player/subtitles/model/SubtitleTrack;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatch.kt index 23337c7d8c..a2299df395 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/DisableVideoCodecsPatch.kt @@ -21,29 +21,35 @@ val `Disable video codecs` by creatingBytecodePatch( description = "Adds options to disable HDR and VP9 codecs.", ) { dependsOn( - sharedExtensionPatch, settingsPatch, addResourcesPatch, + sharedExtensionPatch, + settingsPatch, + addResourcesPatch, /** * Override all calls of `getSupportedHdrTypes`. */ - transformInstructionsPatch(filterMap = filterMap@{ classDef, _, instruction, instructionIndex -> - if (classDef.type.startsWith("Lapp/revanced/")) { + transformInstructionsPatch( + filterMap = filterMap@{ classDef, _, instruction, instructionIndex -> + if (classDef.type.startsWith("Lapp/revanced/")) { + return@filterMap null + } + + val reference = instruction.getReference() + if (reference?.definingClass == "Landroid/view/Display\$HdrCapabilities;" && reference.name == "getSupportedHdrTypes") { + return@filterMap instruction to instructionIndex + } return@filterMap null - } + }, + transform = { method, entry -> + val (instruction, index) = entry + val register = (instruction as FiveRegisterInstruction).registerC - val reference = instruction.getReference() - if (reference?.definingClass == "Landroid/view/Display\$HdrCapabilities;" && reference.name == "getSupportedHdrTypes") { - return@filterMap instruction to instructionIndex - } - return@filterMap null - }, transform = { method, entry -> - val (instruction, index) = entry - val register = (instruction as FiveRegisterInstruction).registerC - - method.replaceInstruction( - index, - "invoke-static/range { v$register .. v$register }, $EXTENSION_CLASS_DESCRIPTOR->" + "disableHdrVideo(Landroid/view/Display\$HdrCapabilities;)[I", - ) - })) + method.replaceInstruction( + index, + "invoke-static/range { v$register .. v$register }, $EXTENSION_CLASS_DESCRIPTOR->" + "disableHdrVideo(Landroid/view/Display\$HdrCapabilities;)[I", + ) + }, + ), + ) compatibleWith( "com.google.android.youtube"( @@ -51,25 +57,27 @@ val `Disable video codecs` by creatingBytecodePatch( "20.14.43", "20.21.37", "20.31.40", - ) + ), ) apply { addResources("youtube", "video.codecs.disableVideoCodecsPatch") PreferenceScreen.VIDEO.addPreferences( - SwitchPreference("revanced_disable_hdr_video"), SwitchPreference("revanced_force_avc_codec") + SwitchPreference("revanced_disable_hdr_video"), + SwitchPreference("revanced_force_avc_codec"), ) - vp9CapabilityFingerprint.method.addInstructionsWithLabels( - 0, """ + vp9CapabilityMethod.addInstructionsWithLabels( + 0, + """ invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->allowVP9()Z move-result v0 if-nez v0, :default return v0 :default nop - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/Fingerprints.kt index d357bc4d2a..c7cdb882e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/codecs/Fingerprints.kt @@ -1,9 +1,16 @@ package app.revanced.patches.youtube.video.codecs -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags -internal val vp9CapabilityFingerprint = fingerprint { +internal val BytecodePatchContext.vp9CapabilityMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") strings( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt index 947b7213ad..8a70421401 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/Fingerprints.kt @@ -1,13 +1,20 @@ package app.revanced.patches.youtube.video.playerresponse +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags /** * For targets 20.46 and later. */ -internal val playerParameterBuilderFingerprint = fingerprint { +internal val BytecodePatchContext.playerParameterBuilderMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes( @@ -33,7 +40,7 @@ internal val playerParameterBuilderFingerprint = fingerprint { /** * For targets 20.26 and later. */ -internal val playerParameterBuilder2026Fingerprint = fingerprint { +internal val BytecodePatchContext.playerParameterBuilder2026Method by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes( @@ -62,7 +69,7 @@ internal val playerParameterBuilder2026Fingerprint = fingerprint { /** * For targets 20.15 to 20.25 */ -internal val playerParameterBuilder2015Fingerprint = fingerprint { +internal val BytecodePatchContext.playerParameterBuilder2015Method by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes( @@ -90,7 +97,7 @@ internal val playerParameterBuilder2015Fingerprint = fingerprint { /** * For targets 20.10 to 20.14. */ -internal val playerParameterBuilder2010Fingerprint = fingerprint { +internal val BytecodePatchContext.playerParameterBuilder2010Method by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes( @@ -119,7 +126,7 @@ internal val playerParameterBuilder2010Fingerprint = fingerprint { /** * For targets 20.02 to 20.09. */ -internal val playerParameterBuilder2002Fingerprint = fingerprint { +internal val BytecodePatchContext.playerParameterBuilder2002Method by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes( @@ -147,7 +154,7 @@ internal val playerParameterBuilder2002Fingerprint = fingerprint { /** * For targets 19.25 to 19.50. */ -internal val playerParameterBuilder1925Fingerprint = fingerprint { +internal val BytecodePatchContext.playerParameterBuilder1925Method by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes( @@ -174,7 +181,7 @@ internal val playerParameterBuilder1925Fingerprint = fingerprint { /** * For targets 19.01 to 19.24. */ -internal val playerParameterBuilderLegacyFingerprint = fingerprint { +internal val BytecodePatchContext.playerParameterBuilderLegacyMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt index 3ec288910f..c1eb87c016 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/playerresponse/PlayerResponseMethodHookPatch.kt @@ -1,10 +1,8 @@ package app.revanced.patches.youtube.video.playerresponse -import app.revanced.patcher.Fingerprint import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.addInstructions import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.mutable.MutableMethod import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_23_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater @@ -13,6 +11,7 @@ import app.revanced.patches.youtube.misc.playservice.is_20_15_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_26_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_46_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch +import com.android.tools.smali.dexlib2.mutable.MutableMethod private val hooks = mutableSetOf() @@ -41,28 +40,28 @@ val playerResponseMethodHookPatch = bytecodePatch { ) apply { - val fingerprint : Fingerprint + val fingerprint: Fingerprint if (is_20_46_or_greater) { parameterIsShortAndOpeningOrPlaying = 13 - fingerprint = playerParameterBuilderFingerprint + fingerprint = playerParameterBuilderMethod } else if (is_20_26_or_greater) { parameterIsShortAndOpeningOrPlaying = 13 - fingerprint = playerParameterBuilder2026Fingerprint + fingerprint = playerParameterBuilder2026Method } else if (is_20_15_or_greater) { parameterIsShortAndOpeningOrPlaying = 13 - fingerprint = playerParameterBuilder2015Fingerprint + fingerprint = playerParameterBuilder2015Method } else if (is_20_10_or_greater) { parameterIsShortAndOpeningOrPlaying = 13 - fingerprint = playerParameterBuilder2010Fingerprint + fingerprint = playerParameterBuilder2010Method } else if (is_20_02_or_greater) { parameterIsShortAndOpeningOrPlaying = 12 - fingerprint = playerParameterBuilder2002Fingerprint + fingerprint = playerParameterBuilder2002Method } else if (is_19_23_or_greater) { parameterIsShortAndOpeningOrPlaying = 12 - fingerprint = playerParameterBuilder1925Fingerprint + fingerprint = playerParameterBuilder1925Method } else { parameterIsShortAndOpeningOrPlaying = 11 - fingerprint = playerParameterBuilderLegacyFingerprint + fingerprint = playerParameterBuilderLegacyMethod } playerResponseMethod = fingerprint.method diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/AdvancedVideoQualityMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/AdvancedVideoQualityMenuPatch.kt index f4da93c170..56c465267e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/AdvancedVideoQualityMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/AdvancedVideoQualityMenuPatch.kt @@ -60,7 +60,7 @@ internal val advancedVideoQualityMenuPatch = bytecodePatch { // region Patch for the old type of the video quality menu. // Used for regular videos when spoofing to old app version, // and for the Shorts quality flyout on newer app versions. - videoQualityMenuViewInflateFingerprint.let { + videoQualityMenuViewInflateMethod.let { it.method.apply { val checkCastIndex = it.instructionMatches.last().index val listViewRegister = getInstruction(checkCastIndex).registerA @@ -74,7 +74,7 @@ internal val advancedVideoQualityMenuPatch = bytecodePatch { } // Force YT to add the 'advanced' quality menu for Shorts. - videoQualityMenuOptionsFingerprint.let { + videoQualityMenuOptionsMethod.let { val patternMatch = it.instructionMatches val startIndex = patternMatch.first().index val insertIndex = patternMatch.last().index diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt index 418db723c9..faa87f4c99 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/Fingerprints.kt @@ -1,12 +1,19 @@ package app.revanced.patches.youtube.video.quality +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val videoQualityItemOnClickParentFingerprint = fingerprint { +internal val BytecodePatchContext.videoQualityItemOnClickParentMethod by gettingFirstMethodDeclaratively { returnType("V") instructions( addString("VIDEO_QUALITIES_MENU_BOTTOM_SHEET_FRAGMENT"), @@ -14,9 +21,9 @@ internal val videoQualityItemOnClickParentFingerprint = fingerprint { } /** - * Resolves to class found in [videoQualityItemOnClickFingerprint]. + * Resolves to class found in [videoQualityItemOnClickMethod]. */ -internal val videoQualityItemOnClickFingerprint = fingerprint { +internal val BytecodePatchContext.videoQualityItemOnClickMethod by gettingFirstMethodDeclaratively { returnType("V") parameterTypes( "Landroid/widget/AdapterView;", @@ -29,7 +36,7 @@ internal val videoQualityItemOnClickFingerprint = fingerprint { } } -internal val videoQualityMenuOptionsFingerprint = fingerprint { +internal val BytecodePatchContext.videoQualityMenuOptionsMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.STATIC) returnType("[L") parameterTypes("Landroid/content/Context", "L", "L") @@ -43,7 +50,7 @@ internal val videoQualityMenuOptionsFingerprint = fingerprint { literal { videoQualityQuickMenuAdvancedMenuDescription } } -internal val videoQualityMenuViewInflateFingerprint = fingerprint { +internal val BytecodePatchContext.videoQualityMenuViewInflateMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("L") parameterTypes("L", "L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt index c086283286..963ad0b221 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/RememberVideoQualityPatch.kt @@ -37,12 +37,12 @@ val rememberVideoQualityPatch = bytecodePatch { ListPreference( key = "revanced_video_quality_default_mobile", entriesKey = "revanced_video_quality_default_entries", - entryValuesKey = "revanced_video_quality_default_entry_values" + entryValuesKey = "revanced_video_quality_default_entry_values", ), ListPreference( key = "revanced_video_quality_default_wifi", entriesKey = "revanced_video_quality_default_entries", - entryValuesKey = "revanced_video_quality_default_entry_values" + entryValuesKey = "revanced_video_quality_default_entry_values", ), SwitchPreference("revanced_remember_video_quality_last_selected"), @@ -54,21 +54,21 @@ val rememberVideoQualityPatch = bytecodePatch { ListPreference( key = "revanced_shorts_quality_default_wifi", entriesKey = "revanced_shorts_quality_default_entries", - entryValuesKey = "revanced_shorts_quality_default_entry_values" + entryValuesKey = "revanced_shorts_quality_default_entry_values", ), SwitchPreference("revanced_remember_shorts_quality_last_selected"), - SwitchPreference("revanced_remember_video_quality_last_selected_toast") - ) + SwitchPreference("revanced_remember_video_quality_last_selected_toast"), + ), ) onCreateHook(EXTENSION_CLASS_DESCRIPTOR, "newVideoStarted") // Inject a call to remember the selected quality for Shorts. - videoQualityItemOnClickFingerprint.match( - videoQualityItemOnClickParentFingerprint.classDef + videoQualityItemOnClickMethod.match( + videoQualityItemOnClickParentMethod.classDef, ).method.addInstruction( 0, - "invoke-static { p3 }, $EXTENSION_CLASS_DESCRIPTOR->userChangedShortsQuality(I)V" + "invoke-static { p3 }, $EXTENSION_CLASS_DESCRIPTOR->userChangedShortsQuality(I)V", ) // Inject a call to remember the user selected quality for regular videos. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt index 448ffead3c..81e3d75306 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/CustomPlaybackSpeedPatch.kt @@ -7,14 +7,13 @@ import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.extensions.instructions import app.revanced.patcher.extensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.mutable.MutableField.Companion.toMutable import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.mapping.resourceMappingPatch import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.shared.misc.settings.preference.TextPreference -import app.revanced.patches.youtube.interaction.seekbar.customTapAndHoldFingerprint +import app.revanced.patches.youtube.interaction.seekbar.customTapAndHoldMethod import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch @@ -30,6 +29,7 @@ import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.immutable.ImmutableField +import com.android.tools.smali.dexlib2.mutable.MutableField.Companion.toMutable private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilter;" @@ -47,7 +47,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( lithoFilterPatch, versionCheckPatch, recyclerViewTreeHookPatch, - resourceMappingPatch + resourceMappingPatch, ) apply { @@ -59,9 +59,9 @@ internal val customPlaybackSpeedPatch = bytecodePatch( SwitchPreference("revanced_restore_old_speed_menu"), TextPreference( "revanced_custom_playback_speeds", - inputType = InputType.TEXT_MULTI_LINE - ) - ) + inputType = InputType.TEXT_MULTI_LINE, + ), + ), ) if (is_19_47_or_greater) { @@ -71,7 +71,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( } // Override the min/max speeds that can be used. - (if (is_20_34_or_greater) speedLimiterFingerprint else speedLimiterLegacyFingerprint).method.apply { + (if (is_20_34_or_greater) speedLimiterMethod else speedLimiterLegacyMethod).method.apply { val limitMinIndex = indexOfFirstLiteralInstructionOrThrow(0.25f) // Older unsupported targets use 2.0f and not 4.0f val limitMaxIndex = indexOfFirstLiteralInstructionOrThrow(4.0f) @@ -85,13 +85,13 @@ internal val customPlaybackSpeedPatch = bytecodePatch( // Turn off client side flag that use server provided min/max speeds. if (is_20_34_or_greater) { - serverSideMaxSpeedFeatureFlagFingerprint.method.returnEarly(false) + serverSideMaxSpeedFeatureFlagMethod.returnEarly(false) } // region Force old video quality menu. // Replace the speeds float array with custom speeds. - speedArrayGeneratorFingerprint.let { + speedArrayGeneratorMethod.let { val matches = it.instructionMatches it.method.apply { val playbackSpeedsArrayType = "$EXTENSION_CLASS_DESCRIPTOR->customPlaybackSpeeds:[F" @@ -101,7 +101,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( val originalArrayFetchDestination = matches[5].getInstruction().registerA replaceInstruction( originalArrayFetchIndex, - "sget-object v$originalArrayFetchDestination, $playbackSpeedsArrayType" + "sget-object v$originalArrayFetchDestination, $playbackSpeedsArrayType", ) val arrayLengthConstDestination = matches[3].getInstruction().registerA @@ -111,7 +111,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( """ sget-object v$arrayLengthConstDestination, $playbackSpeedsArrayType array-length v$arrayLengthConstDestination, v$arrayLengthConstDestination - """ + """, ) val sizeCallIndex = matches[0].index + 1 @@ -124,28 +124,28 @@ internal val customPlaybackSpeedPatch = bytecodePatch( // This is later used to call "showOldPlaybackSpeedMenu" on the instance. val instanceField = ImmutableField( - getOldPlaybackSpeedsFingerprint.originalClassDef.type, + getOldPlaybackSpeedsMethod.originalClassDef.type, "INSTANCE", - getOldPlaybackSpeedsFingerprint.originalClassDef.type, + getOldPlaybackSpeedsMethod.originalClassDef.type, AccessFlags.PUBLIC.value or AccessFlags.STATIC.value, null, null, null, ).toMutable() - getOldPlaybackSpeedsFingerprint.classDef.staticFields.add(instanceField) + getOldPlaybackSpeedsMethod.classDef.staticFields.add(instanceField) // Set the INSTANCE field to the instance of the class. // In order to prevent a conflict with another patch, add the instruction at index 1. - getOldPlaybackSpeedsFingerprint.method.addInstruction(1, "sput-object p0, $instanceField") + getOldPlaybackSpeedsMethod.addInstruction(1, "sput-object p0, $instanceField") // Get the "showOldPlaybackSpeedMenu" method. // This is later called on the field INSTANCE. - val showOldPlaybackSpeedMenuMethod = showOldPlaybackSpeedMenuFingerprint.match( - getOldPlaybackSpeedsFingerprint.classDef, + val showOldPlaybackSpeedMenuMethod = showOldPlaybackSpeedMenuMethod.match( + getOldPlaybackSpeedsMethod.classDef, ).method // Insert the call to the "showOldPlaybackSpeedMenu" method on the field INSTANCE. - showOldPlaybackSpeedMenuExtensionFingerprint.method.apply { + showOldPlaybackSpeedMenuExtensionMethod.apply { addInstructionsWithLabels( instructions.lastIndex, """ @@ -154,7 +154,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( return-void :not_null invoke-virtual { v0 }, $showOldPlaybackSpeedMenuMethod - """ + """, ) } @@ -171,7 +171,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( // region Custom tap and hold 2x speed. if (is_19_47_or_greater) { - customTapAndHoldFingerprint.let { + customTapAndHoldMethod.let { it.method.apply { val index = it.instructionMatches.first().index val register = getInstruction(index).registerA @@ -181,7 +181,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( """ invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->tapAndHoldSpeed()F move-result v$register - """ + """, ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt index c465bfb214..4670ccc81a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/custom/Fingerprints.kt @@ -1,32 +1,39 @@ package app.revanced.patches.youtube.video.speed.custom +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString import app.revanced.patcher.fieldAccess -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.newInstance import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import app.revanced.patches.shared.misc.mapping.ResourceType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getOldPlaybackSpeedsFingerprint = fingerprint { +internal val BytecodePatchContext.getOldPlaybackSpeedsMethod by gettingFirstMethodDeclaratively { parameterTypes("[L", "I") strings("menu_item_playback_speed") } -internal val showOldPlaybackSpeedMenuFingerprint = fingerprint { +internal val BytecodePatchContext.showOldPlaybackSpeedMenuMethod by gettingFirstMethodDeclaratively { instructions( ResourceType.STRING("varispeed_unavailable_message"), ) } -internal val showOldPlaybackSpeedMenuExtensionFingerprint = fingerprint { +internal val BytecodePatchContext.showOldPlaybackSpeedMenuExtensionMethod by gettingFirstMethodDeclaratively { custom { method, _ -> method.name == "showOldPlaybackSpeedMenu" } } -internal val serverSideMaxSpeedFeatureFlagFingerprint = fingerprint { +internal val BytecodePatchContext.serverSideMaxSpeedFeatureFlagMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("Z") instructions( @@ -34,7 +41,7 @@ internal val serverSideMaxSpeedFeatureFlagFingerprint = fingerprint { ) } -internal val speedArrayGeneratorFingerprint = fingerprint { +internal val BytecodePatchContext.speedArrayGeneratorMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returnType("[L") parameterTypes("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;") @@ -42,7 +49,7 @@ internal val speedArrayGeneratorFingerprint = fingerprint { methodCall(name = "size", returnType = "I"), newInstance("Ljava/text/DecimalFormat;"), addString("0.0#"), - 7(), + 7L(), opcode(Opcode.NEW_ARRAY), fieldAccess(definingClass = "/PlayerConfigModel;", type = "[F"), ) @@ -51,7 +58,7 @@ internal val speedArrayGeneratorFingerprint = fingerprint { /** * 20.34+ */ -internal val speedLimiterFingerprint = fingerprint { +internal val BytecodePatchContext.speedLimiterMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("F", "Lcom/google/android/libraries/youtube/innertube/model/media/PlayerConfigModel;") @@ -64,7 +71,7 @@ internal val speedLimiterFingerprint = fingerprint { /** * 20.33 and lower. */ -internal val speedLimiterLegacyFingerprint = fingerprint { +internal val BytecodePatchContext.speedLimiterLegacyMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("F") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt index 50cf5adb08..e939f58c61 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt @@ -1,9 +1,16 @@ package app.revanced.patches.youtube.video.speed.remember +import app.revanced.patcher.accessFlags import app.revanced.patcher.addString -import app.revanced.patcher.fingerprint +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType -internal val initializePlaybackSpeedValuesFingerprint = fingerprint { +internal val BytecodePatchContext.initializePlaybackSpeedValuesMethod by gettingFirstMethodDeclaratively { parameterTypes("[L", "I") instructions( addString("menu_item_playback_speed"), diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt index 3ec1b8b6ad..315da7fa0a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/RememberPlaybackSpeedPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.youtube.video.speed.remember +import app.revanced.patcher.extensions.ExternalLabel import app.revanced.patcher.extensions.addInstructionsWithLabels import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.extensions.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.ListPreference @@ -24,7 +24,7 @@ internal val rememberPlaybackSpeedPatch = bytecodePatch { settingsPatch, addResourcesPatch, videoInformationPatch, - customPlaybackSpeedPatch + customPlaybackSpeedPatch, ) apply { @@ -37,11 +37,11 @@ internal val rememberPlaybackSpeedPatch = bytecodePatch { // Entries and values are set by the extension code based on the actual speeds available. entriesKey = null, entryValuesKey = null, - tag = "app.revanced.extension.youtube.settings.preference.CustomVideoSpeedListPreference" + tag = "app.revanced.extension.youtube.settings.preference.CustomVideoSpeedListPreference", ), SwitchPreference("revanced_remember_playback_speed_last_selected"), - SwitchPreference("revanced_remember_playback_speed_last_selected_toast") - ) + SwitchPreference("revanced_remember_playback_speed_last_selected_toast"), + ), ) onCreateHook(EXTENSION_CLASS_DESCRIPTOR, "newVideoStarted") @@ -54,7 +54,7 @@ internal val rememberPlaybackSpeedPatch = bytecodePatch { /* * Hook the code that is called when the playback speeds are initialized, and sets the playback speed */ - initializePlaybackSpeedValuesFingerprint.method.apply { + initializePlaybackSpeedValuesMethod.apply { // Infer everything necessary for calling the method setPlaybackSpeed(). val onItemClickListenerClassFieldReference = getInstruction(0).reference diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt index f4c498f405..61217424a5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/Fingerprints.kt @@ -1,13 +1,20 @@ package app.revanced.patches.youtube.video.videoid -import app.revanced.patcher.fingerprint +import app.revanced.patcher.accessFlags +import app.revanced.patcher.gettingFirstMethodDeclaratively +import app.revanced.patcher.instructions +import app.revanced.patcher.invoke import app.revanced.patcher.literal import app.revanced.patcher.methodCall import app.revanced.patcher.opcode +import app.revanced.patcher.opcodes +import app.revanced.patcher.parameterTypes +import app.revanced.patcher.patch.BytecodePatchContext +import app.revanced.patcher.returnType import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val videoIdFingerprint = fingerprint { +internal val BytecodePatchContext.videoIdMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returnType("V") parameterTypes("L") @@ -20,7 +27,7 @@ internal val videoIdFingerprint = fingerprint { ) } -internal val videoIdBackgroundPlayFingerprint = fingerprint { +internal val BytecodePatchContext.videoIdBackgroundPlayMethod by gettingFirstMethodDeclaratively { accessFlags(AccessFlags.DECLARED_SYNCHRONIZED, AccessFlags.FINAL, AccessFlags.PUBLIC) returnType("V") parameterTypes("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt index e7f0ae4579..18511432c2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoid/VideoIdPatch.kt @@ -3,13 +3,13 @@ package app.revanced.patches.youtube.video.videoid import app.revanced.patcher.extensions.addInstruction import app.revanced.patcher.extensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.mutable.MutableMethod import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.video.playerresponse.Hook import app.revanced.patches.youtube.video.playerresponse.addPlayerResponseMethodHook import app.revanced.patches.youtube.video.playerresponse.playerResponseMethodHookPatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import com.android.tools.smali.dexlib2.mutable.MutableMethod /** * Hooks the new video id when the video changes. @@ -92,7 +92,7 @@ val videoIdPatch = bytecodePatch( ) apply { - videoIdFingerprint.match(videoIdParentFingerprint.originalClassDef).let { + videoIdMethod.match(videoIdParentFingerprint.originalClassDef).let { it.method.apply { videoIdMethod = this val index = it.instructionMatches.first().index @@ -101,7 +101,7 @@ val videoIdPatch = bytecodePatch( } } - videoIdBackgroundPlayFingerprint.let { + videoIdBackgroundPlayMethod.let { it.method.apply { backgroundPlaybackMethod = this val index = it.instructionMatches.first().index @@ -110,4 +110,4 @@ val videoIdPatch = bytecodePatch( } } } -} \ No newline at end of file +}