From 724e6d61b2ecd868c1a9a37d465a688e83a74799 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 12 Sep 2025 20:26:39 +0400 Subject: [PATCH 01/59] feat: Update to patcher v22 --- .../extension/shared/ResourceType.java | 57 +++++ .../app/revanced/extension/shared/Utils.java | 121 +++++----- .../extension/shared/checks/Check.java | 5 +- .../fixes/redgifs/BaseFixRedgifsApiPatch.java | 1 - .../AbstractPreferenceFragment.java | 3 +- .../preference/ColorPickerPreference.java | 18 +- .../CustomDialogListPreference.java | 12 +- .../spoof/requests/StreamingDataRequest.java | 27 +-- .../createbutton/HideCreateButtonPatch.java | 5 +- .../spotify/shared/ComponentFilters.java | 10 +- .../app/revanced/extension/twitch/Utils.java | 8 +- .../settings/AppCompatActivityHook.java | 11 +- .../patches/AlternativeThumbnailsPatch.java | 11 +- .../youtube/patches/ChangeHeaderPatch.java | 5 +- .../youtube/patches/DownloadsPatch.java | 2 +- .../HidePlayerOverlayButtonsPatch.java | 14 +- .../youtube/patches/HideSeekbarPatch.java | 10 + .../youtube/patches/MiniplayerPatch.java | 3 +- .../patches/NavigationButtonsPatch.java | 7 + .../OpenShortsInRegularPlayerPatch.java | 9 - .../OpenVideosFullscreenHookPatch.java | 8 +- .../youtube/patches/PlayerControlsPatch.java | 2 +- .../RemoveTrackingQueryParameterPatch.java | 9 +- .../RemoveViewerDiscretionDialogPatch.java | 24 +- .../youtube/patches/ShortsAutoplayPatch.java | 19 +- .../youtube/patches/VersionCheckPatch.java | 5 +- .../patches/components/ButtonsFilter.java | 20 +- .../components/LayoutComponentsFilter.java | 31 ++- .../patches/components/LithoFilterPatch.java | 210 ++++++++++++++--- .../ReturnYouTubeDislikeFilter.java | 19 +- .../patches/components/ShortsFilter.java | 55 +++-- .../quality/RememberVideoQualityPatch.java | 1 - .../patches/theme/SeekbarColorPatch.java | 5 +- .../ReturnYouTubeDislike.java | 3 +- .../youtube/settings/LicenseActivityHook.java | 11 +- .../settings/SearchViewController.java | 27 ++- .../extension/youtube/settings/Settings.java | 8 +- .../ExternalDownloaderPreference.java | 3 +- .../ReVancedPreferenceFragment.java | 12 +- .../youtube/shared/NavigationBar.java | 4 +- .../PlayerControlsVisibilityObserver.kt | 5 +- .../extension/youtube/shared/PlayerType.kt | 1 - .../SegmentPlaybackController.java | 59 ++--- .../SegmentCategoryListPreference.java | 7 +- .../sponsorblock/ui/CreateSegmentButton.java | 1 + .../sponsorblock/ui/NewSegmentLayout.java | 8 +- .../sponsorblock/ui/SkipSponsorButton.java | 7 +- .../ui/SponsorBlockViewController.java | 15 +- .../youtube/sponsorblock/ui/VotingButton.java | 3 +- .../SwipeControlsHostActivity.kt | 5 +- .../controller/SwipeZonesController.kt | 4 +- .../views/SwipeControlsOverlayLayout.kt | 9 +- .../videoplayer/VideoQualityDialogButton.java | 9 +- gradle/libs.versions.toml | 4 +- patches/api/patches.api | 213 ++++++----------- patches/build.gradle.kts | 6 + .../ChangeDataDirectoryLocationPatch.kt | 19 -- .../TransformInstructionsPatch.kt | 2 +- .../revanced/patches/amazon/Fingerprints.kt | 2 +- .../patches/angulus/ads/Fingerprints.kt | 2 +- .../backdrops/misc/pro/Fingerprints.kt | 19 -- .../backdrops/misc/pro/ProUnlockPatch.kt | 24 -- .../bandcamp/limitations/Fingerprints.kt | 2 +- .../cieid/restrictions/root/Fingerprints.kt | 2 +- .../patches/cricbuzz/ads/Fingerprints.kt | 6 +- .../patches/crunchyroll/ads/Fingerprints.kt | 2 +- .../patches/duolingo/ad/DisableAdsPatch.kt | 20 +- .../patches/duolingo/ad/Fingerprints.kt | 6 +- .../duolingo/debug/EnableDebugMenuPatch.kt | 2 +- .../patches/duolingo/debug/Fingerprints.kt | 3 +- .../facebook/ads/mainfeed/Fingerprints.kt | 6 +- .../ads/mainfeed/HideSponsoredStoriesPatch.kt | 2 +- .../facebook/ads/story/Fingerprints.kt | 4 +- .../detection/bootloader/Fingerprints.kt | 4 +- .../detection/root/Fingerprints.kt | 2 +- .../customtabs/EnableCustomTabsPatch.kt | 2 +- .../googlenews/customtabs/Fingerprints.kt | 2 +- .../googlenews/misc/gms/Fingerprints.kt | 2 +- .../googlephotos/misc/backup/Fingerprints.kt | 2 +- .../misc/features/Fingerprints.kt | 2 +- .../googlephotos/misc/gms/Fingerprints.kt | 2 +- .../misc/preferences/Fingerprints.kt | 8 - ...oreHiddenBackUpWhileChargingTogglePatch.kt | 30 --- .../restrictions/Fingerprints.kt | 2 +- .../restrictions/RemoveDeviceRestrictions.kt | 2 +- .../patches/hexeditor/ad/Fingerprints.kt | 2 +- .../iconpackstudio/misc/pro/Fingerprints.kt | 2 +- .../idaustria/detection/root/Fingerprints.kt | 6 +- .../detection/signature/Fingerprints.kt | 2 +- .../patches/inshorts/ad/Fingerprints.kt | 2 +- .../instagram/hide/navigation/Fingerprints.kt | 4 +- .../instagram/hide/stories/Fingerprints.kt | 3 +- .../instagram/misc/signature/Fingerprints.kt | 4 +- .../patches/irplus/ad/Fingerprints.kt | 3 +- .../lightroom/misc/login/Fingerprints.kt | 2 +- .../lightroom/misc/premium/Fingerprints.kt | 2 +- .../detection/license/Fingerprints.kt | 2 +- .../detection/signature/Fingerprints.kt | 2 +- .../memegenerator/misc/pro/Fingerprints.kt | 2 +- .../patches/messenger/inbox/Fingerprints.kt | 4 +- .../DisableSwitchingEmojiToStickerPatch.kt | 28 --- .../inputfield/DisableTypingIndicatorPatch.kt | 16 -- .../messenger/inputfield/Fingerprints.kt | 31 --- .../patches/messenger/layout/Fingerprints.kt | 2 +- .../patches/messenger/metaai/Fingerprints.kt | 8 +- .../messenger/metaai/RemoveMetaAIPatch.kt | 2 +- .../messenger/navbar/RemoveMetaAITabPatch.kt | 12 - .../revanced/patches/meta/ads/Fingerprints.kt | 26 +-- .../revanced/patches/meta/ads/HideAdsPatch.kt | 12 - .../mifitness/misc/locale/Fingerprints.kt | 2 +- .../misc/locale/ForceEnglishLocalePatch.kt | 2 +- .../mifitness/misc/login/Fingerprints.kt | 2 +- .../patches/music/ad/video/Fingerprints.kt | 2 +- .../patches/music/ad/video/HideVideoAds.kt | 2 +- .../audio/exclusiveaudio/Fingerprints.kt | 2 +- .../permanentrepeat/Fingerprints.kt | 2 +- .../permanentrepeat/PermanentRepeatPatch.kt | 2 +- .../permanentshuffle/Fingerprints.kt | 19 -- .../permanentshuffle/PermanentShufflePatch.kt | 17 -- .../layout/compactheader/Fingerprints.kt | 3 +- .../layout/compactheader/HideCategoryBar.kt | 2 +- .../music/layout/premium/Fingerprints.kt | 4 +- .../layout/premium/HideGetPremiumPatch.kt | 2 +- .../layout/upgradebutton/Fingerprints.kt | 3 +- .../upgradebutton/RemoveUpgradeButtonPatch.kt | 4 +- .../music/misc/androidauto/Fingerprints.kt | 2 +- .../misc/backgroundplayback/Fingerprints.kt | 4 +- .../extension/hooks/ApplicationInitHook.kt | 5 +- .../patches/music/misc/gms/Fingerprints.kt | 2 +- .../patches/music/misc/spoof/Fingerprints.kt | 8 +- .../music/misc/spoof/SpoofClientPatch.kt | 6 +- .../myexpenses/misc/pro/Fingerprints.kt | 2 +- .../patches/myfitnesspal/ads/Fingerprints.kt | 4 +- .../nfctoolsse/misc/pro/Fingerprints.kt | 11 - .../nfctoolsse/misc/pro/UnlockProPatch.kt | 20 -- .../revanced/patches/nunl/ads/Fingerprints.kt | 6 +- .../nunl/firebase/SpoofCertificatePatch.kt | 4 +- .../patches/nyx/misc/pro/Fingerprints.kt | 9 - .../patches/nyx/misc/pro/UnlockProPatch.kt | 20 -- .../misc/fix/crash/Fingerprints.kt | 2 +- .../orfon/detection/root/Fingerprints.kt | 2 +- .../patches/pandora/ads/Fingerprints.kt | 4 +- .../patches/pandora/misc/Fingerprints.kt | 2 +- .../detection/deviceid/Fingerprints.kt | 2 +- .../detection/signature/Fingerprints.kt | 2 +- .../signature/SignatureDetectionPatch.kt | 2 +- .../photomath/misc/annoyances/Fingerprints.kt | 2 +- .../misc/unlock/bookpoint/Fingerprints.kt | 2 +- .../misc/unlock/plus/Fingerprints.kt | 2 +- .../patches/piccomafr/misc/Fingerprints.kt | 2 +- .../piccomafr/tracking/Fingerprints.kt | 7 +- .../patches/pixiv/ads/Fingerprints.kt | 2 +- .../patches/primevideo/ads/Fingerprints.kt | 4 +- .../primevideo/video/speed/Fingerprints.kt | 4 +- .../purchasereminder/Fingerprints.kt | 2 +- .../reddit/ad/comments/Fingerprints.kt | 2 +- .../patches/reddit/ad/general/Fingerprints.kt | 4 +- .../baconreader/api/Fingerprints.kt | 6 +- .../baconreader/fix/redgifs/Fingerprints.kt | 6 +- .../boostforreddit/ads/Fingerprints.kt | 4 +- .../boostforreddit/api/Fingerprints.kt | 4 +- .../fix/downloads/Fingerprints.kt | 2 +- .../FixAudioMissingInDownloadsPatch.kt | 2 +- .../fix/redgifs/Fingerprints.kt | 2 +- .../boostforreddit/fix/slink/Fingerprints.kt | 4 +- .../infinityforreddit/api/Fingerprints.kt | 2 +- .../subscription/Fingerprints.kt | 13 +- .../joeyforreddit/ads/Fingerprints.kt | 2 +- .../joeyforreddit/api/Fingerprints.kt | 4 +- .../detection/piracy/Fingerprints.kt | 2 +- .../redditisfun/api/Fingerprints.kt | 7 +- .../relayforreddit/api/Fingerprints.kt | 12 +- .../relayforreddit/api/SpoofClientPatch.kt | 4 +- .../customclients/slide/api/Fingerprints.kt | 2 +- .../customclients/sync/ads/DisableAdsPatch.kt | 2 +- .../customclients/sync/ads/Fingerprints.kt | 2 +- .../sync/detection/piracy/Fingerprints.kt | 2 +- .../annoyances/startup/Fingerprints.kt | 2 +- .../sync/syncforreddit/api/Fingerprints.kt | 8 +- .../syncforreddit/api/SpoofClientPatch.kt | 4 +- .../syncforreddit/fix/redgifs/Fingerprints.kt | 7 +- .../syncforreddit/fix/slink/Fingerprints.kt | 4 +- .../fix/thumbnail/Fingerprints.kt | 2 +- .../syncforreddit/fix/user/Fingerprints.kt | 12 +- .../fix/user/UseUserEndpointPatch.kt | 2 +- .../syncforreddit/fix/video/Fingerprints.kt | 2 +- .../fix/video/FixVideoDownloadsPatch.kt | 6 +- .../fix/video/FixVideoDownloadsPatch.kt | 18 -- .../disablescreenshotpopup/Fingerprints.kt | 2 +- .../reddit/layout/premiumicon/Fingerprints.kt | 2 +- .../premiumicon/UnlockPremiumIconPatch.kt | 6 - .../reddit/misc/tracking/url/Fingerprints.kt | 2 +- .../detection/root/Fingerprints.kt | 2 +- .../revanced/patches/shared/Fingerprints.kt | 14 +- .../shared/misc/checks/Fingerprints.kt | 4 +- .../shared/misc/extension/Fingerprints.kt | 2 +- .../misc/extension/SharedExtensionPatch.kt | 19 +- .../misc/fix/verticalscroll/Fingerprints.kt | 2 +- .../fix/verticalscroll/VerticalScrollPatch.kt | 18 +- .../patches/shared/misc/gms/Fingerprints.kt | 14 +- .../shared/misc/gms/GmsCoreSupportPatch.kt | 53 ++--- .../misc/mapping/ResourceMappingPatch.kt | 133 +++++++---- .../misc/pairip/license/Fingerprints.kt | 4 +- .../shared/misc/settings/Fingerprints.kt | 4 +- .../shared/misc/settings/SettingsPatch.kt | 11 +- .../settings/preference/ListPreference.kt | 6 +- .../patches/shared/misc/spoof/Fingerprints.kt | 78 ++++--- .../misc/spoof/SpoofVideoStreamsPatch.kt | 117 +++++----- .../functionality/filesize/Fingerprints.kt | 2 +- .../filesize/RemoveFileSizeLimitPatch.kt | 2 +- .../patches/songpal/badge/Fingerprints.kt | 4 +- .../patches/soundcloud/ad/Fingerprints.kt | 5 +- .../patches/soundcloud/ad/HideAdsPatch.kt | 2 +- .../soundcloud/analytics/Fingerprints.kt | 2 +- .../soundcloud/offlinesync/Fingerprints.kt | 4 +- .../patches/soundcloud/shared/Fingerprints.kt | 3 +- .../layout/hide/createbutton/Fingerprints.kt | 6 +- .../spotify/layout/theme/Fingerprints.kt | 8 +- .../spotify/lite/ondemand/OnDemandPatch.kt | 9 - .../spotify/misc/extension/ExtensionPatch.kt | 2 +- .../spotify/misc/extension/Fingerprints.kt | 2 +- .../patches/spotify/misc/extension/Hooks.kt | 32 +-- .../patches/spotify/misc/fix/Fingerprints.kt | 11 +- .../spotify/misc/fix/SpoofPackageInfoPatch.kt | 11 - .../spotify/misc/fix/SpoofSignaturePatch.kt | 11 - .../spotify/misc/fix/login/Fingerprints.kt | 5 +- .../misc/lyrics/ChangeLyricsProviderPatch.kt | 15 +- .../spotify/misc/lyrics/Fingerprints.kt | 2 +- .../spotify/misc/privacy/Fingerprints.kt | 8 +- .../spotify/misc/widgets/Fingerprints.kt | 2 +- .../spotify/navbar/PremiumNavbarTabPatch.kt | 9 - .../patches/spotify/shared/Fingerprints.kt | 2 +- .../strava/subscription/Fingerprints.kt | 2 +- .../subscription/UnlockSubscriptionPatch.kt | 2 +- .../DisableSubscriptionSuggestionsPatch.kt | 2 +- .../patches/strava/upselling/Fingerprints.kt | 2 +- .../swissid/integritycheck/Fingerprints.kt | 2 +- .../ticktick/misc/themeunlock/Fingerprints.kt | 4 +- .../patches/tiktok/feedfilter/Fingerprints.kt | 4 +- .../interaction/cleardisplay/Fingerprints.kt | 2 +- .../interaction/downloads/Fingerprints.kt | 8 +- .../interaction/seekbar/Fingerprints.kt | 4 +- .../tiktok/interaction/speed/Fingerprints.kt | 4 +- .../login/disablerequirement/Fingerprints.kt | 4 +- .../misc/login/fixgoogle/Fingerprints.kt | 4 +- .../tiktok/misc/settings/Fingerprints.kt | 10 +- .../tiktok/misc/spoof/sim/SpoofSimPatch.kt | 2 +- .../patches/tiktok/shared/Fingerprints.kt | 4 +- .../revanced/patches/trakt/Fingerprints.kt | 6 +- .../tudortmund/lockscreen/Fingerprints.kt | 2 +- .../annoyances/notifications/Fingerprints.kt | 2 +- .../tumblr/annoyances/popups/Fingerprints.kt | 2 +- .../tumblr/featureflags/Fingerprints.kt | 2 +- .../featureflags/OverrideFeatureFlagsPatch.kt | 2 +- .../patches/tumblr/fixes/Fingerprints.kt | 4 +- .../tumblr/fixes/FixOldVersionsPatch.kt | 2 +- .../FilterTimelineObjectsPatch.kt | 4 +- .../tumblr/timelinefilter/Fingerprints.kt | 6 +- .../patches/twitch/ad/audio/Fingerprints.kt | 2 +- .../twitch/ad/embedded/Fingerprints.kt | 2 +- .../patches/twitch/ad/shared/util/AdPatch.kt | 2 +- .../patches/twitch/ad/video/Fingerprints.kt | 6 +- .../twitch/chat/antidelete/Fingerprints.kt | 7 +- .../twitch/chat/autoclaim/Fingerprints.kt | 2 +- .../patches/twitch/debug/Fingerprints.kt | 6 +- .../twitch/misc/settings/Fingerprints.kt | 8 +- .../interaction/downloads/Fingerprints.kt | 7 +- .../downloads/UnlockDownloadsPatch.kt | 31 +-- .../twitter/layout/viewcount/Fingerprints.kt | 2 +- .../misc/dynamiccolor/DynamicColorPatch.kt | 5 +- .../twitter/misc/hook/json/Fingerprints.kt | 6 +- .../twitter/misc/hook/json/JsonHookPatch.kt | 18 +- .../links/ChangeLinkSharingDomainPatch.kt | 8 +- .../twitter/misc/links/Fingerprints.kt | 10 +- .../patches/vsco/misc/pro/Fingerprints.kt | 11 - .../patches/vsco/misc/pro/UnlockProPatch.kt | 17 -- .../misc/firebasegetcert/Fingerprints.kt | 4 +- .../warnwetter/misc/promocode/Fingerprints.kt | 2 +- .../patches/willhaben/ads/Fingerprints.kt | 4 +- .../patches/willhaben/ads/HideAdsPatch.kt | 2 +- .../windyapp/misc/unlockpro/Fingerprints.kt | 10 - .../windyapp/misc/unlockpro/UnlockProPatch.kt | 22 -- .../youtube/ad/general/Fingerprints.kt | 2 +- .../youtube/ad/general/HideAdsPatch.kt | 11 +- .../youtube/ad/getpremium/Fingerprints.kt | 2 +- .../ad/getpremium/HideGetPremiumPatch.kt | 2 +- .../patches/youtube/ad/video/Fingerprints.kt | 5 +- .../copyvideourl/CopyVideoUrlPatch.kt | 2 +- .../interaction/dialog/Fingerprints.kt | 21 +- .../RemoveViewerDiscretionDialogPatch.kt | 22 +- .../DisableChapterSkipDoubleTapPatch.kt | 7 +- .../interaction/doubletap/Fingerprints.kt | 4 +- .../interaction/downloads/DownloadsPatch.kt | 5 +- .../interaction/downloads/Fingerprints.kt | 9 +- .../seekbar/EnableSeekbarTappingPatch.kt | 56 +++-- .../seekbar/EnableSlideToSeekPatch.kt | 28 +-- .../interaction/seekbar/Fingerprints.kt | 101 +++++--- .../interaction/seekbar/HideSeekbarPatch.kt | 20 +- .../seekbar/SeekbarThumbnailsPatch.kt | 1 + .../interaction/swipecontrols/Fingerprints.kt | 15 +- .../swipecontrols/SwipeControlsPatch.kt | 21 +- .../layout/autocaptions/AutoCaptionsPatch.kt | 2 +- .../layout/autocaptions/Fingerprints.kt | 6 +- .../layout/branding/CustomBrandingPatch.kt | 2 +- .../branding/header/ChangeHeaderPatch.kt | 8 +- .../layout/buttons/action/HideButtonsPatch.kt | 42 ++-- .../layout/buttons/navigation/Fingerprints.kt | 63 +++-- .../navigation/NavigationButtonsPatch.kt | 101 ++++---- .../layout/buttons/overlay/Fingerprints.kt | 39 ++-- .../overlay/HidePlayerOverlayButtonsPatch.kt | 110 +++++---- .../formfactor/ChangeFormFactorPatch.kt | 48 ++-- .../youtube/layout/formfactor/Fingerprints.kt | 37 +-- .../hide/endscreencards/Fingerprints.kt | 13 +- .../endscreencards/HideEndscreenCardsPatch.kt | 8 +- .../hide/endscreensuggestion/Fingerprints.kt | 6 +- .../HideEndScreenSuggestedVideoPatch.kt | 2 +- .../fullscreenambientmode/Fingerprints.kt | 2 +- .../layout/hide/general/Fingerprints.kt | 103 ++++----- .../hide/general/HideLayoutComponentsPatch.kt | 181 +++++++-------- .../layout/hide/infocards/Fingerprints.kt | 15 +- .../hide/infocards/HideInfoCardsPatch.kt | 65 +++--- .../hide/relatedvideooverlay/Fingerprints.kt | 11 +- .../HideRelatedVideoOverlayPatch.kt | 23 +- .../DisableRollingNumberAnimationPatch.kt | 30 +-- .../layout/hide/seekbar/HideSeekbarPatch.kt | 11 - .../layout/hide/shorts/Fingerprints.kt | 55 +++-- .../hide/shorts/HideShortsComponentsPatch.kt | 157 +++++++------ .../DisableSignInToTvPatchPopup.kt | 10 - .../hide/signintotvpopup/Fingerprints.kt | 14 +- .../DisableSuggestedVideoEndScreenPatch.kt | 9 - .../youtube/layout/hide/time/Fingerprints.kt | 28 ++- .../layout/hide/time/HideTimestampPatch.kt | 6 +- .../youtube/layout/miniplayer/Fingerprints.kt | 169 ++++++++------ .../layout/miniplayer/MiniplayerPatch.kt | 215 ++++-------------- .../layout/panels/popup/Fingerprints.kt | 2 +- .../PlayerControlsBackgroundPatch.kt | 12 - .../layout/player/fullscreen/Fingerprints.kt | 42 +++- .../player/fullscreen/OpenVideosFullscreen.kt | 9 - .../OpenVideosFullscreenHookPatch.kt | 43 +++- .../fullscreen/OpenVideosFullscreenPatch.kt | 10 +- .../CustomPlayerOverlayOpacityPatch.kt | 60 ++--- .../layout/player/overlay/Fingerprints.kt | 18 +- .../returnyoutubedislike/Fingerprints.kt | 63 +++-- .../ReturnYouTubeDislikePatch.kt | 67 +++--- .../youtube/layout/searchbar/Fingerprints.kt | 20 +- .../layout/searchbar/WideSearchbarPatch.kt | 46 ++-- .../youtube/layout/seekbar/Fingerprints.kt | 155 ++++++------- .../layout/seekbar/SeekbarColorPatch.kt | 151 +++++------- .../layout/shortsautoplay/Fingerprints.kt | 69 +++--- .../shortsautoplay/ShortsAutoplayPatch.kt | 33 ++- .../layout/shortsplayer/Fingerprints.kt | 47 ++-- .../OpenShortsInRegularPlayerPatch.kt | 85 +++---- .../layout/sponsorblock/Fingerprints.kt | 67 +++--- .../layout/sponsorblock/SponsorBlockPatch.kt | 166 +++++++------- .../layout/spoofappversion/Fingerprints.kt | 32 ++- .../spoofappversion/SpoofAppVersionPatch.kt | 63 ++--- .../layout/startpage/ChangeStartPagePatch.kt | 24 +- .../youtube/layout/startpage/Fingerprints.kt | 23 +- .../DisableResumingShortsOnStartupPatch.kt | 40 ++-- .../layout/startupshortsreset/Fingerprints.kt | 36 ++- .../layout/tablet/EnableTabletLayoutPatch.kt | 9 - .../youtube/layout/theme/Fingerprints.kt | 59 +++-- .../layout/theme/LithoColorHookPatch.kt | 8 +- .../youtube/layout/theme/ThemePatch.kt | 22 +- .../BackgroundPlaybackPatch.kt | 33 ++- .../misc/backgroundplayback/Fingerprints.kt | 27 ++- .../youtube/misc/debugging/Fingerprints.kt | 15 +- .../misc/dimensions/spoof/Fingerprints.kt | 8 +- .../spoof/SpoofDeviceDimensionsPatch.kt | 2 +- .../extension/hooks/ApplicationInitHook.kt | 6 +- .../fix/backtoexitgesture/Fingerprints.kt | 54 ++--- .../FixBackToExitGesturePatch.kt | 16 +- .../fix/playback/SpoofVideoStreamsPatch.kt | 9 - .../fix/playback/UserAgentClientSpoofPatch.kt | 9 - .../misc/fix/playbackspeed/Fingerprints.kt | 2 +- .../gms/AccountCredentialsInvalidTextPatch.kt | 43 +--- .../patches/youtube/misc/gms/Fingerprints.kt | 30 ++- .../misc/hapticfeedback/Fingerprints.kt | 8 +- .../youtube/misc/imageurlhook/Fingerprints.kt | 18 +- .../misc/links/BypassURLRedirectsPatch.kt | 48 +--- .../youtube/misc/links/Fingerprints.kt | 76 ++----- .../youtube/misc/litho/filter/Fingerprints.kt | 64 ++++-- .../misc/litho/filter/LithoFilterPatch.kt | 73 +++--- .../youtube/misc/navigation/Fingerprints.kt | 88 ++++--- .../misc/navigation/NavigationBarHookPatch.kt | 161 ++++++------- .../misc/playercontrols/Fingerprints.kt | 128 ++++++----- .../PlayerControlsOverlayVisibilityPatch.kt | 4 +- .../playercontrols/PlayerControlsPatch.kt | 161 ++++++------- .../youtube/misc/playertype/Fingerprints.kt | 62 +++-- .../misc/playertype/PlayerTypeHookPatch.kt | 92 +++++--- .../misc/playservice/VersionCheckPatch.kt | 39 +++- .../youtube/misc/privacy/Fingerprints.kt | 77 ++++--- .../RemoveTrackingQueryParameterPatch.kt | 49 ++-- .../recyclerviewtree/hook/Fingerprints.kt | 3 +- .../hook/RecyclerViewTreeHookPatch.kt | 2 +- .../youtube/misc/settings/Fingerprints.kt | 29 ++- .../youtube/misc/settings/SettingsPatch.kt | 40 ++-- .../misc/zoomhaptics/ZoomHapticsPatch.kt | 11 - .../patches/youtube/shared/Fingerprints.kt | 94 ++++---- .../youtube/video/audio/Fingerprints.kt | 4 +- .../youtube/video/information/Fingerprints.kt | 73 ++++-- .../information/VideoInformationPatch.kt | 37 +-- .../video/playerresponse/Fingerprints.kt | 63 +++-- .../PlayerResponseMethodHookPatch.kt | 6 +- .../quality/AdvancedVideoQualityMenuPatch.kt | 43 ++-- .../youtube/video/quality/Fingerprints.kt | 13 +- .../quality/RememberVideoQualityPatch.kt | 20 +- .../quality/VideoQualityDialogButtonPatch.kt | 2 +- .../speed/button/PlaybackSpeedButtonPatch.kt | 2 +- .../speed/custom/CustomPlaybackSpeedPatch.kt | 115 ++++------ .../video/speed/custom/Fingerprints.kt | 69 +++--- .../video/speed/remember/Fingerprints.kt | 7 +- .../youtube/video/videoid/Fingerprints.kt | 57 +++-- .../youtube/video/videoid/VideoIdPatch.kt | 36 ++- .../RestoreOldVideoQualityMenuPatch.kt | 10 - .../yuka/misc/unlockpremium/Fingerprints.kt | 20 -- .../misc/unlockpremium/UnlockPremiumPatch.kt | 23 -- .../kotlin/app/revanced/util/BytecodeUtils.kt | 121 ++++++---- .../resources/addresources/values/arrays.xml | 8 - .../resources/addresources/values/strings.xml | 6 + 420 files changed, 4192 insertions(+), 4374 deletions(-) create mode 100644 extensions/shared/library/src/main/java/app/revanced/extension/shared/ResourceType.java delete mode 100644 patches/src/main/kotlin/app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/meta/ads/HideAdsPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofSignaturePatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatch.kt diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/ResourceType.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/ResourceType.java new file mode 100644 index 0000000000..48032017a4 --- /dev/null +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/ResourceType.java @@ -0,0 +1,57 @@ +package app.revanced.extension.shared; + +import java.util.HashMap; +import java.util.Map; + +public enum ResourceType { + ANIM("anim"), + ANIMATOR("animator"), + ARRAY("array"), + ATTR("attr"), + BOOL("bool"), + COLOR("color"), + DIMEN("dimen"), + DRAWABLE("drawable"), + FONT("font"), + FRACTION("fraction"), + ID("id"), + INTEGER("integer"), + INTERPOLATOR("interpolator"), + LAYOUT("layout"), + MENU("menu"), + MIPMAP("mipmap"), + NAVIGATION("navigation"), + PLURALS("plurals"), + RAW("raw"), + STRING("string"), + STYLE("style"), + STYLEABLE("styleable"), + TRANSITION("transition"), + VALUES("values"), + XML("xml"); + + private static final Map VALUE_MAP; + + static { + ResourceType[] values = values(); + VALUE_MAP = new HashMap<>(2 * values.length); + + for (ResourceType type : values) { + VALUE_MAP.put(type.value, type); + } + } + + public final String value; + + public static ResourceType fromValue(String value) { + ResourceType type = VALUE_MAP.get(value); + if (type == null) { + throw new IllegalArgumentException("Unknown resource type: " + value); + } + return type; + } + + ResourceType(String value) { + this.value = value; + } +} diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java index db157c4a13..6f8574f8b2 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java @@ -54,8 +54,10 @@ import java.text.Bidi; import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.Objects; import java.util.concurrent.Callable; import java.util.concurrent.Future; @@ -148,12 +150,12 @@ public static String getApplicationName() { /** * Hide a view by setting its layout height and width to 1dp. * - * @param condition The setting to check for hiding the view. + * @param setting The setting to check for hiding the view. * @param view The view to hide. */ - public static void hideViewBy0dpUnderCondition(BooleanSetting condition, View view) { - if (hideViewBy0dpUnderCondition(condition.get(), view)) { - Logger.printDebug(() -> "View hidden by setting: " + condition); + public static void hideViewBy0dpUnderCondition(BooleanSetting setting, View view) { + if (hideViewBy0dpUnderCondition(setting.get(), view)) { + Logger.printDebug(() -> "View hidden by setting: " + setting); } } @@ -165,22 +167,47 @@ public static void hideViewBy0dpUnderCondition(BooleanSetting condition, View vi */ public static boolean hideViewBy0dpUnderCondition(boolean condition, View view) { if (condition) { - hideViewByLayoutParams(view); + hideViewBy0dp(view); return true; } return false; } + /** + * Hide a view by setting its layout params to 0x0 + * @param view The view to hide. + */ + public static void hideViewBy0dp(View view) { + if (view instanceof LinearLayout) { + LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, 0); + view.setLayoutParams(layoutParams); + } else if (view instanceof FrameLayout) { + FrameLayout.LayoutParams layoutParams2 = new FrameLayout.LayoutParams(0, 0); + view.setLayoutParams(layoutParams2); + } else if (view instanceof RelativeLayout) { + RelativeLayout.LayoutParams layoutParams3 = new RelativeLayout.LayoutParams(0, 0); + view.setLayoutParams(layoutParams3); + } else if (view instanceof Toolbar) { + Toolbar.LayoutParams layoutParams4 = new Toolbar.LayoutParams(0, 0); + view.setLayoutParams(layoutParams4); + } else { + ViewGroup.LayoutParams params = view.getLayoutParams(); + params.width = 0; + params.height = 0; + view.setLayoutParams(params); + } + } + /** * Hide a view by setting its visibility to GONE. * - * @param condition The setting to check for hiding the view. + * @param setting The setting to check for hiding the view. * @param view The view to hide. */ - public static void hideViewUnderCondition(BooleanSetting condition, View view) { - if (hideViewUnderCondition(condition.get(), view)) { - Logger.printDebug(() -> "View hidden by setting: " + condition); + public static void hideViewUnderCondition(BooleanSetting setting, View view) { + if (hideViewUnderCondition(setting.get(), view)) { + Logger.printDebug(() -> "View hidden by setting: " + setting); } } @@ -199,14 +226,14 @@ public static boolean hideViewUnderCondition(boolean condition, View view) { return false; } - public static void hideViewByRemovingFromParentUnderCondition(BooleanSetting condition, View view) { - if (hideViewByRemovingFromParentUnderCondition(condition.get(), view)) { - Logger.printDebug(() -> "View hidden by setting: " + condition); + public static void hideViewByRemovingFromParentUnderCondition(BooleanSetting setting, View view) { + if (hideViewByRemovingFromParentUnderCondition(setting.get(), view)) { + Logger.printDebug(() -> "View hidden by setting: " + setting); } } - public static boolean hideViewByRemovingFromParentUnderCondition(boolean setting, View view) { - if (setting) { + public static boolean hideViewByRemovingFromParentUnderCondition(boolean condition, View view) { + if (condition) { ViewParent parent = view.getParent(); if (parent instanceof ViewGroup parentGroup) { parentGroup.removeView(view); @@ -277,42 +304,42 @@ public static int indexOfFirstFound(String value, String... targets) { /** * @return zero, if the resource is not found. */ - @SuppressLint("DiscouragedApi") - public static int getResourceIdentifier(Context context, String resourceIdentifierName, String type) { - return context.getResources().getIdentifier(resourceIdentifierName, type, context.getPackageName()); + public static int getResourceIdentifier(ResourceType type, String resourceIdentifierName) { + return getResourceIdentifier(getContext(), type, resourceIdentifierName); } /** * @return zero, if the resource is not found. */ - public static int getResourceIdentifier(String resourceIdentifierName, String type) { - return getResourceIdentifier(getContext(), resourceIdentifierName, type); + @SuppressLint("DiscouragedApi") + public static int getResourceIdentifier(Context context, ResourceType type, String resourceIdentifierName) { + return context.getResources().getIdentifier(resourceIdentifierName, type.value, context.getPackageName()); } public static int getResourceInteger(String resourceIdentifierName) throws Resources.NotFoundException { - return getContext().getResources().getInteger(getResourceIdentifier(resourceIdentifierName, "integer")); + return getContext().getResources().getInteger(getResourceIdentifier(ResourceType.INTEGER, resourceIdentifierName)); } public static Animation getResourceAnimation(String resourceIdentifierName) throws Resources.NotFoundException { - return AnimationUtils.loadAnimation(getContext(), getResourceIdentifier(resourceIdentifierName, "anim")); + return AnimationUtils.loadAnimation(getContext(), getResourceIdentifier(ResourceType.ANIM, resourceIdentifierName)); } @ColorInt public static int getResourceColor(String resourceIdentifierName) throws Resources.NotFoundException { //noinspection deprecation - return getContext().getResources().getColor(getResourceIdentifier(resourceIdentifierName, "color")); + return getContext().getResources().getColor(getResourceIdentifier(ResourceType.COLOR, resourceIdentifierName)); } public static int getResourceDimensionPixelSize(String resourceIdentifierName) throws Resources.NotFoundException { - return getContext().getResources().getDimensionPixelSize(getResourceIdentifier(resourceIdentifierName, "dimen")); + return getContext().getResources().getDimensionPixelSize(getResourceIdentifier(ResourceType.DIMEN, resourceIdentifierName)); } public static float getResourceDimension(String resourceIdentifierName) throws Resources.NotFoundException { - return getContext().getResources().getDimension(getResourceIdentifier(resourceIdentifierName, "dimen")); + return getContext().getResources().getDimension(getResourceIdentifier(ResourceType.DIMEN, resourceIdentifierName)); } public static String[] getResourceStringArray(String resourceIdentifierName) throws Resources.NotFoundException { - return getContext().getResources().getStringArray(getResourceIdentifier(resourceIdentifierName, "array")); + return getContext().getResources().getStringArray(getResourceIdentifier(ResourceType.ARRAY, resourceIdentifierName)); } public interface MatchFilter { @@ -323,7 +350,7 @@ public interface MatchFilter { * Includes sub children. */ public static R getChildViewByResourceName(View view, String str) { - var child = view.findViewById(Utils.getResourceIdentifier(str, "id")); + var child = view.findViewById(Utils.getResourceIdentifier(ResourceType.ID, str)); if (child != null) { //noinspection unchecked return (R) child; @@ -718,34 +745,6 @@ public static NetworkType getNetworkType() { || (type == ConnectivityManager.TYPE_BLUETOOTH) ? NetworkType.MOBILE : NetworkType.OTHER; } - /** - * Hide a view by setting its layout params to 0x0 - * @param view The view to hide. - */ - public static void hideViewByLayoutParams(View view) { - if (view instanceof LinearLayout) { - LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(0, 0); - view.setLayoutParams(layoutParams); - } else if (view instanceof FrameLayout) { - FrameLayout.LayoutParams layoutParams2 = new FrameLayout.LayoutParams(0, 0); - view.setLayoutParams(layoutParams2); - } else if (view instanceof RelativeLayout) { - RelativeLayout.LayoutParams layoutParams3 = new RelativeLayout.LayoutParams(0, 0); - view.setLayoutParams(layoutParams3); - } else if (view instanceof Toolbar) { - Toolbar.LayoutParams layoutParams4 = new Toolbar.LayoutParams(0, 0); - view.setLayoutParams(layoutParams4); - } else if (view instanceof ViewGroup) { - ViewGroup.LayoutParams layoutParams5 = new ViewGroup.LayoutParams(0, 0); - view.setLayoutParams(layoutParams5); - } else { - ViewGroup.LayoutParams params = view.getLayoutParams(); - params.width = 0; - params.height = 0; - view.setLayoutParams(params); - } - } - /** * Creates a custom dialog with a styled layout, including a title, message, buttons, and an * optional EditText. The dialog's appearance adapts to the app's dark mode setting, with @@ -1517,4 +1516,18 @@ public static int clamp(int value, int lower, int upper) { public static float clamp(float value, float lower, float upper) { return Math.max(lower, Math.min(value, upper)); } + + /** + * @param maxSize The maximum number of elements to keep in the map. + * @return A {@link LinkedHashMap} that automatically evicts the oldest entry + * when the size exceeds {@code maxSize}. + */ + public static Map createSizeRestrictedMap(int maxSize) { + return new LinkedHashMap<>(2 * maxSize) { + @Override + protected boolean removeEldestEntry(Entry eldest) { + return size() > maxSize; + } + }; + } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java index 7c0c09a0fe..a66be84188 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java @@ -3,7 +3,6 @@ import static android.text.Html.FROM_HTML_MODE_COMPACT; import static app.revanced.extension.shared.StringRef.str; import static app.revanced.extension.shared.Utils.DialogFragmentOnStartAction; -import static app.revanced.extension.shared.Utils.dipToPixels; import android.annotation.SuppressLint; import android.app.Activity; @@ -24,6 +23,7 @@ import java.util.Collection; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; @@ -127,7 +127,8 @@ static void issueWarning(Activity activity, Collection failedChecks) { // Add icon to the dialog. ImageView iconView = new ImageView(activity); - iconView.setImageResource(Utils.getResourceIdentifier("revanced_ic_dialog_alert", "drawable")); + iconView.setImageResource(Utils.getResourceIdentifier( + ResourceType.DRAWABLE, "revanced_ic_dialog_alert")); iconView.setColorFilter(Utils.getAppForegroundColor(), PorterDuff.Mode.SRC_IN); iconView.setPadding(0, 0, 0, 0); LinearLayout.LayoutParams iconParams = new LinearLayout.LayoutParams( diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/BaseFixRedgifsApiPatch.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/BaseFixRedgifsApiPatch.java index b6fa2caa0c..00ee6def3b 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/BaseFixRedgifsApiPatch.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/redgifs/BaseFixRedgifsApiPatch.java @@ -15,7 +15,6 @@ import okhttp3.Response; import okhttp3.ResponseBody; - public abstract class BaseFixRedgifsApiPatch implements Interceptor { protected static BaseFixRedgifsApiPatch INSTANCE; public abstract String getDefaultUserAgent(); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java index dc592b4883..6495833188 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java @@ -23,6 +23,7 @@ import java.util.Objects; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.BooleanSetting; @@ -105,7 +106,7 @@ protected void initialize() { String preferenceResourceName = BaseSettings.SHOW_MENU_ICONS.get() ? "revanced_prefs_icons" : "revanced_prefs"; - final var identifier = Utils.getResourceIdentifier(preferenceResourceName, "xml"); + final var identifier = Utils.getResourceIdentifier(ResourceType.XML, preferenceResourceName); if (identifier == 0) return; addPreferencesFromResource(identifier); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ColorPickerPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ColorPickerPreference.java index a70a66e72e..5c8b5837ea 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ColorPickerPreference.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ColorPickerPreference.java @@ -32,6 +32,7 @@ import java.util.regex.Pattern; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.Setting; import app.revanced.extension.shared.settings.StringSetting; @@ -171,7 +172,8 @@ private void init() { } // Set the widget layout to a custom layout containing the colored dot. - setWidgetLayoutResource(getResourceIdentifier("revanced_color_dot_widget", "layout")); + setWidgetLayoutResource(getResourceIdentifier( + ResourceType.LAYOUT, "revanced_color_dot_widget")); } /** @@ -208,9 +210,11 @@ protected void onBindView(View view) { super.onBindView(view); widgetColorDot = view.findViewById(getResourceIdentifier( - "revanced_color_dot_widget", "id")); + ResourceType.ID, + "revanced_color_dot_widget")); widgetColorDot.setBackgroundResource(getResourceIdentifier( - "revanced_settings_circle_background", "drawable")); + ResourceType.DRAWABLE, + "revanced_settings_circle_background")); widgetColorDot.getBackground().setTint(currentColor | 0xFF000000); widgetColorDot.setAlpha(isEnabled() ? 1.0f : DISABLED_ALPHA); } @@ -286,10 +290,10 @@ protected void showDialog(Bundle state) { Context context = getContext(); // Inflate color picker view. - View colorPicker = LayoutInflater.from(context).inflate( - getResourceIdentifier("revanced_color_picker", "layout"), null); - dialogColorPickerView = colorPicker.findViewById( - getResourceIdentifier("revanced_color_picker_view", "id")); + View colorPicker = LayoutInflater.from(context).inflate(getResourceIdentifier( + ResourceType.LAYOUT, "revanced_color_picker"), null); + dialogColorPickerView = colorPicker.findViewById(getResourceIdentifier( + ResourceType.ID, "revanced_color_picker_view")); dialogColorPickerView.setColor(currentColor); // Horizontal layout for preview and EditText. diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java index 4d0c1d5c10..e1b6de8c88 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java @@ -13,6 +13,7 @@ import androidx.annotation.NonNull; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; /** @@ -54,11 +55,14 @@ public View getView(int position, View convertView, @NonNull ViewGroup parent) { view = inflater.inflate(layoutResourceId, parent, false); holder = new SubViewDataContainer(); holder.checkIcon = view.findViewById(Utils.getResourceIdentifier( - "revanced_check_icon", "id")); + ResourceType.ID, + "revanced_check_icon")); holder.placeholder = view.findViewById(Utils.getResourceIdentifier( - "revanced_check_icon_placeholder", "id")); + ResourceType.ID, + "revanced_check_icon_placeholder")); holder.itemText = view.findViewById(Utils.getResourceIdentifier( - "revanced_item_text", "id")); + ResourceType.ID, + "revanced_item_text")); view.setTag(holder); } else { holder = (SubViewDataContainer) view.getTag(); @@ -111,7 +115,7 @@ protected void showDialog(Bundle state) { // Create custom adapter for the ListView. ListPreferenceArrayAdapter adapter = new ListPreferenceArrayAdapter( context, - Utils.getResourceIdentifier("revanced_custom_list_item_checked", "layout"), + Utils.getResourceIdentifier(ResourceType.LAYOUT, "revanced_custom_list_item_checked"), getEntries(), getEntryValues(), getValue() diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/StreamingDataRequest.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/StreamingDataRequest.java index eeab17d1f5..afaea833d3 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/StreamingDataRequest.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/spoof/requests/StreamingDataRequest.java @@ -13,7 +13,9 @@ import java.net.SocketTimeoutException; import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import java.util.*; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; @@ -70,22 +72,15 @@ public class StreamingDataRequest { */ private static final int MAX_MILLISECONDS_TO_WAIT_FOR_FETCH = 20 * 1000; + /** + * Cache limit must be greater than the maximum number of videos open at once, + * which theoretically is more than 4 (3 Shorts + one regular minimized video). + * But instead use a much larger value, to handle if a video viewed a while ago + * is somehow still referenced. Each stream is a small array of Strings + * so memory usage is not a concern. + */ private static final Map cache = Collections.synchronizedMap( - new LinkedHashMap<>(100) { - /** - * Cache limit must be greater than the maximum number of videos open at once, - * which theoretically is more than 4 (3 Shorts + one regular minimized video). - * But instead use a much larger value, to handle if a video viewed a while ago - * is somehow still referenced. Each stream is a small array of Strings - * so memory usage is not a concern. - */ - private static final int CACHE_LIMIT = 50; - - @Override - protected boolean removeEldestEntry(Entry eldest) { - return size() > CACHE_LIMIT; // Evict the oldest entry if over the cache limit. - } - }); + Utils.createSizeRestrictedMap(50)); private static volatile ClientType lastSpoofedClientType; diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch.java index 1ed2e771f7..82f2ea0f34 100644 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch.java +++ b/extensions/spotify/src/main/java/app/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch.java @@ -1,6 +1,7 @@ package app.revanced.extension.spotify.layout.hide.createbutton; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.spotify.shared.ComponentFilters.ComponentFilter; import app.revanced.extension.spotify.shared.ComponentFilters.ResourceIdComponentFilter; import app.revanced.extension.spotify.shared.ComponentFilters.StringComponentFilter; @@ -15,7 +16,7 @@ public final class HideCreateButtonPatch { * The main approach used is matching the resource id for the Create button title. */ private static final List CREATE_BUTTON_COMPONENT_FILTERS = List.of( - new ResourceIdComponentFilter("navigationbar_musicappitems_create_title", "string"), + new ResourceIdComponentFilter(ResourceType.STRING, "navigationbar_musicappitems_create_title"), // Temporary fallback and fix for APKs merged with AntiSplit-M not having resources properly encoded, // and thus getting the resource identifier for the Create button title always return 0. // FIXME: Remove this once the above issue is no longer relevant. @@ -27,7 +28,7 @@ public final class HideCreateButtonPatch { * Used in older versions of the app. */ private static final ResourceIdComponentFilter OLD_CREATE_BUTTON_COMPONENT_FILTER = - new ResourceIdComponentFilter("bottom_navigation_bar_create_tab_title", "string"); + new ResourceIdComponentFilter(ResourceType.STRING, "bottom_navigation_bar_create_tab_title"); /** * Injection point. This method is called on every navigation bar item to check whether it is the Create button. diff --git a/extensions/spotify/src/main/java/app/revanced/extension/spotify/shared/ComponentFilters.java b/extensions/spotify/src/main/java/app/revanced/extension/spotify/shared/ComponentFilters.java index 21f1dd3e31..599c397c90 100644 --- a/extensions/spotify/src/main/java/app/revanced/extension/spotify/shared/ComponentFilters.java +++ b/extensions/spotify/src/main/java/app/revanced/extension/spotify/shared/ComponentFilters.java @@ -3,6 +3,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; public final class ComponentFilters { @@ -19,21 +20,26 @@ default boolean filterUnavailable() { public static final class ResourceIdComponentFilter implements ComponentFilter { public final String resourceName; - public final String resourceType; + public final ResourceType resourceType; // Android resources are always positive, so -1 is a valid sentinel value to indicate it has not been loaded. // 0 is returned when a resource has not been found. private int resourceId = -1; @Nullable private String stringfiedResourceId; + @Deprecated public ResourceIdComponentFilter(String resourceName, String resourceType) { + this(ResourceType.valueOf(resourceType), resourceName); + } + + public ResourceIdComponentFilter(ResourceType resourceType, String resourceName) { this.resourceName = resourceName; this.resourceType = resourceType; } public int getResourceId() { if (resourceId == -1) { - resourceId = Utils.getResourceIdentifier(resourceName, resourceType); + resourceId = Utils.getResourceIdentifier(resourceType, resourceName); } return resourceId; } diff --git a/extensions/twitch/src/main/java/app/revanced/extension/twitch/Utils.java b/extensions/twitch/src/main/java/app/revanced/extension/twitch/Utils.java index 73c363ff88..5db5b8b2ff 100644 --- a/extensions/twitch/src/main/java/app/revanced/extension/twitch/Utils.java +++ b/extensions/twitch/src/main/java/app/revanced/extension/twitch/Utils.java @@ -1,14 +1,18 @@ package app.revanced.extension.twitch; +import app.revanced.extension.shared.ResourceType; + public class Utils { /* Called from SettingsPatch smali */ public static int getStringId(String name) { - return app.revanced.extension.shared.Utils.getResourceIdentifier(name, "string"); + return app.revanced.extension.shared.Utils.getResourceIdentifier( + ResourceType.STRING, name); } /* Called from SettingsPatch smali */ public static int getDrawableId(String name) { - return app.revanced.extension.shared.Utils.getResourceIdentifier(name, "drawable"); + return app.revanced.extension.shared.Utils.getResourceIdentifier( + ResourceType.DRAWABLE, name); } } diff --git a/extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/AppCompatActivityHook.java b/extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/AppCompatActivityHook.java index e617cf9b20..b071d2cf19 100644 --- a/extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/AppCompatActivityHook.java +++ b/extensions/twitch/src/main/java/app/revanced/extension/twitch/settings/AppCompatActivityHook.java @@ -2,16 +2,19 @@ import android.content.Intent; import android.os.Bundle; + import androidx.appcompat.app.ActionBar; + +import java.util.ArrayList; +import java.util.List; + import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.twitch.settings.preference.ReVancedPreferenceFragment; import tv.twitch.android.feature.settings.menu.SettingsMenuGroup; import tv.twitch.android.settings.SettingsActivity; -import java.util.ArrayList; -import java.util.List; - /** * Hooks AppCompatActivity. *

@@ -105,7 +108,7 @@ public static boolean handleSettingsCreation(androidx.appcompat.app.AppCompatAct base.getFragmentManager() .beginTransaction() - .replace(Utils.getResourceIdentifier("fragment_container", "id"), fragment) + .replace(Utils.getResourceIdentifier(ResourceType.ID, "fragment_container"), fragment) .commit(); return true; } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java index a4dd50fcc1..0b07c17b9d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AlternativeThumbnailsPatch.java @@ -18,7 +18,6 @@ import java.net.HttpURLConnection; import java.net.URL; import java.util.HashMap; -import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.ExecutionException; @@ -505,14 +504,8 @@ private static class VerifiedQualities { * Cache used to verify if an alternative thumbnails exists for a given video id. */ @GuardedBy("itself") - private static final Map altVideoIdLookup = new LinkedHashMap<>(100) { - private static final int CACHE_LIMIT = 1000; - - @Override - protected boolean removeEldestEntry(Entry eldest) { - return size() > CACHE_LIMIT; // Evict the oldest entry if over the cache limit. - } - }; + private static final Map altVideoIdLookup = + Utils.createSizeRestrictedMap(1000); private static VerifiedQualities getVerifiedQualities(@NonNull String videoId, boolean returnNullIfDoesNotExist) { synchronized (altVideoIdLookup) { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeHeaderPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeHeaderPatch.java index ed5bcec07b..f2a225aa93 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeHeaderPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ChangeHeaderPatch.java @@ -7,6 +7,7 @@ import java.util.Objects; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.settings.Settings; @@ -40,7 +41,7 @@ private Integer getAttributeId() { return null; } - final int identifier = Utils.getResourceIdentifier(attributeName, "attr"); + final int identifier = Utils.getResourceIdentifier(ResourceType.ATTR, attributeName); if (identifier == 0) { // Identifier is zero if custom header setting was included in imported settings // and a custom image was not included during patching. @@ -62,7 +63,7 @@ public Drawable getDrawable() { ? "_dark" : "_light"); - final int identifier = Utils.getResourceIdentifier(drawableFullName, "drawable"); + final int identifier = Utils.getResourceIdentifier(ResourceType.DRAWABLE, drawableFullName); if (identifier == 0) { Logger.printDebug(() -> "Could not find drawable: " + drawableFullName); Settings.HEADER_LOGO.resetToDefault(); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java index 7950c8b211..17115ec93d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DownloadsPatch.java @@ -21,7 +21,7 @@ public final class DownloadsPatch { /** * Injection point. */ - public static void activityCreated(Activity mainActivity) { + public static void setMainActivity(Activity mainActivity) { activityRef = new WeakReference<>(mainActivity); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java index 070c330d01..2f666f9906 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java @@ -5,6 +5,7 @@ import android.widget.ImageView; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.settings.Settings; @@ -27,6 +28,15 @@ public static int getCastButtonOverrideV2(int original) { return Settings.HIDE_CAST_BUTTON.get() ? View.GONE : original; } + /** + * Injection point. + */ + public static boolean getCastButtonOverrideV2(boolean original) { + if (Settings.HIDE_CAST_BUTTON.get()) return false; + + return original; + } + /** * Injection point. */ @@ -38,10 +48,10 @@ public static void hideCaptionsButton(ImageView imageView) { = Settings.HIDE_PLAYER_PREVIOUS_NEXT_BUTTONS.get(); private static final int PLAYER_CONTROL_PREVIOUS_BUTTON_TOUCH_AREA_ID = - Utils.getResourceIdentifier("player_control_previous_button_touch_area", "id"); + Utils.getResourceIdentifier(ResourceType.ID, "player_control_previous_button_touch_area"); private static final int PLAYER_CONTROL_NEXT_BUTTON_TOUCH_AREA_ID = - Utils.getResourceIdentifier("player_control_next_button_touch_area", "id"); + Utils.getResourceIdentifier(ResourceType.ID, "player_control_next_button_touch_area"); /** * Injection point. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideSeekbarPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideSeekbarPatch.java index 98065d7ec0..521e7812b0 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideSeekbarPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideSeekbarPatch.java @@ -4,7 +4,17 @@ @SuppressWarnings("unused") public class HideSeekbarPatch { + /** + * Injection point. + */ public static boolean hideSeekbar() { return Settings.HIDE_SEEKBAR.get(); } + + /** + * Injection point. + */ + public static boolean useFullscreenLargeSeekbar(boolean original) { + return Settings.FULLSCREEN_LARGE_SEEKBAR.get(); + } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java index 7a75711620..e726c36164 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java @@ -13,6 +13,7 @@ import androidx.annotation.Nullable; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.Setting; import app.revanced.extension.youtube.settings.Settings; @@ -113,7 +114,7 @@ public boolean isModern() { * Resource is not present in older targets, and this field will be zero. */ private static final int MODERN_OVERLAY_SUBTITLE_TEXT - = Utils.getResourceIdentifier("modern_miniplayer_subtitle_text", "id"); + = Utils.getResourceIdentifier(ResourceType.ID, "modern_miniplayer_subtitle_text"); private static final MiniplayerType CURRENT_TYPE = Settings.MINIPLAYER_TYPE.get(); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java index 7021cc6f9f..e5ec52b771 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java @@ -62,6 +62,13 @@ public static void hideNavigationButtonLabels(TextView navigationLabelsView) { hideViewUnderCondition(Settings.HIDE_NAVIGATION_BUTTON_LABELS, navigationLabelsView); } + /** + * Injection point. + */ + public static boolean useAnimatedNavigationButtons(boolean original) { + return Settings.NAVIGATION_BAR_ANIMATIONS.get(); + } + /** * Injection point. */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java index e0a1e3c700..02fc01c9fa 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch.java @@ -20,15 +20,6 @@ public enum ShortsPlayerType { REGULAR_PLAYER_FULLSCREEN } - static { - if (!VersionCheckPatch.IS_19_46_OR_GREATER - && Settings.SHORTS_PLAYER_TYPE.get() == ShortsPlayerType.REGULAR_PLAYER_FULLSCREEN) { - // User imported newer settings to an older app target. - Logger.printInfo(() -> "Resetting " + Settings.SHORTS_PLAYER_TYPE); - Settings.SHORTS_PLAYER_TYPE.resetToDefault(); - } - } - private static WeakReference mainActivityRef = new WeakReference<>(null); private static volatile boolean overrideBackPressToExit; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch.java index ff2d778741..9a7989d9a1 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch.java @@ -24,18 +24,20 @@ private static boolean isFullScreenPatchIncluded() { /** * Injection point. + * + * Returns negated value. */ - public static boolean openVideoFullscreenPortrait(boolean original) { + public static boolean doNotOpenVideoFullscreenPortrait(boolean original) { Boolean openFullscreen = openNextVideoFullscreen; if (openFullscreen != null) { openNextVideoFullscreen = null; - return openFullscreen; + return !openFullscreen; } if (!isFullScreenPatchIncluded()) { return original; } - return Settings.OPEN_VIDEOS_FULLSCREEN_PORTRAIT.get(); + return !Settings.OPEN_VIDEOS_FULLSCREEN_PORTRAIT.get(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerControlsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerControlsPatch.java index a969996837..be7fe91190 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerControlsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerControlsPatch.java @@ -42,7 +42,7 @@ public void onGlobalLayout() { Logger.printDebug(() -> "fullscreen button visibility: " + (visibility == View.VISIBLE ? "VISIBLE" : - visibility == View.GONE ? "GONE" : "INVISIBLE")); + visibility == View.GONE ? "GONE" : "INVISIBLE")); fullscreenButtonVisibilityChanged(visibility == View.VISIBLE); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveTrackingQueryParameterPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveTrackingQueryParameterPatch.java index 3b05a239a9..67f645a053 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveTrackingQueryParameterPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveTrackingQueryParameterPatch.java @@ -1,5 +1,7 @@ package app.revanced.extension.youtube.patches; +import android.content.Intent; + import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") @@ -7,8 +9,13 @@ public final class RemoveTrackingQueryParameterPatch { private static final String NEW_TRACKING_PARAMETER_REGEX = ".si=.+"; private static final String OLD_TRACKING_PARAMETER_REGEX = ".feature=.+"; + /** + * Injection point. + */ public static String sanitize(String url) { - if (!Settings.REMOVE_TRACKING_QUERY_PARAMETER.get()) return url; + if (!Settings.REMOVE_TRACKING_QUERY_PARAMETER.get()) { + return url; + } return url .replaceAll(NEW_TRACKING_PARAMETER_REGEX, "") diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch.java index 0260b2c69d..6f2ea968d2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch.java @@ -1,19 +1,29 @@ package app.revanced.extension.youtube.patches; import android.app.AlertDialog; + +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.settings.Settings; -/** @noinspection unused*/ +@SuppressWarnings("unused") public class RemoveViewerDiscretionDialogPatch { + + /** + * Injection point. + */ public static void confirmDialog(AlertDialog dialog) { - if (!Settings.REMOVE_VIEWER_DISCRETION_DIALOG.get()) { - // Since the patch replaces the AlertDialog#show() method, we need to call the original method here. - dialog.show(); + if (Settings.REMOVE_VIEWER_DISCRETION_DIALOG.get()) { + Logger.printDebug(() -> "Clicking alert dialog dismiss button"); + + final var button = dialog.getButton(AlertDialog.BUTTON_POSITIVE); + button.setSoundEffectsEnabled(false); + button.performClick(); return; } - final var button = dialog.getButton(AlertDialog.BUTTON_POSITIVE); - button.setSoundEffectsEnabled(false); - button.performClick(); + // Since the patch replaces the AlertDialog#show() method, we need to call the original method here. + Logger.printDebug(() -> "Showing alert dialog"); + dialog.show(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ShortsAutoplayPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ShortsAutoplayPatch.java index 9e5aff20b1..e7de421368 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ShortsAutoplayPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ShortsAutoplayPatch.java @@ -2,8 +2,6 @@ import android.app.Activity; -import androidx.annotation.Nullable; - import java.lang.ref.WeakReference; import java.util.Objects; @@ -78,7 +76,7 @@ public static void setYTShortsRepeatEnum(Enum ytEnum) { /** * Injection point. */ - public static Enum changeShortsRepeatBehavior(@Nullable Enum original) { + public static Enum changeShortsRepeatBehavior(Enum original) { try { final boolean autoplay; @@ -95,19 +93,19 @@ public static Enum changeShortsRepeatBehavior(@Nullable Enum original) { autoplay = Settings.SHORTS_AUTOPLAY.get(); } - final ShortsLoopBehavior behavior = autoplay + Enum overrideBehavior = (autoplay ? ShortsLoopBehavior.SINGLE_PLAY - : ShortsLoopBehavior.REPEAT; + : ShortsLoopBehavior.REPEAT).ytEnumValue; - if (behavior.ytEnumValue != null) { + if (overrideBehavior != null) { Logger.printDebug(() -> { String name = (original == null ? "unknown (null)" : original.name()); - return behavior == original + return overrideBehavior == original ? "Behavior setting is same as original. Using original: " + name - : "Changing Shorts repeat behavior from: " + name + " to: " + behavior.name(); + : "Changing Shorts repeat behavior from: " + name + " to: " + overrideBehavior.name(); }); - return behavior.ytEnumValue; + return overrideBehavior; } if (original == null) { @@ -118,13 +116,12 @@ public static Enum changeShortsRepeatBehavior(@Nullable Enum original) { return unknown; } } catch (Exception ex) { - Logger.printException(() -> "changeShortsRepeatBehavior failure", ex); + Logger.printException(() -> "changeShortsRepeatState failure", ex); } return original; } - /** * Injection point. */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java index 2844b53db7..e9b2929867 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java @@ -19,5 +19,8 @@ private static boolean isVersionOrGreater(String version) { public static final boolean IS_19_29_OR_GREATER = isVersionOrGreater("19.29.00"); @Deprecated public static final boolean IS_19_34_OR_GREATER = isVersionOrGreater("19.34.00"); - public static final boolean IS_19_46_OR_GREATER = isVersionOrGreater("19.46.00"); + + public static final boolean IS_20_21_OR_GREATER = isVersionOrGreater("20.21.00"); + + public static final boolean IS_20_22_OR_GREATER = isVersionOrGreater("20.22.00"); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java index 3ac41318cb..7512db706c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ButtonsFilter.java @@ -1,5 +1,6 @@ package app.revanced.extension.youtube.patches.components; +import app.revanced.extension.youtube.patches.VersionCheckPatch; import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") @@ -34,7 +35,6 @@ public ButtonsFilter() { addPathCallbacks( likeSubscribeGlow, - bufferFilterPathGroup, new StringFilterGroup( Settings.HIDE_LIKE_DISLIKE_BUTTON, "|segmented_like_dislike_button" @@ -53,6 +53,12 @@ public ButtonsFilter() { ) ); + // FIXME: 20.22+ filtering of the action buttons doesn't work because + // the buffer is the same for all buttons. + if (!VersionCheckPatch.IS_20_22_OR_GREATER) { + addPathCallbacks(bufferFilterPathGroup); + } + bufferButtonsGroupList.addAll( new ByteArrayFilterGroup( Settings.HIDE_REPORT_BUTTON, @@ -78,12 +84,6 @@ public ButtonsFilter() { Settings.HIDE_STOP_ADS_BUTTON, "yt_outline_slash_circle_left" ), - // Check for clip button both here and using a path filter, - // as there's a chance the path is a generic action button and won't contain 'clip_button' - new ByteArrayFilterGroup( - Settings.HIDE_CLIP_BUTTON, - "yt_outline_scissors" - ), new ByteArrayFilterGroup( Settings.HIDE_HYPE_BUTTON, "yt_outline_star_shooting" @@ -96,11 +96,13 @@ public ButtonsFilter() { } private boolean isEveryFilterGroupEnabled() { - for (var group : pathCallbacks) + for (var group : pathCallbacks) { if (!group.isEnabled()) return false; + } - for (var group : bufferButtonsGroupList) + for (var group : bufferButtonsGroupList) { if (!group.isEnabled()) return false; + } return true; } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java index 3635f25a86..c73bab0749 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LayoutComponentsFilter.java @@ -1,5 +1,6 @@ package app.revanced.extension.youtube.patches.components; +import static app.revanced.extension.youtube.patches.VersionCheckPatch.IS_20_21_OR_GREATER; import static app.revanced.extension.youtube.shared.NavigationBar.NavigationButton; import android.graphics.drawable.Drawable; @@ -365,14 +366,16 @@ boolean isFiltered(String identifier, String path, byte[] buffer, * Injection point. * Called from a different place then the other filters. */ - public static boolean filterMixPlaylists(Object conversionContext, @Nullable final byte[] bytes) { + public static boolean filterMixPlaylists(Object conversionContext, @Nullable byte[] buffer) { + // Edit: This hook may no longer be needed, and mix playlist filtering + // might be possible using the existing litho filters. try { if (!Settings.HIDE_MIX_PLAYLISTS.get()) { return false; } - if (bytes == null) { - Logger.printDebug(() -> "bytes is null"); + if (buffer == null) { + Logger.printDebug(() -> "buffer is null"); return false; } @@ -382,11 +385,11 @@ public static boolean filterMixPlaylists(Object conversionContext, @Nullable fin } // Prevent hiding the description of some videos accidentally. - if (mixPlaylistsExceptions2.check(bytes).isFiltered()) { + if (mixPlaylistsExceptions2.check(buffer).isFiltered()) { return false; } - if (mixPlaylists.check(bytes).isFiltered()) { + if (mixPlaylists.check(buffer).isFiltered()) { Logger.printDebug(() -> "Filtered mix playlist"); return true; } @@ -443,11 +446,23 @@ public static int hideInSearch(int height) { : height; } + private static final boolean HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS_ENABLED + = Settings.HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS.get(); + /** * Injection point. */ public static void hideInRelatedVideos(View chipView) { - Utils.hideViewBy0dpUnderCondition(Settings.HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS, chipView); + // Cannot use 0dp hide with later targets, otherwise the suggested videos + // can be shown in full screen mode. + // This behavior may also be present in earlier app targets. + if (IS_20_21_OR_GREATER) { + // FIXME: The filter bar is still briefly shown when dragging the suggested videos + // below the video player. + Utils.hideViewUnderCondition(HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS_ENABLED, chipView); + } else { + Utils.hideViewBy0dpUnderCondition(HIDE_FILTER_BAR_FEED_IN_RELATED_VIDEOS_ENABLED, chipView); + } } private static final boolean HIDE_DOODLES_ENABLED = Settings.HIDE_DOODLES.get(); @@ -472,7 +487,9 @@ public static void hideShowMoreButton(View view) { && NavigationBar.isSearchBarActive() // Search bar can be active but behind the player. && !PlayerType.getCurrent().isMaximizedOrFullscreen()) { - Utils.hideViewByLayoutParams(view); + // FIXME: "Show more" button is visible hidden, + // but an empty space remains that can be clicked. + Utils.hideViewBy0dp(view); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java index e2ed04e631..619651cf01 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java @@ -4,11 +4,16 @@ import androidx.annotation.Nullable; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; +import java.util.Collections; import java.util.List; +import java.util.Map; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.youtube.StringTrieSearch; +import app.revanced.extension.youtube.patches.VersionCheckPatch; import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") @@ -73,6 +78,15 @@ static void findAsciiStrings(StringBuilder builder, byte[] buffer) { } } + /** + * Placeholder for actual filters. + */ + private static final class DummyFilter extends Filter { } + + private static final Filter[] filters = new Filter[] { + new DummyFilter() // Replaced during patching, do not touch. + }; + /** * Litho layout fixed thread pool size override. *

@@ -90,25 +104,46 @@ static void findAsciiStrings(StringBuilder builder, byte[] buffer) { private static final int LITHO_LAYOUT_THREAD_POOL_SIZE = 1; /** - * Placeholder for actual filters. + * 20.22+ cannot use the thread buffer, because frequently the buffer is not correct, + * especially for components that are recreated such as dragging off screen then back on screen. + * Instead, parse the identifier found near the start of the buffer and use that to + * identify the correct buffer to use when filtering. */ - private static final class DummyFilter extends Filter { } + private static final boolean EXTRACT_IDENTIFIER_FROM_BUFFER = VersionCheckPatch.IS_20_22_OR_GREATER; - private static final Filter[] filters = new Filter[] { - new DummyFilter() // Replaced patching, do not touch. - }; + /** + * Turns on additional logging, used for development purposes only. + */ + public static final boolean DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER = false; - private static final StringTrieSearch pathSearchTree = new StringTrieSearch(); - private static final StringTrieSearch identifierSearchTree = new StringTrieSearch(); + private static final String EML_STRING = ".eml"; + private static final byte[] EML_STRING_BYTES = EML_STRING.getBytes(StandardCharsets.US_ASCII); private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; /** * Because litho filtering is multi-threaded and the buffer is passed in from a different injection point, * the buffer is saved to a ThreadLocal so each calling thread does not interfere with other threads. + * Used for 20.21 and lower. */ private static final ThreadLocal bufferThreadLocal = new ThreadLocal<>(); + /** + * Identifier to protocol buffer mapping. Only used for 20.22+. + * Thread local is needed because filtering is multi-threaded and each thread can load + * a different component with the same identifier. + */ + private static final ThreadLocal> identifierToBufferThread = new ThreadLocal<>(); + + /** + * Global shared buffer. Used only if the buffer is not found in the ThreadLocal. + */ + private static final Map identifierToBufferGlobal + = Collections.synchronizedMap(createIdentifierToBufferMap()); + + private static final StringTrieSearch pathSearchTree = new StringTrieSearch(); + private static final StringTrieSearch identifierSearchTree = new StringTrieSearch(); + static { for (Filter filter : filters) { filterUsingCallbacks(identifierSearchTree, filter, @@ -160,16 +195,107 @@ private static void filterUsingCallbacks(StringTrieSearch pathSearchTree, } } + private static Map createIdentifierToBufferMap() { + // It's unclear how many items should be cached. This is a guess. + return Utils.createSizeRestrictedMap(100); + } + + /** + * Helper function that differs from {@link Character#isDigit(char)} + * as this only matches ascii and not unicode numbers. + */ + private static boolean isAsciiNumber(byte character) { + return '0' <= character && character <= '9'; + } + + private static boolean isAsciiLowerCaseLetter(byte character) { + return 'a' <= character && character <= 'z'; + } + /** * Injection point. Called off the main thread. * Targets 20.22+ */ public static void setProtoBuffer(byte[] buffer) { - // Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes. - // This is intentional, as it appears the buffer can be set once and then filtered multiple times. - // The buffer will be cleared from memory after a new buffer is set by the same thread, - // or when the calling thread eventually dies. - bufferThreadLocal.set(buffer); + if (DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER) { + StringBuilder builder = new StringBuilder(); + LithoFilterParameters.findAsciiStrings(builder, buffer); + Logger.printDebug(() -> "New buffer: " + builder); + } + + // Could use Boyer-Moore-Horspool since the string is ASCII and has a limited number of + // unique characters, but it seems to be slower since the extra overhead of checking the + // bad character array negates any performance gain of skipping a few extra subsearches. + int emlIndex = -1; + final int emlStringLength = EML_STRING_BYTES.length; + for (int i = 0, lastStartIndex = buffer.length - emlStringLength; i <= lastStartIndex; i++) { + boolean match = true; + for (int j = 0; j < emlStringLength; j++) { + if (buffer[i + j] != EML_STRING_BYTES[j]) { + match = false; + break; + } + } + if (match) { + emlIndex = i; + break; + } + } + + if (emlIndex < 0) { + // Buffer is not used for creating a new litho component. + return; + } + + int startIndex = emlIndex - 1; + while (startIndex > 0) { + final byte character = buffer[startIndex]; + int startIndexFinal = startIndex; + if (isAsciiNumber(character) || isAsciiLowerCaseLetter(character) || character == '_') { + // Valid character for the first path element. + startIndex--; + } else { + startIndex++; + break; + } + } + + // Strip away any numbers on the start of the identifier, which can + // be from random data in the buffer before the identifier starts. + while (true) { + final byte character = buffer[startIndex]; + if (isAsciiNumber(character)) { + startIndex++; + } else { + break; + } + } + + // Find the pipe character after the identifier. + int endIndex = -1; + for (int i = emlIndex, length = buffer.length; i < length; i++) { + if (buffer[i] == '|') { + endIndex = i; + break; + } + } + if (endIndex < 0) { + Logger.printException(() -> "Could not find buffer identifier"); + return; + } + + String identifier = new String(buffer, startIndex, endIndex - startIndex, StandardCharsets.US_ASCII); + if (DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER) { + Logger.printDebug(() -> "Found buffer for identifier: " + identifier); + } + identifierToBufferGlobal.put(identifier, buffer); + + Map map = identifierToBufferThread.get(); + if (map == null) { + map = createIdentifierToBufferMap(); + identifierToBufferThread.set(map); + } + map.put(identifier, buffer); } /** @@ -177,46 +303,70 @@ public static void setProtoBuffer(byte[] buffer) { * Targets 20.21 and lower. */ public static void setProtoBuffer(@Nullable ByteBuffer buffer) { - // Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes. - // This is intentional, as it appears the buffer can be set once and then filtered multiple times. - // The buffer will be cleared from memory after a new buffer is set by the same thread, - // or when the calling thread eventually dies. if (buffer == null || !buffer.hasArray()) { // It appears the buffer can be cleared out just before the call to #filter() // Ignore this null value and retain the last buffer that was set. Logger.printDebug(() -> "Ignoring null or empty buffer: " + buffer); } else { - setProtoBuffer(buffer.array()); + // Set the buffer to a thread local. The buffer will remain in memory, even after the call to #filter completes. + // This is intentional, as it appears the buffer can be set once and then filtered multiple times. + // The buffer will be cleared from memory after a new buffer is set by the same thread, + // or when the calling thread eventually dies. + bufferThreadLocal.set(buffer.array()); } } /** * Injection point. */ - public static boolean isFiltered(String lithoIdentifier, StringBuilder pathBuilder) { + public static boolean isFiltered(String identifier, StringBuilder pathBuilder) { try { - if (lithoIdentifier.isEmpty() && pathBuilder.length() == 0) { + if (identifier.isEmpty() || pathBuilder.length() == 0) { return false; } - byte[] buffer = bufferThreadLocal.get(); + byte[] buffer = null; + if (EXTRACT_IDENTIFIER_FROM_BUFFER) { + final int pipeIndex = identifier.indexOf('|'); + if (pipeIndex >= 0) { + // If the identifier contains no pipe, then it's not an ".eml" identifier + // and the buffer is not uniquely identified. Typically this only happens + // for subcomponents where buffer filtering is not used. + String identifierKey = identifier.substring(0, pipeIndex); + + var map = identifierToBufferThread.get(); + if (map != null) { + buffer = map.get(identifierKey); + } + + if (buffer == null) { + // Buffer for thread local not found. Use the last buffer found from any thread. + buffer = identifierToBufferGlobal.get(identifierKey); + + if (DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER && buffer == null) { + // No buffer is found for some components, such as + // shorts_lockup_cell.eml on channel profiles. + // For now, just ignore this and filter without a buffer. + Logger.printException(() -> "Could not find global buffer for identifier: " + identifier); + } + } + } + } else { + buffer = bufferThreadLocal.get(); + } + // Potentially the buffer may have been null or never set up until now. - // Use an empty buffer so the litho id/path filters still work correctly. + // Use an empty buffer so the litho id/path filters that do not use a buffer still work. if (buffer == null) { buffer = EMPTY_BYTE_ARRAY; } - LithoFilterParameters parameter = new LithoFilterParameters( - lithoIdentifier, pathBuilder.toString(), buffer); + String path = pathBuilder.toString(); + LithoFilterParameters parameter = new LithoFilterParameters(identifier, path, buffer); Logger.printDebug(() -> "Searching " + parameter); - if (identifierSearchTree.matches(parameter.identifier, parameter)) { - return true; - } - - if (pathSearchTree.matches(parameter.path, parameter)) { - return true; - } + return identifierSearchTree.matches(identifier, parameter) + || pathSearchTree.matches(path, parameter); } catch (Exception ex) { Logger.printException(() -> "isFiltered failure", ex); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter.java index b82cb5f563..5a2e97aff7 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ReturnYouTubeDislikeFilter.java @@ -4,15 +4,15 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Map; +import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.Utils; +import app.revanced.extension.youtube.TrieSearch; import app.revanced.extension.youtube.patches.ReturnYouTubeDislikePatch; import app.revanced.extension.youtube.patches.VideoInformation; import app.revanced.extension.youtube.settings.Settings; -import app.revanced.extension.shared.Logger; -import app.revanced.extension.youtube.TrieSearch; /** * Searches for video id's in the proto buffer of Shorts dislike. @@ -33,18 +33,7 @@ public final class ReturnYouTubeDislikeFilter extends Filter { * Cannot use {@link LinkedHashSet} because it's missing #removeEldestEntry(). */ @GuardedBy("itself") - private static final Map lastVideoIds = new LinkedHashMap<>() { - /** - * Number of video id's to keep track of for searching thru the buffer. - * A minimum value of 3 should be sufficient, but check a few more just in case. - */ - private static final int NUMBER_OF_LAST_VIDEO_IDS_TO_TRACK = 5; - - @Override - protected boolean removeEldestEntry(Entry eldest) { - return size() > NUMBER_OF_LAST_VIDEO_IDS_TO_TRACK; - } - }; + private static final Map lastVideoIds = Utils.createSizeRestrictedMap(5); /** * Injection point. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java index f4fae4d32c..2915773024 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/ShortsFilter.java @@ -11,6 +11,7 @@ import java.util.List; import app.revanced.extension.shared.Logger; +import app.revanced.extension.youtube.patches.VersionCheckPatch; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.shared.NavigationBar; import app.revanced.extension.youtube.shared.PlayerType; @@ -202,7 +203,11 @@ public ShortsFilter() { videoActionButton = new StringFilterGroup( null, - // Can be simply 'button.eml', 'shorts_video_action_button.eml' or 'reel_action_button.eml' + // Can be any of: + // button.eml + // shorts_video_action_button.eml + // reel_action_button.eml + // reel_pivot_button.eml "button.eml" ); @@ -213,31 +218,37 @@ public ShortsFilter() { addPathCallbacks( shortsCompactFeedVideo, joinButton, subscribeButton, paidPromotionButton, - shortsActionBar, suggestedAction, pausedOverlayButtons, channelBar, + suggestedAction, pausedOverlayButtons, channelBar, fullVideoLinkLabel, videoTitle, useSoundButton, reelSoundMetadata, soundButton, infoPanel, stickers, likeFountain, likeButton, dislikeButton ); - // - // All other action buttons. - // - videoActionButtonBuffer.addAll( - new ByteArrayFilterGroup( - Settings.HIDE_SHORTS_COMMENTS_BUTTON, - "reel_comment_button", - "youtube_shorts_comment_outline" - ), - new ByteArrayFilterGroup( - Settings.HIDE_SHORTS_SHARE_BUTTON, - "reel_share_button", - "youtube_shorts_share_outline" - ), - new ByteArrayFilterGroup( - Settings.HIDE_SHORTS_REMIX_BUTTON, - "reel_remix_button", - "youtube_shorts_remix_outline" - ) - ); + // FIXME: The Shorts buffer is very different with 20.22+ and if any of these filters + // are enabled then all Shorts player vertical buttons are hidden. + if (!VersionCheckPatch.IS_20_22_OR_GREATER) { + addPathCallbacks(shortsActionBar); + + // + // All other action buttons. + // + videoActionButtonBuffer.addAll( + new ByteArrayFilterGroup( + Settings.HIDE_SHORTS_COMMENTS_BUTTON, + "reel_comment_button", + "youtube_shorts_comment_outline" + ), + new ByteArrayFilterGroup( + Settings.HIDE_SHORTS_SHARE_BUTTON, + "reel_share_button", + "youtube_shorts_share_outline" + ), + new ByteArrayFilterGroup( + Settings.HIDE_SHORTS_REMIX_BUTTON, + "reel_remix_button", + "youtube_shorts_remix_outline" + ) + ); + } // // Suggested actions. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java index 0ead14314c..1f726c2a5b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/playback/quality/RememberVideoQualityPatch.java @@ -21,7 +21,6 @@ public class RememberVideoQualityPatch { private static final IntegerSetting shortsQualityWifi = Settings.SHORTS_QUALITY_DEFAULT_WIFI; private static final IntegerSetting shortsQualityMobile = Settings.SHORTS_QUALITY_DEFAULT_MOBILE; - public static boolean shouldRememberVideoQuality() { BooleanSetting preference = ShortsPlayerState.isOpen() ? Settings.REMEMBER_SHORTS_QUALITY_LAST_SELECTED diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java index 965b163641..1cffc4948f 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/SeekbarColorPatch.java @@ -19,6 +19,7 @@ import java.util.Scanner; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.youtube.settings.Settings; @@ -152,8 +153,8 @@ public static void setSplashAnimationDrawableTheme(AnimatedVectorDrawable vector Logger.printDebug(() -> "Using splash seekbar style: " + seekbarStyle); final int styleIdentifierDefault = Utils.getResourceIdentifier( - seekbarStyle, - "style" + ResourceType.STYLE, + seekbarStyle ); if (styleIdentifierDefault == 0) { throw new RuntimeException("Seekbar style not found: " + seekbarStyle); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java index ade422260b..6b96812957 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java @@ -258,7 +258,8 @@ private static SpannableString createDislikeSpan(@NonNull Spanned oldSpannable, // middle separator String middleSeparatorString = compactLayout ? " " + MIDDLE_SEPARATOR_CHARACTER + " " - : " \u2009" + MIDDLE_SEPARATOR_CHARACTER + "\u2009 "; // u2009 = 'narrow space' character + : " \u2009\u2009" + MIDDLE_SEPARATOR_CHARACTER + "\u2009\u2009 "; // u2009 = 'narrow space' + final int shapeInsertionIndex = middleSeparatorString.length() / 2; Spannable middleSeparatorSpan = new SpannableString(middleSeparatorString); ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape()); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java index 24d3a4f424..de9f50dba2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java @@ -13,6 +13,7 @@ import android.widget.Toolbar; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.AppLanguage; import app.revanced.extension.shared.settings.BaseSettings; @@ -87,7 +88,7 @@ public static void initialize(Activity licenseActivity) { setActivityTheme(licenseActivity); ReVancedPreferenceFragment.setNavigationBarColor(licenseActivity.getWindow()); licenseActivity.setContentView(getResourceIdentifier( - "revanced_settings_with_toolbar", "layout")); + ResourceType.LAYOUT, "revanced_settings_with_toolbar")); // Sanity check. String dataString = licenseActivity.getIntent().getDataString(); @@ -102,7 +103,7 @@ public static void initialize(Activity licenseActivity) { //noinspection deprecation licenseActivity.getFragmentManager() .beginTransaction() - .replace(getResourceIdentifier("revanced_settings_fragments", "id"), fragment) + .replace(getResourceIdentifier(ResourceType.ID, "revanced_settings_fragments"), fragment) .commit(); } catch (Exception ex) { Logger.printException(() -> "initialize failure", ex); @@ -114,7 +115,7 @@ private static void createToolbar(Activity activity, PreferenceFragment fragment // Replace dummy placeholder toolbar. // This is required to fix submenu title alignment issue with Android ASOP 15+ ViewGroup toolBarParent = activity.findViewById( - getResourceIdentifier("revanced_toolbar_parent", "id")); + getResourceIdentifier(ResourceType.ID, "revanced_toolbar_parent")); ViewGroup dummyToolbar = Utils.getChildViewByResourceName(toolBarParent, "revanced_toolbar"); toolbarLayoutParams = dummyToolbar.getLayoutParams(); toolBarParent.removeView(dummyToolbar); @@ -122,7 +123,7 @@ private static void createToolbar(Activity activity, PreferenceFragment fragment Toolbar toolbar = new Toolbar(toolBarParent.getContext()); toolbar.setBackgroundColor(getToolbarBackgroundColor()); toolbar.setNavigationIcon(ReVancedPreferenceFragment.getBackButtonDrawable()); - toolbar.setTitle(getResourceIdentifier("revanced_settings_title", "string")); + toolbar.setTitle(getResourceIdentifier(ResourceType.STRING, "revanced_settings_title")); final int margin = Utils.dipToPixels(16); toolbar.setTitleMarginStart(margin); @@ -147,7 +148,7 @@ public static void setActivityTheme(Activity activity) { final var theme = Utils.isDarkModeEnabled() ? "Theme.YouTube.Settings.Dark" : "Theme.YouTube.Settings"; - activity.setTheme(getResourceIdentifier(theme, "style")); + activity.setTheme(getResourceIdentifier(ResourceType.STYLE, theme)); } public static int getToolbarBackgroundColor() { diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/SearchViewController.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/SearchViewController.java index 10be641f79..844294d154 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/SearchViewController.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/SearchViewController.java @@ -30,6 +30,7 @@ import java.util.List; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.AppLanguage; import app.revanced.extension.shared.settings.BaseSettings; @@ -68,7 +69,7 @@ private static GradientDrawable createBackgroundDrawable(Context context) { /** * Creates a background drawable for suggestion items with rounded corners. */ - private static GradientDrawable createSuggestionBackgroundDrawable(Context context) { + private static GradientDrawable createSuggestionBackgroundDrawable() { GradientDrawable background = new GradientDrawable(); background.setShape(GradientDrawable.RECTANGLE); background.setColor(getSearchViewBackground()); @@ -109,9 +110,11 @@ private SearchViewController(Activity activity, Toolbar toolbar, ReVancedPrefere // Retrieve SearchView and container from XML. searchView = activity.findViewById(getResourceIdentifier( - "revanced_search_view", "id")); + ResourceType.ID, + "revanced_search_view")); searchContainer = activity.findViewById(getResourceIdentifier( - "revanced_search_view_container", "id")); + ResourceType.ID, + "revanced_search_view_container")); // Initialize AutoCompleteTextView. autoCompleteTextView = searchView.findViewById( @@ -178,8 +181,8 @@ public boolean onQueryTextChange(String newText) { }); // Set menu and search icon. - final int actionSearchId = getResourceIdentifier("action_search", "id"); - toolbar.inflateMenu(getResourceIdentifier("revanced_search_menu", "menu")); + final int actionSearchId = getResourceIdentifier(ResourceType.ID, "action_search"); + toolbar.inflateMenu(getResourceIdentifier(ResourceType.MENU, "revanced_search_menu")); MenuItem searchItem = toolbar.getMenu().findItem(actionSearchId); // Set menu item click listener. @@ -307,7 +310,8 @@ public void handleOrientationChange(int newOrientation) { private void openSearch() { isSearchActive = true; toolbar.getMenu().findItem(getResourceIdentifier( - "action_search", "id")).setVisible(false); + ResourceType.ID, + "action_search")).setVisible(false); toolbar.setTitle(""); searchContainer.setVisibility(View.VISIBLE); searchView.requestFocus(); @@ -332,7 +336,8 @@ private void openSearch() { public void closeSearch() { isSearchActive = false; toolbar.getMenu().findItem(getResourceIdentifier( - "action_search", "id")).setVisible(true); + ResourceType.ID, + "action_search")).setVisible(true); toolbar.setTitle(originalTitle); searchContainer.setVisibility(View.GONE); searchView.setQuery("", false); @@ -368,16 +373,18 @@ public SearchHistoryAdapter(Context context, List history) { public View getView(int position, View convertView, @NonNull android.view.ViewGroup parent) { if (convertView == null) { convertView = LinearLayout.inflate(getContext(), getResourceIdentifier( - "revanced_search_suggestion_item", "layout"), null); + ResourceType.LAYOUT, + "revanced_search_suggestion_item"), null); } // Apply rounded corners programmatically. - convertView.setBackground(createSuggestionBackgroundDrawable(getContext())); + convertView.setBackground(createSuggestionBackgroundDrawable()); String query = getItem(position); // Set query text. TextView textView = convertView.findViewById(getResourceIdentifier( - "suggestion_text", "id")); + ResourceType.ID, + "suggestion_text")); if (textView != null) { textView.setText(query); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index 2c089bb698..ab1414b8e9 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -13,6 +13,7 @@ import static app.revanced.extension.youtube.patches.ChangeStartPagePatch.StartPage; import static app.revanced.extension.youtube.patches.ExitFullscreenPatch.FullscreenMode; import static app.revanced.extension.youtube.patches.ForceOriginalAudioPatch.ForceOriginalAudioAvailability; +import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHideOverlayButtonsAvailability; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerHorizontalDragAvailability; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.MINIMAL; @@ -46,7 +47,6 @@ import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.StillImagesAvailability; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailOption; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailStillTime; -import app.revanced.extension.youtube.patches.MiniplayerPatch; import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings; import app.revanced.extension.youtube.swipecontrols.SwipeControlsConfigurationProvider.SwipeOverlayStyle; @@ -182,8 +182,8 @@ public class Settings extends BaseSettings { public static final BooleanSetting MINIPLAYER_DOUBLE_TAP_ACTION = new BooleanSetting("revanced_miniplayer_double_tap_action", TRUE, true, MINIPLAYER_ANY_MODERN); public static final BooleanSetting MINIPLAYER_DRAG_AND_DROP = new BooleanSetting("revanced_miniplayer_drag_and_drop", TRUE, true, MINIPLAYER_ANY_MODERN); public static final BooleanSetting MINIPLAYER_HORIZONTAL_DRAG = new BooleanSetting("revanced_miniplayer_horizontal_drag", FALSE, true, new MiniplayerHorizontalDragAvailability()); - public static final BooleanSetting MINIPLAYER_HIDE_OVERLAY_BUTTONS = new BooleanSetting("revanced_miniplayer_hide_overlay_buttons", FALSE, true, new MiniplayerPatch.MiniplayerHideOverlayButtonsAvailability()); - public static final BooleanSetting MINIPLAYER_HIDE_SUBTEXT = new BooleanSetting("revanced_miniplayer_hide_subtext", FALSE, true, MINIPLAYER_TYPE.availability(MODERN_1, MODERN_3)); + public static final BooleanSetting MINIPLAYER_HIDE_OVERLAY_BUTTONS = new BooleanSetting("revanced_miniplayer_hide_overlay_buttons", FALSE, true, new MiniplayerHideOverlayButtonsAvailability()); + public static final BooleanSetting MINIPLAYER_HIDE_SUBTEXT = new BooleanSetting("revanced_miniplayer_hide_subtext", FALSE, true, MINIPLAYER_TYPE.availability(MODERN_1, MODERN_3, MODERN_4)); public static final BooleanSetting MINIPLAYER_HIDE_REWIND_FORWARD = new BooleanSetting("revanced_miniplayer_hide_rewind_forward", TRUE, true, MINIPLAYER_TYPE.availability(MODERN_1)); public static final BooleanSetting MINIPLAYER_ROUNDED_CORNERS = new BooleanSetting("revanced_miniplayer_rounded_corners", TRUE, true, MINIPLAYER_ANY_MODERN); public static final IntegerSetting MINIPLAYER_WIDTH_DIP = new IntegerSetting("revanced_miniplayer_width_dip", 192, true, MINIPLAYER_ANY_MODERN); @@ -282,6 +282,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting HIDE_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_hide_notifications_button", FALSE, true); public static final BooleanSetting SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_switch_create_with_notifications_button", TRUE, true, "revanced_switch_create_with_notifications_button_user_dialog_message"); + public static final BooleanSetting NAVIGATION_BAR_ANIMATIONS = new BooleanSetting("revanced_navigation_bar_animations", FALSE); public static final BooleanSetting DISABLE_TRANSLUCENT_STATUS_BAR = new BooleanSetting("revanced_disable_translucent_status_bar", FALSE, true, "revanced_disable_translucent_status_bar_user_dialog_message"); public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT = new BooleanSetting("revanced_disable_translucent_navigation_bar_light", FALSE, true); @@ -333,6 +334,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting DISABLE_PRECISE_SEEKING_GESTURE = new BooleanSetting("revanced_disable_precise_seeking_gesture", FALSE); public static final BooleanSetting HIDE_SEEKBAR = new BooleanSetting("revanced_hide_seekbar", FALSE, true); public static final BooleanSetting HIDE_SEEKBAR_THUMBNAIL = new BooleanSetting("revanced_hide_seekbar_thumbnail", FALSE, true); + public static final BooleanSetting FULLSCREEN_LARGE_SEEKBAR = new BooleanSetting("revanced_fullscreen_large_seekbar", FALSE); public static final BooleanSetting HIDE_TIMESTAMP = new BooleanSetting("revanced_hide_timestamp", FALSE); public static final BooleanSetting RESTORE_OLD_SEEKBAR_THUMBNAILS = new BooleanSetting("revanced_restore_old_seekbar_thumbnails", TRUE); public static final BooleanSetting SEEKBAR_TAPPING = new BooleanSetting("revanced_seekbar_tapping", FALSE); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ExternalDownloaderPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ExternalDownloaderPreference.java index 0165e13765..5e25ae10c2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ExternalDownloaderPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ExternalDownloaderPreference.java @@ -34,6 +34,7 @@ import java.util.function.Function; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.preference.CustomDialogListPreference; import app.revanced.extension.youtube.settings.Settings; @@ -210,7 +211,7 @@ protected void showDialog(@Nullable Bundle state) { final boolean usingCustomDownloader = Downloader.findByPackageName(packageName) == null; adapter = new CustomDialogListPreference.ListPreferenceArrayAdapter( context, - Utils.getResourceIdentifier("revanced_custom_list_item_checked", "layout"), + Utils.getResourceIdentifier(ResourceType.LAYOUT, "revanced_custom_list_item_checked"), getEntries(), getEntryValues(), usingCustomDownloader diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java index c4cb423137..95a5948493 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/preference/ReVancedPreferenceFragment.java @@ -38,6 +38,7 @@ import java.util.regex.Pattern; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.preference.AbstractPreferenceFragment; @@ -72,7 +73,9 @@ public class ReVancedPreferenceFragment extends AbstractPreferenceFragment { @SuppressLint("UseCompatLoadingForDrawables") public static Drawable getBackButtonDrawable() { - final int backButtonResource = getResourceIdentifier("revanced_settings_toolbar_arrow_left", "drawable"); + final int backButtonResource = getResourceIdentifier( + ResourceType.DRAWABLE, + "revanced_settings_toolbar_arrow_left"); Drawable drawable = Utils.getContext().getResources().getDrawable(backButtonResource); drawable.setTint(Utils.getAppForegroundColor()); return drawable; @@ -217,8 +220,11 @@ public void filterPreferences(String query) { noResultsPreference.setSelectable(false); // Set icon for the placeholder preference. noResultsPreference.setLayoutResource(getResourceIdentifier( - "revanced_preference_with_icon_no_search_result", "layout")); - noResultsPreference.setIcon(getResourceIdentifier("revanced_settings_search_icon", "drawable")); + ResourceType.LAYOUT, + "revanced_preference_with_icon_no_search_result")); + noResultsPreference.setIcon(getResourceIdentifier( + ResourceType.DRAWABLE, + "revanced_settings_search_icon")); preferenceScreen.addPreference(noResultsPreference); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java index 17a509f00e..a0194f0dc6 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java @@ -19,6 +19,7 @@ import java.util.concurrent.TimeUnit; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.youtube.settings.Settings; @@ -282,7 +283,8 @@ private static void navigationTabCreatedCallback(NavigationButton button, View t * the what would be the filled cairo icon. */ private static final int fillBellCairoBlack = Utils.getResourceIdentifier( - "yt_fill_bell_black_24", "drawable"); + ResourceType.DRAWABLE, + "yt_fill_bell_black_24"); /** * Injection point. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibilityObserver.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibilityObserver.kt index 26745755db..f5c51c5f39 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibilityObserver.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerControlsVisibilityObserver.kt @@ -3,6 +3,7 @@ package app.revanced.extension.youtube.shared import android.app.Activity import android.view.View import android.view.ViewGroup +import app.revanced.extension.shared.ResourceType import app.revanced.extension.shared.Utils import java.lang.ref.WeakReference @@ -19,13 +20,13 @@ class PlayerControlsVisibilityObserverImpl( * id of the direct parent of controls_layout, R.id.youtube_controls_overlay */ private val controlsLayoutParentId = - Utils.getResourceIdentifier(activity, "youtube_controls_overlay", "id") + Utils.getResourceIdentifier(activity, ResourceType.ID, "youtube_controls_overlay") /** * id of R.id.controls_layout */ private val controlsLayoutId = - Utils.getResourceIdentifier(activity, "controls_layout", "id") + Utils.getResourceIdentifier(activity, ResourceType.ID, "controls_layout") /** * reference to the controls layout view diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerType.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerType.kt index 147abc13f0..0b97b05c6e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerType.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/PlayerType.kt @@ -2,7 +2,6 @@ package app.revanced.extension.youtube.shared import app.revanced.extension.shared.Logger import app.revanced.extension.youtube.Event -import app.revanced.extension.youtube.patches.VideoInformation /** * Regular player type. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java index 570496a078..d3df3f230f 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/SegmentPlaybackController.java @@ -26,7 +26,6 @@ import androidx.annotation.Nullable; import java.lang.ref.WeakReference; -import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -151,9 +150,9 @@ public enum SponsorBlockDuration { private static long skipSegmentButtonEndTime; @Nullable private static String timeWithoutSegments; - private static int sponsorBarAbsoluteLeft; - private static int sponsorAbsoluteBarRight; - private static int sponsorBarThickness; + private static int seekbarAbsoluteLeft; + private static int seekbarAbsoluteRight; + private static int seekbarThickness; @Nullable private static SponsorSegment lastSegmentSkipped; @@ -923,31 +922,13 @@ public static void onSkipSegmentClicked(SponsorSegment segment) { * injection point. */ @SuppressWarnings("unused") - public static void setSponsorBarRect(Object self) { - try { - Field field = self.getClass().getDeclaredField("replaceMeWithsetSponsorBarRect"); - field.setAccessible(true); - Rect rect = (Rect) Objects.requireNonNull(field.get(self)); - setSponsorBarAbsoluteLeft(rect); - setSponsorBarAbsoluteRight(rect); - } catch (Exception ex) { - Logger.printException(() -> "setSponsorBarRect failure", ex); - } - } - - private static void setSponsorBarAbsoluteLeft(Rect rect) { - final int left = rect.left; - if (sponsorBarAbsoluteLeft != left) { - Logger.printDebug(() -> "setSponsorBarAbsoluteLeft: " + left); - sponsorBarAbsoluteLeft = left; - } - } - - private static void setSponsorBarAbsoluteRight(Rect rect) { - final int right = rect.right; - if (sponsorAbsoluteBarRight != right) { - Logger.printDebug(() -> "setSponsorBarAbsoluteRight: " + right); - sponsorAbsoluteBarRight = right; + public static void setSeekbarRectangle(Rect seekbarRect) { + final int left = seekbarRect.left; + final int right = seekbarRect.right; + if (seekbarAbsoluteLeft != left || seekbarAbsoluteRight != right) { + Logger.printDebug(() -> "setSeekbarRectangle left: " + left + " right: " + right); + seekbarAbsoluteLeft = left; + seekbarAbsoluteRight = right; } } @@ -955,8 +936,8 @@ private static void setSponsorBarAbsoluteRight(Rect rect) { * injection point. */ @SuppressWarnings("unused") - public static void setSponsorBarThickness(int thickness) { - sponsorBarThickness = thickness; + public static void setSeekbarThickness(int thickness) { + seekbarThickness = thickness; } /** @@ -966,8 +947,7 @@ public static void setSponsorBarThickness(int thickness) { public static String appendTimeWithoutSegments(String totalTime) { try { if (Settings.SB_ENABLED.get() && Settings.SB_VIDEO_LENGTH_WITHOUT_SEGMENTS.get() - && !TextUtils.isEmpty(totalTime) && !TextUtils.isEmpty(timeWithoutSegments) - && !isAdProgressTextVisible()) { + && !TextUtils.isEmpty(totalTime) && !TextUtils.isEmpty(timeWithoutSegments)) { // Force LTR layout, to match the same LTR video time/length layout YouTube uses for all languages return "\u202D" + totalTime + timeWithoutSegments; // u202D = left to right override } @@ -995,6 +975,7 @@ private static void calculateTimeWithoutSegments() { continue; } foundNonhighlightSegments = true; + long start = segment.start; final long end = segment.end; // To prevent nested segments from incorrectly counting additional time, @@ -1026,17 +1007,17 @@ private static void calculateTimeWithoutSegments() { * Injection point. */ @SuppressWarnings("unused") - public static void drawSponsorTimeBars(final Canvas canvas, final float posY) { + public static void drawSegmentTimeBars(final Canvas canvas, final float posY) { try { - if (segments == null || isAdProgressTextVisible()) return; + if (segments == null) return; final long videoLength = VideoInformation.getVideoLength(); if (videoLength <= 0) return; - final int thicknessDiv2 = sponsorBarThickness / 2; // rounds down - final float top = posY - (sponsorBarThickness - thicknessDiv2); + final int thicknessDiv2 = seekbarThickness / 2; // Rounds down. + final float top = posY - (seekbarThickness - thicknessDiv2); final float bottom = posY + thicknessDiv2; - final float videoMillisecondsToPixels = (1f / videoLength) * (sponsorAbsoluteBarRight - sponsorBarAbsoluteLeft); - final float leftPadding = sponsorBarAbsoluteLeft; + final float videoMillisecondsToPixels = (1f / videoLength) * (seekbarAbsoluteRight - seekbarAbsoluteLeft); + final float leftPadding = seekbarAbsoluteLeft; for (SponsorSegment segment : segments) { final float left = leftPadding + segment.start * videoMillisecondsToPixels; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/SegmentCategoryListPreference.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/SegmentCategoryListPreference.java index ee3c1c1387..3da8cd5d53 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/SegmentCategoryListPreference.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/objects/SegmentCategoryListPreference.java @@ -26,6 +26,7 @@ import java.util.Objects; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.preference.ColorPickerPreference; import app.revanced.extension.shared.settings.preference.ColorPickerView; @@ -100,10 +101,10 @@ protected void showDialog(Bundle state) { contentLayout.addView(radioGroup); // Inflate the color picker view. - View colorPickerContainer = LayoutInflater.from(context) - .inflate(getResourceIdentifier("revanced_color_picker", "layout"), null); + View colorPickerContainer = LayoutInflater.from(context).inflate( + getResourceIdentifier(ResourceType.LAYOUT, "revanced_color_picker"), null); dialogColorPickerView = colorPickerContainer.findViewById( - getResourceIdentifier("revanced_color_picker_view", "id")); + getResourceIdentifier(ResourceType.ID, "revanced_color_picker_view")); dialogColorPickerView.setColor(categoryColor); contentLayout.addView(colorPickerContainer); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java index 99dbf7e185..5ff9999871 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java @@ -59,6 +59,7 @@ public static void setVisibility(boolean visible, boolean animated) { private static boolean isButtonEnabled() { return Settings.SB_ENABLED.get() && Settings.SB_CREATE_NEW_SEGMENT.get() + && SegmentPlaybackController.videoHasSegments() && !SegmentPlaybackController.isAdProgressTextVisible(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/NewSegmentLayout.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/NewSegmentLayout.java index 0b0793388f..175d49b942 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/NewSegmentLayout.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/NewSegmentLayout.java @@ -10,6 +10,7 @@ import android.widget.FrameLayout; import android.widget.ImageButton; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.youtube.patches.VideoInformation; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.sponsorblock.SponsorBlockUtils; @@ -45,7 +46,10 @@ public NewSegmentLayout(final Context context, final AttributeSet attributeSet, super(context, attributeSet, defStyleAttr, defStyleRes); LayoutInflater.from(context).inflate( - getResourceIdentifier(context, "revanced_sb_new_segment", "layout"), this, true + getResourceIdentifier(context, + ResourceType.LAYOUT, "revanced_sb_new_segment"), + this, + true ); initializeButton( @@ -104,7 +108,7 @@ public NewSegmentLayout(final Context context, final AttributeSet attributeSet, */ private void initializeButton(final Context context, final String resourceIdentifierName, final ButtonOnClickHandlerFunction handler, final String debugMessage) { - ImageButton button = findViewById(getResourceIdentifier(context, resourceIdentifierName, "id")); + ImageButton button = findViewById(getResourceIdentifier(context, ResourceType.ID, resourceIdentifierName)); // Add ripple effect RippleDrawable rippleDrawable = new RippleDrawable( diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SkipSponsorButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SkipSponsorButton.java index 6ca96cd378..17b388bb7e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SkipSponsorButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SkipSponsorButton.java @@ -20,6 +20,7 @@ import java.util.Objects; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.sponsorblock.SegmentPlaybackController; import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment; @@ -56,9 +57,9 @@ public SkipSponsorButton(Context context, AttributeSet attributeSet, int defStyl public SkipSponsorButton(Context context, AttributeSet attributeSet, int defStyleAttr, int defStyleRes) { super(context, attributeSet, defStyleAttr, defStyleRes); - LayoutInflater.from(context).inflate(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button", "layout"), this, true); // layout:skip_ad_button + LayoutInflater.from(context).inflate(getResourceIdentifier(context, ResourceType.LAYOUT, "revanced_sb_skip_sponsor_button"), this, true); // layout:skip_ad_button setMinimumHeight(getResourceDimensionPixelSize("ad_skip_ad_button_min_height")); // dimen:ad_skip_ad_button_min_height - skipSponsorBtnContainer = Objects.requireNonNull(findViewById(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button_container", "id"))); // id:skip_ad_button_container + skipSponsorBtnContainer = Objects.requireNonNull(findViewById(getResourceIdentifier(context, ResourceType.ID, "revanced_sb_skip_sponsor_button_container"))); // id:skip_ad_button_container background = new Paint(); background.setColor(getResourceColor("skip_ad_button_background_color")); // color:skip_ad_button_background_color); @@ -69,7 +70,7 @@ public SkipSponsorButton(Context context, AttributeSet attributeSet, int defStyl border.setStrokeWidth(getResourceDimension("ad_skip_ad_button_border_width")); // dimen:ad_skip_ad_button_border_width); border.setStyle(Paint.Style.STROKE); - skipSponsorTextView = Objects.requireNonNull(findViewById(getResourceIdentifier(context, "revanced_sb_skip_sponsor_button_text", "id"))); // id:skip_ad_button_text; + skipSponsorTextView = Objects.requireNonNull(findViewById(getResourceIdentifier(context, ResourceType.ID, "revanced_sb_skip_sponsor_button_text"))); // id:skip_ad_button_text; defaultBottomMargin = getResourceDimensionPixelSize("skip_button_default_bottom_margin"); // dimen:skip_button_default_bottom_margin ctaBottomMargin = getResourceDimensionPixelSize("skip_button_cta_bottom_margin"); // dimen:skip_button_cta_bottom_margin diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java index dd753934a9..bcd1b8895b 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java @@ -15,6 +15,7 @@ import java.util.Objects; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.shared.PlayerType; import app.revanced.extension.youtube.sponsorblock.objects.SponsorSegment; @@ -62,15 +63,17 @@ public static void initialize(ViewGroup viewGroup) { Context context = Utils.getContext(); RelativeLayout layout = new RelativeLayout(context); - layout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT)); - LayoutInflater.from(context).inflate(getResourceIdentifier("revanced_sb_inline_sponsor_overlay", "layout"), layout); + layout.setLayoutParams(new RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)); + LayoutInflater.from(context).inflate(getResourceIdentifier(ResourceType.LAYOUT, + "revanced_sb_inline_sponsor_overlay"), layout); inlineSponsorOverlayRef = new WeakReference<>(layout); viewGroup.addView(layout); viewGroup.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() { @Override public void onChildViewAdded(View parent, View child) { - // ensure SB buttons and controls are always on top, otherwise the endscreen cards can cover the skip button + // Ensure SB buttons and controls are always on top, otherwise the end-screen cards can cover the skip button. RelativeLayout layout = inlineSponsorOverlayRef.get(); if (layout != null) { layout.bringToFront(); @@ -83,13 +86,13 @@ public void onChildViewRemoved(View parent, View child) { youtubeOverlaysLayoutRef = new WeakReference<>(viewGroup); skipHighlightButtonRef = new WeakReference<>(Objects.requireNonNull( - layout.findViewById(getResourceIdentifier("revanced_sb_skip_highlight_button", "id")))); + layout.findViewById(getResourceIdentifier(ResourceType.ID, "revanced_sb_skip_highlight_button")))); skipSponsorButtonRef = new WeakReference<>(Objects.requireNonNull( - layout.findViewById(getResourceIdentifier("revanced_sb_skip_sponsor_button", "id")))); + layout.findViewById(getResourceIdentifier(ResourceType.ID, "revanced_sb_skip_sponsor_button")))); NewSegmentLayout newSegmentLayout = Objects.requireNonNull( - layout.findViewById(getResourceIdentifier("revanced_sb_new_segment_view", "id"))); + layout.findViewById(getResourceIdentifier(ResourceType.ID, "revanced_sb_new_segment_view"))); newSegmentLayoutRef = new WeakReference<>(newSegmentLayout); newSegmentLayout.updateLayout(); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/VotingButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/VotingButton.java index 2403b5a35d..30fee1840c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/VotingButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/VotingButton.java @@ -59,8 +59,7 @@ public static void setVisibility(boolean visible, boolean animated) { } private static boolean isButtonEnabled() { - return Settings.SB_ENABLED.get() && Settings.SB_VOTING_BUTTON.get() - && SegmentPlaybackController.videoHasSegments() + return Settings.SB_ENABLED.get() && Settings.SB_CREATE_NEW_SEGMENT.get() && !SegmentPlaybackController.isAdProgressTextVisible(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity.kt index 7fafd83a79..dde62492de 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/SwipeControlsHostActivity.kt @@ -8,6 +8,7 @@ import android.view.MotionEvent import android.view.ViewGroup import app.revanced.extension.shared.Logger.printDebug import app.revanced.extension.shared.Logger.printException +import app.revanced.extension.youtube.patches.VersionCheckPatch import app.revanced.extension.youtube.settings.Settings import app.revanced.extension.youtube.shared.PlayerType import app.revanced.extension.youtube.swipecontrols.controller.AudioVolumeController @@ -237,6 +238,8 @@ class SwipeControlsHostActivity : Activity() { */ @Suppress("unused") @JvmStatic - fun allowSwipeChangeVideo(original: Boolean): Boolean = Settings.SWIPE_CHANGE_VIDEO.get() + fun allowSwipeChangeVideo(original: Boolean): Boolean = + // Feature can cause crashing if forced in newer targets. + !VersionCheckPatch.IS_20_22_OR_GREATER && Settings.SWIPE_CHANGE_VIDEO.get() } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/SwipeZonesController.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/SwipeZonesController.kt index 2c2edb9591..1a69c7aabe 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/SwipeZonesController.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/SwipeZonesController.kt @@ -3,6 +3,7 @@ package app.revanced.extension.youtube.swipecontrols.controller import android.app.Activity import android.util.TypedValue import android.view.ViewGroup +import app.revanced.extension.shared.ResourceType import app.revanced.extension.shared.Utils import app.revanced.extension.youtube.swipecontrols.misc.Rectangle import app.revanced.extension.youtube.swipecontrols.misc.applyDimension @@ -56,7 +57,8 @@ class SwipeZonesController( /** * id for R.id.player_view */ - private val playerViewId = Utils.getResourceIdentifier(host, "player_view", "id") + private val playerViewId = Utils.getResourceIdentifier( + host, ResourceType.ID, "player_view") /** * current bounding rectangle of the player diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/views/SwipeControlsOverlayLayout.kt b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/views/SwipeControlsOverlayLayout.kt index 71226c082d..2cec37b823 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/views/SwipeControlsOverlayLayout.kt +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/views/SwipeControlsOverlayLayout.kt @@ -14,12 +14,13 @@ import android.util.AttributeSet import android.view.HapticFeedbackConstants import android.view.View import android.widget.RelativeLayout +import app.revanced.extension.shared.ResourceType import app.revanced.extension.shared.StringRef.str import app.revanced.extension.shared.Utils import app.revanced.extension.youtube.swipecontrols.SwipeControlsConfigurationProvider import app.revanced.extension.youtube.swipecontrols.misc.SwipeControlsOverlay -import kotlin.math.min import kotlin.math.max +import kotlin.math.min import kotlin.math.round /** @@ -53,7 +54,7 @@ class SwipeControlsOverlayLayout( // Function to retrieve drawable resources by name. private fun getDrawable(name: String): Drawable { val drawable = resources.getDrawable( - Utils.getResourceIdentifier(context, name, "drawable"), + Utils.getResourceIdentifier(context, ResourceType.DRAWABLE, name), context.theme, ) drawable.setTint(config.overlayTextColor) @@ -86,7 +87,7 @@ class SwipeControlsOverlayLayout( // Initialize horizontal progress bar. val screenWidth = resources.displayMetrics.widthPixels - val layoutWidth = (screenWidth * 4 / 5).toInt() // Cap at ~360dp. + val layoutWidth = (screenWidth * 4 / 5) // Cap at ~360dp. horizontalProgressView = HorizontalProgressView( context, config.overlayBackgroundOpacity, @@ -630,7 +631,7 @@ class VerticalProgressView( if (isMinimalStyle) { canvas.drawText(displayText, textX, textStartY, textPaint) } else { - val progressStartY = (iconEndY + padding).toFloat() + val progressStartY = (iconEndY + padding) val progressEndY = textStartY - textPaint.textSize - padding val progressHeight = progressEndY - progressStartY diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java index 0c878616c1..bd558c4c80 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/videoplayer/VideoQualityDialogButton.java @@ -38,6 +38,7 @@ import java.util.List; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.patches.VideoInformation; import app.revanced.extension.youtube.patches.playback.quality.RememberVideoQualityPatch; @@ -421,13 +422,13 @@ public void onAnimationRepeat(Animation animation) {} private static class CustomQualityAdapter extends ArrayAdapter { private static final int CUSTOM_LIST_ITEM_CHECKED_ID = Utils.getResourceIdentifier( - "revanced_custom_list_item_checked", "layout"); + ResourceType.LAYOUT, "revanced_custom_list_item_checked"); private static final int CHECK_ICON_ID = Utils.getResourceIdentifier( - "revanced_check_icon", "id"); + ResourceType.ID, "revanced_check_icon"); private static final int CHECK_ICON_PLACEHOLDER_ID = Utils.getResourceIdentifier( - "revanced_check_icon_placeholder", "id"); + ResourceType.ID, "revanced_check_icon_placeholder"); private static final int ITEM_TEXT_ID = Utils.getResourceIdentifier( - "revanced_item_text", "id"); + ResourceType.ID, "revanced_item_text"); private int selectedPosition = -1; diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index f55818425b..618e90c202 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,8 +1,8 @@ [versions] -revanced-patcher = "21.0.0" +revanced-patcher = "22.0.0" # Tracking https://github.com/google/smali/issues/64. #noinspection GradleDependency -smali = "3.0.5" +smali = "3.0.8" # 8.3.0 causes java verifier error: https://github.com/ReVanced/revanced-patches/issues/2818. #noinspection GradleDependency agp = "8.2.2" diff --git a/patches/api/patches.api b/patches/api/patches.api index 122bb38bc2..6f1c3bdab2 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -64,10 +64,6 @@ public final class app/revanced/patches/all/misc/debugging/EnableAndroidDebuggin public static final fun getEnableAndroidDebuggingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatchKt { - public static final fun getChangeDataDirectoryLocationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/all/misc/directory/documentsprovider/ExportInternalDataDocumentsProviderPatchKt { public static final fun getExportInternalDataDocumentsProviderPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } @@ -152,10 +148,6 @@ public final class app/revanced/patches/angulus/ads/RemoveAdsPatchKt { public static final fun getAngulusPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/backdrops/misc/pro/ProUnlockPatchKt { - public static final fun getProUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatchKt { public static final fun getRemovePlayLimitsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -232,10 +224,6 @@ public final class app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatc public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatchKt { - public static final fun getRestoreHiddenBackUpWhileChargingTogglePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictionsKt { public static final fun getRemoveDeviceRestrictionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -308,14 +296,6 @@ public final class app/revanced/patches/messenger/inbox/HideInboxSubtabsPatchKt public static final fun getHideInboxSubtabsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatchKt { - public static final fun getDisableSwitchingEmojiToStickerPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatchKt { - public static final fun getDisableTypingIndicatorPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/messenger/layout/HideFacebookButtonPatchKt { public static final fun getHideFacebookButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -328,14 +308,6 @@ public final class app/revanced/patches/messenger/misc/extension/ExtensionPatchK public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/messenger/navbar/RemoveMetaAITabPatchKt { - public static final fun getRemoveMetaAITabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/meta/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatchKt { public static final fun getForceEnglishLocalePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -356,10 +328,6 @@ public final class app/revanced/patches/music/interaction/permanentrepeat/Perman public static final fun getPermanentRepeatPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatchKt { - public static final fun getPermanentShufflePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/music/layout/compactheader/HideCategoryBarKt { public static final fun getHideCategoryBar ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -412,10 +380,6 @@ public final class app/revanced/patches/netguard/broadcasts/removerestriction/Re public static final fun getRemoveBroadcastsRestrictionPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/nunl/ads/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -424,10 +388,6 @@ public final class app/revanced/patches/nunl/firebase/SpoofCertificatePatchKt { public static final fun getSpoofCertificatePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/nyx/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatchKt { public static final fun getFixCrashPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -654,16 +614,11 @@ public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/ public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatchKt { - public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatchKt { public static final fun getDisableScreenshotPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } public final class app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatchKt { - public static final fun getUnlockPremiumIconPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getUnlockPremiumIconsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -689,26 +644,22 @@ public final class app/revanced/patches/shared/misc/extension/ExtensionHook { public final class app/revanced/patches/shared/misc/extension/SharedExtensionPatchKt { public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; + public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function0; public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static final fun sharedExtensionPatch (Ljava/lang/String;[Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun sharedExtensionPatch ([Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch; + public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/jvm/functions/Function0; + public static final fun sharedExtensionPatch (Ljava/lang/String;[Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun sharedExtensionPatch ([Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch; } public final class app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatchKt { public static final fun getVerticalScrollPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/shared/misc/gms/FingerprintsKt { - public static final field GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME Ljava/lang/String; -} - public final class app/revanced/patches/shared/misc/gms/GmsCoreSupportPatchKt { public static final fun gmsCoreSupportPatch (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; public static synthetic fun gmsCoreSupportPatch$default (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch; - public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch; + public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; } public final class app/revanced/patches/shared/misc/hex/HexPatchBuilder : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker { @@ -747,23 +698,64 @@ public final class app/revanced/patches/shared/misc/hex/Replacement { } public final class app/revanced/patches/shared/misc/mapping/ResourceElement { - public final fun component1 ()Ljava/lang/String; + public fun (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;J)V + public final fun component1 ()Lapp/revanced/patches/shared/misc/mapping/ResourceType; public final fun component2 ()Ljava/lang/String; public final fun component3 ()J - public final fun copy (Ljava/lang/String;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; - public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceElement;Ljava/lang/String;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; + public final fun copy (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; + public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceElement;Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; public fun equals (Ljava/lang/Object;)Z public final fun getId ()J public final fun getName ()Ljava/lang/String; - public final fun getType ()Ljava/lang/String; + public final fun getType ()Lapp/revanced/patches/shared/misc/mapping/ResourceType; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { - public static final fun get (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)J + public static final fun getResourceElements ()Ljava/util/Collection; + public static final fun getResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)J public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun getResourceMappings ()Ljava/util/List; + public static final fun hasResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)Z + public static final fun resourceLiteral (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralFilter; + public static synthetic fun resourceLiteral$default (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralFilter; +} + +public final class app/revanced/patches/shared/misc/mapping/ResourceType : java/lang/Enum { + public static final field ANIM Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ANIMATOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ARRAY Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ATTR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field BOOL Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field COLOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field Companion Lapp/revanced/patches/shared/misc/mapping/ResourceType$Companion; + public static final field DIMEN Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field DRAWABLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field FONT Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field FRACTION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ID Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field INTEGER Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field INTERPOLATOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field LAYOUT Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field MENU Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field MIPMAP Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field NAVIGATION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field PLURALS Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field RAW Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STRING Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STYLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STYLEABLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field TRANSITION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field VALUES Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field XML Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getValue ()Ljava/lang/String; + public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static fun values ()[Lapp/revanced/patches/shared/misc/mapping/ResourceType; +} + +public final class app/revanced/patches/shared/misc/mapping/ResourceType$Companion { + public final fun fromValue (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/mapping/ResourceType; } public final class app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatchKt { @@ -773,7 +765,6 @@ public final class app/revanced/patches/shared/misc/pairip/license/DisableLicens public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt { public static final fun overrideThemeColors (Ljava/lang/String;Ljava/lang/String;)V public static final fun settingsPatch (Ljava/util/List;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun settingsPatch (Lkotlin/Pair;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; public static synthetic fun settingsPatch$default (Ljava/util/List;Ljava/util/Set;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; } @@ -866,8 +857,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/ListPref public fun ()V public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getEntries ()Lapp/revanced/util/resource/ArrayResource; public final fun getEntriesKey ()Ljava/lang/String; public final fun getEntryValues ()Lapp/revanced/util/resource/ArrayResource; @@ -979,14 +970,6 @@ public final class app/revanced/patches/spotify/layout/theme/CustomThemePatchKt public static final fun getCustomThemePatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/spotify/lite/ondemand/OnDemandPatchKt { - public static final fun getOnDemandPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/spotify/misc/UnlockPremiumPatchKt { - public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/spotify/misc/extension/ExtensionPatchKt { public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -995,14 +978,6 @@ public final class app/revanced/patches/spotify/misc/fix/SpoofClientPatchKt { public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatchKt { - public static final fun getSpoofPackageInfoPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/spotify/misc/fix/SpoofSignaturePatchKt { - public static final fun getSpoofSignaturePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatchKt { public static final fun getFixFacebookLoginPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1019,10 +994,6 @@ public final class app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunch public static final fun getFixThirdPartyLaunchersWidgets ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/spotify/navbar/PremiumNavbarTabPatchKt { - public static final fun getPremiumNavbarTabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/stocard/layout/HideOffersTabPatchKt { public static final fun getHideOffersTabPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } @@ -1239,10 +1210,6 @@ public final class app/revanced/patches/twitter/misc/links/SanitizeSharingLinksP public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatchKt { public static final fun getFirebaseGetCertPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1251,10 +1218,6 @@ public final class app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnloc public static final fun getPromoCodeUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/ad/general/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1276,7 +1239,6 @@ public final class app/revanced/patches/youtube/interaction/dialog/RemoveViewerD } public final class app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatchKt { - public static final fun getDisableChapterSkipDoubleTapPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getDisableDoubleTapActionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1353,15 +1315,7 @@ public final class app/revanced/patches/youtube/layout/hide/fullscreenambientmod } public final class app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatchKt { - public static final fun getAlbumCardId ()J - public static final fun getBarContainerHeightId ()J - public static final fun getCrowdfundingBoxId ()J - public static final fun getExpandButtonDownId ()J - public static final fun getFabButtonId ()J - public static final fun getFilterBarHeightId ()J public static final fun getHideLayoutComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getRelatedChipCloudMarginId ()J - public static final fun getYouTubeLogo ()J } public final class app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatchKt { @@ -1380,10 +1334,6 @@ public final class app/revanced/patches/youtube/layout/hide/rollingnumber/Disabl public static final fun getDisableRollingNumberAnimationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatchKt { - public static final fun getHideSeekbarPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatchKt { public static final fun getHideShortsComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1392,10 +1342,6 @@ public final class app/revanced/patches/youtube/layout/hide/signintotvpopup/Disa public static final fun getDisableSignInToTvPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatchKt { - public static final fun getDisableSuggestedVideoEndScreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPatchKt { public static final fun getHideTimestampPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1408,14 +1354,6 @@ public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupP public static final fun getPlayerPopupPanelsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatchKt { - public static final fun getPlayerControlsBackgroundPatch ()Lapp/revanced/patcher/patch/ResourcePatch; -} - -public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenKt { - public static final fun getOpenVideosFullscreen ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatchKt { public static final fun getOpenVideosFullscreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1470,10 +1408,6 @@ public final class app/revanced/patches/youtube/layout/startupshortsreset/Disabl public static final fun getDisableResumingShortsOnStartupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatchKt { - public static final fun getEnableTabletLayoutPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/theme/LithoColorHookPatchKt { public static final fun getLithoColorHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getLithoColorOverrideHook ()Lkotlin/jvm/functions/Function2; @@ -1519,14 +1453,6 @@ public final class app/revanced/patches/youtube/misc/extension/SharedExtensionPa public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatchKt { - public static final fun getSpoofVideoStreamsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatchKt { - public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/misc/fix/playbackspeed/FIxPlaybackSpeedWhilePlayingPatchKt { public static final fun getFixPlaybackSpeedWhilePlayingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1574,7 +1500,6 @@ public final class app/revanced/patches/youtube/misc/playercontrols/PlayerContro public final class app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatchKt { public static final fun getAddBottomControl ()Lkotlin/jvm/functions/Function1; public static final fun getPlayerControlsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getPlayerControlsResourcePatch ()Lapp/revanced/patcher/patch/ResourcePatch; public static final fun initializeBottomControl (Ljava/lang/String;)V public static final fun injectVisibilityCheckCall (Ljava/lang/String;)V } @@ -1585,9 +1510,6 @@ public final class app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPa public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPatchKt { public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun is_19_03_or_greater ()Z - public static final fun is_19_04_or_greater ()Z - public static final fun is_19_16_or_greater ()Z public static final fun is_19_17_or_greater ()Z public static final fun is_19_18_or_greater ()Z public static final fun is_19_23_or_greater ()Z @@ -1612,6 +1534,15 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_20_10_or_greater ()Z public static final fun is_20_14_or_greater ()Z public static final fun is_20_15_or_greater ()Z + public static final fun is_20_19_or_greater ()Z + public static final fun is_20_20_or_greater ()Z + public static final fun is_20_21_or_greater ()Z + public static final fun is_20_22_or_greater ()Z + public static final fun is_20_26_or_greater ()Z + public static final fun is_20_28_or_greater ()Z + public static final fun is_20_30_or_greater ()Z + public static final fun is_20_31_or_greater ()Z + public static final fun is_20_34_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { @@ -1654,10 +1585,6 @@ public final class app/revanced/patches/youtube/misc/spoof/UserAgentClientSpoofP public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatchKt { - public static final fun getZoomHapticsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatchKt { public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1722,14 +1649,6 @@ public final class app/revanced/patches/youtube/video/videoid/VideoIdPatchKt { public static final fun hookVideoId (Ljava/lang/String;)V } -public final class app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatchKt { - public static final fun getRestoreOldVideoQualityMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatchKt { - public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/util/BytecodeUtilsKt { public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ILjava/lang/String;)V public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ILjava/lang/String;[Lapp/revanced/patcher/util/smali/ExternalLabel;)V @@ -1779,6 +1698,7 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun indexOfFirstResourceIdOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V public static final fun literal (Lapp/revanced/patcher/FingerprintBuilder;Lkotlin/jvm/functions/Function0;)V + public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;B)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;C)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;D)V @@ -1786,9 +1706,9 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;I)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;J)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/String;)V + public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Void;)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;S)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Z)V - public static synthetic fun returnEarly$default (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ZILjava/lang/Object;)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;B)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;C)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;D)V @@ -1796,6 +1716,7 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;I)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;J)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/String;)V + public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Void;)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;S)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Z)V public static final fun transformMethods (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lkotlin/jvm/functions/Function1;)V diff --git a/patches/build.gradle.kts b/patches/build.gradle.kts index 6153055b94..a34a628fc4 100644 --- a/patches/build.gradle.kts +++ b/patches/build.gradle.kts @@ -12,6 +12,12 @@ patches { } } +repositories { + mavenLocal() + gradlePluginPortal() + google() +} + dependencies { // Required due to smali, or build fails. Can be removed once smali is bumped. implementation(libs.guava) diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatch.kt deleted file mode 100644 index 8046c11fc3..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatch.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.revanced.patches.all.misc.directory - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.all.misc.directory.documentsprovider.exportInternalDataDocumentsProviderPatch - -@Suppress("unused") -@Deprecated( - "Superseded by internalDataDocumentsProviderPatch", - ReplaceWith("internalDataDocumentsProviderPatch"), -) -val changeDataDirectoryLocationPatch = bytecodePatch( - // name = "Change data directory location", - description = "Changes the data directory in the application from " + - "the app internal storage directory to /sdcard/android/data accessible by root-less devices." + - "Using this patch can cause unexpected issues with some apps.", - use = false, -) { - dependsOn(exportInternalDataDocumentsProviderPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt index 6564f4f26a..8e694f103a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/all/misc/transformation/TransformInstructionsPatch.kt @@ -36,7 +36,7 @@ fun transformInstructionsPatch( } }.forEach { (classDef, methods) -> // And finally transform the methods... - val mutableClass = proxy(classDef).mutableClass + val mutableClass = mutableClassBy(classDef) methods.map(mutableClass::findMutableMethodOf).forEach methods@{ mutableMethod -> val patchIndices = findPatchIndices(mutableClass, mutableMethod)?.toCollection(ArrayDeque()) diff --git a/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt index 1339149f43..35d31a5f9e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.amazon import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val deepLinkingFingerprint = fingerprint { +internal val deepLinkingFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE) returns("Z") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt index 3196adb7e1..12ded4c060 100644 --- a/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt @@ -11,7 +11,7 @@ import com.android.tools.smali.dexlib2.AccessFlags // This fingerprint targets a method that returns the daily measurement count. // This method is used to determine if the user has reached the daily limit of measurements. -internal val getDailyMeasurementCountFingerprint = fingerprint { +internal val getDailyMeasurementCountFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE) returns("I") strings("dailyMeasurementCount") diff --git a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt deleted file mode 100644 index f8b1466228..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.revanced.patches.backdrops.misc.pro - -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.Opcode - -@Deprecated("Fingerprint no longer resolves and will soon be deleted.") -internal val proUnlockFingerprint = fingerprint { - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT, - Opcode.IF_EQZ, - ) - custom { method, _ -> - method.name == "lambda\$existPurchase\$0" && - method.definingClass == "Lcom/backdrops/wallpapers/data/local/DatabaseHandlerIAB;" - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt deleted file mode 100644 index 0516e1eb72..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/ProUnlockPatch.kt +++ /dev/null @@ -1,24 +0,0 @@ -package app.revanced.patches.backdrops.misc.pro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -@Suppress("unused") -@Deprecated("This patch no longer works and will soon be deleted.") -val proUnlockPatch = bytecodePatch{ - compatibleWith("com.backdrops.wallpapers") - - execute { - val registerIndex = proUnlockFingerprint.patternMatch!!.endIndex - 1 - - proUnlockFingerprint.method.apply { - val register = getInstruction(registerIndex).registerA - addInstruction( - proUnlockFingerprint.patternMatch!!.endIndex, - "const/4 v$register, 0x1", - ) - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt index 15d306bc94..c9eccaea68 100644 --- a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.bandcamp.limitations import app.revanced.patcher.fingerprint -internal val handlePlaybackLimitsFingerprint = fingerprint { +internal val handlePlaybackLimitsFingerprint by fingerprint { strings("track_id", "play_count") } diff --git a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt index 387b0a0be8..6f9c9c2c63 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.cieid.restrictions.root import app.revanced.patcher.fingerprint -internal val checkRootFingerprint = fingerprint { +internal val checkRootFingerprint by fingerprint { custom { method, _ -> method.name == "onResume" && method.definingClass == "Lit/ipzs/cieid/BaseActivity;" } diff --git a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt index 9dd6844fda..4a48680994 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt @@ -3,12 +3,12 @@ package app.revanced.patches.cricbuzz.ads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val userStateSwitchFingerprint = fingerprint { +internal val userStateSwitchFingerprint by fingerprint { opcodes(Opcode.SPARSE_SWITCH) strings("key.user.state", "NA") } -internal val cb11ConstructorFingerprint = fingerprint { +internal val cb11ConstructorFingerprint by fingerprint { parameters( "Ljava/lang/String;", "Ljava/lang/String;", @@ -26,7 +26,7 @@ internal val cb11ConstructorFingerprint = fingerprint { } } -internal val getBottomBarFingerprint = fingerprint { +internal val getBottomBarFingerprint by fingerprint { custom { method, classDef -> method.name == "getBottomBar" && classDef.endsWith("HomeMenu;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt index 0266e0344d..6184f77a2a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.crunchyroll.ads import app.revanced.patcher.fingerprint -internal val videoUrlReadyToStringFingerprint = fingerprint { +internal val videoUrlReadyToStringFingerprint by fingerprint { strings("VideoUrlReady(url=", ", enableAds=") } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt index af93ceb16c..f33cb2d108 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/DisableAdsPatch.kt @@ -19,16 +19,16 @@ val disableAdsPatch = bytecodePatch( // SharedPreferences has a debug boolean value with key "disable_ads", which maps to "DebugCategory.DISABLE_ADS". // // MonetizationDebugSettings seems to be the most general setting to work fine. - initializeMonetizationDebugSettingsFingerprint - .match(monetizationDebugSettingsToStringFingerprint.classDef) - .method.apply { - val insertIndex = initializeMonetizationDebugSettingsFingerprint.patternMatch!!.startIndex - val register = getInstruction(insertIndex).registerA + initializeMonetizationDebugSettingsFingerprint.match( + monetizationDebugSettingsToStringFingerprint.classDef + ).method.apply { + val insertIndex = initializeMonetizationDebugSettingsFingerprint.instructionMatches.first().index + val register = getInstruction(insertIndex).registerA - addInstructions( - insertIndex, - "const/4 v$register, 0x1", - ) - } + addInstructions( + insertIndex, + "const/4 v$register, 0x1", + ) + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt index 8ec0068dae..b7152154c1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt @@ -4,14 +4,14 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val initializeMonetizationDebugSettingsFingerprint = fingerprint { +internal val initializeMonetizationDebugSettingsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") // Parameters have not been reliable for fingerprinting between versions. opcodes(Opcode.IPUT_BOOLEAN) } -internal val monetizationDebugSettingsToStringFingerprint = fingerprint { +internal val monetizationDebugSettingsToStringFingerprint by fingerprint { strings("MonetizationDebugSettings(") // Partial string match. custom { method, _ -> method.name == "toString" } -} \ No newline at end of file +} diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt index 833f9dd7da..715bb80def 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/EnableDebugMenuPatch.kt @@ -14,7 +14,7 @@ val enableDebugMenuPatch = bytecodePatch( execute { initializeBuildConfigProviderFingerprint.method.apply { - val insertIndex = initializeBuildConfigProviderFingerprint.patternMatch!!.startIndex + val insertIndex = initializeBuildConfigProviderFingerprint.instructionMatches.first().index val register = getInstruction(insertIndex).registerA addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt index 543e40b434..b1ec382943 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt @@ -11,9 +11,8 @@ import com.android.tools.smali.dexlib2.Opcode * - `isDebug`: compares "release" with "debug" <-- we want to force this to `true` */ -internal val initializeBuildConfigProviderFingerprint = fingerprint { +internal val initializeBuildConfigProviderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes(Opcode.IPUT_BOOLEAN) strings("debug", "release", "china") } diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt index e84a448baa..396f44ff05 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val baseModelMapperFingerprint = fingerprint { +internal val baseModelMapperFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Lcom/facebook/graphql/modelutil/BaseModelWithTree;") parameters("Ljava/lang/Class", "I", "I") @@ -17,7 +17,7 @@ internal val baseModelMapperFingerprint = fingerprint { ) } -internal val getSponsoredDataModelTemplateFingerprint = fingerprint { +internal val getSponsoredDataModelTemplateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() @@ -33,7 +33,7 @@ internal val getSponsoredDataModelTemplateFingerprint = fingerprint { } } -internal val getStoryVisibilityFingerprint = fingerprint { +internal val getStoryVisibilityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt index 49d54c2b3f..abb222296a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/HideSponsoredStoriesPatch.kt @@ -67,7 +67,7 @@ val hideSponsoredStoriesPatch = bytecodePatch( // Check if the parameter type is GraphQLStory and if sponsoredDataModelGetter returns a non-null value. // If so, hide the story by setting the visibility to StoryVisibility.GONE. getStoryVisibilityFingerprint.method.addInstructionsWithLabels( - getStoryVisibilityFingerprint.patternMatch!!.startIndex, + getStoryVisibilityFingerprint.instructionMatches.first().index, """ instance-of v0, p0, $graphQlStoryClassDescriptor if-eqz v0, :resume_normal diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt index 293d7ee82f..0a93699f01 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt @@ -3,11 +3,11 @@ package app.revanced.patches.facebook.ads.story import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.iface.value.StringEncodedValue -internal val adsInsertionFingerprint = fieldFingerprint( +internal val adsInsertionFingerprint by fieldFingerprint( fieldValue = "AdBucketDataSourceUtil\$attemptAdsInsertion\$1", ) -internal val fetchMoreAdsFingerprint = fieldFingerprint( +internal val fetchMoreAdsFingerprint by fieldFingerprint( fieldValue = "AdBucketDataSourceUtil\$attemptFetchMoreAds\$1", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt index 4c8ee1c541..2347d1143d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt @@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#isBootStateOk (3.0.1) -internal val bootStateFingerprint = fingerprint { +internal val bootStateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") opcodes( @@ -30,7 +30,7 @@ internal val bootStateFingerprint = fingerprint { } // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#createKey (3.0.1) -internal val createKeyFingerprint = fingerprint { +internal val createKeyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") strings("attestation", "SHA-256", "random", "EC", "AndroidKeyStore") diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt index fec7f1249f..7460461e43 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt @@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.RootDetection#isRooted (3.0.1) -internal val rootDetectionFingerprint = fingerprint { +internal val rootDetectionFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt index ee7997a54e..6057630e69 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/EnableCustomTabsPatch.kt @@ -14,7 +14,7 @@ val enableCustomTabsPatch = bytecodePatch( execute { launchCustomTabFingerprint.method.apply { - val checkIndex = launchCustomTabFingerprint.patternMatch!!.endIndex + 1 + val checkIndex = launchCustomTabFingerprint.instructionMatches.last().index + 1 val register = getInstruction(checkIndex).registerA replaceInstruction(checkIndex, "const/4 v$register, 0x1") diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt index 8880c010e9..387d1cbf61 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val launchCustomTabFingerprint = fingerprint { +internal val launchCustomTabFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.IPUT_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt index 6ddeb3e07f..e23ac4bc48 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.googlenews.misc.gms import app.revanced.patcher.fingerprint -internal val magazinesActivityOnCreateFingerprint = fingerprint { +internal val magazinesActivityOnCreateFingerprint by fingerprint { custom { methodDef, classDef -> methodDef.name == "onCreate" && classDef.endsWith("/StartActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt index 71dda1f3ac..0c82cfe15e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.googlephotos.misc.backup import app.revanced.patcher.fingerprint -internal val isDCIMFolderBackupControlDisabled = fingerprint { +internal val isDCIMFolderBackupControlDisabled by fingerprint { returns("Z") strings("/dcim", "/mars_files/") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt index 95f2a3dba7..bd63a4a409 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.googlephotos.misc.features import app.revanced.patcher.fingerprint -internal val initializeFeaturesEnumFingerprint = fingerprint { +internal val initializeFeaturesEnumFingerprint by fingerprint { strings("com.google.android.apps.photos.NEXUS_PRELOAD") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt index f47c1a3d94..cbd720730a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.googlephotos.misc.gms import app.revanced.patcher.fingerprint -internal val homeActivityOnCreateFingerprint = fingerprint { +internal val homeActivityOnCreateFingerprint by fingerprint { custom { methodDef, classDef -> methodDef.name == "onCreate" && classDef.endsWith("/HomeActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt deleted file mode 100644 index 54c20a7f8c..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt +++ /dev/null @@ -1,8 +0,0 @@ -package app.revanced.patches.googlephotos.misc.preferences - -import app.revanced.patcher.fingerprint - -internal val backupPreferencesFingerprint = fingerprint { - returns("Lcom/google/android/apps/photos/backup/data/BackupPreferences;") - strings("backup_prefs_had_backup_only_when_charging_enabled") -} diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatch.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatch.kt deleted file mode 100644 index ea65658bda..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatch.kt +++ /dev/null @@ -1,30 +0,0 @@ -package app.revanced.patches.googlephotos.misc.preferences - -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -@Deprecated("This patch no longer works and this code will soon be deleted") -@Suppress("unused") -val restoreHiddenBackUpWhileChargingTogglePatch = bytecodePatch( - description = "Restores a hidden toggle to only run backups when the device is charging." -) { - compatibleWith("com.google.android.apps.photos"("7.11.0.705590205")) - - execute { - // Patches 'backup_prefs_had_backup_only_when_charging_enabled' to always be true. - backupPreferencesFingerprint.let { - it.method.apply { - val index = indexOfFirstInstructionOrThrow( - it.stringMatches!!.first().index, - Opcode.MOVE_RESULT - ) - val register = getInstruction(index).registerA - addInstruction(index + 1, "const/4 v$register, 0x1") - } - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt index 62e1e5f16b..431ea6c26c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.googlerecorder.restrictions import app.revanced.patcher.fingerprint -internal val onApplicationCreateFingerprint = fingerprint { +internal val onApplicationCreateFingerprint by fingerprint { strings("com.google.android.feature.PIXEL_2017_EXPERIENCE") custom { method, classDef -> if (method.name != "onCreate") return@custom false diff --git a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions.kt b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions.kt index bd6921bfb0..6aec4c6000 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictions.kt @@ -14,7 +14,7 @@ val removeDeviceRestrictionsPatch = bytecodePatch( compatibleWith("com.google.android.apps.recorder") execute { - val featureStringIndex = onApplicationCreateFingerprint.stringMatches!!.first().index + val featureStringIndex = onApplicationCreateFingerprint.stringMatches.first().index onApplicationCreateFingerprint.method.apply { // Remove check for device restrictions. diff --git a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt index 2fa2c5b851..bed5ce6300 100644 --- a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.hexeditor.ad import app.revanced.patcher.fingerprint -internal val primaryAdsFingerprint = fingerprint { +internal val primaryAdsFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("PreferencesHelper;") && method.name == "isAdsDisabled" } diff --git a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt index 84db554572..fe15366f40 100644 --- a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.iconpackstudio.misc.pro import app.revanced.patcher.fingerprint -internal val checkProFingerprint = fingerprint { +internal val checkProFingerprint by fingerprint { returns("Z") custom { _, classDef -> classDef.endsWith("IPSPurchaseRepository;") } } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/Fingerprints.kt index 38f814f6d4..48c0f31ff1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.idaustria.detection.root import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val attestationSupportedCheckFingerprint = fingerprint { +internal val attestationSupportedCheckFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") custom { method, classDef -> @@ -12,7 +12,7 @@ internal val attestationSupportedCheckFingerprint = fingerprint { } } -internal val bootloaderCheckFingerprint = fingerprint { +internal val bootloaderCheckFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") custom { method, classDef -> @@ -21,7 +21,7 @@ internal val bootloaderCheckFingerprint = fingerprint { } } -internal val rootCheckFingerprint = fingerprint { +internal val rootCheckFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt index 61cd9605f1..23e2a12edd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.idaustria.detection.signature import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val spoofSignatureFingerprint = fingerprint { +internal val spoofSignatureFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt index 573bd72e35..151718de57 100644 --- a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.inshorts.ad import app.revanced.patcher.fingerprint -internal val inshortsAdsFingerprint = fingerprint { +internal val inshortsAdsFingerprint by fingerprint { returns("V") strings("GoogleAdLoader", "exception in requestAd") } \ No newline at end of file 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 3b401a8423..519833d629 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 @@ -4,7 +4,7 @@ package app.revanced.patches.instagram.hide.navigation import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val tabCreateButtonsLoopStartFingerprint = fingerprint { +internal val tabCreateButtonsLoopStartFingerprint by fingerprint { returns("V") strings("InstagramMainActivity.createTabButtons") opcodes( @@ -16,7 +16,7 @@ internal val tabCreateButtonsLoopStartFingerprint = fingerprint { ) } -internal val tabCreateButtonsLoopEndFingerprint = fingerprint { +internal val tabCreateButtonsLoopEndFingerprint by fingerprint { returns("V") strings("InstagramMainActivity.createTabButtons") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt index 3b58aa8c2f..40f6ef5073 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt @@ -2,8 +2,7 @@ package app.revanced.patches.instagram.hide.stories import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode - -internal val getOrCreateAvatarViewFingerprint = fingerprint { +internal val getOrCreateAvatarViewFingerprint by fingerprint { parameters() returns("L") custom { method, classDef -> 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 47ebe189b3..1890ba252b 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 @@ -5,11 +5,11 @@ 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 isValidSignatureClassFingerprint by fingerprint { strings("The provider for uri '", "' is not trusted: ") } -internal val isValidSignatureMethodFingerprint = fingerprint { +internal val isValidSignatureMethodFingerprint by fingerprint { parameters("L", "Z") returns("Z") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt index 30242b8d94..431bbd99a2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt @@ -3,9 +3,8 @@ package app.revanced.patches.irplus.ad import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val irplusAdsFingerprint = fingerprint { +internal val irplusAdsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters("L", "Z") strings("TAGGED") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt index 6345541e14..aefb36de6f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isLoggedInFingerprint = fingerprint { +internal val isLoggedInFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) returns("Z") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt index 5a00dc68c1..3d001bb99f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val hasPurchasedFingerprint = fingerprint { +internal val hasPurchasedFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Z") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt index 0dfbf5cdab..3914e00b12 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val licenseValidationFingerprint = fingerprint { +internal val licenseValidationFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("Landroid/content/Context;") diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt index 75912318ba..396e7267d4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val verifySignatureFingerprint = fingerprint(fuzzyPatternScanThreshold = 2) { +internal val verifySignatureFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("Landroid/app/Activity;") diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt index 1f16bb10ec..f6faf995af 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isFreeVersionFingerprint = fingerprint { +internal val isFreeVersionFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/Boolean;") parameters("Landroid/content/Context;") diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt index 185c88f94c..fb5961db24 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt @@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.value.StringEncodedValue -internal val createInboxSubTabsFingerprint = fingerprint { +internal val createInboxSubTabsFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) opcodes( @@ -22,7 +22,7 @@ internal val createInboxSubTabsFingerprint = fingerprint { } } -internal val loadInboxAdsFingerprint = fingerprint { +internal val loadInboxAdsFingerprint by fingerprint { returns("V") strings( "ads_load_begin", diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt deleted file mode 100644 index b9e301725c..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatch.kt +++ /dev/null @@ -1,28 +0,0 @@ -package app.revanced.patches.messenger.inputfield - -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.bytecodePatch -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -/** - * This patch will be deleted soon. - * - * Pull requests to update this patch to the latest app target are invited. - */ -@Deprecated("This patch only works with an outdated app target that is no longer fully supported by Facebook.") -@Suppress("unused") -val disableSwitchingEmojiToStickerPatch = bytecodePatch( - description = "Disables switching from emoji to sticker search mode in message input field.", -) { - compatibleWith("com.facebook.orca"("439.0.0.29.119")) - - execute { - switchMessengeInputEmojiButtonFingerprint.method.apply { - val setStringIndex = switchMessengeInputEmojiButtonFingerprint.patternMatch!!.startIndex + 2 - val targetRegister = getInstruction(setStringIndex).registerA - - replaceInstruction(setStringIndex, "const-string v$targetRegister, \"expression\"") - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatch.kt deleted file mode 100644 index 0d5bfd58cd..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatch.kt +++ /dev/null @@ -1,16 +0,0 @@ -package app.revanced.patches.messenger.inputfield - -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.bytecodePatch - -@Suppress("unused") -val disableTypingIndicatorPatch = bytecodePatch( - name = "Disable typing indicator", - description = "Disables the indicator while typing a message.", -) { - compatibleWith("com.facebook.orca") - - execute { - sendTypingIndicatorFingerprint.method.replaceInstruction(0, "return-void") - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/Fingerprints.kt deleted file mode 100644 index 75fd54f7da..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/Fingerprints.kt +++ /dev/null @@ -1,31 +0,0 @@ -package app.revanced.patches.messenger.inputfield - -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.dexbacked.value.DexBackedStringEncodedValue - -internal val sendTypingIndicatorFingerprint = fingerprint { - returns("V") - parameters() - custom { method, classDef -> - method.name == "run" && - classDef.fields.any { - it.name == "__redex_internal_original_name" && - (it.initialValue as? DexBackedStringEncodedValue)?.value == "ConversationTypingContext\$sendActiveStateRunnable\$1" - } - } -} - -internal val switchMessengeInputEmojiButtonFingerprint = fingerprint { - returns("V") - parameters("L", "Z") - opcodes( - Opcode.IGET_OBJECT, - Opcode.IF_EQZ, - Opcode.CONST_STRING, - Opcode.GOTO, - Opcode.CONST_STRING, - Opcode.GOTO, - ) - strings("afterTextChanged", "expression_search") -} diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt index 2abc12367c..0abc4deed5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.messenger.layout import app.revanced.patcher.fingerprint -internal val isFacebookButtonEnabledFingerprint = fingerprint { +internal val isFacebookButtonEnabledFingerprint by fingerprint { parameters() returns("Z") strings("FacebookButtonTabButtonImplementation") diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt index b8dd008e4e..414dac30c7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.messenger.metaai import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint -internal val getMobileConfigBoolFingerprint = fingerprint { +internal val getMobileConfigBoolFingerprint by fingerprint { parameters("J") returns("Z") opcodes(Opcode.RETURN) @@ -12,12 +12,12 @@ internal val getMobileConfigBoolFingerprint = fingerprint { } } -internal val metaAIKillSwitchCheckFingerprint = fingerprint { - strings("SearchAiagentImplementationsKillSwitch") +internal val metaAIKillSwitchCheckFingerprint by fingerprint { opcodes(Opcode.CONST_WIDE) + strings("SearchAiagentImplementationsKillSwitch") } -internal val extensionMethodFingerprint = fingerprint { +internal val extensionMethodFingerprint by fingerprint { strings("REPLACED_BY_PATCH") custom { method, classDef -> method.name == EXTENSION_METHOD_NAME && classDef.type == EXTENSION_CLASS_DESCRIPTOR diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt index adee83a308..37d13e3dc5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/RemoveMetaAIPatch.kt @@ -36,7 +36,7 @@ val removeMetaAIPatch = bytecodePatch( // Extract the common starting digits of Meta AI flag IDs from a flag found in code. val relevantDigits = with(metaAIKillSwitchCheckFingerprint) { - method.getInstruction(patternMatch!!.startIndex).wideLiteral + method.getInstruction(patternMatch.startIndex).wideLiteral }.toString().substring(0, 7) // Replace placeholder in the extension method. diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt deleted file mode 100644 index 280f448b39..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt +++ /dev/null @@ -1,12 +0,0 @@ -package app.revanced.patches.messenger.navbar - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.messenger.metaai.removeMetaAIPatch - -@Deprecated("Superseded by removeMetaAIPatch", ReplaceWith("removeMetaAIPatch")) -@Suppress("unused") -val removeMetaAITabPatch = bytecodePatch( - description = "Removes the 'Meta AI' tab from the navbar.", -) { - dependsOn(removeMetaAIPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt index d9e1d9e0b5..a2aca9ef38 100644 --- a/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt @@ -1,13 +1,13 @@ -package app.revanced.patches.meta.ads - -import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.AccessFlags - -internal val adInjectorFingerprint = fingerprint { - accessFlags(AccessFlags.PRIVATE) - returns("Z") - parameters("L", "L") - strings( - "SponsoredContentController.insertItem", - ) -} +package app.revanced.patches.meta.ads + +import app.revanced.patcher.fingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal val adInjectorFingerprint by fingerprint { + accessFlags(AccessFlags.PRIVATE) + returns("Z") + parameters("L", "L") + strings( + "SponsoredContentController.insertItem", + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/meta/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/meta/ads/HideAdsPatch.kt deleted file mode 100644 index 9c6839f6ce..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/meta/ads/HideAdsPatch.kt +++ /dev/null @@ -1,12 +0,0 @@ -package app.revanced.patches.meta.ads - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.util.returnEarly - -@Deprecated("Instead use the Instagram or Threads specific hide ads patch") -@Suppress("unused") -val hideAdsPatch = bytecodePatch { - execute { - adInjectorFingerprint.method.returnEarly(false) - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt index 14105f762a..021e320fcb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.mifitness.misc.locale import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val syncBluetoothLanguageFingerprint = fingerprint { +internal val syncBluetoothLanguageFingerprint by fingerprint { opcodes(Opcode.MOVE_RESULT_OBJECT) custom { method, _ -> method.name == "syncBluetoothLanguage" && diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt index a2a53cabaf..676df651e0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatch.kt @@ -17,7 +17,7 @@ val forceEnglishLocalePatch = bytecodePatch( execute { syncBluetoothLanguageFingerprint.method.apply { - val resolvePhoneLocaleInstruction = syncBluetoothLanguageFingerprint.patternMatch!!.startIndex + val resolvePhoneLocaleInstruction = syncBluetoothLanguageFingerprint.instructionMatches.first().index val registerIndexToUpdate = getInstruction(resolvePhoneLocaleInstruction).registerA replaceInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt index e3eee24991..d3083e8fb9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.mifitness.misc.login import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val xiaomiAccountManagerConstructorFingerprint = fingerprint { +internal val xiaomiAccountManagerConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) parameters("Landroid/content/Context;", "Z") custom { method, _ -> 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..202a2d8897 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 @@ -3,7 +3,7 @@ package app.revanced.patches.music.ad.video import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val showVideoAdsParentFingerprint = fingerprint { +internal val showVideoAdsParentFingerprint by fingerprint { 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 27c9812569..445dc02fd4 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 @@ -12,7 +12,7 @@ val hideVideoAdsPatch = bytecodePatch( execute { navigate(showVideoAdsParentFingerprint.originalMethod) - .to(showVideoAdsParentFingerprint.patternMatch!!.startIndex + 1) + .to(showVideoAdsParentFingerprint.instructionMatches.first().index + 1) .stop() .addInstruction(0, "const/4 p1, 0x0") } 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 4ac10dd9bd..0883a218f2 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 @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val allowExclusiveAudioPlaybackFingerprint = fingerprint { +internal val allowExclusiveAudioPlaybackFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt index 13820d29d8..4ede1cadc3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val repeatTrackFingerprint = fingerprint { +internal val repeatTrackFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt index cbcf83c5d7..962eaa36c6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/PermanentRepeatPatch.kt @@ -14,7 +14,7 @@ val permanentRepeatPatch = bytecodePatch( compatibleWith("com.google.android.apps.youtube.music") execute { - val startIndex = repeatTrackFingerprint.patternMatch!!.endIndex + val startIndex = repeatTrackFingerprint.instructionMatches.last().index val repeatIndex = startIndex + 1 repeatTrackFingerprint.method.apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt deleted file mode 100644 index f2169744fe..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.revanced.patches.music.interaction.permanentshuffle - -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint - -internal val disableShuffleFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - opcodes( - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.SGET_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL - ) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatch.kt deleted file mode 100644 index 1e4d81d3d7..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatch.kt +++ /dev/null @@ -1,17 +0,0 @@ -package app.revanced.patches.music.interaction.permanentshuffle - -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch no longer works and will be removed in the future.") -@Suppress("unused") -val permanentShufflePatch = bytecodePatch( - description = "Permanently remember your shuffle preference " + - "even if the playlist ends or another track is played." -) { - compatibleWith("com.google.android.apps.youtube.music") - - execute { - disableShuffleFingerprint.method.addInstruction(0, "return-void") - } -} 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 234078c2a6..2cefcc63ce 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 @@ -4,9 +4,8 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val constructCategoryBarFingerprint = fingerprint { +internal val constructCategoryBarFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters("Landroid/content/Context;", "L", "L", "L") opcodes( Opcode.IPUT_OBJECT, 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 2128722e74..c22a44b43b 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 @@ -16,7 +16,7 @@ val hideCategoryBar = bytecodePatch( execute { constructCategoryBarFingerprint.method.apply { - val insertIndex = constructCategoryBarFingerprint.patternMatch!!.startIndex + val insertIndex = constructCategoryBarFingerprint.instructionMatches.first().index val register = getInstruction(insertIndex - 1).registerA val freeRegister = findFreeRegister(insertIndex, register) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt index 29558ab4be..42dbc6bcbe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val hideGetPremiumFingerprint = fingerprint { +internal val hideGetPremiumFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -16,7 +16,7 @@ internal val hideGetPremiumFingerprint = fingerprint { strings("FEmusic_history", "FEmusic_offline") } -internal val membershipSettingsFingerprint = fingerprint { +internal val membershipSettingsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/CharSequence;") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt index 23965cea43..ce723b9dc1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/HideGetPremiumPatch.kt @@ -15,7 +15,7 @@ val hideGetPremiumPatch = bytecodePatch( execute { hideGetPremiumFingerprint.method.apply { - val insertIndex = hideGetPremiumFingerprint.patternMatch!!.endIndex + val insertIndex = hideGetPremiumFingerprint.instructionMatches.last().index val setVisibilityInstruction = getInstruction(insertIndex) val getPremiumViewRegister = setVisibilityInstruction.registerC diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt index f3c96dc44a..7012360a51 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt @@ -4,9 +4,8 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val pivotBarConstructorFingerprint = fingerprint { +internal val pivotBarConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters("L", "Z") opcodes( Opcode.CHECK_CAST, diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/RemoveUpgradeButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/RemoveUpgradeButtonPatch.kt index 22878b05f5..b1fb8ed9f5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/RemoveUpgradeButtonPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/RemoveUpgradeButtonPatch.kt @@ -23,7 +23,7 @@ val removeUpgradeButtonPatch = bytecodePatch( execute { pivotBarConstructorFingerprint.method.apply { val pivotBarElementFieldReference = - getInstruction(pivotBarConstructorFingerprint.patternMatch!!.endIndex - 1) + getInstruction(pivotBarConstructorFingerprint.instructionMatches.last().index - 1) .getReference() val register = getInstruction(0).registerC @@ -37,7 +37,7 @@ val removeUpgradeButtonPatch = bytecodePatch( iput-object v0, v$register, $pivotBarElementFieldReference """.toInstructions().toMutableList() - val endIndex = pivotBarConstructorFingerprint.patternMatch!!.endIndex + val endIndex = pivotBarConstructorFingerprint.instructionMatches.last().index // Replace the instruction to retain the label at given index. replaceInstruction( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt index 97dea56502..30c0ec0cbb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.misc.androidauto import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val checkCertificateFingerprint = fingerprint { +internal val checkCertificateFingerprint by fingerprint { returns("Z") parameters("Ljava/lang/String;") strings( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt index e1cf24e1a2..7e408aaa91 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val backgroundPlaybackDisableFingerprint = fingerprint { +internal val backgroundPlaybackDisableFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L") @@ -21,7 +21,7 @@ internal val backgroundPlaybackDisableFingerprint = fingerprint { ) } -internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { +internal val kidsBackgroundPlaybackPolicyControllerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "L", "Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt index 1e1a43f9aa..869174c45f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt @@ -1,10 +1,13 @@ package app.revanced.patches.music.misc.extension.hooks +import app.revanced.patcher.string import app.revanced.patches.shared.misc.extension.extensionHook internal val applicationInitHook = extensionHook { returns("V") parameters() - strings("activity") + instructions( + string("activity") + ) custom { method, _ -> method.name == "onCreate" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt index 7131e143df..9ad55f01d6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.misc.gms import app.revanced.patcher.fingerprint -internal val musicActivityOnCreateFingerprint = fingerprint { +internal val musicActivityOnCreateFingerprint by fingerprint { returns("V") parameters("Landroid/os/Bundle;") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt index abf19cc958..22cf63b849 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val playerRequestConstructorFingerprint = fingerprint { +internal val playerRequestConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) strings("player") } @@ -12,7 +12,7 @@ internal val playerRequestConstructorFingerprint = fingerprint { /** * Matches using the class found in [playerRequestConstructorFingerprint]. */ -internal val createPlayerRequestBodyFingerprint = fingerprint { +internal val createPlayerRequestBodyFingerprint by fingerprint { parameters("L") returns("V") opcodes( @@ -26,7 +26,7 @@ internal val createPlayerRequestBodyFingerprint = fingerprint { /** * Used to get a reference to other clientInfo fields. */ -internal val setClientInfoFieldsFingerprint = fingerprint { +internal val setClientInfoFieldsFingerprint by fingerprint { returns("L") strings("Google Inc.") } @@ -34,6 +34,6 @@ internal val setClientInfoFieldsFingerprint = fingerprint { /** * Used to get a reference to the clientInfo and clientInfo.clientVersion field. */ -internal val setClientInfoClientVersionFingerprint = fingerprint { +internal val setClientInfoClientVersionFingerprint by fingerprint { strings("10.29") } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt index f34797f039..1997f084e9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/SpoofClientPatch.kt @@ -39,7 +39,7 @@ val spoofClientPatch = bytecodePatch( val createPlayerRequestBodyMatch = createPlayerRequestBodyFingerprint.match(playerRequestClass) val clientInfoContainerClass = createPlayerRequestBodyMatch.method - .getInstruction(createPlayerRequestBodyMatch.patternMatch!!.startIndex) + .getInstruction(createPlayerRequestBodyMatch.instructionMatches.first().index) .getReference()!!.type val clientInfoField = setClientInfoClientVersionFingerprint.method.instructions.first { @@ -56,7 +56,7 @@ val spoofClientPatch = bytecodePatch( val clientModelField = setClientInfoFieldInstructions[5] val osVersionField = setClientInfoFieldInstructions[7] val clientVersionField = setClientInfoClientVersionFingerprint.method - .getInstruction(setClientInfoClientVersionFingerprint.stringMatches!!.first().index + 1) + .getInstruction(setClientInfoClientVersionFingerprint.stringMatches.first().index + 1) .getReference() // Helper method to spoof the client info. @@ -96,7 +96,7 @@ val spoofClientPatch = bytecodePatch( } createPlayerRequestBodyMatch.method.apply { - val checkCastIndex = createPlayerRequestBodyMatch.patternMatch!!.startIndex + val checkCastIndex = createPlayerRequestBodyMatch.instructionMatches.first().index val clientInfoContainerRegister = getInstruction(checkCastIndex).registerA addInstruction(checkCastIndex + 1, "invoke-static {v$clientInfoContainerRegister}, $spoofClientInfoMethod") diff --git a/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt index 6bc4c21e5c..a118f681a4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.myexpenses.misc.pro import app.revanced.patcher.fingerprint -internal val isEnabledFingerprint = fingerprint { +internal val isEnabledFingerprint by fingerprint { returns("Z") strings("feature", "feature.licenceStatus") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt index 160e2db274..6afea3462f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt @@ -3,14 +3,14 @@ package app.revanced.patches.myfitnesspal.ads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val isPremiumUseCaseImplFingerprint = fingerprint { +internal val isPremiumUseCaseImplFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) custom { method, classDef -> classDef.endsWith("IsPremiumUseCaseImpl;") && method.name == "doWork" } } -internal val mainActivityNavigateToNativePremiumUpsellFingerprint = fingerprint { +internal val mainActivityNavigateToNativePremiumUpsellFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt deleted file mode 100644 index a185aca8ff..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.nfctoolsse.misc.pro - -import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint - -@Deprecated("This patch no longer works and will soon be deleted.") -internal val isLicenseRegisteredFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC) - returns("Z") - strings("kLicenseCheck") -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatch.kt deleted file mode 100644 index ac3ac09af4..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatch.kt +++ /dev/null @@ -1,20 +0,0 @@ -package app.revanced.patches.nfctoolsse.misc.pro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch - -@Suppress("unused") -@Deprecated("This patch no longer works and will soon be deleted.") -val unlockProPatch = bytecodePatch{ - compatibleWith("com.wakdev.apps.nfctools.se") - - execute { - isLicenseRegisteredFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) - } -} 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 109b973e0c..4039558061 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 @@ -4,14 +4,14 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val jwPlayerConfigFingerprint = fingerprint { +internal val jwPlayerConfigFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) custom { methodDef, classDef -> classDef.type == "Lcom/jwplayer/pub/api/configuration/PlayerConfig${'$'}Builder;" && methodDef.name == "advertisingConfig" } } -internal val screenMapperFingerprint = fingerprint { +internal val screenMapperFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Lnl/nu/android/bff/domain/models/screen/ScreenEntity;") parameters("Lnl/nu/performance/api/client/objects/Screen;") @@ -27,7 +27,7 @@ internal val screenMapperFingerprint = fingerprint { } } -internal val nextPageRepositoryImplFingerprint = fingerprint { +internal val nextPageRepositoryImplFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Lnl/nu/android/bff/domain/models/Page;") parameters("Lnl/nu/performance/api/client/PacResponse;", "Ljava/lang/String;") diff --git a/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/SpoofCertificatePatch.kt b/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/SpoofCertificatePatch.kt index 65944c4c1f..1e5890a859 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/SpoofCertificatePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/SpoofCertificatePatch.kt @@ -11,7 +11,9 @@ val spoofCertificatePatch = bytecodePatch( compatibleWith("nl.sanomamedia.android.nu") execute { - getFingerprintHashForPackageFingerprints.forEach { fingerprint -> + getFingerprintHashForPackageFingerprints.forEach { fingerprintBuilder -> + val fingerprint by fingerprintBuilder + fingerprint.method.returnEarly("eae41fc018df2731a9b6ae1ac327da44a288667b") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt deleted file mode 100644 index e2bffa451a..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.nyx.misc.pro - -import app.revanced.patcher.fingerprint - -internal val checkProFingerprint = fingerprint { - custom { method, classDef -> - classDef.endsWith("BillingManager;") && method.name == "isProVersion" - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt deleted file mode 100644 index 179e745e08..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt +++ /dev/null @@ -1,20 +0,0 @@ -package app.revanced.patches.nyx.misc.pro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch will be removed in the future.") -@Suppress("unused") -val unlockProPatch = bytecodePatch { - compatibleWith("com.awedea.nyx") - - execute { - checkProFingerprint.method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt index 69463c510d..56fcf73d74 100644 --- a/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.openinghours.misc.fix.crash import app.revanced.patcher.fingerprint -internal val setPlaceFingerprint = fingerprint { +internal val setPlaceFingerprint by fingerprint { returns("V") parameters("Lde/simon/openinghours/models/Place;") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/Fingerprints.kt index 525d4f37d2..868138661a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.orfon.detection.root import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val isDeviceRootedFingeprint = fingerprint { +internal val isDeviceRootedFingeprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/pandora/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/pandora/ads/Fingerprints.kt index e3f432e16d..9e0a801478 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pandora/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pandora/ads/Fingerprints.kt @@ -2,13 +2,13 @@ package app.revanced.patches.pandora.ads import app.revanced.patcher.fingerprint -internal val getIsAdSupportedFingerprint = fingerprint { +internal val getIsAdSupportedFingerprint by fingerprint { custom { method, classDef -> method.name == "getIsAdSupported" && classDef.endsWith("UserData;") } } -internal val requestAudioAdFingerprint = fingerprint { +internal val requestAudioAdFingerprint by fingerprint { custom { method, classDef -> method.name == "requestAudioAdFromAdSDK" && classDef.endsWith("ContentServiceOpsImpl;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/pandora/misc/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/pandora/misc/Fingerprints.kt index 2a14e0ed1b..4c6e675fca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pandora/misc/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pandora/misc/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.pandora.misc import app.revanced.patcher.fingerprint -internal val skipLimitBehaviorFingerprint = fingerprint { +internal val skipLimitBehaviorFingerprint by fingerprint { custom { method, classDef -> method.name == "getSkipLimitBehavior" && classDef.endsWith("UserData;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt index 90c0bbb919..d37351f8e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.photomath.detection.deviceid import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint -internal val getDeviceIdFingerprint = fingerprint { +internal val getDeviceIdFingerprint by fingerprint { returns("Ljava/lang/String;") parameters() opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt index c6563270e1..d1b24e5546 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.photomath.detection.signature import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint -internal val checkSignatureFingerprint = fingerprint { +internal val checkSignatureFingerprint by fingerprint { opcodes( Opcode.CONST_STRING, Opcode.INVOKE_STATIC, diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt index 00b47e5161..96eb3ba0fb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/SignatureDetectionPatch.kt @@ -10,7 +10,7 @@ val signatureDetectionPatch = bytecodePatch( ) { execute { - val replacementIndex = checkSignatureFingerprint.patternMatch!!.endIndex + val replacementIndex = checkSignatureFingerprint.instructionMatches.last().index val checkRegister = checkSignatureFingerprint.method.getInstruction(replacementIndex).registerA checkSignatureFingerprint.method.replaceInstruction(replacementIndex, "const/4 v$checkRegister, 0x1") diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt index 301f2f9a52..694573b433 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val hideUpdatePopupFingerprint = fingerprint { +internal val hideUpdatePopupFingerprint by fingerprint { accessFlags(AccessFlags.FINAL, AccessFlags.PUBLIC) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt index 6722f4223e..d0565792d5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.photomath.misc.unlock.bookpoint import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isBookpointEnabledFingerprint = fingerprint { +internal val isBookpointEnabledFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt index f6c282cbd4..bc153d400c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.photomath.misc.unlock.plus import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isPlusUnlockedFingerprint = fingerprint{ +internal val isPlusUnlockedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") strings("genius") diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt index 8c2d579ef5..199cd01af7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.piccomafr.misc import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val getAndroidIdFingerprint = fingerprint { +internal val getAndroidIdFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("Landroid/content/Context;") diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt index 794f21bcb6..e757223dd3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt @@ -3,19 +3,18 @@ package app.revanced.patches.piccomafr.tracking import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val appMeasurementFingerprint = fingerprint { +internal val appMeasurementFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") strings("config/app/", "Fetching remote configuration") } -internal val facebookSDKFingerprint = fingerprint { +internal val facebookSDKFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - returns("V") strings("instagram.com", "facebook.com") } -internal val firebaseInstallFingerprint = fingerprint { +internal val firebaseInstallFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE) strings( "https://%s/%s/%s", diff --git a/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt index 3e2addaa06..825a834b62 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.pixiv.ads import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val shouldShowAdsFingerprint = fingerprint { +internal val shouldShowAdsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") custom { methodDef, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/Fingerprints.kt index ac3a1c43a5..8af0fc2737 100644 --- a/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val enterServerInsertedAdBreakStateFingerprint = fingerprint { +internal val enterServerInsertedAdBreakStateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) parameters("Lcom/amazon/avod/fsm/Trigger;") returns("V") @@ -19,7 +19,7 @@ internal val enterServerInsertedAdBreakStateFingerprint = fingerprint { } } -internal val doTriggerFingerprint = fingerprint { +internal val doTriggerFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/Fingerprints.kt index bd4431d567..4f02360fe7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.primevideo.video.speed import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val playbackUserControlsInitializeFingerprint = fingerprint { +internal val playbackUserControlsInitializeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) parameters("Lcom/amazon/avod/playbackclient/PlaybackInitializationContext;") returns("V") @@ -12,7 +12,7 @@ internal val playbackUserControlsInitializeFingerprint = fingerprint { } } -internal val playbackUserControlsPrepareForPlaybackFingerprint = fingerprint { +internal val playbackUserControlsPrepareForPlaybackFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) parameters("Lcom/amazon/avod/playbackclient/PlaybackContext;") returns("V") diff --git a/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt index a4d2c9e221..d63bbce862 100644 --- a/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.rar.misc.annoyances.purchasereminder import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val showReminderFingerprint = fingerprint { +internal val showReminderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("V") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt index c99df5707a..91ea04763e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.ad.comments import app.revanced.patcher.fingerprint -internal val hideCommentAdsFingerprint = fingerprint { +internal val hideCommentAdsFingerprint by fingerprint { strings( "link", // CommentPageRepository is not returning a link object diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt index e7dd789123..93310ce7e9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt @@ -3,14 +3,14 @@ package app.revanced.patches.reddit.ad.general import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val adPostFingerprint = fingerprint { +internal val adPostFingerprint by fingerprint { returns("V") // "children" are present throughout multiple versions strings("children") custom { _, classDef -> classDef.endsWith("Listing;") } } -internal val newAdPostFingerprint = fingerprint { +internal val newAdPostFingerprint by fingerprint { opcodes(Opcode.INVOKE_VIRTUAL) strings("chain", "feedElement") custom { _, classDef -> classDef.sourceFile == "AdElementConverter.kt" } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt index bb87c21148..b3c0a957b8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.reddit.customclients.baconreader.api import app.revanced.patcher.fingerprint -internal val getAuthorizationUrlFingerprint = fingerprint { +internal val getAuthorizationUrlFingerprint by fingerprint { strings("client_id=zACVn0dSFGdWqQ") } -internal val getClientIdFingerprint = fingerprint { +internal val getClientIdFingerprint by fingerprint { strings("client_id=zACVn0dSFGdWqQ") custom { method, classDef -> if (!classDef.endsWith("RedditOAuth;")) return@custom false @@ -14,6 +14,6 @@ internal val getClientIdFingerprint = fingerprint { } } -internal val requestTokenFingerprint = fingerprint { +internal val requestTokenFingerprint by fingerprint { strings("zACVn0dSFGdWqQ", "kDm2tYpu9DqyWFFyPlNcXGEni4k") // App ID and secret. } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt index 524beeea0e..82734e0b17 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt @@ -1,13 +1,11 @@ package app.revanced.patches.reddit.customclients.baconreader.fix.redgifs import app.revanced.patcher.fingerprint -import com.android.tools.smali.dexlib2.AccessFlags - -internal val getOkHttpClientFingerprint = fingerprint { +internal val getOkHttpClientFingerprint by fingerprint { returns("Lokhttp3/OkHttpClient;") parameters() custom { method, classDef -> classDef.type == "Lcom/onelouder/baconreader/media/gfycat/RedGifsManager;" && method.name == "getOkhttpClient" } -} +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt index 618e2f1456..3462a91942 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.reddit.customclients.boostforreddit.ads import app.revanced.patcher.fingerprint -internal val maxMediationFingerprint = fingerprint { +internal val maxMediationFingerprint by fingerprint { strings("MaxMediation: Attempting to initialize SDK") } -internal val admobMediationFingerprint = fingerprint { +internal val admobMediationFingerprint by fingerprint { strings("AdmobMediation: Attempting to initialize SDK") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt index cc06fd3968..a6d4543043 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt @@ -2,11 +2,11 @@ package app.revanced.patches.reddit.customclients.boostforreddit.api import app.revanced.patcher.fingerprint -internal val buildUserAgentFingerprint = fingerprint { +internal val buildUserAgentFingerprint by fingerprint { strings("%s:%s:%s (by /u/%s)") } -internal val getClientIdFingerprint = fingerprint { +internal val getClientIdFingerprint by fingerprint { custom { method, classDef -> if (!classDef.endsWith("Credentials;")) return@custom false diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt index a2b1530b8b..f7a3ea815b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.reddit.customclients.boostforreddit.fix.downloads import app.revanced.patcher.fingerprint -internal val downloadAudioFingerprint = fingerprint { +internal val downloadAudioFingerprint by fingerprint { strings("/DASH_audio.mp4", "/audio") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch.kt index 8cb3f55186..c5b548f93f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/FixAudioMissingInDownloadsPatch.kt @@ -19,7 +19,7 @@ val fixAudioMissingInDownloadsPatch = bytecodePatch( ) downloadAudioFingerprint.method.apply { - downloadAudioFingerprint.stringMatches!!.forEach { match -> + downloadAudioFingerprint.stringMatches.forEach { match -> val replacement = endpointReplacements[match.string] val register = getInstruction(match.index).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt index 1f3560d737..bbc71cba99 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val createOkHttpClientFingerprint = fingerprint { +internal val createOkHttpClientFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE) opcodes( Opcode.NEW_INSTANCE, diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt index 665dba5a40..e690af53d9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt @@ -3,14 +3,14 @@ package app.revanced.patches.reddit.customclients.boostforreddit.fix.slink import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val getOAuthAccessTokenFingerprint = fingerprint { +internal val getOAuthAccessTokenFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Ljava/lang/String") strings("access_token") custom { method, _ -> method.definingClass == "Lnet/dean/jraw/http/oauth/OAuthData;" } } -internal val handleNavigationFingerprint = fingerprint { +internal val handleNavigationFingerprint by fingerprint { strings( "android.intent.action.SEARCH", "subscription", diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt index 4bce1362c2..0d7f124f61 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.reddit.customclients.infinityforreddit.api import app.revanced.patcher.fingerprint -internal val apiUtilsFingerprint = fingerprint { +internal val apiUtilsFingerprint by fingerprint { strings("native-lib") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt index 36fe062796..22842f81ec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt @@ -1,15 +1,14 @@ package app.revanced.patches.reddit.customclients.infinityforreddit.subscription import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal -internal val billingClientOnServiceConnectedFingerprint = fingerprint { +internal val billingClientOnServiceConnectedFingerprint by fingerprint { strings("Billing service connected") } -internal val startSubscriptionActivityFingerprint = fingerprint { - literal { - // Intent start flag only used in the subscription activity - 0x10008000 - } +internal val startSubscriptionActivityFingerprint by fingerprint { + instructions( + literal(0x10008000) // Intent start flag only used in the subscription activity + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt index 465faf1200..e136d57ec7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.reddit.customclients.joeyforreddit.ads import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isAdFreeUserFingerprint = fingerprint { +internal val isAdFreeUserFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") strings("AD_FREE_USER") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt index e6c591748c..c6c5c0abb7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val authUtilityUserAgentFingerprint = fingerprint { +internal val authUtilityUserAgentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") opcodes(Opcode.APUT_OBJECT) @@ -13,7 +13,7 @@ internal val authUtilityUserAgentFingerprint = fingerprint { } } -internal val getClientIdFingerprint = fingerprint { +internal val getClientIdFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt index 76343a5309..d8ae7417a7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val piracyDetectionFingerprint = fingerprint { +internal val piracyDetectionFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt index 5b3029094f..8eb368f4c2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt @@ -1,6 +1,7 @@ package app.revanced.patches.reddit.customclients.redditisfun.api import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -8,15 +9,15 @@ internal fun baseClientIdFingerprint(string: String) = fingerprint { strings("yyOCBp.RHJhDKd", string) } -internal val basicAuthorizationFingerprint = baseClientIdFingerprint( +internal val basicAuthorizationFingerprint by baseClientIdFingerprint( string = "fJOxVwBUyo*=f: - val clientIdIndex = fingerprint.stringMatches!!.first().index + val clientIdIndex = fingerprint.stringMatches.first().index fingerprint.method.apply { val clientIdRegister = getInstruction(clientIdIndex).registerA @@ -45,7 +45,7 @@ val spoofClientPatch = spoofClientPatch(redirectUri = "dbrady://relay") { setRemoteConfigFingerprint.method.addInstructions(0, "return-void") // Prevent OAuth login being disabled remotely. - val checkIsOAuthRequestIndex = redditCheckDisableAPIFingerprint.patternMatch!!.startIndex + val checkIsOAuthRequestIndex = redditCheckDisableAPIFingerprint.instructionMatches.first().index redditCheckDisableAPIFingerprint.method.apply { val returnNextChain = getInstruction(checkIsOAuthRequestIndex).target diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/Fingerprints.kt index 4ff8be4615..79f3179afe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.customclients.slide.api import app.revanced.patcher.fingerprint -internal val getClientIdFingerprint = fingerprint { +internal val getClientIdFingerprint by fingerprint { custom { method, classDef -> if (!classDef.endsWith("Credentials;")) return@custom false diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/DisableAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/DisableAdsPatch.kt index f210a6adbe..738c6835a8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/DisableAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/DisableAdsPatch.kt @@ -8,7 +8,7 @@ fun disableAdsPatch(block: BytecodePatchBuilder.() -> Unit = {}) = bytecodePatch name = "Disable ads", ) { execute { - isAdsEnabledFingerprint.method.returnEarly() + isAdsEnabledFingerprint.method.returnEarly(false) } block() diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt index e055493bdd..0290c185be 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.reddit.customclients.sync.ads import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isAdsEnabledFingerprint = fingerprint { +internal val isAdsEnabledFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") strings("SyncIapHelper") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt index e83e914d75..46a98af1af 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt @@ -7,7 +7,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.Reference -internal val piracyDetectionFingerprint = fingerprint { +internal val piracyDetectionFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt index 21c788a89c..0e243f97c1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.annoyances. import app.revanced.patcher.fingerprint -internal val mainActivityOnCreateFingerprint = fingerprint { +internal val mainActivityOnCreateFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("MainActivity;") && method.name == "onCreate" } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt index c7902b1f4d..41e7d5f928 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt @@ -2,18 +2,18 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.api import app.revanced.patcher.fingerprint -internal val getAuthorizationStringFingerprint = fingerprint { +internal val getAuthorizationStringFingerprint by fingerprint { strings("authorize.compact?client_id") } -internal val getBearerTokenFingerprint = fingerprint { +internal val getBearerTokenFingerprint by fingerprint { strings("Basic") } -internal val getUserAgentFingerprint = fingerprint { +internal val getUserAgentFingerprint by fingerprint { strings("android:com.laurencedawson.reddit_sync") } -internal val imgurImageAPIFingerprint = fingerprint { +internal val imgurImageAPIFingerprint by fingerprint { strings("https://imgur-apiv3.p.rapidapi.com/3/image") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt index 0246ce7116..18c8cac7c9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/SpoofClientPatch.kt @@ -37,7 +37,7 @@ val spoofClientPatch = spoofClientPatch( returnEarly("Basic $auth") val occurrenceIndex = - getAuthorizationStringFingerprint.stringMatches!!.first().index + getAuthorizationStringFingerprint.stringMatches.first().index getAuthorizationStringFingerprint.method.apply { val authorizationStringInstruction = getInstruction(occurrenceIndex) @@ -71,7 +71,7 @@ val spoofClientPatch = spoofClientPatch( // region Patch Imgur API URL. imgurImageAPIFingerprint.let { - val apiUrlIndex = it.stringMatches!!.first().index + val apiUrlIndex = it.stringMatches.first().index it.method.replaceInstruction( apiUrlIndex, "const-string v1, \"https://api.imgur.com/3/image\"", diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt index 16dfa46205..8c47e97a60 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt @@ -2,6 +2,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.redgifs import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.fingerprint +import app.revanced.patcher.opcode import app.revanced.util.indexOfFirstInstruction import app.revanced.util.writeRegister import com.android.tools.smali.dexlib2.AccessFlags @@ -9,7 +10,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction11n -internal val createOkHttpClientFingerprint = fingerprint { +internal val createOkHttpClientFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("V") parameters() @@ -25,13 +26,13 @@ internal val createOkHttpClientFingerprint = fingerprint { } } -internal val getDefaultUserAgentFingerprint = fingerprint { +internal val getDefaultUserAgentFingerprint by fingerprint { custom { method, classDef -> method.name == "getDefaultUserAgent" && classDef.type == EXTENSION_CLASS_DESCRIPTOR } } -internal val getOriginalUserAgentFingerprint = fingerprint { +internal val getOriginalUserAgentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt index f7287fcc39..641a3e99e1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt @@ -2,11 +2,11 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.slink import app.revanced.patcher.fingerprint -internal val linkHelperOpenLinkFingerprint = fingerprint { +internal val linkHelperOpenLinkFingerprint by fingerprint { strings("Link title: ") } -internal val setAuthorizationHeaderFingerprint = fingerprint { +internal val setAuthorizationHeaderFingerprint by fingerprint { returns("Ljava/util/HashMap;") strings("Authorization", "bearer ") custom { method, _ -> method.definingClass == "Lcom/laurencedawson/reddit_sync/singleton/a;" } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt index 7a64031f16..6ed3118cb1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.thumbna import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val customImageViewLoadFingerprint = fingerprint { +internal val customImageViewLoadFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) parameters("Ljava/lang/String;", "Z", "Z", "I", "I") custom { _, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt index 4bac74de77..94a9adb2ba 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt @@ -9,28 +9,28 @@ internal fun userEndpointFingerprint(source: String, accessFlags: Set - fingerprint.stringMatches!!.first().index to fingerprint.method + fingerprint.stringMatches.first().index to fingerprint.method }.forEach { (userPathStringIndex, method) -> val userPathStringInstruction = method.getInstruction(userPathStringIndex) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/Fingerprints.kt index 9ddeaf9cf5..9da9830cff 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.video import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val parseRedditVideoNetworkResponseFingerprint = fingerprint { +internal val parseRedditVideoNetworkResponseFingerprint by fingerprint { opcodes( Opcode.NEW_INSTANCE, Opcode.IGET_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt index 64c33f308b..cb4fa24651 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/FixVideoDownloadsPatch.kt @@ -24,9 +24,9 @@ val fixVideoDownloadsPatch = bytecodePatch( ) execute { - val scanResult = parseRedditVideoNetworkResponseFingerprint.patternMatch!! - val newInstanceIndex = scanResult.startIndex - val invokeDirectIndex = scanResult.endIndex - 1 + val scanResult = parseRedditVideoNetworkResponseFingerprint.instructionMatches + val newInstanceIndex = scanResult.first().index + val invokeDirectIndex = scanResult.last().index - 1 val buildResponseInstruction = parseRedditVideoNetworkResponseFingerprint.method.getInstruction(invokeDirectIndex) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch.kt deleted file mode 100644 index 28ad4a0dbe..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatch.kt +++ /dev/null @@ -1,18 +0,0 @@ -package app.revanced.patches.reddit.customclients.syncforreddit.fix.video - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated( - message = "Patch was move to a different package", - ReplaceWith("app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.video.fixVideoDownloadsPatch") -) -@Suppress("unused") -val fixVideoDownloadsPatch = bytecodePatch { - dependsOn(app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.video.fixVideoDownloadsPatch) - - compatibleWith( - "com.laurencedawson.reddit_sync", - "com.laurencedawson.reddit_sync.pro", - "com.laurencedawson.reddit_sync.dev", - ) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/Fingerprints.kt index 09fe16247e..3127bbbc6d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.layout.disablescreenshotpopup import app.revanced.patcher.fingerprint -internal val disableScreenshotPopupFingerprint = fingerprint { +internal val disableScreenshotPopupFingerprint by fingerprint { returns("V") parameters("Landroidx/compose/runtime/", "I") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt index 2eac1cbe26..803192a909 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.layout.premiumicon import app.revanced.patcher.fingerprint -internal val hasPremiumIconAccessFingerprint = fingerprint { +internal val hasPremiumIconAccessFingerprint by fingerprint { returns("Z") custom { method, classDef -> classDef.endsWith("MyAccount;") && method.name == "isPremiumSubscriber" diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatch.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatch.kt index 992ff27e5f..5b8652a6f8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatch.kt @@ -20,9 +20,3 @@ val unlockPremiumIconsPatch = bytecodePatch( ) } } - -@Deprecated("Patch was renamed", ReplaceWith("unlockPremiumIconsPatch")) -@Suppress("unused") -val unlockPremiumIconPatch = bytecodePatch{ - dependsOn(unlockPremiumIconsPatch) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt index 3381fd2bb2..b861b79408 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.misc.tracking.url import app.revanced.patcher.fingerprint -internal val shareLinkFormatterFingerprint = fingerprint { +internal val shareLinkFormatterFingerprint by fingerprint { custom { _, classDef -> classDef.startsWith("Lcom/reddit/sharing/") && classDef.sourceFile == "UrlUtil.kt" } diff --git a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt index f7efe3103f..f1b352b037 100644 --- a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.serviceportalbund.detection.root import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val rootDetectionFingerprint = fingerprint { +internal val rootDetectionFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") custom { _, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt index df927dd4a7..a83f3b1d2c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt @@ -1,11 +1,17 @@ package app.revanced.patches.shared import app.revanced.patcher.fingerprint +import app.revanced.patcher.string -internal val castContextFetchFingerprint = fingerprint { - strings("Error fetching CastContext.") +internal val castContextFetchFingerprint by fingerprint { + instructions( + string("Error fetching CastContext.") + ) } -internal val primeMethodFingerprint = fingerprint { - strings("com.google.android.GoogleCamera", "com.android.vending") +internal val primeMethodFingerprint by fingerprint { + instructions( + string("com.android.vending"), + string("com.google.android.GoogleCamera") + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt index 0eabd2f547..b63e5c04ad 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.shared.misc.checks import app.revanced.patcher.fingerprint -internal val patchInfoFingerprint = fingerprint { +internal val patchInfoFingerprint by fingerprint { custom { _, classDef -> classDef.type == "Lapp/revanced/extension/shared/checks/PatchInfo;" } } -internal val patchInfoBuildFingerprint = fingerprint { +internal val patchInfoBuildFingerprint by fingerprint { custom { _, classDef -> classDef.type == "Lapp/revanced/extension/shared/checks/PatchInfo\$Build;" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt index 58cc5082f1..b61a6763da 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.shared.misc.extension import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val revancedUtilsPatchesVersionFingerprint = fingerprint { +internal val revancedUtilsPatchesVersionFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt index e6d78b7776..f0be1f43b4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt @@ -2,10 +2,9 @@ package app.revanced.patches.shared.misc.extension import app.revanced.patcher.Fingerprint import app.revanced.patcher.FingerprintBuilder +import app.revanced.patcher.FingerprintDelegate import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.BytecodePatchContext -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly import com.android.tools.smali.dexlib2.iface.Method @@ -21,7 +20,7 @@ internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/ */ fun sharedExtensionPatch( extensionName: String, - vararg hooks: ExtensionHook, + vararg hooks: () -> ExtensionHook, ) = bytecodePatch { dependsOn(sharedExtensionPatch(*hooks)) @@ -35,19 +34,18 @@ fun sharedExtensionPatch( * commonly for the onCreate method of exported activities. */ fun sharedExtensionPatch( - vararg hooks: ExtensionHook, + vararg hooks: () -> ExtensionHook, ) = bytecodePatch { extendWith("extensions/shared.rve") execute { - if (classes.none { EXTENSION_CLASS_DESCRIPTOR == it.type }) { - throw PatchException("Shared extension is not available. This patch can not succeed without it.") - } + // Verify the extension class exists. + classBy(EXTENSION_CLASS_DESCRIPTOR) } finalize { // The hooks are made in finalize to ensure that the context is hooked before any other patches. - hooks.forEach { hook -> hook(EXTENSION_CLASS_DESCRIPTOR) } + hooks.forEach { hook -> hook()(EXTENSION_CLASS_DESCRIPTOR) } // Modify Utils method to include the patches release version. revancedUtilsPatchesVersionFingerprint.method.apply { @@ -113,4 +111,7 @@ fun extensionHook( insertIndexResolver: BytecodePatchContext.(Method) -> Int = { 0 }, contextRegisterResolver: BytecodePatchContext.(Method) -> String = { "p0" }, fingerprintBuilderBlock: FingerprintBuilder.() -> Unit, -) = extensionHook(insertIndexResolver, contextRegisterResolver, fingerprint(block = fingerprintBuilderBlock)) +) = { + val fingerprint by FingerprintDelegate(block = fingerprintBuilderBlock) + ExtensionHook(fingerprint, insertIndexResolver, contextRegisterResolver) +} 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 80d041ada8..8b784b2db6 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 @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val canScrollVerticallyFingerprint = fingerprint { +internal val canScrollVerticallyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() 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 a01839c100..b4bc540a9e 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,15 +10,17 @@ val verticalScrollPatch = bytecodePatch( ) { execute { - canScrollVerticallyFingerprint.method.apply { - val moveResultIndex = canScrollVerticallyFingerprint.patternMatch!!.endIndex - val moveResultRegister = getInstruction(moveResultIndex).registerA + canScrollVerticallyFingerprint.let { + it.method.apply { + val moveResultIndex = it.instructionMatches.last().index + val moveResultRegister = getInstruction(moveResultIndex).registerA - val insertIndex = moveResultIndex + 1 - addInstruction( - insertIndex, - "const/4 v$moveResultRegister, 0x0", - ) + val insertIndex = moveResultIndex + 1 + addInstruction( + insertIndex, + "const/4 v$moveResultRegister, 0x0", + ) + } } } } 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 b5f613d541..355a07ba81 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 @@ -3,15 +3,15 @@ package app.revanced.patches.shared.misc.gms import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -const val GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME = "getGmsCoreVendorGroupId" - -internal val gmsCoreSupportFingerprint = fingerprint { - custom { _, classDef -> - classDef.endsWith("GmsCoreSupport;") +internal val gmsCoreSupportFingerprint by fingerprint { + accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) + custom { method, classDef -> + method.name == "getGmsCoreVendorGroupId" + && classDef.endsWith("/GmsCoreSupport;") } } -internal val googlePlayUtilityFingerprint = fingerprint { +internal val googlePlayUtilityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("I") parameters("L", "I") @@ -22,7 +22,7 @@ internal val googlePlayUtilityFingerprint = fingerprint { ) } -internal val serviceCheckFingerprint = fingerprint { +internal val serviceCheckFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("V") parameters("L", "I") 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 ef8743fda4..4896e5163f 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 @@ -78,7 +78,7 @@ fun gmsCoreSupportPatch( execute { fun transformStringReferences(transform: (str: String) -> String?) = classes.forEach { val mutableClass by lazy { - proxy(it).mutableClass + mutableClassBy(it) } it.methods.forEach classLoop@{ method -> @@ -88,12 +88,12 @@ fun gmsCoreSupportPatch( mutableClass.methods.first { MethodUtil.methodSignaturesMatch(it, method) } } - implementation.instructions.forEachIndexed insnLoop@{ index, instruction -> + implementation.instructions.forEachIndexed { index, instruction -> val string = ((instruction as? Instruction21c)?.reference as? StringReference)?.string - ?: return@insnLoop + ?: return@forEachIndexed // Apply transformation. - val transformedString = transform(string) ?: return@insnLoop + val transformedString = transform(string) ?: return@forEachIndexed mutableMethod.replaceInstruction( index, @@ -193,7 +193,15 @@ fun gmsCoreSupportPatch( primeMethodFingerprint?.let { transformPrimeMethod(packageName) } // Return these methods early to prevent the app from crashing. - earlyReturnFingerprints.forEach { it.method.returnEarly() } + earlyReturnFingerprints.forEach { + it.method.apply { + if (returnType == "Z") { + returnEarly(false) + } else { + returnEarly() + } + } + } serviceCheckFingerprint.method.returnEarly() // Google Play Utility is not present in all apps, so we need to check if it's present. @@ -211,9 +219,7 @@ fun gmsCoreSupportPatch( } // Change the vendor of GmsCore in the extension. - gmsCoreSupportFingerprint.classDef.methods - .single { it.name == GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME } - .replaceInstruction(0, "const-string v0, \"$gmsCoreVendorGroupId\"") + gmsCoreSupportFingerprint.method.replaceInstruction(0, "const-string v0, \"$gmsCoreVendorGroupId\"") executeBlock() } @@ -489,34 +495,6 @@ private object Constants { ) } -/** - * Abstract resource patch that allows Google apps to run without root and under a different package name - * by using GmsCore instead of Google Play Services. - * - * @param fromPackageName The package name of the original app. - * @param toPackageName The package name to fall back to if no custom package name is specified in patch options. - * @param spoofedPackageSignature The signature of the package to spoof to. - * @param gmsCoreVendorGroupIdOption The option to get the vendor group ID of GmsCore. - * @param executeBlock The additional execution block of the patch. - * @param block The additional block to build the patch. - */ -fun gmsCoreSupportResourcePatch( // This is here only for binary compatibility. - fromPackageName: String, - toPackageName: String, - spoofedPackageSignature: String, - gmsCoreVendorGroupIdOption: Option, - executeBlock: ResourcePatchContext.() -> Unit = {}, - block: ResourcePatchBuilder.() -> Unit = {}, -) = gmsCoreSupportResourcePatch( - fromPackageName, - toPackageName, - spoofedPackageSignature, - gmsCoreVendorGroupIdOption, - true, - executeBlock, - block -) - /** * Abstract resource patch that allows Google apps to run without root and under a different package name * by using GmsCore instead of Google Play Services. @@ -529,8 +507,7 @@ fun gmsCoreSupportResourcePatch( // This is here only for binary compatibility. * @param executeBlock The additional execution block of the patch. * @param block The additional block to build the patch. */ -// TODO: On the next major release make this public and delete the public overloaded constructor. -internal fun gmsCoreSupportResourcePatch( +fun gmsCoreSupportResourcePatch( fromPackageName: String, toPackageName: String, spoofedPackageSignature: String, diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt index 8a9e499ddb..bb6aefcd05 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/mapping/ResourceMappingPatch.kt @@ -1,64 +1,107 @@ package app.revanced.patches.shared.misc.mapping +import app.revanced.patcher.InstructionFilter.Companion.METHOD_MAX_INSTRUCTIONS +import app.revanced.patcher.LiteralFilter +import app.revanced.patcher.literal import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.resourcePatch import org.w3c.dom.Element -import java.util.* -import java.util.concurrent.Executors -import java.util.concurrent.TimeUnit - -// TODO: Probably renaming the patch/this is a good idea. -lateinit var resourceMappings: List - private set - -val resourceMappingPatch = resourcePatch { - val resourceMappings = Collections.synchronizedList(mutableListOf()) +import java.util.Collections + +enum class ResourceType(val value: String) { + ANIM("anim"), + ANIMATOR("animator"), + ARRAY("array"), + ATTR("attr"), + BOOL("bool"), + COLOR("color"), + DIMEN("dimen"), + DRAWABLE("drawable"), + FONT("font"), + FRACTION("fraction"), + ID("id"), + INTEGER("integer"), + INTERPOLATOR("interpolator"), + LAYOUT("layout"), + MENU("menu"), + MIPMAP("mipmap"), + NAVIGATION("navigation"), + PLURALS("plurals"), + RAW("raw"), + STRING("string"), + STYLE("style"), + STYLEABLE("styleable"), + TRANSITION("transition"), + VALUES("values"), + XML("xml"); + + companion object { + private val VALUE_MAP: Map = entries.associateBy { it.value } + + fun fromValue(value: String) = VALUE_MAP[value] + ?: throw IllegalArgumentException("Unknown resource type: $value") + } +} - execute { - val threadCount = Runtime.getRuntime().availableProcessors() - val threadPoolExecutor = Executors.newFixedThreadPool(threadCount) +data class ResourceElement(val type: ResourceType, val name: String, val id: Long) - // Save the file in memory to concurrently read from it. - val resourceXmlFile = get("res/values/public.xml").readBytes() +private lateinit var resourceMappings: MutableMap - for (threadIndex in 0 until threadCount) { - threadPoolExecutor.execute thread@{ - document(resourceXmlFile.inputStream()).use { document -> +private fun setResourceId(type: ResourceType, name: String, id: Long) { + resourceMappings[type.value + name] = ResourceElement(type, name, id) +} - val resources = document.documentElement.childNodes - val resourcesLength = resources.length - val jobSize = resourcesLength / threadCount +/** + * @return A resource id of the given resource type and name. + * @throws PatchException if the resource is not found. + */ +fun getResourceId(type: ResourceType, name: String) = resourceMappings[type.value + name]?.id + ?: throw PatchException("Could not find resource type: $type name: $name") + +/** + * @return All resource elements. If a single resource id is needed instead use [getResourceId]. + */ +fun getResourceElements() = Collections.unmodifiableCollection(resourceMappings.values) + +/** + * @return If the resource exists. + */ +fun hasResourceId(type: ResourceType, name: String) = resourceMappings[type.value + name] != null + +/** + * Identical to [LiteralFilter] except uses a decoded resource literal value. + * + * Any patch with fingerprints of this filter must + * also declare [resourceMappingPatch] as a dependency. + */ +fun resourceLiteral( + type: ResourceType, + name: String, + maxBefore: Int = METHOD_MAX_INSTRUCTIONS, +) = literal({ getResourceId(type, name) }, null, maxBefore) - val batchStart = jobSize * threadIndex - val batchEnd = jobSize * (threadIndex + 1) - element@ for (i in batchStart until batchEnd) { - // Prevent out of bounds. - if (i >= resourcesLength) return@thread - val node = resources.item(i) - if (node !is Element) continue +val resourceMappingPatch = resourcePatch { + execute { + // Use a stream of the file, since no modifications are done + // and using a File parameter causes the file to be re-wrote when closed. + document(get("res/values/public.xml").inputStream()).use { document -> + val resources = document.documentElement.childNodes + val resourcesLength = resources.length + resourceMappings = HashMap(2 * resourcesLength) - val nameAttribute = node.getAttribute("name") - val typeAttribute = node.getAttribute("type") + for (i in 0 until resourcesLength) { + val node = resources.item(i) as? Element ?: continue + if (node.nodeName != "public") continue - if (node.nodeName != "public" || nameAttribute.startsWith("APKTOOL")) continue + val nameAttribute = node.getAttribute("name") + if (nameAttribute.startsWith("APKTOOL")) continue - val id = node.getAttribute("id").substring(2).toLong(16) + val typeAttribute = node.getAttribute("type") + val id = node.getAttribute("id").substring(2).toLong(16) - resourceMappings.add(ResourceElement(typeAttribute, nameAttribute, id)) - } - } + setResourceId(ResourceType.fromValue(typeAttribute), nameAttribute, id) } } - - threadPoolExecutor.also { it.shutdown() }.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS) - - app.revanced.patches.shared.misc.mapping.resourceMappings = resourceMappings } } - -operator fun List.get(type: String, name: String) = resourceMappings.firstOrNull { - it.type == type && it.name == name -}?.id ?: throw PatchException("Could not find resource type: $type name: $name") - -data class ResourceElement internal constructor(val type: String, val name: String, val id: Long) 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..509c99336c 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 @@ -2,14 +2,14 @@ package app.revanced.patches.shared.misc.pairip.license import app.revanced.patcher.fingerprint -internal val processLicenseResponseFingerprint = fingerprint { +internal val processLicenseResponseFingerprint by fingerprint { custom { method, classDef -> classDef.type == "Lcom/pairip/licensecheck/LicenseClient;" && method.name == "processResponse" } } -internal val validateLicenseResponseFingerprint = fingerprint { +internal val validateLicenseResponseFingerprint by fingerprint { custom { method, classDef -> classDef.type == "Lcom/pairip/licensecheck/ResponseValidator;" && 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 cad00d8dea..9d0fbb5d14 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patches.shared.misc.extension.EXTENSION_CLASS_DESCRIPTOR import com.android.tools.smali.dexlib2.AccessFlags -internal val themeLightColorResourceNameFingerprint = fingerprint { +internal val themeLightColorResourceNameFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() @@ -13,7 +13,7 @@ internal val themeLightColorResourceNameFingerprint = fingerprint { } } -internal val themeDarkColorResourceNameFingerprint = fingerprint { +internal val themeDarkColorResourceNameFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() 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 828b20c129..8da55cfdbd 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 @@ -7,7 +7,6 @@ import app.revanced.patches.all.misc.resources.addResource import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.BasePreference -import app.revanced.patches.shared.misc.settings.preference.IntentPreference import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.util.ResourceGroup @@ -17,13 +16,6 @@ import app.revanced.util.insertFirst import app.revanced.util.returnEarly import org.w3c.dom.Node -// TODO: Delete this on next major version bump. -@Deprecated("Use non deprecated settings patch function") -fun settingsPatch ( - rootPreference: Pair, - preferences: Set, -) = settingsPatch(listOf(rootPreference), preferences) - private var themeForegroundColor : String? = null private var themeBackgroundColor : String? = null @@ -131,8 +123,7 @@ fun settingsPatch ( if (preference is PreferenceCategory) { removeIconsAndLayout(preference.preferences) - } - if (preference is PreferenceScreenPreference) { + } else if (preference is PreferenceScreenPreference) { removeIconsAndLayout(preference.preferences) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt index 2e26189b2f..43de07ec20 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt @@ -9,7 +9,6 @@ import org.w3c.dom.Document * * @param key The preference key. If null, other parameters must be specified. * @param titleKey The preference title key. - * @param summaryKey The preference summary key. * @param icon The preference icon resource name. * @param layout Layout declaration. * @param tag The preference class type. @@ -20,15 +19,12 @@ import org.w3c.dom.Document class ListPreference( key: String? = null, titleKey: String = "${key}_title", - /** Summary key is ignored and will be removed soon */ - //@Deprecated - summaryKey: String? = null, icon: String? = null, layout: String? = null, tag: String = "app.revanced.extension.shared.settings.preference.CustomDialogListPreference", val entriesKey: String? = "${key}_entries", val entryValuesKey: String? = "${key}_entry_values" -) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) { +) : BasePreference(key, titleKey, null, icon, layout, tag) { var entries: ArrayResource? = null private set var entryValues: ArrayResource? = null 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 e6169bacb8..e7efdc41c8 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 @@ -1,11 +1,13 @@ package app.revanced.patches.shared.misc.spoof import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val buildInitPlaybackRequestFingerprint = fingerprint { +internal val buildInitPlaybackRequestFingerprint by fingerprint { returns("Lorg/chromium/net/UrlRequest\$Builder;") opcodes( Opcode.MOVE_RESULT_OBJECT, @@ -17,7 +19,7 @@ internal val buildInitPlaybackRequestFingerprint = fingerprint { ) } -internal val buildPlayerRequestURIFingerprint = fingerprint { +internal val buildPlayerRequestURIFingerprint by fingerprint { returns("Ljava/lang/String;") opcodes( Opcode.INVOKE_VIRTUAL, // Register holds player request URI. @@ -33,9 +35,12 @@ internal val buildPlayerRequestURIFingerprint = fingerprint { ) } -internal val buildRequestFingerprint = fingerprint { +internal val buildRequestFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Lorg/chromium/net/UrlRequest;") + returns("Lorg/chromium/net/UrlRequest") // UrlRequest; or UrlRequest$Builder; + instructions( + methodCall(name = "newUrlRequestBuilder") + ) custom { methodDef, _ -> // Different targets have slightly different parameters @@ -58,13 +63,22 @@ internal val buildRequestFingerprint = fingerprint { // Lorg/chromium/net/UrlRequest\$Callback; // L + // 20.16+ uses a refactored and extracted method: + // L + // Ljava/util/Map; + // [B + // L + // Lorg/chromium/net/UrlRequest$Callback; + // L + val parameterTypes = methodDef.parameterTypes - (parameterTypes.size == 7 || parameterTypes.size == 8) && + val parameterTypesSize = parameterTypes.size + (parameterTypesSize == 6 || parameterTypesSize == 7 || parameterTypesSize == 8) && parameterTypes[1] == "Ljava/util/Map;" // URL headers. } } -internal val protobufClassParseByteBufferFingerprint = fingerprint { +internal val protobufClassParseByteBufferFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.STATIC) returns("L") parameters("L", "Ljava/nio/ByteBuffer;") @@ -77,9 +91,8 @@ internal val protobufClassParseByteBufferFingerprint = fingerprint { custom { method, _ -> method.name == "parseFrom" } } -internal val createStreamingDataFingerprint = fingerprint { +internal val createStreamingDataFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters("L") opcodes( Opcode.IPUT_OBJECT, @@ -95,9 +108,8 @@ internal val createStreamingDataFingerprint = fingerprint { } } -internal val buildMediaDataSourceFingerprint = fingerprint { +internal val buildMediaDataSourceFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters( "Landroid/net/Uri;", "J", @@ -112,29 +124,29 @@ internal val buildMediaDataSourceFingerprint = fingerprint { ) } -internal const val HLS_CURRENT_TIME_FEATURE_FLAG = 45355374L - -internal val hlsCurrentTimeFingerprint = fingerprint { +internal val hlsCurrentTimeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Z", "L") - literal { - HLS_CURRENT_TIME_FEATURE_FLAG - } + instructions( + literal(45355374L) // HLS current time feature flag. + ) } -internal val nerdsStatsVideoFormatBuilderFingerprint = fingerprint { +internal val nerdsStatsVideoFormatBuilderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters("L") - strings("codecs=\"") + instructions( + string("codecs=\"") + ) } -internal val patchIncludedExtensionMethodFingerprint = fingerprint { +internal val patchIncludedExtensionMethodFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Z") parameters() custom { method, classDef -> - classDef.type == EXTENSION_CLASS_DESCRIPTOR && method.name == "isPatchIncluded" + method.name == "isPatchIncluded" && classDef.type == EXTENSION_CLASS_DESCRIPTOR } } @@ -142,28 +154,28 @@ internal val patchIncludedExtensionMethodFingerprint = fingerprint { // This code appears to replace the player config after the streams are loaded. // Flag is present in YouTube 19.34, but is missing Platypus stream replacement code until 19.43. // Flag and Platypus code is also present in newer versions of YouTube Music. -internal const val MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG = 45645570L - -internal val mediaFetchHotConfigFingerprint = fingerprint { - literal { MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG } +internal val mediaFetchHotConfigFingerprint by fingerprint { + instructions( + literal(45645570L) + ) } // 20.10+ -internal const val MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG = 45683169L - -internal val mediaFetchHotConfigAlternativeFingerprint = fingerprint { - literal { MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG } +internal val mediaFetchHotConfigAlternativeFingerprint by fingerprint { + instructions( + literal(45683169L) + ) } // Feature flag that enables different code for parsing and starting video playback, // but it's exact purpose is not known. If this flag is enabled while stream spoofing // then videos will never start playback and load forever. // Flag does not seem to affect playback if spoofing is off. -internal const val PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG = 45665455L - -internal val playbackStartDescriptorFeatureFlagFingerprint = fingerprint { +internal val playbackStartDescriptorFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() returns("Z") - literal { PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG } + instructions( + literal(45665455L) + ) } 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 78deda394f..2789c105d0 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 @@ -23,7 +23,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction 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 @@ -53,57 +52,59 @@ fun spoofVideoStreamsPatch( // region Block /initplayback requests to fall back to /get_watch requests. - val moveUriStringIndex = buildInitPlaybackRequestFingerprint.patternMatch!!.startIndex - buildInitPlaybackRequestFingerprint.method.apply { - val targetRegister = getInstruction(moveUriStringIndex).registerA + buildInitPlaybackRequestFingerprint.let { + it.method.apply { + val moveUriStringIndex = it.instructionMatches.first().index + val targetRegister = getInstruction(moveUriStringIndex).registerA - addInstructions( - moveUriStringIndex + 1, - """ - invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockInitPlaybackRequest(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$targetRegister - """, - ) + addInstructions( + moveUriStringIndex + 1, + """ + invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockInitPlaybackRequest(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$targetRegister + """ + ) + } } // endregion // region Block /get_watch requests to fall back to /player requests. - val invokeToStringIndex = buildPlayerRequestURIFingerprint.patternMatch!!.startIndex + buildPlayerRequestURIFingerprint.let { + it.method.apply { + val invokeToStringIndex = it.instructionMatches.first().index + val uriRegister = getInstruction(invokeToStringIndex).registerC - buildPlayerRequestURIFingerprint.method.apply { - val uriRegister = getInstruction(invokeToStringIndex).registerC - - addInstructions( - invokeToStringIndex, - """ - invoke-static { v$uriRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockGetWatchRequest(Landroid/net/Uri;)Landroid/net/Uri; - move-result-object v$uriRegister - """, - ) + addInstructions( + invokeToStringIndex, + """ + invoke-static { v$uriRegister }, $EXTENSION_CLASS_DESCRIPTOR->blockGetWatchRequest(Landroid/net/Uri;)Landroid/net/Uri; + move-result-object v$uriRegister + """ + ) + } } // endregion // region Get replacement streams at player requests. - buildRequestFingerprint.method.apply { - val newRequestBuilderIndex = indexOfFirstInstructionOrThrow { - opcode == Opcode.INVOKE_VIRTUAL && - getReference()?.name == "newUrlRequestBuilder" - } - val urlRegister = getInstruction(newRequestBuilderIndex).registerD - val freeRegister = findFreeRegister(newRequestBuilderIndex, urlRegister) + buildRequestFingerprint.let { + it.method.apply { + val builderIndex = it.instructionMatches.first().index + val urlRegister = getInstruction(builderIndex).registerD + val freeRegister = findFreeRegister(builderIndex, urlRegister) - addInstructions( - newRequestBuilderIndex, - """ - move-object v$freeRegister, p1 - invoke-static { v$urlRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V - """ - ) + addInstructions( + builderIndex, + """ + move-object v$freeRegister, p1 + invoke-static { v$urlRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V + """ + ) + } } // endregion @@ -113,7 +114,7 @@ fun spoofVideoStreamsPatch( createStreamingDataFingerprint.method.apply { val setStreamDataMethodName = "patch_setStreamingData" val resultMethodType = createStreamingDataFingerprint.classDef.type - val videoDetailsIndex = createStreamingDataFingerprint.patternMatch!!.endIndex + val videoDetailsIndex = createStreamingDataFingerprint.instructionMatches.last().index val videoDetailsRegister = getInstruction(videoDetailsIndex).registerA val videoDetailsClass = getInstruction(videoDetailsIndex).getReference()!!.type @@ -124,7 +125,7 @@ fun spoofVideoStreamsPatch( ) val protobufClass = protobufClassParseByteBufferFingerprint.method.definingClass - val setStreamingDataIndex = createStreamingDataFingerprint.patternMatch!!.startIndex + val setStreamingDataIndex = createStreamingDataFingerprint.instructionMatches.first().index val playerProtoClass = getInstruction(setStreamingDataIndex + 1) .getReference()!!.definingClass @@ -235,34 +236,42 @@ fun spoofVideoStreamsPatch( // region Fix iOS livestream current time. - hlsCurrentTimeFingerprint.method.insertLiteralOverride( - HLS_CURRENT_TIME_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->fixHLSCurrentTime(Z)Z" - ) + hlsCurrentTimeFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->fixHLSCurrentTime(Z)Z" + ) + } // endregion // region turn off stream config replacement feature flag. if (fixMediaFetchHotConfigChanges()) { - mediaFetchHotConfigFingerprint.method.insertLiteralOverride( - MEDIA_FETCH_HOT_CONFIG_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z" - ) + mediaFetchHotConfigFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z" + ) + } } if (fixMediaFetchHotConfigAlternativeChanges()) { - mediaFetchHotConfigAlternativeFingerprint.method.insertLiteralOverride( - MEDIA_FETCH_HOT_CONFIG_ALTERNATIVE_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z" - ) + mediaFetchHotConfigAlternativeFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->useMediaFetchHotConfigReplacement(Z)Z" + ) + } } if (fixParsePlaybackResponseFeatureFlag()) { - playbackStartDescriptorFeatureFlagFingerprint.method.insertLiteralOverride( - PLAYBACK_START_CHECK_ENDPOINT_USED_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->usePlaybackStartFeatureFlag(Z)Z" - ) + playbackStartDescriptorFeatureFlagFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->usePlaybackStartFeatureFlag(Z)Z" + ) + } } // endregion diff --git a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt index 0e81d7e592..3b03634434 100644 --- a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.solidexplorer2.functionality.filesize import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val onReadyFingerprint = fingerprint { +internal val onReadyFingerprint by fingerprint { opcodes( Opcode.CONST_WIDE_32, // Constant storing the 2MB limit Opcode.CMP_LONG, diff --git a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt index 7ef5093015..c75a12b119 100644 --- a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/RemoveFileSizeLimitPatch.kt @@ -14,7 +14,7 @@ val removeFileSizeLimitPatch = bytecodePatch( execute { onReadyFingerprint.method.apply { - val cmpIndex = onReadyFingerprint.patternMatch!!.startIndex + 1 + val cmpIndex = onReadyFingerprint.instructionMatches.first().index + 1 val cmpResultRegister = getInstruction(cmpIndex).registerA replaceInstruction(cmpIndex, "const/4 v$cmpResultRegister, 0x0") 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 c52174f2c5..48ef210a78 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 @@ -8,7 +8,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 createTabsFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE) returns("Ljava/util/List;") custom { method, _ -> @@ -26,7 +26,7 @@ internal val createTabsFingerprint = fingerprint { } // Located @ com.sony.songpal.mdr.vim.activity.MdrRemoteBaseActivity.e#run (9.5.0) -internal val showNotificationFingerprint = fingerprint { +internal val showNotificationFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt index 28780ea578..f6f442306f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val interceptFingerprint = fingerprint { +internal val interceptFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("L") parameters("L") @@ -16,9 +16,8 @@ internal val interceptFingerprint = fingerprint { strings("SC-Mob-UserPlan", "Configuration") } -internal val userConsumerPlanConstructorFingerprint = fingerprint { +internal val userConsumerPlanConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters( "Ljava/lang/String;", "Z", diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt index 47a54ed600..2d4abc0f25 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/HideAdsPatch.kt @@ -54,7 +54,7 @@ val hideAdsPatch = bytecodePatch( // Prevent verification of an HTTP header containing the user's current plan, which would contradict the previous patch. - val conditionIndex = interceptFingerprint.patternMatch!!.endIndex + 1 + val conditionIndex = interceptFingerprint.instructionMatches.last().index + 1 interceptFingerprint.method.addInstruction( conditionIndex, "return-object p1", diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt index 2954b4d99c..1b18832b71 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.soundcloud.analytics import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val createTrackingApiFingerprint = fingerprint { +internal val createTrackingApiFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("L") custom { methodDef, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt index 688fe36044..fe2aab19a5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val downloadOperationsURLBuilderFingerprint = fingerprint { +internal val downloadOperationsURLBuilderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String") parameters("L", "L") @@ -15,7 +15,7 @@ internal val downloadOperationsURLBuilderFingerprint = fingerprint { ) } -internal val downloadOperationsHeaderVerificationFingerprint = fingerprint { +internal val downloadOperationsHeaderVerificationFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt index 3a50ae407e..646bb929a7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt @@ -4,8 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val featureConstructorFingerprint = fingerprint { - returns("V") +internal val featureConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Ljava/lang/String;", "Z", "Ljava/util/List;") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt index 5d555b1879..5b157f9240 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt @@ -7,11 +7,11 @@ 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 navigationBarItemSetClassFingerprint = fingerprint { +internal val navigationBarItemSetClassFingerprint by fingerprint { strings("NavigationBarItemSet(") } -internal val navigationBarItemSetConstructorFingerprint = fingerprint { +internal val navigationBarItemSetConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) // Make sure the method checks whether navigation bar items are null before adding them. // If this is not true, then we cannot patch the method and potentially transform the parameters into null. @@ -23,6 +23,6 @@ internal val navigationBarItemSetConstructorFingerprint = fingerprint { } } -internal val oldNavigationBarAddItemFingerprint = fingerprint { +internal val oldNavigationBarAddItemFingerprint by fingerprint { strings("Bottom navigation tabs exceeds maximum of 5 tabs") } 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 eb3ab78391..5de56ca826 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 @@ -4,21 +4,21 @@ import app.revanced.patcher.fingerprint import app.revanced.util.containsLiteralInstruction import com.android.tools.smali.dexlib2.AccessFlags -internal val colorSpaceUtilsClassFingerprint = fingerprint { +internal val colorSpaceUtilsClassFingerprint by fingerprint { strings("The specified color must be encoded in an RGB color space.") // Partial string match. } -internal val convertArgbToRgbaFingerprint = fingerprint { +internal val convertArgbToRgbaFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) returns("J") parameters("J") } -internal val parseLottieJsonFingerprint = fingerprint { +internal val parseLottieJsonFingerprint by fingerprint { strings("Unsupported matte type: ") } -internal val parseAnimatedColorFingerprint = fingerprint { +internal val parseAnimatedColorFingerprint by fingerprint { parameters("L", "F") returns("Ljava/lang/Object;") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt deleted file mode 100644 index 4d2d04a553..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/lite/ondemand/OnDemandPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.spotify.lite.ondemand - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Patch no longer works and will be deleted soon") -@Suppress("unused") -val onDemandPatch = bytecodePatch( - description = "Enables listening to songs on-demand, allowing to play any song from playlists, albums or artists without limitations. This does not remove ads.", -) diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/ExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/ExtensionPatch.kt index 070190a037..2736a0e373 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/ExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/ExtensionPatch.kt @@ -3,7 +3,7 @@ package app.revanced.patches.spotify.misc.extension import app.revanced.patches.shared.misc.extension.sharedExtensionPatch val sharedExtensionPatch = sharedExtensionPatch( - "spotify", + "spotify", mainActivityOnCreateHook, loadOrbitLibraryHook ) 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 13b6094d32..7133e16de6 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 @@ -2,6 +2,6 @@ package app.revanced.patches.spotify.misc.extension import app.revanced.patcher.fingerprint -internal val loadOrbitLibraryFingerprint = fingerprint { +internal val loadOrbitLibraryFingerprint by fingerprint { strings("OrbitLibraryLoader", "cst") } 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 4bddc43b8a..9eca1b7d1b 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 @@ -8,19 +8,23 @@ import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference -internal val mainActivityOnCreateHook = extensionHook(fingerprint = mainActivityOnCreateFingerprint) +internal val mainActivityOnCreateHook = extensionHook { mainActivityOnCreateFingerprint } -internal val loadOrbitLibraryHook = extensionHook( - insertIndexResolver = { - loadOrbitLibraryFingerprint.stringMatches!!.last().index - }, - contextRegisterResolver = { method -> - val contextReferenceIndex = method.indexOfFirstInstruction { - getReference()?.type == "Landroid/content/Context;" - } - val contextRegister = method.getInstruction(contextReferenceIndex).registerA +internal val loadOrbitLibraryHook = extensionHook { + // FIXME: Creating this is a mess and needs refactoring. + extensionHook( + insertIndexResolver = { + loadOrbitLibraryFingerprint.stringMatches.last().index + }, + contextRegisterResolver = { method -> + val contextReferenceIndex = method.indexOfFirstInstruction { + getReference()?.type == "Landroid/content/Context;" + } + val contextRegister = + method.getInstruction(contextReferenceIndex).registerA - "v$contextRegister" - }, - fingerprint = loadOrbitLibraryFingerprint, -) + "v$contextRegister" + }, + fingerprint = loadOrbitLibraryFingerprint, + ) +} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt index 3be19dcce8..177157ab1f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt @@ -1,17 +1,18 @@ package app.revanced.patches.spotify.misc.fix import app.revanced.patcher.fingerprint +import app.revanced.patcher.string 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 loadOrbitLibraryFingerprint = fingerprint { +internal val loadOrbitLibraryFingerprint by fingerprint { strings("/liborbit-jni-spotify.so") } -internal val setClientIdFingerprint = fingerprint { +internal val setClientIdFingerprint by fingerprint { parameters("Ljava/lang/String;") custom { method, classDef -> classDef.type == "Lcom/spotify/connectivity/ApplicationScopeConfiguration;" @@ -19,7 +20,7 @@ internal val setClientIdFingerprint = fingerprint { } } -internal val setUserAgentFingerprint = fingerprint { +internal val setUserAgentFingerprint by fingerprint { parameters("Ljava/lang/String;") custom { method, classDef -> classDef.type == "Lcom/spotify/connectivity/ApplicationScopeConfiguration;" @@ -27,11 +28,11 @@ internal val setUserAgentFingerprint = fingerprint { } } -internal val extensionFixConstantsFingerprint = fingerprint { +internal val extensionFixConstantsFingerprint by fingerprint { custom { _, classDef -> classDef.type == "Lapp/revanced/extension/spotify/misc/fix/Constants;" } } -internal val runIntegrityVerificationFingerprint = fingerprint { +internal val runIntegrityVerificationFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatch.kt deleted file mode 100644 index 20f9b3b4e5..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatch.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.spotify.misc.fix - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Superseded by spoofClientPatch", ReplaceWith("spoofClientPatch")) -@Suppress("unused") -val spoofPackageInfoPatch = bytecodePatch( - description = "Spoofs the package info of the app to fix various functions of the app.", -) { - dependsOn(spoofClientPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofSignaturePatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofSignaturePatch.kt deleted file mode 100644 index 238da0f41e..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofSignaturePatch.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.spotify.misc.fix - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Superseded by spoofClientPatch", ReplaceWith("spoofClientPatch")) -@Suppress("unused") -val spoofSignaturePatch = bytecodePatch( - description = "Spoofs the signature of the app fix various functions of the app.", -) { - dependsOn(spoofClientPatch) -} 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 b9edaaeacf..8548ece446 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,13 +1,14 @@ package app.revanced.patches.spotify.misc.fix.login import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal import app.revanced.util.literal -internal val katanaProxyLoginMethodHandlerClassFingerprint = fingerprint { +internal val katanaProxyLoginMethodHandlerClassFingerprint by fingerprint { strings("katana_proxy_auth") } -internal val katanaProxyLoginMethodTryAuthorizeFingerprint = fingerprint { +internal val katanaProxyLoginMethodTryAuthorizeFingerprint by fingerprint { strings("e2e") literal { 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 6adaec7c79..2df7c6b1a0 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,10 +3,12 @@ package app.revanced.patches.spotify.misc.lyrics import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.stringOption import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstruction import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction35c @@ -87,7 +89,18 @@ val changeLyricsProviderPatch = bytecodePatch( // region Replace the call to the HTTP client builder method used exclusively for lyrics by the modified one. - getLyricsHttpClientFingerprint(httpClientBuilderMethod).method.apply { + + val getLyricsHttpClientFingerprint by fingerprint { + returns(httpClientBuilderMethod.returnType) + parameters() + custom { method, _ -> + method.indexOfFirstInstruction { + getReference() == httpClientBuilderMethod + } >= 0 + } + } + + getLyricsHttpClientFingerprint.method.apply { val getLyricsHttpClientIndex = indexOfFirstInstructionOrThrow { getReference() == httpClientBuilderMethod } 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 f55fc349f4..b0ca654162 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 @@ -5,7 +5,7 @@ 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 httpClientBuilderFingerprint by fingerprint { 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 a84aa699bf..e6fabc4c9c 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 @@ -5,7 +5,7 @@ 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 shareCopyUrlFingerprint by fingerprint { returns("Ljava/lang/Object;") parameters("Ljava/lang/Object;") strings("clipboard", "Spotify Link") @@ -14,7 +14,7 @@ internal val shareCopyUrlFingerprint = fingerprint { } } -internal val oldShareCopyUrlFingerprint = fingerprint { +internal val oldShareCopyUrlFingerprint by fingerprint { returns("Ljava/lang/Object;") parameters("Ljava/lang/Object;") strings("clipboard", "createNewSession failed") @@ -23,7 +23,7 @@ internal val oldShareCopyUrlFingerprint = fingerprint { } } -internal val formatAndroidShareSheetUrlFingerprint = fingerprint { +internal val formatAndroidShareSheetUrlFingerprint by fingerprint { returns("Ljava/lang/String;") parameters("L", "Ljava/lang/String;") opcodes( @@ -38,7 +38,7 @@ internal val formatAndroidShareSheetUrlFingerprint = fingerprint { } } -internal val oldFormatAndroidShareSheetUrlFingerprint = fingerprint { +internal val oldFormatAndroidShareSheetUrlFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Ljava/lang/String;") parameters("Lcom/spotify/share/social/sharedata/ShareData;", "Ljava/lang/String;") 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..81bcb2412a 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 @@ -3,7 +3,7 @@ package app.revanced.patches.spotify.misc.widgets import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val canBindAppWidgetPermissionFingerprint = fingerprint { +internal val canBindAppWidgetPermissionFingerprint by fingerprint { strings("android.permission.BIND_APPWIDGET") opcodes(Opcode.AND_INT_LIT8) } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt deleted file mode 100644 index bcf94324c8..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.spotify.navbar - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Obsolete and will be deleted soon") -@Suppress("unused") -val premiumNavbarTabPatch = bytecodePatch( - description = "Hides the premium tab from the navigation bar.", -) 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 103f47750a..658b3a9ef3 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 @@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags private const val SPOTIFY_MAIN_ACTIVITY = "Lcom/spotify/music/SpotifyMainActivity;" -internal val mainActivityOnCreateFingerprint = fingerprint { +internal val mainActivityOnCreateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/os/Bundle;") diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt index 0458f45d3e..58047cc4cf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.strava.subscription import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val getSubscribedFingerprint = fingerprint { +internal val getSubscribedFingerprint by fingerprint { opcodes(Opcode.IGET_BOOLEAN) custom { method, classDef -> classDef.endsWith("/SubscriptionDetailResponse;") && method.name == "getSubscribed" diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt index e59660472d..d0e061b9c6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/UnlockSubscriptionPatch.kt @@ -12,7 +12,7 @@ val unlockSubscriptionPatch = bytecodePatch( execute { getSubscribedFingerprint.method.replaceInstruction( - getSubscribedFingerprint.patternMatch!!.startIndex, + getSubscribedFingerprint.instructionMatches.first().index, "const/4 v0, 0x1", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt index c91bb961a2..69fcc44d41 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/DisableSubscriptionSuggestionsPatch.kt @@ -52,7 +52,7 @@ val disableSubscriptionSuggestionsPatch = bytecodePatch( }, ) - val getModulesIndex = getModulesFingerprint.patternMatch!!.startIndex + val getModulesIndex = getModulesFingerprint.instructionMatches.first().index with(originalMethod) { removeInstruction(getModulesIndex) addInstructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt index 1204a36f21..134c108692 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.strava.upselling import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val getModulesFingerprint = fingerprint { +internal val getModulesFingerprint by fingerprint { opcodes(Opcode.IGET_OBJECT) custom { method, classDef -> classDef.endsWith("/GenericLayoutEntry;") && method.name == "getModules" diff --git a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt index 0efa845fbe..6e55bd5f41 100644 --- a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.swissid.integritycheck import app.revanced.patcher.fingerprint -internal val checkIntegrityFingerprint = fingerprint { +internal val checkIntegrityFingerprint by fingerprint { returns("V") parameters("Lcom/swisssign/deviceintegrity/model/DeviceIntegrityResult;") strings("it", "result") 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 4bd688de49..e198d21b18 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 @@ -2,13 +2,13 @@ package app.revanced.patches.ticktick.misc.themeunlock import app.revanced.patcher.fingerprint -internal val checkLockedThemesFingerprint = fingerprint { +internal val checkLockedThemesFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("Theme;") && method.name == "isLockedTheme" } } -internal val setThemeFingerprint = fingerprint { +internal val setThemeFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("ThemePreviewActivity;") && method.name == "lambda\$updateUserBtn\$1" } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt index f85dd2d072..32cf50f13e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt @@ -4,13 +4,13 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val feedApiServiceLIZFingerprint = fingerprint { +internal val feedApiServiceLIZFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/FeedApiService;") && method.name == "fetchFeedList" } } -internal val followFeedFingerprint = fingerprint { +internal val followFeedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Lcom/ss/android/ugc/aweme/follow/presenter/FollowFeedList;") strings("getFollowFeedList") diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt index eb28683743..43aab883c0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.tiktok.interaction.cleardisplay import app.revanced.patcher.fingerprint -internal val onClearDisplayEventFingerprint = fingerprint { +internal val onClearDisplayEventFingerprint by fingerprint { custom { method, classDef -> // Internally the feature is called "Clear mode". classDef.endsWith("/ClearModePanelComponent;") && method.name == "onClearModeEvent" diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt index 160b49c158..5ab0efbbb6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.tiktok.interaction.downloads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val aclCommonShareFingerprint = fingerprint { +internal val aclCommonShareFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") custom { method, classDef -> @@ -12,7 +12,7 @@ internal val aclCommonShareFingerprint = fingerprint { } } -internal val aclCommonShare2Fingerprint = fingerprint { +internal val aclCommonShare2Fingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") custom { method, classDef -> @@ -21,7 +21,7 @@ internal val aclCommonShare2Fingerprint = fingerprint { } } -internal val aclCommonShare3Fingerprint = fingerprint { +internal val aclCommonShare3Fingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") custom { method, classDef -> @@ -30,7 +30,7 @@ internal val aclCommonShare3Fingerprint = fingerprint { } } -internal val downloadUriFingerprint = fingerprint { +internal val downloadUriFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Landroid/net/Uri;") parameters( diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt index ce372ea421..66fef7177f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.tiktok.interaction.seekbar import app.revanced.patcher.fingerprint -internal val setSeekBarShowTypeFingerprint = fingerprint { +internal val setSeekBarShowTypeFingerprint by fingerprint { strings("seekbar show type change, change to:") } -internal val shouldShowSeekBarFingerprint = fingerprint { +internal val shouldShowSeekBarFingerprint by fingerprint { strings("can not show seekbar, state: 1, not in resume") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt index 221036bb96..ab224a1cca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt @@ -3,13 +3,13 @@ package app.revanced.patches.tiktok.interaction.speed import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val getSpeedFingerprint = fingerprint { +internal val getSpeedFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/BaseListFragmentPanel;") && method.name == "onFeedSpeedSelectedEvent" } } -internal val setSpeedFingerprint = fingerprint { +internal val setSpeedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("V") parameters("Ljava/lang/String;", "Lcom/ss/android/ugc/aweme/feed/model/Aweme;", "F") 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..439f63862b 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 @@ -2,14 +2,14 @@ package app.revanced.patches.tiktok.misc.login.disablerequirement import app.revanced.patcher.fingerprint -internal val mandatoryLoginServiceFingerprint = fingerprint { +internal val mandatoryLoginServiceFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/MandatoryLoginService;") && method.name == "enableForcedLogin" } } -internal val mandatoryLoginService2Fingerprint = fingerprint { +internal val mandatoryLoginService2Fingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/MandatoryLoginService;") && method.name == "shouldShowForcedLogin" diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt index a40f5251f5..19d045db01 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.tiktok.misc.login.fixgoogle import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val googleAuthAvailableFingerprint = fingerprint { +internal val googleAuthAvailableFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -12,7 +12,7 @@ internal val googleAuthAvailableFingerprint = fingerprint { } } -internal val googleOneTapAuthAvailableFingerprint = fingerprint { +internal val googleOneTapAuthAvailableFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() 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..4317948c41 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 @@ -2,32 +2,32 @@ package app.revanced.patches.tiktok.misc.settings import app.revanced.patcher.fingerprint -internal val addSettingsEntryFingerprint = fingerprint { +internal val addSettingsEntryFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/SettingNewVersionFragment;") && method.name == "initUnitManger" } } -internal val adPersonalizationActivityOnCreateFingerprint = fingerprint { +internal val adPersonalizationActivityOnCreateFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/AdPersonalizationActivity;") && method.name == "onCreate" } } -internal val settingsEntryFingerprint = fingerprint { +internal val settingsEntryFingerprint by fingerprint { strings("pls pass item or extends the EventUnit") } -internal val settingsEntryInfoFingerprint = fingerprint { +internal val settingsEntryInfoFingerprint by fingerprint { strings( "ExposeItem(title=", ", icon=", ) } -internal val settingsStatusLoadFingerprint = fingerprint { +internal val settingsStatusLoadFingerprint by fingerprint { 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/spoof/sim/SpoofSimPatch.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/spoof/sim/SpoofSimPatch.kt index 40a45650de..b069b88f55 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 @@ -69,7 +69,7 @@ val spoofSimPatch = bytecodePatch( } } }.forEach { (classDef, methods) -> - with(proxy(classDef).mutableClass) { + with(mutableClassBy(classDef)) { methods.forEach { (method, patches) -> with(findMutableMethodOf(method)) { while (!patches.isEmpty()) { 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 3e98d213e5..508d469645 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getEnterFromFingerprint = fingerprint { +internal val getEnterFromFingerprint by fingerprint { returns("Ljava/lang/String;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Z") @@ -22,7 +22,7 @@ internal val getEnterFromFingerprint = fingerprint { } } -internal val onRenderFirstFrameFingerprint = fingerprint { +internal val onRenderFirstFrameFingerprint by fingerprint { strings("method_enable_viewpager_preload_duration") custom { _, classDef -> classDef.endsWith("/BaseListFragmentPanel;") diff --git a/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt index 4a02c62215..0d985d88c7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.trakt import app.revanced.patcher.fingerprint -internal val isVIPEPFingerprint = fingerprint { +internal val isVIPEPFingerprint by fingerprint { custom { method, classDef -> if (!classDef.endsWith("RemoteUser;")) return@custom false @@ -10,7 +10,7 @@ internal val isVIPEPFingerprint = fingerprint { } } -internal val isVIPFingerprint = fingerprint { +internal val isVIPFingerprint by fingerprint { custom { method, classDef -> if (!classDef.endsWith("RemoteUser;")) return@custom false @@ -18,7 +18,7 @@ internal val isVIPFingerprint = fingerprint { } } -internal val remoteUserFingerprint = fingerprint { +internal val remoteUserFingerprint by fingerprint { custom { _, classDef -> classDef.endsWith("RemoteUser;") } 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 12ffa15c15..0cd634ee1b 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 @@ -3,7 +3,7 @@ package app.revanced.patches.tudortmund.lockscreen import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val brightnessFingerprint = fingerprint { +internal val brightnessFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") parameters() 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..525f5a5e74 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 @@ -6,6 +6,6 @@ import app.revanced.patcher.fingerprint // 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 isBlogNotifyEnabledFingerprint by fingerprint { strings("isEnabled --> ", "blog_notify_enabled") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt index 7d00f2f1bd..2be1a3cefb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint // This method is responsible for loading and displaying the visual Layout of the Gift Message Popup. -internal val showGiftMessagePopupFingerprint = fingerprint { +internal val showGiftMessagePopupFingerprint by fingerprint { accessFlags(AccessFlags.FINAL, AccessFlags.PUBLIC) returns("V") strings("activity", "anchorView", "textMessage") 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 e24ca2884a..742a8fd4d2 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 @@ -13,7 +13,7 @@ import app.revanced.patcher.fingerprint // 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 getFeatureValueFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("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 c2da658aad..06f7d44379 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 @@ -69,7 +69,7 @@ val overrideFeatureFlagsPatch = bytecodePatch( // This is equivalent to // String forcedValue = getValueOverride(feature) // if (forcedValue != null) return forcedValue - val getFeatureIndex = getFeatureValueFingerprint.patternMatch!!.startIndex + val getFeatureIndex = getFeatureValueFingerprint.instructionMatches.first().index getFeatureValueFingerprint.method.addInstructionsWithLabels( getFeatureIndex, """ 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 11616fcc92..8d9f4cfd3d 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 @@ -6,7 +6,7 @@ import app.revanced.patcher.fingerprint // 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 addQueryParamFingerprint by fingerprint { parameters("Ljava/lang/String;", "Ljava/lang/String;", "Z") strings("Malformed URL. Base: ", ", Relative: ") } @@ -14,7 +14,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 httpPathParserFingerprint by fingerprint { 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 dbe75d5f8b..ad9f52f4b0 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 @@ -21,7 +21,7 @@ val fixOldVersionsPatch = bytecodePatch( // Remove the live query parameters from the path when it's specified via a @METHOD annotation. for (liveQueryParameter in liveQueryParameters) { httpPathParserFingerprint.method.addInstructions( - httpPathParserFingerprint.patternMatch!!.endIndex + 1, + httpPathParserFingerprint.instructionMatches.last().index + 1, """ # urlPath = urlPath.replace(liveQueryParameter, "") const-string p1, "$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 c4ab799e85..5e8ad5c70a 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,7 +24,7 @@ val filterTimelineObjectsPatch = bytecodePatch( dependsOn(sharedExtensionPatch) execute { - val filterInsertIndex = timelineFilterExtensionFingerprint.patternMatch!!.startIndex + val filterInsertIndex = timelineFilterExtensionFingerprint.instructionMatches.first().index timelineFilterExtensionFingerprint.method.apply { val addInstruction = getInstruction(filterInsertIndex + 1) @@ -47,7 +47,7 @@ val filterTimelineObjectsPatch = bytecodePatch( } } - mapOf( + arrayOf( timelineConstructorFingerprint to 1, postsResponseConstructorFingerprint to 2, ).forEach { (fingerprint, timelineObjectsRegister) -> 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..75be30004a 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 @@ -6,7 +6,7 @@ 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 { +internal val postsResponseConstructorFingerprint by fingerprint { accessFlags(AccessFlags.CONSTRUCTOR, AccessFlags.PUBLIC) custom { method, classDef -> classDef.endsWith("/PostsResponse;") && method.parameters.size == 4 } } @@ -14,7 +14,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 timelineConstructorFingerprint by fingerprint { strings("timelineObjectsList") custom { method, classDef -> classDef.endsWith("/Timeline;") && method.parameters[0].type == "Ljava/util/List;" @@ -24,7 +24,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 timelineFilterExtensionFingerprint by fingerprint { opcodes( Opcode.CONST_STRING, // "BLOCKED_OBJECT_DUMMY" Opcode.INVOKE_VIRTUAL, // HashSet.add(^) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt index 21e9cb6d2a..3bae02166c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitch.ad.audio import app.revanced.patcher.fingerprint -internal val audioAdsPresenterPlayFingerprint = fingerprint { +internal val audioAdsPresenterPlayFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("AudioAdsPlayerPresenter;") && method.name == "playAd" } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt index 3e9853bd61..209f91d2b2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitch.ad.embedded import app.revanced.patcher.fingerprint -internal val createsUsherClientFingerprint = fingerprint { +internal val createsUsherClientFingerprint by fingerprint { custom { method, _ -> method.name == "buildOkHttpClient" && method.definingClass.endsWith("Ltv/twitch/android/network/OkHttpClientFactory;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt index 48ecefba8e..2cf8e55925 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/shared/util/AdPatch.kt @@ -29,7 +29,7 @@ fun adPatch( classDefType: String, methodNames: Set, returnMethod: ReturnMethod, - ) = with(classBy { classDefType == it.type }?.mutableClass) { + ) = with(mutableClassByOrNull(classDefType)) { this ?: return false methods.filter { it.name in methodNames }.forEach { diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt index d03449733f..4bd8abb2a0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitch.ad.video import app.revanced.patcher.fingerprint -internal val checkAdEligibilityLambdaFingerprint = fingerprint { +internal val checkAdEligibilityLambdaFingerprint by fingerprint { returns("Lio/reactivex/Single;") parameters("L") custom { method, _ -> @@ -11,7 +11,7 @@ internal val checkAdEligibilityLambdaFingerprint = fingerprint { } } -internal val contentConfigShowAdsFingerprint = fingerprint { +internal val contentConfigShowAdsFingerprint by fingerprint { returns("Z") parameters() custom { method, _ -> @@ -19,7 +19,7 @@ internal val contentConfigShowAdsFingerprint = fingerprint { } } -internal val getReadyToShowAdFingerprint = fingerprint { +internal val getReadyToShowAdFingerprint by fingerprint { returns("Ltv/twitch/android/core/mvp/presenter/StateAndAction;") parameters("L", "L") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt index 21da99a5bb..04ef723432 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt @@ -3,21 +3,20 @@ package app.revanced.patches.twitch.chat.antidelete import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val chatUtilCreateDeletedSpanFingerprint = fingerprint { +internal val chatUtilCreateDeletedSpanFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("ChatUtil\$Companion;") && method.name == "createDeletedSpanFromChatMessageSpan" } } -internal val deletedMessageClickableSpanCtorFingerprint = fingerprint { +internal val deletedMessageClickableSpanCtorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") custom { _, classDef -> classDef.endsWith("DeletedMessageClickableSpan;") } } -internal val setHasModAccessFingerprint = fingerprint { +internal val setHasModAccessFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("DeletedMessageClickableSpan;") && method.name == "setHasModAccess" } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt index 80abc9ac41..59986152c0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitch.chat.autoclaim import app.revanced.patcher.fingerprint -internal val communityPointsButtonViewDelegateFingerprint = fingerprint { +internal val communityPointsButtonViewDelegateFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("CommunityPointsButtonViewDelegate;") && method.name == "showClaimAvailable" diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt index 665180c19b..49a8601f26 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt @@ -2,19 +2,19 @@ package app.revanced.patches.twitch.debug import app.revanced.patcher.fingerprint -internal val isDebugConfigEnabledFingerprint = fingerprint { +internal val isDebugConfigEnabledFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/BuildConfigUtil;") && method.name == "isDebugConfigEnabled" } } -internal val isOmVerificationEnabledFingerprint = fingerprint { +internal val isOmVerificationEnabledFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/BuildConfigUtil;") && method.name == "isOmVerificationEnabled" } } -internal val shouldShowDebugOptionsFingerprint = fingerprint { +internal val shouldShowDebugOptionsFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/BuildConfigUtil;") && method.name == "shouldShowDebugOptions" } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt index 43d5bb39bf..f39c762e94 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.twitch.misc.settings import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val menuGroupsOnClickFingerprint = fingerprint { +internal val menuGroupsOnClickFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC, AccessFlags.FINAL) returns("V") parameters("L", "L", "L") @@ -13,21 +13,21 @@ internal val menuGroupsOnClickFingerprint = fingerprint { } } -internal val menuGroupsUpdatedFingerprint = fingerprint { +internal val menuGroupsUpdatedFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/SettingsMenuPresenter\$Event\$MenuGroupsUpdated;") && method.name == "" } } -internal val settingsActivityOnCreateFingerprint = fingerprint { +internal val settingsActivityOnCreateFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/SettingsActivity;") && method.name == "onCreate" } } -internal val settingsMenuItemEnumFingerprint = fingerprint { +internal val settingsMenuItemEnumFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("/SettingsMenuItem;") && method.name == "" } 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 dc100acb10..b01f75081f 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val buildMediaOptionsSheetFingerprint = fingerprint { +internal val buildMediaOptionsSheetFingerprint by fingerprint { opcodes( Opcode.IF_EQ, Opcode.SGET_OBJECT, @@ -14,13 +14,12 @@ internal val buildMediaOptionsSheetFingerprint = fingerprint { strings("mediaEntity", "media_options_sheet") } -internal val constructMediaOptionsSheetFingerprint = fingerprint { +internal val constructMediaOptionsSheetFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") strings("captionsState") } -internal val showDownloadVideoUpsellBottomSheetFingerprint = fingerprint { +internal val showDownloadVideoUpsellBottomSheetFingerprint by fingerprint { returns("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 6f2b9c12c7..945f0a47b9 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 @@ -27,7 +27,7 @@ val unlockDownloadsPatch = bytecodePatch( // Allow downloads for non-premium users. showDownloadVideoUpsellBottomSheetFingerprint.patch { - val checkIndex = patternMatch!!.startIndex + val checkIndex = instructionMatches.first().index val register = method.getInstruction(checkIndex).registerA checkIndex to register @@ -42,25 +42,26 @@ val unlockDownloadsPatch = bytecodePatch( } // Make GIFs downloadable. - val patternMatch = buildMediaOptionsSheetFingerprint.patternMatch!! - buildMediaOptionsSheetFingerprint.method.apply { - val checkMediaTypeIndex = patternMatch.startIndex - val checkMediaTypeInstruction = getInstruction(checkMediaTypeIndex) + buildMediaOptionsSheetFingerprint.let { + it.method.apply { + val checkMediaTypeIndex = it.instructionMatches.first().index + val checkMediaTypeInstruction = getInstruction(checkMediaTypeIndex) - // Treat GIFs as videos. - addInstructionsWithLabels( - checkMediaTypeIndex + 1, - """ + // Treat GIFs as videos. + addInstructionsWithLabels( + checkMediaTypeIndex + 1, + """ const/4 v${checkMediaTypeInstruction.registerB}, 0x2 # GIF if-eq v${checkMediaTypeInstruction.registerA}, v${checkMediaTypeInstruction.registerB}, :video """, - ExternalLabel("video", getInstruction(patternMatch.endIndex)), - ) + ExternalLabel("video", getInstruction(it.instructionMatches.last().index)), + ) - // Remove media.isDownloadable check. - removeInstruction( - instructions.first { it.opcode == Opcode.IGET_BOOLEAN }.location.index + 1, - ) + // Remove media.isDownloadable check. + removeInstruction( + instructions.first { it.opcode == Opcode.IGET_BOOLEAN }.location.index + 1, + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt index 625b6f0bb7..199ef49c2a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitter.layout.viewcount import app.revanced.patcher.fingerprint -internal val viewCountsEnabledFingerprint = fingerprint { +internal val viewCountsEnabledFingerprint by fingerprint { returns("Z") strings("view_counts_public_visibility_enabled") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch.kt index 9d813b7ad9..97347a8ee9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/dynamiccolor/DynamicColorPatch.kt @@ -39,8 +39,7 @@ val dynamicColorPatch = resourcePatch( } document("res/values-v31/colors.xml").use { document -> - - mapOf( + arrayOf( "ps__twitter_blue" to "@color/twitter_blue", "ps__twitter_blue_pressed" to "@color/twitter_blue_fill_pressed", "twitter_blue" to "@android:color/system_accent1_400", @@ -60,7 +59,7 @@ val dynamicColorPatch = resourcePatch( } document("res/values-night-v31/colors.xml").use { document -> - mapOf( + arrayOf( "twitter_blue" to "@android:color/system_accent1_200", "twitter_blue_fill_pressed" to "@android:color/system_accent1_300", "twitter_blue_opacity_30" to "@android:color/system_accent1_50", diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt index 337aeb5670..1158df15d5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.twitter.misc.hook.json import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val jsonHookPatchFingerprint = fingerprint { +internal val jsonHookPatchFingerprint by fingerprint { opcodes( Opcode.INVOKE_INTERFACE, // Add dummy hook to hooks list. // Add hooks to the hooks list. @@ -12,7 +12,7 @@ internal val jsonHookPatchFingerprint = fingerprint { custom { method, _ -> method.name == "" } } -internal val jsonInputStreamFingerprint = fingerprint { +internal val jsonInputStreamFingerprint by fingerprint { custom { method, _ -> if (method.parameterTypes.isEmpty()) { false @@ -22,6 +22,6 @@ internal val jsonInputStreamFingerprint = fingerprint { } } -internal val loganSquareFingerprint = fingerprint { +internal val loganSquareFingerprint by fingerprint { custom { _, classDef -> classDef.endsWith("LoganSquare;") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt index 56785cae4c..d3e95102fa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/JsonHookPatch.kt @@ -22,7 +22,7 @@ fun addJsonHook( jsonHookPatchFingerprint.method.apply { // Insert hooks right before calling buildList. - val insertIndex = jsonHookPatchFingerprint.patternMatch!!.endIndex + val insertIndex = jsonHookPatchFingerprint.instructionMatches.last().index addInstructions( insertIndex, @@ -48,11 +48,9 @@ val jsonHookPatch = bytecodePatch( execute { jsonHookPatchFingerprint.apply { - // Make sure the extension is present. - val jsonHookPatch = classBy { classDef -> classDef.type == JSON_HOOK_PATCH_CLASS_DESCRIPTOR } - ?: throw PatchException("Could not find the extension.") + val jsonHookPatch = classBy(JSON_HOOK_PATCH_CLASS_DESCRIPTOR) - matchOrNull(jsonHookPatch.immutableClass) + matchOrNull(jsonHookPatch) ?: throw PatchException("Unexpected extension.") } @@ -61,7 +59,7 @@ val jsonHookPatch = bytecodePatch( .fields .firstOrNull { it.name == "JSON_FACTORY" } ?.type - .let { type -> classes.find { it.type == type } } + ?.let { type -> classes.classBy(type) } ?: throw PatchException("Could not find required class.") // Hook the methods first parameter. @@ -77,7 +75,7 @@ val jsonHookPatch = bytecodePatch( finalize { // Remove hooks.add(dummyHook). jsonHookPatchFingerprint.method.apply { - val addDummyHookIndex = jsonHookPatchFingerprint.patternMatch!!.endIndex - 2 + val addDummyHookIndex = jsonHookPatchFingerprint.instructionMatches.last().index - 2 removeInstructions(addDummyHookIndex, 2) } @@ -99,8 +97,8 @@ class JsonHook( internal var added = false init { - classBy { it.type == descriptor }?.let { - it.mutableClass.also { classDef -> + mutableClassBy(descriptor).let { + it.also { classDef -> if ( classDef.superclass != JSON_HOOK_CLASS_DESCRIPTOR || !classDef.fields.any { field -> field.name == "INSTANCE" } @@ -108,6 +106,6 @@ class JsonHook( throw InvalidClassException(classDef.type, "Not a hook class") } } - } ?: throw ClassNotFoundException("Failed to find hook class $descriptor") + } } } 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 bf3d9afd23..585acc49f9 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 @@ -6,9 +6,9 @@ import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.patch.stringOption -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.twitter.misc.extension.sharedExtensionPatch import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @@ -21,7 +21,7 @@ internal val changeLinkSharingDomainResourcePatch = resourcePatch { dependsOn(resourceMappingPatch) execute { - tweetShareLinkTemplateId = resourceMappings["string", "tweet_share_link"] + tweetShareLinkTemplateId = getResourceId(ResourceType.STRING, "tweet_share_link") } } @@ -55,7 +55,7 @@ val changeLinkSharingDomainPatch = bytecodePatch( execute { val replacementIndex = - linkSharingDomainFingerprint.stringMatches!!.first().index + linkSharingDomainFingerprint.stringMatches.first().index val domainRegister = linkSharingDomainFingerprint.method.getInstruction(replacementIndex).registerA 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 0d5d0e6f80..abbf40e890 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 @@ -4,28 +4,28 @@ import app.revanced.patcher.fingerprint import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags -internal val openLinkFingerprint = fingerprint { +internal val openLinkFingerprint by fingerprint { returns("V") parameters("Landroid/content/Context;", "Landroid/content/Intent;", "Landroid/os/Bundle;") } -internal val sanitizeSharingLinksFingerprint = fingerprint { +internal val sanitizeSharingLinksFingerprint by fingerprint { returns("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 linkBuilderFingerprint by fingerprint { strings("/%1\$s/status/%2\$d") } // Gets Resource string for share link view available by pressing "Share via" button. -internal val linkResourceGetterFingerprint = fingerprint { +internal val linkResourceGetterFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Landroid/content/res/Resources;") literal { tweetShareLinkTemplateId } } -internal val linkSharingDomainFingerprint = fingerprint { +internal val linkSharingDomainFingerprint by fingerprint { strings("https://fxtwitter.com") } diff --git a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt deleted file mode 100644 index 0809324c7f..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.vsco.misc.pro - -import app.revanced.patcher.fingerprint - -internal val revCatSubscriptionFingerprint = fingerprint { - returns("V") - strings("use_debug_subscription_settings") - custom { _, classDef -> - classDef.endsWith("/RevCatSubscriptionSettingsRepository;") - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt deleted file mode 100644 index be0278dd9e..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt +++ /dev/null @@ -1,17 +0,0 @@ -package app.revanced.patches.vsco.misc.pro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch is deprecated because it does not work anymore and will be removed in the future.") -@Suppress("unused") -val unlockProPatch = bytecodePatch( - description = "Unlocks pro features.", -) { - compatibleWith("com.vsco.cam"("345")) - - execute { - // Set isSubscribed to true. - revCatSubscriptionFingerprint.method.addInstruction(0, "const p1, 0x1") - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt index 6eb7bd176b..03ff60e0c0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.warnwetter.misc.firebasegetcert import app.revanced.patcher.fingerprint -internal val getMessagingCertFingerprint = fingerprint { +internal val getMessagingCertFingerprint by fingerprint { returns("Ljava/lang/String;") strings( "ContentValues", @@ -11,7 +11,7 @@ internal val getMessagingCertFingerprint = fingerprint { ) } -internal val getRegistrationCertFingerprint = fingerprint { +internal val getRegistrationCertFingerprint by fingerprint { returns("Ljava/lang/String;") strings( "FirebaseRemoteConfig", diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt index d33880de70..0249856381 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.warnwetter.misc.promocode import app.revanced.patcher.fingerprint -internal val promoCodeUnlockFingerprint = fingerprint { +internal val promoCodeUnlockFingerprint by fingerprint { custom { method, classDef -> classDef.endsWith("PromoTokenVerification;") && method.name == "isValid" } diff --git a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt index e326c26825..19fdb02d85 100644 --- a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.willhaben.ads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val adResolverFingerprint = fingerprint { +internal val adResolverFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L", "L") @@ -15,7 +15,7 @@ internal val adResolverFingerprint = fingerprint { ) } -internal val whAdViewInjectorFingerprint = fingerprint { +internal val whAdViewInjectorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L", "L", "Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt index b3dd1a3fcf..0d7119a0b2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt @@ -11,7 +11,7 @@ internal val hideAdsPatch = bytecodePatch( compatibleWith("at.willhaben") execute { - adResolverFingerprint.method.returnEarly() + adResolverFingerprint.method.returnEarly(null) whAdViewInjectorFingerprint.method.returnEarly() } } diff --git a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt deleted file mode 100644 index f199f127c7..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.windyapp.misc.unlockpro - -import app.revanced.patcher.fingerprint - -internal val checkProFingerprint = fingerprint { - returns("I") - custom { method, classDef -> - classDef.endsWith("RawUserData;") && method.name == "isPro" - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch.kt b/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch.kt deleted file mode 100644 index c0323c72ed..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatch.kt +++ /dev/null @@ -1,22 +0,0 @@ -package app.revanced.patches.windyapp.misc.unlockpro - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch no longer works and will be removed in the future.") -@Suppress("unused") -val unlockProPatch = bytecodePatch( - description = "Unlocks all pro features.", -) { - compatibleWith("co.windyapp.android") - - execute { - checkProFingerprint.method.addInstructions( - 0, - """ - const/16 v0, 0x1 - return v0 - """, - ) - } -} 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 254b440f39..8091108cfc 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 @@ -8,7 +8,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 fullScreenEngagementAdContainerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() 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 e1d326610a..8d952d3dfc 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 @@ -7,9 +7,9 @@ import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.fix.verticalscroll.verticalScrollPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.ad.getpremium.hideGetPremiumPatch import app.revanced.patches.youtube.misc.fix.backtoexitgesture.fixBackToExitGesturePatch @@ -57,8 +57,8 @@ private val hideAdsResourcePatch = resourcePatch { addLithoFilter("Lapp/revanced/extension/youtube/patches/components/AdsFilter;") - adAttributionId = resourceMappings["id", "ad_attribution"] - fullScreenEngagementAdContainer = resourceMappings["id", "fullscreen_engagement_ad_container"] + adAttributionId = getResourceId(ResourceType.ID, "ad_attribution") + fullScreenEngagementAdContainer = getResourceId(ResourceType.ID, "fullscreen_engagement_ad_container") } } @@ -125,8 +125,7 @@ val hideAdsPatch = bytecodePatch( // Hide the view val viewRegister = (this as Instruction35c).registerC - proxy(classDef) - .mutableClass + mutableClassBy(classDef) .findMutableMethodOf(method) .injectHideViewCall( insertIndex, 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 7629d1760d..284567fec7 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getPremiumViewFingerprint = fingerprint { +internal val getPremiumViewFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters("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 bed7dba99b..10e79d168b 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 @@ -42,7 +42,7 @@ val hideGetPremiumPatch = bytecodePatch( ) getPremiumViewFingerprint.method.apply { - val startIndex = getPremiumViewFingerprint.patternMatch!!.startIndex + val startIndex = getPremiumViewFingerprint.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 91cc0e8dfa..2ccd68aa4b 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 @@ -2,10 +2,9 @@ package app.revanced.patches.youtube.ad.video import app.revanced.patcher.fingerprint -internal val loadVideoAdsFingerprint = fingerprint { +internal val loadVideoAdsFingerprint by fingerprint { strings( "TriggerBundle doesn't have the required metadata specified by the trigger ", - "Tried to enter slot with no assigned slotAdapter", - "Trying to enter a slot when a slot of same type and physical position is already active. Its status: ", + "Ping migration no associated ping bindings for activated trigger: ", ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt index 047950331c..fdf55ce0dc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt @@ -15,7 +15,7 @@ import app.revanced.util.copyResources private val copyVideoUrlResourcePatch = resourcePatch { dependsOn( settingsPatch, - playerControlsResourcePatch, + playerControlsPatch, addResourcesPatch, ) 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 b252875901..d590b0c93f 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,22 +1,15 @@ package app.revanced.patches.youtube.interaction.dialog -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall -internal val createDialogFingerprint = fingerprint { - accessFlags(AccessFlags.PROTECTED) +internal val createDialogFingerprint by fingerprint { returns("V") parameters("L", "L", "Ljava/lang/String;") - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL, // dialog.show() + instructions( + methodCall(smali = "Landroid/app/AlertDialog\$Builder;->setNegativeButton(ILandroid/content/DialogInterface\$OnClickListener;)Landroid/app/AlertDialog\$Builder;"), + methodCall(smali = "Landroid/app/AlertDialog\$Builder;->setOnCancelListener(Landroid/content/DialogInterface\$OnCancelListener;)Landroid/app/AlertDialog\$Builder;"), + methodCall(smali = "Landroid/app/AlertDialog\$Builder;->create()Landroid/app/AlertDialog;"), + methodCall(smali = "Landroid/app/AlertDialog;->show()V") ) } 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 8c366e58be..21519fc808 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 @@ -11,6 +11,8 @@ import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch;" + val removeViewerDiscretionDialogPatch = bytecodePatch( name = "Remove viewer discretion dialog", description = "Adds an option to remove the dialog that appears when opening a video that has been age-restricted " + @@ -33,10 +35,6 @@ val removeViewerDiscretionDialogPatch = bytecodePatch( ) ) - val extensionMethodDescriptor = - "Lapp/revanced/extension/youtube/patches/RemoveViewerDiscretionDialogPatch;->" + - "confirmDialog(Landroid/app/AlertDialog;)V" - execute { addResources("youtube", "interaction.dialog.removeViewerDiscretionDialogPatch") @@ -44,14 +42,16 @@ val removeViewerDiscretionDialogPatch = bytecodePatch( SwitchPreference("revanced_remove_viewer_discretion_dialog"), ) - createDialogFingerprint.method.apply { - val showDialogIndex = implementation!!.instructions.lastIndex - 2 - val dialogRegister = getInstruction(showDialogIndex).registerC + createDialogFingerprint.let { + it.method.apply { + val showDialogIndex = it.instructionMatches.last().index + val dialogRegister = getInstruction(showDialogIndex).registerC - replaceInstructions( - showDialogIndex, - "invoke-static { v$dialogRegister }, $extensionMethodDescriptor", - ) + replaceInstructions( + showDialogIndex, + "invoke-static { v$dialogRegister }, $EXTENSION_CLASS_DESCRIPTOR->confirmDialog(Landroid/app/AlertDialog;)V", + ) + } } } } 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 9672ef9a27..38b742cf8c 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 @@ -41,7 +41,7 @@ val disableDoubleTapActionsPatch = bytecodePatch( SwitchPreference("revanced_disable_chapter_skip_double_tap"), ) - val doubleTapInfoGetSeekSourceFingerprint = fingerprint { + val doubleTapInfoGetSeekSourceFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Z") returns(seekTypeEnumFingerprint.originalClassDef.type) @@ -77,8 +77,3 @@ val disableDoubleTapActionsPatch = bytecodePatch( ) } } - -@Deprecated("Patch was renamed", ReplaceWith("disableDoubleTapActionsPatch")) -val disableChapterSkipDoubleTapPatch = bytecodePatch { - dependsOn(disableDoubleTapActionsPatch) -} 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 4524a68534..759dcd3dfb 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 @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.interaction.doubletap import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val seekTypeEnumFingerprint = fingerprint { +internal val seekTypeEnumFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "SEEK_SOURCE_SEEK_TO_NEXT_CHAPTER", @@ -11,7 +11,7 @@ internal val seekTypeEnumFingerprint = fingerprint { ) } -internal val doubleTapInfoCtorFingerprint = fingerprint { +internal val doubleTapInfoCtorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters( "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 82f19f81a2..5bd5fbba9e 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 @@ -14,7 +14,6 @@ import app.revanced.patches.youtube.misc.playercontrols.addBottomControl import app.revanced.patches.youtube.misc.playercontrols.initializeBottomControl import app.revanced.patches.youtube.misc.playercontrols.injectVisibilityCheckCall import app.revanced.patches.youtube.misc.playercontrols.playerControlsPatch -import app.revanced.patches.youtube.misc.playercontrols.playerControlsResourcePatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint @@ -24,7 +23,7 @@ import app.revanced.util.copyResources private val downloadsResourcePatch = resourcePatch { dependsOn( - playerControlsResourcePatch, + playerControlsPatch, settingsPatch, addResourcesPatch, ) @@ -90,7 +89,7 @@ val downloadsPatch = bytecodePatch( // Main activity is used to launch downloader intent. mainActivityOnCreateFingerprint.method.addInstruction( 1, - "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->activityCreated(Landroid/app/Activity;)V" + "invoke-static/range { p0 .. p0 }, ${EXTENSION_CLASS_DESCRIPTOR}->setMainActivity(Landroid/app/Activity;)V" ) offlineVideoEndpointFingerprint.method.apply { 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 f10fc8e834..abd9a1e125 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,9 +1,10 @@ package app.revanced.patches.youtube.interaction.downloads -import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint +import app.revanced.patcher.string +import com.android.tools.smali.dexlib2.AccessFlags -internal val offlineVideoEndpointFingerprint = fingerprint { +internal val offlineVideoEndpointFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters( @@ -12,5 +13,7 @@ internal val offlineVideoEndpointFingerprint = fingerprint { "Ljava/lang/String", // VideoId "L", ) - strings("Object is not an offlineable video: ") + instructions( + string("Object is not an offlineable video: ") + ) } 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 162b690905..6ee07c8110 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 @@ -11,8 +11,6 @@ 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.util.findFreeRegister -import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -37,38 +35,46 @@ val enableSeekbarTappingPatch = bytecodePatch( // Find the required methods to tap the seekbar. val seekbarTappingMethods = onTouchEventHandlerFingerprint.let { - fun getMethodReference(index: Int) = it.method.getInstruction(index) + fun getReference(index: Int) = it.method.getInstruction(index) .reference as MethodReference listOf( - getMethodReference(it.patternMatch!!.startIndex), - getMethodReference(it.patternMatch!!.endIndex) + getReference(it.instructionMatches.first().index), + getReference(it.instructionMatches.last().index) ) } - seekbarTappingFingerprint.method.apply { - val pointIndex = indexOfNewPointInstruction(this) - val invokeIndex = indexOfFirstInstructionOrThrow(pointIndex, Opcode.INVOKE_VIRTUAL) - val insertIndex = invokeIndex + 1 + seekbarTappingFingerprint.let { + val insertIndex = it.instructionMatches.last().index + 1 - val thisInstanceRegister = getInstruction(invokeIndex).registerC - val xAxisRegister = this.getInstruction(pointIndex).registerD - val freeRegister = findFreeRegister(insertIndex, thisInstanceRegister, xAxisRegister) + it.method.apply { + val thisInstanceRegister = getInstruction( + insertIndex - 1 + ).registerC - val oMethod = seekbarTappingMethods[0] - val nMethod = seekbarTappingMethods[1] + val xAxisRegister = this.getInstruction( + it.instructionMatches[2].index + ).registerD - addInstructionsWithLabels( - insertIndex, - """ - invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->seekbarTappingEnabled()Z - move-result v$freeRegister - if-eqz v$freeRegister, :disabled - invoke-virtual { v$thisInstanceRegister, v$xAxisRegister }, $oMethod - invoke-virtual { v$thisInstanceRegister, v$xAxisRegister }, $nMethod - """, - ExternalLabel("disabled", getInstruction(insertIndex)), - ) + val freeRegister = findFreeRegister( + insertIndex, thisInstanceRegister, xAxisRegister + ) + + val oMethod = seekbarTappingMethods[0] + val nMethod = seekbarTappingMethods[1] + + addInstructionsWithLabels( + insertIndex, + """ + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->seekbarTappingEnabled()Z + move-result v$freeRegister + if-eqz v$freeRegister, :disabled + invoke-virtual { v$thisInstanceRegister, v$xAxisRegister }, $oMethod + invoke-virtual { v$thisInstanceRegister, v$xAxisRegister }, $nMethod + """, + ExternalLabel("disabled", getInstruction(insertIndex)), + ) + } } } } 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 8c5dce5551..5ee27ab785 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 @@ -42,7 +42,7 @@ val enableSlideToSeekPatch = bytecodePatch( // Restore the behaviour to slide to seek. - val checkIndex = slideToSeekFingerprint.patternMatch!!.startIndex + val checkIndex = slideToSeekFingerprint.instructionMatches.first().index val checkReference = slideToSeekFingerprint.method.getInstruction(checkIndex) .getReference()!! @@ -75,7 +75,7 @@ val enableSlideToSeekPatch = bytecodePatch( if (is_19_17_or_greater) { disableFastForwardGestureFingerprint.let { it.method.apply { - val targetIndex = it.patternMatch!!.endIndex + val targetIndex = it.instructionMatches.last().index val targetRegister = getInstruction(targetIndex).registerA addInstructions( @@ -88,17 +88,19 @@ val enableSlideToSeekPatch = bytecodePatch( } } } else { - disableFastForwardLegacyFingerprint.method.apply { - val insertIndex = disableFastForwardLegacyFingerprint.patternMatch!!.endIndex + 1 - val targetRegister = getInstruction(insertIndex).registerA - - addInstructions( - insertIndex, - """ - invoke-static { v$targetRegister }, $extensionMethodDescriptor - move-result v$targetRegister - """, - ) + disableFastForwardLegacyFingerprint.let { + it.method.apply { + val insertIndex = it.instructionMatches.last().index + 1 + val targetRegister = getInstruction(insertIndex).registerA + + addInstructions( + insertIndex, + """ + invoke-static { v$targetRegister }, $extensionMethodDescriptor + move-result v$targetRegister + """, + ) + } } } } 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 0b7bf052af..e8a74ee4f7 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 @@ -1,48 +1,61 @@ package app.revanced.patches.youtube.interaction.seekbar +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.newInstance +import app.revanced.patcher.opcode +import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater +import app.revanced.patches.youtube.misc.playservice.is_19_47_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_19_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_20_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_31_or_greater import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionReversed +import app.revanced.util.indexOfFirstInstruction import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import com.android.tools.smali.dexlib2.iface.reference.StringReference -internal val swipingUpGestureParentFingerprint = fingerprint { +internal val swipingUpGestureParentFingerprint by fingerprint { returns("Z") parameters() - literal { 45379021 } + instructions( + literal(45379021) // Swipe up fullscreen feature flag + ) } /** * Resolves using the class found in [swipingUpGestureParentFingerprint]. */ -internal val showSwipingUpGuideFingerprint = fingerprint { +internal val showSwipingUpGuideFingerprint by fingerprint { accessFlags(AccessFlags.FINAL) returns("Z") parameters() - literal { 1 } + instructions( + literal(1) + ) } /** * Resolves using the class found in [swipingUpGestureParentFingerprint]. */ -internal val allowSwipingUpGestureFingerprint = fingerprint { +internal val allowSwipingUpGestureFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") } -internal val disableFastForwardLegacyFingerprint = fingerprint { +internal val disableFastForwardLegacyFingerprint by fingerprint { returns("Z") parameters() opcodes(Opcode.MOVE_RESULT) - literal { 45411330 } + // Intent start flag only used in the subscription activity + literal {45411330} } -internal val disableFastForwardGestureFingerprint = fingerprint { +internal val disableFastForwardGestureFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -57,7 +70,27 @@ internal val disableFastForwardGestureFingerprint = fingerprint { } } -internal val onTouchEventHandlerFingerprint = fingerprint { +internal val customTapAndHoldFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters() + instructions( + literal(2.0f) + ) + custom { method, _ -> + // Code is found in different methods with different strings. + val findSearchLandingKey = (is_19_34_or_greater && !is_19_47_or_greater) + || (is_20_19_or_greater && !is_20_20_or_greater) || is_20_31_or_greater + + method.name == "run" && method.indexOfFirstInstruction { + val string = getReference()?.string + string == "Failed to easy seek haptics vibrate." + || (findSearchLandingKey && string == "search_landing_cache_key") + } >= 0 + } +} + +internal val onTouchEventHandlerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.PUBLIC) returns("Z") parameters("L") @@ -80,24 +113,25 @@ internal val onTouchEventHandlerFingerprint = fingerprint { custom { method, _ -> method.name == "onTouchEvent" } } -internal val seekbarTappingFingerprint = fingerprint { +internal val seekbarTappingFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") - parameters("L") - custom { method, _ -> - method.name == "onTouchEvent" - && method.containsLiteralInstruction(Integer.MAX_VALUE.toLong()) - && indexOfNewPointInstruction(method) >= 0 - } -} + parameters("Landroid/view/MotionEvent;") + instructions( + literal(Int.MAX_VALUE), + + newInstance("Landroid/graphics/Point;"), + methodCall(smali = "Landroid/graphics/Point;->(II)V", maxAfter = 0), + methodCall(smali = "Lj\$/util/Optional;->of(Ljava/lang/Object;)Lj\$/util/Optional;", maxAfter = 0), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), + fieldAccess(opcode = Opcode.IPUT_OBJECT, type = "Lj\$/util/Optional;", maxAfter = 0), -internal fun indexOfNewPointInstruction(method: Method) = method.indexOfFirstInstructionReversed { - val reference = getReference() - reference?.definingClass == "Landroid/graphics/Point;" - && reference.name == "" + opcode(Opcode.INVOKE_VIRTUAL, maxAfter = 10) + ) + custom { method, _ -> method.name == "onTouchEvent" } } -internal val slideToSeekFingerprint = fingerprint { +internal val slideToSeekFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;", "F") @@ -110,9 +144,20 @@ internal val slideToSeekFingerprint = fingerprint { literal { 67108864 } } -internal val fullscreenSeekbarThumbnailsQualityFingerprint = fingerprint { +internal val fullscreenSeekbarThumbnailsQualityFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + parameters() + instructions( + literal(45399684L) // Video stream seekbar thumbnails feature flag. + ) +} + +internal val fullscreenLargeSeekbarFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() - literal { 45399684L } + instructions( + literal(45691569) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/HideSeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/HideSeekbarPatch.kt index ddf21dd853..d057f91704 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/HideSeekbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/HideSeekbarPatch.kt @@ -7,10 +7,15 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.layout.seekbar.seekbarColorPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_20_28_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.seekbarFingerprint import app.revanced.patches.youtube.shared.seekbarOnDrawFingerprint +import app.revanced.util.insertLiteralOverride + +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/HideSeekbarPatch;" val hideSeekbarPatch = bytecodePatch( description = "Adds an option to hide the seekbar.", @@ -20,6 +25,7 @@ val hideSeekbarPatch = bytecodePatch( settingsPatch, seekbarColorPatch, addResourcesPatch, + versionCheckPatch ) execute { @@ -28,19 +34,29 @@ val hideSeekbarPatch = bytecodePatch( PreferenceScreen.SEEKBAR.addPreferences( SwitchPreference("revanced_hide_seekbar"), SwitchPreference("revanced_hide_seekbar_thumbnail"), + SwitchPreference("revanced_fullscreen_large_seekbar"), ) seekbarOnDrawFingerprint.match(seekbarFingerprint.originalClassDef).method.addInstructionsWithLabels( 0, """ const/4 v0, 0x0 - invoke-static { }, Lapp/revanced/extension/youtube/patches/HideSeekbarPatch;->hideSeekbar()Z + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->hideSeekbar()Z move-result v0 if-eqz v0, :hide_seekbar return-void :hide_seekbar nop - """, + """ ) + + if (is_20_28_or_greater) { + fullscreenLargeSeekbarFeatureFlagFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->useFullscreenLargeSeekbar(Z)Z" + ) + } + } } } 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 b502be1ae5..66a79003f8 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 @@ -13,6 +13,7 @@ import app.revanced.patches.youtube.misc.playservice.is_19_17_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_09_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen +import java.util.logging.Logger private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/SeekbarThumbnailsPatch;" 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 e1161ea13d..2c7dc336b6 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,10 @@ package app.revanced.patches.youtube.interaction.swipecontrols import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal import com.android.tools.smali.dexlib2.AccessFlags -internal val swipeControlsHostActivityFingerprint = fingerprint { +internal val swipeControlsHostActivityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters() custom { method, _ -> @@ -12,12 +12,9 @@ internal val swipeControlsHostActivityFingerprint = fingerprint { } } -internal const val SWIPE_CHANGE_VIDEO_FEATURE_FLAG = 45631116L - -internal val swipeChangeVideoFingerprint = fingerprint { +internal val swipeChangeVideoFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("L") - literal { - SWIPE_CHANGE_VIDEO_FEATURE_FLAG - } + instructions( + literal(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 dd83a9549b..f0efb9cc94 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 @@ -12,6 +12,9 @@ import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_43_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_22_or_greater +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 @@ -25,12 +28,16 @@ private val swipeControlsResourcePatch = resourcePatch { dependsOn( settingsPatch, addResourcesPatch, + versionCheckPatch, ) execute { addResources("youtube", "interaction.swipecontrols.swipeControlsResourcePatch") - if (is_19_43_or_greater) { + // If fullscreen swipe is enabled in newer versions the app can crash. + // It likely is caused by conflicting experimental flags that are never enabled together. + // 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") ) @@ -124,11 +131,13 @@ val swipeControlsPatch = bytecodePatch( // region patch to enable/disable swipe to change video. - if (is_19_43_or_greater) { - swipeChangeVideoFingerprint.method.insertLiteralOverride( - SWIPE_CHANGE_VIDEO_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z" - ) + if (is_19_43_or_greater && !is_20_34_or_greater) { + swipeChangeVideoFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.last().index, + "$EXTENSION_CLASS_DESCRIPTOR->allowSwipeChangeVideo(Z)Z" + ) + } } // endregion 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 ff7ee248ff..29e9b7af25 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 @@ -53,7 +53,7 @@ val autoCaptionsPatch = bytecodePatch( """ ) - mapOf( + arrayOf( startVideoInformerFingerprint to 0, storyboardRendererDecoderRecommendedLevelFingerprint to 1 ).forEach { (fingerprint, enabled) -> 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 c657b72ec2..3ecbb437e5 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val startVideoInformerFingerprint = fingerprint { +internal val startVideoInformerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") opcodes( @@ -14,14 +14,14 @@ internal val startVideoInformerFingerprint = fingerprint { strings("pc") } -internal val storyboardRendererDecoderRecommendedLevelFingerprint = fingerprint { +internal val storyboardRendererDecoderRecommendedLevelFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("L") strings("#-1#") } -internal val subtitleTrackFingerprint = fingerprint { +internal val subtitleTrackFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index 1eac1fb6c1..94e8045754 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -20,7 +20,7 @@ private val iconResourceFileNames = arrayOf( "ic_launcher_round", ).map { "$it.png" }.toTypedArray() -private val iconResourceFileNamesNew = mapOf( +private val iconResourceFileNamesNew = arrayOf( "adaptiveproduct_youtube_foreground_color_108" to "adaptiveproduct_youtube_2024_q4_foreground_color_108", "adaptiveproduct_youtube_background_color_108" to "adaptiveproduct_youtube_2024_q4_background_color_108", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt index cd20455504..e2833e5b71 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt @@ -9,9 +9,9 @@ import app.revanced.patcher.patch.stringOption import app.revanced.patcher.util.Document import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.util.ResourceGroup @@ -38,7 +38,7 @@ private val changeHeaderBytecodePatch = bytecodePatch { "yt_ringo2_premium_wordmark_header" ).forEach { resource -> variants.forEach { theme -> - resourceMappings["drawable", resource + "_" + theme] + getResourceId(ResourceType.DRAWABLE, resource + "_" + theme) } } @@ -46,7 +46,7 @@ private val changeHeaderBytecodePatch = bytecodePatch { "ytWordmarkHeader", "ytPremiumWordmarkHeader" ).forEach { resourceName -> - val resourceId = resourceMappings["attr", resourceName] + val resourceId = getResourceId(ResourceType.ATTR, resourceName) forEachLiteralValueInstruction(resourceId) { literalIndex -> val register = getInstruction(literalIndex).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt index 7b368f31f3..c8b802361a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt @@ -8,6 +8,8 @@ import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPref import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch +import app.revanced.patches.youtube.misc.playservice.is_20_22_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen val hideButtonsPatch = resourcePatch( @@ -18,6 +20,7 @@ val hideButtonsPatch = resourcePatch( resourceMappingPatch, lithoFilterPatch, addResourcesPatch, + versionCheckPatch, ) compatibleWith( @@ -34,24 +37,33 @@ val hideButtonsPatch = resourcePatch( execute { addResources("youtube", "layout.buttons.action.hideButtonsPatch") + val preferences = mutableSetOf( + SwitchPreference("revanced_disable_like_subscribe_glow"), + SwitchPreference("revanced_hide_download_button"), + SwitchPreference("revanced_hide_like_dislike_button"), + SwitchPreference("revanced_hide_save_button"), + ) + + if (!is_20_22_or_greater) { + // FIXME: 20.22+ filtering of the action buttons doesn't work because + // the buffer is the same for all buttons. + preferences.addAll(listOf( + SwitchPreference("revanced_hide_hype_button"), + SwitchPreference("revanced_hide_ask_button"), + SwitchPreference("revanced_hide_clip_button"), + SwitchPreference("revanced_hide_promote_button"), + SwitchPreference("revanced_hide_remix_button"), + SwitchPreference("revanced_hide_report_button"), + SwitchPreference("revanced_hide_share_button"), + SwitchPreference("revanced_hide_stop_ads_button"), + SwitchPreference("revanced_hide_thanks_button"), + )) + } + PreferenceScreen.PLAYER.addPreferences( PreferenceScreenPreference( "revanced_hide_buttons_screen", - preferences = setOf( - SwitchPreference("revanced_disable_like_subscribe_glow"), - SwitchPreference("revanced_hide_ask_button"), - SwitchPreference("revanced_hide_clip_button"), - SwitchPreference("revanced_hide_download_button"), - SwitchPreference("revanced_hide_hype_button"), - SwitchPreference("revanced_hide_like_dislike_button"), - SwitchPreference("revanced_hide_promote_button"), - SwitchPreference("revanced_hide_remix_button"), - SwitchPreference("revanced_hide_report_button"), - SwitchPreference("revanced_hide_save_button"), - SwitchPreference("revanced_hide_share_button"), - SwitchPreference("revanced_hide_stop_ads_button"), - SwitchPreference("revanced_hide_thanks_button"), - ) + preferences = preferences ) ) 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 a4e65eb28b..49868a731f 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,53 +1,68 @@ package app.revanced.patches.youtube.layout.buttons.navigation -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -import app.revanced.util.literal - -internal const val ANDROID_AUTOMOTIVE_STRING = "Android Automotive" +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patcher.string +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode -internal val addCreateButtonViewFingerprint = fingerprint { - strings("Android Wear", ANDROID_AUTOMOTIVE_STRING) +internal val addCreateButtonViewFingerprint by fingerprint { + instructions( + string("Android Wear"), + opcode(Opcode.IF_EQZ), + string("Android Automotive", maxAfter = 0), + ) } -internal val createPivotBarFingerprint = fingerprint { +internal val createPivotBarFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") parameters( "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;", "Landroid/widget/TextView;", "Ljava/lang/CharSequence;", ) - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.RETURN_VOID, + instructions( + methodCall(definingClass = "Landroid/widget/TextView;", name = "setText"), + opcode(Opcode.RETURN_VOID) ) } -internal const val TRANSLUCENT_NAVIGATION_STATUS_BAR_FEATURE_FLAG = 45400535L - -internal val translucentNavigationStatusBarFeatureFlagFingerprint = fingerprint { +internal val animatedNavigationTabsFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") - literal { TRANSLUCENT_NAVIGATION_STATUS_BAR_FEATURE_FLAG } + instructions( + literal(45680008L) + ) } -internal const val TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG = 45630927L +internal val translucentNavigationStatusBarFeatureFlagFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + instructions( + literal(45400535L) // Translucent status bar feature flag. + ) +} -internal val translucentNavigationButtonsFeatureFlagFingerprint = fingerprint { +/** + * YouTube nav buttons. + */ +internal val translucentNavigationButtonsFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") - literal { TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG } + instructions( + literal(45630927L) // Translucent navigation bar buttons feature flag. + ) } /** - * The device on screen back/home/recent buttons. + * Device on screen back/home/recent buttons. */ -internal const val TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG = 45632194L - -internal val translucentNavigationButtonsSystemFeatureFlagFingerprint = fingerprint { +internal val translucentNavigationButtonsSystemFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") - literal { TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG } + instructions( + literal(45632194L) // Translucent system buttons feature flag. + ) } \ No newline at end of file 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 b59ec3f389..1f1cf7850b 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 @@ -13,15 +13,13 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.navigation.hookNavigationButtonCreated import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_15_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.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.insertLiteralOverride import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/NavigationButtonsPatch;" @@ -71,6 +69,12 @@ val navigationButtonsPatch = bytecodePatch( ) } + if (is_20_15_or_greater) { + PreferenceScreen.GENERAL_LAYOUT.addPreferences( + SwitchPreference("revanced_navigation_bar_animations") + ) + } + PreferenceScreen.GENERAL_LAYOUT.addPreferences( PreferenceScreenPreference( key = "revanced_navigation_buttons_screen", @@ -80,59 +84,70 @@ val navigationButtonsPatch = bytecodePatch( ) // Switch create with notifications button. - addCreateButtonViewFingerprint.method.apply { - val stringIndex = addCreateButtonViewFingerprint.stringMatches!!.find { match -> - match.string == ANDROID_AUTOMOTIVE_STRING - }!!.index - - val conditionalCheckIndex = stringIndex - 1 - val conditionRegister = - getInstruction(conditionalCheckIndex).registerA - - addInstructions( - conditionalCheckIndex, - """ - invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->switchCreateWithNotificationButton()Z - move-result v$conditionRegister - """, - ) + addCreateButtonViewFingerprint.let { + it.method.apply { + val conditionalCheckIndex = it.instructionMatches[1].index + val conditionRegister = + getInstruction(conditionalCheckIndex).registerA + + addInstructions( + conditionalCheckIndex, + """ + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->switchCreateWithNotificationButton()Z + move-result v$conditionRegister + """, + ) + } } // Hide navigation button labels. - createPivotBarFingerprint.method.apply { - val setTextIndex = indexOfFirstInstructionOrThrow { - getReference()?.name == "setText" + createPivotBarFingerprint.let { + it.method.apply { + val setTextIndex = it.instructionMatches.first().index + val targetRegister = getInstruction(setTextIndex).registerC + + addInstruction( + setTextIndex, + "invoke-static { v$targetRegister }, " + + "$EXTENSION_CLASS_DESCRIPTOR->hideNavigationButtonLabels(Landroid/widget/TextView;)V", + ) } - - val targetRegister = getInstruction(setTextIndex).registerC - - addInstruction( - setTextIndex, - "invoke-static { v$targetRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->hideNavigationButtonLabels(Landroid/widget/TextView;)V", - ) } // Hook navigation button created, in order to hide them. hookNavigationButtonCreated(EXTENSION_CLASS_DESCRIPTOR) - // Force on/off translucent effect on status bar and navigation buttons. if (is_19_25_or_greater) { - translucentNavigationStatusBarFeatureFlagFingerprint.method.insertLiteralOverride( - TRANSLUCENT_NAVIGATION_STATUS_BAR_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationStatusBar(Z)Z", - ) + translucentNavigationStatusBarFeatureFlagFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationStatusBar(Z)Z", + ) + } - translucentNavigationButtonsFeatureFlagFingerprint.method.insertLiteralOverride( - TRANSLUCENT_NAVIGATION_BUTTONS_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", - ) + translucentNavigationButtonsFeatureFlagFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", + ) + } - translucentNavigationButtonsSystemFeatureFlagFingerprint.method.insertLiteralOverride( - TRANSLUCENT_NAVIGATION_BUTTONS_SYSTEM_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", - ) + translucentNavigationButtonsSystemFeatureFlagFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->useTranslucentNavigationButtons(Z)Z", + ) + } + } + + if (is_20_15_or_greater) { + animatedNavigationTabsFeatureFlagFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->useAnimatedNavigationButtons(Z)Z" + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt index 7cc63f0fe6..128ce0e967 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt @@ -1,30 +1,39 @@ package app.revanced.patches.youtube.layout.buttons.overlay import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags -internal val playerControlsPreviousNextOverlayTouchFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - strings("1.0x") - custom { methodDef, _ -> - methodDef.containsLiteralInstruction(playerControlPreviousButtonTouchArea) && - methodDef.containsLiteralInstruction(playerControlNextButtonTouchArea) - } -} - -internal val mediaRouteButtonFingerprint = fingerprint { +internal val mediaRouteButtonFingerprint by fingerprint { parameters("I") custom { methodDef, _ -> methodDef.definingClass.endsWith("/MediaRouteButton;") && methodDef.name == "setVisibility" } } -internal val inflateControlsGroupLayoutStubFingerprint = fingerprint { +internal val castButtonPlayerFeatureFlagFingerprint by fingerprint { + returns("Z") + instructions( + literal(45690091) + ) +} + +internal val castButtonActionFeatureFlagFingerprint by fingerprint { + returns("Z") + instructions( + literal(45690090) + ) +} + +internal val inflateControlsGroupLayoutStubFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() returns("V") - literal { controlsButtonGroupLayoutStub } + instructions( + resourceLiteral(ResourceType.ID, "youtube_controls_button_group_layout_stub"), + methodCall(name = "inflate") + ) } 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 a890cf2be7..239fdd37d5 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 @@ -5,42 +5,28 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_20_28_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.layoutConstructorFingerprint import app.revanced.patches.youtube.shared.subtitleButtonControllerFingerprint -import app.revanced.util.* +import app.revanced.util.findFreeRegister +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.indexOfFirstResourceIdOrThrow +import app.revanced.util.insertLiteralOverride import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal var playerControlPreviousButtonTouchArea = -1L - private set -internal var playerControlNextButtonTouchArea = -1L - private set -internal var controlsButtonGroupLayoutStub = -1L - private set - -private val hidePlayerOverlayButtonsResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - playerControlPreviousButtonTouchArea = resourceMappings["id", "player_control_previous_button_touch_area"] - playerControlNextButtonTouchArea = resourceMappings["id", "player_control_next_button_touch_area"] - controlsButtonGroupLayoutStub = resourceMappings["id", "youtube_controls_button_group_layout_stub"] - } -} - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch;" @@ -53,7 +39,8 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, - hidePlayerOverlayButtonsResourcePatch, + resourceMappingPatch, // Used by fingerprints. + versionCheckPatch ) compatibleWith( @@ -80,21 +67,19 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( // region Hide player next/previous button. - playerControlsPreviousNextOverlayTouchFingerprint.method.apply { - val resourceIndex = indexOfFirstLiteralInstructionOrThrow(playerControlPreviousButtonTouchArea) + layoutConstructorFingerprint.let { + it.clearMatch() // Fingerprint is shared with other patches. - val insertIndex = indexOfFirstInstructionOrThrow(resourceIndex) { - opcode == Opcode.INVOKE_STATIC && - getReference()?.parameterTypes?.firstOrNull() == "Landroid/view/View;" - } - - val viewRegister = getInstruction(insertIndex).registerC + it.method.apply { + val insertIndex = it.instructionMatches.last().index + val viewRegister = getInstruction(insertIndex).registerC - addInstruction( - insertIndex, - "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR" + - "->hidePreviousNextButtons(Landroid/view/View;)V", - ) + addInstruction( + insertIndex, + "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR" + + "->hidePreviousNextButtons(Landroid/view/View;)V", + ) + } } // endregion @@ -106,20 +91,33 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( """ invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->getCastButtonOverrideV2(I)I move-result p1 - """, + """ ) + if (is_20_28_or_greater) { + arrayOf( + castButtonPlayerFeatureFlagFingerprint, + castButtonActionFeatureFlagFingerprint + ).forEach { fingerprint -> + fingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->getCastButtonOverrideV2(Z)Z" + ) + } + } + } + // endregion // region Hide captions button. subtitleButtonControllerFingerprint.method.apply { - // Due to previously applied patches, scanResult index cannot be used in this context val insertIndex = indexOfFirstInstructionOrThrow(Opcode.IGET_BOOLEAN) + 1 addInstruction( insertIndex, - "invoke-static {v0}, $EXTENSION_CLASS_DESCRIPTOR->hideCaptionsButton(Landroid/widget/ImageView;)V", + "invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->hideCaptionsButton(Landroid/widget/ImageView;)V", ) } @@ -154,27 +152,21 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( // region Hide player control buttons background. - inflateControlsGroupLayoutStubFingerprint.method.apply { - val controlsButtonGroupLayoutStubResIdConstIndex = - indexOfFirstLiteralInstructionOrThrow(controlsButtonGroupLayoutStub) - val inflateControlsGroupLayoutStubIndex = - indexOfFirstInstruction(controlsButtonGroupLayoutStubResIdConstIndex) { - getReference()?.name == "inflate" - } - - val freeRegister = findFreeRegister(inflateControlsGroupLayoutStubIndex) - val hidePlayerControlButtonsBackgroundDescriptor = - "$EXTENSION_CLASS_DESCRIPTOR->hidePlayerControlButtonsBackground(Landroid/view/View;)V" - - addInstructions( - inflateControlsGroupLayoutStubIndex + 1, - """ - # Move the inflated layout to a temporary register. - # The result of the inflate method is by default not moved to a register after the method is called. - move-result-object v$freeRegister - invoke-static { v$freeRegister }, $hidePlayerControlButtonsBackgroundDescriptor - """ - ) + inflateControlsGroupLayoutStubFingerprint.let { + it.method.apply { + val insertIndex = it.instructionMatches.last().index + 1 + val freeRegister = findFreeRegister(insertIndex) + + addInstructions( + insertIndex, + """ + # Move the inflated layout to a temporary register. + # The result of the inflate method is by default not moved to a register after the method is called. + move-result-object v$freeRegister + invoke-static { v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->hidePlayerControlButtonsBackground(Landroid/view/View;)V + """ + ) + } } // endregion 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 6e9672cf95..a0f14a06dd 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 @@ -2,6 +2,8 @@ package app.revanced.patches.youtube.layout.formfactor import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.fieldAccess +import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch @@ -11,11 +13,8 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.navigation.hookNavigationButtonCreated import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ChangeFormFactorPatch;" @@ -51,24 +50,33 @@ val changeFormFactorPatch = bytecodePatch( hookNavigationButtonCreated(EXTENSION_CLASS_DESCRIPTOR) - createPlayerRequestBodyWithModelFingerprint.method.apply { - val formFactorEnumClass = formFactorEnumConstructorFingerprint.originalClassDef.type + val createPlayerRequestBodyWithModelFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("L") + parameters() + instructions( + fieldAccess(smali = "Landroid/os/Build;->MODEL:Ljava/lang/String;"), + fieldAccess( + definingClass = formFactorEnumConstructorFingerprint.originalClassDef.type, + type = "I", + maxAfter = 50 + ) + ) + } - val index = indexOfFirstInstructionOrThrow { - val reference = getReference() - opcode == Opcode.IGET && - reference?.definingClass == formFactorEnumClass && - reference.type == "I" - } - val register = getInstruction(index).registerA + createPlayerRequestBodyWithModelFingerprint.let { + it.method.apply { + val index = it.instructionMatches.last().index + val register = getInstruction(index).registerA - addInstructions( - index + 1, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getFormFactor(I)I - move-result v$register - """ - ) + addInstructions( + index + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getFormFactor(I)I + move-result v$register + """ + ) + } } } } 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 d1f1535ebf..6ffedaf77a 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,9 @@ package app.revanced.patches.youtube.layout.formfactor import app.revanced.patcher.fingerprint -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.Method -import com.android.tools.smali.dexlib2.iface.reference.FieldReference -internal val formFactorEnumConstructorFingerprint = fingerprint { +internal val formFactorEnumConstructorFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "UNKNOWN_FORM_FACTOR", @@ -17,33 +12,3 @@ internal val formFactorEnumConstructorFingerprint = fingerprint { "AUTOMOTIVE_FORM_FACTOR" ) } - -internal val createPlayerRequestBodyWithModelFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("L") - parameters() - opcodes(Opcode.OR_INT_LIT16) - custom { method, _ -> - method.indexOfModelInstruction() >= 0 && - method.indexOfReleaseInstruction() >= 0 - } -} - -private fun Method.indexOfModelInstruction() = - indexOfFirstInstruction { - val reference = getReference() - - reference?.definingClass == "Landroid/os/Build;" && - reference.name == "MODEL" && - reference.type == "Ljava/lang/String;" - } - -internal fun Method.indexOfReleaseInstruction(): Int = - indexOfFirstInstruction { - val reference = getReference() - - reference?.definingClass == "Landroid/os/Build${'$'}VERSION;" && - reference.name == "RELEASE" && - reference.type == "Ljava/lang/String;" - } - 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 59d859e800..dfd8f3110e 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 @@ -2,9 +2,12 @@ package app.revanced.patches.youtube.layout.hide.endscreencards import app.revanced.patcher.fingerprint import app.revanced.util.literal +import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val layoutCircleFingerprint = fingerprint { +internal val layoutCircleFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameters() returns("Landroid/view/View;") opcodes( Opcode.CONST, @@ -16,7 +19,9 @@ internal val layoutCircleFingerprint = fingerprint { literal { layoutCircle } } -internal val layoutIconFingerprint = fingerprint { +internal val layoutIconFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameters() returns("Landroid/view/View;") opcodes( Opcode.INVOKE_VIRTUAL, @@ -27,7 +32,9 @@ internal val layoutIconFingerprint = fingerprint { literal { layoutIcon } } -internal val layoutVideoFingerprint = fingerprint { +internal val layoutVideoFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC) + parameters() returns("Landroid/view/View;") opcodes( Opcode.CONST, 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 4588016319..fabf558d92 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 @@ -6,9 +6,9 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings 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 @@ -36,7 +36,7 @@ private val hideEndscreenCardsResourcePatch = resourcePatch { SwitchPreference("revanced_hide_endscreen_cards"), ) - fun idOf(name: String) = resourceMappings["layout", "endscreen_element_layout_$name"] + fun idOf(name: String) = getResourceId(ResourceType.LAYOUT, "endscreen_element_layout_$name") layoutCircle = idOf("circle") layoutIcon = idOf("icon") @@ -75,7 +75,7 @@ val hideEndscreenCardsPatch = bytecodePatch( layoutVideoFingerprint, ).forEach { fingerprint -> fingerprint.method.apply { - val insertIndex = fingerprint.patternMatch!!.endIndex + 1 + val insertIndex = fingerprint.instructionMatches.last().index + 1 val viewRegister = getInstruction(insertIndex - 1).registerA addInstruction( 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 887963e56e..97641725fe 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 @@ -7,19 +7,19 @@ 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 autoNavConstructorFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) strings("main_app_autonav") } -internal val autoNavStatusFingerprint = fingerprint { +internal val autoNavStatusFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() } -internal val removeOnLayoutChangeListenerFingerprint = fingerprint { +internal val removeOnLayoutChangeListenerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() 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 db51152073..d5e16b126c 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 @@ -48,7 +48,7 @@ val hideEndScreenSuggestedVideoPatch = bytecodePatch( ) removeOnLayoutChangeListenerFingerprint.let { - val endScreenMethod = navigate(it.originalMethod).to(it.patternMatch!!.endIndex).stop() + val endScreenMethod = navigate(it.originalMethod).to(it.instructionMatches.last().index).stop() endScreenMethod.apply { val autoNavStatusMethodName = autoNavStatusFingerprint.match( 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 b619020878..fff4d86218 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 @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.layout.hide.fullscreenambientmode import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val setFullScreenBackgroundColorFingerprint = fingerprint { +internal val setFullScreenBackgroundColorFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) parameters("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 e83689607d..7b508b5e4f 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 @@ -1,68 +1,60 @@ package app.revanced.patches.youtube.layout.hide.general +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patcher.string +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import app.revanced.patches.youtube.layout.searchbar.wideSearchbarLayoutFingerprint import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val hideShowMoreButtonFingerprint = fingerprint { - opcodes( - Opcode.CONST, - Opcode.CONST_4, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - ) - literal { expandButtonDownId } -} - /** - * 20.12+ + * 20.26+ */ -internal val parseElementFromBufferFingerprint = fingerprint { - parameters("L", "L", "[B", "L", "L") - opcodes( - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, +internal val hideShowMoreButtonFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL, AccessFlags.SYNTHETIC) + returns("V") + parameters("L", "Ljava/lang/Object;") + instructions( + resourceLiteral(ResourceType.LAYOUT, "expand_button_down"), + methodCall(smali = "Landroid/view/LayoutInflater;->inflate(ILandroid/view/ViewGroup;Z)Landroid/view/View;"), + opcode(Opcode.MOVE_RESULT_OBJECT, 0) ) - strings("Failed to parse Element") // String is a partial match. } -/** - * 20.07+ - */ -internal val parseElementFromBufferLegacy2007Fingerprint = fingerprint { - parameters("L", "L", "[B", "L", "L") - opcodes( - Opcode.IGET_OBJECT, - Opcode.IGET_BOOLEAN, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, +internal val hideShowMoreLegacyButtonFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + instructions( + resourceLiteral(ResourceType.LAYOUT, "expand_button_down"), + methodCall(smali = "Landroid/view/View;->inflate(Landroid/content/Context;ILandroid/view/ViewGroup;)Landroid/view/View;"), + opcode(Opcode.MOVE_RESULT_OBJECT) ) - strings("Failed to parse Element") // String is a partial match. } -/** - * 19.01 - 20.06 - */ -internal val parseElementFromBufferLegacy1901Fingerprint = fingerprint { +internal val parseElementFromBufferFingerprint by fingerprint { parameters("L", "L", "[B", "L", "L") - opcodes( - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, + instructions( + opcode(Opcode.IGET_OBJECT), + // IGET_BOOLEAN // 20.07+ + opcode(Opcode.INVOKE_INTERFACE, maxAfter = 1), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), + string("Failed to parse Element", partialMatch = true) ) - strings("Failed to parse Element") // String is a partial match. } -internal val playerOverlayFingerprint = fingerprint { +internal val playerOverlayFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") - strings("player_overlay_in_video_programming") + instructions( + string("player_overlay_in_video_programming") + ) } -internal val showWatermarkFingerprint = fingerprint { +internal val showWatermarkFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L") @@ -71,14 +63,16 @@ internal val showWatermarkFingerprint = fingerprint { /** * Matches same method as [wideSearchbarLayoutFingerprint]. */ -internal val yoodlesImageViewFingerprint = fingerprint { +internal val yoodlesImageViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") parameters("L", "L") - literal { youTubeLogo } + instructions( + resourceLiteral(ResourceType.ID, "youtube_logo") + ) } -internal val crowdfundingBoxFingerprint = fingerprint { +internal val crowdfundingBoxFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.INVOKE_VIRTUAL, @@ -88,7 +82,7 @@ internal val crowdfundingBoxFingerprint = fingerprint { literal { crowdfundingBoxId } } -internal val albumCardsFingerprint = fingerprint { +internal val albumCardsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.MOVE_RESULT_OBJECT, @@ -101,9 +95,8 @@ internal val albumCardsFingerprint = fingerprint { literal { albumCardId } } -internal val filterBarHeightFingerprint = fingerprint { +internal val filterBarHeightFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes( Opcode.CONST, Opcode.INVOKE_VIRTUAL, @@ -113,9 +106,8 @@ internal val filterBarHeightFingerprint = fingerprint { literal { filterBarHeightId } } -internal val relatedChipCloudFingerprint = fingerprint { +internal val relatedChipCloudFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes( Opcode.CONST, Opcode.INVOKE_VIRTUAL, @@ -124,9 +116,8 @@ internal val relatedChipCloudFingerprint = fingerprint { literal { relatedChipCloudMarginId } } -internal val searchResultsChipBarFingerprint = fingerprint { +internal val searchResultsChipBarFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes( Opcode.CONST, Opcode.INVOKE_VIRTUAL, @@ -137,13 +128,13 @@ internal val searchResultsChipBarFingerprint = fingerprint { literal { barContainerHeightId } } -internal val showFloatingMicrophoneButtonFingerprint = fingerprint { +internal val showFloatingMicrophoneButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() - opcodes( - Opcode.IGET_BOOLEAN, - Opcode.IF_EQZ, + instructions( + resourceLiteral(ResourceType.ID, "fab"), + checkCast("/FloatingActionButton;", maxAfter = 10), + opcode(Opcode.IGET_BOOLEAN, maxAfter = 10) ) - literal { fabButtonId } } 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 4c9bac27c3..750f1e6823 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 @@ -14,22 +14,24 @@ import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings -import app.revanced.patches.shared.misc.settings.preference.* +import app.revanced.patches.shared.misc.settings.preference.InputType +import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch -import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater -import app.revanced.patches.youtube.misc.playservice.is_20_09_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_26_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.util.findFreeRegister import app.revanced.util.findInstructionIndicesReversedOrThrow import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @@ -37,66 +39,45 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -var expandButtonDownId = -1L +internal var albumCardId = -1L private set -var albumCardId = -1L +internal var crowdfundingBoxId = -1L private set -var crowdfundingBoxId = -1L +internal var filterBarHeightId = -1L private set -var youTubeLogo = -1L +internal var relatedChipCloudMarginId = -1L private set -var filterBarHeightId = -1L - private set -var relatedChipCloudMarginId = -1L - private set -var barContainerHeightId = -1L - private set -var fabButtonId = -1L +internal var barContainerHeightId = -1L private set private val hideLayoutComponentsResourcePatch = resourcePatch { dependsOn(resourceMappingPatch) execute { - expandButtonDownId = resourceMappings[ - "layout", - "expand_button_down", - ] - - albumCardId = resourceMappings[ - "layout", + albumCardId = getResourceId( + ResourceType.LAYOUT, "album_card", - ] + ) - crowdfundingBoxId = resourceMappings[ - "layout", + crowdfundingBoxId = getResourceId( + ResourceType.LAYOUT, "donation_companion", - ] - - youTubeLogo = resourceMappings[ - "id", - "youtube_logo", - ] + ) - relatedChipCloudMarginId = resourceMappings[ - "layout", + relatedChipCloudMarginId = getResourceId( + ResourceType.LAYOUT, "related_chip_cloud_reduced_margins", - ] + ) - filterBarHeightId = resourceMappings[ - "dimen", + filterBarHeightId = getResourceId( + ResourceType.DIMEN, "filter_bar_height", - ] + ) - barContainerHeightId = resourceMappings[ - "dimen", + barContainerHeightId = getResourceId( + ResourceType.DIMEN, "bar_container_height", - ] - - fabButtonId = resourceMappings[ - "id", - "fab", - ] + ) } } @@ -122,6 +103,8 @@ val hideLayoutComponentsPatch = bytecodePatch( addResourcesPatch, hideLayoutComponentsResourcePatch, navigationBarHookPatch, + versionCheckPatch, + resourceMappingPatch ) compatibleWith( @@ -257,32 +240,29 @@ val hideLayoutComponentsPatch = bytecodePatch( // region Mix playlists - (if (is_20_09_or_greater) parseElementFromBufferFingerprint - else if (is_20_07_or_greater) parseElementFromBufferLegacy2007Fingerprint - else parseElementFromBufferLegacy1901Fingerprint).let { - it.method.apply { - val byteArrayParameter = "p3" - val startIndex = it.patternMatch!!.startIndex - val conversionContextRegister = getInstruction(startIndex).registerA - val returnEmptyComponentInstruction = instructions.last { it.opcode == Opcode.INVOKE_STATIC } - val returnEmptyComponentRegister = (returnEmptyComponentInstruction as FiveRegisterInstruction).registerC - val insertIndex = startIndex + 1 - val freeRegister = findFreeRegister(insertIndex, conversionContextRegister, returnEmptyComponentRegister) - - addInstructionsWithLabels( - insertIndex, - """ - invoke-static { v$conversionContextRegister, $byteArrayParameter }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z - move-result v$freeRegister - if-eqz v$freeRegister, :show - move-object v$returnEmptyComponentRegister, p1 # Required for 19.47 - goto :return_empty_component - :show - nop - """, - ExternalLabel("return_empty_component", returnEmptyComponentInstruction), - ) - } + parseElementFromBufferFingerprint.method.apply { + val startIndex = parseElementFromBufferFingerprint.instructionMatches.first().index + val insertIndex = startIndex + 1 + + val byteArrayParameter = "p3" + val conversionContextRegister = getInstruction(startIndex).registerA + val returnEmptyComponentInstruction = instructions.last { it.opcode == Opcode.INVOKE_STATIC } + val returnEmptyComponentRegister = (returnEmptyComponentInstruction as FiveRegisterInstruction).registerC + val freeRegister = findFreeRegister(insertIndex, conversionContextRegister, returnEmptyComponentRegister) + + addInstructionsWithLabels( + insertIndex, + """ + invoke-static { v$conversionContextRegister, $byteArrayParameter }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z + move-result v$freeRegister + if-eqz v$freeRegister, :show + move-object v$returnEmptyComponentRegister, p1 # Required for 19.47 + goto :return_empty_component + :show + nop + """, + ExternalLabel("return_empty_component", returnEmptyComponentInstruction), + ) } // endregion @@ -308,16 +288,18 @@ val hideLayoutComponentsPatch = bytecodePatch( // region Show more button - hideShowMoreButtonFingerprint.method.apply { - val moveRegisterIndex = hideShowMoreButtonFingerprint.patternMatch!!.endIndex - val viewRegister = getInstruction(moveRegisterIndex).registerA + (if (is_20_26_or_greater) hideShowMoreButtonFingerprint else hideShowMoreLegacyButtonFingerprint).let { + it.method.apply { + val moveRegisterIndex = it.instructionMatches.last().index + val viewRegister = getInstruction(moveRegisterIndex).registerA - val insertIndex = moveRegisterIndex + 1 - addInstruction( - insertIndex, - "invoke-static { v$viewRegister }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + - "->hideShowMoreButton(Landroid/view/View;)V", - ) + val insertIndex = moveRegisterIndex + 1 + addInstruction( + insertIndex, + "invoke-static { v$viewRegister }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR" + + "->hideShowMoreButton(Landroid/view/View;)V", + ) + } } // endregion @@ -325,7 +307,7 @@ val hideLayoutComponentsPatch = bytecodePatch( // region crowdfunding box crowdfundingBoxFingerprint.let { it.method.apply { - val insertIndex = it.patternMatch!!.endIndex + val insertIndex = it.instructionMatches.last().index val objectRegister = getInstruction(insertIndex).registerA addInstruction( @@ -342,7 +324,7 @@ val hideLayoutComponentsPatch = bytecodePatch( albumCardsFingerprint.let { it.method.apply { - val checkCastAnchorIndex = it.patternMatch!!.endIndex + val checkCastAnchorIndex = it.instructionMatches.last().index val insertIndex = checkCastAnchorIndex + 1 val register = getInstruction(checkCastAnchorIndex).registerA @@ -358,18 +340,19 @@ val hideLayoutComponentsPatch = bytecodePatch( // region hide floating microphone - showFloatingMicrophoneButtonFingerprint.method.apply { - val literalIndex = indexOfFirstLiteralInstructionOrThrow(fabButtonId) - val booleanIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.IGET_BOOLEAN) - val register = getInstruction(booleanIndex).registerA + showFloatingMicrophoneButtonFingerprint.let { + it.method.apply { + val index = it.instructionMatches.last().index + val register = getInstruction(index).registerA - addInstructions( - booleanIndex + 1, - """ - invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideFloatingMicrophoneButton(Z)Z - move-result v$register - """ - ) + addInstructions( + index + 1, + """ + invoke-static { v$register }, $LAYOUT_COMPONENTS_FILTER_CLASS_DESCRIPTOR->hideFloatingMicrophoneButton(Z)Z + move-result v$register + """, + ) + } } // endregion @@ -408,11 +391,9 @@ val hideLayoutComponentsPatch = bytecodePatch( hookRegisterOffset: Int = 0, instructions: (Int) -> String, ) = method.apply { - val endIndex = patternMatch!!.endIndex - + val endIndex = instructionMatches.last().index val insertIndex = endIndex + insertIndexOffset - val register = - getInstruction(endIndex + hookRegisterOffset).registerA + val register = getInstruction(endIndex + hookRegisterOffset).registerA addInstructions(insertIndex, instructions(register)) } 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 5088472a1b..6b1b09d585 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 @@ -1,24 +1,29 @@ package app.revanced.patches.youtube.layout.hide.infocards import app.revanced.patcher.fingerprint +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 infocardsIncognitoFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/Boolean;") parameters("L", "J") - strings("vibrator") + instructions( + string("vibrator") + ) } -internal val infocardsIncognitoParentFingerprint = fingerprint { +internal val infocardsIncognitoParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") - strings("player_overlay_info_card_teaser") + instructions( + string("player_overlay_info_card_teaser") + ) } -internal val infocardsMethodCallFingerprint = fingerprint { +internal val infocardsMethodCallFingerprint by fingerprint { 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 cac5c169b9..a7d9a73b6f 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 @@ -8,9 +8,9 @@ import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter @@ -25,22 +25,13 @@ internal var drawerResourceId = -1L private set private val hideInfocardsResourcePatch = resourcePatch { - dependsOn( - settingsPatch, - resourceMappingPatch, - addResourcesPatch, + dependsOn(resourceMappingPatch ) execute { - addResources("youtube", "layout.hide.infocards.hideInfocardsResourcePatch") - - PreferenceScreen.PLAYER.addPreferences( - SwitchPreference("revanced_hide_info_cards"), - ) - - drawerResourceId = resourceMappings[ - "id", + drawerResourceId = getResourceId( + ResourceType.ID, "info_cards_drawer_header", - ] + ) } } @@ -53,6 +44,8 @@ val hideInfoCardsPatch = bytecodePatch( sharedExtensionPatch, lithoFilterPatch, hideInfocardsResourcePatch, + settingsPatch, + addResourcesPatch, ) compatibleWith( @@ -67,6 +60,13 @@ val hideInfoCardsPatch = bytecodePatch( ) execute { + addResources("youtube", "layout.hide.infocards.hideInfocardsResourcePatch") + + PreferenceScreen.PLAYER.addPreferences( + SwitchPreference("revanced_hide_info_cards"), + ) + + // Edit: This old non litho code may be obsolete and no longer used by any supported versions. infocardsIncognitoFingerprint.match(infocardsIncognitoParentFingerprint.originalClassDef).method.apply { val invokeInstructionIndex = implementation!!.instructions.indexOfFirst { it.opcode.ordinal == Opcode.INVOKE_VIRTUAL.ordinal && @@ -80,23 +80,26 @@ val hideInfoCardsPatch = bytecodePatch( ) } - val hideInfoCardsCallMethod = infocardsMethodCallFingerprint.method - - val invokeInterfaceIndex = infocardsMethodCallFingerprint.patternMatch!!.endIndex - val toggleRegister = infocardsMethodCallFingerprint.method.implementation!!.registerCount - 1 + // Edit: This old non litho code may be obsolete and no longer used by any supported versions. + infocardsMethodCallFingerprint.let { + val invokeInterfaceIndex = it.instructionMatches.last().index + it.method.apply { + val register = implementation!!.registerCount - 1 - hideInfoCardsCallMethod.addInstructionsWithLabels( - invokeInterfaceIndex, - """ - invoke-static {}, Lapp/revanced/extension/youtube/patches/HideInfoCardsPatch;->hideInfoCardsMethodCall()Z - move-result v$toggleRegister - if-nez v$toggleRegister, :hide_info_cards - """, - ExternalLabel( - "hide_info_cards", - hideInfoCardsCallMethod.getInstruction(invokeInterfaceIndex + 1), - ), - ) + addInstructionsWithLabels( + invokeInterfaceIndex, + """ + invoke-static {}, Lapp/revanced/extension/youtube/patches/HideInfoCardsPatch;->hideInfoCardsMethodCall()Z + move-result v$register + if-nez v$register, :hide_info_cards + """, + ExternalLabel( + "hide_info_cards", + getInstruction(invokeInterfaceIndex + 1), + ) + ) + } + } // Info cards can also appear as Litho components. val filterClassDescriptor = "Lapp/revanced/extension/youtube/patches/components/HideInfoCardsFilter;" 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 0ca1298631..0db3338098 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,14 +1,17 @@ package app.revanced.patches.youtube.layout.hide.relatedvideooverlay import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral -internal val relatedEndScreenResultsParentFingerprint = fingerprint { +internal val relatedEndScreenResultsParentFingerprint by fingerprint { returns("V") - literal{ appRelatedEndScreenResults } + instructions( + resourceLiteral(ResourceType.LAYOUT, "app_related_endscreen_results") + ) } -internal val relatedEndScreenResultsFingerprint = fingerprint { +internal val relatedEndScreenResultsFingerprint by fingerprint { returns("V") parameters( "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 fa8fa9f047..9eaef02543 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 @@ -3,33 +3,14 @@ package app.revanced.patches.youtube.layout.hide.relatedvideooverlay import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch +import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings 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.patcher.util.smali.ExternalLabel - -internal var appRelatedEndScreenResults = -1L - private set - -private val hideRelatedVideoOverlayResourcePatch = resourcePatch { - dependsOn( - resourceMappingPatch, - ) - - execute { - appRelatedEndScreenResults = resourceMappings[ - "layout", - "app_related_endscreen_results", - ] - } -} private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/HideRelatedVideoOverlayPatch;" @@ -43,7 +24,7 @@ val hideRelatedVideoOverlayPatch = bytecodePatch( settingsPatch, sharedExtensionPatch, addResourcesPatch, - hideRelatedVideoOverlayResourcePatch, + resourceMappingPatch, ) compatibleWith( 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 b81cab1cb8..cf26609630 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 @@ -47,27 +47,27 @@ val disableRollingNumberAnimationPatch = bytecodePatch( // Animations are disabled by preventing an Image from being applied to the text span, // which prevents the animations from appearing. + rollingNumberTextViewAnimationUpdateFingerprint.let { + val blockStartIndex = it.instructionMatches.first().index + val blockEndIndex = it.instructionMatches.last().index + 1 + it.method.apply { + val freeRegister = getInstruction(blockStartIndex).registerA - val patternMatch = rollingNumberTextViewAnimationUpdateFingerprint.patternMatch!! - val blockStartIndex = patternMatch.startIndex - val blockEndIndex = patternMatch.endIndex + 1 - rollingNumberTextViewAnimationUpdateFingerprint.method.apply { - val freeRegister = getInstruction(blockStartIndex).registerA + // ReturnYouTubeDislike also makes changes to this same method, + // and must add control flow label to a noop instruction to + // ensure RYD patch adds its changes after the control flow label. + addInstructions(blockEndIndex, "nop") - // ReturnYouTubeDislike also makes changes to this same method, - // and must add control flow label to a noop instruction to - // ensure RYD patch adds its changes after the control flow label. - addInstructions(blockEndIndex, "nop") - - addInstructionsWithLabels( - blockStartIndex, - """ + addInstructionsWithLabels( + blockStartIndex, + """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableRollingNumberAnimations()Z move-result v$freeRegister if-nez v$freeRegister, :disable_animations """, - ExternalLabel("disable_animations", getInstruction(blockEndIndex)), - ) + ExternalLabel("disable_animations", getInstruction(blockEndIndex)), + ) + } } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt deleted file mode 100644 index edf7390cef..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.youtube.layout.hide.seekbar - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.interaction.seekbar.hideSeekbarPatch - -@Deprecated("Patch was moved to app.revanced.patches.youtube.interaction.seekbar") -val hideSeekbarPatch = bytecodePatch { - dependsOn( - hideSeekbarPatch - ) -} 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 cc883425ba..803090f59b 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,11 +1,16 @@ package app.revanced.patches.youtube.layout.hide.shorts import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patcher.string +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val legacyRenderBottomNavigationBarParentFingerprint = fingerprint { +internal val legacyRenderBottomNavigationBarParentFingerprint by fingerprint { parameters( "I", "I", @@ -14,18 +19,24 @@ internal val legacyRenderBottomNavigationBarParentFingerprint = fingerprint { "J", "L", ) - strings("aa") + instructions( + string("aa") + ) } -internal val shortsBottomBarContainerFingerprint = fingerprint { +internal val shortsBottomBarContainerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;", "Landroid/os/Bundle;") - strings("r_pfvc") - literal { bottomBarContainer } + instructions( + string("r_pfvc"), + resourceLiteral(ResourceType.ID, "bottom_bar_container"), + methodCall(name = "getHeight"), + opcode(Opcode.MOVE_RESULT) + ) } -internal val renderBottomNavigationBarFingerprint = fingerprint { +internal val renderBottomNavigationBarFingerprint by fingerprint { returns("V") parameters("Ljava/lang/String;") opcodes( @@ -46,7 +57,7 @@ internal val renderBottomNavigationBarFingerprint = fingerprint { * Identical to [legacyRenderBottomNavigationBarParentFingerprint] * except this has an extra parameter. */ -internal val renderBottomNavigationBarParentFingerprint = fingerprint { +internal val renderBottomNavigationBarParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters( "I", @@ -57,10 +68,12 @@ internal val renderBottomNavigationBarParentFingerprint = fingerprint { "Ljava/lang/String;", "L", ) - strings("aa") + instructions( + string("aa") + ) } -internal val setPivotBarVisibilityFingerprint = fingerprint { +internal val setPivotBarVisibilityFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Z") @@ -70,25 +83,27 @@ internal val setPivotBarVisibilityFingerprint = fingerprint { ) } -internal val setPivotBarVisibilityParentFingerprint = fingerprint { +internal val setPivotBarVisibilityParentFingerprint by fingerprint { parameters("Z") - strings("FEnotifications_inbox") + instructions( + string("FEnotifications_inbox") + ) } -internal val shortsExperimentalPlayerFeatureFlagFingerprint = fingerprint { +internal val shortsExperimentalPlayerFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() - literal { - 45677719L - } + instructions( + literal(45677719L) + ) } -internal val renderNextUIFeatureFlagFingerprint = fingerprint { +internal val renderNextUIFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() - literal { - 45649743L - } + instructions( + literal(45649743L) + ) } 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 1faab015e7..ea979a07dc 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 @@ -8,9 +8,9 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch @@ -19,6 +19,7 @@ import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_41_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_22_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 @@ -26,16 +27,10 @@ import app.revanced.util.findElementByAttributeValueOrThrow import app.revanced.util.forEachLiteralValueInstruction import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstruction import app.revanced.util.returnLate import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal var bottomBarContainer = -1L - private set -internal var reelPlayerRightPivotV2Size = -1L - private set - internal val hideShortsAppShortcutOption = booleanOption( key = "hideShortsAppShortcut", default = false, @@ -64,6 +59,62 @@ private val hideShortsComponentsResourcePatch = resourcePatch { addResources("youtube", "layout.hide.shorts.hideShortsComponentsResourcePatch") + val preferences = mutableSetOf( + // Shorts player components. + // Ideally each group should be ordered similar to how they appear in the UI + + // Vertical row of buttons on right side of the screen. + SwitchPreference("revanced_hide_shorts_like_fountain"), + SwitchPreference("revanced_hide_shorts_like_button"), + SwitchPreference("revanced_hide_shorts_dislike_button"), + ) + + if (!is_20_22_or_greater) { + // FIXME: The buffer is very different for 20.22+ and these current cannot be hidden. + preferences.addAll( + listOf( + SwitchPreference("revanced_hide_shorts_comments_button"), + SwitchPreference("revanced_hide_shorts_share_button"), + SwitchPreference("revanced_hide_shorts_remix_button"), + SwitchPreference("revanced_hide_shorts_sound_button") + ) + ) + } + + preferences.addAll( + listOf( + // Upper and middle area of the player. + SwitchPreference("revanced_hide_shorts_join_button"), + SwitchPreference("revanced_hide_shorts_subscribe_button"), + SwitchPreference("revanced_hide_shorts_paused_overlay_buttons"), + + // Suggested actions. + SwitchPreference("revanced_hide_shorts_preview_comment"), + SwitchPreference("revanced_hide_shorts_save_sound_button"), + SwitchPreference("revanced_hide_shorts_use_sound_button"), + SwitchPreference("revanced_hide_shorts_use_template_button"), + SwitchPreference("revanced_hide_shorts_upcoming_button"), + SwitchPreference("revanced_hide_shorts_effect_button"), + SwitchPreference("revanced_hide_shorts_green_screen_button"), + SwitchPreference("revanced_hide_shorts_hashtag_button"), + SwitchPreference("revanced_hide_shorts_new_posts_button"), + SwitchPreference("revanced_hide_shorts_shop_button"), + SwitchPreference("revanced_hide_shorts_tagged_products"), + SwitchPreference("revanced_hide_shorts_search_suggestions"), + SwitchPreference("revanced_hide_shorts_super_thanks_button"), + SwitchPreference("revanced_hide_shorts_stickers"), + + // Bottom of the screen. + SwitchPreference("revanced_hide_shorts_location_label"), + SwitchPreference("revanced_hide_shorts_channel_bar"), + SwitchPreference("revanced_hide_shorts_info_panel"), + SwitchPreference("revanced_hide_shorts_full_video_link_label"), + SwitchPreference("revanced_hide_shorts_video_title"), + SwitchPreference("revanced_hide_shorts_sound_metadata_label"), + SwitchPreference("revanced_hide_shorts_navigation_bar"), + ) + ) + PreferenceScreen.SHORTS.addPreferences( SwitchPreference("revanced_hide_shorts_home"), SwitchPreference("revanced_hide_shorts_search"), @@ -73,50 +124,8 @@ private val hideShortsComponentsResourcePatch = resourcePatch { PreferenceScreenPreference( key = "revanced_shorts_player_screen", sorting = PreferenceScreenPreference.Sorting.UNSORTED, - preferences = setOf( - // Shorts player components. - // Ideally each group should be ordered similar to how they appear in the UI - - // Vertical row of buttons on right side of the screen. - SwitchPreference("revanced_hide_shorts_like_fountain"), - SwitchPreference("revanced_hide_shorts_like_button"), - SwitchPreference("revanced_hide_shorts_dislike_button"), - SwitchPreference("revanced_hide_shorts_comments_button"), - SwitchPreference("revanced_hide_shorts_share_button"), - SwitchPreference("revanced_hide_shorts_remix_button"), - SwitchPreference("revanced_hide_shorts_sound_button"), - - // Upper and middle area of the player. - SwitchPreference("revanced_hide_shorts_join_button"), - SwitchPreference("revanced_hide_shorts_subscribe_button"), - SwitchPreference("revanced_hide_shorts_paused_overlay_buttons"), - - // Suggested actions. - SwitchPreference("revanced_hide_shorts_preview_comment"), - SwitchPreference("revanced_hide_shorts_save_sound_button"), - SwitchPreference("revanced_hide_shorts_use_sound_button"), - SwitchPreference("revanced_hide_shorts_use_template_button"), - SwitchPreference("revanced_hide_shorts_upcoming_button"), - SwitchPreference("revanced_hide_shorts_effect_button"), - SwitchPreference("revanced_hide_shorts_green_screen_button"), - SwitchPreference("revanced_hide_shorts_hashtag_button"), - SwitchPreference("revanced_hide_shorts_new_posts_button"), - SwitchPreference("revanced_hide_shorts_shop_button"), - SwitchPreference("revanced_hide_shorts_tagged_products"), - SwitchPreference("revanced_hide_shorts_search_suggestions"), - SwitchPreference("revanced_hide_shorts_super_thanks_button"), - SwitchPreference("revanced_hide_shorts_stickers"), - - // Bottom of the screen. - SwitchPreference("revanced_hide_shorts_location_label"), - SwitchPreference("revanced_hide_shorts_channel_bar"), - SwitchPreference("revanced_hide_shorts_info_panel"), - SwitchPreference("revanced_hide_shorts_full_video_link_label"), - SwitchPreference("revanced_hide_shorts_video_title"), - SwitchPreference("revanced_hide_shorts_sound_metadata_label"), - SwitchPreference("revanced_hide_shorts_navigation_bar"), - ), - ), + preferences = preferences, + ) ) // Verify the file has the expected node, even if the patch option is off. @@ -141,16 +150,6 @@ private val hideShortsComponentsResourcePatch = resourcePatch { shortsItem.parentNode.removeChild(shortsItem) } } - - bottomBarContainer = resourceMappings[ - "id", - "bottom_bar_container", - ] - - reelPlayerRightPivotV2Size = resourceMappings[ - "dimen", - "reel_player_right_pivot_v2_size", - ] } } @@ -188,7 +187,7 @@ val hideShortsComponentsPatch = bytecodePatch( addLithoFilter(FILTER_CLASS_DESCRIPTOR) forEachLiteralValueInstruction( - reelPlayerRightPivotV2Size, + getResourceId(ResourceType.DIMEN, "reel_player_right_pivot_v2_size") ) { literalInstructionIndex -> val targetIndex = indexOfFirstInstructionOrThrow(literalInstructionIndex) { getReference()?.name == "getDimensionPixelSize" @@ -214,7 +213,7 @@ val hideShortsComponentsPatch = bytecodePatch( setPivotBarVisibilityParentFingerprint.originalClassDef, ).let { result -> result.method.apply { - val insertIndex = result.patternMatch!!.endIndex + val insertIndex = result.instructionMatches.last().index val viewRegister = getInstruction(insertIndex - 1).registerA addInstruction( insertIndex, @@ -237,26 +236,24 @@ val hideShortsComponentsPatch = bytecodePatch( ) // Hide the bottom bar container of the Shorts player. - shortsBottomBarContainerFingerprint.method.apply { - val resourceIndex = indexOfFirstLiteralInstruction(bottomBarContainer) - - val targetIndex = indexOfFirstInstructionOrThrow(resourceIndex) { - getReference()?.name == "getHeight" - } + 1 - - val heightRegister = getInstruction(targetIndex).registerA - - addInstructions( - targetIndex + 1, - """ - invoke-static { v$heightRegister }, $FILTER_CLASS_DESCRIPTOR->getNavigationBarHeight(I)I - move-result v$heightRegister - """ - ) + shortsBottomBarContainerFingerprint.let { + it.method.apply { + val targetIndex = it.instructionMatches.last().index + val heightRegister = getInstruction(targetIndex).registerA + + addInstructions( + targetIndex + 1, + """ + invoke-static { v$heightRegister }, $FILTER_CLASS_DESCRIPTOR->getNavigationBarHeight(I)I + move-result v$heightRegister + """ + ) + } } // endregion + // region Disable experimental Shorts flags. // Flags might be present in earlier targets, but they are not found in 19.47.53. 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 1a591c3154..da5fbce3fe 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 @@ -4,17 +4,12 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWith 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.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings 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 -internal var mdx_seamless_tv_sign_in_drawer_fragment_title_id = -1L - private set - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisableSignInToTvPopupPatch;" @@ -47,11 +42,6 @@ val disableSignInToTvPopupPatch = bytecodePatch( SwitchPreference("revanced_disable_signin_to_tv_popup"), ) - mdx_seamless_tv_sign_in_drawer_fragment_title_id = resourceMappings[ - "string", - "mdx_seamless_tv_sign_in_drawer_fragment_title", - ] - signInToTvPopupFingerprint.method.addInstructionsWithLabels( 0, """ 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 c79d4ed264..ad973642c3 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,12 +1,16 @@ package app.revanced.patches.youtube.layout.hide.signintotvpopup import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral -internal val signInToTvPopupFingerprint = fingerprint { +internal val signInToTvPopupFingerprint by fingerprint { returns("Z") parameters("Ljava/lang/String;", "Z", "L") - literal { - mdx_seamless_tv_sign_in_drawer_fragment_title_id - } + instructions( + resourceLiteral( + ResourceType.STRING, + "mdx_seamless_tv_sign_in_drawer_fragment_title" + ) + ) } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt deleted file mode 100644 index 388aee7ad6..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.layout.hide.suggestedvideoendscreen - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch - -@Deprecated("Use 'Hide suggested video end screen' instead.") -val disableSuggestedVideoEndScreenPatch = bytecodePatch { - dependsOn(hideEndScreenSuggestedVideoPatch) -} \ No newline at end of file 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 1f1876dc30..4e4526f7fa 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,16 +1,32 @@ package app.revanced.patches.youtube.layout.hide.time +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val timeCounterFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) +internal val timeCounterFingerprint by fingerprint { returns("V") + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() - opcodes( - Opcode.SUB_LONG_2ADDR, - Opcode.IGET_WIDE, - Opcode.SUB_LONG_2ADDR + instructions( + opcode(Opcode.SUB_LONG_2ADDR), + methodCall( + opcode = Opcode.INVOKE_STATIC, + returnType = "Ljava/lang/CharSequence;", + maxAfter = 0 + ), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), + fieldAccess(opcode = Opcode.IGET_WIDE, type = "J", maxAfter = 0), + fieldAccess(opcode = Opcode.IGET_WIDE, type = "J", maxAfter = 0), + opcode(Opcode.SUB_LONG_2ADDR, maxAfter = 0), + + methodCall( + opcode = Opcode.INVOKE_STATIC, + returnType = "Ljava/lang/CharSequence;", + maxAfter = 5 + ) ) } 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 6d9bfb5677..ca54de32b9 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 @@ -9,6 +9,8 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/HideTimestampPatch;" + val hideTimestampPatch = bytecodePatch( name = "Hide timestamp", description = "Adds an option to hide the timestamp in the bottom left of the video player.", @@ -40,13 +42,13 @@ val hideTimestampPatch = bytecodePatch( timeCounterFingerprint.method.addInstructionsWithLabels( 0, """ - invoke-static { }, Lapp/revanced/extension/youtube/patches/HideTimestampPatch;->hideTimestamp()Z + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->hideTimestamp()Z move-result v0 if-eqz v0, :hide_time 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 8c139aee4f..7455cc3738 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 @@ -2,23 +2,57 @@ package app.revanced.patches.youtube.layout.miniplayer +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patcher.string +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val miniplayerDimensionsCalculatorParentFingerprint = fingerprint { +internal const val MINIPLAYER_MODERN_FEATURE_KEY = 45622882L +// In later targets this feature flag does nothing and is dead code. +internal const val MINIPLAYER_MODERN_FEATURE_LEGACY_KEY = 45630429L +internal const val MINIPLAYER_DOUBLE_TAP_FEATURE_KEY = 45628823L +internal const val MINIPLAYER_DRAG_DROP_FEATURE_KEY = 45628752L +internal const val MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY = 45658112L +internal const val MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY = 45652224L +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 by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + instructions( + literal(45623000L) // Magic number found in the constructor. + ) +} + +internal val miniplayerDimensionsCalculatorParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") - literal { floatyBarButtonTopMargin } + instructions( + resourceLiteral(ResourceType.DIMEN, "floaty_bar_button_top_margin") + ) +} + +internal val miniplayerModernViewParentFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Ljava/lang/String;") + parameters() + instructions( + string("player_overlay_modern_mini_player_controls") + ) } /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernAddViewListenerFingerprint = fingerprint { +internal val miniplayerModernAddViewListenerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;") @@ -27,121 +61,120 @@ internal val miniplayerModernAddViewListenerFingerprint = fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ - -internal val miniplayerModernCloseButtonFingerprint = fingerprint { +internal val miniplayerModernCloseButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() - literal { modernMiniplayerClose } -} - -internal const val MINIPLAYER_MODERN_FEATURE_KEY = 45622882L -// In later targets this feature flag does nothing and is dead code. -internal const val MINIPLAYER_MODERN_FEATURE_LEGACY_KEY = 45630429L -internal const val MINIPLAYER_DOUBLE_TAP_FEATURE_KEY = 45628823L -internal const val MINIPLAYER_DRAG_DROP_FEATURE_KEY = 45628752L -internal const val MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY = 45658112L -internal const val MINIPLAYER_ROUNDED_CORNERS_FEATURE_KEY = 45652224L -internal const val MINIPLAYER_INITIAL_SIZE_FEATURE_KEY = 45640023L -internal const val MINIPLAYER_DISABLED_FEATURE_KEY = 45657015L - -internal val miniplayerModernConstructorFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("L") - literal { 45623000L } -} - -internal val miniplayerOnCloseHandlerFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - literal { MINIPLAYER_DISABLED_FEATURE_KEY } + instructions( + resourceLiteral(ResourceType.ID, "modern_miniplayer_close"), + checkCast("Landroid/widget/ImageView;") + ) } /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernExpandButtonFingerprint = fingerprint { +internal val miniplayerModernExpandButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() - literal { modernMiniplayerExpand } + instructions( + resourceLiteral(ResourceType.ID, "modern_miniplayer_expand"), + checkCast("Landroid/widget/ImageView;") + ) } /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernExpandCloseDrawablesFingerprint = fingerprint { +internal val miniplayerModernExpandCloseDrawablesFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") - literal { ytOutlinePictureInPictureWhite24 } + instructions( + literal(ytOutlinePictureInPictureWhite24) + ) } /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernForwardButtonFingerprint = fingerprint { +internal val miniplayerModernForwardButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() - literal { modernMiniplayerForwardButton } + instructions( + resourceLiteral(ResourceType.ID, "modern_miniplayer_forward_button"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 5) + ) } -/** - * Matches using the class found in [miniplayerModernViewParentFingerprint]. - */ -internal val miniplayerModernOverlayViewFingerprint = fingerprint { +internal val miniplayerModernOverlayViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() - literal { scrimOverlay } + instructions( + resourceLiteral(ResourceType.ID, "scrim_overlay"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 5) + ) } /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernRewindButtonFingerprint = fingerprint { +internal val miniplayerModernRewindButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() - literal { modernMiniplayerRewindButton } -} - -internal val miniplayerModernViewParentFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - parameters() - strings("player_overlay_modern_mini_player_controls") + instructions( + resourceLiteral(ResourceType.ID, "modern_miniplayer_rewind_button"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 5) + ) } -internal val miniplayerModernActionButtonFingerprint = fingerprint { +/** + * Matches using the class found in [miniplayerModernViewParentFingerprint]. + */ +internal val miniplayerModernActionButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() - literal { modernMiniPlayerOverlayActionButton } + instructions( + resourceLiteral(ResourceType.ID, "modern_miniplayer_overlay_action_button"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 5) + ) } -internal val miniplayerMinimumSizeFingerprint = fingerprint { +internal val miniplayerMinimumSizeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - custom { method, _ -> - method.containsLiteralInstruction(192) && - method.containsLiteralInstruction(128) && - method.containsLiteralInstruction(miniplayerMaxSize) - } + instructions( + resourceLiteral(ResourceType.DIMEN, "miniplayer_max_size"), + literal(192), // Default miniplayer width constant. + literal(128) // Default miniplayer height constant. + ) } -internal val miniplayerOverrideFingerprint = fingerprint { +internal val miniplayerOverrideFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") - strings("appName") + instructions( + string("appName"), + methodCall( + parameters = listOf("Landroid/content/Context;"), + returnType = "Z", + maxAfter = 10 + ) + ) } -internal val miniplayerOverrideNoContextFingerprint = fingerprint { +internal val miniplayerOverrideNoContextFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Z") - opcodes(Opcode.IGET_BOOLEAN) // Anchor to insert the instruction. + instructions( + opcode(Opcode.IGET_BOOLEAN) // Anchor to insert the instruction. + ) } -internal val miniplayerResponseModelSizeCheckFingerprint = fingerprint { +internal val miniplayerResponseModelSizeCheckFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("Ljava/lang/Object;", "Ljava/lang/Object;") @@ -155,10 +188,18 @@ internal val miniplayerResponseModelSizeCheckFingerprint = fingerprint { ) } +internal val miniplayerOnCloseHandlerFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + instructions( + literal(MINIPLAYER_DISABLED_FEATURE_KEY) + ) +} + 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 playerOverlaysLayoutFingerprint by fingerprint { custom { method, _ -> method.definingClass == YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME } 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 08f78f9dc4..1e6ad36268 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 @@ -13,9 +13,9 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.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.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.* @@ -26,39 +26,17 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.iface.reference.TypeReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.immutable.ImmutableMethodParameter -internal var floatyBarButtonTopMargin = -1L - private set - // Only available in 19.15 and upwards. internal var ytOutlineXWhite24 = -1L private set internal var ytOutlinePictureInPictureWhite24 = -1L private set -internal var scrimOverlay = -1L - private set -internal var modernMiniplayerClose = -1L - private set -internal var modernMiniplayerExpand = -1L - private set -internal var modernMiniplayerRewindButton = -1L - private set -internal var modernMiniplayerForwardButton = -1L - private set -internal var modernMiniPlayerOverlayActionButton = -1L - private set -internal var playerOverlays = -1L - private set -internal var miniplayerMaxSize = -1L - private set private val miniplayerResourcePatch = resourcePatch { dependsOn( @@ -67,72 +45,24 @@ private val miniplayerResourcePatch = resourcePatch { ) execute { - floatyBarButtonTopMargin = resourceMappings[ - "dimen", - "floaty_bar_button_top_margin", - ] - - scrimOverlay = resourceMappings[ - "id", - "scrim_overlay", - ] - - playerOverlays = resourceMappings[ - "layout", - "player_overlays", - ] - - - modernMiniplayerClose = resourceMappings[ - "id", - "modern_miniplayer_close", - ] - - modernMiniplayerExpand = resourceMappings[ - "id", - "modern_miniplayer_expand", - ] - - modernMiniplayerRewindButton = resourceMappings[ - "id", - "modern_miniplayer_rewind_button", - ] - - modernMiniplayerForwardButton = resourceMappings[ - "id", - "modern_miniplayer_forward_button", - ] - - modernMiniPlayerOverlayActionButton = resourceMappings[ - "id", - "modern_miniplayer_overlay_action_button" - ] - // Resource id is not used during patching, but is used by extension. // Verify the resource is present while patching. - resourceMappings[ - "id", + getResourceId( + ResourceType.ID, "modern_miniplayer_subtitle_text", - ] + ) // Only required for exactly 19.16 if (!is_19_17_or_greater) { - ytOutlinePictureInPictureWhite24 = resourceMappings[ - "drawable", + ytOutlinePictureInPictureWhite24 = getResourceId( + ResourceType.DRAWABLE, "yt_outline_picture_in_picture_white_24", - ] + ) - ytOutlineXWhite24 = resourceMappings[ - "drawable", + ytOutlineXWhite24 = getResourceId( + ResourceType.DRAWABLE, "yt_outline_x_white_24", - ] - } - - if (is_19_26_or_greater) { - miniplayerMaxSize = resourceMappings[ - "dimen", - "miniplayer_max_size", - ] + ) } } } @@ -167,6 +97,7 @@ val miniplayerPatch = bytecodePatch( val preferences = mutableSetOf() + preferences += if (is_20_03_or_greater) { ListPreference("revanced_miniplayer_type") @@ -299,24 +230,6 @@ val miniplayerPatch = bytecodePatch( ) } - fun MutableMethod.hookInflatedView( - literalValue: Long, - hookedClassType: String, - extensionMethodName: String, - ) { - val imageViewIndex = indexOfFirstInstructionOrThrow( - indexOfFirstLiteralInstructionOrThrow(literalValue), - ) { - opcode == Opcode.CHECK_CAST && getReference()?.type == hookedClassType - } - - val register = getInstruction(imageViewIndex).registerA - addInstruction( - imageViewIndex + 1, - "invoke-static { v$register }, $extensionMethodName", - ) - } - // region Enable tablet miniplayer. miniplayerOverrideNoContextFingerprint.match( @@ -328,18 +241,15 @@ val miniplayerPatch = bytecodePatch( // endregion // region Legacy tablet miniplayer hooks. - val appNameStringIndex = miniplayerOverrideFingerprint.let { - it.method.indexOfFirstInstructionOrThrow(it.stringMatches!!.first().index) { - val reference = getReference() - reference?.parameterTypes?.firstOrNull() == "Landroid/content/Context;" + miniplayerOverrideFingerprint.let { + val appNameStringIndex = it.instructionMatches.last().index + navigate(it.originalMethod).to(appNameStringIndex).stop().apply { + findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride(index) } } } - navigate(miniplayerOverrideFingerprint.originalMethod).to(appNameStringIndex).stop().apply { - findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride(index) } - } miniplayerResponseModelSizeCheckFingerprint.let { - it.method.insertLegacyTabletMiniplayerOverride(it.patternMatch!!.endIndex) + it.method.insertLegacyTabletMiniplayerOverride(it.instructionMatches.last().index) } // endregion @@ -390,7 +300,6 @@ val miniplayerPatch = bytecodePatch( MINIPLAYER_INITIAL_SIZE_FEATURE_KEY, ) val targetIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.LONG_TO_INT) - val register = getInstruction(targetIndex).registerA addInstructions( @@ -403,16 +312,16 @@ val miniplayerPatch = bytecodePatch( } // Override a minimum size constant. - miniplayerMinimumSizeFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow { - opcode == Opcode.CONST_16 && (this as NarrowLiteralInstruction).narrowLiteral == 192 + miniplayerMinimumSizeFingerprint.let { + it.method.apply { + val index = it.instructionMatches[1].index + val register = getInstruction(index).registerA + + // Smaller sizes can be used, but the miniplayer will always start in size 170 if set any smaller. + // The 170 initial limit probably could be patched to allow even smaller initial sizes, + // but 170 is already half the horizontal space and smaller does not seem useful. + replaceInstruction(index, "const/16 v$register, 170") } - val register = getInstruction(index).registerA - - // Smaller sizes can be used, but the miniplayer will always start in size 170 if set any smaller. - // The 170 initial limit probably could be patched to allow even smaller initial sizes, - // but 170 is already half the horizontal space and smaller does not seem useful. - replaceInstruction(index, "const/16 v$register, 170") } } @@ -433,6 +342,11 @@ val miniplayerPatch = bytecodePatch( MINIPLAYER_HORIZONTAL_DRAG_FEATURE_KEY, "getHorizontalDrag", ) + + miniplayerModernConstructorFingerprint.insertMiniplayerFeatureFlagBooleanOverride( + MINIPLAYER_ANIMATED_EXPAND_FEATURE_KEY, + "getMaximizeAnimation", + ) } // endregion @@ -440,7 +354,7 @@ val miniplayerPatch = bytecodePatch( // region Fix 19.16 using mixed up drawables for tablet modern. // YT fixed this mistake in 19.17. // Fix this, by swapping the drawable resource values with each other. - if (ytOutlinePictureInPictureWhite24 >= 0) { + if (!is_19_17_or_greater) { miniplayerModernExpandCloseDrawablesFingerprint.match( miniplayerModernViewParentFingerprint.originalClassDef, ).method.apply { @@ -461,55 +375,22 @@ val miniplayerPatch = bytecodePatch( // region Add hooks to hide modern miniplayer buttons. listOf( - Triple( - miniplayerModernExpandButtonFingerprint, - modernMiniplayerExpand, - "hideMiniplayerExpandClose", - ), - Triple( - miniplayerModernCloseButtonFingerprint, - modernMiniplayerClose, - "hideMiniplayerExpandClose", - ), - Triple( - miniplayerModernActionButtonFingerprint, - modernMiniPlayerOverlayActionButton, - "hideMiniplayerActionButton" - ), - Triple( - miniplayerModernRewindButtonFingerprint, - modernMiniplayerRewindButton, - "hideMiniplayerRewindForward", - ), - Triple( - miniplayerModernForwardButtonFingerprint, - modernMiniplayerForwardButton, - "hideMiniplayerRewindForward", - ), - Triple( - miniplayerModernOverlayViewFingerprint, - scrimOverlay, - "adjustMiniplayerOpacity", - ), - ).forEach { (fingerprint, literalValue, methodName) -> + miniplayerModernExpandButtonFingerprint to "hideMiniplayerExpandClose", + miniplayerModernCloseButtonFingerprint to "hideMiniplayerExpandClose", + miniplayerModernActionButtonFingerprint to "hideMiniplayerActionButton", + miniplayerModernRewindButtonFingerprint to "hideMiniplayerRewindForward", + miniplayerModernForwardButtonFingerprint to "hideMiniplayerRewindForward", + miniplayerModernOverlayViewFingerprint to "adjustMiniplayerOpacity" + ).forEach { (fingerprint, methodName) -> fingerprint.match( - miniplayerModernViewParentFingerprint.originalClassDef + miniplayerModernViewParentFingerprint.classDef, ).method.apply { - val literalIndex = indexOfFirstLiteralInstructionOrThrow(literalValue) - val checkCastIndex = indexOfFirstInstruction(literalIndex) { - opcode == Opcode.CHECK_CAST && - getReference()?.type == "Landroid/widget/ImageView;" - } - val viewIndex = if (checkCastIndex >= 0) { - checkCastIndex - } else { - indexOfFirstInstructionOrThrow(literalIndex, Opcode.MOVE_RESULT_OBJECT) - } - val viewRegister = getInstruction(viewIndex).registerA + val index = fingerprint.instructionMatches.last().index + val register = getInstruction(index).registerA addInstruction( - viewIndex + 1, - "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V" + index + 1, + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V", ) } } @@ -552,10 +433,10 @@ val miniplayerPatch = bytecodePatch( ).toMutable().apply { addInstructions( """ - invoke-super { p0, p1, p2, p3 }, Landroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup${'$'}LayoutParams;)V - invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->playerOverlayGroupCreated(Landroid/view/View;)V - return-void - """ + invoke-super { p0, p1, p2, p3 }, Landroid/view/ViewGroup;->addView(Landroid/view/View;ILandroid/view/ViewGroup${'$'}LayoutParams;)V + invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->playerOverlayGroupCreated(Landroid/view/View;)V + return-void + """ ) } ) 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 0c31cc83bd..7ac0ce2a11 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 @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.layout.panels.popup import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val engagementPanelControllerFingerprint = fingerprint { +internal val engagementPanelControllerFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("L") strings( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt deleted file mode 100644 index 5c20556a85..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatch.kt +++ /dev/null @@ -1,12 +0,0 @@ -package app.revanced.patches.youtube.layout.player.background - -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patches.youtube.layout.buttons.overlay.hidePlayerOverlayButtonsPatch - -@Suppress("unused") -@Deprecated("Functionality added to hidePlayerOverlayButtonsPatch", ReplaceWith("hidePlayerOverlayButtonsPatch")) -val playerControlsBackgroundPatch = resourcePatch( - description = "Removes the dark background surrounding the video player control buttons.", -) { - dependsOn(hidePlayerOverlayButtonsPatch) -} 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 a8aef37341..f5783b80c9 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,21 +1,49 @@ package app.revanced.patches.youtube.layout.player.fullscreen import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.opcode import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode -internal const val OPEN_VIDEOS_FULLSCREEN_PORTRAIT_FEATURE_FLAG = 45666112L +/** + * 19.46+ + */ +internal val openVideosFullscreenPortraitFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters("L", "Lj\$/util/Optional;") + instructions( + opcode(Opcode.MOVE_RESULT), // Conditional check to modify. + // Open videos fullscreen portrait feature flag. + literal(45666112L, maxAfter = 5), // Cannot be more than 5. + opcode(Opcode.MOVE_RESULT, maxAfter = 10), + ) +} -internal val openVideosFullscreenPortraitFingerprint = fingerprint { +/** + * Pre 19.46. + */ +internal val openVideosFullscreenPortraitLegacyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "Lj\$/util/Optional;") - literal { - OPEN_VIDEOS_FULLSCREEN_PORTRAIT_FEATURE_FLAG - } + opcodes( + Opcode.GOTO, + Opcode.SGET_OBJECT, + Opcode.GOTO, + Opcode.SGET_OBJECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT, + Opcode.IF_EQ, + Opcode.IF_EQ, + Opcode.IGET_OBJECT, + Opcode.INVOKE_VIRTUAL, + Opcode.MOVE_RESULT // Conditional check to modify. + ) } -internal val openVideosFullscreenHookPatchExtensionFingerprint = fingerprint { +internal val openVideosFullscreenHookPatchExtensionFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt deleted file mode 100644 index 89311b08c0..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.layout.player.fullscreen - -import app.revanced.patcher.patch.bytecodePatch - -@Suppress("unused") -@Deprecated("Renamed to openVideosFullscreenPatch", ReplaceWith("openVideosFullscreenPatch")) -val openVideosFullscreen = bytecodePatch{ - dependsOn(openVideosFullscreenPatch) -} \ No newline at end of file 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 76086c0e48..79253d46b6 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,11 +1,15 @@ package app.revanced.patches.youtube.layout.player.fullscreen +import app.revanced.patcher.Fingerprint +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.youtube.layout.shortsplayer.openShortsInRegularPlayerPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.util.insertLiteralOverride +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/OpenVideosFullscreenHookPatch;" @@ -20,13 +24,40 @@ internal val openVideosFullscreenHookPatch = bytecodePatch { ) execute { - if (!is_19_46_or_greater) { - return@execute + var fingerprint: Fingerprint + var insertIndex: Int + + if (is_19_46_or_greater) { + fingerprint = openVideosFullscreenPortraitFingerprint + insertIndex = fingerprint.instructionMatches.first().index + + openVideosFullscreenPortraitFingerprint.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 + ) + } + } else { + fingerprint = openVideosFullscreenPortraitLegacyFingerprint + insertIndex = fingerprint.instructionMatches.last().index } - openVideosFullscreenPortraitFingerprint.method.insertLiteralOverride( - OPEN_VIDEOS_FULLSCREEN_PORTRAIT_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->openVideoFullscreenPortrait(Z)Z" - ) + fingerprint.let { + it.method.apply { + val register = getInstruction(insertIndex).registerA + + addInstructions( + insertIndex + 1, + """ + 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 1c76b56e40..7b5aa145fe 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 @@ -1,12 +1,9 @@ package app.revanced.patches.youtube.layout.player.fullscreen -import app.revanced.patcher.patch.PatchException 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.misc.playservice.is_19_46_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.util.returnEarly @@ -20,11 +17,12 @@ val openVideosFullscreenPatch = bytecodePatch( openVideosFullscreenHookPatch, settingsPatch, addResourcesPatch, - versionCheckPatch ) compatibleWith( "com.google.android.youtube"( + "19.34.42", + "19.43.41", "19.47.53", "20.07.39", "20.12.46", @@ -33,10 +31,6 @@ val openVideosFullscreenPatch = bytecodePatch( ) execute { - if (!is_19_46_or_greater) { - throw PatchException("'Open videos fullscreen' requires 19.46.42 or greater") - } - addResources("youtube", "layout.player.fullscreen.openVideosFullscreen") PreferenceScreen.PLAYER.addPreferences( 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 35f81a6438..b96b36ea4d 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 @@ -3,43 +3,15 @@ package app.revanced.patches.youtube.layout.player.overlay import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.InputType import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -internal var scrimOverlayId = -1L - private set - -private val customPlayerOverlayOpacityResourcePatch = resourcePatch { - dependsOn( - settingsPatch, - resourceMappingPatch, - addResourcesPatch, - ) - - execute { - addResources("youtube", "layout.player.overlay.customPlayerOverlayOpacityResourcePatch") - - PreferenceScreen.PLAYER.addPreferences( - TextPreference("revanced_player_overlay_opacity", inputType = InputType.NUMBER), - ) - - scrimOverlayId = resourceMappings[ - "id", - "scrim_overlay", - ] - } -} - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/CustomPlayerOverlayOpacityPatch;" @@ -48,7 +20,10 @@ val customPlayerOverlayOpacityPatch = bytecodePatch( name = "Custom player overlay opacity", description = "Adds an option to change the opacity of the video player background when player controls are visible.", ) { - dependsOn(customPlayerOverlayOpacityResourcePatch) + dependsOn(settingsPatch, + resourceMappingPatch, + addResourcesPatch, + ) compatibleWith( "com.google.android.youtube"( @@ -62,18 +37,23 @@ val customPlayerOverlayOpacityPatch = bytecodePatch( ) execute { - createPlayerOverviewFingerprint.method.apply { - val viewRegisterIndex = - indexOfFirstLiteralInstructionOrThrow(scrimOverlayId) + 3 - val viewRegister = - getInstruction(viewRegisterIndex).registerA + addResources("youtube", "layout.player.overlay.customPlayerOverlayOpacityResourcePatch") + + PreferenceScreen.PLAYER.addPreferences( + TextPreference("revanced_player_overlay_opacity", inputType = InputType.NUMBER), + ) - val insertIndex = viewRegisterIndex + 1 - addInstruction( - insertIndex, - "invoke-static { v$viewRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->changeOpacity(Landroid/widget/ImageView;)V", - ) + createPlayerOverviewFingerprint.let { + it.method.apply { + val viewRegisterIndex = it.instructionMatches.last().index + val viewRegister = getInstruction(viewRegisterIndex).registerA + + addInstruction( + viewRegisterIndex + 1, + "invoke-static { v$viewRegister }, " + + "$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 7269868402..c5f6909c49 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,18 +1,14 @@ package app.revanced.patches.youtube.layout.player.overlay +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint -import app.revanced.util.literal -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral -internal val createPlayerOverviewFingerprint = fingerprint { - accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) +internal val createPlayerOverviewFingerprint by fingerprint { returns("V") - opcodes( - Opcode.CONST, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.CHECK_CAST, + instructions( + resourceLiteral(ResourceType.ID, "scrim_overlay"), + checkCast("Landroid/widget/ImageView;", maxAfter = 10) ) - literal { scrimOverlayId } } 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 54fda75c85..e87999f686 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,26 +1,33 @@ package app.revanced.patches.youtube.layout.returnyoutubedislike import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val dislikeFingerprint = fingerprint { +internal val dislikeFingerprint by fingerprint { returns("V") - strings("like/dislike") + instructions( + string("like/dislike") + ) } -internal val likeFingerprint = fingerprint { +internal val likeFingerprint by fingerprint { returns("V") - strings("like/like") + instructions( + string("like/like") + ) } -internal val removeLikeFingerprint = fingerprint { +internal val removeLikeFingerprint by fingerprint { returns("V") - strings("like/removelike") + instructions( + string("like/removelike") + ) } -internal val rollingNumberMeasureAnimatedTextFingerprint = fingerprint { +internal val rollingNumberMeasureAnimatedTextFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Lj\$/util/Optional;") parameters("L", "Ljava/lang/String;", "L") @@ -41,7 +48,7 @@ internal val rollingNumberMeasureAnimatedTextFingerprint = fingerprint { /** * Matches to class found in [rollingNumberMeasureStaticLabelParentFingerprint]. */ -internal val rollingNumberMeasureStaticLabelFingerprint = fingerprint { +internal val rollingNumberMeasureStaticLabelFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("F") parameters("Ljava/lang/String;") @@ -53,14 +60,16 @@ internal val rollingNumberMeasureStaticLabelFingerprint = fingerprint { ) } -internal val rollingNumberMeasureStaticLabelParentFingerprint = fingerprint { +internal val rollingNumberMeasureStaticLabelParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() - strings("RollingNumberFontProperties{paint=") + instructions( + string("RollingNumberFontProperties{paint=") + ) } -internal val rollingNumberSetterFingerprint = fingerprint { +internal val rollingNumberSetterFingerprint by fingerprint { opcodes( Opcode.INVOKE_DIRECT, Opcode.IGET_OBJECT, @@ -69,7 +78,7 @@ internal val rollingNumberSetterFingerprint = fingerprint { strings("RollingNumberType required properties missing! Need") } -internal val rollingNumberTextViewFingerprint = fingerprint { +internal val rollingNumberTextViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "F", "F") @@ -87,15 +96,19 @@ internal val rollingNumberTextViewFingerprint = fingerprint { } } -internal val textComponentConstructorFingerprint = fingerprint { +internal val textComponentConstructorFingerprint by fingerprint { accessFlags(AccessFlags.CONSTRUCTOR, AccessFlags.PRIVATE) - strings("TextComponent") + instructions( + string("TextComponent") + ) } -internal val textComponentDataFingerprint = fingerprint { +internal val textComponentDataFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("L", "L") - strings("text") + instructions( + string("text") + ) custom { _, classDef -> classDef.fields.find { it.type == "Ljava/util/BitSet;" } != null } @@ -104,18 +117,20 @@ internal val textComponentDataFingerprint = fingerprint { /** * Matches against the same class found in [textComponentConstructorFingerprint]. */ -internal val textComponentLookupFingerprint = fingerprint { +internal val textComponentLookupFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("L") parameters("L") - strings("…") + instructions( + string("…") + ) } -internal const val LITHO_NEW_TEXT_COMPONENT_FEATURE_FLAG = 45675738L - -internal val textComponentFeatureFlagFingerprint = fingerprint { +internal val textComponentFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.FINAL) returns("Z") parameters() - literal { LITHO_NEW_TEXT_COMPONENT_FEATURE_FLAG } -} + instructions ( + literal(45675738L) + ) +} \ No newline at end of file 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 b65b8f6c4e..5d5a7360c3 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 @@ -104,7 +104,7 @@ val returnYouTubeDislikePatch = bytecodePatch( // region Hook like/dislike/remove like button clicks to send votes to the API. - mapOf( + arrayOf( likeFingerprint to Vote.LIKE, dislikeFingerprint to Vote.DISLIKE, removeLikeFingerprint to Vote.REMOVE_LIKE, @@ -122,10 +122,10 @@ val returnYouTubeDislikePatch = bytecodePatch( // region Hook code for creation and cached lookup of text Spans. - // Alternatively the hook can be made at tht it fails to update the Span when the user dislikes, - // // since the underlying (likes only) tee creation of Spans in TextComponentSpec, - // And it works in all situations excepxt did not change. + // Alternatively the hook can be made in the creation of Spans in TextComponentSpec. + // And it works in all situations except if the likes do not such as disliking. // This hook handles all situations, as it's where the created Spans are stored and later reused. + // Find the field name of the conversion context. val conversionContextField = textComponentConstructorFingerprint.originalClassDef.fields.find { it.type == conversionContextFingerprintToString.originalClassDef.type @@ -137,41 +137,35 @@ val returnYouTubeDislikePatch = bytecodePatch( val textDataClassType = textComponentDataFingerprint.originalClassDef.type val insertIndex: Int - val tempRegister: Int val charSequenceRegister: Int - if (is_19_33_or_greater && !is_20_10_or_greater) { - insertIndex = indexOfFirstInstructionOrThrow { + 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 } - tempRegister = getInstruction(insertIndex + 1).registerA - - // Find the instruction that sets the span to an instance field. - // The instruction is only a few lines after the creation of the instance. - charSequenceRegister = getInstruction( - indexOfFirstInstructionOrThrow(insertIndex) { - opcode == Opcode.INVOKE_VIRTUAL && + insertIndex = indexOfFirstInstructionOrThrow(index) { + opcode == Opcode.INVOKE_VIRTUAL && getReference()?.parameterTypes?.firstOrNull() == "Ljava/lang/CharSequence;" - }, - ).registerD + } + + charSequenceRegister = getInstruction(insertIndex).registerD } else { insertIndex = indexOfFirstInstructionOrThrow { opcode == Opcode.NEW_INSTANCE && getReference()?.type == textDataClassType } - tempRegister = getInstruction(insertIndex).registerA - - charSequenceRegister = getInstruction( - indexOfFirstInstructionOrThrow(insertIndex) { - opcode == Opcode.IPUT_OBJECT && + val charSequenceIndex = indexOfFirstInstructionOrThrow(insertIndex) { + opcode == Opcode.IPUT_OBJECT && getReference()?.type == "Ljava/lang/CharSequence;" - }, - ).registerA + } + charSequenceRegister = getInstruction(charSequenceIndex).registerA } + val tempRegister = findFreeRegister(insertIndex, charSequenceRegister) + addInstructionsAtControlFlowLabel( insertIndex, """ @@ -206,11 +200,9 @@ val returnYouTubeDislikePatch = bytecodePatch( // region Hook rolling numbers. - val dislikesIndex = rollingNumberSetterFingerprint.patternMatch!!.endIndex - rollingNumberSetterFingerprint.method.apply { val insertIndex = 1 - + val dislikesIndex = rollingNumberSetterFingerprint.instructionMatches.last().index val charSequenceInstanceRegister = getInstruction(0).registerA val charSequenceFieldReference = @@ -227,17 +219,16 @@ val returnYouTubeDislikePatch = bytecodePatch( 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 { - // 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. - val patternMatch = it.patternMatch!! - // Verify the opcodes are at the start of the method. - if (patternMatch.startIndex != 0) throw PatchException("Unexpected opcode location") - val endIndex = patternMatch.endIndex + // 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 it.method.apply { val measuredTextWidthRegister = getInstruction(endIndex).registerA @@ -257,7 +248,7 @@ val returnYouTubeDislikePatch = bytecodePatch( rollingNumberMeasureStaticLabelFingerprint.match( rollingNumberMeasureStaticLabelParentFingerprint.originalClassDef, ).let { - val measureTextIndex = it.patternMatch!!.startIndex + 1 + val measureTextIndex = it.instructionMatches.first().index + 1 it.method.apply { val freeRegister = getInstruction(0).registerA @@ -266,7 +257,7 @@ val returnYouTubeDislikePatch = bytecodePatch( """ move-result v$freeRegister invoke-static {p1, v$freeRegister}, $EXTENSION_CLASS_DESCRIPTOR->onRollingNumberMeasured(Ljava/lang/String;F)F - """, + """ ) } } @@ -285,10 +276,8 @@ val returnYouTubeDislikePatch = bytecodePatch( getReference()?.name == "setText" } - val textViewRegister = - getInstruction(setTextIndex).registerC - val textSpanRegister = - getInstruction(setTextIndex).registerD + val textViewRegister = getInstruction(setTextIndex).registerC + val textSpanRegister = getInstruction(setTextIndex).registerD addInstructions( setTextIndex, 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 2dbff83a23..a25403c4be 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,27 +1,29 @@ package app.revanced.patches.youtube.layout.searchbar import app.revanced.patcher.fingerprint +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import app.revanced.patches.youtube.layout.hide.general.yoodlesImageViewFingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags -internal val setWordmarkHeaderFingerprint = fingerprint { +internal val setWordmarkHeaderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/widget/ImageView;") - custom { methodDef, _ -> - methodDef.containsLiteralInstruction(ytPremiumWordmarkHeaderId) && - methodDef.containsLiteralInstruction(ytWordmarkHeaderId) - } + instructions( + resourceLiteral(ResourceType.ATTR, "ytPremiumWordmarkHeader"), + resourceLiteral(ResourceType.ATTR, "ytWordmarkHeader") + ) } /** * Matches the same method as [yoodlesImageViewFingerprint]. */ -internal val wideSearchbarLayoutFingerprint = fingerprint { +internal val wideSearchbarLayoutFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") parameters("L", "L") - literal { actionBarRingoId } + instructions( + resourceLiteral(ResourceType.LAYOUT, "action_bar_ringo"), + ) } 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 4f06635d15..61dc648e47 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 @@ -3,14 +3,13 @@ package app.revanced.patches.youtube.layout.searchbar import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_20_31_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.util.addInstructionsAtControlFlowLabel @@ -20,38 +19,11 @@ import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference +import java.util.logging.Logger private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/WideSearchbarPatch;" -internal var ytWordmarkHeaderId = -1L - private set -internal var ytPremiumWordmarkHeaderId = -1L - private set -internal var actionBarRingoId = -1L - private set - -private val wideSearchbarResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - ytWordmarkHeaderId = resourceMappings[ - "attr", - "ytWordmarkHeader", - ] - - ytPremiumWordmarkHeaderId = resourceMappings[ - "attr", - "ytPremiumWordmarkHeader", - ] - - actionBarRingoId = resourceMappings[ - "layout", - "action_bar_ringo", - ] - } -} - val wideSearchbarPatch = bytecodePatch( name = "Wide search bar", description = "Adds an option to replace the search icon with a wide search bar. " + @@ -61,7 +33,8 @@ val wideSearchbarPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, - wideSearchbarResourcePatch, + resourceMappingPatch, + versionCheckPatch ) compatibleWith( @@ -76,6 +49,15 @@ val wideSearchbarPatch = bytecodePatch( ) execute { + if (is_20_31_or_greater) { + // YT removed the legacy text search text field all code required to use it. + // This functionality could be restored by adding a search text field to the toolbar + // with a listener that artificially clicks the toolbar search button. + Logger.getLogger(this::class.java.name).severe( + "Wide searchbar is not compatible with 20.31+") + return@execute + } + addResources("youtube", "layout.searchbar.wideSearchbarPatch") PreferenceScreen.FEED.addPreferences( 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 25d2918096..9aeee8d0da 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 @@ -1,69 +1,75 @@ package app.revanced.patches.youtube.layout.seekbar +import app.revanced.patcher.anyInstruction import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patcher.string +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral 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 fullscreenSeekbarThumbnailsFingerprint = fingerprint { +internal val fullscreenSeekbarThumbnailsFingerprint by fingerprint { returns("Z") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() - literal { 45398577 } + instructions( + literal(45398577) + ) } -internal val playerSeekbarColorFingerprint = fingerprint { +internal val playerSeekbarColorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - custom { method, _ -> - method.containsLiteralInstruction(inlineTimeBarColorizedBarPlayedColorDarkId) && - method.containsLiteralInstruction(inlineTimeBarPlayedNotHighlightedColorId) - } + instructions( + resourceLiteral(ResourceType.COLOR, "inline_time_bar_played_not_highlighted_color"), + resourceLiteral(ResourceType.COLOR, "inline_time_bar_colorized_bar_played_color_dark") + ) } -internal val setSeekbarClickedColorFingerprint = fingerprint { +// class is ControlsOverlayStyle in 20.32 and lower, and obfuscated in 20.33+ +internal val setSeekbarClickedColorFingerprint by fingerprint { opcodes(Opcode.CONST_HIGH16) - strings("YOUTUBE", "PREROLL", "POSTROLL") - custom { _, classDef -> - classDef.endsWith("ControlsOverlayStyle;") - } + strings("YOUTUBE", "PREROLL", "POSTROLL", "REMOTE_LIVE", "AD_LARGE_CONTROLS") } -internal val shortsSeekbarColorFingerprint = fingerprint { +internal val shortsSeekbarColorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - literal { reelTimeBarPlayedColorId } + instructions( + resourceLiteral(ResourceType.COLOR, "reel_time_bar_played_color") + ) } -internal val playerSeekbarHandle1ColorFingerprint = fingerprint { +internal val playerSeekbarHandle1ColorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("Landroid/content/Context;") - custom { method, _ -> - method.containsLiteralInstruction(ytTextSecondaryId) && - method.containsLiteralInstruction(ytStaticBrandRedId) - } + instructions( + resourceLiteral(ResourceType.COLOR, "inline_time_bar_live_seekable_range"), + resourceLiteral(ResourceType.ATTR, "ytStaticBrandRed"), + ) } -internal val playerSeekbarHandle2ColorFingerprint = fingerprint { +internal val playerSeekbarHandle2ColorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Landroid/content/Context;") - custom { method, _ -> - method.containsLiteralInstruction(inlineTimeBarLiveSeekableRangeId) && - method.containsLiteralInstruction(ytStaticBrandRedId) - } + instructions( + resourceLiteral(ResourceType.ATTR, "ytTextSecondary"), + resourceLiteral(ResourceType.ATTR, "ytStaticBrandRed"), + ) } - -internal val watchHistoryMenuUseProgressDrawableFingerprint = fingerprint { +internal val watchHistoryMenuUseProgressDrawableFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") - literal { -1712394514 } + instructions( + methodCall("Landroid/widget/ProgressBar;", "setMax"), + opcode(Opcode.MOVE_RESULT), + literal(-1712394514) + ) } -internal val lithoLinearGradientFingerprint = fingerprint { +internal val lithoLinearGradientFingerprint by fingerprint { accessFlags(AccessFlags.STATIC) returns("Landroid/graphics/LinearGradient;") parameters("F", "F", "F", "F", "[I", "[F") @@ -72,76 +78,72 @@ internal val lithoLinearGradientFingerprint = fingerprint { /** * 19.49+ */ -internal val playerLinearGradientFingerprint = fingerprint { +internal val playerLinearGradientFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) parameters("I", "I", "I", "I", "Landroid/content/Context;", "I") returns("Landroid/graphics/LinearGradient;") - opcodes( - Opcode.FILLED_NEW_ARRAY, - Opcode.MOVE_RESULT_OBJECT + instructions( + resourceLiteral(ResourceType.COLOR, "yt_youtube_magenta"), + + opcode(Opcode.FILLED_NEW_ARRAY, maxAfter = 5), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) ) - literal { ytYoutubeMagentaColorId } } /** * 19.25 - 19.47 */ -internal val playerLinearGradientLegacyFingerprint = fingerprint { +internal val playerLinearGradientLegacyFingerprint by fingerprint { returns("V") - opcodes( - Opcode.FILLED_NEW_ARRAY, - Opcode.MOVE_RESULT_OBJECT + instructions( + resourceLiteral(ResourceType.COLOR, "yt_youtube_magenta"), + + opcode(Opcode.FILLED_NEW_ARRAY), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), ) - literal { ytYoutubeMagentaColorId } } -internal const val launchScreenLayoutTypeLotteFeatureFlag = 268507948L +internal const val launchScreenLayoutTypeLotteFeatureLegacyFlag = 268507948L +internal const val launchScreenLayoutTypeLotteFeatureFlag = 1073814316L -internal val launchScreenLayoutTypeFingerprint = fingerprint { +internal val launchScreenLayoutTypeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") + instructions( + anyInstruction( + literal(launchScreenLayoutTypeLotteFeatureLegacyFlag), + literal(launchScreenLayoutTypeLotteFeatureFlag) + ) + ) custom { method, _ -> val firstParameter = method.parameterTypes.firstOrNull() // 19.25 - 19.45 - (firstParameter == "Lcom/google/android/apps/youtube/app/watchwhile/MainActivity;" - || firstParameter == "Landroid/app/Activity;") // 19.46+ - && method.containsLiteralInstruction(launchScreenLayoutTypeLotteFeatureFlag) + firstParameter == "Lcom/google/android/apps/youtube/app/watchwhile/MainActivity;" + || firstParameter == "Landroid/app/Activity;" // 19.46+ } } internal const val LOTTIE_ANIMATION_VIEW_CLASS_TYPE = "Lcom/airbnb/lottie/LottieAnimationView;" -internal val lottieAnimationViewSetAnimationIntFingerprint = fingerprint { +internal val lottieAnimationViewSetAnimationIntFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("I") returns("V") - custom { methodDef, classDef -> - classDef.type == LOTTIE_ANIMATION_VIEW_CLASS_TYPE && methodDef.indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Lcom/airbnb/lottie/LottieAnimationView;" - && reference.name == "isInEditMode" - } >= 0 - } -} - -internal val lottieAnimationViewSetAnimationStreamFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("L") - returns("V") - custom { methodDef, classDef -> - classDef.type == LOTTIE_ANIMATION_VIEW_CLASS_TYPE && methodDef.indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Ljava/util/Set;" - && reference.name == "add" - } >= 0 && methodDef.containsLiteralInstruction(0) + instructions( + methodCall("this", "isInEditMode") + ) + custom { _, classDef -> + classDef.type == LOTTIE_ANIMATION_VIEW_CLASS_TYPE } } -internal val lottieCompositionFactoryZipFingerprint = fingerprint { +internal val lottieCompositionFactoryZipFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - parameters("Landroid/content/Context;", "Ljava/lang/String;", "Ljava/lang/String;") + parameters("Landroid/content/Context;", "Ljava/util/zip/ZipInputStream;", "Ljava/lang/String;") returns("L") - strings(".zip", ".lottie") + instructions( + string("Unable to parse composition"), + string(" however it was not found in the animation.") + ) } /** @@ -149,11 +151,12 @@ internal val lottieCompositionFactoryZipFingerprint = fingerprint { * * [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 lottieCompositionFactoryFromJsonInputStreamFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) parameters("Ljava/io/InputStream;", "Ljava/lang/String;") returns("L") - literal { 2 } + instructions( + anyInstruction(literal(2), literal(3)) + ) } - 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 76fe99b31b..b00df5a5b1 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 @@ -5,14 +5,13 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.layout.theme.lithoColorHookPatch import app.revanced.patches.youtube.layout.theme.lithoColorOverrideHook import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch @@ -20,8 +19,9 @@ import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_30_or_greater +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.settingsPatch import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint import app.revanced.util.copyXmlNode import app.revanced.util.findElementByAttributeValueOrThrow @@ -43,56 +43,15 @@ import org.w3c.dom.Element import java.io.ByteArrayInputStream import kotlin.use -internal var reelTimeBarPlayedColorId = -1L - private set -internal var inlineTimeBarColorizedBarPlayedColorDarkId = -1L - private set -internal var inlineTimeBarPlayedNotHighlightedColorId = -1L - private set -internal var ytYoutubeMagentaColorId = -1L - private set -internal var ytStaticBrandRedId = -1L - private set -internal var ytTextSecondaryId = -1L - private set -internal var inlineTimeBarLiveSeekableRangeId = -1L - private set - -internal const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color" +private const val splashSeekbarColorAttributeName = "splash_custom_seekbar_color" private val seekbarColorResourcePatch = resourcePatch { dependsOn( - settingsPatch, resourceMappingPatch, versionCheckPatch, ) execute { - reelTimeBarPlayedColorId = resourceMappings[ - "color", - "reel_time_bar_played_color", - ] - inlineTimeBarColorizedBarPlayedColorDarkId = resourceMappings[ - "color", - "inline_time_bar_colorized_bar_played_color_dark", - ] - inlineTimeBarPlayedNotHighlightedColorId = resourceMappings[ - "color", - "inline_time_bar_played_not_highlighted_color", - ] - ytStaticBrandRedId = resourceMappings[ - "attr", - "ytStaticBrandRed" - ] - ytTextSecondaryId = resourceMappings[ - "attr", - "ytTextSecondary" - ] - inlineTimeBarLiveSeekableRangeId = resourceMappings[ - "color", - "inline_time_bar_live_seekable_range" - ] - // Modify the resume playback drawable and replace the progress bar with a custom drawable. document("res/drawable/resume_playback_progressbar_drawable.xml").use { document -> val layerList = document.getElementsByTagName("layer-list").item(0) as Element @@ -113,15 +72,6 @@ private val seekbarColorResourcePatch = resourcePatch { return@execute } - ytYoutubeMagentaColorId = resourceMappings[ - "color", - "yt_youtube_magenta", - ] - ytStaticBrandRedId = resourceMappings[ - "attr", - "ytStaticBrandRed", - ] - // Add attribute and styles for splash screen custom color. // Using a style is the only way to selectively change just the seekbar fill color. // @@ -223,28 +173,31 @@ val seekbarColorPatch = bytecodePatch( sharedExtensionPatch, lithoColorHookPatch, seekbarColorResourcePatch, + resourceMappingPatch, versionCheckPatch ) execute { - fun MutableMethod.addColorChangeInstructions(resourceId: Long) { + fun MutableMethod.addColorChangeInstructions(index: Int) { insertLiteralOverride( - resourceId, + index, "$EXTENSION_CLASS_DESCRIPTOR->getVideoPlayerSeekbarColor(I)I" ) } - playerSeekbarColorFingerprint.method.apply { - addColorChangeInstructions(inlineTimeBarColorizedBarPlayedColorDarkId) - addColorChangeInstructions(inlineTimeBarPlayedNotHighlightedColorId) + playerSeekbarColorFingerprint.let { + it.method.apply { + addColorChangeInstructions(it.instructionMatches.last().index) + addColorChangeInstructions(it.instructionMatches.first().index) + } } - shortsSeekbarColorFingerprint.method.apply { - addColorChangeInstructions(reelTimeBarPlayedColorId) + shortsSeekbarColorFingerprint.let { + it.method.addColorChangeInstructions(it.instructionMatches.first().index) } setSeekbarClickedColorFingerprint.originalMethod.let { - val setColorMethodIndex = setSeekbarClickedColorFingerprint.patternMatch!!.startIndex + 1 + val setColorMethodIndex = setSeekbarClickedColorFingerprint.instructionMatches.first().index + 1 navigate(it).to(setColorMethodIndex).stop().apply { val colorRegister = getInstruction(0).registerA @@ -253,7 +206,7 @@ val seekbarColorPatch = bytecodePatch( """ invoke-static { v$colorRegister }, $EXTENSION_CLASS_DESCRIPTOR->getVideoPlayerSeekbarClickedColor(I)I move-result v$colorRegister - """, + """ ) } } @@ -266,32 +219,31 @@ val seekbarColorPatch = bytecodePatch( // 19.25+ changes - arrayOf( - playerSeekbarHandle1ColorFingerprint, - playerSeekbarHandle2ColorFingerprint - ).forEach { - it.method.addColorChangeInstructions(ytStaticBrandRedId) + var handleBarColorFingerprints = mutableListOf(playerSeekbarHandle1ColorFingerprint) + if (!is_20_34_or_greater) { + handleBarColorFingerprints += playerSeekbarHandle2ColorFingerprint + } + handleBarColorFingerprints.forEach { + it.method.addColorChangeInstructions(it.instructionMatches.last().index) } // If hiding feed seekbar thumbnails, then turn off the cairo gradient // 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.method.apply { - val progressIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Landroid/widget/ProgressBar;" && reference.name == "setMax" - } - val index = indexOfFirstInstructionOrThrow(progressIndex, Opcode.MOVE_RESULT) - val register = getInstruction(index).registerA + watchHistoryMenuUseProgressDrawableFingerprint.let { + it.method.apply { + val index = it.instructionMatches[1].index + val register = getInstruction(index).registerA - addInstructions( - index + 1, - """ - invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->showWatchHistoryProgressDrawable(Z)Z - move-result v$register - """ - ) + addInstructions( + index + 1, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->showWatchHistoryProgressDrawable(Z)Z + move-result v$register + """ + ) + } } } @@ -315,7 +267,7 @@ val seekbarColorPatch = bytecodePatch( playerFingerprint.let { it.method.apply { - val index = it.patternMatch!!.endIndex + val index = it.instructionMatches.last().index val register = getInstruction(index).registerA addInstructions( @@ -347,7 +299,11 @@ val seekbarColorPatch = bytecodePatch( mainActivityOnCreateFingerprint ).forEach { fingerprint -> fingerprint.method.insertLiteralOverride( - launchScreenLayoutTypeLotteFeatureFlag, + if (is_20_30_or_greater) { + launchScreenLayoutTypeLotteFeatureFlag + } else { + launchScreenLayoutTypeLotteFeatureLegacyFlag + }, "$EXTENSION_CLASS_DESCRIPTOR->useLotteLaunchSplashScreen(Z)Z" ) } @@ -369,11 +325,12 @@ val seekbarColorPatch = bytecodePatch( ) // Replace the Lottie animation view setAnimation(int) call. - val setAnimationIntMethodName = lottieAnimationViewSetAnimationIntFingerprint.originalMethod.name + val setAnimationIntMethodName = + lottieAnimationViewSetAnimationIntFingerprint.originalMethod.name findInstructionIndicesReversedOrThrow { val reference = getReference() - reference?.definingClass == "Lcom/airbnb/lottie/LottieAnimationView;" + reference?.definingClass == LOTTIE_ANIMATION_VIEW_CLASS_TYPE && reference.name == setAnimationIntMethodName }.forEach { index -> val instruction = getInstruction(index) @@ -381,18 +338,18 @@ val seekbarColorPatch = bytecodePatch( replaceInstruction( index, "invoke-static { v${instruction.registerC}, v${instruction.registerD} }, " + - "$EXTENSION_CLASS_DESCRIPTOR->setSplashAnimationLottie" + - "(Lcom/airbnb/lottie/LottieAnimationView;I)V" + "$EXTENSION_CLASS_DESCRIPTOR->setSplashAnimationLottie" + + "(Lcom/airbnb/lottie/LottieAnimationView;I)V" ) } } - // Add non obfuscated method aliases for `setAnimation(int)` // and `setAnimation(InputStream, String)` so extension code can call them. lottieAnimationViewSetAnimationIntFingerprint.classDef.methods.apply { val addedMethodName = "patch_setAnimation" - val setAnimationIntName = lottieAnimationViewSetAnimationIntFingerprint.originalMethod.name + val setAnimationIntName = lottieAnimationViewSetAnimationIntFingerprint + .originalMethod.name add(ImmutableMethod( LOTTIE_ANIMATION_VIEW_CLASS_TYPE, @@ -412,9 +369,9 @@ val seekbarColorPatch = bytecodePatch( ) }) - val factoryStreamClass : CharSequence - val factoryStreamName : CharSequence - val factoryStreamReturnType : CharSequence + val factoryStreamClass: CharSequence + val factoryStreamName: CharSequence + val factoryStreamReturnType: CharSequence lottieCompositionFactoryFromJsonInputStreamFingerprint.match( lottieCompositionFactoryZipFingerprint.originalClassDef ).originalMethod.apply { @@ -423,6 +380,14 @@ val seekbarColorPatch = bytecodePatch( factoryStreamReturnType = returnType } + val lottieAnimationViewSetAnimationStreamFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameters(factoryStreamReturnType.toString()) + returns("V") + custom { _, classDef -> + classDef.type == lottieAnimationViewSetAnimationIntFingerprint.originalClassDef.type + } + } val setAnimationStreamName = lottieAnimationViewSetAnimationStreamFingerprint .originalMethod.name 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 045d75ca28..c75606b95a 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,51 +1,50 @@ package app.revanced.patches.youtube.layout.shortsautoplay +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.reference.FieldReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val reelEnumConstructorFingerprint = fingerprint { +internal val reelEnumConstructorFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - opcodes(Opcode.RETURN_VOID) - strings( - "REEL_LOOP_BEHAVIOR_UNKNOWN", - "REEL_LOOP_BEHAVIOR_SINGLE_PLAY", - "REEL_LOOP_BEHAVIOR_REPEAT", - "REEL_LOOP_BEHAVIOR_END_SCREEN", + instructions( + string("REEL_LOOP_BEHAVIOR_UNKNOWN"), + string("REEL_LOOP_BEHAVIOR_SINGLE_PLAY"), + string("REEL_LOOP_BEHAVIOR_REPEAT"), + string("REEL_LOOP_BEHAVIOR_END_SCREEN"), + opcode(Opcode.RETURN_VOID) ) } -internal val reelPlaybackRepeatFingerprint = fingerprint { +internal val reelPlaybackRepeatParentFingerprint by fingerprint { returns("V") - parameters("L") - strings("YoutubePlayerState is in throwing an Error.") + parameters("Ljava/lang/String;", "J") + instructions( + string("Reels[%s] Playback Time: %d ms") + ) } -internal val reelPlaybackFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) +/** + * Matches class found in [reelPlaybackRepeatParentFingerprint]. + */ +internal val reelPlaybackRepeatFingerprint by fingerprint { returns("V") - parameters("J") - custom { method, _ -> - indexOfMilliSecondsInstruction(method) >= 0 && - indexOfInitializationInstruction(method) >= 0 - } + parameters("L") + instructions( + methodCall(smali = "Lcom/google/common/util/concurrent/ListenableFuture;->isDone()Z") + ) } -private fun indexOfMilliSecondsInstruction(method: Method) = - method.indexOfFirstInstruction { - getReference()?.name == "MILLISECONDS" - } - -internal fun indexOfInitializationInstruction(method: Method) = - method.indexOfFirstInstruction { - val reference = getReference() - opcode == Opcode.INVOKE_DIRECT && - reference?.name == "" && - reference.parameterTypes.size == 3 && - reference.parameterTypes.firstOrNull() == "I" - } +internal val reelPlaybackFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + parameters("J") + returns("V") + instructions( + fieldAccess(definingClass = "Ljava/util/concurrent/TimeUnit;", name = "MILLISECONDS"), + methodCall(name = "", parameters = listOf("I", "L", "L"), maxAfter = 15), + methodCall(opcode = Opcode.INVOKE_VIRTUAL, parameters = listOf("L"), returnType = "I", maxAfter = 5) + ) +} \ No newline at end of file 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 470bdc0b5a..530c0ba065 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 @@ -72,23 +72,25 @@ val shortsAutoplayPatch = bytecodePatch( "invoke-static/range { p0 .. p0 }, $EXTENSION_CLASS_DESCRIPTOR->setMainActivity(Landroid/app/Activity;)V", ) - val reelEnumClass = reelEnumConstructorFingerprint.originalClassDef.type + var reelEnumClass : String - reelEnumConstructorFingerprint.method.apply { - val insertIndex = reelEnumConstructorFingerprint.patternMatch!!.startIndex + reelEnumConstructorFingerprint.let { + reelEnumClass = it.originalClassDef.type - addInstructions( - insertIndex, + it.method.addInstructions( + it.instructionMatches.last().index, """ # Pass the first enum value to extension. # 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.method.apply { + + reelPlaybackRepeatFingerprint.match( + reelPlaybackRepeatParentFingerprint.originalClassDef + ).method.apply { // The behavior enums are looked up from an ordinal value to an enum type. findInstructionIndicesReversedOrThrow { val reference = getReference() @@ -103,7 +105,7 @@ val shortsAutoplayPatch = bytecodePatch( """ invoke-static {v$register}, $EXTENSION_CLASS_DESCRIPTOR->changeShortsRepeatBehavior(Ljava/lang/Enum;)Ljava/lang/Enum; move-result-object v$register - """, + """ ) } } @@ -112,13 +114,10 @@ val shortsAutoplayPatch = bytecodePatch( // 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 userActionMethodIndex = indexOfInitializationInstruction(reelPlaybackFingerprint.method) - val userActionMethodReference = reelPlaybackFingerprint.method - .getInstruction(userActionMethodIndex).reference as MethodReference - val reelSequenceControllerMethodIndex = reelPlaybackFingerprint.method - .indexOfFirstInstructionOrThrow(userActionMethodIndex, Opcode.INVOKE_VIRTUAL) - val reelSequenceControllerMethodReference = reelPlaybackFingerprint.method - .getInstruction(reelSequenceControllerMethodIndex).reference as MethodReference + val userActionMethodReference = reelPlaybackFingerprint.instructionMatches[1] + .getInstruction().reference as MethodReference + val reelSequenceControllerMethodReference = reelPlaybackFingerprint.instructionMatches[2] + .getInstruction().reference as MethodReference reelPlaybackRepeatFingerprint.method.apply { // Find the first call modified by extension code above. @@ -127,7 +126,7 @@ val shortsAutoplayPatch = bytecodePatch( getReference()?.definingClass == EXTENSION_CLASS_DESCRIPTOR } + 1 val enumRegister = getInstruction(extensionReturnResultIndex).registerA - val getReelSequenceControllerIndex = indexOfFirstInstructionOrThrow(extensionReturnResultIndex) { + val getReelSequenceControllerIndex = indexOfFirstInstructionOrThrow { val reference = getReference() opcode == Opcode.IGET_OBJECT && reference?.definingClass == definingClass && diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt index abd7f10ceb..32228fa623 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt @@ -1,25 +1,33 @@ package app.revanced.patches.youtube.layout.shortsplayer import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.string +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags /** * Purpose of this method is not clear, and it's only used to identify * the obfuscated name of the videoId() method in PlaybackStartDescriptor. */ -internal val playbackStartFeatureFlagFingerprint = fingerprint { +internal val playbackStartFeatureFlagFingerprint by fingerprint { returns("Z") parameters( "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;", ) - literal { - 45380134L - } + instructions( + methodCall( + definingClass = "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;", + returnType = "Ljava/lang/String;" + ), + literal(45380134L) + ) } // Pre 19.25 -internal val shortsPlaybackIntentLegacyFingerprint = fingerprint { +internal val shortsPlaybackIntentLegacyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters( @@ -30,15 +38,16 @@ internal val shortsPlaybackIntentLegacyFingerprint = fingerprint { "Z", "Ljava/util/Map;" ) - strings( + instructions( + methodCall(returnType = "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;"), // None of these strings are unique. - "com.google.android.apps.youtube.app.endpoint.flags", - "ReelWatchFragmentArgs", - "reels_fragment_descriptor" + string("com.google.android.apps.youtube.app.endpoint.flags"), + string("ReelWatchFragmentArgs"), + string("reels_fragment_descriptor") ) } -internal val shortsPlaybackIntentFingerprint = fingerprint { +internal val shortsPlaybackIntentFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters( @@ -47,18 +56,18 @@ internal val shortsPlaybackIntentFingerprint = fingerprint { "J", "Ljava/lang/String;" ) - strings( + instructions( // None of these strings are unique. - "com.google.android.apps.youtube.app.endpoint.flags", - "ReelWatchFragmentArgs", - "reels_fragment_descriptor" + string("com.google.android.apps.youtube.app.endpoint.flags"), + string("ReelWatchFragmentArgs"), + string("reels_fragment_descriptor") ) } -internal val exitVideoPlayerFingerprint = fingerprint { +internal val exitVideoPlayerFingerprint by fingerprint { returns("V") parameters() - literal { - mdx_drawer_layout_id - } + instructions( + resourceLiteral(ResourceType.ID, "mdx_drawer_layout") + ) } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt index 56abd43df4..69169a0ff5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt @@ -5,18 +5,14 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.youtube.layout.player.fullscreen.openVideosFullscreenHookPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater -import app.revanced.patches.youtube.misc.playservice.is_19_46_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 @@ -32,21 +28,6 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/OpenShortsInRegularPlayerPatch;" -internal var mdx_drawer_layout_id = -1L - private set - -private val openShortsInRegularPlayerResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - mdx_drawer_layout_id = resourceMappings[ - "id", - "mdx_drawer_layout", - ] - - } -} - @Suppress("unused") val openShortsInRegularPlayerPatch = bytecodePatch( name = "Open Shorts in regular player", @@ -59,7 +40,7 @@ val openShortsInRegularPlayerPatch = bytecodePatch( openVideosFullscreenHookPatch, navigationBarHookPatch, versionCheckPatch, - openShortsInRegularPlayerResourcePatch + resourceMappingPatch ) compatibleWith( @@ -77,15 +58,7 @@ val openShortsInRegularPlayerPatch = bytecodePatch( addResources("youtube", "layout.shortsplayer.shortsPlayerTypePatch") PreferenceScreen.SHORTS.addPreferences( - if (is_19_46_or_greater) { - ListPreference("revanced_shorts_player_type") - } else { - ListPreference( - key = "revanced_shorts_player_type", - entriesKey = "revanced_shorts_player_type_legacy_entries", - entryValuesKey = "revanced_shorts_player_type_legacy_entry_values" - ) - } + ListPreference("revanced_shorts_player_type") ) // Activity is used as the context to launch an Intent. @@ -96,14 +69,11 @@ val openShortsInRegularPlayerPatch = bytecodePatch( ) // Find the obfuscated method name for PlaybackStartDescriptor.videoId() - val playbackStartVideoIdMethodName = playbackStartFeatureFlagFingerprint.method.let { - val stringMethodIndex = it.indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" - && reference.returnType == "Ljava/lang/String;" + val playbackStartVideoIdMethodName = playbackStartFeatureFlagFingerprint.let { + val stringMethodIndex = it.instructionMatches.first().index + it.method.let { + navigate(it).to(stringMethodIndex).stop().name } - - navigate(it).to(stringMethodIndex).stop().name } fun extensionInstructions(playbackStartRegister: Int, freeRegister: Int) = @@ -119,33 +89,30 @@ val openShortsInRegularPlayerPatch = bytecodePatch( nop """ - if (!is_19_25_or_greater) { - shortsPlaybackIntentLegacyFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow { - getReference()?.returnType == - "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" + if (is_19_25_or_greater) { + shortsPlaybackIntentFingerprint.method.addInstructionsWithLabels( + 0, + """ + move-object/from16 v0, p1 + ${extensionInstructions(0, 1)} + """ + ) + } else { + shortsPlaybackIntentLegacyFingerprint.let { + it.method.apply { + val index = it.instructionMatches.first().index + val playbackStartRegister = getInstruction(index + 1).registerA + val insertIndex = index + 2 + val freeRegister = findFreeRegister(insertIndex, playbackStartRegister) + + addInstructionsWithLabels( + insertIndex, + extensionInstructions(playbackStartRegister, freeRegister) + ) } - val playbackStartRegister = getInstruction(index + 1).registerA - val insertIndex = index + 2 - val freeRegister = findFreeRegister(insertIndex, playbackStartRegister) - - addInstructionsWithLabels( - insertIndex, - extensionInstructions(playbackStartRegister, freeRegister) - ) } - - return@execute } - shortsPlaybackIntentFingerprint.method.addInstructionsWithLabels( - 0, - """ - move-object/from16 v0, p1 - ${extensionInstructions(0, 1)} - """ - ) - // Fix issue with back button exiting the app instead of minimizing the player. // Without this change this issue can be difficult to reproduce, but seems to occur // most often with 'open video in regular player' and not open in fullscreen player. diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt index dbbd0c0006..d31d1cf9ad 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt @@ -1,66 +1,52 @@ package app.revanced.patches.youtube.layout.sponsorblock +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral +import app.revanced.patches.youtube.shared.seekbarFingerprint import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionReversed import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.Method -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val appendTimeFingerprint = fingerprint { - returns("V") +internal val appendTimeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") parameters("Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;") - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IGET_OBJECT, - Opcode.IGET_OBJECT, - Opcode.CHECK_CAST, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT, + instructions( + resourceLiteral(ResourceType.STRING, "total_time"), + + methodCall(smali = "Landroid/content/res/Resources;->getString(I[Ljava/lang/Object;)Ljava/lang/String;"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) ) } -internal val controlsOverlayFingerprint = fingerprint { +internal val controlsOverlayFingerprint by fingerprint { returns("V") - accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) parameters() - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.CHECK_CAST, // R.id.inset_overlay_view_layout - Opcode.IPUT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.CONST, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.CHECK_CAST, - Opcode.NEW_INSTANCE, + instructions( + resourceLiteral(ResourceType.ID, "inset_overlay_view_layout"), + checkCast("Landroid/widget/FrameLayout;", maxAfter = 20) ) } -internal val rectangleFieldInvalidatorFingerprint = fingerprint { +/** + * Resolves to the class found in [seekbarFingerprint]. + */ +internal val rectangleFieldInvalidatorFingerprint by fingerprint { returns("V") - custom { method, _ -> - val instructions = method.implementation?.instructions!! - val instructionCount = instructions.count() - - // the method has definitely more than 5 instructions - if (instructionCount < 5) return@custom false - - val referenceInstruction = instructions.elementAt(instructionCount - 2) // the second to last instruction - val reference = ((referenceInstruction as? ReferenceInstruction)?.reference as? MethodReference) - - reference?.parameterTypes?.size == 1 && reference.name == "invalidate" // the reference is the invalidate(..) method - } + parameters() + instructions( + methodCall(name = "invalidate") + ) } -internal val adProgressTextViewVisibilityFingerprint = fingerprint { +internal val adProgressTextViewVisibilityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Z") @@ -76,3 +62,4 @@ internal fun indexOfAdProgressTextViewVisibilityInstruction(method: Method) = "Lcom/google/android/libraries/youtube/ads/player/ui/AdProgressTextView;" && reference.name =="setVisibility" } + diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index 80cbfe0416..22068bf1aa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -20,18 +20,24 @@ import app.revanced.patches.youtube.misc.playercontrols.* import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.* +import app.revanced.patches.youtube.shared.layoutConstructorFingerprint +import app.revanced.patches.youtube.shared.seekbarFingerprint +import app.revanced.patches.youtube.shared.seekbarOnDrawFingerprint import app.revanced.patches.youtube.video.information.onCreateHook import app.revanced.patches.youtube.video.information.videoInformationPatch import app.revanced.patches.youtube.video.information.videoTimeHook import app.revanced.patches.youtube.video.videoid.hookBackgroundPlayVideoId import app.revanced.patches.youtube.video.videoid.videoIdPatch -import app.revanced.util.* -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.* +import app.revanced.util.ResourceGroup +import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.copyResources +import app.revanced.util.getReference +import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction +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.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.iface.reference.StringReference private val sponsorBlockResourcePatch = resourcePatch { dependsOn( @@ -80,7 +86,6 @@ private val sponsorBlockResourcePatch = resourcePatch { "revanced_sb_skip_sponsor_button.xml", ), ResourceGroup( - // required resource for back button, because when the base APK is used, this resource will not exist "drawable", "revanced_sb_adjust.xml", "revanced_sb_backward.xml", @@ -99,7 +104,7 @@ private val sponsorBlockResourcePatch = resourcePatch { } } -private const val EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR = +internal const val EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/sponsorblock/SegmentPlaybackController;" private const val EXTENSION_CREATE_SEGMENT_BUTTON_CONTROLLER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton;" @@ -115,6 +120,7 @@ val sponsorBlockPatch = bytecodePatch( ) { dependsOn( sharedExtensionPatch, + resourceMappingPatch, videoIdPatch, // Required to skip segments on time. videoInformationPatch, @@ -147,42 +153,63 @@ val sponsorBlockPatch = bytecodePatch( "->setCurrentVideoId(Ljava/lang/String;)V", ) - // Seekbar drawing - seekbarOnDrawFingerprint.match(seekbarFingerprint.originalClassDef).method.apply { - // Get left and right of seekbar rectangle. - val moveRectangleToRegisterIndex = indexOfFirstInstructionOrThrow(Opcode.MOVE_OBJECT_FROM16) + // Set seekbar draw rectangle. + val rectangleFieldName: FieldReference + rectangleFieldInvalidatorFingerprint.match( + seekbarFingerprint.originalClassDef + ).let { + it.method.apply { + val rectangleIndex = indexOfFirstInstructionReversedOrThrow( + it.instructionMatches.first().index + ) { + getReference()?.type == "Landroid/graphics/Rect;" + } + rectangleFieldName = getInstruction(rectangleIndex).reference as FieldReference + } + } - addInstruction( - moveRectangleToRegisterIndex + 1, - "invoke-static/range { p0 .. p0 }, " + - "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarRect(Ljava/lang/Object;)V", - ) + // Seekbar drawing. - // Set the thickness of the segment. - val thicknessIndex = indexOfFirstInstructionOrThrow { - opcode == Opcode.INVOKE_STATIC && getReference()?.name == "round" - } - val thicknessRegister = getInstruction(thicknessIndex).registerC - addInstruction( - thicknessIndex + 2, - "invoke-static { v$thicknessRegister }, " + - "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarThickness(I)V", - ) + // Shared fingerprint and indexes may have changed. + seekbarOnDrawFingerprint.clearMatch() + // Cannot match using original immutable class because + // class may have been modified by other patches + seekbarOnDrawFingerprint.match(seekbarFingerprint.classDef).let { + it.method.apply { + // Set seekbar thickness. + val thicknessIndex = it.instructionMatches.last().index + val thicknessRegister = getInstruction(thicknessIndex).registerA + addInstruction( + thicknessIndex + 1, + "invoke-static { v$thicknessRegister }, " + + "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSeekbarThickness(I)V", + ) - // Find the drawCircle call and draw the segment before it. - val drawCircleIndex = indexOfFirstInstructionReversedOrThrow { - getReference()?.name == "drawCircle" - } - val drawCircleInstruction = getInstruction(drawCircleIndex) - val canvasInstanceRegister = drawCircleInstruction.registerC - val centerYRegister = drawCircleInstruction.registerE + // Find the drawCircle call and draw the segment before it. + val drawCircleIndex = indexOfFirstInstructionReversedOrThrow { + getReference()?.name == "drawCircle" + } + val drawCircleInstruction = getInstruction(drawCircleIndex) + val canvasInstanceRegister = drawCircleInstruction.registerC + val centerYRegister = drawCircleInstruction.registerE - addInstruction( - drawCircleIndex, - "invoke-static { v$canvasInstanceRegister, v$centerYRegister }, " + - "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->" + - "drawSponsorTimeBars(Landroid/graphics/Canvas;F)V", - ) + addInstruction( + drawCircleIndex, + "invoke-static { v$canvasInstanceRegister, v$centerYRegister }, " + + "$EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->" + + "drawSegmentTimeBars(Landroid/graphics/Canvas;F)V", + ) + + // Set seekbar bounds. + addInstructions( + 0, + """ + move-object/from16 v0, p0 + iget-object v0, v0, $rectangleFieldName + invoke-static { v0 }, $EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSeekbarRectangle(Landroid/graphics/Rect;)V + """ + ) + } } // Change visibility of the buttons. @@ -193,17 +220,19 @@ val sponsorBlockPatch = bytecodePatch( injectVisibilityCheckCall(EXTENSION_VOTING_BUTTON_CONTROLLER_CLASS_DESCRIPTOR) // Append the new time to the player layout. - val appendTimePatternScanStartIndex = appendTimeFingerprint.patternMatch!!.startIndex - appendTimeFingerprint.method.apply { - val register = getInstruction(appendTimePatternScanStartIndex + 1).registerA + appendTimeFingerprint.let { + it.method.apply { + val index = it.instructionMatches.last().index + val register = getInstruction(index).registerA - addInstructions( - appendTimePatternScanStartIndex + 2, - """ - invoke-static { v$register }, $EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->appendTimeWithoutSegments(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$register - """ - ) + addInstructions( + index + 1, + """ + invoke-static { v$register }, $EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->appendTimeWithoutSegments(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$register + """ + ) + } } // Initialize the player controller. @@ -211,48 +240,16 @@ val sponsorBlockPatch = bytecodePatch( // Initialize the SponsorBlock view. controlsOverlayFingerprint.match(layoutConstructorFingerprint.originalClassDef).let { - val startIndex = it.patternMatch!!.startIndex + val checkCastIndex = it.instructionMatches.last().index it.method.apply { - val frameLayoutRegister = (getInstruction(startIndex + 2) as OneRegisterInstruction).registerA + val frameLayoutRegister = getInstruction(checkCastIndex).registerA addInstruction( - startIndex + 3, + checkCastIndex + 1, "invoke-static {v$frameLayoutRegister}, $EXTENSION_SPONSORBLOCK_VIEW_CONTROLLER_CLASS_DESCRIPTOR->initialize(Landroid/view/ViewGroup;)V", ) } } - // Set seekbar draw rectangle. - rectangleFieldInvalidatorFingerprint.match(seekbarOnDrawFingerprint.originalClassDef).method.apply { - val fieldIndex = instructions.count() - 3 - val fieldReference = getInstruction(fieldIndex).reference as FieldReference - - // replace the "replaceMeWith*" strings - proxy(classes.first { it.type.endsWith("SegmentPlaybackController;") }) - .mutableClass - .methods - .find { it.name == "setSponsorBarRect" } - ?.let { method -> - fun MutableMethod.replaceStringInstruction(index: Int, instruction: Instruction, with: String) { - val register = (instruction as OneRegisterInstruction).registerA - this.replaceInstruction( - index, - "const-string v$register, \"$with\"", - ) - } - for ((index, it) in method.instructions.withIndex()) { - if (it.opcode.ordinal != Opcode.CONST_STRING.ordinal) continue - - when (((it as ReferenceInstruction).reference as StringReference).string) { - "replaceMeWithsetSponsorBarRect" -> method.replaceStringInstruction( - index, - it, - fieldReference.name, - ) - } - } - } ?: throw PatchException("Could not find the method which contains the replaceMeWith* strings") - } - adProgressTextViewVisibilityFingerprint.method.apply { val index = indexOfAdProgressTextViewVisibilityInstruction(this) val register = getInstruction(index).registerD @@ -262,6 +259,5 @@ val sponsorBlockPatch = bytecodePatch( "invoke-static { v$register }, $EXTENSION_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setAdProgressTextVisibility(I)V" ) } - } } 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 ac458cec26..33c20c22f1 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,31 +1,29 @@ package app.revanced.patches.youtube.layout.spoofappversion +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags 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 toolBarButtonFingerprint = fingerprint { +internal val toolBarButtonFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Landroid/view/MenuItem;") - custom { method, _ -> - method.containsLiteralInstruction(menuItemView) && - indexOfGetDrawableInstruction(method) >= 0 - } -} - -internal fun indexOfGetDrawableInstruction(method: Method) = method.indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Landroid/content/res/Resources;" && - reference.name == "getDrawable" + instructions( + resourceLiteral(ResourceType.ID, "menu_item_view"), + methodCall(returnType = "I", opcode = Opcode.INVOKE_INTERFACE), + opcode(Opcode.MOVE_RESULT, maxAfter = 0), // Value is zero if resource does not exist. + fieldAccess(type = "Landroid/widget/ImageView;", opcode = Opcode.IGET_OBJECT, maxAfter = 6), + methodCall("Landroid/content/res/Resources;", "getDrawable", maxAfter = 8), + methodCall("Landroid/widget/ImageView;", "setImageDrawable", maxAfter = 4) + ) } -internal val spoofAppVersionFingerprint = fingerprint { +internal val spoofAppVersionFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("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 0d6b6c89c7..e4482be7fd 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 @@ -4,13 +4,10 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting @@ -20,25 +17,7 @@ import app.revanced.patches.youtube.misc.playservice.is_19_43_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.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstInstructionReversedOrThrow -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference - -internal var menuItemView = -1L - private set - -internal val spoofAppVersionResourcePatch = resourcePatch { - dependsOn( - resourceMappingPatch - ) - - execute { - menuItemView = resourceMappings["id", "menu_item_view"] - } -} private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/spoof/SpoofAppVersionPatch;" @@ -49,7 +28,7 @@ val spoofAppVersionPatch = bytecodePatch( "This can be used to restore old UI elements and features." ) { dependsOn( - spoofAppVersionResourcePatch, + resourceMappingPatch, sharedExtensionPatch, settingsPatch, addResourcesPatch, @@ -80,14 +59,10 @@ val spoofAppVersionPatch = bytecodePatch( preferences = setOf( SwitchPreference("revanced_spoof_app_version"), if (is_19_43_or_greater) { - ListPreference( - key = "revanced_spoof_app_version_target", - summaryKey = null - ) + ListPreference("revanced_spoof_app_version_target") } else { ListPreference( key = "revanced_spoof_app_version_target", - summaryKey = null, entriesKey = "revanced_spoof_app_version_target_legacy_entries", entryValuesKey = "revanced_spoof_app_version_target_legacy_entry_values" ) @@ -101,35 +76,27 @@ val spoofAppVersionPatch = bytecodePatch( * missing image resources. As a workaround, do not set an image in the * toolbar when the enum name is UNKNOWN. */ - toolBarButtonFingerprint.method.apply { - val getDrawableIndex = indexOfGetDrawableInstruction(this) - val enumOrdinalIndex = indexOfFirstInstructionReversedOrThrow(getDrawableIndex) { - opcode == Opcode.INVOKE_INTERFACE && - getReference()?.returnType == "I" - } - val insertIndex = enumOrdinalIndex + 2 - val insertRegister = getInstruction(insertIndex - 1).registerA - val jumpIndex = indexOfFirstInstructionOrThrow(insertIndex) { - opcode == Opcode.INVOKE_VIRTUAL && - getReference()?.name == "setImageDrawable" - } + 1 + toolBarButtonFingerprint.apply { + val imageResourceIndex = instructionMatches[2].index + val register = method.getInstruction(imageResourceIndex).registerA + val jumpIndex = instructionMatches.last().index + 1 - addInstructionsWithLabels( - insertIndex, - "if-eqz v$insertRegister, :ignore", - ExternalLabel("ignore", getInstruction(jumpIndex)) + method.addInstructionsWithLabels( + imageResourceIndex + 1, + "if-eqz v$register, :ignore", + ExternalLabel("ignore", method.getInstruction(jumpIndex)) ) } spoofAppVersionFingerprint.apply { - val startIndex = patternMatch!!.startIndex - val buildOverrideNameRegister = method.getInstruction(startIndex).registerA + val index = instructionMatches.first().index + val register = method.getInstruction(index).registerA method.addInstructions( - startIndex + 1, + index + 1, """ - invoke-static {v$buildOverrideNameRegister}, $EXTENSION_CLASS_DESCRIPTOR->getYouTubeVersionOverride(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$buildOverrideNameRegister + 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 e54d13e791..91eee1b751 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 @@ -60,19 +60,19 @@ val changeStartPagePatch = bytecodePatch( ) // Hook browseId. - browseIdFingerprint.method.apply { - val browseIdIndex = indexOfFirstInstructionOrThrow { - getReference()?.string == "FEwhat_to_watch" - } - val browseIdRegister = getInstruction(browseIdIndex).registerA + browseIdFingerprint.let { + it.method.apply { + val browseIdIndex = it.instructionMatches.first().index + val browseIdRegister = getInstruction(browseIdIndex).registerA - addInstructions( - browseIdIndex + 1, - """ - invoke-static { v$browseIdRegister }, $EXTENSION_CLASS_DESCRIPTOR->overrideBrowseId(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$browseIdRegister - """, - ) + addInstructions( + browseIdIndex + 1, + """ + 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. 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 0220840203..f25f04cd63 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,20 +1,25 @@ package app.revanced.patches.youtube.layout.startpage +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.Opcode -internal val intentActionFingerprint = fingerprint { +internal val intentActionFingerprint by fingerprint { parameters("Landroid/content/Intent;") - strings("has_handled_intent") + instructions( + string("has_handled_intent") + ) } -internal val browseIdFingerprint = fingerprint { +internal val browseIdFingerprint by fingerprint { returns("Lcom/google/android/apps/youtube/app/common/ui/navigation/PaneDescriptor;") - parameters() - opcodes( - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.RETURN_OBJECT, + + //parameters() // 20.30 and earlier is no parameters. 20.31+ parameter is L. + instructions( + string("FEwhat_to_watch"), + literal(512), + fieldAccess(opcode = Opcode.IPUT_OBJECT, type = "Ljava/lang/String;") ) - strings("FEwhat_to_watch") } 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 4a8737fa43..0c3b4099ea 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 @@ -1,20 +1,19 @@ package app.revanced.patches.youtube.layout.startupshortsreset import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction 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.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_03_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.util.addInstructionsAtControlFlowLabel import app.revanced.util.findFreeRegister import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstInstructionReversedOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference @@ -30,6 +29,7 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, + versionCheckPatch ) compatibleWith( @@ -50,45 +50,41 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( SwitchPreference("revanced_disable_resuming_shorts_player"), ) - if (is_20_02_or_greater) { + if (is_20_03_or_greater) { userWasInShortsAlternativeFingerprint.let { it.method.apply { - val stringIndex = it.stringMatches!!.first().index - val booleanValueIndex = indexOfFirstInstructionReversedOrThrow(stringIndex) { - opcode == Opcode.INVOKE_VIRTUAL && - getReference()?.name == "booleanValue" - } - val booleanValueRegister = - getInstruction(booleanValueIndex + 1).registerA + val match = it.instructionMatches[2] + val insertIndex = match.index + 1 + val register = match.getInstruction().registerA addInstructions( - booleanValueIndex + 2, """ - invoke-static {v$booleanValueRegister}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer(Z)Z - move-result v$booleanValueRegister - """ + insertIndex, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer(Z)Z + move-result v$register + """ ) } } } else { userWasInShortsLegacyFingerprint.method.apply { val listenableInstructionIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() opcode == Opcode.INVOKE_INTERFACE && - reference?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && - reference.name == "isDone" + getReference()?.definingClass == "Lcom/google/common/util/concurrent/ListenableFuture;" && + getReference()?.name == "isDone" } val freeRegister = findFreeRegister(listenableInstructionIndex) addInstructionsAtControlFlowLabel( listenableInstructionIndex, """ - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z move-result v$freeRegister - if-eqz v$freeRegister, :show + if-eqz v$freeRegister, :show_startup_shorts_player return-void - :show + :show_startup_shorts_player 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 b1fab6fcb9..d668510541 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 @@ -1,33 +1,49 @@ package app.revanced.patches.youtube.layout.startupshortsreset +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode /** - * YouTube 20.02.08 ~ + * 20.02+ */ -internal val userWasInShortsAlternativeFingerprint = fingerprint { +internal val userWasInShortsAlternativeFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Ljava/lang/Object;") - strings("userIsInShorts: ") + instructions( + checkCast("Ljava/lang/Boolean;"), + methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z", maxAfter = 0), + opcode(Opcode.MOVE_RESULT, maxAfter = 0), + string("userIsInShorts: ", maxAfter = 5) + ) } -internal val userWasInShortsLegacyFingerprint = fingerprint { +/** + * Pre 20.02 + */ +internal val userWasInShortsLegacyFingerprint by fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Ljava/lang/Object;") - strings("Failed to read user_was_in_shorts proto after successful warmup") + instructions( + string("Failed to read user_was_in_shorts proto after successful warmup") + ) } /** * 18.15.40+ */ -internal val userWasInShortsConfigFingerprint = fingerprint { +internal val userWasInShortsConfigFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") - literal { - 45358360L - } + parameters() + instructions( + literal(45358360L) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt deleted file mode 100644 index c04f5e99c7..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.layout.tablet - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.layout.formfactor.changeFormFactorPatch - -@Deprecated("Use 'Change form factor' instead.") -val enableTabletLayoutPatch = bytecodePatch { - dependsOn(changeFormFactorPatch) -} \ No newline at end of file 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 8864c20c6f..b8c54dad84 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,41 +1,62 @@ package app.revanced.patches.youtube.layout.theme +import app.revanced.patcher.anyInstruction +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val lithoThemeFingerprint = fingerprint { +internal val lithoThemeFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters("Landroid/graphics/Rect;") - opcodes( - Opcode.IGET, - Opcode.IF_EQZ, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT, - Opcode.IF_NEZ, - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.RETURN_VOID, + instructions( + fieldAccess( + opcode = Opcode.IPUT_OBJECT, + definingClass = "this", + type = "Landroid/graphics/Path;" + ), + + methodCall( + definingClass = "this", + name = "isStateful", + returnType = "Z", + maxAfter = 5 + ), + + fieldAccess( + opcode = Opcode.IGET_OBJECT, + definingClass = "this", + type = "Landroid/graphics/Paint", + maxAfter = 5 + ), + methodCall( + smali = "Landroid/graphics/Paint;->setColor(I)V", + maxAfter = 0 + ) ) custom { method, _ -> method.name == "onBoundsChange" } } -internal const val GRADIENT_LOADING_SCREEN_AB_CONSTANT = 45412406L - -internal val useGradientLoadingScreenFingerprint = fingerprint { - literal { GRADIENT_LOADING_SCREEN_AB_CONSTANT } +internal val useGradientLoadingScreenFingerprint by fingerprint { + instructions( + literal(45412406L) + ) } -internal const val SPLASH_SCREEN_STYLE_FEATURE_FLAG = 269032877L - -internal val splashScreenStyleFingerprint = fingerprint { +internal val splashScreenStyleFingerprint by fingerprint { returns("V") parameters("Landroid/os/Bundle;") - literal { SPLASH_SCREEN_STYLE_FEATURE_FLAG } + instructions( + anyInstruction( + literal(1074339245), // 20.30+ + literal(269032877L) // 20.29 and lower. + ) + ) custom { method, classDef -> method.name == "onCreate" && classDef.endsWith("/MainActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt index fdab6c4b8b..6ca91d1e95 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt @@ -3,6 +3,9 @@ package app.revanced.patches.youtube.layout.theme import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.bytecodePatch +/** + * Hooks most color usage of litho components. + */ lateinit var lithoColorOverrideHook: (targetMethodClass: String, targetMethodName: String) -> Unit private set @@ -11,8 +14,7 @@ val lithoColorHookPatch = bytecodePatch( ) { execute { - - var insertionIndex = lithoThemeFingerprint.patternMatch!!.endIndex - 1 + var insertionIndex = lithoThemeFingerprint.instructionMatches.last().index lithoColorOverrideHook = { targetMethodClass, targetMethodName -> lithoThemeFingerprint.method.addInstructions( @@ -20,7 +22,7 @@ val lithoColorHookPatch = bytecodePatch( """ invoke-static { p1 }, $targetMethodClass->$targetMethodName(I)I move-result p1 - """, + """ ) insertionIndex += 2 } 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 04d7a3d79a..26488779ae 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 @@ -173,7 +173,7 @@ val themePatch = bytecodePatch( // Fix the splash screen dark mode background color. // In 19.32+ the dark mode splash screen is white and fades to black. // Maybe it's a bug in YT, or maybe it intentionally. Who knows. - document("res/values-night-v27/styles.xml").use { document -> + document("res/values-night/styles.xml").use { document -> // Create a night mode specific override for the splash screen background. val style = document.createElement("style") style.setAttribute("name", "Theme.YouTube.Home") @@ -226,17 +226,21 @@ val themePatch = bytecodePatch( ) } - useGradientLoadingScreenFingerprint.method.insertLiteralOverride( - GRADIENT_LOADING_SCREEN_AB_CONSTANT, - "$EXTENSION_CLASS_DESCRIPTOR->gradientLoadingScreenEnabled(Z)Z" - ) + useGradientLoadingScreenFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$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.method.insertLiteralOverride( - SPLASH_SCREEN_STYLE_FEATURE_FLAG, - "$EXTENSION_CLASS_DESCRIPTOR->getLoadingScreenType(I)I" - ) + splashScreenStyleFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->getLoadingScreenType(I)I" + ) + } } lithoColorOverrideHook(EXTENSION_CLASS_DESCRIPTOR, "getValue") 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 a0e44d4d5f..c1c9207674 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 @@ -3,12 +3,11 @@ package app.revanced.patches.youtube.misc.backgroundplayback import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch @@ -25,14 +24,6 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference internal var prefBackgroundAndOfflineCategoryId = -1L private set -private val backgroundPlaybackResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch, addResourcesPatch) - - execute { - prefBackgroundAndOfflineCategoryId = resourceMappings["string", "pref_background_and_offline_category"] - } -} - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/BackgroundPlaybackPatch;" @@ -41,7 +32,8 @@ val backgroundPlaybackPatch = bytecodePatch( description = "Removes restrictions on background playback, including playing kids videos in the background.", ) { dependsOn( - backgroundPlaybackResourcePatch, + resourceMappingPatch, + addResourcesPatch, sharedExtensionPatch, playerTypeHookPatch, videoInformationPatch, @@ -64,7 +56,12 @@ val backgroundPlaybackPatch = bytecodePatch( addResources("youtube", "misc.backgroundplayback.backgroundPlaybackPatch") PreferenceScreen.SHORTS.addPreferences( - SwitchPreference("revanced_shorts_disable_background_playback"), + SwitchPreference("revanced_shorts_disable_background_playback") + ) + + prefBackgroundAndOfflineCategoryId = getResourceId( + ResourceType.STRING, + "pref_background_and_offline_category" ) arrayOf( @@ -106,10 +103,12 @@ val backgroundPlaybackPatch = bytecodePatch( // Fix PiP buttons not working after locking/unlocking device screen. if (is_19_34_or_greater) { - pipInputConsumerFeatureFlagFingerprint.method.insertLiteralOverride( - PIP_INPUT_CONSUMER_FEATURE_FLAG, - false - ) + pipInputConsumerFeatureFlagFingerprint.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 a5c077115d..23a6903bc4 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 @@ -5,7 +5,7 @@ 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 backgroundPlaybackManagerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L") @@ -38,7 +38,7 @@ internal val backgroundPlaybackManagerFingerprint = fingerprint { ) } -internal val backgroundPlaybackSettingsFingerprint = fingerprint { +internal val backgroundPlaybackSettingsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() @@ -54,7 +54,7 @@ internal val backgroundPlaybackSettingsFingerprint = fingerprint { literal { prefBackgroundAndOfflineCategoryId } } -internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { +internal val kidsBackgroundPlaybackPolicyControllerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "L", "L") @@ -71,23 +71,28 @@ internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { literal { 5 } } -internal val backgroundPlaybackManagerShortsFingerprint = fingerprint { +internal val backgroundPlaybackManagerShortsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L") - literal { 151635310 } + instructions( + app.revanced.patcher.literal(151635310) + ) } -internal val shortsBackgroundPlaybackFeatureFlagFingerprint = fingerprint { +internal val shortsBackgroundPlaybackFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() - literal { 45415425 } + instructions( + app.revanced.patcher.literal(45415425) + ) } -internal const val PIP_INPUT_CONSUMER_FEATURE_FLAG = 45638483L - // Fix 'E/InputDispatcher: Window handle pip_input_consumer has no registered input channel' -internal val pipInputConsumerFeatureFlagFingerprint = fingerprint { - literal { PIP_INPUT_CONSUMER_FEATURE_FLAG} +internal val pipInputConsumerFeatureFlagFingerprint by fingerprint { + instructions( + // PiP input consumer feature flag. + app.revanced.patcher.literal(45638483L) + ) } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt index 33e188974b..03ba7a99be 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt @@ -1,34 +1,37 @@ package app.revanced.patches.youtube.misc.debugging import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags -internal val experimentalFeatureFlagParentFingerprint = fingerprint { +internal val experimentalFeatureFlagParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L", "J", "[B") - strings("Unable to parse proto typed experiment flag: ") + instructions( + string("Unable to parse proto typed experiment flag: ") + ) } -internal val experimentalBooleanFeatureFlagFingerprint = fingerprint { +internal val experimentalBooleanFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L", "J", "Z") } -internal val experimentalDoubleFeatureFlagFingerprint = fingerprint { +internal val experimentalDoubleFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("D") parameters("J", "D") } -internal val experimentalLongFeatureFlagFingerprint = fingerprint { +internal val experimentalLongFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("J") parameters("J", "J") } -internal val experimentalStringFeatureFlagFingerprint = fingerprint { +internal val experimentalStringFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("J", "Ljava/lang/String;") 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 4f99a4cf54..6d772c5169 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,8 +1,12 @@ package app.revanced.patches.youtube.misc.dimensions.spoof import app.revanced.patcher.fingerprint +import app.revanced.patcher.string -internal val deviceDimensionsModelToStringFingerprint = fingerprint { +internal val deviceDimensionsModelToStringFingerprint by fingerprint { returns("L") - strings("minh.", ";maxh.") + instructions( + string("minh."), + string(";maxh.") + ) } 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 5de1716373..53ab2e8323 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 @@ -45,7 +45,7 @@ val spoofDeviceDimensionsPatch = bytecodePatch( // Override the parameters containing the dimensions. .addInstructions( 1, // Add after super call. - mapOf( + arrayOf( 1 to "MinHeightOrWidth", // p1 = min height 2 to "MaxHeightOrWidth", // p2 = max height 3 to "MinHeightOrWidth", // p3 = min width diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt index 6a0e7d1f48..8f2274d83d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt @@ -1,5 +1,6 @@ package app.revanced.patches.youtube.misc.extension.hooks +import app.revanced.patcher.string import app.revanced.patches.shared.misc.extension.extensionHook /** @@ -7,5 +8,8 @@ import app.revanced.patches.shared.misc.extension.extensionHook */ // Extension context is the Activity itself. internal val applicationInitHook = extensionHook { - strings("Application creation", "Application.onCreate") + instructions( + string("Application.onCreate"), + string("Application creation") + ) } 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 3de2e836ad..3fb5562a8b 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,10 +1,14 @@ package app.revanced.patches.youtube.misc.fix.backtoexitgesture -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode -internal val scrollPositionFingerprint = fingerprint { +internal val scrollPositionFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters("L") @@ -16,44 +20,16 @@ internal val scrollPositionFingerprint = fingerprint { strings("scroll_position") } -/** - * Resolves using class found in [recyclerViewTopScrollingParentFingerprint]. - */ -internal val recyclerViewTopScrollingFingerprint = fingerprint { +internal val recyclerViewTopScrollingFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() - opcodes( - Opcode.IGET_OBJECT, - Opcode.IF_EQZ, - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT, - Opcode.IF_EQZ, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.CHECK_CAST, - Opcode.CONST_4, - Opcode.INVOKE_VIRTUAL, - Opcode.GOTO, - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - ) -} - -internal val recyclerViewTopScrollingParentFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - parameters("L", "L", "Landroid/view/ViewGroup;", "Landroid/view/ViewGroup;") - opcodes( - Opcode.INVOKE_DIRECT, - Opcode.IPUT_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.CONST_16, - Opcode.INVOKE_VIRTUAL, - Opcode.NEW_INSTANCE, + instructions( + methodCall(smali = "Ljava/util/Iterator;->next()Ljava/lang/Object;"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0), + checkCast("Landroid/support/v7/widget/RecyclerView;", maxAfter = 0), + literal(0, maxAfter = 0), + methodCall(definingClass = "Landroid/support/v7/widget/RecyclerView;", maxAfter = 0), + opcode(Opcode.GOTO, maxAfter = 0) ) } 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 d64857769f..f299aab385 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 @@ -3,6 +3,7 @@ package app.revanced.patches.youtube.misc.fix.backtoexitgesture import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.youtube.shared.mainActivityOnBackPressedFingerprint +import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode @@ -15,17 +16,16 @@ internal val fixBackToExitGesturePatch = bytecodePatch( ) { execute { - recyclerViewTopScrollingFingerprint.match(recyclerViewTopScrollingParentFingerprint.originalClassDef) - .let { - it.method.addInstruction( - it.patternMatch!!.endIndex, - "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V" - ) - } + recyclerViewTopScrollingFingerprint.let { + it.method.addInstructionsAtControlFlowLabel( + it.instructionMatches.last().index + 1, + "invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->onTopView()V" + ) + } scrollPositionFingerprint.let { navigate(it.originalMethod) - .to(it.patternMatch!!.startIndex + 1) + .to(it.instructionMatches.first().index + 1) .stop().apply { val index = indexOfFirstInstructionOrThrow { opcode == Opcode.INVOKE_VIRTUAL && getReference()?.definingClass == diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt deleted file mode 100644 index 89e7cc08f8..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.misc.fix.playback - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Use app.revanced.patches.youtube.misc.spoof.spoofVideoStreamsPatch instead.") -@Suppress("unused") -val spoofVideoStreamsPatch = bytecodePatch { - dependsOn(app.revanced.patches.youtube.misc.spoof.spoofVideoStreamsPatch) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt deleted file mode 100644 index eb4c9492be..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.misc.fix.playback - -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("Use app.revanced.patches.youtube.misc.spoof.userAgentClientSpoofPatch instead.") -@Suppress("unused") -val userAgentClientSpoofPatch = bytecodePatch { - dependsOn(app.revanced.patches.youtube.misc.spoof.userAgentClientSpoofPatch) -} 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 d5a255ca5f..9ae70b23be 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 @@ -12,7 +12,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 playbackSpeedInFeedsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") 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 673fa240a8..93e912addc 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 @@ -3,44 +3,17 @@ package app.revanced.patches.youtube.misc.gms import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/AccountCredentialsInvalidTextPatch;" -internal var ic_offline_no_content_upside_down = -1L - private set -internal var offline_no_content_body_text_not_offline_eligible = -1L - private set - -private val accountCredentialsInvalidTextResourcePatch = resourcePatch { - execute { - ic_offline_no_content_upside_down = resourceMappings[ - "drawable", - "ic_offline_no_content_upside_down" - ] - - offline_no_content_body_text_not_offline_eligible = resourceMappings[ - "string", - "offline_no_content_body_text_not_offline_eligible" - ] - } -} - internal val accountCredentialsInvalidTextPatch = bytecodePatch { dependsOn( sharedExtensionPatch, - accountCredentialsInvalidTextResourcePatch, addResourcesPatch ) @@ -60,18 +33,12 @@ internal val accountCredentialsInvalidTextPatch = bytecodePatch { specificNetworkErrorViewControllerFingerprint, loadingFrameLayoutControllerFingerprint ).forEach { fingerprint -> - fingerprint.method.apply { - val resourceIndex = indexOfFirstLiteralInstructionOrThrow( - offline_no_content_body_text_not_offline_eligible - ) - val getStringIndex = indexOfFirstInstructionOrThrow(resourceIndex) { - val reference = getReference() - reference?.name == "getString" - } - val register = getInstruction(getStringIndex + 1).registerA + fingerprint.apply { + val index = instructionMatches.last().index + val register = method.getInstruction(index).registerA - addInstructions( - getStringIndex + 2, + method.addInstructions( + index + 1, """ 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 3f4a521df6..8fe2e05a5e 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,27 +1,35 @@ package app.revanced.patches.youtube.misc.gms import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode -internal val specificNetworkErrorViewControllerFingerprint = fingerprint { +internal val specificNetworkErrorViewControllerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() - custom { method, _ -> - method.containsLiteralInstruction(ic_offline_no_content_upside_down) - && method.containsLiteralInstruction(offline_no_content_body_text_not_offline_eligible) - } + instructions( + resourceLiteral(ResourceType.DRAWABLE, "ic_offline_no_content_upside_down"), + resourceLiteral(ResourceType.STRING, "offline_no_content_body_text_not_offline_eligible"), + methodCall(name = "getString", returnType = "Ljava/lang/String;"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) + ) } // 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 loadingFrameLayoutControllerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") - custom { method, _ -> - method.containsLiteralInstruction(ic_offline_no_content_upside_down) - && method.containsLiteralInstruction(offline_no_content_body_text_not_offline_eligible) - } + instructions( + resourceLiteral(ResourceType.DRAWABLE, "ic_offline_no_content_upside_down"), + resourceLiteral(ResourceType.STRING, "offline_no_content_body_text_not_offline_eligible"), + methodCall(name = "getString", returnType = "Ljava/lang/String;"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) + ) } \ No newline at end of file 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 13efc46931..d556efa94d 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 @@ -2,22 +2,22 @@ package app.revanced.patches.youtube.misc.hapticfeedback import app.revanced.patcher.fingerprint -internal val markerHapticsFingerprint = fingerprint { +internal val markerHapticsFingerprint by fingerprint { returns("V") strings("Failed to execute markers haptics vibrate.") } -internal val scrubbingHapticsFingerprint = fingerprint { +internal val scrubbingHapticsFingerprint by fingerprint { returns("V") strings("Failed to haptics vibrate for fine scrubbing.") } -internal val seekUndoHapticsFingerprint = fingerprint { +internal val seekUndoHapticsFingerprint by fingerprint { returns("V") strings("Failed to execute seek undo haptics vibrate.") } -internal val zoomHapticsFingerprint = fingerprint { +internal val zoomHapticsFingerprint by fingerprint { returns("V") strings("Failed to haptics vibrate for video zoom") } 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 fcd5298acf..52315bc699 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,9 +1,10 @@ package app.revanced.patches.youtube.misc.imageurlhook import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags -internal val onFailureFingerprint = fingerprint { +internal val onFailureFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters( @@ -17,7 +18,7 @@ internal val onFailureFingerprint = fingerprint { } // Acts as a parent fingerprint. -internal val onResponseStartedFingerprint = fingerprint { +internal val onResponseStartedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") @@ -32,7 +33,7 @@ internal val onResponseStartedFingerprint = fingerprint { } } -internal val onSucceededFingerprint = fingerprint { +internal val onSucceededFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") @@ -43,22 +44,23 @@ internal val onSucceededFingerprint = fingerprint { internal const val CRONET_URL_REQUEST_CLASS_DESCRIPTOR = "Lorg/chromium/net/impl/CronetUrlRequest;" -internal val requestFingerprint = fingerprint { +internal val requestFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") custom { _, classDef -> classDef.type == CRONET_URL_REQUEST_CLASS_DESCRIPTOR } } -internal val messageDigestImageUrlFingerprint = fingerprint { +internal val messageDigestImageUrlFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Ljava/lang/String;", "L") } -internal val messageDigestImageUrlParentFingerprint = fingerprint { +internal val messageDigestImageUrlParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() - strings("@#&=*+-_.,:!?()/~'%;\$") + instructions( + string("@#&=*+-_.,:!?()/~'%;\$"), + ) } 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 6f0b94ecee..23025d176d 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 @@ -7,17 +7,11 @@ 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.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playservice.is_19_33_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.util.getReference -import app.revanced.util.indexOfFirstInstruction -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.iface.reference.TypeReference + +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/BypassURLRedirectsPatch;" val bypassURLRedirectsPatch = bytecodePatch( name = "Bypass URL redirects", @@ -27,7 +21,6 @@ val bypassURLRedirectsPatch = bytecodePatch( sharedExtensionPatch, settingsPatch, addResourcesPatch, - versionCheckPatch, ) compatibleWith( @@ -48,41 +41,20 @@ val bypassURLRedirectsPatch = bytecodePatch( SwitchPreference("revanced_bypass_url_redirects"), ) - val fingerprints = if (is_19_33_or_greater) { - arrayOf( - abUriParserFingerprint, - httpUriParserFingerprint, - ) - } else { - arrayOf( - abUriParserLegacyFingerprint, - httpUriParserLegacyFingerprint, - ) - } - - fingerprints.forEach { - it.method.apply { - val insertIndex = findUriParseIndex() + arrayOf( + abUriParserFingerprint to 2, + httpUriParserFingerprint to 0 + ).forEach { (fingerprint, index) -> + fingerprint.method.apply { + val insertIndex = fingerprint.instructionMatches[index].index val uriStringRegister = getInstruction(insertIndex).registerC replaceInstruction( insertIndex, - "invoke-static {v$uriStringRegister}," + - "Lapp/revanced/extension/youtube/patches/BypassURLRedirectsPatch;" + - "->" + - "parseRedirectUri(Ljava/lang/String;)Landroid/net/Uri;", + "invoke-static { v$uriStringRegister }, $EXTENSION_CLASS_DESCRIPTOR->" + + "parseRedirectUri(Ljava/lang/String;)Landroid/net/Uri;", ) } } } } - -internal fun Method.findUriParseIndex() = indexOfFirstInstruction { - val reference = getReference() - reference?.returnType == "Landroid/net/Uri;" && reference.name == "parse" -} - -internal fun Method.findWebViewCheckCastIndex() = indexOfFirstInstruction { - val reference = getReference() - opcode == Opcode.CHECK_CAST && reference?.type?.endsWith("/WebviewEndpointOuterClass${'$'}WebviewEndpoint;") == true -} 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 6f231693bd..cbd4a3c645 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,68 +1,32 @@ package app.revanced.patches.youtube.misc.links +import app.revanced.patcher.checkCast +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode -/** - * Target 19.33+ - */ -internal val abUriParserFingerprint = fingerprint { +internal val abUriParserFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/Object") - parameters("Ljava/lang/Object") - custom { method, _ -> - method.findUriParseIndex() >= 0 && method.findWebViewCheckCastIndex() >= 0 - } -} - -/** - * Target 19.33+ - */ -internal val httpUriParserFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Landroid/net/Uri") - parameters("Ljava/lang/String") - strings("https", "://", "https:") - custom { methodDef, _ -> - methodDef.findUriParseIndex() >= 0 - } -} - -internal val abUriParserLegacyFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/Object") - parameters("Ljava/lang/Object") - opcodes( - Opcode.RETURN_OBJECT, - Opcode.CHECK_CAST, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT_OBJECT, - Opcode.CHECK_CAST, - Opcode.RETURN_OBJECT, - Opcode.CHECK_CAST, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - Opcode.RETURN_OBJECT, - Opcode.CHECK_CAST, + returns("Ljava/lang/Object;") + parameters("Ljava/lang/Object;") + instructions( + string("Found entityKey=`"), + string("that does not contain a PlaylistVideoEntityId", partialMatch = true), + methodCall(smali = "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;") ) - custom { methodDef, classDef -> - // This method is always called "a" because this kind of class always has a single (non-synthetic) method. - - if (methodDef.name != "a") return@custom false - - val count = classDef.methods.count() - count == 2 || count == 3 - } } -internal val httpUriParserLegacyFingerprint = fingerprint { +internal val httpUriParserFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Landroid/net/Uri") - parameters("Ljava/lang/String") - opcodes( - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, + returns("Landroid/net/Uri;") + parameters("Ljava/lang/String;") + instructions( + methodCall(smali = "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;"), + string("https"), + string("://"), + string("https:"), ) - strings("://") } + 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 497bd3c89b..0740c3b694 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,30 +1,52 @@ package app.revanced.patches.youtube.misc.litho.filter +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint import app.revanced.util.containsLiteralInstruction -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val componentContextParserFingerprint = fingerprint { - strings("Number of bits must be positive") +internal val componentContextParserFingerprint by fingerprint { + instructions( + string("Number of bits must be positive") + ) } -internal val componentCreateFingerprint = fingerprint { - strings( - "Element missing correct type extension", - "Element missing type" +internal val componentCreateFingerprint by fingerprint { + instructions( + string("Element missing correct type extension"), + string("Element missing type") ) } -internal val lithoFilterFingerprint = fingerprint { +internal val lithoFilterFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) custom { _, classDef -> classDef.endsWith("/LithoFilterPatch;") } } -internal val protobufBufferReferenceFingerprint = fingerprint { +internal val protobufBufferReferenceFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters("[B") + instructions( + fieldAccess( + opcode = Opcode.IGET_OBJECT, + definingClass = "this", + type = "Lcom/google/android/libraries/elements/adl/UpbMessage;" + ), + methodCall( + definingClass = "Lcom/google/android/libraries/elements/adl/UpbMessage;", + name = "jniDecode" + ) + ) +} + +internal val protobufBufferReferenceLegacyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "Ljava/nio/ByteBuffer;") @@ -36,34 +58,38 @@ internal val protobufBufferReferenceFingerprint = fingerprint { ) } -internal val emptyComponentFingerprint = fingerprint { +internal val emptyComponentFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) parameters() - strings("EmptyComponent") + instructions( + string("EmptyComponent") + ) custom { _, classDef -> classDef.methods.filter { AccessFlags.STATIC.isSet(it.accessFlags) }.size == 1 } } -internal val lithoThreadExecutorFingerprint = fingerprint { +internal val lithoThreadExecutorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("I", "I", "I") custom { method, classDef -> classDef.superclass == "Ljava/util/concurrent/ThreadPoolExecutor;" && - method.containsLiteralInstruction(1L) // 1L = default thread timeout. + method.containsLiteralInstruction(1L) // 1L = default thread timeout. } } -internal val lithoComponentNameUpbFeatureFlagFingerprint = fingerprint { +internal val lithoComponentNameUpbFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() - literal { 45631264L } + instructions( + literal(45631264L) + ) } -internal val lithoConverterBufferUpbFeatureFlagFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) +internal val lithoConverterBufferUpbFeatureFlagFingerprint by fingerprint { returns("L") - parameters("L") - literal { 45419603L } + instructions( + literal(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 81ae57cbb2..b03d8147d6 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 @@ -12,6 +12,7 @@ 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_19_25_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_05_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_22_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.shared.conversionContextFingerprintToString import app.revanced.util.addInstructionsAtControlFlowLabel @@ -19,11 +20,13 @@ import app.revanced.util.findFreeRegister import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import app.revanced.util.insertLiteralOverride +import app.revanced.util.returnLate import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -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.FieldReference +import java.util.logging.Logger lateinit var addLithoFilter: (String) -> Unit private set @@ -65,11 +68,11 @@ val lithoFilterPatch = bytecodePatch( * } * } * - * class CreateComponentClass { - * public Component createComponent() { + * class ComponentContextParser { + * public Component parseComponent() { * ... * - * if (extensionClass.shouldFilter(identifier, path)) { // Inserted by this patch. + * if (extensionClass.shouldFilter()) { // Inserted by this patch. * return emptyComponent; * } * return originalUnpatchedComponent; // Original code. @@ -90,32 +93,42 @@ val lithoFilterPatch = bytecodePatch( invoke-direct { v1 }, $classDescriptor->()V const/16 v2, ${filterCount++} aput-object v1, v0, v2 - """, + """ ) } } // region Pass the buffer into extension. - protobufBufferReferenceFingerprint.method.addInstruction( + 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 { + // Hook the buffer after the call to jniDecode(). + it.method.addInstruction( + it.instructionMatches.last().index + 1, + "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->setProtoBuffer([B)V", + ) + } + } + + // Legacy Non native buffer. + protobufBufferReferenceLegacyFingerprint.method.addInstruction( 0, "invoke-static { p2 }, $EXTENSION_CLASS_DESCRIPTOR->setProtoBuffer(Ljava/nio/ByteBuffer;)V", ) // endregion - // region Hook the method that parses bytes into a ComponentContext. - // Allow the method to run to completion, and override the - // return value with an empty component if it should be filtered. - // It is important to allow the original code to always run to completion, - // otherwise high memory usage and poor app performance can occur. + // region Modify the create component method and + // if the component is filtered then return an empty component. // Find the identifier/path fields of the conversion context. - val conversionContextIdentifierField = componentContextParserFingerprint.let { + val conversionContextIdentifierField = componentContextParserFingerprint.match().let { // Identifier field is loaded just before the string declaration. val index = it.method.indexOfFirstInstructionReversedOrThrow( - it.stringMatches!!.first().index + it.instructionMatches.first().index ) { val reference = getReference() reference?.definingClass == conversionContextFingerprintToString.originalClassDef.type @@ -136,7 +149,7 @@ val lithoFilterPatch = bytecodePatch( val emptyComponentField = classBy { // Only one field that matches. it.type == builderMethodDescriptor.returnType - }!!.immutableClass.fields.single() + }.fields.single() componentCreateFingerprint.method.apply { val insertIndex = if (is_19_17_or_greater) { @@ -199,23 +212,27 @@ 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.apply { - // Don't use return early, so the debug patch logs if this was originally on. - val insertIndex = indexOfFirstInstructionOrThrow(Opcode.RETURN) - val register = getInstruction(insertIndex).registerA - - addInstruction(insertIndex, "const/4 v$register, 0x0") - } + lithoComponentNameUpbFeatureFlagFingerprint.method.returnLate(false) } // Turn off a feature flag that enables native code of protobuf parsing (Upb protobuf). - // If this is enabled, then the litho protobuffer hook will always show an empty buffer - // since it's no longer handled by the hooked Java code. - lithoConverterBufferUpbFeatureFlagFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT) - val register = getInstruction(index).registerA + lithoConverterBufferUpbFeatureFlagFingerprint.let { + // Procool buffer has changed in 20.22, and UPB native code is now always enabled. + if (is_20_22_or_greater) { + Logger.getLogger(this::class.java.name).severe( + "\n!!!" + + "\n!!! Litho filtering is not yet fully supported when patching 20.22+" + + "\n!!! Action buttons, Shorts shelves, and possibly other components cannot be set hidden." + + "\n!!!" + ) + } - addInstruction(index + 1, "const/4 v$register, 0x0") + // 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 + ) } // endregion @@ -224,4 +241,4 @@ val lithoFilterPatch = bytecodePatch( finalize { lithoFilterFingerprint.method.replaceInstruction(0, "const/16 v0, $filterCount") } -} +} \ No newline at end of file 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 a5fa0ed5e2..5fbee6e279 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 @@ -1,30 +1,37 @@ package app.revanced.patches.youtube.misc.navigation +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patcher.string +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import app.revanced.patches.youtube.layout.buttons.navigation.navigationButtonsPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags 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 actionBarSearchResultsFingerprint = fingerprint { +internal val actionBarSearchResultsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") - literal { actionBarSearchResultsViewMicId } + instructions( + resourceLiteral(ResourceType.LAYOUT, "action_bar_search_results_view_mic"), + methodCall(name = "setLayoutDirection") + ) } -internal val toolbarLayoutFingerprint = fingerprint { +internal val toolbarLayoutFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.CONSTRUCTOR) - literal { toolbarContainerId } + instructions( + resourceLiteral(ResourceType.ID, "toolbar_container"), + checkCast("Lcom/google/android/apps/youtube/app/ui/actionbar/MainCollapsingToolbarLayout;") + ) } /** * 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 appCompatToolbarBackButtonFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/graphics/drawable/Drawable;") parameters() @@ -36,17 +43,19 @@ internal val appCompatToolbarBackButtonFingerprint = fingerprint { /** * Matches to the class found in [pivotBarConstructorFingerprint]. */ -internal val initializeButtonsFingerprint = fingerprint { +internal val initializeButtonsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") - literal { imageOnlyTabResourceId } + instructions( + resourceLiteral(ResourceType.LAYOUT, "image_only_tab") + ) } /** * Extension method, used for callback into to other patches. * Specifically, [navigationButtonsPatch]. */ -internal val navigationBarHookCallbackFingerprint = fingerprint { +internal val navigationBarHookCallbackFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("V") parameters(EXTENSION_NAVIGATION_BUTTON_DESCRIPTOR, "Landroid/view/View;") @@ -59,7 +68,7 @@ internal val navigationBarHookCallbackFingerprint = fingerprint { /** * Matches to the Enum class that looks up ordinal -> instance. */ -internal val navigationEnumFingerprint = fingerprint { +internal val navigationEnumFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "PIVOT_HOME", @@ -72,17 +81,17 @@ internal val navigationEnumFingerprint = fingerprint { ) } -internal val pivotBarButtonsCreateDrawableViewFingerprint = fingerprint { +internal val pivotBarButtonsCreateDrawableViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") custom { method, _ -> method.definingClass == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" && - // Only one method has a Drawable parameter. + // Only one view creation method has a Drawable parameter. method.parameterTypes.firstOrNull() == "Landroid/graphics/drawable/Drawable;" } } -internal val pivotBarButtonsCreateResourceViewFingerprint = fingerprint { +internal val pivotBarButtonsCreateResourceStyledViewFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") parameters("L", "Z", "I", "L") @@ -91,33 +100,50 @@ internal val pivotBarButtonsCreateResourceViewFingerprint = fingerprint { } } -internal fun indexOfSetViewSelectedInstruction(method: Method) = method.indexOfFirstInstruction { - opcode == Opcode.INVOKE_VIRTUAL && getReference()?.name == "setSelected" +/** + * 20.21+ + */ +internal val pivotBarButtonsCreateResourceIntViewFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Landroid/view/View;") + custom { method, _ -> + method.definingClass == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" && + // Only one view creation method has an int first parameter. + method.parameterTypes.firstOrNull() == "I" + } } -internal val pivotBarButtonsViewSetSelectedFingerprint = fingerprint { +internal val pivotBarButtonsViewSetSelectedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "Z") + instructions( + methodCall(name = "setSelected") + ) custom { method, _ -> - indexOfSetViewSelectedInstruction(method) >= 0 && - method.definingClass == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" + method.definingClass == "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;" } } -internal val pivotBarConstructorFingerprint = fingerprint { +internal val pivotBarConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - strings("com.google.android.apps.youtube.app.endpoint.flags") + instructions( + string("com.google.android.apps.youtube.app.endpoint.flags"), + ) } -internal val imageEnumConstructorFingerprint = fingerprint { +internal val imageEnumConstructorFingerprint by fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) - strings("TAB_ACTIVITY_CAIRO") + instructions( + string("TAB_ACTIVITY_CAIRO"), + opcode(Opcode.SPUT_OBJECT) + ) } -internal val setEnumMapFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - literal { - ytFillBellId - } +internal val setEnumMapFingerprint by fingerprint { + instructions( + resourceLiteral(ResourceType.DRAWABLE, "yt_fill_bell_black_24"), + methodCall(smali = "Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;", maxAfter = 10), + methodCall(smali = "Ljava/util/EnumMap;->put(Ljava/lang/Enum;Ljava/lang/Object;)Ljava/lang/Object;", maxAfter = 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 f1ea33327b..c3e125dae6 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 @@ -6,20 +6,18 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_35_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_21_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_28_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.shared.mainActivityOnBackPressedFingerprint +import app.revanced.util.findFreeRegister import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstInstructionReversedOrThrow -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation @@ -28,30 +26,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.Instruction 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.iface.reference.TypeReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.util.MethodUtil -internal var imageOnlyTabResourceId = -1L - private set -internal var actionBarSearchResultsViewMicId = -1L - private set -internal var ytFillBellId = -1L - private set -internal var toolbarContainerId = -1L - private set - -private val navigationBarHookResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - imageOnlyTabResourceId = resourceMappings["layout", "image_only_tab"] - actionBarSearchResultsViewMicId = resourceMappings["layout", "action_bar_search_results_view_mic"] - ytFillBellId = resourceMappings["drawable", "yt_fill_bell_black_24"] - toolbarContainerId = resourceMappings["id", "toolbar_container"] - } -} - internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/shared/NavigationBar;" internal const val EXTENSION_NAVIGATION_BUTTON_DESCRIPTOR = @@ -64,12 +41,13 @@ lateinit var hookNavigationButtonCreated: (String) -> Unit val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navigation or search bar.") { dependsOn( sharedExtensionPatch, - navigationBarHookResourcePatch, + versionCheckPatch, playerTypeHookPatch, // Required to detect the search bar in all situations. + resourceMappingPatch, // Used by fingerprints ) execute { - fun MutableMethod.addHook(hook: Hook, insertPredicate: Instruction.() -> Boolean) { + fun MutableMethod.addHook(hook: NavigationHook, insertPredicate: Instruction.() -> Boolean) { val filtered = instructions.filter(insertPredicate) if (filtered.isEmpty()) throw PatchException("Could not find insert indexes") filtered.forEach { @@ -87,22 +65,32 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig initializeButtonsFingerprint.match(pivotBarConstructorFingerprint.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 - addHook(Hook.SET_LAST_APP_NAVIGATION_ENUM) { + addHook(NavigationHook.SET_LAST_APP_NAVIGATION_ENUM) { opcode == Opcode.INVOKE_STATIC && getReference()?.definingClass == navigationEnumClassName } // Hook the creation of navigation tab views. val drawableTabMethod = pivotBarButtonsCreateDrawableViewFingerprint.method - addHook(Hook.NAVIGATION_TAB_LOADED) predicate@{ + addHook(NavigationHook.NAVIGATION_TAB_LOADED) predicate@{ MethodUtil.methodSignaturesMatch( getReference() ?: return@predicate false, drawableTabMethod, ) } - val imageResourceTabMethod = pivotBarButtonsCreateResourceViewFingerprint.originalMethod - addHook(Hook.NAVIGATION_IMAGE_RESOURCE_TAB_LOADED) predicate@{ + if (is_20_21_or_greater && !is_20_28_or_greater) { + val imageResourceIntTabMethod = pivotBarButtonsCreateResourceIntViewFingerprint.originalMethod + addHook(NavigationHook.NAVIGATION_TAB_LOADED) predicate@{ + MethodUtil.methodSignaturesMatch( + getReference() ?: return@predicate false, + imageResourceIntTabMethod, + ) + } + } + + val imageResourceTabMethod = pivotBarButtonsCreateResourceStyledViewFingerprint.originalMethod + addHook(NavigationHook.NAVIGATION_IMAGE_RESOURCE_TAB_LOADED) predicate@{ MethodUtil.methodSignaturesMatch( getReference() ?: return@predicate false, imageResourceTabMethod, @@ -110,17 +98,19 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig } } - pivotBarButtonsViewSetSelectedFingerprint.method.apply { - val index = indexOfSetViewSelectedInstruction(this) - val instruction = getInstruction(index) - val viewRegister = instruction.registerC - val isSelectedRegister = instruction.registerD + pivotBarButtonsViewSetSelectedFingerprint.let { + it.method.apply { + val index = it.instructionMatches.first().index + val instruction = getInstruction(index) + val viewRegister = instruction.registerC + val isSelectedRegister = instruction.registerD - addInstruction( - index + 1, - "invoke-static { v$viewRegister, v$isSelectedRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->navigationTabSelected(Landroid/view/View;Z)V", - ) + addInstruction( + index + 1, + "invoke-static { v$viewRegister, v$isSelectedRegister }, " + + "$EXTENSION_CLASS_DESCRIPTOR->navigationTabSelected(Landroid/view/View;Z)V", + ) + } } // Hook onto back button pressed. Needed to fix race problem with @@ -136,37 +126,31 @@ 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.method.apply { - val searchBarResourceId = indexOfFirstLiteralInstructionOrThrow( - actionBarSearchResultsViewMicId, - ) + actionBarSearchResultsFingerprint.let { + it.method.apply { + val instructionIndex = it.instructionMatches.last().index + val viewRegister = getInstruction(instructionIndex).registerC - val instructionIndex = indexOfFirstInstructionOrThrow(searchBarResourceId) { - opcode == Opcode.INVOKE_VIRTUAL && getReference()?.name == "setLayoutDirection" + addInstruction( + instructionIndex, + "invoke-static { v$viewRegister }, " + + "$EXTENSION_CLASS_DESCRIPTOR->searchBarResultsViewLoaded(Landroid/view/View;)V", + ) } - - val viewRegister = getInstruction(instructionIndex).registerC - - addInstruction( - instructionIndex, - "invoke-static { v$viewRegister }, " + - "$EXTENSION_CLASS_DESCRIPTOR->searchBarResultsViewLoaded(Landroid/view/View;)V", - ) } // Hook the back button visibility. - toolbarLayoutFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow { - opcode == Opcode.CHECK_CAST && getReference()?.type == - "Lcom/google/android/apps/youtube/app/ui/actionbar/MainCollapsingToolbarLayout;" - } - val register = getInstruction(index).registerA + toolbarLayoutFingerprint.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" - ) + addInstruction( + index + 1, + "invoke-static { v$register }, ${EXTENSION_CLASS_DESCRIPTOR}->setToolbar(Landroid/widget/FrameLayout;)V" + ) + } } // Add interface for extensions code to call obfuscated methods. @@ -212,37 +196,30 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig // Fix YT bug of notification tab missing the filled icon. if (is_19_35_or_greater) { - val cairoNotificationEnumReference = with(imageEnumConstructorFingerprint) { - val stringIndex = stringMatches!!.first().index - val cairoNotificationEnumIndex = method.indexOfFirstInstructionOrThrow(stringIndex) { - opcode == Opcode.SPUT_OBJECT + val cairoNotificationEnumReference = imageEnumConstructorFingerprint + .instructionMatches.last().getInstruction().reference + + setEnumMapFingerprint.let { + it.method.apply { + val setEnumIntegerIndex = it.instructionMatches.last().index + val enumMapRegister = getInstruction(setEnumIntegerIndex).registerC + val insertIndex = setEnumIntegerIndex + 1 + val freeRegister = findFreeRegister(insertIndex, enumMapRegister) + + addInstructions( + insertIndex, + """ + sget-object v$freeRegister, $cairoNotificationEnumReference + invoke-static { v$enumMapRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->setCairoNotificationFilledIcon(Ljava/util/EnumMap;Ljava/lang/Enum;)V + """ + ) } - method.getInstruction(cairoNotificationEnumIndex).reference - } - - setEnumMapFingerprint.method.apply { - val enumMapIndex = indexOfFirstInstructionReversedOrThrow { - val reference = getReference() - opcode == Opcode.INVOKE_VIRTUAL && - reference?.definingClass == "Ljava/util/EnumMap;" && - reference.name == "put" && - reference.parameterTypes.firstOrNull() == "Ljava/lang/Enum;" - } - val instruction = getInstruction(enumMapIndex) - - addInstructions( - enumMapIndex + 1, - """ - sget-object v${instruction.registerD}, $cairoNotificationEnumReference - invoke-static { v${instruction.registerC}, v${instruction.registerD} }, $EXTENSION_CLASS_DESCRIPTOR->setCairoNotificationFilledIcon(Ljava/util/EnumMap;Ljava/lang/Enum;)V - """ - ) } } } } -private enum class Hook(val methodName: String, val parameters: String) { +private enum class NavigationHook(val methodName: String, val parameters: String) { SET_LAST_APP_NAVIGATION_ENUM("setLastAppNavigationEnum", "Ljava/lang/Enum;"), NAVIGATION_TAB_LOADED("navigationTabLoaded", "Landroid/view/View;"), NAVIGATION_IMAGE_RESOURCE_TAB_LOADED("navigationImageResourceTabLoaded", "Landroid/view/View;"), 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 da21371350..8d0a5a8e25 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,27 +1,16 @@ package app.revanced.patches.youtube.misc.playercontrols +import app.revanced.patcher.checkCast import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import app.revanced.util.indexOfFirstInstructionReversed -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags 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 fun indexOfFocusableInTouchModeInstruction(method: Method) = - method.indexOfFirstInstruction { - getReference()?.name == "setFocusableInTouchMode" - } - -internal fun indexOfTranslationInstruction(method: Method) = - method.indexOfFirstInstructionReversed { - getReference()?.name == "setTranslationY" - } - -internal val playerControlsVisibilityEntityModelFingerprint = fingerprint { +internal val playerControlsVisibilityEntityModelFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC) returns("L") parameters() @@ -34,34 +23,25 @@ internal val playerControlsVisibilityEntityModelFingerprint = fingerprint { } } -internal val youtubeControlsOverlayFingerprint = fingerprint { - accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) +internal val youtubeControlsOverlayFingerprint by fingerprint { returns("V") parameters() - custom { method, _ -> - indexOfFocusableInTouchModeInstruction(method) >= 0 && - method.containsLiteralInstruction(inset_overlay_view_layout_id) && - method.containsLiteralInstruction(scrim_overlay_id) - - } + instructions( + methodCall(name = "setFocusableInTouchMode"), + resourceLiteral(ResourceType.ID, "inset_overlay_view_layout"), + resourceLiteral(ResourceType.ID, "scrim_overlay"), + ) } -internal val motionEventFingerprint = fingerprint { +internal val motionEventFingerprint by fingerprint { returns("V") parameters("Landroid/view/MotionEvent;") - custom { method, _ -> - indexOfTranslationInstruction(method) >= 0 - } -} - -internal val playerTopControlsInflateFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - literal { controls_layout_stub_id } + instructions( + methodCall(name = "setTranslationY") + ) } -internal val playerControlsExtensionHookListenersExistFingerprint = fingerprint { +internal val playerControlsExtensionHookListenersExistFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Z") parameters() @@ -71,7 +51,7 @@ internal val playerControlsExtensionHookListenersExistFingerprint = fingerprint } } -internal val playerControlsExtensionHookFingerprint = fingerprint { +internal val playerControlsExtensionHookFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("V") parameters("Z") @@ -81,42 +61,88 @@ internal val playerControlsExtensionHookFingerprint = fingerprint { } } -internal val playerBottomControlsInflateFingerprint = fingerprint { +internal val playerTopControlsInflateFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters() + instructions( + resourceLiteral(ResourceType.ID, "controls_layout_stub"), + methodCall("Landroid/view/ViewStub;", "inflate"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) + ) +} + +internal val playerBottomControlsInflateFingerprint by fingerprint { returns("Ljava/lang/Object;") parameters() - literal { bottom_ui_container_stub_id } + instructions( + resourceLiteral(ResourceType.ID, "bottom_ui_container_stub"), + methodCall("Landroid/view/ViewStub;", "inflate"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 0) + ) } -internal val overlayViewInflateFingerprint = fingerprint { +internal val overlayViewInflateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;") - custom { methodDef, _ -> - methodDef.containsLiteralInstruction(fullscreen_button_id) && - methodDef.containsLiteralInstruction(heatseeker_viewstub_id) - } + instructions( + resourceLiteral(ResourceType.ID, "heatseeker_viewstub"), + resourceLiteral(ResourceType.ID, "fullscreen_button"), + checkCast("Landroid/widget/ImageView;") + ) } /** * Resolves to the class found in [playerTopControlsInflateFingerprint]. */ -internal val controlsOverlayVisibilityFingerprint = fingerprint { +internal val controlsOverlayVisibilityFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Z", "Z") } -internal val playerBottomControlsExploderFeatureFlagFingerprint = fingerprint { +internal val playerBottomControlsExploderFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() - literal { 45643739L } + instructions( + literal(45643739L) + ) } -internal val playerTopControlsExperimentalLayoutFeatureFlagFingerprint = fingerprint { +internal val playerTopControlsExperimentalLayoutFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") parameters() - literal { 45629424L } + instructions( + literal(45629424L) + ) +} + +internal val playerControlsLargeOverlayButtonsFeatureFlagFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + parameters() + instructions( + literal(45709810L) + ) } +internal val playerControlsFullscreenLargeButtonsFeatureFlagFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + parameters() + instructions( + literal(45686474L) + ) +} + +internal val playerControlsButtonStrokeFeatureFlagFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + parameters() + instructions( + literal(45713296) + ) +} \ No newline at end of file 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 e10725f767..ab0378e4ad 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 @@ -12,13 +12,13 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction private const val EXTENSION_PLAYER_CONTROLS_VISIBILITY_HOOK_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/PlayerControlsVisibilityHookPatch;" -val PlayerControlsOverlayVisibilityPatch = bytecodePatch { +val playerControlsOverlayVisibilityPatch = bytecodePatch { dependsOn(sharedExtensionPatch) execute { playerControlsVisibilityEntityModelFingerprint.let { it.method.apply { - val startIndex = it.patternMatch!!.startIndex + val startIndex = it.instructionMatches.first().index val iGetReference = getInstruction(startIndex).reference val staticReference = getInstruction(startIndex + 1).reference 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 e5949586de..00edcbe4fd 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 @@ -7,17 +7,24 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.Document import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_35_or_greater -import app.revanced.util.* +import app.revanced.patches.youtube.misc.playservice.is_20_19_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_20_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_28_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_30_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch +import app.revanced.util.copyXmlNode +import app.revanced.util.findElementByAttributeValue +import app.revanced.util.findElementByAttributeValueOrThrow +import app.revanced.util.indexOfFirstInstructionOrThrow +import app.revanced.util.inputStreamFromBundledResource +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.iface.reference.MethodReference -import com.android.tools.smali.dexlib2.iface.reference.TypeReference import org.w3c.dom.Node /** @@ -39,22 +46,7 @@ internal lateinit var addTopControl: (String) -> Unit lateinit var addBottomControl: (String) -> Unit private set -internal var bottom_ui_container_stub_id = -1L - private set -internal var controls_layout_stub_id = -1L - private set -internal var heatseeker_viewstub_id = -1L - private set -internal var fullscreen_button_id = -1L - private set -internal var inset_overlay_view_layout_id = -1L - private set -internal var scrim_overlay_id = -1L - private set - -val playerControlsResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - +internal val playerControlsResourcePatch = resourcePatch { /** * The element to the left of the element being added. */ @@ -68,13 +60,6 @@ val playerControlsResourcePatch = resourcePatch { execute { val targetResourceName = "youtube_controls_bottom_ui_container.xml" - bottom_ui_container_stub_id = resourceMappings["id", "bottom_ui_container_stub"] - controls_layout_stub_id = resourceMappings["id", "controls_layout_stub"] - heatseeker_viewstub_id = resourceMappings["id", "heatseeker_viewstub"] - fullscreen_button_id = resourceMappings["id", "fullscreen_button"] - inset_overlay_view_layout_id = resourceMappings["id", "inset_overlay_view_layout"] - scrim_overlay_id = resourceMappings["id", "scrim_overlay"] - bottomTargetDocument = document("res/layout/$targetResourceName") val bottomTargetElement: Node = bottomTargetDocument.getElementsByTagName( @@ -189,16 +174,16 @@ fun initializeBottomControl(descriptor: String) { * @param descriptor The descriptor of the method which should be called. */ fun injectVisibilityCheckCall(descriptor: String) { - visibilityMethod.addInstruction( - visibilityInsertIndex++, - "invoke-static { p1 , p2 }, $descriptor->setVisibility(ZZ)V", - ) - if (!visibilityImmediateCallbacksExistModified) { visibilityImmediateCallbacksExistModified = true visibilityImmediateCallbacksExistMethod.returnEarly(true) } + visibilityMethod.addInstruction( + visibilityInsertIndex++, + "invoke-static { p1 , p2 }, $descriptor->setVisibility(ZZ)V", + ) + visibilityImmediateMethod.addInstruction( visibilityImmediateInsertIndex++, "invoke-static { p0 }, $descriptor->setVisibilityImmediate(Z)V", @@ -216,24 +201,24 @@ internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/PlayerControlsPatch;" private lateinit var inflateTopControlMethod: MutableMethod -private var inflateTopControlInsertIndex: Int = -1 -private var inflateTopControlRegister: Int = -1 +private var inflateTopControlInsertIndex = -1 +private var inflateTopControlRegister = -1 private lateinit var inflateBottomControlMethod: MutableMethod -private var inflateBottomControlInsertIndex: Int = -1 -private var inflateBottomControlRegister: Int = -1 - -private lateinit var visibilityMethod: MutableMethod -private var visibilityInsertIndex: Int = 0 +private var inflateBottomControlInsertIndex = -1 +private var inflateBottomControlRegister = -1 -private var visibilityImmediateCallbacksExistModified = false private lateinit var visibilityImmediateCallbacksExistMethod : MutableMethod +private var visibilityImmediateCallbacksExistModified = false + +private lateinit var visibilityMethod: MutableMethod +private var visibilityInsertIndex = 0 private lateinit var visibilityImmediateMethod: MutableMethod -private var visibilityImmediateInsertIndex: Int = 0 +private var visibilityImmediateInsertIndex = 0 private lateinit var visibilityNegatedImmediateMethod: MutableMethod -private var visibilityNegatedImmediateInsertIndex: Int = 0 +private var visibilityNegatedImmediateInsertIndex = 0 val playerControlsPatch = bytecodePatch( description = "Manages the code for the player controls of the YouTube player.", @@ -241,30 +226,30 @@ val playerControlsPatch = bytecodePatch( dependsOn( playerControlsResourcePatch, sharedExtensionPatch, - PlayerControlsOverlayVisibilityPatch + resourceMappingPatch, // Used by fingerprints. + playerControlsOverlayVisibilityPatch, + versionCheckPatch ) execute { - fun MutableMethod.indexOfFirstViewInflateOrThrow() = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Landroid/view/ViewStub;" && - reference.name == "inflate" - } + playerBottomControlsInflateFingerprint.let { + it.method.apply { + inflateBottomControlMethod = this - playerBottomControlsInflateFingerprint.method.apply { - inflateBottomControlMethod = this - - val inflateReturnObjectIndex = indexOfFirstViewInflateOrThrow() + 1 - inflateBottomControlRegister = getInstruction(inflateReturnObjectIndex).registerA - inflateBottomControlInsertIndex = inflateReturnObjectIndex + 1 + val inflateReturnObjectIndex = it.instructionMatches.last().index + inflateBottomControlRegister = getInstruction(inflateReturnObjectIndex).registerA + inflateBottomControlInsertIndex = inflateReturnObjectIndex + 1 + } } - playerTopControlsInflateFingerprint.method.apply { - inflateTopControlMethod = this + playerTopControlsInflateFingerprint.let { + it.method.apply { + inflateTopControlMethod = this - val inflateReturnObjectIndex = indexOfFirstViewInflateOrThrow() + 1 - inflateTopControlRegister = getInstruction(inflateReturnObjectIndex).registerA - inflateTopControlInsertIndex = inflateReturnObjectIndex + 1 + val inflateReturnObjectIndex = it.instructionMatches.last().index + inflateTopControlRegister = getInstruction(inflateReturnObjectIndex).registerA + inflateTopControlInsertIndex = inflateReturnObjectIndex + 1 + } } visibilityMethod = controlsOverlayVisibilityFingerprint.match( @@ -273,29 +258,25 @@ val playerControlsPatch = bytecodePatch( // Hook the fullscreen close button. Used to fix visibility // when seeking and other situations. - overlayViewInflateFingerprint.method.apply { - val resourceIndex = indexOfFirstLiteralInstructionReversedOrThrow(fullscreen_button_id) + overlayViewInflateFingerprint.let { + it.method.apply { + val index = it.instructionMatches.last().index + val register = getInstruction(index).registerA - val index = indexOfFirstInstructionOrThrow(resourceIndex) { - opcode == Opcode.CHECK_CAST && - getReference()?.type == - "Landroid/widget/ImageView;" + addInstruction( + index + 1, + "invoke-static { v$register }, " + + "$EXTENSION_CLASS_DESCRIPTOR->setFullscreenCloseButton(Landroid/widget/ImageView;)V", + ) } - val register = getInstruction(index).registerA - - addInstruction( - index + 1, - "invoke-static { v$register }, " + - "$EXTENSION_CLASS_DESCRIPTOR->setFullscreenCloseButton(Landroid/widget/ImageView;)V", - ) } visibilityImmediateCallbacksExistMethod = playerControlsExtensionHookListenersExistFingerprint.method visibilityImmediateMethod = playerControlsExtensionHookFingerprint.method - motionEventFingerprint.match(youtubeControlsOverlayFingerprint.originalClassDef).method.apply { - visibilityNegatedImmediateMethod = this - visibilityNegatedImmediateInsertIndex = indexOfTranslationInstruction(this) + 1 + motionEventFingerprint.match(youtubeControlsOverlayFingerprint.originalClassDef).let { + visibilityNegatedImmediateMethod = it.method + visibilityNegatedImmediateInsertIndex = it.instructionMatches.first().index + 1 } // A/B test for a slightly different bottom overlay controls, @@ -306,24 +287,30 @@ val playerControlsPatch = bytecodePatch( playerBottomControlsExploderFeatureFlagFingerprint.method.returnLate(false) } - // A/B test of new top overlay controls. Two different layouts can be used: + // A/B test of different top overlay controls. Two different layouts can be used: // youtube_cf_navigation_improvement_controls_layout.xml // youtube_cf_minimal_impact_controls_layout.xml // - // Visually there is no noticeable difference between either of these compared to the default. - // There is additional logic that is active when youtube_cf_navigation_improvement_controls_layout - // is active, but what it does is not entirely clear. - // - // For now force this a/b feature off as it breaks the top player buttons. - if (is_19_25_or_greater) { + // Flag was removed in 20.19+ + if (is_19_25_or_greater && !is_20_19_or_greater) { playerTopControlsExperimentalLayoutFeatureFlagFingerprint.method.apply { val index = indexOfFirstInstructionOrThrow(Opcode.MOVE_RESULT_OBJECT) val register = getInstruction(index).registerA - addInstruction( - index + 1, - "const-string v$register, \"default\"" - ) + addInstruction(index + 1, "const-string v$register, \"default\"") + } + } + + // 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) + + if (is_20_28_or_greater) { + playerControlsLargeOverlayButtonsFeatureFlagFingerprint.method.returnLate(false) + } + + if (is_20_30_or_greater) { + playerControlsButtonStrokeFeatureFlagFingerprint.method.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 522d06b204..f3a4dba5b8 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,35 +1,59 @@ package app.revanced.patches.youtube.misc.playertype import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.opcode +import app.revanced.patcher.string +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val playerTypeFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("L") - opcodes( - Opcode.IF_NE, - Opcode.RETURN_VOID, +internal val playerTypeEnumFingerprint by fingerprint { + accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) + strings( + "NONE", + "HIDDEN", + "WATCH_WHILE_MINIMIZED", + "WATCH_WHILE_MAXIMIZED", + "WATCH_WHILE_FULLSCREEN", + "WATCH_WHILE_SLIDING_MAXIMIZED_FULLSCREEN", + "WATCH_WHILE_SLIDING_MINIMIZED_MAXIMIZED", + "WATCH_WHILE_SLIDING_MINIMIZED_DISMISSED", + "INLINE_MINIMAL", + "VIRTUAL_REALITY_FULLSCREEN", + "WATCH_WHILE_PICTURE_IN_PICTURE", ) - custom { _, classDef -> classDef.endsWith("/YouTubePlayerOverlaysLayout;") } } -internal val reelWatchPagerFingerprint = fingerprint { +internal val reelWatchPagerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") - literal { reelWatchPlayerId } + instructions( + resourceLiteral(ResourceType.ID, "reel_watch_player"), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 10) + ) +} + +internal val videoStateEnumFingerprint by fingerprint { + accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) + parameters() + strings( + "NEW", + "PLAYING", + "PAUSED", + "RECOVERABLE_ERROR", + "UNRECOVERABLE_ERROR", + "ENDED" + ) } -internal val videoStateFingerprint = fingerprint { +// 20.33 and lower class name ControlsState. 20.34+ class name is obfuscated. +internal val controlsStateToStringFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters("Lcom/google/android/libraries/youtube/player/features/overlay/controls/ControlsState;") - opcodes( - Opcode.CONST_4, - Opcode.IF_EQZ, - Opcode.IF_EQZ, - Opcode.IGET_OBJECT, // obfuscated parameter field name + parameters() + returns("Ljava/lang/String;") + instructions( + string("videoState"), + string("isBuffering") ) } 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 b14de0cbea..b2628cdcf0 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 @@ -3,64 +3,82 @@ package app.revanced.patches.youtube.misc.playertype import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.fieldAccess +import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/PlayerTypeHookPatch;" -internal var reelWatchPlayerId = -1L - private set - -private val playerTypeHookResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - reelWatchPlayerId = resourceMappings["id", "reel_watch_player"] - } -} - val playerTypeHookPatch = bytecodePatch( description = "Hook to get the current player type and video playback state.", ) { - dependsOn(sharedExtensionPatch, playerTypeHookResourcePatch) + dependsOn(sharedExtensionPatch, resourceMappingPatch) execute { - playerTypeFingerprint.method.addInstruction( + val playerOverlaysSetPlayerTypeFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters(playerTypeEnumFingerprint.originalClassDef.type) + custom { _, classDef -> + classDef.endsWith("/YouTubePlayerOverlaysLayout;") + } + } + + playerOverlaysSetPlayerTypeFingerprint.method.addInstruction( 0, - "invoke-static {p1}, $EXTENSION_CLASS_DESCRIPTOR->setPlayerType(Ljava/lang/Enum;)V", + "invoke-static { p1 }, $EXTENSION_CLASS_DESCRIPTOR->setPlayerType(Ljava/lang/Enum;)V", ) - reelWatchPagerFingerprint.method.apply { - val literalIndex = indexOfFirstLiteralInstructionOrThrow(reelWatchPlayerId) - val registerIndex = indexOfFirstInstructionOrThrow(literalIndex, Opcode.MOVE_RESULT_OBJECT) - val viewRegister = getInstruction(registerIndex).registerA + reelWatchPagerFingerprint.let { + it.method.apply { + val index = it.instructionMatches.last().index + val register = getInstruction(index).registerA - addInstruction( - registerIndex + 1, - "invoke-static { v$viewRegister }, $EXTENSION_CLASS_DESCRIPTOR->onShortsCreate(Landroid/view/View;)V" - ) + addInstruction( + index + 1, + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->onShortsCreate(Landroid/view/View;)V" + ) + } } - videoStateFingerprint.method.apply { - val endIndex = videoStateFingerprint.patternMatch!!.endIndex - val videoStateFieldName = getInstruction(endIndex).reference + val controlStateType = controlsStateToStringFingerprint.originalClassDef.type - addInstructions( - 0, - """ - iget-object v0, p1, $videoStateFieldName # copy VideoState parameter field - invoke-static {v0}, $EXTENSION_CLASS_DESCRIPTOR->setVideoState(Ljava/lang/Enum;)V - """ + val videoStateFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters(controlStateType) + instructions( + // Obfuscated parameter field name. + fieldAccess( + definingClass = controlStateType, + type = videoStateEnumFingerprint.originalClassDef.type + ), + resourceLiteral(ResourceType.STRING, "accessibility_play"), + resourceLiteral(ResourceType.STRING, "accessibility_pause") ) } + + videoStateFingerprint.let { + it.method.apply { + val videoStateFieldName = getInstruction( + it.instructionMatches.first().index + ).reference + + addInstructions( + 0, + """ + iget-object v0, p1, $videoStateFieldName # copy VideoState parameter field + invoke-static {v0}, $EXTENSION_CLASS_DESCRIPTOR->setVideoState(Ljava/lang/Enum;)V + """ + ) + } + } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index 4b29ca62c7..62f8f560b5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -5,15 +5,6 @@ package app.revanced.patches.youtube.misc.playservice import app.revanced.patcher.patch.resourcePatch import app.revanced.util.findElementByAttributeValueOrThrow -@Deprecated("19.34.42 is the lowest supported version") -var is_19_03_or_greater = false - private set -@Deprecated("19.34.42 is the lowest supported version") -var is_19_04_or_greater = false - private set -@Deprecated("19.34.42 is the lowest supported version") -var is_19_16_or_greater = false - private set @Deprecated("19.34.42 is the lowest supported version") var is_19_17_or_greater = false private set @@ -70,6 +61,24 @@ var is_20_14_or_greater = false private set var is_20_15_or_greater = false private set +var is_20_19_or_greater = false + private set +var is_20_20_or_greater = false + private set +var is_20_21_or_greater = false + private set +var is_20_22_or_greater = false + private set +var is_20_26_or_greater = false + private set +var is_20_28_or_greater = false + private set +var is_20_30_or_greater = false + private set +var is_20_31_or_greater = false + private set +var is_20_34_or_greater = false + private set val versionCheckPatch = resourcePatch( description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", @@ -85,9 +94,6 @@ val versionCheckPatch = resourcePatch( } // All bug fix releases always seem to use the same play store version as the minor version. - is_19_03_or_greater = 240402000 <= playStoreServicesVersion - is_19_04_or_greater = 240502000 <= playStoreServicesVersion - is_19_16_or_greater = 241702000 <= playStoreServicesVersion is_19_17_or_greater = 241802000 <= playStoreServicesVersion is_19_18_or_greater = 241902000 <= playStoreServicesVersion is_19_23_or_greater = 242402000 <= playStoreServicesVersion @@ -112,5 +118,14 @@ val versionCheckPatch = resourcePatch( is_20_10_or_greater = 251105000 <= playStoreServicesVersion is_20_14_or_greater = 251505000 <= playStoreServicesVersion is_20_15_or_greater = 251605000 <= playStoreServicesVersion + is_20_19_or_greater = 252005000 <= playStoreServicesVersion + is_20_20_or_greater = 252105000 <= playStoreServicesVersion + is_20_21_or_greater = 252205000 <= playStoreServicesVersion + is_20_22_or_greater = 252305000 <= playStoreServicesVersion + is_20_26_or_greater = 252705000 <= playStoreServicesVersion + is_20_28_or_greater = 252905000 <= playStoreServicesVersion + is_20_30_or_greater = 253105000 <= playStoreServicesVersion + is_20_31_or_greater = 253205000 <= playStoreServicesVersion + is_20_34_or_greater = 253505000 <= playStoreServicesVersion } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/Fingerprints.kt index 72734bba70..f7d5fc0d4c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/Fingerprints.kt @@ -1,44 +1,69 @@ package app.revanced.patches.youtube.misc.privacy -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags +import app.revanced.patcher.checkCast +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patcher.string +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode -internal val copyTextFingerprint = fingerprint { +internal val copyTextFingerprint by fingerprint { returns("V") parameters("L", "Ljava/util/Map;") - opcodes( - Opcode.IGET_OBJECT, // Contains the text to copy to be sanitized. - Opcode.CONST_STRING, - Opcode.INVOKE_STATIC, // ClipData.newPlainText - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.IGET_OBJECT, - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.RETURN_VOID, + instructions( + opcode(Opcode.IGET_OBJECT), + string("text/plain", maxAfter = 2), + methodCall( + smali = "Landroid/content/ClipData;->newPlainText(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/content/ClipData;", + maxAfter = 2 + ), + opcode(Opcode.MOVE_RESULT_OBJECT, maxAfter = 2), + methodCall( + smali = "Landroid/content/ClipboardManager;->setPrimaryClip(Landroid/content/ClipData;)V", + maxAfter = 2 + ) ) - strings("text/plain") } -internal val systemShareSheetFingerprint = fingerprint { +internal val youtubeShareSheetFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "Ljava/util/Map;") - opcodes( - Opcode.CHECK_CAST, - Opcode.GOTO, + instructions( + methodCall( + smali = "Landroid/content/Intent;->setClassName(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;" + ), + + methodCall( + smali = "Ljava/util/List;->iterator()Ljava/util/Iterator;", + maxAfter = 4 + ), + + fieldAccess( + opcode = Opcode.IGET_OBJECT, + type = "Ljava/lang/String;", + maxAfter = 15 + ), + + methodCall( + smali = "Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;", + maxAfter = 15 + ) ) - strings("YTShare_Logging_Share_Intent_Endpoint_Byte_Array") } -internal val youtubeShareSheetFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) +internal val systemShareSheetFingerprint by fingerprint { returns("V") parameters("L", "Ljava/util/Map;") - opcodes( - Opcode.CHECK_CAST, - Opcode.GOTO, - Opcode.MOVE_OBJECT, - Opcode.INVOKE_VIRTUAL, + instructions( + opcode(Opcode.IGET_OBJECT), + checkCast("Ljava/lang/String;", maxAfter = 0), + opcode(Opcode.GOTO, maxAfter = 0), + + methodCall(smali = "Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;"), + + string("YTShare_Logging_Share_Intent_Endpoint_Byte_Array") ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt index 235572eaae..bee7b27904 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt @@ -1,23 +1,23 @@ package app.revanced.patches.youtube.misc.privacy import app.revanced.patcher.Fingerprint -import app.revanced.patcher.Match import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod 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.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +import app.revanced.util.addInstructionsAtControlFlowLabel +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/RemoveTrackingQueryParameterPatch;" +// TODO: Rename this to "Sanitize sharing links" to be consistent with other apps. val removeTrackingQueryParameterPatch = bytecodePatch( name = "Remove tracking query parameter", description = "Adds an option to remove the tracking parameter from links you share.", @@ -46,34 +46,39 @@ val removeTrackingQueryParameterPatch = bytecodePatch( SwitchPreference("revanced_remove_tracking_query_parameter"), ) - fun Fingerprint.hook( - getInsertIndex: Match.PatternMatch.() -> Int, - getUrlRegister: MutableMethod.(insertIndex: Int) -> Int, - ) { - val insertIndex = patternMatch!!.getInsertIndex() - val urlRegister = method.getUrlRegister(insertIndex) + fun Fingerprint.hookUrlString(matchIndex: Int) { + val index = instructionMatches[matchIndex].index + val urlRegister = method.getInstruction(index).registerA method.addInstructions( - insertIndex, + index + 1, """ - invoke-static {v$urlRegister}, $EXTENSION_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; + invoke-static { v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; move-result-object v$urlRegister - """, + """ ) } - // YouTube share sheet.\ - youtubeShareSheetFingerprint.hook(getInsertIndex = { startIndex + 1 }) { insertIndex -> - getInstruction(insertIndex - 1).registerA - } + fun Fingerprint.hookIntentPutExtra(matchIndex: Int) { + val index = instructionMatches[matchIndex].index + val urlRegister = method.getInstruction(index).registerE - // Native system share sheet. - systemShareSheetFingerprint.hook(getInsertIndex = { endIndex }) { insertIndex -> - getInstruction(insertIndex - 1).registerA + method.addInstructionsAtControlFlowLabel( + index, + """ + invoke-static { v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$urlRegister + """ + ) } - copyTextFingerprint.hook(getInsertIndex = { startIndex + 2 }) { insertIndex -> - getInstruction(insertIndex - 2).registerA - } + // YouTube share sheet copy link. + copyTextFingerprint.hookUrlString(0) + + // YouTube share sheet other apps. + youtubeShareSheetFingerprint.hookIntentPutExtra(3) + + // Native system share sheet. + systemShareSheetFingerprint.hookIntentPutExtra(3) } } 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 09aa7bf4cd..a2bf2ee303 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 @@ -4,9 +4,8 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val recyclerViewTreeObserverFingerprint = fingerprint { +internal val recyclerViewTreeObserverFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") opcodes( Opcode.CHECK_CAST, Opcode.NEW_INSTANCE, 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 58033a223e..10a4120d09 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 @@ -12,7 +12,7 @@ val recyclerViewTreeHookPatch = bytecodePatch { execute { recyclerViewTreeObserverFingerprint.method.apply { - val insertIndex = recyclerViewTreeObserverFingerprint.patternMatch!!.startIndex + 1 + val insertIndex = recyclerViewTreeObserverFingerprint.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 3dd3816b52..4c05549604 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,29 +1,36 @@ package app.revanced.patches.youtube.misc.settings import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.opcode +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode -internal val licenseActivityOnCreateFingerprint = fingerprint { +internal val licenseActivityOnCreateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") - parameters("L") + parameters("Landroid/os/Bundle;") custom { method, classDef -> - classDef.endsWith("LicenseActivity;") && method.name == "onCreate" + method.name == "onCreate" && classDef.endsWith("/LicenseActivity;") } } -internal val setThemeFingerprint = fingerprint { +internal val setThemeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() - literal { appearanceStringId } + instructions( + resourceLiteral(ResourceType.STRING, "app_theme_appearance_dark"), + ) } -internal const val CAIRO_CONFIG_LITERAL_VALUE = 45532100L - -internal val cairoFragmentConfigFingerprint = fingerprint { +internal val cairoFragmentConfigFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") - literal { CAIRO_CONFIG_LITERAL_VALUE } -} + instructions( + literal(45532100L), + opcode(Opcode.MOVE_RESULT, 10) + ) +} \ No newline at end of file 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 672999b6a6..4a83324e1d 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 @@ -8,9 +8,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMu import app.revanced.patches.all.misc.packagename.setOrGetFallbackPackageName import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.overrideThemeColors import app.revanced.patches.shared.misc.settings.preference.* import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting @@ -32,9 +30,6 @@ import com.android.tools.smali.dexlib2.util.MethodUtil private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/settings/LicenseActivityHook;" -internal var appearanceStringId = -1L - private set - private val preferences = mutableSetOf() fun addSettingPreference(screen: BasePreference) { @@ -70,8 +65,6 @@ private val settingsResourcePatch = resourcePatch { ) execute { - appearanceStringId = resourceMappings["string", "app_theme_appearance_dark"] - // Use same colors as stock YouTube. overrideThemeColors("@color/yt_white1", "@color/yt_black3") @@ -221,14 +214,19 @@ val settingsPatch = bytecodePatch( // Modify the license activity and remove all existing layout code. // Must modify an existing activity and cannot add a new activity to the manifest, // as that fails for root installations. - - licenseActivityOnCreateFingerprint.method.addInstructions( - 1, - """ - invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->initialize(Landroid/app/Activity;)V - return-void - """ - ) + licenseActivityOnCreateFingerprint.let { + val superClass = it.classDef.superclass + + it.method.addInstructions( + 0, + """ + # Some targets have extra instructions before the call to super method. + invoke-super { p0, p1 }, $superClass->onCreate(Landroid/os/Bundle;)V + invoke-static { p0 }, $EXTENSION_CLASS_DESCRIPTOR->initialize(Landroid/app/Activity;)V + return-void + """ + ) + } // Remove other methods as they will break as the onCreate method is modified above. licenseActivityOnCreateFingerprint.classDef.apply { @@ -315,11 +313,13 @@ val settingsPatch = bytecodePatch( } // Add setting to force cairo settings fragment on/off. - cairoFragmentConfigFingerprint.method.insertLiteralOverride( - CAIRO_CONFIG_LITERAL_VALUE, - "$EXTENSION_CLASS_DESCRIPTOR->useCairoSettingsFragment(Z)Z" - ) - } + cairoFragmentConfigFingerprint.let { + it.method.insertLiteralOverride( + it.instructionMatches.last().index, + "$EXTENSION_CLASS_DESCRIPTOR->useCairoSettingsFragment(Z)Z" + ) + } + } finalize { PreferenceScreen.close() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt deleted file mode 100644 index 44cde6002b..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt +++ /dev/null @@ -1,11 +0,0 @@ -package app.revanced.patches.youtube.misc.zoomhaptics - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.misc.hapticfeedback.disableHapticFeedbackPatch - -@Deprecated("Superseded by disableHapticFeedbackPatch", ReplaceWith("disableHapticFeedbackPatch")) -val zoomHapticsPatch = bytecodePatch( - description = "Adds an option to disable haptics when zooming.", -) { - dependsOn(disableHapticFeedbackPatch) -} \ No newline at end of file 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 4a9f3a020b..3272c913e0 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 @@ -1,10 +1,18 @@ package app.revanced.patches.youtube.shared +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.newInstance +import app.revanced.patcher.opcode +import app.revanced.patcher.string +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val conversionContextFingerprintToString = fingerprint { +internal val conversionContextFingerprintToString by fingerprint { parameters() strings( "ConversionContext{containerInternal=", @@ -19,7 +27,7 @@ internal val conversionContextFingerprintToString = fingerprint { } } -internal val autoRepeatFingerprint = fingerprint { +internal val autoRepeatFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -28,23 +36,27 @@ internal val autoRepeatFingerprint = fingerprint { } } -internal val autoRepeatParentFingerprint = fingerprint { +internal val autoRepeatParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") - strings( - "play() called when the player wasn't loaded.", - "play() blocked because Background Playability failed", + instructions( + string("play() called when the player wasn't loaded."), + string("play() blocked because Background Playability failed") ) } -internal val layoutConstructorFingerprint = fingerprint { +internal val layoutConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") - parameters() - strings("1.0x") + instructions( + literal(159962), + resourceLiteral(ResourceType.ID, "player_control_previous_button_touch_area"), + resourceLiteral(ResourceType.ID, "player_control_next_button_touch_area"), + methodCall(parameters = listOf("Landroid/view/View;", "I")) + ) } -internal val mainActivityConstructorFingerprint = fingerprint { +internal val mainActivityConstructorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters() custom { _, classDef -> @@ -52,7 +64,7 @@ internal val mainActivityConstructorFingerprint = fingerprint { } } -internal val mainActivityOnBackPressedFingerprint = fingerprint { +internal val mainActivityOnBackPressedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -61,7 +73,7 @@ internal val mainActivityOnBackPressedFingerprint = fingerprint { } } -internal val mainActivityOnCreateFingerprint = fingerprint { +internal val mainActivityOnCreateFingerprint by fingerprint { returns("V") parameters("Landroid/os/Bundle;") custom { method, classDef -> @@ -69,7 +81,7 @@ internal val mainActivityOnCreateFingerprint = fingerprint { } } -internal val rollingNumberTextViewAnimationUpdateFingerprint = fingerprint { +internal val rollingNumberTextViewAnimationUpdateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/graphics/Bitmap;") @@ -95,54 +107,42 @@ internal val rollingNumberTextViewAnimationUpdateFingerprint = fingerprint { } } -internal val seekbarFingerprint = fingerprint { +internal val seekbarFingerprint by fingerprint { returns("V") - strings("timed_markers_width") + instructions( + string("timed_markers_width"), + ) } -internal val seekbarOnDrawFingerprint = fingerprint { +/** + * Matches to _mutable_ class found in [seekbarFingerprint]. + */ +internal val seekbarOnDrawFingerprint by fingerprint { + instructions( + methodCall(smali = "Ljava/lang/Math;->round(F)I"), + opcode(Opcode.MOVE_RESULT, maxAfter = 0) + ) custom { method, _ -> method.name == "onDraw" } } -internal val subtitleButtonControllerFingerprint = fingerprint { +internal val subtitleButtonControllerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lcom/google/android/libraries/youtube/player/subtitles/model/SubtitleTrack;") - opcodes( - Opcode.IGET_OBJECT, - Opcode.IF_NEZ, - Opcode.RETURN_VOID, - Opcode.IGET_BOOLEAN, - Opcode.CONST_4, - Opcode.IF_NEZ, - Opcode.CONST, - Opcode.INVOKE_VIRTUAL, - Opcode.IGET_OBJECT, + instructions( + resourceLiteral(ResourceType.STRING, "accessibility_captions_unavailable"), + resourceLiteral(ResourceType.STRING, "accessibility_captions_button_name"), ) } -internal val videoQualityChangedFingerprint = fingerprint { +internal val videoQualityChangedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L") - opcodes( - Opcode.IGET, // Video resolution (human readable). - Opcode.IGET_OBJECT, - Opcode.IGET_BOOLEAN, - Opcode.IGET_OBJECT, - Opcode.INVOKE_STATIC, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_DIRECT, - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.GOTO, - Opcode.CONST_4, - Opcode.IF_NE, - Opcode.IGET_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IGET, + instructions( + newInstance("Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;"), + opcode(Opcode.IGET_OBJECT), + opcode(Opcode.CHECK_CAST), + fieldAccess(type = "I", opcode = Opcode.IGET, maxAfter = 0), // Video resolution (human readable). ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt index 8e3755bc80..a9cdc2ecf6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.util.containsLiteralInstruction import com.android.tools.smali.dexlib2.AccessFlags -internal val formatStreamModelToStringFingerprint = fingerprint { +internal val formatStreamModelToStringFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") custom { method, classDef -> @@ -15,7 +15,7 @@ internal val formatStreamModelToStringFingerprint = fingerprint { internal const val AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG = 45666189L -internal val selectAudioStreamFingerprint = fingerprint { +internal val selectAudioStreamFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt index 74b0e0864b..5327e62448 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt @@ -1,18 +1,22 @@ package app.revanced.patches.youtube.video.information +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import app.revanced.patches.youtube.shared.videoQualityChangedFingerprint import app.revanced.util.getReference 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 createVideoPlayerSeekbarFingerprint = fingerprint { +internal val createVideoPlayerSeekbarFingerprint by fingerprint { returns("V") - strings("timed_markers_width") + instructions( + string("timed_markers_width"), + ) } -internal val onPlaybackSpeedItemClickFingerprint = fingerprint { +internal val onPlaybackSpeedItemClickFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L", "I", "J") @@ -25,23 +29,27 @@ internal val onPlaybackSpeedItemClickFingerprint = fingerprint { } } -internal val playerControllerSetTimeReferenceFingerprint = fingerprint { +internal val playerControllerSetTimeReferenceFingerprint by fingerprint { opcodes(Opcode.INVOKE_DIRECT_RANGE, Opcode.IGET_OBJECT) strings("Media progress reported outside media playback: ") } -internal val playerInitFingerprint = fingerprint { - strings("playVideo called on player response with no videoStreamingData.") +internal val playerInitFingerprint by fingerprint { + instructions( + string("playVideo called on player response with no videoStreamingData."), + ) } /** * Matched using class found in [playerInitFingerprint]. */ -internal val seekFingerprint = fingerprint { - strings("Attempting to seek during an ad") +internal val seekFingerprint by fingerprint { + instructions( + string("Attempting to seek during an ad"), + ) } -internal val videoLengthFingerprint = fingerprint { +internal val videoLengthFingerprint by fingerprint { opcodes( Opcode.MOVE_RESULT_WIDE, Opcode.CMP_LONG, @@ -61,7 +69,7 @@ internal val videoLengthFingerprint = fingerprint { /** * Matches using class found in [mdxPlayerDirectorSetVideoStageFingerprint]. */ -internal val mdxSeekFingerprint = fingerprint { +internal val mdxSeekFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters("J", "L") @@ -78,19 +86,20 @@ internal val mdxSeekFingerprint = fingerprint { } } -internal val mdxPlayerDirectorSetVideoStageFingerprint = fingerprint { - strings("MdxDirector setVideoStage ad should be null when videoStage is not an Ad state ") +internal val mdxPlayerDirectorSetVideoStageFingerprint by fingerprint { + instructions( + string("MdxDirector setVideoStage ad should be null when videoStage is not an Ad state "), + ) } /** * Matches using class found in [mdxPlayerDirectorSetVideoStageFingerprint]. */ -internal val mdxSeekRelativeFingerprint = fingerprint { +internal val mdxSeekRelativeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) // Return type is boolean up to 19.39, and void with 19.39+. parameters("J", "L") opcodes( - Opcode.IGET_OBJECT, Opcode.INVOKE_INTERFACE, ) @@ -99,7 +108,7 @@ internal val mdxSeekRelativeFingerprint = fingerprint { /** * Matches using class found in [playerInitFingerprint]. */ -internal val seekRelativeFingerprint = fingerprint { +internal val seekRelativeFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) // Return type is boolean up to 19.39, and void with 19.39+. parameters("J", "L") @@ -112,19 +121,16 @@ internal val seekRelativeFingerprint = fingerprint { /** * Resolves with the class found in [videoQualityChangedFingerprint]. */ -internal val playbackSpeedMenuSpeedChangedFingerprint = fingerprint { +internal val playbackSpeedMenuSpeedChangedFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L") - opcodes( - Opcode.IGET, - Opcode.INVOKE_VIRTUAL, - Opcode.SGET_OBJECT, - Opcode.RETURN_OBJECT, + instructions( + fieldAccess(opcode = Opcode.IGET, type = "F") ) } -internal val playbackSpeedClassFingerprint = fingerprint { +internal val playbackSpeedClassFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L") @@ -137,10 +143,27 @@ internal val playbackSpeedClassFingerprint = fingerprint { internal const val YOUTUBE_VIDEO_QUALITY_CLASS_TYPE = "Lcom/google/android/libraries/youtube/innertube/model/media/VideoQuality;" -internal val videoQualityFingerprint = fingerprint { +/** + * YouTube 20.19 and lower. + */ +internal val videoQualityLegacyFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) + parameters( + "I", // Resolution. + "Ljava/lang/String;", // Human readable resolution: "480p", "1080p Premium", etc + "Z", + "L" + ) + custom { _, classDef -> + classDef.type == YOUTUBE_VIDEO_QUALITY_CLASS_TYPE + } +} + +internal val videoQualityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters( "I", // Resolution. + "L", "Ljava/lang/String;", // Human readable resolution: "480p", "1080p Premium", etc "Z", "L" @@ -150,7 +173,7 @@ internal val videoQualityFingerprint = fingerprint { } } -internal val videoQualitySetterFingerprint = fingerprint { +internal val videoQualitySetterFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("[L", "I", "Z") @@ -167,7 +190,7 @@ internal val videoQualitySetterFingerprint = fingerprint { /** * Matches with the class found in [videoQualitySetterFingerprint]. */ -internal val setVideoQualityFingerprint = fingerprint { +internal val setVideoQualityFingerprint by fingerprint { returns("V") parameters("L") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index 368aff634d..05738010c3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -9,6 +9,9 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patcher.util.smali.toInstructions import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_20_19_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_20_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.shared.videoQualityChangedFingerprint import app.revanced.patches.youtube.video.playerresponse.Hook import app.revanced.patches.youtube.video.playerresponse.addPlayerResponseMethodHook @@ -82,6 +85,7 @@ val videoInformationPatch = bytecodePatch( sharedExtensionPatch, videoIdPatch, playerResponseMethodHookPatch, + versionCheckPatch, ) execute { @@ -127,12 +131,12 @@ val videoInformationPatch = bytecodePatch( val videoLengthMethodMatch = videoLengthFingerprint.match(originalClassDef) videoLengthMethodMatch.method.apply { - val videoLengthRegisterIndex = videoLengthMethodMatch.patternMatch!!.endIndex - 2 + val videoLengthRegisterIndex = videoLengthMethodMatch.instructionMatches.last().index - 2 val videoLengthRegister = getInstruction(videoLengthRegisterIndex).registerA val dummyRegisterForLong = videoLengthRegister + 1 // required for long values since they are wide addInstruction( - videoLengthMethodMatch.patternMatch!!.endIndex, + videoLengthMethodMatch.instructionMatches.last().index, "invoke-static {v$videoLengthRegister, v$dummyRegisterForLong}, " + "$EXTENSION_CLASS_DESCRIPTOR->setVideoLength(J)V", ) @@ -161,7 +165,7 @@ val videoInformationPatch = bytecodePatch( * Set the video time method */ timeMethod = navigate(playerControllerSetTimeReferenceFingerprint.originalMethod) - .to(playerControllerSetTimeReferenceFingerprint.patternMatch!!.startIndex) + .to(playerControllerSetTimeReferenceFingerprint.instructionMatches.first().index) .stop() /* @@ -188,8 +192,8 @@ val videoInformationPatch = bytecodePatch( getInstruction(indexOfFirstInstructionOrThrow(Opcode.IF_EQZ) - 1).reference as FieldReference setPlaybackSpeedMethod = - proxy(classes.first { it.type == setPlaybackSpeedMethodReference.definingClass }) - .mutableClass.methods.first { it.name == setPlaybackSpeedMethodReference.name } + mutableClassBy(setPlaybackSpeedMethodReference.definingClass) + .methods.first { it.name == setPlaybackSpeedMethodReference.name } setPlaybackSpeedMethodIndex = 0 // Add override playback speed method. @@ -262,20 +266,23 @@ val videoInformationPatch = bytecodePatch( // Handle new playback speed menu. playbackSpeedMenuSpeedChangedFingerprint.match( videoQualityChangedFingerprint.originalClassDef, - ).method.apply { - val index = indexOfFirstInstructionOrThrow(Opcode.IGET) + ).let { + it.method.apply { + val index = it.instructionMatches.first().index - speedSelectionInsertMethod = this - speedSelectionInsertIndex = index + 1 - speedSelectionValueRegister = getInstruction(index).registerA + speedSelectionInsertMethod = this + speedSelectionInsertIndex = index + 1 + speedSelectionValueRegister = getInstruction(index).registerA + } } - videoQualityFingerprint.let { + (if (is_20_19_or_greater) videoQualityFingerprint else videoQualityLegacyFingerprint).let { // Fix bad data used by YouTube. + val nameRegister = if (is_20_20_or_greater) "p3" else "p2" it.method.addInstructions( 0, """ - invoke-static { p2, p1 }, $EXTENSION_CLASS_DESCRIPTOR->fixVideoQualityResolution(Ljava/lang/String;I)I + invoke-static { $nameRegister, p1 }, $EXTENSION_CLASS_DESCRIPTOR->fixVideoQualityResolution(Ljava/lang/String;I)I move-result p1 """ ) @@ -345,11 +352,7 @@ val videoInformationPatch = bytecodePatch( val setQualityFieldReference = match.method .getInstruction(1).reference as FieldReference - proxy( - classes.find { classDef -> - classDef.type == setQualityFieldReference.type - }!! - ).mutableClass.apply { + mutableClassBy(setQualityFieldReference.type).apply { // Add interface and helper methods to allow extension code to call obfuscated methods. interfaces.add(EXTENSION_VIDEO_QUALITY_MENU_INTERFACE) 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 d958285b4d..7d0d3b1092 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,13 @@ package app.revanced.patches.youtube.video.playerresponse import app.revanced.patcher.fingerprint +import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags -import org.stringtemplate.v4.compiler.Bytecode.instructions /** - * For targets 20.15 and later. + * For targets 20.26 and later. */ -internal val playerParameterBuilderFingerprint = fingerprint { +internal val playerParameterBuilderFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( @@ -25,15 +25,46 @@ internal val playerParameterBuilderFingerprint = fingerprint { "L", "Z", // Appears to indicate if the video id is being opened or is currently playing. "Z", - "Z" + "Z", + "Lj\$/time/Duration;" + ) + instructions( + string("psps") + ) +} + +/** + * For targets 20.15 to 20.25 + */ +internal val playerParameterBuilder2015Fingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("L") + parameters( + "Ljava/lang/String;", // VideoId. + "[B", + "Ljava/lang/String;", // Player parameters proto buffer. + "Ljava/lang/String;", + "I", + "Z", + "I", + "L", + "Ljava/util/Set;", + "Ljava/lang/String;", + "Ljava/lang/String;", + "L", + "Z", // Appears to indicate if the video id is being opened or is currently playing. + "Z", + "Z", + ) + instructions( + string("psps") ) - strings("psps") } /** * For targets 20.10 to 20.14. */ -internal val playerParameterBuilder2010Fingerprint = fingerprint { +internal val playerParameterBuilder2010Fingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( @@ -54,13 +85,15 @@ internal val playerParameterBuilder2010Fingerprint = fingerprint { "Z", "Z" ) - strings("psps") + instructions( + string("psps") + ) } /** * For targets 20.02 to 20.09. */ -internal val playerParameterBuilder2002Fingerprint = fingerprint { +internal val playerParameterBuilder2002Fingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( @@ -80,13 +113,15 @@ internal val playerParameterBuilder2002Fingerprint = fingerprint { "Z", "Z", ) - strings("psps") + instructions( + string("psps"), + ) } /** * For targets 19.25 to 19.50. */ -internal val playerParameterBuilder1925Fingerprint = fingerprint { +internal val playerParameterBuilder1925Fingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( @@ -105,13 +140,15 @@ internal val playerParameterBuilder1925Fingerprint = fingerprint { "Z", "Z", ) - strings("psps") + instructions( + string("psps") + ) } /** - * For targets 19.24 and earlier. + * For targets 19.01 to 19.24. */ -internal val playerParameterBuilderLegacyFingerprint = fingerprint { +internal val playerParameterBuilderLegacyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( 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 898f400968..34013b4079 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 @@ -10,6 +10,7 @@ import app.revanced.patches.youtube.misc.playservice.is_19_23_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_02_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_10_or_greater 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.versionCheckPatch private val hooks = mutableSetOf() @@ -40,9 +41,12 @@ val playerResponseMethodHookPatch = bytecodePatch { execute { val fingerprint : Fingerprint - if (is_20_15_or_greater) { + if (is_20_26_or_greater) { parameterIsShortAndOpeningOrPlaying = 13 fingerprint = playerParameterBuilderFingerprint + } else if (is_20_15_or_greater) { + parameterIsShortAndOpeningOrPlaying = 13 + fingerprint = playerParameterBuilder2015Fingerprint } else if (is_20_10_or_greater) { parameterIsShortAndOpeningOrPlaying = 13 fingerprint = playerParameterBuilder2010Fingerprint 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 3e8aa23a17..ef7ad9022e 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 @@ -5,12 +5,11 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter @@ -25,23 +24,6 @@ internal var videoQualityBottomSheetListFragmentTitle = -1L internal var videoQualityQuickMenuAdvancedMenuDescription = -1L private set -private val advancedVideoQualityMenuResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - // Used for the old type of the video quality menu. - videoQualityBottomSheetListFragmentTitle = resourceMappings[ - "layout", - "video_quality_bottom_sheet_list_fragment_title", - ] - - videoQualityQuickMenuAdvancedMenuDescription = resourceMappings[ - "string", - "video_quality_quick_menu_advanced_menu_description", - ] - } -} - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/playback/quality/AdvancedVideoQualityMenuPatch;" @@ -50,12 +32,12 @@ private const val FILTER_CLASS_DESCRIPTOR = internal val advancedVideoQualityMenuPatch = bytecodePatch { dependsOn( - advancedVideoQualityMenuResourcePatch, sharedExtensionPatch, settingsPatch, addResourcesPatch, lithoFilterPatch, recyclerViewTreeHookPatch, + resourceMappingPatch ) execute { @@ -65,12 +47,23 @@ internal val advancedVideoQualityMenuPatch = bytecodePatch { SwitchPreference("revanced_advanced_video_quality_menu") ) + // Used for the old type of the video quality menu. + videoQualityBottomSheetListFragmentTitle = getResourceId( + ResourceType.LAYOUT, + "video_quality_bottom_sheet_list_fragment_title", + ) + + videoQualityQuickMenuAdvancedMenuDescription = getResourceId( + ResourceType.STRING, + "video_quality_quick_menu_advanced_menu_description", + ) + // 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 { it.method.apply { - val checkCastIndex = it.patternMatch!!.endIndex + val checkCastIndex = it.instructionMatches.last().index val listViewRegister = getInstruction(checkCastIndex).registerA addInstruction( @@ -83,9 +76,9 @@ internal val advancedVideoQualityMenuPatch = bytecodePatch { // Force YT to add the 'advanced' quality menu for Shorts. videoQualityMenuOptionsFingerprint.let { - val patternMatch = it.patternMatch!! - val startIndex = patternMatch.startIndex - val insertIndex = patternMatch.endIndex + val patternMatch = it.instructionMatches + val startIndex = patternMatch.first().index + val insertIndex = patternMatch.last().index if (startIndex != 0) throw PatchException("Unexpected opcode start index: $startIndex") it.method.apply { 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 09ec88f9c0..44b54b6475 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,19 +1,22 @@ package app.revanced.patches.youtube.video.quality import app.revanced.patcher.fingerprint +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 videoQualityItemOnClickParentFingerprint = fingerprint { +internal val videoQualityItemOnClickParentFingerprint by fingerprint { returns("V") - strings("VIDEO_QUALITIES_MENU_BOTTOM_SHEET_FRAGMENT") + instructions( + string("VIDEO_QUALITIES_MENU_BOTTOM_SHEET_FRAGMENT"), + ) } /** * Resolves to class found in [videoQualityItemOnClickFingerprint]. */ -internal val videoQualityItemOnClickFingerprint = fingerprint { +internal val videoQualityItemOnClickFingerprint by fingerprint { returns("V") parameters( "Landroid/widget/AdapterView;", @@ -27,7 +30,7 @@ internal val videoQualityItemOnClickFingerprint = fingerprint { } -internal val videoQualityMenuOptionsFingerprint = fingerprint { +internal val videoQualityMenuOptionsFingerprint by fingerprint { accessFlags(AccessFlags.STATIC) returns("[L") parameters("Landroid/content/Context", "L", "L") @@ -41,7 +44,7 @@ internal val videoQualityMenuOptionsFingerprint = fingerprint { literal { videoQualityQuickMenuAdvancedMenuDescription } } -internal val videoQualityMenuViewInflateFingerprint = fingerprint { +internal val videoQualityMenuViewInflateFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("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 2f67487c87..45034652fb 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 @@ -9,6 +9,8 @@ import app.revanced.patches.shared.misc.settings.preference.ListPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch +import app.revanced.patches.youtube.misc.playservice.is_20_20_or_greater +import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.shared.videoQualityChangedFingerprint import app.revanced.patches.youtube.video.information.onCreateHook @@ -25,6 +27,7 @@ val rememberVideoQualityPatch = bytecodePatch { playerTypeHookPatch, settingsPatch, addResourcesPatch, + versionCheckPatch, ) execute { @@ -68,16 +71,15 @@ val rememberVideoQualityPatch = bytecodePatch { ) // Inject a call to remember the user selected quality for regular videos. - videoQualityChangedFingerprint.let { - it.method.apply { - val index = it.patternMatch!!.startIndex - val register = getInstruction(index).registerA + videoQualityChangedFingerprint.method.apply { + val index = videoQualityChangedFingerprint.instructionMatches[3].index + val register = getInstruction(index).registerA - addInstruction( - index + 1, - "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->userChangedQuality(I)V", - ) - } + addInstruction( + index + 1, + "invoke-static { v$register }, " + + "$EXTENSION_CLASS_DESCRIPTOR->userChangedQuality(I)V", + ) } } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityDialogButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityDialogButtonPatch.kt index d2618bb63f..0473f29db6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityDialogButtonPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityDialogButtonPatch.kt @@ -13,7 +13,7 @@ import app.revanced.util.ResourceGroup import app.revanced.util.copyResources private val videoQualityButtonResourcePatch = resourcePatch { - dependsOn(playerControlsResourcePatch) + dependsOn(playerControlsPatch) execute { copyResources( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/button/PlaybackSpeedButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/button/PlaybackSpeedButtonPatch.kt index 4885aa0fe0..2d752eb6d8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/button/PlaybackSpeedButtonPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/button/PlaybackSpeedButtonPatch.kt @@ -17,7 +17,7 @@ import app.revanced.util.ResourceGroup import app.revanced.util.copyResources private val playbackSpeedButtonResourcePatch = resourcePatch { - dependsOn(playerControlsResourcePatch) + dependsOn(playerControlsPatch) execute { copyResources( 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 b463755719..f981e31e08 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,34 +7,27 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.proxy.mutableTypes.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.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings 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.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.litho.filter.addLithoFilter import app.revanced.patches.youtube.misc.litho.filter.lithoFilterPatch -import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater +import app.revanced.patches.youtube.misc.playservice.is_19_47_or_greater +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.recyclerviewtree.hook.addRecyclerViewTreeHook import app.revanced.patches.youtube.misc.recyclerviewtree.hook.recyclerViewTreeHookPatch import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.video.speed.settingsMenuVideoSpeedGroup -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstruction import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -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.ImmutableField private const val FILTER_CLASS_DESCRIPTOR = @@ -43,17 +36,6 @@ private const val FILTER_CLASS_DESCRIPTOR = internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch;" -internal var speedUnavailableId = -1L - private set - -private val customPlaybackSpeedResourcePatch = resourcePatch { - dependsOn(resourceMappingPatch) - - execute { - speedUnavailableId = resourceMappings["string", "varispeed_unavailable_message"] - } -} - internal val customPlaybackSpeedPatch = bytecodePatch( description = "Adds custom playback speed options.", ) { @@ -64,7 +46,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( lithoFilterPatch, versionCheckPatch, recyclerViewTreeHookPatch, - customPlaybackSpeedResourcePatch + resourceMappingPatch ) execute { @@ -81,20 +63,17 @@ internal val customPlaybackSpeedPatch = bytecodePatch( ) ) - if (is_19_25_or_greater) { + if (is_19_47_or_greater) { settingsMenuVideoSpeedGroup.add( TextPreference("revanced_speed_tap_and_hold", inputType = InputType.NUMBER_DECIMAL), ) } // Override the min/max speeds that can be used. - speedLimiterFingerprint.method.apply { + (if (is_20_34_or_greater) speedLimiterFingerprint else speedLimiterLegacyFingerprint).method.apply { val limitMinIndex = indexOfFirstLiteralInstructionOrThrow(0.25f) - var limitMaxIndex = indexOfFirstLiteralInstruction(2.0f) - // Newer targets have 4x max speed. - if (limitMaxIndex < 0) { - limitMaxIndex = indexOfFirstLiteralInstructionOrThrow(4.0f) - } + // Older unsupported targets use 2.0f and not 4.0f + val limitMaxIndex = indexOfFirstLiteralInstructionOrThrow(4.0f) val limitMinRegister = getInstruction(limitMinIndex).registerA val limitMaxRegister = getInstruction(limitMaxIndex).registerA @@ -103,42 +82,38 @@ internal val customPlaybackSpeedPatch = bytecodePatch( replaceInstruction(limitMaxIndex, "const/high16 v$limitMaxRegister, 8.0f") } + // region Force old video quality menu. // Replace the speeds float array with custom speeds. - // These speeds are used if the speed menu is immediately opened after a video is opened. - speedArrayGeneratorFingerprint.method.apply { - val sizeCallIndex = indexOfFirstInstructionOrThrow { getReference()?.name == "size" } - val sizeCallResultRegister = getInstruction(sizeCallIndex + 1).registerA - - replaceInstruction(sizeCallIndex + 1, "const/4 v$sizeCallResultRegister, 0x0") - - val arrayLengthConstIndex = indexOfFirstLiteralInstructionOrThrow(7) - val arrayLengthConstDestination = getInstruction(arrayLengthConstIndex).registerA - val playbackSpeedsArrayType = "$EXTENSION_CLASS_DESCRIPTOR->customPlaybackSpeeds:[F" + speedArrayGeneratorFingerprint.let { + val matches = it.instructionMatches + it.method.apply { + val playbackSpeedsArrayType = "$EXTENSION_CLASS_DESCRIPTOR->customPlaybackSpeeds:[F" + // Apply changes from last index to first to preserve indexes. + + val originalArrayFetchIndex = matches[5].index + val originalArrayFetchDestination = matches[5].getInstruction().registerA + replaceInstruction( + originalArrayFetchIndex, + "sget-object v$originalArrayFetchDestination, $playbackSpeedsArrayType" + ) - addInstructions( - arrayLengthConstIndex + 1, - """ - sget-object v$arrayLengthConstDestination, $playbackSpeedsArrayType - array-length v$arrayLengthConstDestination, v$arrayLengthConstDestination - """, - ) + val arrayLengthConstDestination = matches[3].getInstruction().registerA + val newArrayIndex = matches[4].index + addInstructions( + newArrayIndex, + """ + sget-object v$arrayLengthConstDestination, $playbackSpeedsArrayType + array-length v$arrayLengthConstDestination, v$arrayLengthConstDestination + """ + ) - val originalArrayFetchIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.type == "[F" && reference.definingClass.endsWith("/PlayerConfigModel;") + val sizeCallIndex = matches[0].index + 1 + val sizeCallResultRegister = getInstruction(sizeCallIndex).registerA + replaceInstruction(sizeCallIndex, "const/4 v$sizeCallResultRegister, 0x0") } - val originalArrayFetchDestination = - getInstruction(originalArrayFetchIndex).registerA - - replaceInstruction( - originalArrayFetchIndex, - "sget-object v$originalArrayFetchDestination, $playbackSpeedsArrayType", - ) } - // region Force old video quality menu. - // Add a static INSTANCE field to the class. // This is later used to call "showOldPlaybackSpeedMenu" on the instance. @@ -179,28 +154,30 @@ internal val customPlaybackSpeedPatch = bytecodePatch( // endregion - // Close the unpatched playback dialog and show the modern custom dialog. + // Close the unpatched playback dialog and show the custom speeds. addRecyclerViewTreeHook(EXTENSION_CLASS_DESCRIPTOR) // Required to check if the playback speed menu is currently shown. addLithoFilter(FILTER_CLASS_DESCRIPTOR) + // endregion + // region Custom tap and hold 2x speed. - if (is_19_25_or_greater) { - disableFastForwardNoticeFingerprint.method.apply { - val index = indexOfFirstInstructionOrThrow { - (this as? NarrowLiteralInstruction)?.narrowLiteral == 2.0f.toRawBits() - } - val register = getInstruction(index).registerA + if (is_19_47_or_greater) { + customTapAndHoldFingerprint.let { + it.method.apply { + val index = it.instructionMatches.first().index + val register = getInstruction(index).registerA - addInstructions( - index + 1, - """ + addInstructions( + index + 1, + """ 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 f39a4136f1..d738870cfb 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,36 +1,64 @@ package app.revanced.patches.youtube.video.speed.custom +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.newInstance +import app.revanced.patcher.opcode +import app.revanced.patcher.string +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.reference.StringReference -internal val getOldPlaybackSpeedsFingerprint = fingerprint { + +internal val getOldPlaybackSpeedsFingerprint by fingerprint { parameters("[L", "I") strings("menu_item_playback_speed") } -internal val showOldPlaybackSpeedMenuFingerprint = fingerprint { - literal { speedUnavailableId } +internal val showOldPlaybackSpeedMenuFingerprint by fingerprint { + instructions( + resourceLiteral(ResourceType.STRING, "varispeed_unavailable_message") + ) } -internal val showOldPlaybackSpeedMenuExtensionFingerprint = fingerprint { - custom { method, classDef -> - method.name == "showOldPlaybackSpeedMenu" && classDef.type == EXTENSION_CLASS_DESCRIPTOR - } +internal val showOldPlaybackSpeedMenuExtensionFingerprint by fingerprint { + custom { method, _ -> method.name == "showOldPlaybackSpeedMenu" } } -internal val speedArrayGeneratorFingerprint = fingerprint { +internal val speedArrayGeneratorFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("[L") parameters("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;") - strings("0.0#") + instructions( + methodCall(name = "size", returnType = "I"), + newInstance("Ljava/text/DecimalFormat;"), + string("0.0#"), + literal(7), + opcode(Opcode.NEW_ARRAY), + fieldAccess(definingClass = "/PlayerConfigModel;", type = "[F") + ) +} + +/** + * 20.34+ + */ +internal val speedLimiterFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters("F", "Lcom/google/android/libraries/youtube/innertube/model/media/PlayerConfigModel;") + instructions( + literal(0.25f), + literal(4.0f) + ) } -internal val speedLimiterFingerprint = fingerprint { +/** + * 20.33 and lower. + */ +internal val speedLimiterLegacyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("F") @@ -45,16 +73,3 @@ internal val speedLimiterFingerprint = fingerprint { Opcode.INVOKE_STATIC, ) } - -internal val disableFastForwardNoticeFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - custom { method, _ -> - method.name == "run" && method.indexOfFirstInstruction { - // In later targets the code is found in different methods with different strings. - val string = getReference()?.string - string == "Failed to easy seek haptics vibrate." || string == "search_landing_cache_key" - } >= 0 - } -} 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 3924588b42..5c73615f71 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,8 +1,11 @@ package app.revanced.patches.youtube.video.speed.remember import app.revanced.patcher.fingerprint +import app.revanced.patcher.string -internal val initializePlaybackSpeedValuesFingerprint = fingerprint { +internal val initializePlaybackSpeedValuesFingerprint by fingerprint { parameters("[L", "I") - strings("menu_item_playback_speed") + instructions( + string("menu_item_playback_speed"), + ) } 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 6d4a3c6cb8..9c8fbbc23c 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,55 +1,54 @@ package app.revanced.patches.youtube.video.videoid import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val videoIdFingerprint = fingerprint { +internal val videoIdFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") - opcodes( - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, + instructions( + methodCall( + definingClass = "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;", + returnType = "Ljava/lang/String;" + ), + opcode(Opcode.MOVE_RESULT_OBJECT), ) - custom { method, _ -> - method.indexOfPlayerResponseModelString() >= 0 - } } -internal val videoIdBackgroundPlayFingerprint = fingerprint { +internal val videoIdBackgroundPlayFingerprint by fingerprint { accessFlags(AccessFlags.DECLARED_SYNCHRONIZED, AccessFlags.FINAL, AccessFlags.PUBLIC) returns("V") parameters("L") - opcodes( - Opcode.IF_EQZ, - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IPUT_OBJECT, - Opcode.MONITOR_EXIT, - Opcode.RETURN_VOID, - Opcode.MONITOR_EXIT, - Opcode.RETURN_VOID + instructions( + methodCall( + definingClass = "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;", + returnType = "Ljava/lang/String;" + ), + opcode(Opcode.MOVE_RESULT_OBJECT), + opcode(Opcode.IPUT_OBJECT), + opcode(Opcode.MONITOR_EXIT), + opcode(Opcode.RETURN_VOID), + opcode(Opcode.MONITOR_EXIT), + opcode(Opcode.RETURN_VOID) ) // The target snippet of code is buried in a huge switch block and the target method // has been changed many times by YT which makes identifying it more difficult than usual. custom { method, classDef -> - // Access flags changed in 19.36 - AccessFlags.FINAL.isSet(method.accessFlags) && - AccessFlags.DECLARED_SYNCHRONIZED.isSet(method.accessFlags) && - classDef.methods.count() == 17 && - method.implementation != null && - method.indexOfPlayerResponseModelString() >= 0 + classDef.methods.count() == 17 && + method.implementation != null } - } -internal val videoIdParentFingerprint = fingerprint { +internal val videoIdParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("[L") parameters("L") - literal { 524288L } + instructions( + literal(524288L) + ) } 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 6d69381cd3..7ffdb3b2e0 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 @@ -9,11 +9,7 @@ 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 app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstruction -import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference /** * Hooks the new video id when the video changes. @@ -96,24 +92,22 @@ val videoIdPatch = bytecodePatch( ) execute { - videoIdFingerprint.match(videoIdParentFingerprint.originalClassDef).method.apply { - videoIdMethod = this - val index = indexOfPlayerResponseModelString() - videoIdRegister = getInstruction(index + 1).registerA - videoIdInsertIndex = index + 2 + videoIdFingerprint.match(videoIdParentFingerprint.originalClassDef).let { + it.method.apply { + videoIdMethod = this + val index = it.instructionMatches.first().index + videoIdRegister = getInstruction(index + 1).registerA + videoIdInsertIndex = index + 2 + } } - videoIdBackgroundPlayFingerprint.method.apply { - backgroundPlaybackMethod = this - val index = indexOfPlayerResponseModelString() - backgroundPlaybackVideoIdRegister = getInstruction(index + 1).registerA - backgroundPlaybackInsertIndex = index + 2 + videoIdBackgroundPlayFingerprint.let { + it.method.apply { + backgroundPlaybackMethod = this + val index = it.instructionMatches.first().index + backgroundPlaybackVideoIdRegister = getInstruction(index + 1).registerA + backgroundPlaybackInsertIndex = index + 2 + } } } -} - -internal fun Method.indexOfPlayerResponseModelString() = indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;" && - reference.returnType == "Ljava/lang/String;" -} +} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt deleted file mode 100644 index 537a2b68c4..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.youtube.video.videoqualitymenu - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.video.quality.videoQualityPatch - -@Suppress("unused") -@Deprecated("Use 'Video Quality' instead.") -val restoreOldVideoQualityMenuPatch = bytecodePatch { - dependsOn(videoQualityPatch) -} \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt deleted file mode 100644 index af38f28f4d..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt +++ /dev/null @@ -1,20 +0,0 @@ -package app.revanced.patches.yuka.misc.unlockpremium - -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags -import app.revanced.patcher.fingerprint - -internal val isPremiumFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - opcodes( - Opcode.IGET_BOOLEAN, - Opcode.RETURN, - ) -} - -internal val yukaUserConstructorFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - returns("V") - strings("premiumProvider") -} diff --git a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatch.kt b/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatch.kt deleted file mode 100644 index c4cedd0927..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatch.kt +++ /dev/null @@ -1,23 +0,0 @@ -package app.revanced.patches.yuka.misc.unlockpremium - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch - -@Deprecated("This patch no longer works and will be removed in the future.") -@Suppress("unused") -val unlockPremiumPatch = bytecodePatch { - - compatibleWith("io.yuka.android"("4.29")) - - execute { - isPremiumFingerprint.match( - yukaUserConstructorFingerprint.originalClassDef, - ).method.addInstructions( - 0, - """ - const/4 v0, 0x1 - return v0 - """, - ) - } -} diff --git a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index 993fa820b0..73b96693d7 100644 --- a/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/patches/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -14,9 +14,9 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableField import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.util.InstructionUtils.Companion.branchOpcodes import app.revanced.util.InstructionUtils.Companion.returnOpcodes import app.revanced.util.InstructionUtils.Companion.writeOpcodes @@ -97,7 +97,8 @@ fun Method.findFreeRegister(startIndex: Int, vararg registersToExclude: Int): In return bestFreeRegisterFound } // This method is simple and does not follow branching. - throw IllegalArgumentException("Encountered a branch statement before a free register could be found") + throw IllegalArgumentException("Encountered a branch statement before " + + "a free register could be found from startIndex: $startIndex") } if (instruction.isReturnInstruction) { @@ -359,8 +360,7 @@ fun MutableMethod.addInstructionsAtControlFlowLabel( * @see [indexOfFirstResourceIdOrThrow], [indexOfFirstLiteralInstructionReversed] */ fun Method.indexOfFirstResourceId(resourceName: String): Int { - val resourceId = resourceMappings["id", resourceName] - return indexOfFirstLiteralInstruction(resourceId) + return indexOfFirstLiteralInstruction(getResourceId(ResourceType.ID, resourceName)) } /** @@ -544,7 +544,7 @@ fun BytecodePatchContext.traverseClassHierarchy(targetClass: MutableClass, callb targetClass.superclass ?: return - classBy { targetClass.superclass == it.type }?.mutableClass?.let { + mutableClassByOrNull(targetClass.superclass!!)?.let { traverseClassHierarchy(it, callback) } } @@ -756,8 +756,12 @@ fun Method.findInstructionIndicesReversedOrThrow(opcode: Opcode): List { * Suitable for calls to extension code to override boolean and integer values. */ internal fun MutableMethod.insertLiteralOverride(literal: Long, extensionMethodDescriptor: String) { - // TODO: make this work with objects and wide values. val literalIndex = indexOfFirstLiteralInstructionOrThrow(literal) + insertLiteralOverride(literalIndex, extensionMethodDescriptor) +} + +internal fun MutableMethod.insertLiteralOverride(literalIndex: Int, extensionMethodDescriptor: String) { + // TODO: make this work with objects and wide primitive values. val index = indexOfFirstInstructionOrThrow(literalIndex, MOVE_RESULT) val register = getInstruction(index).registerA @@ -781,6 +785,13 @@ internal fun MutableMethod.insertLiteralOverride(literal: Long, extensionMethodD */ internal fun MutableMethod.insertLiteralOverride(literal: Long, override: Boolean) { val literalIndex = indexOfFirstLiteralInstructionOrThrow(literal) + return insertLiteralOverride(literalIndex, override) +} + +/** + * Constant value override of the first MOVE_RESULT after the index parameter. + */ +internal fun MutableMethod.insertLiteralOverride(literalIndex: Int, override: Boolean) { val index = indexOfFirstInstructionOrThrow(literalIndex, MOVE_RESULT) val register = getInstruction(index).registerA val overrideValue = if (override) "0x1" else "0x0" @@ -813,21 +824,7 @@ fun BytecodePatchContext.forEachLiteralValueInstruction( } if (matchingIndexes.isNotEmpty()) { - val mutableMethod = proxy(classDef).mutableClass.findMutableMethodOf(method) - - // FIXME: Until patcher V22 is merged, this workaround is needed - // because if multiple patches modify the same class - // then after modifying the method indexes of immutable classes - // are no longer correct. - matchingIndexes.clear() - mutableMethod.instructions.forEachIndexed { index, instruction -> - if ((instruction as? WideLiteralInstruction)?.wideLiteral == literal) { - matchingIndexes.add(index) - } - } - if (matchingIndexes.isEmpty()) return@forEach - // FIXME Remove code above after V22 merge. - + val mutableMethod = mutableClassBy(classDef).findMutableMethodOf(method) matchingIndexes.asReversed().forEach { index -> block.invoke(mutableMethod, index) } @@ -841,17 +838,29 @@ fun BytecodePatchContext.forEachLiteralValueInstruction( private const val RETURN_TYPE_MISMATCH = "Mismatch between override type and Method return type" /** - * Overrides the first instruction of a method with a constant `Boolean` return value. + * Overrides the first instruction of a method with a return-void instruction. * None of the method code will ever execute. * + * @see returnLate + */ +fun MutableMethod.returnEarly() { + check(returnType.first() == 'V') { + RETURN_TYPE_MISMATCH + } + overrideReturnValue(false.toHexString(), false) +} + +/** + * Overrides the first instruction of a method with a constant `Boolean` return value. + * None of the original method code will execute. + * * For methods that return an object or any array type, calling this method with `false` * will force the method to return a `null` value. * * @see returnLate */ -fun MutableMethod.returnEarly(value: Boolean = false) { - val returnType = returnType.first() - check(returnType == 'Z' || (!value && (returnType == 'V' || returnType == 'L' || returnType != '['))) { +fun MutableMethod.returnEarly(value: Boolean) { + check(returnType.first() == 'Z') { RETURN_TYPE_MISMATCH } overrideReturnValue(value.toHexString(), false) @@ -859,7 +868,7 @@ fun MutableMethod.returnEarly(value: Boolean = false) { /** * Overrides the first instruction of a method with a constant `Byte` return value. - * None of the method code will ever execute. + * None of the original method code will execute. * * @see returnLate */ @@ -870,7 +879,7 @@ fun MutableMethod.returnEarly(value: Byte) { /** * Overrides the first instruction of a method with a constant `Short` return value. - * None of the method code will ever execute. + * None of the original method code will execute. * * @see returnLate */ @@ -881,7 +890,7 @@ fun MutableMethod.returnEarly(value: Short) { /** * Overrides the first instruction of a method with a constant `Char` return value. - * None of the method code will ever execute. + * None of the original method code will execute. * * @see returnLate */ @@ -892,7 +901,7 @@ fun MutableMethod.returnEarly(value: Char) { /** * Overrides the first instruction of a method with a constant `Int` return value. - * None of the method code will ever execute. + * None of the original method code will execute. * * @see returnLate */ @@ -903,7 +912,7 @@ fun MutableMethod.returnEarly(value: Int) { /** * Overrides the first instruction of a method with a constant `Long` return value. - * None of the method code will ever execute. + * None of the original method code will execute. * * @see returnLate */ @@ -914,7 +923,7 @@ fun MutableMethod.returnEarly(value: Long) { /** * Overrides the first instruction of a method with a constant `Float` return value. - * None of the method code will ever execute. + * None of the original method code will execute. * * @see returnLate */ @@ -925,7 +934,7 @@ fun MutableMethod.returnEarly(value: Float) { /** * Overrides the first instruction of a method with a constant `Double` return value. - * None of the method code will ever execute. + * None of the original method code will execute. * * @see returnLate */ @@ -936,7 +945,7 @@ fun MutableMethod.returnEarly(value: Double) { /** * Overrides the first instruction of a method with a constant String return value. - * None of the method code will ever execute. + * None of the original method code will execute. * * Target method must have return type * Ljava/lang/String; or Ljava/lang/CharSequence; @@ -950,6 +959,21 @@ fun MutableMethod.returnEarly(value: String) { overrideReturnValue(value, false) } +/** + * Overrides the first instruction of a method with a constant `NULL` return value. + * None of the original method code will execute. + * + * @param value Value must be `Null`. + * @see returnLate + */ +fun MutableMethod.returnEarly(value: Void?) { + val returnType = returnType.first() + check(returnType == 'L' || returnType != '[') { + RETURN_TYPE_MISMATCH + } + overrideReturnValue(false.toHexString(), false) +} + /** * Overrides all return statements with a constant `Boolean` value. * All method code is executed the same as unpatched. @@ -960,11 +984,7 @@ fun MutableMethod.returnEarly(value: String) { * @see returnEarly */ fun MutableMethod.returnLate(value: Boolean) { - val returnType = returnType.first() - if (returnType == 'V') { - error("Cannot return late for Method of void type") - } - check(returnType == 'Z' || (!value && (returnType == 'L' || returnType == '['))) { + check(this.returnType.first() == 'Z') { RETURN_TYPE_MISMATCH } @@ -1064,6 +1084,22 @@ fun MutableMethod.returnLate(value: String) { overrideReturnValue(value, true) } +/** + * Overrides all return statements with a constant `Null` value. + * All method code is executed the same as unpatched. + * + * @param value Value must be `Null`. + * @see returnEarly + */ +fun MutableMethod.returnLate(value: Void?) { + val returnType = returnType.first() + check(returnType == 'L' || returnType == '[') { + RETURN_TYPE_MISMATCH + } + + overrideReturnValue(false.toHexString(), true) +} + private fun MutableMethod.overrideReturnValue(value: String, returnLate: Boolean) { val instructions = if (returnType == "Ljava/lang/String;" || returnType == "Ljava/lang/CharSequence;" ) { """ @@ -1140,10 +1176,7 @@ internal fun BytecodePatchContext.addStaticFieldToExtension( objectClass: String, smaliInstructions: String ) { - val classDef = classes.find { classDef -> classDef.type == className } - ?: throw PatchException("No matching methods found in: $className") - val mutableClass = proxy(classDef).mutableClass - + val mutableClass = mutableClassBy(className) val objectCall = "$mutableClass->$fieldName:$objectClass" mutableClass.apply { @@ -1175,7 +1208,7 @@ internal fun BytecodePatchContext.addStaticFieldToExtension( * * @param literalSupplier The supplier for the literal value to check for. */ -// TODO: add a way for subclasses to also use their own custom fingerprint. +@Deprecated("Instead use instruction filters and `literal()`") fun FingerprintBuilder.literal(literalSupplier: () -> Long) { custom { method, _ -> method.containsLiteralInstruction(literalSupplier()) diff --git a/patches/src/main/resources/addresources/values/arrays.xml b/patches/src/main/resources/addresources/values/arrays.xml index 454ed0c1e6..9a9a29dd92 100644 --- a/patches/src/main/resources/addresources/values/arrays.xml +++ b/patches/src/main/resources/addresources/values/arrays.xml @@ -384,14 +384,6 @@ - - @string/revanced_shorts_player_type_shorts - @string/revanced_shorts_player_type_regular_player - - - SHORTS_PLAYER - REGULAR_PLAYER - @string/revanced_shorts_player_type_shorts @string/revanced_shorts_player_type_regular_player diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index e1df14c831..eead7f1bc3 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -704,6 +704,9 @@ If changing this setting does not take effect, try switching to Incognito mode." Hide navigation button labels Labels are hidden Labels are shown + Enable navigation bar animations + Navigation transitions are animated + Navigation transitions are not animated Disable translucent status bar Status bar is opaque Status bar is opaque or translucent @@ -823,6 +826,9 @@ To show the Audio track menu, change \'Spoof video streams\' to iOS TV" Hide video thumbnails seekbar Video thumbnails seekbar is hidden Video thumbnails seekbar is shown + Enable fullscreen large seekbar + Fullscreen seekbar is large size + Fullscreen seekbar is normal size Shorts player From 77864f41f4c1ddd868ac67f5c33c27fee72b4d20 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 14 Sep 2025 03:38:13 +0400 Subject: [PATCH 02/59] unofficial 20.37 support --- .../youtube/patches/VersionCheckPatch.java | 2 + .../extension/youtube/settings/Settings.java | 9 ++++ patches/api/patches.api | 1 + .../youtube/layout/miniplayer/Fingerprints.kt | 3 ++ .../layout/miniplayer/MiniplayerPatch.kt | 51 ++++++++++++------- .../layout/spoofappversion/Fingerprints.kt | 11 ++-- .../misc/links/BypassURLRedirectsPatch.kt | 7 ++- .../youtube/misc/links/Fingerprints.kt | 24 +++++++-- .../misc/playservice/VersionCheckPatch.kt | 3 ++ .../resources/addresources/values/arrays.xml | 21 +++++++- 10 files changed, 107 insertions(+), 25 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java index e9b2929867..97749cf75a 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java @@ -23,4 +23,6 @@ private static boolean isVersionOrGreater(String version) { public static final boolean IS_20_21_OR_GREATER = isVersionOrGreater("20.21.00"); public static final boolean IS_20_22_OR_GREATER = isVersionOrGreater("20.22.00"); + + public static final boolean IS_20_37_OR_GREATER = isVersionOrGreater("20.37.00"); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index ab1414b8e9..c0e6b2246d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -21,6 +21,7 @@ import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.MODERN_2; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.MODERN_3; import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.MODERN_4; +import static app.revanced.extension.youtube.patches.MiniplayerPatch.MiniplayerType.TABLET; import static app.revanced.extension.youtube.patches.OpenShortsInRegularPlayerPatch.ShortsPlayerType; import static app.revanced.extension.youtube.patches.SeekbarThumbnailsPatch.SeekbarThumbnailsHighQualityAvailability; import static app.revanced.extension.youtube.patches.components.PlayerFlyoutMenuItemsFilter.HideAudioFlyoutMenuAvailability; @@ -47,6 +48,7 @@ import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.StillImagesAvailability; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailOption; import app.revanced.extension.youtube.patches.AlternativeThumbnailsPatch.ThumbnailStillTime; +import app.revanced.extension.youtube.patches.VersionCheckPatch; import app.revanced.extension.youtube.sponsorblock.SponsorBlockSettings; import app.revanced.extension.youtube.swipecontrols.SwipeControlsConfigurationProvider.SwipeOverlayStyle; @@ -478,6 +480,13 @@ public class Settings extends BaseSettings { migrateOldSettingToNew(DEPRECATED_RESTORE_OLD_VIDEO_QUALITY_MENU, ADVANCED_VIDEO_QUALITY_MENU); migrateOldSettingToNew(DEPRECATED_AUTO_CAPTIONS, DISABLE_AUTO_CAPTIONS); + // 20.37+ YT removed parts of the code for the legacy tablet miniplayer. + // This check must remain until the Tablet type is eventually removed. + if (VersionCheckPatch.IS_20_37_OR_GREATER && MINIPLAYER_TYPE.get() == TABLET) { + Logger.printInfo(() -> "Resetting miniplayer tablet type"); + MINIPLAYER_TYPE.resetToDefault(); + } + // Migrate renamed enum. //noinspection deprecation if (MINIPLAYER_TYPE.get() == MiniplayerType.PHONE) { diff --git a/patches/api/patches.api b/patches/api/patches.api index e5df609caa..a236254eac 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1549,6 +1549,7 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_20_30_or_greater ()Z public static final fun is_20_31_or_greater ()Z public static final fun is_20_34_or_greater ()Z + public static final fun is_20_37_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { 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 7455cc3738..7aaf7d2214 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 @@ -174,6 +174,9 @@ internal val miniplayerOverrideNoContextFingerprint by fingerprint { ) } +/** + * 20.36 and lower. Codes appears to be removed in 20.37+ + */ internal val miniplayerResponseModelSizeCheckFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") 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 1e6ad36268..2112acd687 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 @@ -99,8 +99,14 @@ val miniplayerPatch = bytecodePatch( preferences += - if (is_20_03_or_greater) { + if (is_20_37_or_greater) { ListPreference("revanced_miniplayer_type") + } else if (is_20_03_or_greater) { + ListPreference( + key = "revanced_miniplayer_type", + entriesKey = "revanced_miniplayer_type_legacy_20_03_entries", + entryValuesKey = "revanced_miniplayer_type_legacy_20_03_entry_values" + ) } else if (is_19_43_or_greater) { ListPreference( key = "revanced_miniplayer_type", @@ -210,7 +216,7 @@ val miniplayerPatch = bytecodePatch( """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->$extensionMethod(F)F move-result v$register - """, + """ ) } } @@ -226,30 +232,41 @@ val miniplayerPatch = bytecodePatch( """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getModernMiniplayerOverrideType(I)I move-result v$register - """, + """ ) } // region Enable tablet miniplayer. + // Parts of the YT code is removed in 20.37+ and the legacy player no longer works. - miniplayerOverrideNoContextFingerprint.match( - miniplayerDimensionsCalculatorParentFingerprint.originalClassDef, - ).method.apply { - findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride(index) } - } + if (!is_20_37_or_greater) { + miniplayerOverrideNoContextFingerprint.match( + miniplayerDimensionsCalculatorParentFingerprint.originalClassDef, + ).method.apply { + findReturnIndicesReversed().forEach { index -> + insertLegacyTabletMiniplayerOverride( + index + ) + } + } - // endregion + // endregion - // region Legacy tablet miniplayer hooks. - miniplayerOverrideFingerprint.let { - val appNameStringIndex = it.instructionMatches.last().index - navigate(it.originalMethod).to(appNameStringIndex).stop().apply { - findReturnIndicesReversed().forEach { index -> insertLegacyTabletMiniplayerOverride(index) } + // region Legacy tablet miniplayer hooks. + miniplayerOverrideFingerprint.let { + val appNameStringIndex = it.instructionMatches.last().index + navigate(it.originalMethod).to(appNameStringIndex).stop().apply { + findReturnIndicesReversed().forEach { index -> + insertLegacyTabletMiniplayerOverride( + index + ) + } + } } - } - miniplayerResponseModelSizeCheckFingerprint.let { - it.method.insertLegacyTabletMiniplayerOverride(it.instructionMatches.last().index) + miniplayerResponseModelSizeCheckFingerprint.let { + it.method.insertLegacyTabletMiniplayerOverride(it.instructionMatches.last().index) + } } // endregion 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 33c20c22f1..2341c01d73 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 @@ -10,17 +10,22 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode internal val toolBarButtonFingerprint by fingerprint { - returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - parameters("Landroid/view/MenuItem;") + returns("V") instructions( resourceLiteral(ResourceType.ID, "menu_item_view"), methodCall(returnType = "I", opcode = Opcode.INVOKE_INTERFACE), - opcode(Opcode.MOVE_RESULT, maxAfter = 0), // Value is zero if resource does not exist. + opcode(Opcode.MOVE_RESULT, maxAfter = 0), fieldAccess(type = "Landroid/widget/ImageView;", opcode = Opcode.IGET_OBJECT, maxAfter = 6), methodCall("Landroid/content/res/Resources;", "getDrawable", maxAfter = 8), methodCall("Landroid/widget/ImageView;", "setImageDrawable", maxAfter = 4) ) + custom { method, _ -> + // 20.37+ has second parameter of "Landroid/content/Context;" + val parameterCount = method.parameterTypes.count() + (parameterCount == 1 || parameterCount == 2) + && method.parameterTypes.firstOrNull() == "Landroid/view/MenuItem;" + } } internal val spoofAppVersionFingerprint by fingerprint { 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 23025d176d..ea9e273804 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 @@ -7,6 +7,7 @@ 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.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.playservice.is_20_37_or_greater import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @@ -42,7 +43,11 @@ val bypassURLRedirectsPatch = bytecodePatch( ) arrayOf( - abUriParserFingerprint to 2, + if (is_20_37_or_greater) { + (abUriParserFingerprint to 2) + } else { + (abUriParserLegacyFingerprint to 2) + }, httpUriParserFingerprint to 0 ).forEach { (fingerprint, index) -> fingerprint.method.apply { 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 cbd4a3c645..c63e7e24f8 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,13 +1,14 @@ package app.revanced.patches.youtube.misc.links -import app.revanced.patcher.checkCast -import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint import app.revanced.patcher.methodCall import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags -internal val abUriParserFingerprint by fingerprint { +/** + * 20.36 and lower. + */ +internal val abUriParserLegacyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/Object;") parameters("Ljava/lang/Object;") @@ -18,6 +19,23 @@ internal val abUriParserFingerprint by fingerprint { ) } +/** + * 20.37+ + */ +internal val abUriParserFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Ljava/lang/Object;") + parameters("Ljava/lang/Object;") + instructions( + // Method is a switch statement of unrelated code, + // and there's no strings or anything unique to fingerprint. + methodCall(smali = "Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;"), + methodCall(smali = "Ljava/lang/Boolean;->valueOf(Z)Ljava/lang/Boolean;"), + methodCall(smali = "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;"), + methodCall(smali = "Ljava/util/List;->get(I)Ljava/lang/Object;"), + ) +} + internal val httpUriParserFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Landroid/net/Uri;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index ee08aac0a0..074fcb553d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -79,6 +79,8 @@ var is_20_31_or_greater = false private set var is_20_34_or_greater = false private set +var is_20_37_or_greater = false + private set val versionCheckPatch = resourcePatch( description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", @@ -122,5 +124,6 @@ val versionCheckPatch = resourcePatch( is_20_30_or_greater = 253105000 <= playStoreServicesVersion is_20_31_or_greater = 253205000 <= playStoreServicesVersion is_20_34_or_greater = 253505000 <= playStoreServicesVersion + is_20_37_or_greater = 253805000 <= playStoreServicesVersion } } diff --git a/patches/src/main/resources/addresources/values/arrays.xml b/patches/src/main/resources/addresources/values/arrays.xml index 9a9a29dd92..58e66f11f8 100644 --- a/patches/src/main/resources/addresources/values/arrays.xml +++ b/patches/src/main/resources/addresources/values/arrays.xml @@ -218,13 +218,32 @@ @string/revanced_miniplayer_type_entry_0 @string/revanced_miniplayer_type_entry_1 @string/revanced_miniplayer_type_entry_2 - @string/revanced_miniplayer_type_entry_3 + @string/revanced_miniplayer_type_entry_4 @string/revanced_miniplayer_type_entry_5 @string/revanced_miniplayer_type_entry_6 @string/revanced_miniplayer_type_entry_7 + DISABLED + DEFAULT + MINIMAL + MODERN_1 + MODERN_2 + MODERN_3 + MODERN_4 + + + @string/revanced_miniplayer_type_entry_0 + @string/revanced_miniplayer_type_entry_1 + @string/revanced_miniplayer_type_entry_2 + @string/revanced_miniplayer_type_entry_3 + @string/revanced_miniplayer_type_entry_4 + @string/revanced_miniplayer_type_entry_5 + @string/revanced_miniplayer_type_entry_6 + @string/revanced_miniplayer_type_entry_7 + + DISABLED DEFAULT MINIMAL From e8d56c85ccad2e48ee4de3887fee415476f7c2e3 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 16 Sep 2025 12:00:02 +0400 Subject: [PATCH 03/59] Finish merge --- .../music/settings/GoogleApiActivityHook.java | 5 +++-- .../extension/shared/settings/BaseActivityHook.java | 7 ++++--- .../preference/ToolbarPreferenceFragment.java | 3 ++- .../youtube/settings/LicenseActivityHook.java | 9 +++------ .../patches/music/misc/settings/SettingsPatch.kt | 12 +++++++----- 5 files changed, 19 insertions(+), 17 deletions(-) diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/GoogleApiActivityHook.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/GoogleApiActivityHook.java index 8597113c6f..37b53c49de 100644 --- a/extensions/music/src/main/java/app/revanced/extension/music/settings/GoogleApiActivityHook.java +++ b/extensions/music/src/main/java/app/revanced/extension/music/settings/GoogleApiActivityHook.java @@ -8,6 +8,7 @@ import app.revanced.extension.music.settings.preference.ReVancedPreferenceFragment; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseActivityHook; @@ -37,7 +38,7 @@ public static GoogleApiActivityHook createInstance() { protected void customizeActivityTheme(Activity activity) { // Override the default YouTube Music theme to increase start padding of list items. // Custom style located in resources/music/values/style.xml - activity.setTheme(Utils.getResourceIdentifier("Theme.ReVanced.YouTubeMusic.Settings", "style")); + activity.setTheme(Utils.getResourceIdentifier(ResourceType.STYLE, "Theme.ReVanced.YouTubeMusic.Settings")); } /** @@ -45,7 +46,7 @@ protected void customizeActivityTheme(Activity activity) { */ @Override protected int getContentViewResourceId() { - return Utils.getResourceIdentifier("revanced_music_settings_with_toolbar", "layout"); + return Utils.getResourceIdentifier(ResourceType.LAYOUT, "revanced_music_settings_with_toolbar"); } /** diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java index a24897ca5b..1385f4ce8d 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java @@ -11,6 +11,7 @@ import android.widget.Toolbar; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.preference.ToolbarPreferenceFragment; @@ -55,7 +56,7 @@ public static void initialize(BaseActivityHook hook, Activity activity) { activity.getFragmentManager() .beginTransaction() - .replace(Utils.getResourceIdentifier("revanced_settings_fragments", "id"), fragment) + .replace(Utils.getResourceIdentifier(ResourceType.ID, "revanced_settings_fragments"), fragment) .commit(); } catch (Exception ex) { Logger.printException(() -> "initialize failure", ex); @@ -70,7 +71,7 @@ protected void createToolbar(Activity activity, PreferenceFragment fragment) { // Replace dummy placeholder toolbar. // This is required to fix submenu title alignment issue with Android ASOP 15+ ViewGroup toolBarParent = activity.findViewById( - Utils.getResourceIdentifier("revanced_toolbar_parent", "id")); + Utils.getResourceIdentifier(ResourceType.ID, "revanced_toolbar_parent")); ViewGroup dummyToolbar = Utils.getChildViewByResourceName(toolBarParent, "revanced_toolbar"); toolbarLayoutParams = dummyToolbar.getLayoutParams(); toolBarParent.removeView(dummyToolbar); @@ -82,7 +83,7 @@ protected void createToolbar(Activity activity, PreferenceFragment fragment) { toolbar.setBackgroundColor(getToolbarBackgroundColor()); toolbar.setNavigationIcon(getNavigationIcon()); toolbar.setNavigationOnClickListener(getNavigationClickListener(activity)); - toolbar.setTitle(Utils.getResourceIdentifier("revanced_settings_title", "string")); + toolbar.setTitle(Utils.getResourceIdentifier(ResourceType.STRING, "revanced_settings_title")); final int margin = Utils.dipToPixels(16); toolbar.setTitleMarginStart(margin); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java index 05a1fddcc4..a60a46d5ea 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java @@ -17,6 +17,7 @@ import androidx.annotation.Nullable; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseActivityHook; @@ -116,7 +117,7 @@ public static void setNavigationBarColor(@Nullable Window window) { @SuppressLint("UseCompatLoadingForDrawables") public static Drawable getBackButtonDrawable() { final int backButtonResource = Utils.getResourceIdentifier( - "revanced_settings_toolbar_arrow_left", "drawable"); + ResourceType.DRAWABLE, "revanced_settings_toolbar_arrow_left"); Drawable drawable = Utils.getContext().getResources().getDrawable(backButtonResource); customizeBackButtonDrawable(drawable); return drawable; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java index 7ff6ff6803..0c10dd8849 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/LicenseActivityHook.java @@ -6,13 +6,10 @@ import android.content.res.Configuration; import android.graphics.drawable.Drawable; import android.preference.PreferenceFragment; -import android.util.TypedValue; import android.view.View; -import android.view.ViewGroup; -import android.widget.TextView; import android.widget.Toolbar; -import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.AppLanguage; import app.revanced.extension.shared.settings.BaseActivityHook; @@ -53,7 +50,7 @@ protected void customizeActivityTheme(Activity activity) { final var theme = Utils.isDarkModeEnabled() ? "Theme.YouTube.Settings.Dark" : "Theme.YouTube.Settings"; - activity.setTheme(Utils.getResourceIdentifier(theme, "style")); + activity.setTheme(Utils.getResourceIdentifier(ResourceType.STYLE, theme)); } /** @@ -61,7 +58,7 @@ protected void customizeActivityTheme(Activity activity) { */ @Override protected int getContentViewResourceId() { - return Utils.getResourceIdentifier("revanced_settings_with_toolbar", "layout"); + return Utils.getResourceIdentifier(ResourceType.LAYOUT, "revanced_settings_with_toolbar"); } /** diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt index 09fab446bf..ba74c0ab85 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/SettingsPatch.kt @@ -28,11 +28,13 @@ private val settingsResourcePatch = resourcePatch { dependsOn( resourceMappingPatch, settingsPatch( - IntentPreference( - titleKey = "revanced_settings_title", - summaryKey = null, - intent = newIntent("revanced_settings_intent"), - ) to "settings_headers", + listOf( + IntentPreference( + titleKey = "revanced_settings_title", + summaryKey = null, + intent = newIntent("revanced_settings_intent"), + ) to "settings_headers" + ), preferences ) ) From bb671766f60b00b0f113859d4916ab39798856ea Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 18 Sep 2025 10:18:33 +0400 Subject: [PATCH 04/59] finish merge --- .../revanced/patches/instagram/feed/Fingerprints.kt | 13 ++----------- .../instagram/feed/LimitFeedToFollowedProfiles.kt | 7 +++++++ .../app/revanced/patches/viber/ads/HideAdsPatch.kt | 6 +++--- 3 files changed, 12 insertions(+), 14 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt index cf8c611181..2caadb41ea 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt @@ -1,20 +1,11 @@ package app.revanced.patches.instagram.feed import app.revanced.patcher.fingerprint -import app.revanced.patcher.patch.BytecodePatchContext -internal val mainFeedRequestClassFingerprint = fingerprint { +internal val mainFeedRequestClassFingerprint by fingerprint { strings("Request{mReason=", ", mInstanceNumber=") } -context(BytecodePatchContext) -internal val initMainFeedRequestFingerprint get() = fingerprint { - custom { method, classDef -> - method.name == "" && - classDef == mainFeedRequestClassFingerprint.classDef - } -} - -internal val mainFeedHeaderMapFinderFingerprint = fingerprint { +internal val mainFeedHeaderMapFinderFingerprint by fingerprint { strings("pagination_source", "FEED_REQUEST_SENT") } 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 3ded4c91ab..1c867ac549 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 @@ -2,6 +2,7 @@ package app.revanced.patches.instagram.feed import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.instagram.misc.extension.sharedExtensionPatch import app.revanced.util.getReference @@ -40,6 +41,12 @@ val limitFeedToFollowedProfiles = bytecodePatch( } } + val initMainFeedRequestFingerprint by fingerprint { + custom { method, classDef -> + method.name == "" && + classDef == mainFeedRequestClassFingerprint.classDef + } + } initMainFeedRequestFingerprint.method.apply { // Finds the instruction where the map is being initialized in the constructor val getHeaderIndex = indexOfFirstInstructionOrThrow { 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 0ec31e376f..1bbd719722 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 @@ -2,7 +2,6 @@ package app.revanced.patches.viber.ads import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.fingerprint -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.returnEarly @@ -30,12 +29,13 @@ val hideAdsPatch = bytecodePatch( val targetClass = method.getInstruction(typeRefIndex).reference as TypeReference // Patch the ads-free method to always return true - fingerprint { + val adFreeFingerprint by fingerprint { returns("I") parameters() custom { method, classDef -> classDef == targetClass } - }.method.returnEarly(1) + } + adFreeFingerprint.method.returnEarly(1) } } From b99789b1cdd5292d4b223843d3f77929a113155c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 19 Sep 2025 11:08:48 +0400 Subject: [PATCH 05/59] unofficial 20.38 --- .../patches/youtube/misc/imageurlhook/Fingerprints.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) 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 52315bc699..6d7826495b 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,5 +1,6 @@ package app.revanced.patches.youtube.misc.imageurlhook +import app.revanced.patcher.anyInstruction import app.revanced.patcher.fingerprint import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags @@ -61,6 +62,9 @@ internal val messageDigestImageUrlParentFingerprint by fingerprint { returns("Ljava/lang/String;") parameters() instructions( - string("@#&=*+-_.,:!?()/~'%;\$"), + anyInstruction( + string("@#&=*+-_.,:!?()/~'%;\$"), + string("@#&=*+-_.,:!?()/~'%;\$[]"), // 20.38+ + ) ) } From 6a5b204f8ead7c0b626528024fb3cede98cfd2f7 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 19 Sep 2025 11:39:59 +0400 Subject: [PATCH 06/59] fix SB create/voting buttons (merge error?) --- .../extension/youtube/sponsorblock/ui/CreateSegmentButton.java | 1 - .../extension/youtube/sponsorblock/ui/VotingButton.java | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java index 5ff9999871..99dbf7e185 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/CreateSegmentButton.java @@ -59,7 +59,6 @@ public static void setVisibility(boolean visible, boolean animated) { private static boolean isButtonEnabled() { return Settings.SB_ENABLED.get() && Settings.SB_CREATE_NEW_SEGMENT.get() - && SegmentPlaybackController.videoHasSegments() && !SegmentPlaybackController.isAdProgressTextVisible(); } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/VotingButton.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/VotingButton.java index 30fee1840c..2403b5a35d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/VotingButton.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/VotingButton.java @@ -59,7 +59,8 @@ public static void setVisibility(boolean visible, boolean animated) { } private static boolean isButtonEnabled() { - return Settings.SB_ENABLED.get() && Settings.SB_CREATE_NEW_SEGMENT.get() + return Settings.SB_ENABLED.get() && Settings.SB_VOTING_BUTTON.get() + && SegmentPlaybackController.videoHasSegments() && !SegmentPlaybackController.isAdProgressTextVisible(); } } From 765957f2c97446a6c1c86cb74d42fbbaa9bce0ee Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 20 Sep 2025 17:56:33 +0400 Subject: [PATCH 07/59] finish merge --- patches/api/patches.api | 210 ++++++------------ .../music/layout/castbutton/Fingerprints.kt | 4 +- .../layout/navigationbar/Fingerprints.kt | 12 +- .../navigationbar/NavigationBarPatch.kt | 9 +- .../shared/misc/debugging/Fingerprints.kt | 10 +- .../patches/shared/misc/spoof/Fingerprints.kt | 2 +- .../misc/spoof/SpoofVideoStreamsPatch.kt | 23 +- 7 files changed, 97 insertions(+), 173 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index aeaab90dbf..d4ce9b2cb9 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -64,10 +64,6 @@ public final class app/revanced/patches/all/misc/debugging/EnableAndroidDebuggin public static final fun getEnableAndroidDebuggingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatchKt { - public static final fun getChangeDataDirectoryLocationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/all/misc/directory/documentsprovider/ExportInternalDataDocumentsProviderPatchKt { public static final fun getExportInternalDataDocumentsProviderPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } @@ -152,10 +148,6 @@ public final class app/revanced/patches/angulus/ads/RemoveAdsPatchKt { public static final fun getAngulusPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/backdrops/misc/pro/ProUnlockPatchKt { - public static final fun getProUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatchKt { public static final fun getRemovePlayLimitsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -232,10 +224,6 @@ public final class app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatc public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatchKt { - public static final fun getRestoreHiddenBackUpWhileChargingTogglePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictionsKt { public static final fun getRemoveDeviceRestrictionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -320,14 +308,6 @@ public final class app/revanced/patches/messenger/inbox/HideInboxSubtabsPatchKt public static final fun getHideInboxSubtabsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatchKt { - public static final fun getDisableSwitchingEmojiToStickerPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatchKt { - public static final fun getDisableTypingIndicatorPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/messenger/layout/HideFacebookButtonPatchKt { public static final fun getHideFacebookButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -340,14 +320,6 @@ public final class app/revanced/patches/messenger/misc/extension/ExtensionPatchK public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/messenger/navbar/RemoveMetaAITabPatchKt { - public static final fun getRemoveMetaAITabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/meta/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatchKt { public static final fun getForceEnglishLocalePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -368,10 +340,6 @@ public final class app/revanced/patches/music/interaction/permanentrepeat/Perman public static final fun getPermanentRepeatPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatchKt { - public static final fun getPermanentShufflePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/music/layout/castbutton/HideCastButtonKt { public static final fun getHideCastButton ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -458,10 +426,6 @@ public final class app/revanced/patches/netguard/broadcasts/removerestriction/Re public static final fun getRemoveBroadcastsRestrictionPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/nunl/ads/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -470,10 +434,6 @@ public final class app/revanced/patches/nunl/firebase/SpoofCertificatePatchKt { public static final fun getSpoofCertificatePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/nyx/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatchKt { public static final fun getFixCrashPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -700,16 +660,11 @@ public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/ public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatchKt { - public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatchKt { public static final fun getDisableScreenshotPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } public final class app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatchKt { - public static final fun getUnlockPremiumIconPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getUnlockPremiumIconsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -735,26 +690,22 @@ public final class app/revanced/patches/shared/misc/extension/ExtensionHook { public final class app/revanced/patches/shared/misc/extension/SharedExtensionPatchKt { public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; + public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function0; public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static final fun sharedExtensionPatch (Ljava/lang/String;[Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun sharedExtensionPatch ([Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch; + public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/jvm/functions/Function0; + public static final fun sharedExtensionPatch (Ljava/lang/String;[Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun sharedExtensionPatch ([Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch; } public final class app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatchKt { public static final fun getVerticalScrollPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/shared/misc/gms/FingerprintsKt { - public static final field GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME Ljava/lang/String; -} - public final class app/revanced/patches/shared/misc/gms/GmsCoreSupportPatchKt { public static final fun gmsCoreSupportPatch (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; public static synthetic fun gmsCoreSupportPatch$default (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch; - public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch; + public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; } public final class app/revanced/patches/shared/misc/hex/HexPatchBuilder : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker { @@ -793,23 +744,64 @@ public final class app/revanced/patches/shared/misc/hex/Replacement { } public final class app/revanced/patches/shared/misc/mapping/ResourceElement { - public final fun component1 ()Ljava/lang/String; + public fun (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;J)V + public final fun component1 ()Lapp/revanced/patches/shared/misc/mapping/ResourceType; public final fun component2 ()Ljava/lang/String; public final fun component3 ()J - public final fun copy (Ljava/lang/String;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; - public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceElement;Ljava/lang/String;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; + public final fun copy (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; + public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceElement;Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; public fun equals (Ljava/lang/Object;)Z public final fun getId ()J public final fun getName ()Ljava/lang/String; - public final fun getType ()Ljava/lang/String; + public final fun getType ()Lapp/revanced/patches/shared/misc/mapping/ResourceType; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { - public static final fun get (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)J + public static final fun getResourceElements ()Ljava/util/Collection; + public static final fun getResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)J public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun getResourceMappings ()Ljava/util/List; + public static final fun hasResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)Z + public static final fun resourceLiteral (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralFilter; + public static synthetic fun resourceLiteral$default (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralFilter; +} + +public final class app/revanced/patches/shared/misc/mapping/ResourceType : java/lang/Enum { + public static final field ANIM Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ANIMATOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ARRAY Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ATTR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field BOOL Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field COLOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field Companion Lapp/revanced/patches/shared/misc/mapping/ResourceType$Companion; + public static final field DIMEN Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field DRAWABLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field FONT Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field FRACTION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ID Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field INTEGER Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field INTERPOLATOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field LAYOUT Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field MENU Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field MIPMAP Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field NAVIGATION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field PLURALS Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field RAW Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STRING Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STYLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STYLEABLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field TRANSITION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field VALUES Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field XML Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getValue ()Ljava/lang/String; + public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static fun values ()[Lapp/revanced/patches/shared/misc/mapping/ResourceType; +} + +public final class app/revanced/patches/shared/misc/mapping/ResourceType$Companion { + public final fun fromValue (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/mapping/ResourceType; } public final class app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatchKt { @@ -819,7 +811,6 @@ public final class app/revanced/patches/shared/misc/pairip/license/DisableLicens public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt { public static final fun overrideThemeColors (Ljava/lang/String;Ljava/lang/String;)V public static final fun settingsPatch (Ljava/util/List;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun settingsPatch (Lkotlin/Pair;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; public static synthetic fun settingsPatch$default (Ljava/util/List;Ljava/util/Set;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; } @@ -912,8 +903,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/ListPref public fun ()V public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getEntries ()Lapp/revanced/util/resource/ArrayResource; public final fun getEntriesKey ()Ljava/lang/String; public final fun getEntryValues ()Lapp/revanced/util/resource/ArrayResource; @@ -1025,10 +1016,6 @@ public final class app/revanced/patches/spotify/layout/theme/CustomThemePatchKt public static final fun getCustomThemePatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/spotify/lite/ondemand/OnDemandPatchKt { - public static final fun getOnDemandPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/spotify/misc/extension/ExtensionPatchKt { public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1037,14 +1024,6 @@ public final class app/revanced/patches/spotify/misc/fix/SpoofClientPatchKt { public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatchKt { - public static final fun getSpoofPackageInfoPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/spotify/misc/fix/SpoofSignaturePatchKt { - public static final fun getSpoofSignaturePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatchKt { public static final fun getFixFacebookLoginPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1061,10 +1040,6 @@ public final class app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunch public static final fun getFixThirdPartyLaunchersWidgets ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/spotify/navbar/PremiumNavbarTabPatchKt { - public static final fun getPremiumNavbarTabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/stocard/layout/HideOffersTabPatchKt { public static final fun getHideOffersTabPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } @@ -1285,10 +1260,6 @@ public final class app/revanced/patches/viber/ads/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatchKt { public static final fun getFirebaseGetCertPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1297,10 +1268,6 @@ public final class app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnloc public static final fun getPromoCodeUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/ad/general/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1322,7 +1289,6 @@ public final class app/revanced/patches/youtube/interaction/dialog/RemoveViewerD } public final class app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatchKt { - public static final fun getDisableChapterSkipDoubleTapPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getDisableDoubleTapActionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1399,15 +1365,7 @@ public final class app/revanced/patches/youtube/layout/hide/fullscreenambientmod } public final class app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatchKt { - public static final fun getAlbumCardId ()J - public static final fun getBarContainerHeightId ()J - public static final fun getCrowdfundingBoxId ()J - public static final fun getExpandButtonDownId ()J - public static final fun getFabButtonId ()J - public static final fun getFilterBarHeightId ()J public static final fun getHideLayoutComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getRelatedChipCloudMarginId ()J - public static final fun getYouTubeLogo ()J } public final class app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatchKt { @@ -1426,10 +1384,6 @@ public final class app/revanced/patches/youtube/layout/hide/rollingnumber/Disabl public static final fun getDisableRollingNumberAnimationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatchKt { - public static final fun getHideSeekbarPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatchKt { public static final fun getHideShortsComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1438,10 +1392,6 @@ public final class app/revanced/patches/youtube/layout/hide/signintotvpopup/Disa public static final fun getDisableSignInToTvPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatchKt { - public static final fun getDisableSuggestedVideoEndScreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPatchKt { public static final fun getHideTimestampPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1454,14 +1404,6 @@ public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupP public static final fun getPlayerPopupPanelsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatchKt { - public static final fun getPlayerControlsBackgroundPatch ()Lapp/revanced/patcher/patch/ResourcePatch; -} - -public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenKt { - public static final fun getOpenVideosFullscreen ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatchKt { public static final fun getOpenVideosFullscreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1516,10 +1458,6 @@ public final class app/revanced/patches/youtube/layout/startupshortsreset/Disabl public static final fun getDisableResumingShortsOnStartupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatchKt { - public static final fun getEnableTabletLayoutPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/theme/LithoColorHookPatchKt { public static final fun getLithoColorHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getLithoColorOverrideHook ()Lkotlin/jvm/functions/Function2; @@ -1565,14 +1503,6 @@ public final class app/revanced/patches/youtube/misc/extension/SharedExtensionPa public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatchKt { - public static final fun getSpoofVideoStreamsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatchKt { - public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/misc/fix/playbackspeed/FIxPlaybackSpeedWhilePlayingPatchKt { public static final fun getFixPlaybackSpeedWhilePlayingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1620,7 +1550,6 @@ public final class app/revanced/patches/youtube/misc/playercontrols/PlayerContro public final class app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatchKt { public static final fun getAddBottomControl ()Lkotlin/jvm/functions/Function1; public static final fun getPlayerControlsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getPlayerControlsResourcePatch ()Lapp/revanced/patcher/patch/ResourcePatch; public static final fun initializeBottomControl (Ljava/lang/String;)V public static final fun injectVisibilityCheckCall (Ljava/lang/String;)V } @@ -1631,9 +1560,6 @@ public final class app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPa public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPatchKt { public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun is_19_03_or_greater ()Z - public static final fun is_19_04_or_greater ()Z - public static final fun is_19_16_or_greater ()Z public static final fun is_19_17_or_greater ()Z public static final fun is_19_18_or_greater ()Z public static final fun is_19_23_or_greater ()Z @@ -1658,6 +1584,16 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_20_10_or_greater ()Z public static final fun is_20_14_or_greater ()Z public static final fun is_20_15_or_greater ()Z + public static final fun is_20_19_or_greater ()Z + public static final fun is_20_20_or_greater ()Z + public static final fun is_20_21_or_greater ()Z + public static final fun is_20_22_or_greater ()Z + public static final fun is_20_26_or_greater ()Z + public static final fun is_20_28_or_greater ()Z + public static final fun is_20_30_or_greater ()Z + public static final fun is_20_31_or_greater ()Z + public static final fun is_20_34_or_greater ()Z + public static final fun is_20_37_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { @@ -1699,10 +1635,6 @@ public final class app/revanced/patches/youtube/misc/spoof/UserAgentClientSpoofP public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatchKt { - public static final fun getZoomHapticsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatchKt { public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1767,14 +1699,6 @@ public final class app/revanced/patches/youtube/video/videoid/VideoIdPatchKt { public static final fun hookVideoId (Ljava/lang/String;)V } -public final class app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatchKt { - public static final fun getRestoreOldVideoQualityMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatchKt { - public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/util/BytecodeUtilsKt { public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ILjava/lang/String;)V public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ILjava/lang/String;[Lapp/revanced/patcher/util/smali/ExternalLabel;)V @@ -1824,6 +1748,7 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun indexOfFirstResourceIdOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V public static final fun literal (Lapp/revanced/patcher/FingerprintBuilder;Lkotlin/jvm/functions/Function0;)V + public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;B)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;C)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;D)V @@ -1831,9 +1756,9 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;I)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;J)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/String;)V + public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Void;)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;S)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Z)V - public static synthetic fun returnEarly$default (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ZILjava/lang/Object;)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;B)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;C)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;D)V @@ -1841,6 +1766,7 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;I)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;J)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/String;)V + public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Void;)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;S)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Z)V public static final fun transformMethods (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lkotlin/jvm/functions/Function1;)V diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/Fingerprints.kt index 718d494794..535739e614 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/Fingerprints.kt @@ -4,13 +4,13 @@ import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint import app.revanced.util.literal -internal val mediaRouteButtonFingerprint = fingerprint { +internal val mediaRouteButtonFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Z") strings("MediaRouteButton") } -internal val playerOverlayChipFingerprint = fingerprint { +internal val playerOverlayChipFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") literal { playerOverlayChip } 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 ab4fb3a8bd..153e9cfd7f 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,15 +1,15 @@ package app.revanced.patches.music.layout.navigationbar -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint +import app.revanced.util.containsLiteralInstruction import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction -import app.revanced.util.literal +import com.android.tools.smali.dexlib2.AccessFlags +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 tabLayoutTextFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") @@ -23,9 +23,9 @@ internal val tabLayoutTextFingerprint = fingerprint { Opcode.MOVE_RESULT ) strings("FEmusic_search") - literal { text1 } custom { method, _ -> - indexOfGetVisibilityInstruction(method) >= 0 + method.containsLiteralInstruction(text1) && + indexOfGetVisibilityInstruction(method) >= 0 } } 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 d3af09f242..49ae813fe3 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 @@ -9,9 +9,9 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.util.indexOfFirstInstructionOrThrow @@ -45,10 +45,7 @@ val navigationBarPatch = bytecodePatch( ) execute { - text1 = resourceMappings[ - "id", - "text1", - ] + text1 = getResourceId(ResourceType.ID, "text1") addResources("music", "layout.navigationbar.navigationBarPatch") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt index 6f183dd087..f24048eb8a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt @@ -3,32 +3,32 @@ package app.revanced.patches.shared.misc.debugging import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val experimentalFeatureFlagParentFingerprint = fingerprint { +internal val experimentalFeatureFlagParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L", "J", "[B") strings("Unable to parse proto typed experiment flag: ") } -internal val experimentalBooleanFeatureFlagFingerprint = fingerprint { +internal val experimentalBooleanFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L", "J", "Z") } -internal val experimentalDoubleFeatureFlagFingerprint = fingerprint { +internal val experimentalDoubleFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("D") parameters("J", "D") } -internal val experimentalLongFeatureFlagFingerprint = fingerprint { +internal val experimentalLongFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("J") parameters("J", "J") } -internal val experimentalStringFeatureFlagFingerprint = fingerprint { +internal val experimentalStringFeatureFlagFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("J", "Ljava/lang/String;") 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 b031a7f5b5..35f8183488 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 @@ -139,7 +139,7 @@ internal val hlsCurrentTimeFingerprint by fingerprint { internal const val DISABLED_BY_SABR_STREAMING_URI_STRING = "DISABLED_BY_SABR_STREAMING_URI" -internal val mediaFetchEnumConstructorFingerprint = fingerprint { +internal val mediaFetchEnumConstructorFingerprint by fingerprint { returns("V") strings( "ENABLED", 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 75c15b38f9..aa38ad3503 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 @@ -29,6 +29,7 @@ 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.instruction.TwoRegisterInstruction 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 @@ -105,18 +106,17 @@ fun spoofVideoStreamsPatch( buildRequestFingerprint.method.apply { buildRequestMethod = this - val newRequestBuilderIndex = it.instructionMatches.first().index + val newRequestBuilderIndex = buildRequestFingerprint.instructionMatches.first().index buildRequestMethodUrlRegister = getInstruction(newRequestBuilderIndex).registerD val freeRegister = findFreeRegister(newRequestBuilderIndex, buildRequestMethodUrlRegister) - addInstructions( - builderIndex, - """ - move-object v$freeRegister, p1 - invoke-static { v$buildRequestMethodUrlRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V - """ - ) - } + addInstructions( + newRequestBuilderIndex, + """ + move-object v$freeRegister, p1 + invoke-static { v$buildRequestMethodUrlRegister, v$freeRegister }, $EXTENSION_CLASS_DESCRIPTOR->fetchStreams(Ljava/lang/String;Ljava/util/Map;)V + """ + ) } // endregion @@ -292,7 +292,7 @@ fun spoofVideoStreamsPatch( ) } - fingerprint { + val sabrFingerprint by fingerprint { returns(mediaFetchEnumClass) opcodes( Opcode.SGET_OBJECT, @@ -301,7 +301,8 @@ fun spoofVideoStreamsPatch( custom { method, _ -> !method.parameterTypes.isEmpty() } - }.method.addInstructionsWithLabels( + } + sabrFingerprint.method.addInstructionsWithLabels( 0, """ invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disableSABR()Z From a25d769f69522fd24af9c09e03b881ce0798cecd Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 21 Sep 2025 19:10:34 +0400 Subject: [PATCH 08/59] remove deprecated migration code --- .../music/settings/MusicActivityHook.java | 3 +- .../app/revanced/extension/shared/Utils.java | 47 ------------------- .../extension/shared/checks/Check.java | 2 +- .../shared/settings/BaseActivityHook.java | 8 ++-- .../CustomDialogListPreference.java | 17 +++---- .../settings/search/BaseSearchResultItem.java | 15 +++--- .../search/BaseSearchResultsAdapter.java | 11 +++-- .../search/BaseSearchViewController.java | 23 +++++---- .../settings/search/SearchHistoryManager.java | 21 +++++---- .../HidePlayerOverlayButtonsPatch.java | 5 +- .../sponsorblock/ui/NewSegmentLayout.java | 7 +-- .../ui/SponsorBlockViewController.java | 17 +++---- 12 files changed, 71 insertions(+), 105 deletions(-) diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java index bb19d2497b..c255adaf11 100644 --- a/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java +++ b/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java @@ -11,6 +11,7 @@ import app.revanced.extension.music.settings.preference.MusicPreferenceFragment; import app.revanced.extension.music.settings.search.MusicSearchViewController; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseActivityHook; @@ -46,7 +47,7 @@ protected void customizeActivityTheme(Activity activity) { // Override the default YouTube Music theme to increase start padding of list items. // Custom style located in resources/music/values/style.xml activity.setTheme(Utils.getResourceIdentifierOrThrow( - "Theme.ReVanced.YouTubeMusic.Settings", "style")); + ResourceType.STYLE, "Theme.ReVanced.YouTubeMusic.Settings")); } /** diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java index 92903b9f9d..740b29e33c 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/Utils.java @@ -328,53 +328,6 @@ public static int getResourceIdentifierOrThrow(@Nullable ResourceType type, Stri return getResourceIdentifierOrThrow(getContext(), type, resourceIdentifierName); } - /** - * @return The resource identifier, or throws an exception if not found. - */ - @Deprecated - public static int getResourceIdentifierOrThrow(Context context, String resourceIdentifierName, @Nullable String type) { - final int resourceId = getResourceIdentifier(context, type, resourceIdentifierName); - if (resourceId == 0) { - throw new Resources.NotFoundException("No resource id exists with name: " + resourceIdentifierName - + " type: " + type); - } - return resourceId; - } - - - /** - * Instead use {@link #getResourceIdentifierOrThrow(ResourceType, String)} - */ - @Deprecated - public static int getResourceIdentifierOrThrow(String resourceIdentifierName, @Nullable String stringType) { - return getResourceIdentifierOrThrow(getContext(), resourceIdentifierName, stringType); - } - - /** - * Instead use {@link #getResourceIdentifier(ResourceType, String)} - */ - @Deprecated - public static int getResourceIdentifier(String resourceIdentifierName, @Nullable String stringType) { - return getResourceIdentifier(getContext(), resourceIdentifierName, stringType); - } - - /** - * Instead use {@link #getResourceIdentifier(Context, ResourceType, String)} - */ - @Deprecated - public static int getResourceIdentifier(Context context, String resourceIdentifierName, @Nullable String stringType) { - // Find ResourceType with same name as type parameter string - ResourceType convertedType = null; - for (ResourceType type : ResourceType.values()) { - if (type.value.equals(stringType)) { - convertedType = type; - break; - } - } - - return getResourceIdentifierOrThrow(context, convertedType, resourceIdentifierName); - } - public static int getResourceInteger(String resourceIdentifierName) throws Resources.NotFoundException { return getContext().getResources().getInteger(getResourceIdentifierOrThrow(ResourceType.INTEGER, resourceIdentifierName)); } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java index 7a3a2e1d4a..53db12c4d7 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java @@ -129,7 +129,7 @@ static void issueWarning(Activity activity, Collection failedChecks) { // Add icon to the dialog. ImageView iconView = new ImageView(activity); iconView.setImageResource(Utils.getResourceIdentifierOrThrow( - "revanced_ic_dialog_alert", "drawable")); + ResourceType.DRAWABLE, "revanced_ic_dialog_alert")); iconView.setColorFilter(Utils.getAppForegroundColor(), PorterDuff.Mode.SRC_IN); iconView.setPadding(0, 0, 0, 0); LinearLayout.LayoutParams iconParams = new LinearLayout.LayoutParams( diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java index d29e5e0856..830e5e8af9 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java @@ -26,13 +26,13 @@ public abstract class BaseActivityHook extends Activity { private static final int ID_REVANCED_SETTINGS_FRAGMENTS = - getResourceIdentifierOrThrow("revanced_settings_fragments", "id"); + getResourceIdentifierOrThrow(ResourceType.ID, "revanced_settings_fragments"); private static final int ID_REVANCED_TOOLBAR_PARENT = - getResourceIdentifierOrThrow("revanced_toolbar_parent", "id"); + getResourceIdentifierOrThrow(ResourceType.ID, "revanced_toolbar_parent"); public static final int LAYOUT_REVANCED_SETTINGS_WITH_TOOLBAR = - getResourceIdentifierOrThrow("revanced_settings_with_toolbar", "layout"); + getResourceIdentifierOrThrow(ResourceType.LAYOUT, "revanced_settings_with_toolbar"); private static final int STRING_REVANCED_SETTINGS_TITLE = - getResourceIdentifierOrThrow("revanced_settings_title", "string"); + getResourceIdentifierOrThrow(ResourceType.STRING, "revanced_settings_title"); /** * Layout parameters for the toolbar, extracted from the dummy toolbar. diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java index ff728838b7..841a3529f2 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java @@ -20,6 +20,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.ui.CustomDialog; @@ -30,14 +31,14 @@ @SuppressWarnings({"unused", "deprecation"}) public class CustomDialogListPreference extends ListPreference { - public static final int ID_REVANCED_CHECK_ICON = - getResourceIdentifierOrThrow("revanced_check_icon", "id"); - public static final int ID_REVANCED_CHECK_ICON_PLACEHOLDER = - getResourceIdentifierOrThrow("revanced_check_icon_placeholder", "id"); - public static final int ID_REVANCED_ITEM_TEXT = - getResourceIdentifierOrThrow("revanced_item_text", "id"); - public static final int LAYOUT_REVANCED_CUSTOM_LIST_ITEM_CHECKED = - getResourceIdentifierOrThrow("revanced_custom_list_item_checked", "layout"); + public static final int ID_REVANCED_CHECK_ICON = getResourceIdentifierOrThrow( + ResourceType.ID, "revanced_check_icon"); + public static final int ID_REVANCED_CHECK_ICON_PLACEHOLDER = getResourceIdentifierOrThrow( + ResourceType.ID, "revanced_check_icon_placeholder"); + public static final int ID_REVANCED_ITEM_TEXT = getResourceIdentifierOrThrow( + ResourceType.ID, "revanced_item_text"); + public static final int LAYOUT_REVANCED_CUSTOM_LIST_ITEM_CHECKED = getResourceIdentifierOrThrow( + ResourceType.LAYOUT, "revanced_custom_list_item_checked"); private String staticSummary = null; private CharSequence[] highlightedEntriesForDialog = null; diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java index 9b5c9464c8..9936f9ffbc 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultItem.java @@ -16,6 +16,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.preference.ColorPickerPreference; import app.revanced.extension.shared.settings.preference.CustomDialogListPreference; @@ -38,18 +39,18 @@ public enum ViewType { // Get the corresponding layout resource ID. public int getLayoutResourceId() { return switch (this) { - case REGULAR, URL_LINK -> getResourceIdentifier("revanced_preference_search_result_regular"); - case SWITCH -> getResourceIdentifier("revanced_preference_search_result_switch"); - case LIST -> getResourceIdentifier("revanced_preference_search_result_list"); - case COLOR_PICKER -> getResourceIdentifier("revanced_preference_search_result_color"); - case GROUP_HEADER -> getResourceIdentifier("revanced_preference_search_result_group_header"); - case NO_RESULTS -> getResourceIdentifier("revanced_preference_search_no_result"); + case REGULAR, URL_LINK -> getResourceIdentifier("revanced_preference_search_result_regular"); + case SWITCH -> getResourceIdentifier("revanced_preference_search_result_switch"); + case LIST -> getResourceIdentifier("revanced_preference_search_result_list"); + case COLOR_PICKER -> getResourceIdentifier("revanced_preference_search_result_color"); + case GROUP_HEADER -> getResourceIdentifier("revanced_preference_search_result_group_header"); + case NO_RESULTS -> getResourceIdentifier("revanced_preference_search_no_result"); }; } private static int getResourceIdentifier(String name) { // Placeholder for actual resource identifier retrieval. - return Utils.getResourceIdentifierOrThrow(name, "layout"); + return Utils.getResourceIdentifierOrThrow(ResourceType.LAYOUT, name); } } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java index f1893a2324..87d35ae240 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java @@ -33,6 +33,7 @@ import java.util.List; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.preference.ColorPickerPreference; import app.revanced.extension.shared.settings.preference.CustomDialogListPreference; @@ -54,15 +55,15 @@ public abstract class BaseSearchResultsAdapter extends ArrayAdapter searchHistory; private final Activity activity; diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java index 7bf99f4798..23ecdcfd0e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java @@ -7,6 +7,7 @@ import android.widget.ImageView; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.settings.Settings; @@ -40,10 +41,10 @@ public static void hideCaptionsButton(ImageView imageView) { = Settings.HIDE_PLAYER_PREVIOUS_NEXT_BUTTONS.get(); private static final int PLAYER_CONTROL_PREVIOUS_BUTTON_TOUCH_AREA_ID = getResourceIdentifierOrThrow( - "player_control_previous_button_touch_area", "id"); + ResourceType.ID, "player_control_previous_button_touch_area"); private static final int PLAYER_CONTROL_NEXT_BUTTON_TOUCH_AREA_ID = getResourceIdentifierOrThrow( - "player_control_next_button_touch_area", "id"); + ResourceType.ID, "player_control_next_button_touch_area"); /** * Injection point. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/NewSegmentLayout.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/NewSegmentLayout.java index 6a5f032310..b153aa2966 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/NewSegmentLayout.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/NewSegmentLayout.java @@ -15,6 +15,7 @@ import android.widget.ImageButton; import app.revanced.extension.shared.Logger; +import app.revanced.extension.shared.ResourceType; import app.revanced.extension.youtube.patches.VideoInformation; import app.revanced.extension.youtube.settings.Settings; import app.revanced.extension.youtube.sponsorblock.SponsorBlockUtils; @@ -44,8 +45,8 @@ public NewSegmentLayout(final Context context, final AttributeSet attributeSet, final int defStyleAttr, final int defStyleRes) { super(context, attributeSet, defStyleAttr, defStyleRes); - LayoutInflater.from(context).inflate( - getResourceIdentifierOrThrow(context, "revanced_sb_new_segment", "layout"), this, true + LayoutInflater.from(context).inflate(getResourceIdentifierOrThrow(context, + ResourceType.LAYOUT, "revanced_sb_new_segment"), this, true ); initializeButton( @@ -104,7 +105,7 @@ public NewSegmentLayout(final Context context, final AttributeSet attributeSet, */ private void initializeButton(final Context context, final String resourceIdentifierName, final ButtonOnClickHandlerFunction handler, final String debugMessage) { - ImageButton button = findViewById(getResourceIdentifierOrThrow(context, resourceIdentifierName, "id")); + ImageButton button = findViewById(getResourceIdentifierOrThrow(context, ResourceType.ID, resourceIdentifierName)); // Add ripple effect RippleDrawable rippleDrawable = new RippleDrawable( diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java index d6e027802d..6e2c9e241d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/sponsorblock/ui/SponsorBlockViewController.java @@ -64,9 +64,10 @@ public static void initialize(ViewGroup viewGroup) { Context context = Utils.getContext(); RelativeLayout layout = new RelativeLayout(context); - layout.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.MATCH_PARENT)); + layout.setLayoutParams(new RelativeLayout.LayoutParams( + RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT)); LayoutInflater.from(context).inflate(getResourceIdentifierOrThrow( - "revanced_sb_inline_sponsor_overlay", "layout"), layout); + ResourceType.LAYOUT, "revanced_sb_inline_sponsor_overlay"), layout); inlineSponsorOverlayRef = new WeakReference<>(layout); viewGroup.addView(layout); @@ -85,14 +86,14 @@ public void onChildViewRemoved(View parent, View child) { }); youtubeOverlaysLayoutRef = new WeakReference<>(viewGroup); - skipHighlightButtonRef = new WeakReference<>(Objects.requireNonNull( - layout.findViewById(getResourceIdentifier("revanced_sb_skip_highlight_button", "id")))); + skipHighlightButtonRef = new WeakReference<>(Objects.requireNonNull(layout.findViewById( + getResourceIdentifier(ResourceType.ID, "revanced_sb_skip_highlight_button")))); - skipSponsorButtonRef = new WeakReference<>(Objects.requireNonNull( - layout.findViewById(getResourceIdentifier("revanced_sb_skip_sponsor_button", "id")))); + skipSponsorButtonRef = new WeakReference<>(Objects.requireNonNull(layout.findViewById( + getResourceIdentifier(ResourceType.ID, "revanced_sb_skip_sponsor_button")))); - NewSegmentLayout newSegmentLayout = Objects.requireNonNull( - layout.findViewById(getResourceIdentifier("revanced_sb_new_segment_view", "id"))); + NewSegmentLayout newSegmentLayout = Objects.requireNonNull(layout.findViewById( + getResourceIdentifier(ResourceType.ID, "revanced_sb_new_segment_view"))); newSegmentLayoutRef = new WeakReference<>(newSegmentLayout); newSegmentLayout.updateLayout(); From 56876f336ba39ed854b9ac0ab72c4a80979b6b04 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 21 Sep 2025 21:21:56 +0400 Subject: [PATCH 09/59] finish merge --- patches/api/patches.api | 4 - .../shared/misc/privacy/Fingerprints.kt | 8 +- .../misc/privacy/SanitizeSharingLinksPatch.kt | 46 +++++----- .../RemoveTrackingQueryParameterPatch.kt | 89 ------------------- 4 files changed, 31 insertions(+), 116 deletions(-) delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index 0002f71932..0679b7923a 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1600,10 +1600,6 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_20_37_or_greater ()Z } -public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { - public static final fun getRemoveTrackingQueryParameterPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatchKt { public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/Fingerprints.kt index 5eb72594d8..f549ffc56c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/Fingerprints.kt @@ -1,8 +1,12 @@ package app.revanced.patches.shared.misc.privacy -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.AccessFlags +import app.revanced.patcher.checkCast +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall +import app.revanced.patcher.opcode +import app.revanced.patcher.string +import com.android.tools.smali.dexlib2.Opcode internal val youTubeCopyTextFingerprint by fingerprint { returns("V") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt index 860a253af5..e0d91a4727 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/SanitizeSharingLinksPatch.kt @@ -1,21 +1,20 @@ package app.revanced.patches.shared.misc.privacy import app.revanced.patcher.Fingerprint -import app.revanced.patcher.Match import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatchBuilder import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.util.addInstructionsAtControlFlowLabel +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/shared/patches/SanitizeSharingLinksPatch;" @@ -56,34 +55,39 @@ internal fun sanitizeSharingLinksPatch( } ) - fun Fingerprint.hook( - getInsertIndex: Match.PatternMatch.() -> Int, - getUrlRegister: MutableMethod.(insertIndex: Int) -> Int, - ) { - val insertIndex = patternMatch!!.getInsertIndex() - val urlRegister = method.getUrlRegister(insertIndex) + fun Fingerprint.hookUrlString(matchIndex: Int) { + val index = instructionMatches[matchIndex].index + val urlRegister = method.getInstruction(index).registerA method.addInstructions( - insertIndex, + index + 1, """ - invoke-static {v$urlRegister}, $EXTENSION_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; + invoke-static { v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; move-result-object v$urlRegister """ ) } - // YouTube share sheet.\ - youTubeShareSheetFingerprint.hook(getInsertIndex = { startIndex + 1 }) { insertIndex -> - getInstruction(insertIndex - 1).registerA - } + fun Fingerprint.hookIntentPutExtra(matchIndex: Int) { + val index = instructionMatches[matchIndex].index + val urlRegister = method.getInstruction(index).registerE - // Native system share sheet. - youTubeSystemShareSheetFingerprint.hook(getInsertIndex = { endIndex }) { insertIndex -> - getInstruction(insertIndex - 1).registerA + method.addInstructionsAtControlFlowLabel( + index, + """ + invoke-static { v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$urlRegister + """ + ) } - youTubeCopyTextFingerprint.hook(getInsertIndex = { startIndex + 2 }) { insertIndex -> - getInstruction(insertIndex - 2).registerA - } + // YouTube share sheet copy link. + youTubeCopyTextFingerprint.hookUrlString(0) + + // YouTube share sheet other apps. + youTubeShareSheetFingerprint.hookIntentPutExtra(3) + + // Native system share sheet. + youTubeSystemShareSheetFingerprint.hookIntentPutExtra(3) } } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt deleted file mode 100644 index 6e849cb102..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatch.kt +++ /dev/null @@ -1,89 +0,0 @@ -package app.revanced.patches.youtube.misc.privacy - -import app.revanced.patcher.Fingerprint -import app.revanced.patcher.Match -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -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.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.settings.PreferenceScreen -import app.revanced.patches.youtube.misc.settings.settingsPatch -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction - -private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/youtube/patches/RemoveTrackingQueryParameterPatch;" - -@Deprecated("Patch was renamed", ReplaceWith("sanitizeSharingLinksPatch")) -@Suppress("unused") -val removeTrackingQueryParameterPatch = bytecodePatch{ - dependsOn(sanitizeSharingLinksPatch) - -//// TODO: Rename this to "Sanitize sharing links" to be consistent with other apps. -// val removeTrackingQueryParameterPatch = bytecodePatch( -// name = "Remove tracking query parameter", -// description = "Adds an option to remove the tracking parameter from links you share.", -//) { -// dependsOn( -// sharedExtensionPatch, -// settingsPatch, -// addResourcesPatch, -// ) -// -// compatibleWith( -// "com.google.android.youtube"( -// "19.34.42", -// "19.43.41", -// "20.07.39", -// "20.13.41", -// "20.14.43", -// ) -// ) -// -// execute { -// addResources("youtube", "misc.privacy.removeTrackingQueryParameterPatch") -// -// PreferenceScreen.MISC.addPreferences( -// SwitchPreference("revanced_remove_tracking_query_parameter"), -// ) -// -// fun Fingerprint.hookUrlString(matchIndex: Int) { -// val index = instructionMatches[matchIndex].index -// val urlRegister = method.getInstruction(index).registerA -// -// method.addInstructions( -// index + 1, -// """ -// invoke-static { v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; -// move-result-object v$urlRegister -// """ -// ) -// } -// -// fun Fingerprint.hookIntentPutExtra(matchIndex: Int) { -// val index = instructionMatches[matchIndex].index -// val urlRegister = method.getInstruction(index).registerE -// -// method.addInstructionsAtControlFlowLabel( -// index, -// """ -// invoke-static { v$urlRegister }, $EXTENSION_CLASS_DESCRIPTOR->sanitize(Ljava/lang/String;)Ljava/lang/String; -// move-result-object v$urlRegister -// """ -// ) -// } -// -// // YouTube share sheet copy link. -// copyTextFingerprint.hookUrlString(0) -// -// // YouTube share sheet other apps. -// youtubeShareSheetFingerprint.hookIntentPutExtra(3) -// -// // Native system share sheet. -// systemShareSheetFingerprint.hookIntentPutExtra(3) -// } -//} From ecf57521009aefe0b549c25f70905d1ff27396a5 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 22 Sep 2025 17:39:11 +0400 Subject: [PATCH 10/59] fix merge error --- .../youtube/patches/HidePlayerOverlayButtonsPatch.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java index 23ecdcfd0e..a4c23aa11e 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HidePlayerOverlayButtonsPatch.java @@ -30,6 +30,15 @@ public static int getCastButtonOverrideV2(int original) { return Settings.HIDE_CAST_BUTTON.get() ? View.GONE : original; } + /** + * Injection point. + */ + public static boolean getCastButtonOverrideV2(boolean original) { + if (Settings.HIDE_CAST_BUTTON.get()) return false; + + return original; + } + /** * Injection point. */ From 45d42a14055f969c925cad3c2a20d7a2c08eab20 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 22 Sep 2025 18:48:44 +0400 Subject: [PATCH 11/59] fix merge error --- .../patches/youtube/misc/settings/SettingsPatch.kt | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) 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 afb5f32f56..76dcab24a3 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 @@ -216,15 +216,6 @@ val settingsPatch = bytecodePatch( } } -// // Add setting to force Cairo settings fragment on/off. -// cairoFragmentConfigFingerprint.let { -// it.method.insertLiteralOverride( -// it.instructionMatches.last().index, -// "$LICENSE_ACTIVITY_HOOK_CLASS_DESCRIPTOR->useCairoSettingsFragment(Z)Z" -// ) -// } -// } - // Add setting to force Cairo settings fragment on/off. cairoFragmentConfigFingerprint.method.insertLiteralOverride( cairoFragmentConfigFingerprint.instructionMatches.first().index, @@ -254,9 +245,11 @@ internal fun modifyActivityForSettingsInjection( // Modify Activity and remove all existing layout code. // Must modify an existing activity and cannot add a new activity to the manifest, // as that fails for root installations. + val superClass = activityOnCreateClass.superclass activityOnCreateMethod.addInstructions( - 1, + 0, """ + invoke-super { p0, p1 }, $superClass->onCreate(Landroid/os/Bundle;)V invoke-static { p0 }, $extensionClassType->initialize(Landroid/app/Activity;)V return-void """ From 7e010d38cc60abf964af812c00e7233cebf99824 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 22 Sep 2025 22:05:54 +0400 Subject: [PATCH 12/59] delete deprecated dummy files --- patches/api/patches.api | 9 --------- .../upgradebutton/HideUpgradeButtonPatch.kt | 16 ---------------- .../youtube/misc/autorepeat/AutoRepeatPatch.kt | 9 --------- 3 files changed, 34 deletions(-) delete mode 100644 patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/HideUpgradeButtonPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index 8c5b2064f6..07bff2de18 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -356,11 +356,6 @@ public final class app/revanced/patches/music/layout/premium/HideGetPremiumPatch public static final fun getHideGetPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/music/layout/upgradebutton/HideUpgradeButtonPatchKt { - public static final fun getHideUpgradeButton ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getRemoveUpgradeButton ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatchKt { public static final fun getBypassCertificateChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1483,10 +1478,6 @@ public final class app/revanced/patches/youtube/misc/announcements/Announcements public static final fun getAnnouncementsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatchKt { - public static final fun getAutoRepeatPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatchKt { public static final fun getBackgroundPlaybackPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/HideUpgradeButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/HideUpgradeButtonPatch.kt deleted file mode 100644 index 0b0f244975..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/HideUpgradeButtonPatch.kt +++ /dev/null @@ -1,16 +0,0 @@ -package app.revanced.patches.music.layout.upgradebutton - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.music.layout.navigationbar.navigationBarPatch - -@Deprecated("Patch is obsolete and was replaced by navigation bar patch", ReplaceWith("navigationBarPatch")) -@Suppress("unused") -val hideUpgradeButton = bytecodePatch{ - dependsOn(navigationBarPatch) -} - -@Deprecated("Patch was renamed", ReplaceWith("hideUpgradeButton")) -@Suppress("unused") -val removeUpgradeButton = bytecodePatch{ - dependsOn(hideUpgradeButton) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt deleted file mode 100644 index 655f6d1762..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatch.kt +++ /dev/null @@ -1,9 +0,0 @@ -package app.revanced.patches.youtube.misc.autorepeat - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.misc.loopvideo.loopVideoPatch - -@Deprecated("Patch was renamed", ReplaceWith("looVideoPatch")) -val autoRepeatPatch = bytecodePatch { - dependsOn(loopVideoPatch) -} From d6593e2acd8aac1a06209bb833f308b50252a8f2 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 23 Sep 2025 22:10:14 +0400 Subject: [PATCH 13/59] finish merge --- .../instagram/hide/navigation/Fingerprints.kt | 17 ++++------------- .../hide/navigation/HideNavigationButtons.kt | 13 +++++++++++-- .../patches/music/shared/Fingerprints.kt | 2 +- .../youtube/video/codecs/Fingerprints.kt | 2 +- 4 files changed, 17 insertions(+), 17 deletions(-) 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 21653771aa..495abcb463 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 @@ -2,22 +2,13 @@ package app.revanced.patches.instagram.hide.navigation import app.revanced.patcher.fingerprint -import app.revanced.patcher.patch.BytecodePatchContext -internal val initializeNavigationButtonsListFingerprint = fingerprint { - strings("Nav3") - parameters("Lcom/instagram/common/session/UserSession;", "Z") +internal val initializeNavigationButtonsListFingerprint by fingerprint { returns("Ljava/util/List;") + parameters("Lcom/instagram/common/session/UserSession;", "Z") + strings("Nav3") } -private val navigationButtonsEnumClassDef by fingerprint { +internal val navigationButtonsEnumClassDef by fingerprint { strings("FEED", "fragment_feed", "SEARCH", "fragment_search") } - -context(BytecodePatchContext) -internal val navigationButtonsEnumInitFingerprint get() = fingerprint { - custom { method, classDef -> - method.name == "" - && classDef == navigationButtonsEnumClassDef.classDef - } -} 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 4ada34d27a..a66eb29843 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,6 +1,7 @@ package app.revanced.patches.instagram.hide.navigation import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.booleanOption import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.addInstructionsAtControlFlowLabel @@ -45,9 +46,17 @@ val hideNavigationButtonsPatch = bytecodePatch( ) } - val enumNameField: String - // Get the field name which contains the name of the enum for the navigation button ("fragment_clips", "fragment_share", ...) + // Get the field name which contains the name of the enum for the navigation button + // ("fragment_clips", "fragment_share", ...) + val navigationButtonsEnumInitFingerprint by fingerprint { + custom { method, classDef -> + method.name == "" + && classDef == navigationButtonsEnumClassDef.classDef + } + } + + val enumNameField: String with(navigationButtonsEnumInitFingerprint.method) { enumNameField = indexOfFirstInstructionOrThrow { opcode == Opcode.IPUT_OBJECT && diff --git a/patches/src/main/kotlin/app/revanced/patches/music/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/shared/Fingerprints.kt index d6c79197d3..3c334e376a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/shared/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint internal const val YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE = "Lcom/google/android/apps/youtube/music/activities/MusicActivity;" -internal val mainActivityOnCreateFingerprint = fingerprint { +internal val mainActivityOnCreateFingerprint by fingerprint { returns("V") parameters("Landroid/os/Bundle;") custom { method, classDef -> 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 a7790191f4..d995003d0a 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 @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.video.codecs import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val vp9CapabilityFingerprint = fingerprint { +internal val vp9CapabilityFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") strings( From 59e1321e62f29b1033d7aa122dd54a0282b3ecd6 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 25 Sep 2025 16:25:28 +0400 Subject: [PATCH 14/59] debugging --- .../youtube/returnyoutubedislike/ReturnYouTubeDislike.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java index 7fc068ab50..849b8e9572 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/returnyoutubedislike/ReturnYouTubeDislike.java @@ -555,7 +555,8 @@ private Spanned waitForFetchAndUpdateReplacementSpan(@NonNull Spanned original, if (originalDislikeSpan != null && replacementLikeDislikeSpan != null && spansHaveEqualTextAndColor(original, originalDislikeSpan)) { - Logger.printDebug(() -> "Replacing span with previously created dislike span of data: " + videoId); + Logger.printDebug(() -> "Replacing span: " + original + " with " + + "previously created dislike span of data: " + videoId); return replacementLikeDislikeSpan; } From 7b02a31e3fe20ccd06c1ee139f6941e5b4cfe635 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 25 Sep 2025 22:13:12 +0400 Subject: [PATCH 15/59] unofficial 20.39 work in progress (navigation bar notification tab icon fix is TODO) --- patches/api/patches.api | 1 + .../layout/shortsplayer/Fingerprints.kt | 30 +++++++++++++++++++ .../OpenShortsInRegularPlayerPatch.kt | 13 +++++--- .../misc/navigation/NavigationBarHookPatch.kt | 10 ++++++- .../misc/playservice/VersionCheckPatch.kt | 3 ++ 5 files changed, 52 insertions(+), 5 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 166ca34d71..9b0d50b4a2 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1601,6 +1601,7 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_20_31_or_greater ()Z public static final fun is_20_34_or_greater ()Z public static final fun is_20_37_or_greater ()Z + public static final fun is_20_39_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatchKt { diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt index 32228fa623..c1debb442b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt @@ -1,5 +1,7 @@ package app.revanced.patches.youtube.layout.shortsplayer +import app.revanced.patcher.checkCast +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint import app.revanced.patcher.literal import app.revanced.patcher.methodCall @@ -7,10 +9,12 @@ import app.revanced.patcher.string import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode /** * Purpose of this method is not clear, and it's only used to identify * the obfuscated name of the videoId() method in PlaybackStartDescriptor. + * 20.39 and lower. */ internal val playbackStartFeatureFlagFingerprint by fingerprint { returns("Z") @@ -26,6 +30,32 @@ internal val playbackStartFeatureFlagFingerprint by fingerprint { ) } +/** + * Purpose of this method is not entirely clear, and it's only used to identify + * the obfuscated name of the videoId() method in PlaybackStartDescriptor. + * 20.39+ + */ +internal val watchPanelVideoIdFingerprint by fingerprint { + returns("Ljava/lang/String;") + parameters() + instructions( + fieldAccess( + opcode = Opcode.IGET_OBJECT, + type = "Lcom/google/android/apps/youtube/app/common/player/queue/WatchPanelId;" + ), + checkCast("Lcom/google/android/apps/youtube/app/common/player/queue/DefaultWatchPanelId;"), + methodCall( + definingClass = "Lcom/google/android/apps/youtube/app/common/player/queue/DefaultWatchPanelId;", + returnType = "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;" + ), + methodCall( + definingClass = "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;", + returnType = "Ljava/lang/String;" + ) + ) +} + + // Pre 19.25 internal val shortsPlaybackIntentLegacyFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt index 3ecd2ad4a7..604db5f8f4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt @@ -13,6 +13,7 @@ import app.revanced.patches.youtube.layout.player.fullscreen.openVideosFullscree import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_39_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 @@ -67,12 +68,16 @@ val openShortsInRegularPlayerPatch = bytecodePatch( ) // Find the obfuscated method name for PlaybackStartDescriptor.videoId() - val playbackStartVideoIdMethodName = playbackStartFeatureFlagFingerprint.let { - val stringMethodIndex = it.instructionMatches.first().index - it.method.let { - navigate(it).to(stringMethodIndex).stop().name + val (videoIdStartMethod, videoIdIndex) = if (is_20_39_or_greater) { + watchPanelVideoIdFingerprint.let { + it.method to it.instructionMatches.last().index + } + } else { + playbackStartFeatureFlagFingerprint.let { + it.method to it.instructionMatches.first().index } } + val playbackStartVideoIdMethodName = navigate(videoIdStartMethod).to(videoIdIndex).stop().name fun extensionInstructions(playbackStartRegister: Int, freeRegister: Int) = """ 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 cb2e76f971..77ed5ed7ab 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 @@ -14,6 +14,7 @@ import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_35_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_21_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_28_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_39_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.shared.mainActivityOnBackPressedFingerprint import app.revanced.util.findFreeRegister @@ -28,6 +29,7 @@ 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.util.MethodUtil +import java.util.logging.Logger internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/shared/NavigationBar;" @@ -193,8 +195,14 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig ) } + if (is_20_39_or_greater) { + return@execute Logger.getLogger(this::class.java.name).warning( + "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) { + if (is_19_35_or_greater && !is_20_39_or_greater) { // FIXME: 20.39+ needs this fix. val cairoNotificationEnumReference = imageEnumConstructorFingerprint .instructionMatches.last().getInstruction().reference diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index 074fcb553d..40c8cef2cb 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -81,6 +81,8 @@ var is_20_34_or_greater = false private set var is_20_37_or_greater = false private set +var is_20_39_or_greater = false + private set val versionCheckPatch = resourcePatch( description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", @@ -125,5 +127,6 @@ val versionCheckPatch = resourcePatch( is_20_31_or_greater = 253205000 <= playStoreServicesVersion is_20_34_or_greater = 253505000 <= playStoreServicesVersion is_20_37_or_greater = 253805000 <= playStoreServicesVersion + is_20_39_or_greater = 253980000 <= playStoreServicesVersion } } From d3df24977a9ec5d4202247dfe369c32b53f04a2f Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 25 Sep 2025 22:14:30 +0400 Subject: [PATCH 16/59] work in progress cairo notification tab selected icon fix. Icon modified from free icon at https://fontawesome.com/icons/bell?f=classic&s=solid No attribution required, but png metadata contains the source url --- .../yt_fill_bell_cairo_black_24.png | Bin 0 -> 708 bytes .../yt_fill_bell_cairo_black_24.png | Bin 0 -> 394 bytes .../yt_fill_bell_cairo_black_24.png | Bin 0 -> 434 bytes .../yt_fill_bell_cairo_black_24.png | Bin 0 -> 843 bytes .../yt_fill_bell_cairo_black_24.png | Bin 0 -> 1423 bytes .../yt_fill_bell_cairo_black_24.png | Bin 0 -> 1287 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 patches/src/main/resources/navigationbuttons/drawable-hdpi/yt_fill_bell_cairo_black_24.png create mode 100644 patches/src/main/resources/navigationbuttons/drawable-ldpi/yt_fill_bell_cairo_black_24.png create mode 100644 patches/src/main/resources/navigationbuttons/drawable-mdpi/yt_fill_bell_cairo_black_24.png create mode 100644 patches/src/main/resources/navigationbuttons/drawable-xhdpi/yt_fill_bell_cairo_black_24.png create mode 100644 patches/src/main/resources/navigationbuttons/drawable-xxhdpi/yt_fill_bell_cairo_black_24.png create mode 100644 patches/src/main/resources/navigationbuttons/drawable-xxxhdpi/yt_fill_bell_cairo_black_24.png diff --git a/patches/src/main/resources/navigationbuttons/drawable-hdpi/yt_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-hdpi/yt_fill_bell_cairo_black_24.png new file mode 100644 index 0000000000000000000000000000000000000000..7381ab7ef40b7ce23eeeb2f8d588d909c60323a7 GIT binary patch literal 708 zcmV;#0z3VQP)%4b4NL^rM8#AC!4*YJ1r-c55F;^j0sn-ep^4%WiHV_+xxc|g6f;3) z=KGiqrmNq5OH~g{FvB^0U)|-r)6=!|%-Yck`&l(q`ap*KhSno~3VwjU$8>GZ8mV^l zHMEAUZotp*8r(XjYjf7@A>D?)h7PmM6SxC*Va}R8-CFUuk0Iar8I*Uy2-fUr)^8oq z%voIAf*WB3Yqu%d>kP{}v>G~z>`Qn8<~Fi+oSqlZ8A2Ue3>`r772FTqkdTEv_P(ae zSwb1LhBhO04<3T8ILN?Vs0JaAT0{GgxehnLRygCV8pYXKL+4T23;RMd=W2#)4B4ZY zu|_l1<7}0NjVXbpIUfT@mL__x)le%tUSr4}@4i`~ilQ27Wm}64OwWz^k2r+$%&SF+ zQDaD&`!qJL3@W#4L>%dVz@zEU922k3^RE>R#K@k2?P zJnn1AbL0)`-gW&4!ynetwK;3{kZwa?L+KUXoTNbhbMu~YHXVrRy0ri5}pS-tFdjOt7weqE@zqAOQ`9Y$-K6reG*Hs3wl0c=9fj@vcc&rm2dQx zk<79TP!_3<^YsbeJE-Ri|H7|P7FpsEPm%EDwoz{Z-_v9npe&k2-h_QHW46wfMO!#K zun%S|t8;0QM|*`c1N&g+nvmD9R8?BEhO!9%3bU&*oEAMGZo`ehL)JGK;j9*YvyahC zi#*n6jHkeR);stS=&TlfvtEOpKiZFwe7!Os!_z=#HMUKpcT~Fm;a(6g0-e>^Ht`Jr o0RR8zVFtkf000I_L_t&o02XjBCC>ThR{#J207*qoM6N<$g8PZBfB*mh literal 0 HcmV?d00001 diff --git a/patches/src/main/resources/navigationbuttons/drawable-mdpi/yt_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-mdpi/yt_fill_bell_cairo_black_24.png new file mode 100644 index 0000000000000000000000000000000000000000..8fec480718c0bd6acc6263ced2fa3e0bf030d9ea GIT binary patch literal 434 zcmV;j0ZsmiP);J;F>((^u0eDyx(mexm@6orgELK4O;>fbAk1(t z_3FO+>Q2wl-BT0){27~oSuXSrz7J@v#TS~=r z-xaXVz!O}CDb(!gNqfz{6flkJ9`3*#wrS|mOF4>Cz!CNX*aba@Ia4X%f}u&+1wEHJ zQ!cuS=zD0+u*Ap(sISJ>;%<$uGb}M$MJ(R~ez4Y1{}IURn>813+BoWq)|s||EzWE;qnB_-a}!2L1Lo;Iz!}&V&O9>Y87#j@ z15S{4;a}nGaX6d?`0#oQ4LxgTpTn6n;DzP}^!5+wiv~G@TIjKM_BC{+0bwt!ePV`t z>o!e2Vr{?;Q@$qs*3w!Hxs2L?PmZ~U-mTJF4XKRUfbuDY?hgO}0RR78%_Up_000I_ cL_t&o0L|1cG2$G_PXGV_07*qoM6N<$g1xrFi2wiq literal 0 HcmV?d00001 diff --git a/patches/src/main/resources/navigationbuttons/drawable-xhdpi/yt_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-xhdpi/yt_fill_bell_cairo_black_24.png new file mode 100644 index 0000000000000000000000000000000000000000..2eed03d8b17dbc774585eab9d5a9f600465dbd85 GIT binary patch literal 843 zcmV-R1GM~!P)4Mbl+OcfDD%|%2|%oJ2aGeO_L%*aTyjeG=OKn+9_ zzi)ONSlOxi|DNiVg;~y->Zv+){yNj!J>5OaXO{TiG{FDffzv&(z#dpb-wpT)ejn0p z`y8XI9a`^!-7M`hd@*=zkT@XzQ9>{l@aRKT@lgA_h4pZ(W+yc8|D-&Nqy=e028el!8p2A&lQtZUw z3DlD&hpquGQRXDTQj%cQ(LEoR7d%5%dx0skb#E`hg}J!2i`fgPHxj=xvR# zdp3aj&0+VvP;YC5XC}lWPybg(ZyIm-?VPgA2KbHpPx!4T>TM0|W5@`f>Fn&upNew32+6+^m&>&S$KD6te~^03t00lMqZ)PER0%!2TV(SGoo(^uTJlm z3~K?3=}X29$BJvH1^Cc#AziJCYp4bA?Bl~Lf2ioXfUfhb`GU!h;aJoH{9>kO123ID zs7kaT@(|RPyd1Npk8g_i2ekm9)eJ>nhHa$DXp4R=1H3C%nm?G)&Y$_uyOsf7<2?&& zP@}e{3yrr7;PK+)_Su>7rCq!lwc}NZk(L20`;`}edAUjJPpdy@rQ7y7riSh|XdS>+ z`RP7q!)K^IGM8@K=NLon&_{rFs|z?y0|Y*#UL}7300960*HAg100006NklWK(2w)I(?gwezWTbmZuRZHXU`0OV-*+#8Y|Dt z%plMp&;$i0>>kdbL7)i=OxWG!8FUuhE(b4x1z;oCKMR-L=04llmRfU2EHG3*@EpJiS>6ZUnC5 z#+q$xYmBk3j}3_2Sz92-6EB?`GCE<5vF6AK&kLz7(0$PKQpq_Bj4{?6q^V=I1^S$B zIj-Qc%vf_|1?L3S6zDt%z5+_k9Of#`(HtLx34RZeht_9Y_#hOK8GoH+L3GOTKDe(584f5u^jQpR0uYomjvDSt_ zp8l^vQ-Q9)w{6z=k|M7HYvbZ9S|E?A)F%~V*1<>+n zdiNbUD3f-qS?gI^SX&M(##p349=ZFW^)Waf)HZ8=NKxlWa$&LDA_a1G>n!(9XoV3Z zS5vd5wO=McF1T`w6zFQ`ya2pk!gXR7Q}smjUH>Cn%L!lt8U~Syk4xnUGta zD1rRcDC|#oxc7#|NuvbvlrAO{oWMK#;*?PWJzUHrKEXo~DI)}O-r?6A5qu(Z$VqNR zIU@wR1_lp;zL{rr@z@w4kax}@17fhk9yqxbr7ac6*|RS-U0K9pZg9-HkAu9-XpWO1rY&T>zBOEyIyAISN} zSjhJ*9Z4&9-<9-@v_=$C1bTps&Q5VtZT7*wH0nf(Kwi6|QQ{sqO6o(3KwIeaZZPfU zgN3b4JCP#Lc9Q-N_JV0OpLY1_@Xn?kND;`Ki}~kUTr2ShL0@bV54o3{oZC&90Zym+91#%&z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;y$tNB~HePQ5Jv000SaNLh0L04^f{04^f|c%?sf00007 zbV*G`2k8kJ5hw}d`$fk900c`(L_t(|+U=dqixfu~ho9-0T}MsWsIYP4__2$IC>s(I zU4sdRC?p}cySVXWj^ZtfcoHP19P%dw&1uicA@~g|f<%(DVKqdA5TfP-5_UZ3xZ})t zsOm)|ti3Z`-St+#54@LUr>5rjtFEekyQ&%#MNt$*Q4~cf8YN-%T@OqE9|PNfLHqZA zfSbT2;0*AGTARM`-vCXZ^PFhf|6Q-LrNbmJmq7SuW6pk7>4DFIb{FEu(Y9qMUGOQ; z>OuTCTDB}@39Rk1+gYqTTC1`qXF5gke35eKx;y*P-yw#$UjG zpugziSAnCBW<5z}MaOI%a-*E%cP|5W0LL*|%}U1KKM$-1ZeX&ht)g{1W5AC z$3x&6u-(?F5JbQTa1MBoqxf+=04@MqJe`)O&MM$*pzeYAanx;{Ruy5;J#1$@ZI29S z+k1pVc5Di^>)8hU1U&Xg{5T%lF=;f*$w`)d-g4j|@J7zFuf=ABZ`wLmLu>tIJJYyD zIuBV~MGN>9cq^+$lGPPZ#XOZ-=lM({0&2iiNMk`f?VR`JyaZr%T$Hr(X@B2K;M(gVW2* zb@^>%6JfHXA}_HJo-8eM?XF8gSO~jPvH=4D7%(8&fK34yuu-xB!vPpDEZKn301OzF zY{1R{3>cGoA5g{Y&y~Ks;~^#~H!tl9*h?5|YnB5aNbG{f35N-374F0A!|DVQ_i&Uq zb9Dtw;^D6J9vA}lNviPWfLebX7o~{*HhyisNHcawFyKO<;&*`WeHVXEz~aYSnRfds zem~~q!cO2ZON#4U(_D1)1#p1y83Y~yKloIs_sHkCfxM!L*+1X~Yk=PiBz_#fVU9Y; zl``hE+D<`ZhMd>EepO)c|hKyFSP7nsNwDf4mFiG8K)c=a7txO&N|XP*tKrU zRF=Rv>Al8kT;=SJBR!hXvSlbeu&>MRsE)ApoIdjkaGK;V^E_=o<2}+2(Wu$}{1ePs xba5i=Z{QcqvdFWTgSZt%Q4~c{6h%?I Date: Thu, 25 Sep 2025 22:16:09 +0400 Subject: [PATCH 17/59] remove 20.07 (one of the more difficult and constantly changing sanitize url fingerprints no longer matches, and don't want to fix. Only the oldest and latest are what anyone cares about) --- .../patches/youtube/ad/general/HideAdsPatch.kt | 1 - .../youtube/ad/getpremium/HideGetPremiumPatch.kt | 1 - .../revanced/patches/youtube/ad/video/VideoAdsPatch.kt | 1 - .../interaction/copyvideourl/CopyVideoUrlPatch.kt | 1 - .../dialog/RemoveViewerDiscretionDialogPatch.kt | 1 - .../doubletap/DisableChapterSkipDoubleTapPatch.kt | 1 - .../youtube/interaction/downloads/DownloadsPatch.kt | 1 - .../youtube/interaction/seekbar/SeekbarPatch.kt | 1 - .../interaction/swipecontrols/SwipeControlsPatch.kt | 1 - .../youtube/layout/autocaptions/AutoCaptionsPatch.kt | 1 - .../youtube/layout/branding/CustomBrandingPatch.kt | 1 - .../layout/branding/header/ChangeHeaderPatch.kt | 1 - .../youtube/layout/buttons/action/HideButtonsPatch.kt | 1 - .../buttons/navigation/NavigationButtonsPatch.kt | 1 - .../buttons/overlay/HidePlayerOverlayButtonsPatch.kt | 1 - .../youtube/layout/formfactor/ChangeFormFactorPatch.kt | 1 - .../hide/endscreencards/HideEndscreenCardsPatch.kt | 1 - .../HideEndScreenSuggestedVideoPatch.kt | 1 - .../DisableFullscreenAmbientModePatch.kt | 1 - .../layout/hide/general/HideLayoutComponentsPatch.kt | 1 - .../layout/hide/infocards/HideInfoCardsPatch.kt | 1 - .../flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt | 1 - .../HideRelatedVideoOverlayPatch.kt | 1 - .../DisableRollingNumberAnimationPatch.kt | 1 - .../layout/hide/shorts/HideShortsComponentsPatch.kt | 1 - .../signintotvpopup/DisableSignInToTvPatchPopup.kt | 1 - .../youtube/layout/hide/time/HideTimestampPatch.kt | 1 - .../youtube/layout/miniplayer/MiniplayerPatch.kt | 1 - .../layout/panels/popup/PlayerPopupPanelsPatch.kt | 1 - .../layout/player/fullscreen/ExitFullscreenPatch.kt | 1 - .../player/fullscreen/OpenVideosFullscreenPatch.kt | 1 - .../player/overlay/CustomPlayerOverlayOpacityPatch.kt | 1 - .../returnyoutubedislike/ReturnYouTubeDislikePatch.kt | 1 - .../youtube/layout/searchbar/WideSearchbarPatch.kt | 1 - .../layout/shortsautoplay/ShortsAutoplayPatch.kt | 1 - .../shortsplayer/OpenShortsInRegularPlayerPatch.kt | 1 - .../youtube/layout/sponsorblock/SponsorBlockPatch.kt | 10 ++++------ .../layout/spoofappversion/SpoofAppVersionPatch.kt | 1 - .../youtube/layout/startpage/ChangeStartPagePatch.kt | 4 ---- .../DisableResumingShortsOnStartupPatch.kt | 1 - .../patches/youtube/layout/theme/ThemePatch.kt | 1 - .../layout/thumbnails/AlternativeThumbnailsPatch.kt | 1 - .../thumbnails/BypassImageRegionRestrictionsPatch.kt | 1 - .../youtube/misc/announcements/AnnouncementsPatch.kt | 1 - .../misc/backgroundplayback/BackgroundPlaybackPatch.kt | 1 - .../youtube/misc/debugging/EnableDebuggingPatch.kt | 3 +-- .../dimensions/spoof/SpoofDeviceDimensionsPatch.kt | 1 - .../dns/CheckWatchHistoryDomainNameResolutionPatch.kt | 3 +-- .../patches/youtube/misc/gms/GmsCoreSupportPatch.kt | 1 - .../misc/hapticfeedback/DisableHapticFeedbackPatch.kt | 1 - .../youtube/misc/links/BypassURLRedirectsPatch.kt | 1 - .../youtube/misc/links/OpenLinksExternallyPatch.kt | 1 - .../patches/youtube/misc/loopvideo/LoopVideoPatch.kt | 1 - .../youtube/misc/privacy/SanitizeSharingLinksPatch.kt | 3 +-- .../youtube/misc/spoof/SpoofVideoStreamsPatch.kt | 3 +-- .../youtube/video/audio/ForceOriginalAudioPatch.kt | 1 - .../youtube/video/codecs/DisableVideoCodecsPatch.kt | 1 - .../patches/youtube/video/quality/VideoQualityPatch.kt | 1 - .../patches/youtube/video/speed/PlaybackSpeedPatch.kt | 1 - 59 files changed, 8 insertions(+), 71 deletions(-) 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 88e1dd603c..59d27418a6 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 @@ -77,7 +77,6 @@ val hideAdsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 617542dd2b..c93c9e1bc3 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 @@ -26,7 +26,6 @@ val hideGetPremiumPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 709bb7c4b6..f887d43550 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 @@ -24,7 +24,6 @@ val videoAdsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt index 94c4fa7a05..103dab91ff 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt @@ -54,7 +54,6 @@ val copyVideoUrlPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 b4da23b5ad..401572ec86 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 @@ -27,7 +27,6 @@ val removeViewerDiscretionDialogPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 bfb79ec021..0f415b5248 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 @@ -28,7 +28,6 @@ val disableDoubleTapActionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "20.07.39", "20.13.41", "20.14.43", ) 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 682f9750a5..2d71d8a6c3 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 @@ -74,7 +74,6 @@ val downloadsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt index d253488f3f..64cfacb00e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt @@ -21,7 +21,6 @@ val seekbarPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 0ce7556003..6fd5fb7697 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 @@ -96,7 +96,6 @@ val swipeControlsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 cc4e0e2271..a1509ea05d 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 @@ -25,7 +25,6 @@ val autoCaptionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index 64ea92ab8b..54c6d132b0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -44,7 +44,6 @@ val customBrandingPatch = resourcePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt index 8cf99e2f19..9d26c1797a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt @@ -94,7 +94,6 @@ val changeHeaderPatch = resourcePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt index 0062253126..329beb7b68 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt @@ -26,7 +26,6 @@ val hideButtonsPatch = resourcePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 f9bba9dc61..7cc05190c2 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 @@ -39,7 +39,6 @@ val navigationButtonsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 22df5f36fd..1c0cfe3090 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 @@ -46,7 +46,6 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 5df7ce4b42..69e6939c24 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 @@ -33,7 +33,6 @@ val changeFormFactorPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 608c020f6b..bbbaf08efd 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 @@ -60,7 +60,6 @@ val hideEndscreenCardsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 5653865596..f96923be4b 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 @@ -32,7 +32,6 @@ val hideEndScreenSuggestedVideoPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 7edea5fba5..2eaba52b5c 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 @@ -30,7 +30,6 @@ val disableFullscreenAmbientModePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 47cb8541eb..5e6f701552 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 @@ -111,7 +111,6 @@ val hideLayoutComponentsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 c7925d3742..6368fb5cef 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 @@ -51,7 +51,6 @@ val hideInfoCardsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt index e1832e3dff..551615321b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt @@ -25,7 +25,6 @@ val hidePlayerFlyoutMenuPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 9f509a5787..fa1f61c55d 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 @@ -30,7 +30,6 @@ val hideRelatedVideoOverlayPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 d82642d91c..c64e89df12 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 @@ -30,7 +30,6 @@ val disableRollingNumberAnimationPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 ce308643f9..8d5559fbe4 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 @@ -172,7 +172,6 @@ val hideShortsComponentsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 2de162a0ae..3813f810e1 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 @@ -27,7 +27,6 @@ val disableSignInToTvPopupPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 e7db9ec5ef..a7aa35ff8d 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 @@ -24,7 +24,6 @@ val hideTimestampPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 e6ee749e2c..079f3d434e 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 @@ -84,7 +84,6 @@ val miniplayerPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 518b3b04c9..fef1c100f2 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 @@ -22,7 +22,6 @@ val playerPopupPanelsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt index 42babd5ce5..6e09680830 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt @@ -22,7 +22,6 @@ internal val exitFullscreenPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 fba4a9dbaf..e38cfd45a6 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 @@ -24,7 +24,6 @@ val openVideosFullscreenPatch = bytecodePatch( "19.34.42", "19.43.41", "19.47.53", - "20.07.39", "20.13.41", "20.14.43", ) 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 6c2b8023b3..c04082c64d 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 @@ -28,7 +28,6 @@ val customPlayerOverlayOpacityPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 24a59068a7..4a13646999 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 @@ -62,7 +62,6 @@ val returnYouTubeDislikePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 8114d2ebcb..448d9208bd 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 @@ -40,7 +40,6 @@ val wideSearchbarPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 45178bf0ac..8f67165609 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 @@ -45,7 +45,6 @@ val shortsAutoplayPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt index 604db5f8f4..4e59e80b49 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt @@ -47,7 +47,6 @@ val openShortsInRegularPlayerPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index d335d30110..addd09811e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -3,12 +3,8 @@ package app.revanced.patches.youtube.layout.sponsorblock import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.instructions -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.all.misc.resources.addResources import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.shared.misc.mapping.resourceMappingPatch @@ -16,7 +12,10 @@ import app.revanced.patches.shared.misc.settings.preference.NonInteractivePrefer import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playercontrols.* +import app.revanced.patches.youtube.misc.playercontrols.addTopControl +import app.revanced.patches.youtube.misc.playercontrols.initializeTopControl +import app.revanced.patches.youtube.misc.playercontrols.injectVisibilityCheckCall +import app.revanced.patches.youtube.misc.playercontrols.playerControlsPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch @@ -133,7 +132,6 @@ val sponsorBlockPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 c6dec99433..acebf6cbda 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 @@ -39,7 +39,6 @@ val spoofAppVersionPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 de571c76a4..147ec2aaaa 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 @@ -13,10 +13,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.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.StringReference private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ChangeStartPagePatch;" @@ -33,7 +30,6 @@ val changeStartPagePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 44cdddef49..7aa9956a57 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 @@ -35,7 +35,6 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 4879c105be..2ee5993e3d 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 @@ -205,7 +205,6 @@ val themePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt index b96330de84..776224c3ca 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt @@ -34,7 +34,6 @@ val alternativeThumbnailsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt index 2e90053831..27fd088403 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt @@ -28,7 +28,6 @@ val bypassImageRegionRestrictionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt index 25cc81d494..d36a42bf22 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt @@ -24,7 +24,6 @@ val announcementsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 737ae965b2..0a0905615d 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 @@ -44,7 +44,6 @@ val backgroundPlaybackPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt index a8f55f46c2..a4915e2a22 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt @@ -18,8 +18,7 @@ val enableDebuggingPatch = enableDebuggingPatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", - "20.13.41", + "20.13.41", "20.14.43", ) ) 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 cfe5690a0d..7e8623c80f 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 @@ -25,7 +25,6 @@ val spoofDeviceDimensionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt index 5bd5da4151..593fbe81e2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt @@ -13,8 +13,7 @@ val checkWatchHistoryDomainNameResolutionPatch = checkWatchHistoryDomainNameReso compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", - "20.13.41", + "20.13.41", "20.14.43", ) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt index 2375c42111..3ea710deb8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt @@ -36,7 +36,6 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch( compatibleWith( YOUTUBE_PACKAGE_NAME( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 4977ea644b..2f9bf8d097 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 @@ -27,7 +27,6 @@ val disableHapticFeedbackPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 3c53ff7740..84494803e3 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 @@ -27,7 +27,6 @@ val bypassURLRedirectsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt index 71916ecfb0..694ea17f22 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt @@ -42,7 +42,6 @@ val openLinksExternallyPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 bd5feee5a5..5b67397acf 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 @@ -28,7 +28,6 @@ val loopVideoPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt index c39444db04..ec5d21da28 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt @@ -15,8 +15,7 @@ val sanitizeSharingLinksPatch = sanitizeSharingLinksPatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", - "20.13.41", + "20.13.41", "20.14.43", ) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt index 0131c9e599..f5ebe2442a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt @@ -23,8 +23,7 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", - "20.13.41", + "20.13.41", "20.14.43", ) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt index bc985a70f8..5e3255619d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt @@ -45,7 +45,6 @@ val forceOriginalAudioPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) 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 c5790d1482..9ff8b7d0da 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 @@ -58,7 +58,6 @@ val disableVideoCodecsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt index 1a79087723..8acac2c3f3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt @@ -26,7 +26,6 @@ val videoQualityPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt index 2e50ba2f6a..dad03c2766 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt @@ -29,7 +29,6 @@ val playbackSpeedPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( "19.34.42", - "20.07.39", "20.13.41", "20.14.43", ) From 7eb78d4f2b55a319990ba895c8cbd646a3c325ad Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 26 Sep 2025 12:31:58 +0400 Subject: [PATCH 18/59] finish merge --- .../extension/youtube/settings/Settings.java | 2 +- patches/api/patches.api | 233 ++++++------------ .../shared/layout/theme/Fingerprints.kt | 37 ++- .../layout/seekbar/SeekbarColorPatch.kt | 5 +- .../youtube/layout/theme/Fingerprints.kt | 2 +- .../layout/theme/LithoColorHookPatch.kt | 19 -- .../youtube/video/hdr/DisableHdrPatch.kt | 10 - 7 files changed, 100 insertions(+), 208 deletions(-) delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index 9ddde505d5..5838b58aa2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -188,7 +188,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting MINIPLAYER_DOUBLE_TAP_ACTION = new BooleanSetting("revanced_miniplayer_double_tap_action", TRUE, true, new MiniplayerAnyModernAvailability()); public static final BooleanSetting MINIPLAYER_HIDE_OVERLAY_BUTTONS = new BooleanSetting("revanced_miniplayer_hide_overlay_buttons", FALSE, true, new MiniplayerHideOverlayButtonsAvailability()); public static final BooleanSetting MINIPLAYER_HIDE_SUBTEXT = new BooleanSetting("revanced_miniplayer_hide_subtext", FALSE, true, new MiniplayerHideSubtextsAvailability()); - public static final BooleanSetting MINIPLAYER_HIDE_REWIND_FORWARD = new BooleanSetting("revanced_miniplayer_hide_rewind_forward", TRUE, true, new MiniplayerPatch.MiniplayerHideRewindOrOverlayOpacityAvailability()); + public static final BooleanSetting MINIPLAYER_HIDE_REWIND_FORWARD = new BooleanSetting("revanced_miniplayer_hide_rewind_forward", TRUE, true, new MiniplayerHideRewindOrOverlayOpacityAvailability()); public static final IntegerSetting MINIPLAYER_WIDTH_DIP = new IntegerSetting("revanced_miniplayer_width_dip", 192, true, new MiniplayerAnyModernAvailability()); public static final IntegerSetting MINIPLAYER_OPACITY = new IntegerSetting("revanced_miniplayer_opacity", 100, true, new MiniplayerHideRewindOrOverlayOpacityAvailability()); diff --git a/patches/api/patches.api b/patches/api/patches.api index 7ac39ad527..8686bcfa84 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -64,10 +64,6 @@ public final class app/revanced/patches/all/misc/debugging/EnableAndroidDebuggin public static final fun getEnableAndroidDebuggingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatchKt { - public static final fun getChangeDataDirectoryLocationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/all/misc/directory/documentsprovider/ExportInternalDataDocumentsProviderPatchKt { public static final fun getExportInternalDataDocumentsProviderPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } @@ -152,10 +148,6 @@ public final class app/revanced/patches/angulus/ads/RemoveAdsPatchKt { public static final fun getAngulusPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/backdrops/misc/pro/ProUnlockPatchKt { - public static final fun getProUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatchKt { public static final fun getRemovePlayLimitsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -232,10 +224,6 @@ public final class app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatc public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatchKt { - public static final fun getRestoreHiddenBackUpWhileChargingTogglePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictionsKt { public static final fun getRemoveDeviceRestrictionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -320,14 +308,6 @@ public final class app/revanced/patches/messenger/inbox/HideInboxSubtabsPatchKt public static final fun getHideInboxSubtabsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatchKt { - public static final fun getDisableSwitchingEmojiToStickerPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatchKt { - public static final fun getDisableTypingIndicatorPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/messenger/layout/HideFacebookButtonPatchKt { public static final fun getHideFacebookButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -340,14 +320,6 @@ public final class app/revanced/patches/messenger/misc/extension/ExtensionPatchK public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/messenger/navbar/RemoveMetaAITabPatchKt { - public static final fun getRemoveMetaAITabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/meta/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatchKt { public static final fun getForceEnglishLocalePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -368,10 +340,6 @@ public final class app/revanced/patches/music/interaction/permanentrepeat/Perman public static final fun getPermanentRepeatPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatchKt { - public static final fun getPermanentShufflePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/music/layout/castbutton/HideCastButtonKt { public static final fun getHideCastButton ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -392,11 +360,6 @@ public final class app/revanced/patches/music/layout/theme/ThemePatchKt { public static final fun getThemePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/music/layout/upgradebutton/HideUpgradeButtonPatchKt { - public static final fun getHideUpgradeButton ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getRemoveUpgradeButton ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatchKt { public static final fun getBypassCertificateChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -470,10 +433,6 @@ public final class app/revanced/patches/netguard/broadcasts/removerestriction/Re public static final fun getRemoveBroadcastsRestrictionPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/nunl/ads/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -482,10 +441,6 @@ public final class app/revanced/patches/nunl/firebase/SpoofCertificatePatchKt { public static final fun getSpoofCertificatePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/nyx/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatchKt { public static final fun getFixCrashPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -712,16 +667,11 @@ public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/ public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatchKt { - public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatchKt { public static final fun getDisableScreenshotPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } public final class app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatchKt { - public static final fun getUnlockPremiumIconPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getUnlockPremiumIconsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -752,26 +702,22 @@ public final class app/revanced/patches/shared/misc/extension/ExtensionHook { public final class app/revanced/patches/shared/misc/extension/SharedExtensionPatchKt { public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; + public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function0; public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static final fun sharedExtensionPatch (Ljava/lang/String;[Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun sharedExtensionPatch ([Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch; + public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/jvm/functions/Function0; + public static final fun sharedExtensionPatch (Ljava/lang/String;[Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun sharedExtensionPatch ([Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch; } public final class app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatchKt { public static final fun getVerticalScrollPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/shared/misc/gms/FingerprintsKt { - public static final field GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME Ljava/lang/String; -} - public final class app/revanced/patches/shared/misc/gms/GmsCoreSupportPatchKt { public static final fun gmsCoreSupportPatch (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; public static synthetic fun gmsCoreSupportPatch$default (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch; - public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch; + public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; } public final class app/revanced/patches/shared/misc/hex/HexPatchBuilder : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker { @@ -810,23 +756,64 @@ public final class app/revanced/patches/shared/misc/hex/Replacement { } public final class app/revanced/patches/shared/misc/mapping/ResourceElement { - public final fun component1 ()Ljava/lang/String; + public fun (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;J)V + public final fun component1 ()Lapp/revanced/patches/shared/misc/mapping/ResourceType; public final fun component2 ()Ljava/lang/String; public final fun component3 ()J - public final fun copy (Ljava/lang/String;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; - public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceElement;Ljava/lang/String;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; + public final fun copy (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; + public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceElement;Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; public fun equals (Ljava/lang/Object;)Z public final fun getId ()J public final fun getName ()Ljava/lang/String; - public final fun getType ()Ljava/lang/String; + public final fun getType ()Lapp/revanced/patches/shared/misc/mapping/ResourceType; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { - public static final fun get (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)J + public static final fun getResourceElements ()Ljava/util/Collection; + public static final fun getResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)J public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun getResourceMappings ()Ljava/util/List; + public static final fun hasResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)Z + public static final fun resourceLiteral (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralFilter; + public static synthetic fun resourceLiteral$default (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralFilter; +} + +public final class app/revanced/patches/shared/misc/mapping/ResourceType : java/lang/Enum { + public static final field ANIM Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ANIMATOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ARRAY Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ATTR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field BOOL Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field COLOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field Companion Lapp/revanced/patches/shared/misc/mapping/ResourceType$Companion; + public static final field DIMEN Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field DRAWABLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field FONT Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field FRACTION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ID Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field INTEGER Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field INTERPOLATOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field LAYOUT Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field MENU Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field MIPMAP Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field NAVIGATION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field PLURALS Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field RAW Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STRING Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STYLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STYLEABLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field TRANSITION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field VALUES Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field XML Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getValue ()Ljava/lang/String; + public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static fun values ()[Lapp/revanced/patches/shared/misc/mapping/ResourceType; +} + +public final class app/revanced/patches/shared/misc/mapping/ResourceType$Companion { + public final fun fromValue (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/mapping/ResourceType; } public final class app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatchKt { @@ -836,7 +823,6 @@ public final class app/revanced/patches/shared/misc/pairip/license/DisableLicens public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt { public static final fun overrideThemeColors (Ljava/lang/String;Ljava/lang/String;)V public static final fun settingsPatch (Ljava/util/List;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun settingsPatch (Lkotlin/Pair;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; public static synthetic fun settingsPatch$default (Ljava/util/List;Ljava/util/Set;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; } @@ -929,8 +915,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/ListPref public fun ()V public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getEntries ()Lapp/revanced/util/resource/ArrayResource; public final fun getEntriesKey ()Ljava/lang/String; public final fun getEntryValues ()Lapp/revanced/util/resource/ArrayResource; @@ -1042,10 +1028,6 @@ public final class app/revanced/patches/spotify/layout/theme/CustomThemePatchKt public static final fun getCustomThemePatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/spotify/lite/ondemand/OnDemandPatchKt { - public static final fun getOnDemandPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/spotify/misc/extension/ExtensionPatchKt { public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1054,14 +1036,6 @@ public final class app/revanced/patches/spotify/misc/fix/SpoofClientPatchKt { public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatchKt { - public static final fun getSpoofPackageInfoPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/spotify/misc/fix/SpoofSignaturePatchKt { - public static final fun getSpoofSignaturePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatchKt { public static final fun getFixFacebookLoginPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1078,10 +1052,6 @@ public final class app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunch public static final fun getFixThirdPartyLaunchersWidgets ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/spotify/navbar/PremiumNavbarTabPatchKt { - public static final fun getPremiumNavbarTabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/stocard/layout/HideOffersTabPatchKt { public static final fun getHideOffersTabPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } @@ -1306,10 +1276,6 @@ public final class app/revanced/patches/viber/ads/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatchKt { public static final fun getFirebaseGetCertPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1318,10 +1284,6 @@ public final class app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnloc public static final fun getPromoCodeUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/ad/general/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1343,7 +1305,6 @@ public final class app/revanced/patches/youtube/interaction/dialog/RemoveViewerD } public final class app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatchKt { - public static final fun getDisableChapterSkipDoubleTapPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getDisableDoubleTapActionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1420,15 +1381,7 @@ public final class app/revanced/patches/youtube/layout/hide/fullscreenambientmod } public final class app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatchKt { - public static final fun getAlbumCardId ()J - public static final fun getBarContainerHeightId ()J - public static final fun getCrowdfundingBoxId ()J - public static final fun getExpandButtonDownId ()J - public static final fun getFabButtonId ()J - public static final fun getFilterBarHeightId ()J public static final fun getHideLayoutComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getRelatedChipCloudMarginId ()J - public static final fun getYouTubeLogo ()J } public final class app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatchKt { @@ -1447,10 +1400,6 @@ public final class app/revanced/patches/youtube/layout/hide/rollingnumber/Disabl public static final fun getDisableRollingNumberAnimationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatchKt { - public static final fun getHideSeekbarPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatchKt { public static final fun getHideShortsComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1459,10 +1408,6 @@ public final class app/revanced/patches/youtube/layout/hide/signintotvpopup/Disa public static final fun getDisableSignInToTvPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatchKt { - public static final fun getDisableSuggestedVideoEndScreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPatchKt { public static final fun getHideTimestampPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1475,14 +1420,6 @@ public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupP public static final fun getPlayerPopupPanelsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatchKt { - public static final fun getPlayerControlsBackgroundPatch ()Lapp/revanced/patcher/patch/ResourcePatch; -} - -public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenKt { - public static final fun getOpenVideosFullscreen ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatchKt { public static final fun getOpenVideosFullscreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1537,15 +1474,6 @@ public final class app/revanced/patches/youtube/layout/startupshortsreset/Disabl public static final fun getDisableResumingShortsOnStartupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatchKt { - public static final fun getEnableTabletLayoutPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/layout/theme/LithoColorHookPatchKt { - public static final fun getLithoColorHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getLithoColorOverrideHook ()Lkotlin/jvm/functions/Function2; -} - public final class app/revanced/patches/youtube/layout/theme/ThemePatchKt { public static final fun getThemePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1562,10 +1490,6 @@ public final class app/revanced/patches/youtube/misc/announcements/Announcements public static final fun getAnnouncementsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatchKt { - public static final fun getAutoRepeatPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatchKt { public static final fun getBackgroundPlaybackPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1586,14 +1510,6 @@ public final class app/revanced/patches/youtube/misc/extension/SharedExtensionPa public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatchKt { - public static final fun getSpoofVideoStreamsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatchKt { - public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/misc/fix/playbackspeed/FIxPlaybackSpeedWhilePlayingPatchKt { public static final fun getFixPlaybackSpeedWhilePlayingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1645,7 +1561,6 @@ public final class app/revanced/patches/youtube/misc/playercontrols/PlayerContro public final class app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatchKt { public static final fun getAddBottomControl ()Lkotlin/jvm/functions/Function1; public static final fun getPlayerControlsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getPlayerControlsResourcePatch ()Lapp/revanced/patcher/patch/ResourcePatch; public static final fun initializeBottomControl (Ljava/lang/String;)V public static final fun injectVisibilityCheckCall (Ljava/lang/String;)V } @@ -1656,9 +1571,6 @@ public final class app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPa public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPatchKt { public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun is_19_03_or_greater ()Z - public static final fun is_19_04_or_greater ()Z - public static final fun is_19_16_or_greater ()Z public static final fun is_19_17_or_greater ()Z public static final fun is_19_18_or_greater ()Z public static final fun is_19_23_or_greater ()Z @@ -1683,10 +1595,17 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_20_10_or_greater ()Z public static final fun is_20_14_or_greater ()Z public static final fun is_20_15_or_greater ()Z -} - -public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { - public static final fun getRemoveTrackingQueryParameterPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun is_20_19_or_greater ()Z + public static final fun is_20_20_or_greater ()Z + public static final fun is_20_21_or_greater ()Z + public static final fun is_20_22_or_greater ()Z + public static final fun is_20_26_or_greater ()Z + public static final fun is_20_28_or_greater ()Z + public static final fun is_20_30_or_greater ()Z + public static final fun is_20_31_or_greater ()Z + public static final fun is_20_34_or_greater ()Z + public static final fun is_20_37_or_greater ()Z + public static final fun is_20_39_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatchKt { @@ -1728,10 +1647,6 @@ public final class app/revanced/patches/youtube/misc/spoof/UserAgentClientSpoofP public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatchKt { - public static final fun getZoomHapticsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatchKt { public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1740,10 +1655,6 @@ public final class app/revanced/patches/youtube/video/codecs/DisableVideoCodecsP public static final fun getDisableVideoCodecsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/video/hdr/DisableHdrPatchKt { - public static final fun getDisableHdrPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/video/information/VideoInformationPatchKt { public static final fun getVideoInformationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun userSelectedPlaybackSpeedHook (Ljava/lang/String;Ljava/lang/String;)V @@ -1800,14 +1711,6 @@ public final class app/revanced/patches/youtube/video/videoid/VideoIdPatchKt { public static final fun hookVideoId (Ljava/lang/String;)V } -public final class app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatchKt { - public static final fun getRestoreOldVideoQualityMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatchKt { - public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/util/BytecodeUtilsKt { public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ILjava/lang/String;)V public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ILjava/lang/String;[Lapp/revanced/patcher/util/smali/ExternalLabel;)V @@ -1857,6 +1760,7 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun indexOfFirstResourceIdOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V public static final fun literal (Lapp/revanced/patcher/FingerprintBuilder;Lkotlin/jvm/functions/Function0;)V + public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;B)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;C)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;D)V @@ -1864,9 +1768,9 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;I)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;J)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/String;)V + public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Void;)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;S)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Z)V - public static synthetic fun returnEarly$default (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ZILjava/lang/Object;)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;B)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;C)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;D)V @@ -1874,6 +1778,7 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;I)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;J)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/String;)V + public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Void;)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;S)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Z)V public static final fun transformMethods (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lkotlin/jvm/functions/Function1;)V 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 41a0427966..46c2fe658d 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 @@ -1,22 +1,39 @@ package app.revanced.patches.shared.layout.theme +import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val lithoOnBoundsChangeFingerprint = fingerprint { +internal val lithoOnBoundsChangeFingerprint by fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters("Landroid/graphics/Rect;") - opcodes( - Opcode.IGET, - Opcode.IF_EQZ, - Opcode.INVOKE_VIRTUAL, - Opcode.MOVE_RESULT, - Opcode.IF_NEZ, - Opcode.IGET_OBJECT, - Opcode.INVOKE_VIRTUAL, - Opcode.RETURN_VOID, + instructions( + fieldAccess( + opcode = Opcode.IPUT_OBJECT, + definingClass = "this", + type = "Landroid/graphics/Path;" + ), + + methodCall( + definingClass = "this", + name = "isStateful", + returnType = "Z", + maxAfter = 5 + ), + + fieldAccess( + opcode = Opcode.IGET_OBJECT, + definingClass = "this", + type = "Landroid/graphics/Paint", + maxAfter = 5 + ), + methodCall( + smali = "Landroid/graphics/Paint;->setColor(I)V", + maxAfter = 0 + ) ) custom { method, _ -> method.name == "onBoundsChange" 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 b8473f9bd0..f0dda3446c 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 @@ -11,11 +11,10 @@ import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable +import app.revanced.patches.shared.layout.theme.lithoColorHookPatch +import app.revanced.patches.shared.layout.theme.lithoColorOverrideHook import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.youtube.layout.theme.lithoColorHookPatch -import app.revanced.patches.youtube.layout.theme.lithoColorOverrideHook import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch -import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_46_or_greater import app.revanced.patches.youtube.misc.playservice.is_19_49_or_greater 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 1ad40b8334..4c74c4253c 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 @@ -2,8 +2,8 @@ package app.revanced.patches.youtube.layout.theme import app.revanced.patcher.anyInstruction import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal import app.revanced.patches.youtube.shared.YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE -import app.revanced.util.literal internal val useGradientLoadingScreenFingerprint by fingerprint { instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt deleted file mode 100644 index a0bd5e7165..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/theme/LithoColorHookPatch.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.revanced.patches.youtube.layout.theme - -import app.revanced.patcher.patch.bytecodePatch - - -@Deprecated("Function was moved", ReplaceWith("app.revanced.patches.shared.layout.theme.lithoColorOverrideHook")) -@Suppress("unused") -lateinit var lithoColorOverrideHook: (targetMethodClass: String, targetMethodName: String) -> Unit - private set - -@Deprecated("Patch was moved", ReplaceWith("app.revanced.patches.shared.layout.theme.lithoColorHookPatch")) -@Suppress("unused") -val lithoColorHookPatch = bytecodePatch{ - dependsOn(app.revanced.patches.shared.layout.theme.lithoColorHookPatch) - - execute { - lithoColorOverrideHook = app.revanced.patches.shared.layout.theme.lithoColorOverrideHook - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt deleted file mode 100644 index d0591f2c7e..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrPatch.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.youtube.video.hdr - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.youtube.video.codecs.disableVideoCodecsPatch - -@Deprecated("Patch was renamed", ReplaceWith("disableVideoCodecsPatch")) -@Suppress("unused") -val disableHdrPatch = bytecodePatch{ - dependsOn(disableVideoCodecsPatch) -} \ No newline at end of file From a82f49aa0874d71f71f09e6840a745ce9729a00b Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 26 Sep 2025 19:06:51 +0400 Subject: [PATCH 19/59] fix typo --- .../patches/youtube/layout/shortsplayer/Fingerprints.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt index c1debb442b..3882efb395 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt @@ -14,7 +14,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * Purpose of this method is not clear, and it's only used to identify * the obfuscated name of the videoId() method in PlaybackStartDescriptor. - * 20.39 and lower. + * 20.38 and lower. */ internal val playbackStartFeatureFlagFingerprint by fingerprint { returns("Z") From f88ad4e4a7f80e6951ce0f40683a5ed96605b2e2 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 27 Sep 2025 16:24:28 +0400 Subject: [PATCH 20/59] modernize --- .../music/layout/castbutton/Fingerprints.kt | 12 +++++++++--- .../music/layout/castbutton/HideCastButton.kt | 19 ++++--------------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/Fingerprints.kt index 535739e614..d3d59619c1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/Fingerprints.kt @@ -1,8 +1,11 @@ package app.revanced.patches.music.layout.castbutton -import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -import app.revanced.util.literal +import app.revanced.patcher.opcode +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral +import com.android.tools.smali.dexlib2.AccessFlags +import com.android.tools.smali.dexlib2.Opcode internal val mediaRouteButtonFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) @@ -13,5 +16,8 @@ internal val mediaRouteButtonFingerprint by fingerprint { internal val playerOverlayChipFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") - literal { playerOverlayChip } + instructions( + resourceLiteral(ResourceType.ID, "player_overlay_chip"), + opcode(Opcode.MOVE_RESULT) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt index 03b6218136..89bc0fe88e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt @@ -9,18 +9,10 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch -import app.revanced.patches.shared.misc.mapping.get import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings import app.revanced.patches.shared.misc.settings.preference.SwitchPreference -import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -internal var playerOverlayChip = -1L - private set - private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/music/patches/HideCastButtonPatch;" @Suppress("unused") @@ -43,8 +35,6 @@ val hideCastButton = bytecodePatch( ) execute { - playerOverlayChip = resourceMappings["id", "player_overlay_chip"] - addResources("music", "layout.castbutton.hideCastButton") PreferenceScreen.GENERAL.addPreferences( @@ -64,13 +54,12 @@ val hideCastButton = bytecodePatch( } playerOverlayChipFingerprint.method.apply { - val resourceIndex = indexOfFirstLiteralInstructionOrThrow(playerOverlayChip) - val targetIndex = indexOfFirstInstructionOrThrow(resourceIndex, Opcode.MOVE_RESULT) - val targetRegister = getInstruction(targetIndex).registerA + val index = playerOverlayChipFingerprint.instructionMatches.last().index + val register = getInstruction(index).registerA addInstruction( - targetIndex + 1, - "invoke-static { v$targetRegister }, $EXTENSION_CLASS_DESCRIPTOR->hideCastButton(Landroid/view/View;)V" + index + 1, + "invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->hideCastButton(Landroid/view/View;)V" ) } } From 2d49d76e8271b93707378cc61bd6081fe2c84d3c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 28 Sep 2025 16:37:48 +0400 Subject: [PATCH 21/59] finish merge --- patches/api/patches.api | 233 ++++++------------ .../layout/branding/CustomBrandingPatch.kt | 15 +- .../music/layout/branding/Fingerprints.kt | 7 +- .../music/misc/fileprovider/Fingerprints.kt | 2 +- .../patches/viber/misc/navbar/Fingerprints.kt | 2 +- .../misc/navbar/HideNavigationButtons.kt | 4 +- .../layout/branding/CustomBrandingPatch.kt | 2 +- .../hide/endscreencards/Fingerprints.kt | 2 +- 8 files changed, 89 insertions(+), 178 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 38dc2b6388..7b806b872b 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -64,10 +64,6 @@ public final class app/revanced/patches/all/misc/debugging/EnableAndroidDebuggin public static final fun getEnableAndroidDebuggingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/all/misc/directory/ChangeDataDirectoryLocationPatchKt { - public static final fun getChangeDataDirectoryLocationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/all/misc/directory/documentsprovider/ExportInternalDataDocumentsProviderPatchKt { public static final fun getExportInternalDataDocumentsProviderPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } @@ -152,10 +148,6 @@ public final class app/revanced/patches/angulus/ads/RemoveAdsPatchKt { public static final fun getAngulusPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/backdrops/misc/pro/ProUnlockPatchKt { - public static final fun getProUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatchKt { public static final fun getRemovePlayLimitsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -232,10 +224,6 @@ public final class app/revanced/patches/googlephotos/misc/gms/GmsCoreSupportPatc public static final fun getGmsCoreSupportPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/googlephotos/misc/preferences/RestoreHiddenBackUpWhileChargingTogglePatchKt { - public static final fun getRestoreHiddenBackUpWhileChargingTogglePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/googlerecorder/restrictions/RemoveDeviceRestrictionsKt { public static final fun getRemoveDeviceRestrictionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -320,14 +308,6 @@ public final class app/revanced/patches/messenger/inbox/HideInboxSubtabsPatchKt public static final fun getHideInboxSubtabsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/messenger/inputfield/DisableSwitchingEmojiToStickerPatchKt { - public static final fun getDisableSwitchingEmojiToStickerPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatchKt { - public static final fun getDisableTypingIndicatorPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/messenger/layout/HideFacebookButtonPatchKt { public static final fun getHideFacebookButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -340,14 +320,6 @@ public final class app/revanced/patches/messenger/misc/extension/ExtensionPatchK public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/messenger/navbar/RemoveMetaAITabPatchKt { - public static final fun getRemoveMetaAITabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/meta/ads/HideAdsPatchKt { - public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/mifitness/misc/locale/ForceEnglishLocalePatchKt { public static final fun getForceEnglishLocalePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -368,10 +340,6 @@ public final class app/revanced/patches/music/interaction/permanentrepeat/Perman public static final fun getPermanentRepeatPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/music/interaction/permanentshuffle/PermanentShufflePatchKt { - public static final fun getPermanentShufflePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/music/layout/branding/CustomBrandingPatchKt { public static final fun getCustomBrandingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } @@ -396,11 +364,6 @@ public final class app/revanced/patches/music/layout/theme/ThemePatchKt { public static final fun getThemePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/music/layout/upgradebutton/HideUpgradeButtonPatchKt { - public static final fun getHideUpgradeButton ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getRemoveUpgradeButton ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatchKt { public static final fun getBypassCertificateChecksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -474,10 +437,6 @@ public final class app/revanced/patches/netguard/broadcasts/removerestriction/Re public static final fun getRemoveBroadcastsRestrictionPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/nunl/ads/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -486,10 +445,6 @@ public final class app/revanced/patches/nunl/firebase/SpoofCertificatePatchKt { public static final fun getSpoofCertificatePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/nyx/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/openinghours/misc/fix/crash/FixCrashPatchKt { public static final fun getFixCrashPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -716,16 +671,11 @@ public final class app/revanced/patches/reddit/customclients/sync/syncforreddit/ public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/reddit/customclients/syncforreddit/fix/video/FixVideoDownloadsPatchKt { - public static final fun getFixVideoDownloadsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatchKt { public static final fun getDisableScreenshotPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } public final class app/revanced/patches/reddit/layout/premiumicon/UnlockPremiumIconPatchKt { - public static final fun getUnlockPremiumIconPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getUnlockPremiumIconsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -756,26 +706,22 @@ public final class app/revanced/patches/shared/misc/extension/ExtensionHook { public final class app/revanced/patches/shared/misc/extension/SharedExtensionPatchKt { public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; + public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function0; public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; - public static final fun sharedExtensionPatch (Ljava/lang/String;[Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun sharedExtensionPatch ([Lapp/revanced/patches/shared/misc/extension/ExtensionHook;)Lapp/revanced/patcher/patch/BytecodePatch; + public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlin/jvm/functions/Function0; + public static final fun sharedExtensionPatch (Ljava/lang/String;[Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun sharedExtensionPatch ([Lkotlin/jvm/functions/Function0;)Lapp/revanced/patcher/patch/BytecodePatch; } public final class app/revanced/patches/shared/misc/fix/verticalscroll/VerticalScrollPatchKt { public static final fun getVerticalScrollPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/shared/misc/gms/FingerprintsKt { - public static final field GET_GMS_CORE_VENDOR_GROUP_ID_METHOD_NAME Ljava/lang/String; -} - public final class app/revanced/patches/shared/misc/gms/GmsCoreSupportPatchKt { public static final fun gmsCoreSupportPatch (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/BytecodePatch; public static synthetic fun gmsCoreSupportPatch$default (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/Fingerprint;Ljava/util/Set;Lapp/revanced/patcher/Fingerprint;Lapp/revanced/patcher/patch/Patch;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch; - public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; + public static final fun gmsCoreSupportResourcePatch (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Lapp/revanced/patcher/patch/ResourcePatch; + public static synthetic fun gmsCoreSupportResourcePatch$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patcher/patch/Option;ZLkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; } public final class app/revanced/patches/shared/misc/hex/HexPatchBuilder : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker { @@ -814,23 +760,64 @@ public final class app/revanced/patches/shared/misc/hex/Replacement { } public final class app/revanced/patches/shared/misc/mapping/ResourceElement { - public final fun component1 ()Ljava/lang/String; + public fun (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;J)V + public final fun component1 ()Lapp/revanced/patches/shared/misc/mapping/ResourceType; public final fun component2 ()Ljava/lang/String; public final fun component3 ()J - public final fun copy (Ljava/lang/String;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; - public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceElement;Ljava/lang/String;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; + public final fun copy (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;J)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; + public static synthetic fun copy$default (Lapp/revanced/patches/shared/misc/mapping/ResourceElement;Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;JILjava/lang/Object;)Lapp/revanced/patches/shared/misc/mapping/ResourceElement; public fun equals (Ljava/lang/Object;)Z public final fun getId ()J public final fun getName ()Ljava/lang/String; - public final fun getType ()Ljava/lang/String; + public final fun getType ()Lapp/revanced/patches/shared/misc/mapping/ResourceType; public fun hashCode ()I public fun toString ()Ljava/lang/String; } public final class app/revanced/patches/shared/misc/mapping/ResourceMappingPatchKt { - public static final fun get (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)J + public static final fun getResourceElements ()Ljava/util/Collection; + public static final fun getResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)J public static final fun getResourceMappingPatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun getResourceMappings ()Ljava/util/List; + public static final fun hasResourceId (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;)Z + public static final fun resourceLiteral (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;I)Lapp/revanced/patcher/LiteralFilter; + public static synthetic fun resourceLiteral$default (Lapp/revanced/patches/shared/misc/mapping/ResourceType;Ljava/lang/String;IILjava/lang/Object;)Lapp/revanced/patcher/LiteralFilter; +} + +public final class app/revanced/patches/shared/misc/mapping/ResourceType : java/lang/Enum { + public static final field ANIM Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ANIMATOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ARRAY Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ATTR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field BOOL Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field COLOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field Companion Lapp/revanced/patches/shared/misc/mapping/ResourceType$Companion; + public static final field DIMEN Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field DRAWABLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field FONT Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field FRACTION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field ID Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field INTEGER Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field INTERPOLATOR Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field LAYOUT Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field MENU Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field MIPMAP Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field NAVIGATION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field PLURALS Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field RAW Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STRING Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STYLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field STYLEABLE Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field TRANSITION Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field VALUES Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static final field XML Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public final fun getValue ()Ljava/lang/String; + public static fun valueOf (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/mapping/ResourceType; + public static fun values ()[Lapp/revanced/patches/shared/misc/mapping/ResourceType; +} + +public final class app/revanced/patches/shared/misc/mapping/ResourceType$Companion { + public final fun fromValue (Ljava/lang/String;)Lapp/revanced/patches/shared/misc/mapping/ResourceType; } public final class app/revanced/patches/shared/misc/pairip/license/DisableLicenseCheckPatchKt { @@ -840,7 +827,6 @@ public final class app/revanced/patches/shared/misc/pairip/license/DisableLicens public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt { public static final fun overrideThemeColors (Ljava/lang/String;Ljava/lang/String;)V public static final fun settingsPatch (Ljava/util/List;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun settingsPatch (Lkotlin/Pair;Ljava/util/Set;)Lapp/revanced/patcher/patch/ResourcePatch; public static synthetic fun settingsPatch$default (Ljava/util/List;Ljava/util/Set;ILjava/lang/Object;)Lapp/revanced/patcher/patch/ResourcePatch; } @@ -933,8 +919,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/ListPref public fun ()V public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getEntries ()Lapp/revanced/util/resource/ArrayResource; public final fun getEntriesKey ()Ljava/lang/String; public final fun getEntryValues ()Lapp/revanced/util/resource/ArrayResource; @@ -1046,10 +1032,6 @@ public final class app/revanced/patches/spotify/layout/theme/CustomThemePatchKt public static final fun getCustomThemePatch ()Lapp/revanced/patcher/patch/ResourcePatch; } -public final class app/revanced/patches/spotify/lite/ondemand/OnDemandPatchKt { - public static final fun getOnDemandPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/spotify/misc/extension/ExtensionPatchKt { public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1058,14 +1040,6 @@ public final class app/revanced/patches/spotify/misc/fix/SpoofClientPatchKt { public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/spotify/misc/fix/SpoofPackageInfoPatchKt { - public static final fun getSpoofPackageInfoPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/spotify/misc/fix/SpoofSignaturePatchKt { - public static final fun getSpoofSignaturePatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatchKt { public static final fun getFixFacebookLoginPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1082,10 +1056,6 @@ public final class app/revanced/patches/spotify/misc/widgets/FixThirdPartyLaunch public static final fun getFixThirdPartyLaunchersWidgets ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/spotify/navbar/PremiumNavbarTabPatchKt { - public static final fun getPremiumNavbarTabPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/stocard/layout/HideOffersTabPatchKt { public static final fun getHideOffersTabPatch ()Lapp/revanced/patcher/patch/ResourcePatch; } @@ -1314,10 +1284,6 @@ public final class app/revanced/patches/viber/misc/navbar/HideNavigationButtonsK public static final fun getHideNavigationButtonsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/vsco/misc/pro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/warnwetter/misc/firebasegetcert/FirebaseGetCertPatchKt { public static final fun getFirebaseGetCertPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1326,10 +1292,6 @@ public final class app/revanced/patches/warnwetter/misc/promocode/PromoCodeUnloc public static final fun getPromoCodeUnlockPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/windyapp/misc/unlockpro/UnlockProPatchKt { - public static final fun getUnlockProPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/ad/general/HideAdsPatchKt { public static final fun getHideAdsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1351,7 +1313,6 @@ public final class app/revanced/patches/youtube/interaction/dialog/RemoveViewerD } public final class app/revanced/patches/youtube/interaction/doubletap/DisableChapterSkipDoubleTapPatchKt { - public static final fun getDisableChapterSkipDoubleTapPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun getDisableDoubleTapActionsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1428,15 +1389,7 @@ public final class app/revanced/patches/youtube/layout/hide/fullscreenambientmod } public final class app/revanced/patches/youtube/layout/hide/general/HideLayoutComponentsPatchKt { - public static final fun getAlbumCardId ()J - public static final fun getBarContainerHeightId ()J - public static final fun getCrowdfundingBoxId ()J - public static final fun getExpandButtonDownId ()J - public static final fun getFabButtonId ()J - public static final fun getFilterBarHeightId ()J public static final fun getHideLayoutComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getRelatedChipCloudMarginId ()J - public static final fun getYouTubeLogo ()J } public final class app/revanced/patches/youtube/layout/hide/infocards/HideInfoCardsPatchKt { @@ -1455,10 +1408,6 @@ public final class app/revanced/patches/youtube/layout/hide/rollingnumber/Disabl public static final fun getDisableRollingNumberAnimationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatchKt { - public static final fun getHideSeekbarPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/hide/shorts/HideShortsComponentsPatchKt { public static final fun getHideShortsComponentsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1467,10 +1416,6 @@ public final class app/revanced/patches/youtube/layout/hide/signintotvpopup/Disa public static final fun getDisableSignInToTvPopupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatchKt { - public static final fun getDisableSuggestedVideoEndScreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/hide/time/HideTimestampPatchKt { public static final fun getHideTimestampPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1483,14 +1428,6 @@ public final class app/revanced/patches/youtube/layout/panels/popup/PlayerPopupP public static final fun getPlayerPopupPanelsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/player/background/PlayerControlsBackgroundPatchKt { - public static final fun getPlayerControlsBackgroundPatch ()Lapp/revanced/patcher/patch/ResourcePatch; -} - -public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenKt { - public static final fun getOpenVideosFullscreen ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreenPatchKt { public static final fun getOpenVideosFullscreenPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1545,15 +1482,6 @@ public final class app/revanced/patches/youtube/layout/startupshortsreset/Disabl public static final fun getDisableResumingShortsOnStartupPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatchKt { - public static final fun getEnableTabletLayoutPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/layout/theme/LithoColorHookPatchKt { - public static final fun getLithoColorHookPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getLithoColorOverrideHook ()Lkotlin/jvm/functions/Function2; -} - public final class app/revanced/patches/youtube/layout/theme/ThemePatchKt { public static final fun getThemePatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1570,10 +1498,6 @@ public final class app/revanced/patches/youtube/misc/announcements/Announcements public static final fun getAnnouncementsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/misc/autorepeat/AutoRepeatPatchKt { - public static final fun getAutoRepeatPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/misc/backgroundplayback/BackgroundPlaybackPatchKt { public static final fun getBackgroundPlaybackPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1594,14 +1518,6 @@ public final class app/revanced/patches/youtube/misc/extension/SharedExtensionPa public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatchKt { - public static final fun getSpoofVideoStreamsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatchKt { - public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/misc/fix/playbackspeed/FIxPlaybackSpeedWhilePlayingPatchKt { public static final fun getFixPlaybackSpeedWhilePlayingPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1653,7 +1569,6 @@ public final class app/revanced/patches/youtube/misc/playercontrols/PlayerContro public final class app/revanced/patches/youtube/misc/playercontrols/PlayerControlsPatchKt { public static final fun getAddBottomControl ()Lkotlin/jvm/functions/Function1; public static final fun getPlayerControlsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; - public static final fun getPlayerControlsResourcePatch ()Lapp/revanced/patcher/patch/ResourcePatch; public static final fun initializeBottomControl (Ljava/lang/String;)V public static final fun injectVisibilityCheckCall (Ljava/lang/String;)V } @@ -1664,9 +1579,6 @@ public final class app/revanced/patches/youtube/misc/playertype/PlayerTypeHookPa public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPatchKt { public static final fun getVersionCheckPatch ()Lapp/revanced/patcher/patch/ResourcePatch; - public static final fun is_19_03_or_greater ()Z - public static final fun is_19_04_or_greater ()Z - public static final fun is_19_16_or_greater ()Z public static final fun is_19_17_or_greater ()Z public static final fun is_19_18_or_greater ()Z public static final fun is_19_23_or_greater ()Z @@ -1691,10 +1603,17 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_20_10_or_greater ()Z public static final fun is_20_14_or_greater ()Z public static final fun is_20_15_or_greater ()Z -} - -public final class app/revanced/patches/youtube/misc/privacy/RemoveTrackingQueryParameterPatchKt { - public static final fun getRemoveTrackingQueryParameterPatch ()Lapp/revanced/patcher/patch/BytecodePatch; + public static final fun is_20_19_or_greater ()Z + public static final fun is_20_20_or_greater ()Z + public static final fun is_20_21_or_greater ()Z + public static final fun is_20_22_or_greater ()Z + public static final fun is_20_26_or_greater ()Z + public static final fun is_20_28_or_greater ()Z + public static final fun is_20_30_or_greater ()Z + public static final fun is_20_31_or_greater ()Z + public static final fun is_20_34_or_greater ()Z + public static final fun is_20_37_or_greater ()Z + public static final fun is_20_39_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatchKt { @@ -1736,10 +1655,6 @@ public final class app/revanced/patches/youtube/misc/spoof/UserAgentClientSpoofP public static final fun getUserAgentClientSpoofPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatchKt { - public static final fun getZoomHapticsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatchKt { public static final fun getForceOriginalAudioPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1748,10 +1663,6 @@ public final class app/revanced/patches/youtube/video/codecs/DisableVideoCodecsP public static final fun getDisableVideoCodecsPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/youtube/video/hdr/DisableHdrPatchKt { - public static final fun getDisableHdrPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/youtube/video/information/VideoInformationPatchKt { public static final fun getVideoInformationPatch ()Lapp/revanced/patcher/patch/BytecodePatch; public static final fun userSelectedPlaybackSpeedHook (Ljava/lang/String;Ljava/lang/String;)V @@ -1808,14 +1719,6 @@ public final class app/revanced/patches/youtube/video/videoid/VideoIdPatchKt { public static final fun hookVideoId (Ljava/lang/String;)V } -public final class app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatchKt { - public static final fun getRestoreOldVideoQualityMenuPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - -public final class app/revanced/patches/yuka/misc/unlockpremium/UnlockPremiumPatchKt { - public static final fun getUnlockPremiumPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/util/BytecodeUtilsKt { public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ILjava/lang/String;)V public static final fun addInstructionsAtControlFlowLabel (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ILjava/lang/String;[Lapp/revanced/patcher/util/smali/ExternalLabel;)V @@ -1865,6 +1768,7 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun indexOfFirstResourceIdOrThrow (Lcom/android/tools/smali/dexlib2/iface/Method;Ljava/lang/String;)I public static final fun injectHideViewCall (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;IILjava/lang/String;Ljava/lang/String;)V public static final fun literal (Lapp/revanced/patcher/FingerprintBuilder;Lkotlin/jvm/functions/Function0;)V + public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;B)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;C)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;D)V @@ -1872,9 +1776,9 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;I)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;J)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/String;)V + public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Void;)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;S)V public static final fun returnEarly (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Z)V - public static synthetic fun returnEarly$default (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;ZILjava/lang/Object;)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;B)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;C)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;D)V @@ -1882,6 +1786,7 @@ public final class app/revanced/util/BytecodeUtilsKt { public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;I)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;J)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/String;)V + public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Ljava/lang/Void;)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;S)V public static final fun returnLate (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableMethod;Z)V public static final fun transformMethods (Lapp/revanced/patcher/util/proxy/mutableTypes/MutableClass;Lkotlin/jvm/functions/Function1;)V diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt index c85b2c0ed7..4a8bce5cae 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt @@ -5,9 +5,11 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.bytecodePatch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch -import app.revanced.patches.shared.misc.mapping.get +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId + import app.revanced.patches.shared.misc.mapping.resourceMappingPatch -import app.revanced.patches.shared.misc.mapping.resourceMappings + import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversed @@ -28,14 +30,13 @@ private val disableSplashAnimationPatch = bytecodePatch { // but the animation is not always the same size as the launch screen and it's still // barely shown. Instead turn off the animation entirely (app will also launch a little faster). cairoSplashAnimationConfigFingerprint.method.apply { - val mainActivityLaunchAnimation = resourceMappings["layout", "main_activity_launch_animation"] - val literalIndex = indexOfFirstLiteralInstructionOrThrow( - mainActivityLaunchAnimation - ) - val insertIndex = indexOfFirstInstructionReversed(literalIndex) { + val insertIndex = indexOfFirstInstructionReversed( + cairoSplashAnimationConfigFingerprint.instructionMatches.first().index + ) { this.opcode == Opcode.INVOKE_VIRTUAL && getReference()?.name == "setContentView" } + 1 + val jumpIndex = indexOfFirstInstructionOrThrow(insertIndex) { opcode == Opcode.INVOKE_VIRTUAL && getReference()?.parameterTypes?.firstOrNull() == "Ljava/lang/Runnable;" diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt index 8e8989983f..c618afd6de 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt @@ -2,10 +2,15 @@ package app.revanced.patches.music.layout.branding import app.revanced.patcher.fingerprint import app.revanced.patches.music.shared.YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.resourceLiteral -internal val cairoSplashAnimationConfigFingerprint = fingerprint { +internal val cairoSplashAnimationConfigFingerprint by fingerprint { returns("V") parameters("Landroid/os/Bundle;") + instructions( + resourceLiteral(ResourceType.LAYOUT, "main_activity_launch_animation") + ) custom { method, classDef -> method.name == "onCreate" && method.definingClass == YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt index 16a2d6a58f..2b4cc217dc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.utils.fix.fileprovider import app.revanced.patcher.fingerprint -internal val fileProviderResolverFingerprint = fingerprint { +internal val fileProviderResolverFingerprint by fingerprint { returns("L") strings( "android.support.FILE_PROVIDER_PATHS", 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 2f2a7bda3d..3969425dff 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 @@ -2,7 +2,7 @@ package app.revanced.patches.viber.misc.navbar import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.BytecodePatchContext -internal val tabIdClassFingerprint = fingerprint { +internal val tabIdClassFingerprint by fingerprint { strings("shouldShowTabId") } diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt index a4aa3e4a0a..c581849ed2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt +++ b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt @@ -48,8 +48,8 @@ val hideNavigationButtonsPatch = bytecodePatch( .map { it.key.buildAllowInstruction() } .joinToString("\n") + instructionsFooter - shouldShowTabIdMethodFingerprint - .method + val shouldShowTabIdMethodFingerprint by shouldShowTabIdMethodFingerprint + shouldShowTabIdMethodFingerprint.method .addInstructionsWithLabels(0, injectionInstructions) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index d3635eefd0..e931d0b78a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -14,7 +14,7 @@ private val youtubeIconResourceFileNames_19_34 = mapOf( @Suppress("unused") val customBrandingPatch = baseCustomBrandingPatch( defaultAppName = APP_NAME, - appNameValues = arrayOf( + appNameValues = mapOf( "YouTube ReVanced" to APP_NAME, "YT ReVanced" to "YT ReVanced", "YT" to "YT", 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 0e34a5f8e9..69ff8a2670 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 @@ -50,7 +50,7 @@ internal val layoutVideoFingerprint by fingerprint { literal { layoutVideo } } -internal val showEndscreenCardsFingerprint = fingerprint { +internal val showEndscreenCardsFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") From 636bded69cfd27266ef8247c277e7aa448dbf156 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 30 Sep 2025 22:17:10 +0400 Subject: [PATCH 22/59] refactor: Add main activity onCreate extension hook function --- patches/api/patches.api | 1 + .../patches/cricbuzz/misc/extension/Hooks.kt | 8 ++---- .../extension/hooks/ApplicationInitHook.kt | 10 +++----- .../patches/messenger/misc/extension/Hooks.kt | 10 +++----- .../extension/hooks/ApplicationInitHook.kt | 13 ++++------ .../app/revanced/patches/nunl/ads/Hooks.kt | 10 +++----- .../primevideo/misc/extension/Hooks.kt | 10 +++----- .../misc/extension/hooks/InitHook.kt | 10 +++----- .../misc/extension/hooks/InitHook.kt | 12 +++------ .../syncforreddit/extension/hooks/InitHook.kt | 12 +++------ .../misc/extension/SharedExtensionPatch.kt | 25 +++++++++++++++++++ .../patches/tiktok/misc/extension/Hooks.kt | 11 +++----- .../patches/twitch/misc/extension/Hooks.kt | 8 ++---- .../extension/hooks/ApplicationInitHook.kt | 12 +++------ 14 files changed, 71 insertions(+), 81 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 7b806b872b..d364a0e789 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -705,6 +705,7 @@ public final class app/revanced/patches/shared/misc/extension/ExtensionHook { } public final class app/revanced/patches/shared/misc/extension/SharedExtensionPatchKt { + public static final fun activityOnCreateExtensionHook (Ljava/lang/String;)Lkotlin/jvm/functions/Function0; public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; public static final fun extensionHook (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lkotlin/jvm/functions/Function0; public static synthetic fun extensionHook$default (Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Lapp/revanced/patcher/Fingerprint;ILjava/lang/Object;)Lapp/revanced/patches/shared/misc/extension/ExtensionHook; diff --git a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/Hooks.kt index c6520086d3..3b4e0da2c1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/misc/extension/Hooks.kt @@ -1,9 +1,5 @@ package app.revanced.patches.cricbuzz.misc.extension -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val applicationInitHook = extensionHook { - custom { method, classDef -> - method.name == "onCreate" && classDef.endsWith("/NyitoActivity;") - } -} +internal val applicationInitHook = activityOnCreateExtensionHook("/NyitoActivity;") diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/extension/hooks/ApplicationInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/extension/hooks/ApplicationInitHook.kt index eca0a885f2..05591136b3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/extension/hooks/ApplicationInitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/extension/hooks/ApplicationInitHook.kt @@ -1,9 +1,7 @@ package app.revanced.patches.instagram.misc.extension.hooks -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val applicationInitHook = extensionHook { - custom { method, classDef -> - method.name == "onCreate" && classDef.endsWith("/InstagramAppShell;") - } -} +internal val applicationInitHook = activityOnCreateExtensionHook( + "/InstagramAppShell;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt index 55bd9aaa04..9c2160d040 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt @@ -1,9 +1,7 @@ package app.revanced.patches.messenger.misc.extension -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val messengerApplicationOnCreateHook = extensionHook { - custom { method, classDef -> - method.name == "onCreate" && classDef.endsWith("/MessengerApplication;") - } -} +internal val messengerApplicationOnCreateHook = activityOnCreateExtensionHook( + "/MessengerApplication;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt index 032e106975..2f429b757c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt @@ -1,7 +1,8 @@ package app.revanced.patches.music.misc.extension.hooks -import app.revanced.patches.music.shared.YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE import app.revanced.patcher.string +import app.revanced.patches.music.shared.YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook import app.revanced.patches.shared.misc.extension.extensionHook internal val applicationInitHook = extensionHook { @@ -13,10 +14,6 @@ internal val applicationInitHook = extensionHook { custom { method, _ -> method.name == "onCreate" } } -internal val applicationInitOnCreateHook = extensionHook { - returns("V") - parameters("Landroid/os/Bundle;") - custom { method, classDef -> - method.name == "onCreate" && classDef.type == YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE - } -} +internal val applicationInitOnCreateHook = activityOnCreateExtensionHook( + YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE +) diff --git a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Hooks.kt index e83d373220..626b251095 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nunl/ads/Hooks.kt @@ -1,9 +1,7 @@ package app.revanced.patches.nunl.ads -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val mainActivityOnCreateHook = extensionHook { - custom { method, classDef -> - classDef.endsWith("/NUApplication;") && method.name == "onCreate" - } -} +internal val mainActivityOnCreateHook = activityOnCreateExtensionHook( + "/NUApplication;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/primevideo/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/primevideo/misc/extension/Hooks.kt index 763c2bfd50..ef22c64120 100644 --- a/patches/src/main/kotlin/app/revanced/patches/primevideo/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/primevideo/misc/extension/Hooks.kt @@ -1,9 +1,7 @@ package app.revanced.patches.primevideo.misc.extension -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val applicationInitHook = extensionHook { - custom { method, classDef -> - method.name == "onCreate" && classDef.endsWith("/SplashScreenActivity;") - } -} +internal val applicationInitHook = activityOnCreateExtensionHook( + "/SplashScreenActivity;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt index fe644145be..d3d4523cb9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/misc/extension/hooks/InitHook.kt @@ -1,9 +1,7 @@ package app.revanced.patches.reddit.customclients.baconreader.misc.extension.hooks -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val initHook = extensionHook { - custom { method, _ -> - method.definingClass == "Lcom/onelouder/baconreader/BaconReader;" && method.name == "onCreate" - } -} +internal val initHook = activityOnCreateExtensionHook( + "Lcom/onelouder/baconreader/BaconReader;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/misc/extension/hooks/InitHook.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/misc/extension/hooks/InitHook.kt index 1e7e4e2e83..303a4ecb85 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/misc/extension/hooks/InitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/misc/extension/hooks/InitHook.kt @@ -1,11 +1,7 @@ package app.revanced.patches.reddit.customclients.boostforreddit.misc.extension.hooks -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val initHook = extensionHook( - insertIndexResolver = { 1 }, -) { - custom { method, _ -> - method.definingClass == "Lcom/rubenmayayo/reddit/MyApplication;" && method.name == "onCreate" - } -} +internal val initHook = activityOnCreateExtensionHook( + "Lcom/rubenmayayo/reddit/MyApplication;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/extension/hooks/InitHook.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/extension/hooks/InitHook.kt index 00244b4df7..c70b90b8f8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/extension/hooks/InitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/extension/hooks/InitHook.kt @@ -1,11 +1,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.extension.hooks -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val initHook = extensionHook( - insertIndexResolver = { 1 }, // Insert after call to super class. -) { - custom { method, classDef -> - method.name == "onCreate" && classDef.type == "Lcom/laurencedawson/reddit_sync/RedditApplication;" - } -} +internal val initHook = activityOnCreateExtensionHook( + "Lcom/laurencedawson/reddit_sync/RedditApplication;" +) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt index f0be1f43b4..907c612c3c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt @@ -115,3 +115,28 @@ fun extensionHook( val fingerprint by FingerprintDelegate(block = fingerprintBuilderBlock) ExtensionHook(fingerprint, insertIndexResolver, contextRegisterResolver) } + +/** + * Creates an extension hook from a non-obfuscated activity, which typically is the main activity + * defined in the app manifest.xml file. + * + * @param activityClassType Either the full activity class type such as `Lcom/company/MainActivity;` + * or the 'ends with' string for the activity such as `/MainActivity;` + */ +fun activityOnCreateExtensionHook(activityClassType: String): () -> ExtensionHook { + if (!activityClassType.endsWith(';')) { + throw IllegalArgumentException("Activity class type does not end with semicolon: $activityClassType") + } + + val fullClassType = activityClassType.startsWith('L') + + return extensionHook { + returns("V") + parameters("Landroid/os/Bundle;") + custom { method, classDef -> + method.name == "onCreate" && + if (fullClassType) classDef.type == activityClassType + else classDef.type.endsWith(activityClassType) + } + } +} diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/extension/Hooks.kt index db1912677b..9b8a213b0c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/extension/Hooks.kt @@ -1,14 +1,11 @@ package app.revanced.patches.tiktok.misc.extension +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook import app.revanced.patches.shared.misc.extension.extensionHook -import com.android.tools.smali.dexlib2.AccessFlags -internal val initHook = extensionHook { - custom { method, classDef -> - classDef.type == "Lcom/ss/android/ugc/aweme/main/MainActivity;" && - method.name == "onCreate" - } -} +internal val initHook = activityOnCreateExtensionHook( + "Lcom/ss/android/ugc/aweme/main/MainActivity;" +) /** * In some cases the extension code can be called before diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/extension/Hooks.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/extension/Hooks.kt index 9a46867ab5..1a345d75cd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/extension/Hooks.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/extension/Hooks.kt @@ -1,9 +1,5 @@ package app.revanced.patches.twitch.misc.extension -import app.revanced.patches.shared.misc.extension.extensionHook +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook -internal val initHook = extensionHook { - custom { method, classDef -> - method.name == "onCreate" && classDef.endsWith("/TwitchApplication;") - } -} +internal val initHook = activityOnCreateExtensionHook("/TwitchApplication;") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt index eab3f1a778..82c80931ad 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt @@ -1,6 +1,7 @@ package app.revanced.patches.youtube.misc.extension.hooks import app.revanced.patcher.string +import app.revanced.patches.shared.misc.extension.activityOnCreateExtensionHook import app.revanced.patches.shared.misc.extension.extensionHook import app.revanced.patches.youtube.shared.YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE @@ -17,11 +18,6 @@ internal val applicationInitHook = extensionHook { ) } -internal val applicationInitOnCrateHook = extensionHook { - returns("V") - parameters("Landroid/os/Bundle;") - custom { method, classDef -> - method.name == "onCreate" && classDef.type == YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE - } -} - +internal val applicationInitOnCrateHook = activityOnCreateExtensionHook( + YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE +) From 4d9de1a81a02c4c8892c2217135ce6807b3f02ff Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 1 Oct 2025 11:57:53 +0400 Subject: [PATCH 23/59] Use custom navigation bar notification filled icon (20.39 still needs a bytecode fix) --- .../youtube/shared/NavigationBar.java | 19 +++++++------- .../misc/navigation/NavigationBarHookPatch.kt | 24 ++++++++++++++++++ .../revanced_fill_bell_cairo_black_24.png | Bin 0 -> 378 bytes .../yt_fill_bell_cairo_black_24.png | Bin 708 -> 0 bytes .../yt_fill_bell_cairo_black_24.png | Bin 394 -> 0 bytes .../revanced_fill_bell_cairo_black_24.png | Bin 0 -> 237 bytes .../yt_fill_bell_cairo_black_24.png | Bin 434 -> 0 bytes .../revanced_fill_bell_cairo_black_24.png | Bin 0 -> 415 bytes .../yt_fill_bell_cairo_black_24.png | Bin 843 -> 0 bytes .../revanced_fill_bell_cairo_black_24.png | Bin 0 -> 711 bytes .../yt_fill_bell_cairo_black_24.png | Bin 1423 -> 0 bytes .../revanced_fill_bell_cairo_black_24.png | Bin 0 -> 848 bytes .../yt_fill_bell_cairo_black_24.png | Bin 1287 -> 0 bytes 13 files changed, 33 insertions(+), 10 deletions(-) create mode 100644 patches/src/main/resources/navigationbuttons/drawable-hdpi/revanced_fill_bell_cairo_black_24.png delete mode 100644 patches/src/main/resources/navigationbuttons/drawable-hdpi/yt_fill_bell_cairo_black_24.png delete mode 100644 patches/src/main/resources/navigationbuttons/drawable-ldpi/yt_fill_bell_cairo_black_24.png create mode 100644 patches/src/main/resources/navigationbuttons/drawable-mdpi/revanced_fill_bell_cairo_black_24.png delete mode 100644 patches/src/main/resources/navigationbuttons/drawable-mdpi/yt_fill_bell_cairo_black_24.png create mode 100644 patches/src/main/resources/navigationbuttons/drawable-xhdpi/revanced_fill_bell_cairo_black_24.png delete mode 100644 patches/src/main/resources/navigationbuttons/drawable-xhdpi/yt_fill_bell_cairo_black_24.png create mode 100644 patches/src/main/resources/navigationbuttons/drawable-xxhdpi/revanced_fill_bell_cairo_black_24.png delete mode 100644 patches/src/main/resources/navigationbuttons/drawable-xxhdpi/yt_fill_bell_cairo_black_24.png create mode 100644 patches/src/main/resources/navigationbuttons/drawable-xxxhdpi/revanced_fill_bell_cairo_black_24.png delete mode 100644 patches/src/main/resources/navigationbuttons/drawable-xxxhdpi/yt_fill_bell_cairo_black_24.png diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java index a0194f0dc6..479f7c01a2 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java @@ -278,13 +278,13 @@ private static void navigationTabCreatedCallback(NavigationButton button, View t } /** - * Use the bundled non cairo filled icon instead of a custom icon. - * Use the old non cairo filled icon, which is almost identical to - * the what would be the filled cairo icon. + * Custom cairo notification filled icon to fix unpatched app missing resource. + * Custom icon is modified starting from + * Font Awesome. */ private static final int fillBellCairoBlack = Utils.getResourceIdentifier( ResourceType.DRAWABLE, - "yt_fill_bell_black_24"); + "revanced_fill_bell_cairo_black_24"); /** * Injection point. @@ -292,13 +292,12 @@ private static void navigationTabCreatedCallback(NavigationButton button, View t */ @SuppressWarnings({"unchecked", "rawtypes"}) public static void setCairoNotificationFilledIcon(EnumMap enumMap, Enum tabActivityCairo) { - if (fillBellCairoBlack != 0) { - // Show a popup informing this fix is no longer needed to those who might care. - if (BaseSettings.DEBUG.get() && enumMap.containsKey(tabActivityCairo)) { - Logger.printException(() -> "YouTube fixed the cairo notification icons"); - } - enumMap.putIfAbsent(tabActivityCairo, fillBellCairoBlack); + // Show a popup informing this fix is no longer needed to those who might care. + if (BaseSettings.DEBUG.get() && enumMap.containsKey(tabActivityCairo)) { + Logger.printException(() -> "YouTube fixed the cairo notification icons"); } + + enumMap.putIfAbsent(tabActivityCairo, fillBellCairoBlack); } public enum NavigationButton { 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 77ed5ed7ab..92b65839bc 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 @@ -6,6 +6,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.instructions import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patcher.patch.resourcePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.shared.misc.mapping.resourceMappingPatch @@ -17,6 +18,8 @@ import app.revanced.patches.youtube.misc.playservice.is_20_28_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_39_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.shared.mainActivityOnBackPressedFingerprint +import app.revanced.util.ResourceGroup +import app.revanced.util.copyResources import app.revanced.util.findFreeRegister import app.revanced.util.getReference import com.android.tools.smali.dexlib2.AccessFlags @@ -46,6 +49,27 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig versionCheckPatch, playerTypeHookPatch, // Required to detect the search bar in all situations. resourceMappingPatch, // Used by fingerprints + resourcePatch { + // Copy missing notification icon. + execute { + arrayOf( + // App does not use ldpi icons. + "mdpi", + "hdpi", + "xhdpi", + "xxhdpi", + "xxxhdpi", + ).forEach { mipmap -> + copyResources( + "navigationbuttons", + ResourceGroup( + "drawable-$mipmap", + "revanced_fill_bell_cairo_black_24.png" + ) + ) + } + } + } ) execute { diff --git a/patches/src/main/resources/navigationbuttons/drawable-hdpi/revanced_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-hdpi/revanced_fill_bell_cairo_black_24.png new file mode 100644 index 0000000000000000000000000000000000000000..ba9154778287b0f833385ce97391a260c95f42aa GIT binary patch literal 378 zcmV-=0fqjFP)qkC%;gPW6$j&>2}~?RpMXK*s=R^m31HHVM0Z_u(y6$Ukjg+q zpeF+{G--SPc5&eI8!!3hwmbHfO`Q?5%|_I*$w<**ir#KY2Sp||T=dRdYGk13;fF## zJ*@PZ2CoF6P{12a6sb74+e|p+;(%O*cXZ4?s325iz%n+p@D$PiVs)u`tRrF@{|77!{ZsLq8NGH}dce^CUOQv0`o5iX29VXu%FJYKlS)j0U36 zEe0jNM4?YgBv70)7lr1Wp@>!Hg+LSvc&1E@95-m>yT&F`3qMuJ=ZHuT=#;xB(kUK+ zI1=D-LL`f0`ds~OOgI}b-Z|~l!a}6WA{1KC{nrN)6z$NH-A0j-jl+=HWl3r0-~a#s07*qoM6N<$f)lo(cK`qY literal 0 HcmV?d00001 diff --git a/patches/src/main/resources/navigationbuttons/drawable-hdpi/yt_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-hdpi/yt_fill_bell_cairo_black_24.png deleted file mode 100644 index 7381ab7ef40b7ce23eeeb2f8d588d909c60323a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 708 zcmV;#0z3VQP)%4b4NL^rM8#AC!4*YJ1r-c55F;^j0sn-ep^4%WiHV_+xxc|g6f;3) z=KGiqrmNq5OH~g{FvB^0U)|-r)6=!|%-Yck`&l(q`ap*KhSno~3VwjU$8>GZ8mV^l zHMEAUZotp*8r(XjYjf7@A>D?)h7PmM6SxC*Va}R8-CFUuk0Iar8I*Uy2-fUr)^8oq z%voIAf*WB3Yqu%d>kP{}v>G~z>`Qn8<~Fi+oSqlZ8A2Ue3>`r772FTqkdTEv_P(ae zSwb1LhBhO04<3T8ILN?Vs0JaAT0{GgxehnLRygCV8pYXKL+4T23;RMd=W2#)4B4ZY zu|_l1<7}0NjVXbpIUfT@mL__x)le%tUSr4}@4i`~ilQ27Wm}64OwWz^k2r+$%&SF+ zQDaD&`!qJL3@W#4L>%dVz@zEU922k3^RE>R#K@k2?P zJnn1AbL0)`-gW&4!ynetwK;3{kZwa?L+KUXoTNbhbMu~YHXVrRy0ri5}pS-tFdjOt7weqE@zqAOQ`9Y$-K6reG*Hs3wl0c=9fj@vcc&rm2dQx zk<79TP!_3<^YsbeJE-Ri|H7|P7FpsEPm%EDwoz{Z-_v9npe&k2-h_QHW46wfMO!#K zun%S|t8;0QM|*`c1N&g+nvmD9R8?BEhO!9%3bU&*oEAMGZo`ehL)JGK;j9*YvyahC zi#*n6jHkeR);stS=&TlfvtEOpKiZFwe7!Os!_z=#HMUKpcT~Fm;a(6g0-e>^Ht`Jr o0RR8zVFtkf000I_L_t&o02XjBCC>ThR{#J207*qoM6N<$g8PZBfB*mh diff --git a/patches/src/main/resources/navigationbuttons/drawable-mdpi/revanced_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-mdpi/revanced_fill_bell_cairo_black_24.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e768ba52215e25266c77d256d720d8b7d2cbd0 GIT binary patch literal 237 zcmV40D5(tY<1+)CPdsZKRt**=8}bS6!;J;F>((^u0eDyx(mexm@6orgELK4O;>fbAk1(t z_3FO+>Q2wl-BT0){27~oSuXSrz7J@v#TS~=r z-xaXVz!O}CDb(!gNqfz{6flkJ9`3*#wrS|mOF4>Cz!CNX*aba@Ia4X%f}u&+1wEHJ zQ!cuS=zD0+u*Ap(sISJ>;%<$uGb}M$MJ(R~ez4Y1{}IURn>813+BoWq)|s||EzWE;qnB_-a}!2L1Lo;Iz!}&V&O9>Y87#j@ z15S{4;a}nGaX6d?`0#oQ4LxgTpTn6n;DzP}^!5+wiv~G@TIjKM_BC{+0bwt!ePV`t z>o!e2Vr{?;Q@$qs*3w!Hxs2L?PmZ~U-mTJF4XKRUfbuDY?hgO}0RR78%_Up_000I_ cL_t&o0L|1cG2$G_PXGV_07*qoM6N<$g1xrFi2wiq diff --git a/patches/src/main/resources/navigationbuttons/drawable-xhdpi/revanced_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-xhdpi/revanced_fill_bell_cairo_black_24.png new file mode 100644 index 0000000000000000000000000000000000000000..dfaf31c8b5348313f45a5b11bfad82f0a5e74184 GIT binary patch literal 415 zcmV;Q0bu@#P)>_d|4pb0%5C`rNSR)VzhOCm<1xjP*B(#FB z75HYEL~1C_RY~B8P&*KE$P8O_P$|}BlUR4Cl)EL?OX@(KSXZe7m&CHE(bGQOql$%w z=wuILyvTqzM-PZi3pKSCHU>FUi53oq*|;?5kJrG(Ui|g*;}7l-E8RH1u37*9002ov JPDHLkV1isxs!9L= literal 0 HcmV?d00001 diff --git a/patches/src/main/resources/navigationbuttons/drawable-xhdpi/yt_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-xhdpi/yt_fill_bell_cairo_black_24.png deleted file mode 100644 index 2eed03d8b17dbc774585eab9d5a9f600465dbd85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 843 zcmV-R1GM~!P)4Mbl+OcfDD%|%2|%oJ2aGeO_L%*aTyjeG=OKn+9_ zzi)ONSlOxi|DNiVg;~y->Zv+){yNj!J>5OaXO{TiG{FDffzv&(z#dpb-wpT)ejn0p z`y8XI9a`^!-7M`hd@*=zkT@XzQ9>{l@aRKT@lgA_h4pZ(W+yc8|D-&Nqy=e028el!8p2A&lQtZUw z3DlD&hpquGQRXDTQj%cQ(LEoR7d%5%dx0skb#E`hg}J!2i`fgPHxj=xvR# zdp3aj&0+VvP;YC5XC}lWPybg(ZyIm-?VPgA2KbHpPx!4T>TM0|W5@`f>Fn&upNew32+6+^m&>&S$KD6te~^03t00lMqZ)PER0%!2TV(SGoo(^uTJlm z3~K?3=}X29$BJvH1^Cc#AziJCYp4bA?Bl~Lf2ioXfUfhb`GU!h;aJoH{9>kO123ID zs7kaT@(|RPyd1Npk8g_i2ekm9)eJ>nhHa$DXp4R=1H3C%nm?G)&Y$_uyOsf7<2?&& zP@}e{3yrr7;PK+)_Su>7rCq!lwc}NZk(L20`;`}edAUjJPpdy@rQ7y7riSh|XdS>+ z`RP7q!)K^IGM8@K=NLon&_{rFs|z?y0|Y*#UL}7300960*HAg100006NklA;!lz3T0oq~k^hDy3b(?1~Q!AtZf>`R`K?$)J4 z&_tqAp{NbY)xfo(W83Ewbcm?*yYIg5&vzd7c>M#<+vo6k)6vnfuPLHTFwY7lN~|!? z1W^=i6UU)~`C}Cv;~- z)B?t33k2u@tFA$-93UW3Qq)|7YRoZ!b&4}MzjEAHXOXigEb8Jo4s}eEtK)EtE-XMTGklF&LtYv zrp4_rOD}>HBV^Gn2Weh&4uzO*X83{eu@ZOaM$9maG<*d$c)}23M%Y063es#af{-xN zlrcV6<|bi8^pK|NJE+P-dJxga5_R7}b)M3Ph$t&GdwFQ|IuS&KF+vL?qF*fNARG?P z@a-_~#Dd;(2;ZhChy@jx#HSE*)Ww2o%o4(vBfP)}Zka)Rxk6PmsLEA*=;akgcrWRt zMP1y(SlC?@Eg9vbm7outrv)(_w3Q%Dh8P|xQfy-^ZJQJdPi|4cSX_l^JQ!jPV|nix zq-mGfv>x=8i!|*r1?xeZUV@JD#(K~y!+0>wcdI$yxPd2OF7S-9m6$S1Ob|lU7RF^; z1S;zqlqFDU*Pt|kO1OUDB?wfM40_M!GfJQoadNu`<%pvQT$0>>zsYkXX_HYh{~Quz t7;W#VMS}G2Q;ReSqNvUdN=L_j_7hEgB4V`4Y7PJZ002ovPDHLkV1l0GJ3s&c literal 0 HcmV?d00001 diff --git a/patches/src/main/resources/navigationbuttons/drawable-xxhdpi/yt_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-xxhdpi/yt_fill_bell_cairo_black_24.png deleted file mode 100644 index 98fd7f803a61b7382fd8d5d400e0516d40a68424..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1423 zcmV;A1#tR_P)WK(2w)I(?gwezWTbmZuRZHXU`0OV-*+#8Y|Dt z%plMp&;$i0>>kdbL7)i=OxWG!8FUuhE(b4x1z;oCKMR-L=04llmRfU2EHG3*@EpJiS>6ZUnC5 z#+q$xYmBk3j}3_2Sz92-6EB?`GCE<5vF6AK&kLz7(0$PKQpq_Bj4{?6q^V=I1^S$B zIj-Qc%vf_|1?L3S6zDt%z5+_k9Of#`(HtLx34RZeht_9Y_#hOK8GoH+L3GOTKDe(584f5u^jQpR0uYomjvDSt_ zp8l^vQ-Q9)w{6z=k|M7HYvbZ9S|E?A)F%~V*1<>+n zdiNbUD3f-qS?gI^SX&M(##p349=ZFW^)Waf)HZ8=NKxlWa$&LDA_a1G>n!(9XoV3Z zS5vd5wO=McF1T`w6zFQ`ya2pk!gXR7Q}smjUH>Cn%L!lt8U~Syk4xnUGta zD1rRcDC|#oxc7#|NuvbvlrAO{oWMK#;*?PWJzUHrKEXo~DI)}O-r?6A5qu(Z$VqNR zIU@wR1_lp;zL{rr@z@w4kax}@17fhk9yqxbr7ac6*|RS-U0K9pZg9-HkAu9-XpWO1rY&T>zBOEyIyAISN} zSjhJ*9Z4&9-<9-@v_=$C1bTps&Q5VtZT7*wH0nf(Kwi6|QQ{sqO6o(3KwIeaZZPfU zgN3b4JCP#Lc9Q-N_JV0OpLY1_@Xn?kND;`Ki}~kUTr2ShL0@bV54o3{oZC&90Zym+91#%&bn5L;5fnv--l{elBNk&=lG6-P2xLHkK~9mtAeVJ?GKB=x6dkN5hA~y#B8voAmfKWe zNQ_PNkq>l0o?bQ(!-y*GFo6Wz1h<%P>h;+}KJWokbh8o%bqP+8MifeOoCNBsc}Y%X zK#mtwqs$@o=K)qIPai29RK?lDD5BITyNRQ!k|xI028?r=N_?4z-|N@-`Hc46{SS!I zKnyK0R`|WUi{I<(ana&ZhpRoHT6Mr8?EwyzXiDOss+JK%u@P!@e*tjOH`{4wOf6_PE?&%A8-;?_tgj7Mb#Je0qrPCl2ad$ zr2;kk5CiQ+&0`}29-<`9u#o}3n1_mEh@lRn;-j$v?@_Rk0%EMq1g;e^*c$@23o%-O z9R#R?Z;0V~h!dC_NC;gcAlvam8Q`&%0MzgU390Wap-eG8AR*R9jI!K8LhdGIXk;q% z0Uj$T*%icsE>W@vRt&gD$!=OP;5sGSX~lqTl+5815^`;nWhp&Kh<&AwGF5Sn9&(7` za&&W*`4}^X_-G94^!ggmi*;Ij4QRnSXMGJgi*-`I4nU-^(37GEJi$uK$sk3PVL6sM zP}DK316b_BEEDovz;gS^%<$*g5B6Ke(|;ZYeabTCj1*^Rrl0ZY`f272spyPyBoc{4 ag7+IBQj|8Q%L9)90000Un|y literal 0 HcmV?d00001 diff --git a/patches/src/main/resources/navigationbuttons/drawable-xxxhdpi/yt_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-xxxhdpi/yt_fill_bell_cairo_black_24.png deleted file mode 100644 index e4732bf2f23fa85a1795ccf4c871a577719e6911..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1287 zcmV+i1^D`jP)z@;j|==^1poj5AY({UO#lFTCIA3{ga82g0001h=l}q9FaQARU;qF* zm;eA5aGbhPJOBUy24YJ`L;y$tNB~HePQ5Jv000SaNLh0L04^f{04^f|c%?sf00007 zbV*G`2k8kJ5hw}d`$fk900c`(L_t(|+U=dqixfu~ho9-0T}MsWsIYP4__2$IC>s(I zU4sdRC?p}cySVXWj^ZtfcoHP19P%dw&1uicA@~g|f<%(DVKqdA5TfP-5_UZ3xZ})t zsOm)|ti3Z`-St+#54@LUr>5rjtFEekyQ&%#MNt$*Q4~cf8YN-%T@OqE9|PNfLHqZA zfSbT2;0*AGTARM`-vCXZ^PFhf|6Q-LrNbmJmq7SuW6pk7>4DFIb{FEu(Y9qMUGOQ; z>OuTCTDB}@39Rk1+gYqTTC1`qXF5gke35eKx;y*P-yw#$UjG zpugziSAnCBW<5z}MaOI%a-*E%cP|5W0LL*|%}U1KKM$-1ZeX&ht)g{1W5AC z$3x&6u-(?F5JbQTa1MBoqxf+=04@MqJe`)O&MM$*pzeYAanx;{Ruy5;J#1$@ZI29S z+k1pVc5Di^>)8hU1U&Xg{5T%lF=;f*$w`)d-g4j|@J7zFuf=ABZ`wLmLu>tIJJYyD zIuBV~MGN>9cq^+$lGPPZ#XOZ-=lM({0&2iiNMk`f?VR`JyaZr%T$Hr(X@B2K;M(gVW2* zb@^>%6JfHXA}_HJo-8eM?XF8gSO~jPvH=4D7%(8&fK34yuu-xB!vPpDEZKn301OzF zY{1R{3>cGoA5g{Y&y~Ks;~^#~H!tl9*h?5|YnB5aNbG{f35N-374F0A!|DVQ_i&Uq zb9Dtw;^D6J9vA}lNviPWfLebX7o~{*HhyisNHcawFyKO<;&*`WeHVXEz~aYSnRfds zem~~q!cO2ZON#4U(_D1)1#p1y83Y~yKloIs_sHkCfxM!L*+1X~Yk=PiBz_#fVU9Y; zl``hE+D<`ZhMd>EepO)c|hKyFSP7nsNwDf4mFiG8K)c=a7txO&N|XP*tKrU zRF=Rv>Al8kT;=SJBR!hXvSlbeu&>MRsE)ApoIdjkaGK;V^E_=o<2}+2(Wu$}{1ePs xba5i=Z{QcqvdFWTgSZt%Q4~c{6h%?I Date: Wed, 1 Oct 2025 17:56:30 +0400 Subject: [PATCH 24/59] use navigation notification button SVG --- .../misc/navigation/NavigationBarHookPatch.kt | 21 +++++------------- .../revanced_fill_bell_cairo_black_24.png | Bin 378 -> 0 bytes .../revanced_fill_bell_cairo_black_24.png | Bin 237 -> 0 bytes .../revanced_fill_bell_cairo_black_24.png | Bin 415 -> 0 bytes .../revanced_fill_bell_cairo_black_24.png | Bin 711 -> 0 bytes .../revanced_fill_bell_cairo_black_24.png | Bin 848 -> 0 bytes .../revanced_fill_bell_cairo_black_24.xml | 9 ++++++++ 7 files changed, 15 insertions(+), 15 deletions(-) delete mode 100644 patches/src/main/resources/navigationbuttons/drawable-hdpi/revanced_fill_bell_cairo_black_24.png delete mode 100644 patches/src/main/resources/navigationbuttons/drawable-mdpi/revanced_fill_bell_cairo_black_24.png delete mode 100644 patches/src/main/resources/navigationbuttons/drawable-xhdpi/revanced_fill_bell_cairo_black_24.png delete mode 100644 patches/src/main/resources/navigationbuttons/drawable-xxhdpi/revanced_fill_bell_cairo_black_24.png delete mode 100644 patches/src/main/resources/navigationbuttons/drawable-xxxhdpi/revanced_fill_bell_cairo_black_24.png create mode 100644 patches/src/main/resources/navigationbuttons/drawable/revanced_fill_bell_cairo_black_24.xml 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 92b65839bc..5b42e12b9f 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 @@ -52,22 +52,13 @@ val navigationBarHookPatch = bytecodePatch(description = "Hooks the active navig resourcePatch { // Copy missing notification icon. execute { - arrayOf( - // App does not use ldpi icons. - "mdpi", - "hdpi", - "xhdpi", - "xxhdpi", - "xxxhdpi", - ).forEach { mipmap -> - copyResources( - "navigationbuttons", - ResourceGroup( - "drawable-$mipmap", - "revanced_fill_bell_cairo_black_24.png" - ) + copyResources( + "navigationbuttons", + ResourceGroup( + "drawable", + "revanced_fill_bell_cairo_black_24.xml" ) - } + ) } } ) diff --git a/patches/src/main/resources/navigationbuttons/drawable-hdpi/revanced_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-hdpi/revanced_fill_bell_cairo_black_24.png deleted file mode 100644 index ba9154778287b0f833385ce97391a260c95f42aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 378 zcmV-=0fqjFP)qkC%;gPW6$j&>2}~?RpMXK*s=R^m31HHVM0Z_u(y6$Ukjg+q zpeF+{G--SPc5&eI8!!3hwmbHfO`Q?5%|_I*$w<**ir#KY2Sp||T=dRdYGk13;fF## zJ*@PZ2CoF6P{12a6sb74+e|p+;(%O*cXZ4?s325iz%n+p@D$PiVs)u`tRrF@{|77!{ZsLq8NGH}dce^CUOQv0`o5iX29VXu%FJYKlS)j0U36 zEe0jNM4?YgBv70)7lr1Wp@>!Hg+LSvc&1E@95-m>yT&F`3qMuJ=ZHuT=#;xB(kUK+ zI1=D-LL`f0`ds~OOgI}b-Z|~l!a}6WA{1KC{nrN)6z$NH-A0j-jl+=HWl3r0-~a#s07*qoM6N<$f)lo(cK`qY diff --git a/patches/src/main/resources/navigationbuttons/drawable-mdpi/revanced_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-mdpi/revanced_fill_bell_cairo_black_24.png deleted file mode 100644 index f3e768ba52215e25266c77d256d720d8b7d2cbd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 237 zcmV40D5(tY<1+)CPdsZKRt**=8}bS6!>_d|4pb0%5C`rNSR)VzhOCm<1xjP*B(#FB z75HYEL~1C_RY~B8P&*KE$P8O_P$|}BlUR4Cl)EL?OX@(KSXZe7m&CHE(bGQOql$%w z=wuILyvTqzM-PZi3pKSCHU>FUi53oq*|;?5kJrG(Ui|g*;}7l-E8RH1u37*9002ov JPDHLkV1isxs!9L= diff --git a/patches/src/main/resources/navigationbuttons/drawable-xxhdpi/revanced_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-xxhdpi/revanced_fill_bell_cairo_black_24.png deleted file mode 100644 index 759f1b3869a50bec8a108b7767593e9179a9760b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 711 zcmV;&0yzDNP)A;!lz3T0oq~k^hDy3b(?1~Q!AtZf>`R`K?$)J4 z&_tqAp{NbY)xfo(W83Ewbcm?*yYIg5&vzd7c>M#<+vo6k)6vnfuPLHTFwY7lN~|!? z1W^=i6UU)~`C}Cv;~- z)B?t33k2u@tFA$-93UW3Qq)|7YRoZ!b&4}MzjEAHXOXigEb8Jo4s}eEtK)EtE-XMTGklF&LtYv zrp4_rOD}>HBV^Gn2Weh&4uzO*X83{eu@ZOaM$9maG<*d$c)}23M%Y063es#af{-xN zlrcV6<|bi8^pK|NJE+P-dJxga5_R7}b)M3Ph$t&GdwFQ|IuS&KF+vL?qF*fNARG?P z@a-_~#Dd;(2;ZhChy@jx#HSE*)Ww2o%o4(vBfP)}Zka)Rxk6PmsLEA*=;akgcrWRt zMP1y(SlC?@Eg9vbm7outrv)(_w3Q%Dh8P|xQfy-^ZJQJdPi|4cSX_l^JQ!jPV|nix zq-mGfv>x=8i!|*r1?xeZUV@JD#(K~y!+0>wcdI$yxPd2OF7S-9m6$S1Ob|lU7RF^; z1S;zqlqFDU*Pt|kO1OUDB?wfM40_M!GfJQoadNu`<%pvQT$0>>zsYkXX_HYh{~Quz t7;W#VMS}G2Q;ReSqNvUdN=L_j_7hEgB4V`4Y7PJZ002ovPDHLkV1l0GJ3s&c diff --git a/patches/src/main/resources/navigationbuttons/drawable-xxxhdpi/revanced_fill_bell_cairo_black_24.png b/patches/src/main/resources/navigationbuttons/drawable-xxxhdpi/revanced_fill_bell_cairo_black_24.png deleted file mode 100644 index 5ccf8694242c26a94f84dbc8340bbb5cd0aaec18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 848 zcmV-W1F!svP)bn5L;5fnv--l{elBNk&=lG6-P2xLHkK~9mtAeVJ?GKB=x6dkN5hA~y#B8voAmfKWe zNQ_PNkq>l0o?bQ(!-y*GFo6Wz1h<%P>h;+}KJWokbh8o%bqP+8MifeOoCNBsc}Y%X zK#mtwqs$@o=K)qIPai29RK?lDD5BITyNRQ!k|xI028?r=N_?4z-|N@-`Hc46{SS!I zKnyK0R`|WUi{I<(ana&ZhpRoHT6Mr8?EwyzXiDOss+JK%u@P!@e*tjOH`{4wOf6_PE?&%A8-;?_tgj7Mb#Je0qrPCl2ad$ zr2;kk5CiQ+&0`}29-<`9u#o}3n1_mEh@lRn;-j$v?@_Rk0%EMq1g;e^*c$@23o%-O z9R#R?Z;0V~h!dC_NC;gcAlvam8Q`&%0MzgU390Wap-eG8AR*R9jI!K8LhdGIXk;q% z0Uj$T*%icsE>W@vRt&gD$!=OP;5sGSX~lqTl+5815^`;nWhp&Kh<&AwGF5Sn9&(7` za&&W*`4}^X_-G94^!ggmi*;Ij4QRnSXMGJgi*-`I4nU-^(37GEJi$uK$sk3PVL6sM zP}DK316b_BEEDovz;gS^%<$*g5B6Ke(|;ZYeabTCj1*^Rrl0ZY`f272spyPyBoc{4 ag7+IBQj|8Q%L9)90000Un|y diff --git a/patches/src/main/resources/navigationbuttons/drawable/revanced_fill_bell_cairo_black_24.xml b/patches/src/main/resources/navigationbuttons/drawable/revanced_fill_bell_cairo_black_24.xml new file mode 100644 index 0000000000..f69f9b329a --- /dev/null +++ b/patches/src/main/resources/navigationbuttons/drawable/revanced_fill_bell_cairo_black_24.xml @@ -0,0 +1,9 @@ + + + \ No newline at end of file From c6becb4044ce8502555e9d0763f2a359e3d25c8c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 3 Oct 2025 11:07:34 +0400 Subject: [PATCH 25/59] unofficial 20.40.33 --- .../youtube/layout/startupshortsreset/Fingerprints.kt | 3 ++- .../revanced/patches/youtube/video/videoid/Fingerprints.kt | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) 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 d668510541..f73cad02bd 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 @@ -20,7 +20,8 @@ internal val userWasInShortsAlternativeFingerprint by fingerprint { checkCast("Ljava/lang/Boolean;"), methodCall(smali = "Ljava/lang/Boolean;->booleanValue()Z", maxAfter = 0), opcode(Opcode.MOVE_RESULT, maxAfter = 0), - string("userIsInShorts: ", maxAfter = 5) + // 20.40+ string was merged into another string and is a partial match. + string("userIsInShorts: ", partialMatch = true, maxAfter = 15) ) } 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 9c8fbbc23c..6c32e8eb05 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 @@ -36,11 +36,10 @@ internal val videoIdBackgroundPlayFingerprint by fingerprint { opcode(Opcode.MONITOR_EXIT), opcode(Opcode.RETURN_VOID) ) - // The target snippet of code is buried in a huge switch block and the target method - // has been changed many times by YT which makes identifying it more difficult than usual. custom { method, classDef -> - classDef.methods.count() == 17 && - method.implementation != null + method.implementation != null && + (classDef.methods.count() == 17 // 20.39 and lower. + || classDef.methods.count() == 16) // 20.40+ } } From 563f586eed993865786a3319063b014726769591 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 3 Oct 2025 11:15:49 +0400 Subject: [PATCH 26/59] fix 20.22+ litho broken for some users --- .../patches/components/LithoFilterPatch.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java index a85a024a13..033041c4e3 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/LithoFilterPatch.java @@ -116,8 +116,12 @@ private static final class DummyFilter extends Filter { } */ public static final boolean DEBUG_EXTRACT_IDENTIFIER_FROM_BUFFER = false; - private static final String EML_STRING = ".eml"; - private static final byte[] EML_STRING_BYTES = EML_STRING.getBytes(StandardCharsets.US_ASCII); + /** + * String suffix for components. + * Can be any of: ".eml", ".e-b", ".eml-js", "e-js-b" + */ + private static final String LITHO_COMPONENT_EXTENSION = ".e"; + private static final byte[] LITHO_COMPONENT_EXTENSION_BYTES = LITHO_COMPONENT_EXTENSION.getBytes(StandardCharsets.US_ASCII); private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; @@ -227,11 +231,11 @@ public static void setProtoBuffer(byte[] buffer) { // unique characters, but it seems to be slower since the extra overhead of checking the // bad character array negates any performance gain of skipping a few extra subsearches. int emlIndex = -1; - final int emlStringLength = EML_STRING_BYTES.length; + final int emlStringLength = LITHO_COMPONENT_EXTENSION_BYTES.length; for (int i = 0, lastStartIndex = buffer.length - emlStringLength; i <= lastStartIndex; i++) { boolean match = true; for (int j = 0; j < emlStringLength; j++) { - if (buffer[i + j] != EML_STRING_BYTES[j]) { + if (buffer[i + j] != LITHO_COMPONENT_EXTENSION_BYTES[j]) { match = false; break; } @@ -251,7 +255,7 @@ public static void setProtoBuffer(byte[] buffer) { while (startIndex > 0) { final byte character = buffer[startIndex]; int startIndexFinal = startIndex; - if (isAsciiNumber(character) || isAsciiLowerCaseLetter(character) || character == '_') { + if (isAsciiLowerCaseLetter(character) || isAsciiNumber(character) || character == '_') { // Valid character for the first path element. startIndex--; } else { From 1901e965e8341801a60805ab7a2a938e691da641 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 14 Oct 2025 10:50:32 +0400 Subject: [PATCH 27/59] unofficial 20.41.33 --- .../ReturnYouTubeDislikePatch.kt | 28 +++++++++++++------ .../youtube/misc/litho/filter/Fingerprints.kt | 6 ---- .../misc/litho/filter/LithoFilterPatch.kt | 25 ++++++----------- .../patches/youtube/shared/Fingerprints.kt | 2 +- 4 files changed, 30 insertions(+), 31 deletions(-) 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 4a13646999..2ff5851bb6 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 @@ -124,12 +124,14 @@ val returnYouTubeDislikePatch = bytecodePatch( // This hook handles all situations, as it's where the created Spans are stored and later reused. // Find the field name of the conversion context. - val conversionContextField = textComponentConstructorFingerprint.originalClassDef.fields.find { - it.type == conversionContextFingerprintToString.originalClassDef.type + val conversionContextClass = conversionContextFingerprintToString.originalClassDef + val textComponentConversionContextField = textComponentConstructorFingerprint.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 { + textComponentLookupFingerprint.match(textComponentConstructorFingerprint.originalClassDef).method.apply { // Find the instruction for creating the text data object. val textDataClassType = textComponentDataFingerprint.originalClassDef.type @@ -161,16 +163,26 @@ val returnYouTubeDislikePatch = bytecodePatch( charSequenceRegister = getInstruction(charSequenceIndex).registerA } - val tempRegister = findFreeRegister(insertIndex, charSequenceRegister) + val free1 = findFreeRegister(insertIndex, charSequenceRegister) + val free2 = findFreeRegister(insertIndex, charSequenceRegister, free1) addInstructionsAtControlFlowLabel( insertIndex, """ # Copy conversion context - move-object/from16 v$tempRegister, p0 - iget-object v$tempRegister, v$tempRegister, $conversionContextField - invoke-static { v$tempRegister, v$charSequenceRegister }, $EXTENSION_CLASS_DESCRIPTOR->onLithoTextLoaded(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; + move-object/from16 v$free1, p0 + + # 20.41 field is the abstract superclass. + # Verify it's the expected subclass just in case. + instance-of v$free2, v$free1, ${textComponentConversionContextField.type} + if-eqz v$free2, :ignore + + check-cast v$free1, $conversionContextClass + invoke-static { v$free1, v$charSequenceRegister }, $EXTENSION_CLASS_DESCRIPTOR->onLithoTextLoaded(Ljava/lang/Object;Ljava/lang/CharSequence;)Ljava/lang/CharSequence; move-result-object v$charSequenceRegister + + :ignore + nop """ ) } 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 0740c3b694..3faa497407 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 @@ -9,12 +9,6 @@ import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val componentContextParserFingerprint by fingerprint { - instructions( - string("Number of bits must be positive") - ) -} - internal val componentCreateFingerprint by fingerprint { instructions( string("Element missing correct type extension"), 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 b03d8147d6..d161a2c480 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 @@ -4,7 +4,6 @@ package app.revanced.patches.youtube.misc.litho.filter import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstructions import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction import app.revanced.patcher.patch.bytecodePatch @@ -16,16 +15,13 @@ import app.revanced.patches.youtube.misc.playservice.is_20_22_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch import app.revanced.patches.youtube.shared.conversionContextFingerprintToString import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.findFieldFromToString import app.revanced.util.findFreeRegister -import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstInstructionReversedOrThrow import app.revanced.util.insertLiteralOverride import app.revanced.util.returnLate import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -import com.android.tools.smali.dexlib2.iface.reference.FieldReference import java.util.logging.Logger lateinit var addLithoFilter: (String) -> Unit @@ -125,18 +121,9 @@ val lithoFilterPatch = bytecodePatch( // if the component is filtered then return an empty component. // Find the identifier/path fields of the conversion context. - val conversionContextIdentifierField = componentContextParserFingerprint.match().let { - // Identifier field is loaded just before the string declaration. - val index = it.method.indexOfFirstInstructionReversedOrThrow( - it.instructionMatches.first().index - ) { - val reference = getReference() - reference?.definingClass == conversionContextFingerprintToString.originalClassDef.type - && reference.type == "Ljava/lang/String;" - } - it.method.getInstruction(index).getReference()!! - } + val conversionContextIdentifierField = conversionContextFingerprintToString.method + .findFieldFromToString("identifierProperty=") val conversionContextPathBuilderField = conversionContextFingerprintToString.originalClassDef .fields.single { field -> field.type == "Ljava/lang/StringBuilder;" } @@ -167,6 +154,12 @@ val lithoFilterPatch = bytecodePatch( insertIndex, """ move-object/from16 v$freeRegister, p2 + + # 20.41 field is the abstract superclass. + # Verify it's the expected subclass just in case. + instance-of v$identifierRegister, v$freeRegister, ${conversionContextFingerprintToString.classDef.type} + if-eqz v$identifierRegister, :unfiltered + iget-object v$identifierRegister, v$freeRegister, $conversionContextIdentifierField iget-object v$pathRegister, v$freeRegister, $conversionContextPathBuilderField invoke-static { v$identifierRegister, v$pathRegister }, $EXTENSION_CLASS_DESCRIPTOR->isFiltered(Ljava/lang/String;Ljava/lang/StringBuilder;)Z 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 fbfb0e8d75..d782462d44 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 @@ -17,7 +17,7 @@ internal const val YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE = "Lcom/google/android/apps/ internal val conversionContextFingerprintToString by fingerprint { parameters() strings( - "ConversionContext{containerInternal=", + "ConversionContext{", // Partial string match. ", widthConstraint=", ", heightConstraint=", ", templateLoggerFactory=", From c98c73b0bc9e9de515b58950a06cbfde0608c1ce Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Wed, 15 Oct 2025 11:46:11 +0400 Subject: [PATCH 28/59] Don't turn off new Shorts player flag on newer targets since it can break the Shorts player overlay --- patches/api/patches.api | 1 + .../ReturnYouTubeDislikePatch.kt | 14 +++++++++-- .../layout/searchbar/WideSearchbarPatch.kt | 6 ++--- .../misc/playservice/VersionCheckPatch.kt | 25 +++++++++++-------- 4 files changed, 30 insertions(+), 16 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index 6d5d3f4d96..5fa820efa9 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1635,6 +1635,7 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_20_34_or_greater ()Z public static final fun is_20_37_or_greater ()Z public static final fun is_20_39_or_greater ()Z + public static final fun is_20_41_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatchKt { 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 2ff5851bb6..292bd5f382 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 @@ -17,6 +17,7 @@ import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_33_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_10_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_41_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 @@ -38,6 +39,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.TypeReference +import java.util.logging.Logger private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch;" @@ -169,7 +171,7 @@ val returnYouTubeDislikePatch = bytecodePatch( addInstructionsAtControlFlowLabel( insertIndex, """ - # Copy conversion context + # Copy conversion context. move-object/from16 v$free1, p0 # 20.41 field is the abstract superclass. @@ -199,7 +201,15 @@ val returnYouTubeDislikePatch = bytecodePatch( // If enabled then the litho text span hook is never called. // Target code is very obfuscated and exactly what the code does is not clear. // Return late so debug patch logs if the flag is enabled. - textComponentFeatureFlagFingerprint.method.returnLate(false) + if (is_20_41_or_greater) { + // TODO: Support the new non litho Shorts layout. + // Turning off this flag on later versions can break the Shorts overlay and nothing is shown. + Logger.getLogger(this::class.java.name).warning( + "20.40+ Shorts player is not fully supported yet. Shorts Dislikes may not show." + ) + } else { + textComponentFeatureFlagFingerprint.method.returnLate(false) + } } // Player response video id is needed to search for the video ids in Shorts litho components. 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 448d9208bd..b42856f0b5 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 @@ -50,9 +50,9 @@ val wideSearchbarPatch = bytecodePatch( // YT removed the legacy text search text field all code required to use it. // This functionality could be restored by adding a search text field to the toolbar // with a listener that artificially clicks the toolbar search button. - Logger.getLogger(this::class.java.name).severe( - "Wide searchbar is not compatible with 20.31+") - return@execute + return@execute Logger.getLogger(this::class.java.name).warning( + "Wide searchbar is not compatible with 20.31+" + ) } addResources("youtube", "layout.searchbar.wideSearchbarPatch") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index 4ca4991ee6..597f0e5908 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -65,27 +65,29 @@ var is_20_14_or_greater : Boolean by Delegates.notNull() private set var is_20_15_or_greater : Boolean by Delegates.notNull() private set -var is_20_19_or_greater = false +var is_20_19_or_greater : Boolean by Delegates.notNull() private set -var is_20_20_or_greater = false +var is_20_20_or_greater : Boolean by Delegates.notNull() private set -var is_20_21_or_greater = false +var is_20_21_or_greater : Boolean by Delegates.notNull() private set -var is_20_22_or_greater = false +var is_20_22_or_greater : Boolean by Delegates.notNull() private set -var is_20_26_or_greater = false +var is_20_26_or_greater : Boolean by Delegates.notNull() private set -var is_20_28_or_greater = false +var is_20_28_or_greater : Boolean by Delegates.notNull() private set -var is_20_30_or_greater = false +var is_20_30_or_greater : Boolean by Delegates.notNull() private set -var is_20_31_or_greater = false +var is_20_31_or_greater : Boolean by Delegates.notNull() private set -var is_20_34_or_greater = false +var is_20_34_or_greater : Boolean by Delegates.notNull() private set -var is_20_37_or_greater = false +var is_20_37_or_greater : Boolean by Delegates.notNull() private set -var is_20_39_or_greater = false +var is_20_39_or_greater : Boolean by Delegates.notNull() + private set +var is_20_41_or_greater : Boolean by Delegates.notNull() private set val versionCheckPatch = resourcePatch( @@ -132,5 +134,6 @@ val versionCheckPatch = resourcePatch( is_20_34_or_greater = 253505000 <= playStoreServicesVersion is_20_37_or_greater = 253805000 <= playStoreServicesVersion is_20_39_or_greater = 253980000 <= playStoreServicesVersion + is_20_41_or_greater = 254205000 <= playStoreServicesVersion } } From a1ad5fea201806db74912b9fd5e8ede9f977e180 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 18 Oct 2025 13:21:43 +0400 Subject: [PATCH 29/59] unofficial 20.42.36 --- .../app/revanced/patches/shared/misc/audio/Fingerprints.kt | 3 +-- .../patches/youtube/layout/player/fullscreen/Fingerprints.kt | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt index e84c1d34ac..51eefebe2a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt @@ -20,10 +20,9 @@ internal val formatStreamModelToStringFingerprint by fingerprint { internal const val AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG = 45666189L internal val selectAudioStreamFingerprint by fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") custom { method, _ -> - method.parameters.size > 2 // Method has a large number of parameters and may change. + method.parameters.size > 1 // Method has a large number of parameters and may change. && method.containsLiteralInstruction(AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG) } } 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 f5783b80c9..8e60976b46 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 @@ -10,7 +10,6 @@ import com.android.tools.smali.dexlib2.Opcode * 19.46+ */ internal val openVideosFullscreenPortraitFingerprint by fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "Lj\$/util/Optional;") instructions( From 1356a7e5b2db2c7cb46f0c93aed443830898d229 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 20 Oct 2025 10:35:49 +0400 Subject: [PATCH 30/59] add 20.31+ bold icons setting --- .../patches/NavigationButtonsPatch.java | 13 +++++++++++-- .../extension/youtube/settings/Settings.java | 1 + .../layout/buttons/navigation/Fingerprints.kt | 12 +++++++++++- .../navigation/NavigationButtonsPatch.kt | 18 ++++++++++++++++++ .../resources/addresources/values/strings.xml | 3 +++ 5 files changed, 44 insertions(+), 3 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java index e5ec52b771..ded0512a9d 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java @@ -5,12 +5,11 @@ import android.os.Build; import android.view.View; +import android.widget.TextView; import java.util.EnumMap; import java.util.Map; -import android.widget.TextView; - import app.revanced.extension.shared.Utils; import app.revanced.extension.youtube.settings.Settings; @@ -39,6 +38,9 @@ public final class NavigationButtonsPatch { private static final Boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK = Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK.get(); + private static final Boolean NAVIGATION_BAR_DISABLE_BOLD_ICONS + = Settings.NAVIGATION_BAR_DISABLE_BOLD_ICONS.get(); + /** * Injection point. */ @@ -69,6 +71,13 @@ public static boolean useAnimatedNavigationButtons(boolean original) { return Settings.NAVIGATION_BAR_ANIMATIONS.get(); } + /** + * Injection point. + */ + public static boolean useBoldIcons(boolean original) { + return !NAVIGATION_BAR_DISABLE_BOLD_ICONS; + } + /** * Injection point. */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index c821dd45db..997b32bf70 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -285,6 +285,7 @@ public class Settings extends BaseSettings { public static final BooleanSetting SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_switch_create_with_notifications_button", TRUE, true, "revanced_switch_create_with_notifications_button_user_dialog_message"); public static final BooleanSetting NAVIGATION_BAR_ANIMATIONS = new BooleanSetting("revanced_navigation_bar_animations", FALSE); + public static final BooleanSetting NAVIGATION_BAR_DISABLE_BOLD_ICONS = new BooleanSetting("revanced_navigation_bar_disable_bold_icons", TRUE, true); public static final BooleanSetting DISABLE_TRANSLUCENT_STATUS_BAR = new BooleanSetting("revanced_disable_translucent_status_bar", FALSE, true, "revanced_disable_translucent_status_bar_user_dialog_message"); public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT = new BooleanSetting("revanced_disable_translucent_navigation_bar_light", FALSE, true); 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 49868a731f..61495eced1 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 @@ -65,4 +65,14 @@ internal val translucentNavigationButtonsSystemFeatureFlagFingerprint by fingerp instructions( literal(45632194L) // Translucent system buttons feature flag. ) -} \ No newline at end of file +} + +// Flag is present in 20.23, but icons are missing and forcing bold icons crashes the app. +internal val boldIconsFeatureFlagFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + parameters() + instructions( + literal(45685201L) + ) +} 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 7cc05190c2..72932e8c0e 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 @@ -14,6 +14,7 @@ import app.revanced.patches.youtube.misc.navigation.hookNavigationButtonCreated import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_15_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_31_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 @@ -72,6 +73,12 @@ val navigationButtonsPatch = bytecodePatch( ) } + if (is_20_31_or_greater) { + PreferenceScreen.GENERAL_LAYOUT.addPreferences( + SwitchPreference("revanced_navigation_bar_disable_bold_icons") + ) + } + PreferenceScreen.GENERAL_LAYOUT.addPreferences( PreferenceScreenPreference( key = "revanced_navigation_buttons_screen", @@ -146,5 +153,16 @@ val navigationButtonsPatch = bytecodePatch( ) } } + + // 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 { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$EXTENSION_CLASS_DESCRIPTOR->useBoldIcons(Z)Z" + ) + } + } } } diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index b458bed75f..a891e976bd 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -792,6 +792,9 @@ If changing this setting does not take effect, try switching to Incognito mode." Enable navigation bar animations Navigation transitions are animated Navigation transitions are not animated + Disable bold icons + Icons are not bold + Icons are bold Disable translucent status bar Status bar is opaque Status bar is opaque or translucent From 39da47e6ee6dcc8f271fbe20b5f80aeb0b74277e Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 20 Oct 2025 10:58:11 +0400 Subject: [PATCH 31/59] Use YT notification icon that isn't associated with the navigation bar enum (YT still failed to fixed even after a second icon redesign) --- .../youtube/patches/VersionCheckPatch.java | 2 ++ .../extension/youtube/shared/NavigationBar.java | 14 ++++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java index 97749cf75a..77d85737b5 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VersionCheckPatch.java @@ -24,5 +24,7 @@ private static boolean isVersionOrGreater(String version) { public static final boolean IS_20_22_OR_GREATER = isVersionOrGreater("20.22.00"); + public static final boolean IS_20_31_OR_GREATER = isVersionOrGreater("20.31.00"); + public static final boolean IS_20_37_OR_GREATER = isVersionOrGreater("20.37.00"); } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java index 479f7c01a2..b53a061222 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java @@ -22,6 +22,7 @@ import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseSettings; +import app.revanced.extension.youtube.patches.VersionCheckPatch; import app.revanced.extension.youtube.settings.Settings; @SuppressWarnings("unused") @@ -279,12 +280,13 @@ private static void navigationTabCreatedCallback(NavigationButton button, View t /** * Custom cairo notification filled icon to fix unpatched app missing resource. - * Custom icon is modified starting from - * Font Awesome. */ - private static final int fillBellCairoBlack = Utils.getResourceIdentifier( - ResourceType.DRAWABLE, - "revanced_fill_bell_cairo_black_24"); + private static final int fillBellCairoBlack = Utils.getResourceIdentifier(ResourceType.DRAWABLE, + // The bold cairo notification filled icon is present, + // but YT still has not fixed the icon not associated to the enum. + VersionCheckPatch.IS_20_31_OR_GREATER && !Settings.NAVIGATION_BAR_DISABLE_BOLD_ICONS.get() + ? "yt_fill_experimental_bell_vd_theme_24" + : "revanced_fill_bell_cairo_black_24"); /** * Injection point. @@ -294,7 +296,7 @@ private static void navigationTabCreatedCallback(NavigationButton button, View t public static void setCairoNotificationFilledIcon(EnumMap enumMap, Enum tabActivityCairo) { // Show a popup informing this fix is no longer needed to those who might care. if (BaseSettings.DEBUG.get() && enumMap.containsKey(tabActivityCairo)) { - Logger.printException(() -> "YouTube fixed the cairo notification icons"); + Logger.printException(() -> "YouTube fixed the notification icons"); } enumMap.putIfAbsent(tabActivityCairo, fillBellCairoBlack); From 5449357f7f836d134a08c065f14ffcb3f200305d Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:14:32 +0400 Subject: [PATCH 32/59] refactor --- .../extension/youtube/patches/NavigationButtonsPatch.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java index ded0512a9d..eed16380d5 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java @@ -29,16 +29,16 @@ public final class NavigationButtonsPatch { private static final boolean SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON = Settings.SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON.get(); - private static final Boolean DISABLE_TRANSLUCENT_STATUS_BAR + private static final boolean DISABLE_TRANSLUCENT_STATUS_BAR = Settings.DISABLE_TRANSLUCENT_STATUS_BAR.get(); - private static final Boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT + private static final boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT = Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT.get(); - private static final Boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK + private static final boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK = Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK.get(); - private static final Boolean NAVIGATION_BAR_DISABLE_BOLD_ICONS + private static final boolean NAVIGATION_BAR_DISABLE_BOLD_ICONS = Settings.NAVIGATION_BAR_DISABLE_BOLD_ICONS.get(); /** From 03890736004426eeceeef778650aa6845646a51c Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:40:37 +0400 Subject: [PATCH 33/59] fix minimal miniplayer using incorrectly sized bold icons --- .../youtube/patches/MiniplayerPatch.java | 13 +++++++++ .../youtube/layout/miniplayer/Fingerprints.kt | 10 +++++++ .../layout/miniplayer/MiniplayerPatch.kt | 27 ++++++++++++++++++- 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java index b2138934d6..f24108b97f 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/MiniplayerPatch.java @@ -379,6 +379,19 @@ public static int getMiniplayerDefaultSize(int original) { return original; } + /** + * Injection point. + */ + public static boolean allowBoldIcons(boolean original) { + if (CURRENT_TYPE == MINIMAL) { + // Minimal player does not have the correct pause/play icon (it's too large). + // Use the non bold icons instead. + return false; + } + + return original; + } + /** * Injection point. */ 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 7aaf7d2214..2a264a35b5 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 @@ -207,3 +207,13 @@ internal val playerOverlaysLayoutFingerprint by fingerprint { method.definingClass == YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME } } + +internal val miniplayerSetIconsFingerprint by fingerprint { + returns("V") + parameters("I", "Ljava/lang/Runnable;") + instructions( + resourceLiteral(ResourceType.DRAWABLE, "yt_fill_pause_white_36"), + resourceLiteral(ResourceType.DRAWABLE, "yt_fill_pause_black_36") + ) +} + 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 86ef32c674..37eea1c4ad 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 @@ -29,6 +29,7 @@ import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction 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 @@ -321,7 +322,7 @@ val miniplayerPatch = bytecodePatch( """ invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->getMiniplayerDefaultSize(I)I move-result v$register - """, + """ ) } @@ -386,6 +387,30 @@ val miniplayerPatch = bytecodePatch( // endregion + // region fix minimal miniplayer using the wrong pause/play bold icons. + + if (is_20_31_or_greater) { + miniplayerSetIconsFingerprint.method.apply { + findInstructionIndicesReversedOrThrow { + val reference = getReference() + opcode == Opcode.INVOKE_INTERFACE + && reference?.returnType == "Z" && reference.parameterTypes.isEmpty() + }.forEach { index -> + val register = getInstruction(index + 1).registerA + + addInstructions( + index + 2, + """ + invoke-static { v$register }, $EXTENSION_CLASS_DESCRIPTOR->allowBoldIcons(Z)Z + move-result v$register + """ + ) + } + } + } + + // endregion + // region Add hooks to hide modern miniplayer buttons. listOf( From 64334b4f79c0e08105f7077617a7b608be4a27ff Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 20 Oct 2025 20:07:17 +0400 Subject: [PATCH 34/59] refactor --- .../extension/music/settings/MusicActivityHook.java | 8 -------- .../extension/shared/settings/BaseActivityHook.java | 10 ++++++---- .../youtube/settings/YouTubeActivityHook.java | 8 -------- 3 files changed, 6 insertions(+), 20 deletions(-) diff --git a/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java b/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java index c255adaf11..5d6f6ce54a 100644 --- a/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java +++ b/extensions/music/src/main/java/app/revanced/extension/music/settings/MusicActivityHook.java @@ -50,14 +50,6 @@ protected void customizeActivityTheme(Activity activity) { ResourceType.STYLE, "Theme.ReVanced.YouTubeMusic.Settings")); } - /** - * Returns the resource ID for the YouTube Music settings layout. - */ - @Override - protected int getContentViewResourceId() { - return LAYOUT_REVANCED_SETTINGS_WITH_TOOLBAR; - } - /** * Returns the fixed background color for the toolbar. */ diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java index 830e5e8af9..ec64f5881a 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseActivityHook.java @@ -126,14 +126,16 @@ protected void createToolbar(Activity activity, PreferenceFragment fragment) { } /** - * Customizes the activity's theme. + * Returns the resource ID for the content view layout. */ - protected abstract void customizeActivityTheme(Activity activity); + protected int getContentViewResourceId() { + return LAYOUT_REVANCED_SETTINGS_WITH_TOOLBAR; + } /** - * Returns the resource ID for the content view layout. + * Customizes the activity's theme. */ - protected abstract int getContentViewResourceId(); + protected abstract void customizeActivityTheme(Activity activity); /** * Returns the background color for the toolbar. diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java index 3200b8a155..b6ce40dda3 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java @@ -48,14 +48,6 @@ protected void customizeActivityTheme(Activity activity) { activity.setTheme(Utils.getResourceIdentifierOrThrow(ResourceType.STYLE, theme)); } - /** - * Returns the resource ID for the YouTube settings layout. - */ - @Override - protected int getContentViewResourceId() { - return LAYOUT_REVANCED_SETTINGS_WITH_TOOLBAR; - } - /** * Returns the toolbar background color based on dark/light mode. */ From c37527f182e9f7fef1490a11d399d437dfb21fcc Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 20 Oct 2025 21:48:15 +0400 Subject: [PATCH 35/59] Add ReVanced bold icons --- .../shared/settings/BaseSettings.java | 1 + .../AbstractPreferenceFragment.java | 12 ++- .../preference/ToolbarPreferenceFragment.java | 7 +- .../search/BaseSearchResultsAdapter.java | 3 +- .../search/BaseSearchViewController.java | 15 +++- .../settings/search/SearchHistoryManager.java | 15 +++- .../patches/NavigationButtonsPatch.java | 10 --- .../ReVancedSettingsIconDynamicDrawable.java | 85 +++++++++++++++++++ .../extension/youtube/settings/Settings.java | 1 - .../youtube/settings/YouTubeActivityHook.java | 11 +++ .../youtube/shared/NavigationBar.java | 2 +- patches/api/patches.api | 46 +++++----- .../shared/misc/settings/SettingsPatch.kt | 34 ++++++-- .../settings/preference/BasePreference.kt | 9 +- .../preference/BasePreferenceScreen.kt | 19 +++-- .../settings/preference/IntentPreference.kt | 3 +- .../settings/preference/ListPreference.kt | 3 +- .../preference/NonInteractivePreference.kt | 3 +- .../settings/preference/PreferenceCategory.kt | 3 +- .../preference/PreferenceScreenPreference.kt | 3 +- .../settings/preference/SwitchPreference.kt | 3 +- .../settings/preference/TextPreference.kt | 3 +- .../layout/buttons/navigation/Fingerprints.kt | 10 --- .../navigation/NavigationButtonsPatch.kt | 18 ---- .../misc/litho/filter/LithoFilterPatch.kt | 2 +- .../youtube/misc/settings/Fingerprints.kt | 13 ++- .../youtube/misc/settings/SettingsPatch.kt | 85 +++++++++++++++++-- .../resources/addresources/values/strings.xml | 6 +- .../drawable/revanced_settings_icon_bold.xml | 20 +++++ .../revanced_settings_icon_dynamic.xml | 11 +++ ...revanced_settings_screen_00_about_bold.xml | 25 ++++++ .../revanced_settings_screen_01_ads_bold.xml | 26 ++++++ ...settings_screen_02_alt_thumbnails_bold.xml | 20 +++++ .../revanced_settings_screen_03_feed_bold.xml | 25 ++++++ ...vanced_settings_screen_04_general_bold.xml | 25 ++++++ ...evanced_settings_screen_05_player_bold.xml | 25 ++++++ ...evanced_settings_screen_06_shorts_bold.xml | 25 ++++++ ...vanced_settings_screen_07_seekbar_bold.xml | 25 ++++++ ...settings_screen_08_swipe_controls_bold.xml | 25 ++++++ ..._screen_09_return_youtube_dislike_bold.xml | 25 ++++++ ...d_settings_screen_10_sponsorblock_bold.xml | 20 +++++ .../revanced_settings_screen_11_misc_bold.xml | 25 ++++++ ...revanced_settings_screen_12_video_bold.xml | 25 ++++++ .../revanced_settings_search_icon_bold.xml | 25 ++++++ .../revanced_settings_search_remove_bold.xml | 25 ++++++ ...anced_settings_toolbar_arrow_left_bold.xml | 25 ++++++ .../xml/revanced_prefs_icons_bold.xml | 6 ++ 47 files changed, 745 insertions(+), 108 deletions(-) create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_icon_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_search_icon_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_search_remove_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left_bold.xml create mode 100644 patches/src/main/resources/settings/xml/revanced_prefs_icons_bold.xml diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java index 3bc16e313c..d44053b5b6 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java @@ -25,6 +25,7 @@ public class BaseSettings { * Use the icons declared in the preferences created during patching. If no icons or styles are declared then this setting does nothing. */ public static final BooleanSetting SHOW_MENU_ICONS = new BooleanSetting("revanced_show_menu_icons", TRUE, true); + public static final BooleanSetting SETTINGS_DISABLE_BOLD_ICONS = new BooleanSetting("revanced_settings_disable_bold_icons", TRUE, true, parent(SHOW_MENU_ICONS)); public static final BooleanSetting SETTINGS_SEARCH_HISTORY = new BooleanSetting("revanced_settings_search_history", TRUE, true); public static final StringSetting SETTINGS_SEARCH_ENTRIES = new StringSetting("revanced_settings_search_entries", ""); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java index 67fa51fce8..d4534a8d56 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/AbstractPreferenceFragment.java @@ -104,9 +104,15 @@ public abstract class AbstractPreferenceFragment extends PreferenceFragment { * so all app specific {@link Setting} instances are loaded before this method returns. */ protected void initialize() { - String preferenceResourceName = BaseSettings.SHOW_MENU_ICONS.get() - ? "revanced_prefs_icons" - : "revanced_prefs"; + String preferenceResourceName; + if (BaseSettings.SHOW_MENU_ICONS.get()) { + preferenceResourceName = BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() + ? "revanced_prefs_icons" + : "revanced_prefs_icons_bold"; + } else { + preferenceResourceName = "revanced_prefs"; + } + final var identifier = Utils.getResourceIdentifier(ResourceType.XML, preferenceResourceName); if (identifier == 0) return; addPreferencesFromResource(identifier); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java index d9bc097ac6..9dce15322b 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/ToolbarPreferenceFragment.java @@ -21,6 +21,7 @@ import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; import app.revanced.extension.shared.settings.BaseActivityHook; +import app.revanced.extension.shared.settings.BaseSettings; @SuppressWarnings({"deprecation", "NewApi"}) public class ToolbarPreferenceFragment extends AbstractPreferenceFragment { @@ -135,8 +136,10 @@ public static void setNavigationBarColor(@Nullable Window window) { */ @SuppressLint("UseCompatLoadingForDrawables") public static Drawable getBackButtonDrawable() { - final int backButtonResource = Utils.getResourceIdentifierOrThrow( - ResourceType.DRAWABLE, "revanced_settings_toolbar_arrow_left"); + final int backButtonResource = Utils.getResourceIdentifierOrThrow(ResourceType.DRAWABLE, + BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() + ? "revanced_settings_toolbar_arrow_left" + : "revanced_settings_toolbar_arrow_left_bold"); Drawable drawable = Utils.getContext().getResources().getDrawable(backButtonResource); customizeBackButtonDrawable(drawable); return drawable; diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java index 87d35ae240..2a50282564 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchResultsAdapter.java @@ -1,7 +1,6 @@ package app.revanced.extension.shared.settings.search; import static app.revanced.extension.shared.Utils.getResourceIdentifierOrThrow; -import static app.revanced.extension.shared.settings.search.BaseSearchViewController.DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON; import android.animation.AnimatorSet; import android.animation.ArgbEvaluator; @@ -276,7 +275,7 @@ protected void bindNoResultsViewHolder(BaseSearchResultItem item, NoResultsViewH holder.titleView.setText(item.highlightedTitle); holder.summaryView.setText(item.highlightedSummary); holder.summaryView.setVisibility(TextUtils.isEmpty(item.highlightedSummary) ? View.GONE : View.VISIBLE); - holder.iconView.setImageResource(DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON); + holder.iconView.setImageResource(BaseSearchViewController.getSearchIcon()); } /** diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java index ad0a21b442..36a39b22c6 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java @@ -79,11 +79,22 @@ public abstract class BaseSearchViewController { ResourceType.ID, "action_search"); protected static final int ID_REVANCED_SETTINGS_FRAGMENTS = getResourceIdentifierOrThrow( ResourceType.ID, "revanced_settings_fragments"); - public static final int DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON = getResourceIdentifierOrThrow( + private static final int DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON = getResourceIdentifierOrThrow( ResourceType.DRAWABLE, "revanced_settings_search_icon"); + private static final int DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON_BOLD = getResourceIdentifierOrThrow( + ResourceType.DRAWABLE, "revanced_settings_search_icon_bold"); protected static final int MENU_REVANCED_SEARCH_MENU = getResourceIdentifierOrThrow( ResourceType.MENU, "revanced_search_menu"); + /** + * @return The search icon, either bold or not bold, depending on the ReVanced UI setting. + */ + public static int getSearchIcon() { + return BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() + ? DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON + : DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON_BOLD; + } + /** * Constructs a new BaseSearchViewController instance. * @@ -529,7 +540,7 @@ protected void filterAndShowResults(String query) { noResultsPreference.setTitle(str("revanced_settings_search_no_results_title", query)); noResultsPreference.setSummary(str("revanced_settings_search_no_results_summary")); noResultsPreference.setSelectable(false); - noResultsPreference.setIcon(DRAWABLE_REVANCED_SETTINGS_SEARCH_ICON); + noResultsPreference.setIcon(getSearchIcon()); filteredSearchItems.add(new BaseSearchResultItem.PreferenceSearchItem(noResultsPreference, "", Collections.emptyList())); } diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java index 8dd3185c4a..815ac40d98 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java @@ -25,6 +25,7 @@ import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.ResourceType; +import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.settings.preference.BulletPointPreference; import app.revanced.extension.shared.ui.CustomDialog; @@ -57,6 +58,10 @@ public class SearchHistoryManager { ResourceType.LAYOUT, "revanced_preference_search_history_item"); private static final int ID_SEARCH_HISTORY_LIST = getResourceIdentifierOrThrow( ResourceType.ID, "search_history_list"); + private static final int ID_SEARCH_REMOVE_ICON = getResourceIdentifierOrThrow( + ResourceType.DRAWABLE, "revanced_settings_search_remove"); + private static final int ID_SEARCH_REMOVE_ICON_BOLD = getResourceIdentifierOrThrow( + ResourceType.DRAWABLE, "revanced_settings_search_remove_bold"); private final Deque searchHistory; private final Activity activity; @@ -324,14 +329,20 @@ public void notifyDataSetChanged() { View view = inflater.inflate(LAYOUT_REVANCED_PREFERENCE_SEARCH_HISTORY_ITEM, container, false); TextView historyText = view.findViewById(ID_HISTORY_TEXT); - ImageView deleteIcon = view.findViewById(ID_DELETE_ICON); - historyText.setText(query); // Set click listener for main item (select query). view.setOnClickListener(v -> onSelectHistoryItemListener.onSelectHistoryItem(query)); // Set click listener for delete icon. + ImageView deleteIcon = view.findViewById(ID_DELETE_ICON); + + deleteIcon.setImageResource( + BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() + ? ID_SEARCH_REMOVE_ICON + : ID_SEARCH_REMOVE_ICON_BOLD + ); + deleteIcon.setOnClickListener(v -> createAndShowDialog( query, str("revanced_settings_search_remove_message"), diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java index eed16380d5..76a3156596 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/NavigationButtonsPatch.java @@ -38,9 +38,6 @@ public final class NavigationButtonsPatch { private static final boolean DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK = Settings.DISABLE_TRANSLUCENT_NAVIGATION_BAR_DARK.get(); - private static final boolean NAVIGATION_BAR_DISABLE_BOLD_ICONS - = Settings.NAVIGATION_BAR_DISABLE_BOLD_ICONS.get(); - /** * Injection point. */ @@ -71,13 +68,6 @@ public static boolean useAnimatedNavigationButtons(boolean original) { return Settings.NAVIGATION_BAR_ANIMATIONS.get(); } - /** - * Injection point. - */ - public static boolean useBoldIcons(boolean original) { - return !NAVIGATION_BAR_DISABLE_BOLD_ICONS; - } - /** * Injection point. */ diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java new file mode 100644 index 0000000000..722c3dc242 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/theme/ReVancedSettingsIconDynamicDrawable.java @@ -0,0 +1,85 @@ +package app.revanced.extension.youtube.patches.theme; + +import android.graphics.Canvas; +import android.graphics.ColorFilter; +import android.graphics.Rect; +import android.graphics.drawable.Drawable; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import app.revanced.extension.shared.ResourceType; +import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.settings.BaseSettings; + +/** + * Dynamic drawable that is either the regular or bolded ReVanced preference icon. + * + * This is needed because the YouTube ReVanced preference intent is an AndroidX preference, + * and AndroidX classes are not built into Android which makes programmatically changing + * the preference thru patching overly complex. This solves the problem by using a drawable + * wrapper to dynamically pick which icon drawable to use at runtime. + */ +@SuppressWarnings("unused") +public class ReVancedSettingsIconDynamicDrawable extends Drawable { + + private final Drawable icon; + + public ReVancedSettingsIconDynamicDrawable() { + final int resId = Utils.getResourceIdentifier(ResourceType.DRAWABLE, + BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() + ? "revanced_settings_icon" + : "revanced_settings_icon_bold" + ); + + icon = Utils.getContext().getDrawable(resId); + } + + @Override + public void draw(@NonNull Canvas canvas) { + icon.draw(canvas); + } + + @Override + public void setAlpha(int alpha) { + icon.setAlpha(alpha); + } + + @Override + public void setColorFilter(@Nullable ColorFilter colorFilter) { + icon.setColorFilter(colorFilter); + } + + @Override + public int getOpacity() { + return icon.getOpacity(); + } + + @Override + public int getIntrinsicWidth() { + return icon.getIntrinsicWidth(); + } + + @Override + public int getIntrinsicHeight() { + return icon.getIntrinsicHeight(); + } + + @Override + public void setBounds(int left, int top, int right, int bottom) { + super.setBounds(left, top, right, bottom); + icon.setBounds(left, top, right, bottom); + } + + @Override + public void setBounds(@NonNull Rect bounds) { + super.setBounds(bounds); + icon.setBounds(bounds); + } + + @Override + public void onBoundsChange(@NonNull Rect bounds) { + super.onBoundsChange(bounds); + icon.setBounds(bounds); + } +} \ No newline at end of file diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index 997b32bf70..c821dd45db 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -285,7 +285,6 @@ public class Settings extends BaseSettings { public static final BooleanSetting SWITCH_CREATE_WITH_NOTIFICATIONS_BUTTON = new BooleanSetting("revanced_switch_create_with_notifications_button", TRUE, true, "revanced_switch_create_with_notifications_button_user_dialog_message"); public static final BooleanSetting NAVIGATION_BAR_ANIMATIONS = new BooleanSetting("revanced_navigation_bar_animations", FALSE); - public static final BooleanSetting NAVIGATION_BAR_DISABLE_BOLD_ICONS = new BooleanSetting("revanced_navigation_bar_disable_bold_icons", TRUE, true); public static final BooleanSetting DISABLE_TRANSLUCENT_STATUS_BAR = new BooleanSetting("revanced_disable_translucent_status_bar", FALSE, true, "revanced_disable_translucent_status_bar_user_dialog_message"); public static final BooleanSetting DISABLE_TRANSLUCENT_NAVIGATION_BAR_LIGHT = new BooleanSetting("revanced_disable_translucent_navigation_bar_light", FALSE, true); diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java index b6ce40dda3..fee16f4315 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/YouTubeActivityHook.java @@ -21,6 +21,9 @@ @SuppressWarnings("deprecation") public class YouTubeActivityHook extends BaseActivityHook { + private static final boolean SETTINGS_DISABLE_BOLD_ICONS + = Settings.SETTINGS_DISABLE_BOLD_ICONS.get(); + private static int currentThemeValueOrdinal = -1; // Must initially be a non-valid enum ordinal value. /** @@ -148,4 +151,12 @@ public static void updateLightDarkModeStatus(Enum value) { public static boolean handleBackPress() { return YouTubeSearchViewController.handleFinish(searchViewController); } + + /** + * Injection point. + */ + @SuppressWarnings("unused") + public static boolean useBoldIcons(boolean original) { + return !SETTINGS_DISABLE_BOLD_ICONS; + } } diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java index b53a061222..19add5c489 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java @@ -284,7 +284,7 @@ private static void navigationTabCreatedCallback(NavigationButton button, View t private static final int fillBellCairoBlack = Utils.getResourceIdentifier(ResourceType.DRAWABLE, // The bold cairo notification filled icon is present, // but YT still has not fixed the icon not associated to the enum. - VersionCheckPatch.IS_20_31_OR_GREATER && !Settings.NAVIGATION_BAR_DISABLE_BOLD_ICONS.get() + VersionCheckPatch.IS_20_31_OR_GREATER && !Settings.SETTINGS_DISABLE_BOLD_ICONS.get() ? "yt_fill_experimental_bell_vd_theme_24" : "revanced_fill_bell_cairo_black_24"); diff --git a/patches/api/patches.api b/patches/api/patches.api index c000e5ba6a..919a9d487d 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -860,9 +860,10 @@ public final class app/revanced/patches/shared/misc/settings/SettingsPatchKt { public abstract class app/revanced/patches/shared/misc/settings/preference/BasePreference { public static final field Companion Lapp/revanced/patches/shared/misc/settings/preference/BasePreference$Companion; - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getIcon ()Ljava/lang/String; + public final fun getIconBold ()Ljava/lang/String; public final fun getKey ()Ljava/lang/String; public final fun getLayout ()Ljava/lang/String; public final fun getSummaryKey ()Ljava/lang/String; @@ -886,9 +887,10 @@ public abstract class app/revanced/patches/shared/misc/settings/preference/BaseP public abstract class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection { public fun ()V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getIcon ()Ljava/lang/String; + public final fun getIconBold ()Ljava/lang/String; public final fun getKey ()Ljava/lang/String; public final fun getLayout ()Ljava/lang/String; public final fun getPreferences ()Ljava/util/Set; @@ -897,8 +899,8 @@ public abstract class app/revanced/patches/shared/misc/settings/preference/BaseP } public class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection { - public fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;)V - public synthetic fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;)V + public synthetic fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun addPreferences ([Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)V public final fun getCategories ()Ljava/util/Set; public synthetic fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference; @@ -906,8 +908,8 @@ public class app/revanced/patches/shared/misc/settings/preference/BasePreference } public class app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen$Category : app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$BasePreferenceCollection { - public fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V - public synthetic fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Lapp/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen$Screen;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun addPreferences ([Lapp/revanced/patches/shared/misc/settings/preference/BasePreference;)V public synthetic fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/BasePreference; public fun transform ()Lapp/revanced/patches/shared/misc/settings/preference/PreferenceCategory; @@ -926,8 +928,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/InputTyp } public final class app/revanced/patches/shared/misc/settings/preference/IntentPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun equals (Ljava/lang/Object;)Z public final fun getIntent ()Lapp/revanced/patches/shared/misc/settings/preference/IntentPreference$Intent; public fun hashCode ()I @@ -947,8 +949,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/ListPref public fun ()V public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;)V public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/util/resource/ArrayResource;Lapp/revanced/util/resource/ArrayResource;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getEntries ()Lapp/revanced/util/resource/ArrayResource; public final fun getEntriesKey ()Ljava/lang/String; public final fun getEntryValues ()Lapp/revanced/util/resource/ArrayResource; @@ -957,22 +959,22 @@ public final class app/revanced/patches/shared/misc/settings/preference/ListPref } public final class app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getSelectable ()Z public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } public class app/revanced/patches/shared/misc/settings/preference/PreferenceCategory : app/revanced/patches/shared/misc/settings/preference/BasePreference { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getPreferences ()Ljava/util/Set; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } public class app/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference$Sorting;Ljava/lang/String;Ljava/util/Set;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getPreferences ()Ljava/util/Set; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } @@ -1000,8 +1002,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/SummaryT public final class app/revanced/patches/shared/misc/settings/preference/SwitchPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { public fun ()V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getSummaryOffKey ()Ljava/lang/String; public final fun getSummaryOnKey ()Ljava/lang/String; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; @@ -1009,8 +1011,8 @@ public final class app/revanced/patches/shared/misc/settings/preference/SwitchPr public final class app/revanced/patches/shared/misc/settings/preference/TextPreference : app/revanced/patches/shared/misc/settings/preference/BasePreference { public fun ()V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lapp/revanced/patches/shared/misc/settings/preference/InputType;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getInputType ()Lapp/revanced/patches/shared/misc/settings/preference/InputType; public fun serialize (Lorg/w3c/dom/Document;Lkotlin/jvm/functions/Function1;)Lorg/w3c/dom/Element; } 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 dffff697a8..e66fb73dce 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 @@ -56,8 +56,14 @@ fun settingsPatch ( execute { copyResources( "settings", - ResourceGroup("xml", "revanced_prefs.xml", "revanced_prefs_icons.xml"), - ResourceGroup("menu", "revanced_search_menu.xml"), + ResourceGroup("xml", + "revanced_prefs.xml", + "revanced_prefs_icons.xml", + "revanced_prefs_icons_bold.xml" + ), + ResourceGroup("menu", + "revanced_search_menu.xml" + ), ResourceGroup("drawable", // CustomListPreference resources. "revanced_ic_dialog_alert.xml", @@ -65,8 +71,11 @@ fun settingsPatch ( "revanced_settings_arrow_time.xml", "revanced_settings_custom_checkmark.xml", "revanced_settings_search_icon.xml", + "revanced_settings_search_icon_bold.xml", "revanced_settings_search_remove.xml", + "revanced_settings_search_remove_bold.xml", "revanced_settings_toolbar_arrow_left.xml", + "revanced_settings_toolbar_arrow_left_bold.xml", ), ResourceGroup("layout", "revanced_custom_list_item_checked.xml", @@ -127,19 +136,30 @@ fun settingsPatch ( // there is no easy way to change to the Android default preference layout // after the preference is inflated. // Using two different preference files is the simplest and most robust solution. - fun removeIconsAndLayout(preferences: Collection) { + fun removeIconsAndLayout(preferences: Collection, removeAllIconsAndLayout: Boolean) { preferences.forEach { preference -> preference.icon = null - preference.layout = null + if (removeAllIconsAndLayout) { + preference.iconBold = null + preference.layout = null + } if (preference is PreferenceCategory) { - removeIconsAndLayout(preference.preferences) + removeIconsAndLayout(preference.preferences, removeAllIconsAndLayout) } else if (preference is PreferenceScreenPreference) { - removeIconsAndLayout(preference.preferences) + removeIconsAndLayout(preference.preferences, removeAllIconsAndLayout) } } } - removeIconsAndLayout(preferences) + + // Bold icons. + removeIconsAndLayout(preferences, false) + document("res/xml/revanced_prefs_icons_bold.xml").use { document -> + val revancedPreferenceScreenNode = document.getNode("PreferenceScreen") + preferences.forEach { revancedPreferenceScreenNode.addPreference(it) } + } + + removeIconsAndLayout(preferences, true) document("res/xml/revanced_prefs.xml").use { document -> val revancedPreferenceScreenNode = document.getNode("PreferenceScreen") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreference.kt index 70542b9b9f..b133d962ef 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreference.kt @@ -20,6 +20,7 @@ abstract class BasePreference( val titleKey: String? = "${key}_title", val summaryKey: String? = "${key}_summary", icon: String? = null, + iconBold: String? = null, layout: String? = null, val tag: String ) { @@ -27,6 +28,9 @@ abstract class BasePreference( var icon: String? = icon internal set + var iconBold: String? = iconBold + internal set + var layout: String? = layout internal set @@ -44,8 +48,9 @@ abstract class BasePreference( key?.let { setAttribute("android:key", it) } titleKey?.let { setAttribute("android:title", "@string/${titleKey}") } summaryKey?.let { addSummary(it) } - icon?.let { - setAttribute("android:icon", it) + + if (icon != null || iconBold != null) { + setAttribute("android:icon", icon ?: iconBold) setAttribute("app:iconSpaceReserved", "true") } layout?.let { setAttribute("android:layout", layout) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen.kt index 8590e99658..24cfac2300 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/BasePreferenceScreen.kt @@ -25,11 +25,12 @@ abstract class BasePreferenceScreen( titleKey: String = "${key}_title", private val summaryKey: String? = "${key}_summary", icon: String? = null, + iconBold: String? = null, layout: String? = null, preferences: MutableSet = mutableSetOf(), val categories: MutableSet = mutableSetOf(), private val sorting: Sorting = Sorting.BY_TITLE, - ) : BasePreferenceCollection(key, titleKey, icon, layout, preferences) { + ) : BasePreferenceCollection(key, titleKey, icon, iconBold, layout, preferences) { override fun transform(): PreferenceScreenPreference { return PreferenceScreenPreference( @@ -37,6 +38,7 @@ abstract class BasePreferenceScreen( titleKey, summaryKey, icon, + iconBold, layout, sorting, // Screens and preferences are sorted at runtime by extension code, @@ -61,16 +63,18 @@ abstract class BasePreferenceScreen( key: String? = null, titleKey: String = "${key}_title", icon: String? = null, + iconBold: String? = null, layout: String? = null, preferences: MutableSet = mutableSetOf(), - ) : BasePreferenceCollection(key, titleKey, icon, layout, preferences) { + ) : BasePreferenceCollection(key, titleKey, icon, iconBold, layout, preferences) { override fun transform(): PreferenceCategory { return PreferenceCategory( - key, - titleKey, - icon, - layout, - sorting, + key = key, + titleKey = titleKey, + icon = icon, + iconBold = iconBold, + layout = layout, + sorting = sorting, preferences = preferences, ) } @@ -92,6 +96,7 @@ abstract class BasePreferenceScreen( val key: String? = null, val titleKey: String = "${key}_title", val icon: String? = null, + val iconBold: String? = null, val layout: String? = null, val preferences: MutableSet = mutableSetOf(), ) { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/IntentPreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/IntentPreference.kt index 2aef02dc86..f0ce9e7544 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/IntentPreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/IntentPreference.kt @@ -19,10 +19,11 @@ class IntentPreference( titleKey: String = "${key}_title", summaryKey: String? = "${key}_summary", icon: String? = null, + iconBold: String? = null, layout: String? = null, tag: String = "Preference", val intent: Intent, -) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) { +) : BasePreference(key, titleKey, summaryKey, icon, iconBold, layout, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt index 43de07ec20..d1e9da1fd6 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/ListPreference.kt @@ -20,11 +20,12 @@ class ListPreference( key: String? = null, titleKey: String = "${key}_title", icon: String? = null, + iconBold: String? = null, layout: String? = null, tag: String = "app.revanced.extension.shared.settings.preference.CustomDialogListPreference", val entriesKey: String? = "${key}_entries", val entryValuesKey: String? = "${key}_entry_values" -) : BasePreference(key, titleKey, null, icon, layout, tag) { +) : BasePreference(key, titleKey, null, icon, iconBold, layout, tag) { var entries: ArrayResource? = null private set var entryValues: ArrayResource? = null diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference.kt index b5ce554891..77f1ba3e80 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/NonInteractivePreference.kt @@ -21,10 +21,11 @@ class NonInteractivePreference( titleKey: String = "${key}_title", summaryKey: String? = "${key}_summary", icon: String? = null, + iconBold: String? = null, layout: String? = null, tag: String = "Preference", val selectable: Boolean = false, -) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) { +) : BasePreference(key, titleKey, summaryKey, icon, iconBold, layout, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { setAttribute("android:selectable", selectable.toString()) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceCategory.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceCategory.kt index ef51eca8cf..a1a3724fa8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceCategory.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceCategory.kt @@ -19,11 +19,12 @@ open class PreferenceCategory( key: String? = null, titleKey: String? = "${key}_title", icon: String? = null, + iconBold: String? = null, layout: String? = null, sorting: Sorting = Sorting.BY_TITLE, tag: String = "PreferenceCategory", val preferences: Set -) : BasePreference(sorting.appendSortType(key), titleKey, null, icon, layout, tag) { +) : BasePreference(sorting.appendSortType(key), titleKey, null, icon, iconBold, layout, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference.kt index a37e92947b..6f757a1b52 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/PreferenceScreenPreference.kt @@ -22,6 +22,7 @@ open class PreferenceScreenPreference( titleKey: String = "${key}_title", summaryKey: String? = "${key}_summary", icon: String? = null, + iconBold: String? = null, layout: String? = null, sorting: Sorting = Sorting.BY_TITLE, tag: String = "PreferenceScreen", @@ -32,7 +33,7 @@ open class PreferenceScreenPreference( // or adding new attributes to the attrs.xml file. // Since the key value is not currently used by the extensions, // for now it's much simpler to modify the key to include the sort parameter. -) : BasePreference(sorting.appendSortType(key), titleKey, summaryKey, icon, layout, tag) { +) : BasePreference(sorting.appendSortType(key), titleKey, summaryKey, icon, iconBold, layout, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { preferences.forEach { diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SwitchPreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SwitchPreference.kt index df9accd4ba..429eac6839 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SwitchPreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SwitchPreference.kt @@ -20,10 +20,11 @@ class SwitchPreference( titleKey: String = "${key}_title", tag: String = "SwitchPreference", icon: String? = null, + iconBold: String? = null, layout: String? = null, val summaryOnKey: String = "${key}_summary_on", val summaryOffKey: String = "${key}_summary_off" -) : BasePreference(key, titleKey, null, icon, layout, tag) { +) : BasePreference(key, titleKey, null, icon, iconBold, layout, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { addSummary(summaryOnKey, SummaryType.ON) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/TextPreference.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/TextPreference.kt index 397d4bd437..8c74edaa70 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/TextPreference.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/TextPreference.kt @@ -20,10 +20,11 @@ class TextPreference( titleKey: String = "${key}_title", summaryKey: String? = "${key}_summary", icon: String? = null, + iconBold: String? = null, layout: String? = null, tag: String = "app.revanced.extension.shared.settings.preference.ResettableEditTextPreference", val inputType: InputType = InputType.TEXT -) : BasePreference(key, titleKey, summaryKey, icon, layout, tag) { +) : BasePreference(key, titleKey, summaryKey, icon, iconBold, layout, tag) { override fun serialize(ownerDocument: Document, resourceCallback: (BaseResource) -> Unit) = super.serialize(ownerDocument, resourceCallback).apply { 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 61495eced1..4fdae0652d 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 @@ -66,13 +66,3 @@ internal val translucentNavigationButtonsSystemFeatureFlagFingerprint by fingerp literal(45632194L) // Translucent system buttons feature flag. ) } - -// Flag is present in 20.23, but icons are missing and forcing bold icons crashes the app. -internal val boldIconsFeatureFlagFingerprint by fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Z") - parameters() - instructions( - literal(45685201L) - ) -} 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 72932e8c0e..7cc05190c2 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 @@ -14,7 +14,6 @@ import app.revanced.patches.youtube.misc.navigation.hookNavigationButtonCreated import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_25_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_15_or_greater -import app.revanced.patches.youtube.misc.playservice.is_20_31_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 @@ -73,12 +72,6 @@ val navigationButtonsPatch = bytecodePatch( ) } - if (is_20_31_or_greater) { - PreferenceScreen.GENERAL_LAYOUT.addPreferences( - SwitchPreference("revanced_navigation_bar_disable_bold_icons") - ) - } - PreferenceScreen.GENERAL_LAYOUT.addPreferences( PreferenceScreenPreference( key = "revanced_navigation_buttons_screen", @@ -153,16 +146,5 @@ val navigationButtonsPatch = bytecodePatch( ) } } - - // 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 { - it.method.insertLiteralOverride( - it.instructionMatches.first().index, - "$EXTENSION_CLASS_DESCRIPTOR->useBoldIcons(Z)Z" - ) - } - } } } 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 d161a2c480..0375f413c6 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 @@ -212,7 +212,7 @@ val lithoFilterPatch = bytecodePatch( lithoConverterBufferUpbFeatureFlagFingerprint.let { // Procool buffer has changed in 20.22, and UPB native code is now always enabled. if (is_20_22_or_greater) { - Logger.getLogger(this::class.java.name).severe( + Logger.getLogger(this::class.java.name).warning( "\n!!!" + "\n!!! Litho filtering is not yet fully supported when patching 20.22+" + "\n!!! Action buttons, Shorts shelves, and possibly other components cannot be set hidden." + 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 4c05549604..1e08b69e6e 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 @@ -33,4 +33,15 @@ internal val cairoFragmentConfigFingerprint by fingerprint { literal(45532100L), opcode(Opcode.MOVE_RESULT, 10) ) -} \ No newline at end of file +} + +// 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 by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + parameters() + instructions( + literal(45685201L) + ) +} 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 8ef5443e0a..7f109d54b8 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 @@ -12,15 +12,30 @@ 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.overrideThemeColors -import app.revanced.patches.shared.misc.settings.preference.* +import app.revanced.patches.shared.misc.settings.preference.BasePreference +import app.revanced.patches.shared.misc.settings.preference.BasePreferenceScreen +import app.revanced.patches.shared.misc.settings.preference.InputType +import app.revanced.patches.shared.misc.settings.preference.IntentPreference +import app.revanced.patches.shared.misc.settings.preference.ListPreference +import app.revanced.patches.shared.misc.settings.preference.NonInteractivePreference +import app.revanced.patches.shared.misc.settings.preference.PreferenceCategory +import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference import app.revanced.patches.shared.misc.settings.preference.PreferenceScreenPreference.Sorting +import app.revanced.patches.shared.misc.settings.preference.SwitchPreference +import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.shared.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.check.checkEnvironmentPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.fix.playbackspeed.fixPlaybackSpeedWhilePlayingPatch import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_31_or_greater import app.revanced.patches.youtube.misc.playservice.versionCheckPatch -import app.revanced.util.* +import app.revanced.util.ResourceGroup +import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.copyResources +import app.revanced.util.findElementByAttributeValueOrThrow +import app.revanced.util.findInstructionIndicesReversedOrThrow +import app.revanced.util.insertLiteralOverride import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation @@ -44,8 +59,9 @@ 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( titleKey = "revanced_settings_title", layout = "@layout/preference_group_title", @@ -53,12 +69,12 @@ private val settingsResourcePatch = resourcePatch { IntentPreference( titleKey = "revanced_settings_submenu_title", summaryKey = null, - icon = "@drawable/revanced_settings_icon", + icon = "@drawable/revanced_settings_icon_dynamic", layout = "@layout/preference_with_icon", - intent = newIntent("revanced_settings_intent"), + intent = newIntent("revanced_settings_intent") ) ) - ) to "settings_fragment_cairo", + ) to "settings_fragment_cairo" ), preferences = preferences ) @@ -71,20 +87,35 @@ private val settingsResourcePatch = resourcePatch { copyResources( "settings", ResourceGroup("drawable", + "revanced_settings_icon_dynamic.xml", "revanced_settings_icon.xml", + "revanced_settings_icon_bold.xml", "revanced_settings_screen_00_about.xml", + "revanced_settings_screen_00_about_bold.xml", "revanced_settings_screen_01_ads.xml", + "revanced_settings_screen_01_ads_bold.xml", "revanced_settings_screen_02_alt_thumbnails.xml", + "revanced_settings_screen_02_alt_thumbnails_bold.xml", "revanced_settings_screen_03_feed.xml", + "revanced_settings_screen_03_feed_bold.xml", "revanced_settings_screen_04_general.xml", + "revanced_settings_screen_04_general_bold.xml", "revanced_settings_screen_05_player.xml", + "revanced_settings_screen_05_player_bold.xml", "revanced_settings_screen_06_shorts.xml", + "revanced_settings_screen_06_shorts_bold.xml", "revanced_settings_screen_07_seekbar.xml", + "revanced_settings_screen_07_seekbar_bold.xml", "revanced_settings_screen_08_swipe_controls.xml", + "revanced_settings_screen_08_swipe_controls_bold.xml", "revanced_settings_screen_09_return_youtube_dislike.xml", + "revanced_settings_screen_09_return_youtube_dislike_bold.xml", "revanced_settings_screen_10_sponsorblock.xml", + "revanced_settings_screen_10_sponsorblock_bold.xml", "revanced_settings_screen_11_misc.xml", + "revanced_settings_screen_11_misc_bold.xml", "revanced_settings_screen_12_video.xml", + "revanced_settings_screen_12_video_bold.xml", ) ) @@ -158,6 +189,7 @@ val settingsPatch = bytecodePatch( preferences += NonInteractivePreference( key = "revanced_settings_screen_00_about", icon = "@drawable/revanced_settings_screen_00_about", + iconBold = "@drawable/revanced_settings_screen_00_about_bold", layout = "@layout/preference_with_icon", summaryKey = null, tag = "app.revanced.extension.shared.settings.preference.ReVancedAboutPreference", @@ -172,7 +204,23 @@ val settingsPatch = bytecodePatch( PreferenceScreen.GENERAL_LAYOUT.addPreferences( SwitchPreference("revanced_settings_search_history"), - SwitchPreference("revanced_show_menu_icons") + ) + + + PreferenceScreen.GENERAL_LAYOUT.addPreferences( + if (is_20_31_or_greater) { + PreferenceCategory( + titleKey = null, + sorting = Sorting.UNSORTED, + tag = "app.revanced.extension.shared.settings.preference.NoTitlePreferenceCategory", + preferences = setOf( + SwitchPreference("revanced_show_menu_icons"), + SwitchPreference("revanced_settings_disable_bold_icons") + ) + ) + } else { + SwitchPreference("revanced_show_menu_icons") + } ) PreferenceScreen.MISC.addPreferences( @@ -208,6 +256,17 @@ val settingsPatch = bytecodePatch( "$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 { + it.method.insertLiteralOverride( + it.instructionMatches.first().index, + "$YOUTUBE_ACTIVITY_HOOK_CLASS_DESCRIPTOR->useBoldIcons(Z)Z" + ) + } + } + modifyActivityForSettingsInjection( licenseActivityOnCreateFingerprint.classDef, licenseActivityOnCreateFingerprint.method, @@ -315,12 +374,14 @@ object PreferenceScreen : BasePreferenceScreen() { key = "revanced_settings_screen_01_ads", summaryKey = null, icon = "@drawable/revanced_settings_screen_01_ads", + iconBold = "@drawable/revanced_settings_screen_01_ads_bold", layout = "@layout/preference_with_icon", ) val ALTERNATIVE_THUMBNAILS = Screen( key = "revanced_settings_screen_02_alt_thumbnails", summaryKey = null, icon = "@drawable/revanced_settings_screen_02_alt_thumbnails", + iconBold = "@drawable/revanced_settings_screen_02_alt_thumbnails_bold", layout = "@layout/preference_with_icon", sorting = Sorting.UNSORTED, ) @@ -328,36 +389,42 @@ object PreferenceScreen : BasePreferenceScreen() { key = "revanced_settings_screen_03_feed", summaryKey = null, icon = "@drawable/revanced_settings_screen_03_feed", + iconBold = "@drawable/revanced_settings_screen_03_feed_bold", layout = "@layout/preference_with_icon", ) val GENERAL_LAYOUT = Screen( key = "revanced_settings_screen_04_general", summaryKey = null, icon = "@drawable/revanced_settings_screen_04_general", + iconBold = "@drawable/revanced_settings_screen_04_general_bold", layout = "@layout/preference_with_icon", ) val PLAYER = Screen( key = "revanced_settings_screen_05_player", summaryKey = null, icon = "@drawable/revanced_settings_screen_05_player", + iconBold = "@drawable/revanced_settings_screen_05_player_bold", layout = "@layout/preference_with_icon", ) val SHORTS = Screen( key = "revanced_settings_screen_06_shorts", summaryKey = null, icon = "@drawable/revanced_settings_screen_06_shorts", + iconBold = "@drawable/revanced_settings_screen_06_shorts_bold", layout = "@layout/preference_with_icon", ) val SEEKBAR = Screen( key = "revanced_settings_screen_07_seekbar", summaryKey = null, icon = "@drawable/revanced_settings_screen_07_seekbar", + iconBold = "@drawable/revanced_settings_screen_07_seekbar_bold", layout = "@layout/preference_with_icon", ) val SWIPE_CONTROLS = Screen( key = "revanced_settings_screen_08_swipe_controls", summaryKey = null, icon = "@drawable/revanced_settings_screen_08_swipe_controls", + iconBold = "@drawable/revanced_settings_screen_08_swipe_controls_bold", layout = "@layout/preference_with_icon", sorting = Sorting.UNSORTED, ) @@ -365,6 +432,7 @@ object PreferenceScreen : BasePreferenceScreen() { key = "revanced_settings_screen_09_return_youtube_dislike", summaryKey = null, icon = "@drawable/revanced_settings_screen_09_return_youtube_dislike", + iconBold = "@drawable/revanced_settings_screen_09_return_youtube_dislike_bold", layout = "@layout/preference_with_icon", sorting = Sorting.UNSORTED, ) @@ -372,6 +440,7 @@ object PreferenceScreen : BasePreferenceScreen() { key = "revanced_settings_screen_10_sponsorblock", summaryKey = null, icon = "@drawable/revanced_settings_screen_10_sponsorblock", + iconBold = "@drawable/revanced_settings_screen_10_sponsorblock_bold", layout = "@layout/preference_with_icon", sorting = Sorting.UNSORTED, ) @@ -379,12 +448,14 @@ object PreferenceScreen : BasePreferenceScreen() { key = "revanced_settings_screen_11_misc", summaryKey = null, icon = "@drawable/revanced_settings_screen_11_misc", + iconBold = "@drawable/revanced_settings_screen_11_misc_bold", layout = "@layout/preference_with_icon", ) val VIDEO = Screen( key = "revanced_settings_screen_12_video", summaryKey = null, icon = "@drawable/revanced_settings_screen_12_video", + iconBold = "@drawable/revanced_settings_screen_12_video_bold", layout = "@layout/preference_with_icon", sorting = Sorting.BY_KEY, ) diff --git a/patches/src/main/resources/addresources/values/strings.xml b/patches/src/main/resources/addresources/values/strings.xml index a891e976bd..143f4be6c7 100644 --- a/patches/src/main/resources/addresources/values/strings.xml +++ b/patches/src/main/resources/addresources/values/strings.xml @@ -82,6 +82,9 @@ Second \"item\" text" Show settings search history Settings search history is shown Settings search history is not shown + Disable bold icons + Icons are not bold + Icons are bold Show ReVanced setting icons Setting icons are shown Setting icons are not shown @@ -792,9 +795,6 @@ If changing this setting does not take effect, try switching to Incognito mode." Enable navigation bar animations Navigation transitions are animated Navigation transitions are not animated - Disable bold icons - Icons are not bold - Icons are bold Disable translucent status bar Status bar is opaque Status bar is opaque or translucent diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_icon_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_icon_bold.xml new file mode 100644 index 0000000000..c929e507de --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_icon_bold.xml @@ -0,0 +1,20 @@ + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml b/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml new file mode 100644 index 0000000000..69b5f99c8d --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about_bold.xml new file mode 100644 index 0000000000..b931198cf6 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads_bold.xml new file mode 100644 index 0000000000..f341714f33 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads_bold.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails_bold.xml new file mode 100644 index 0000000000..9854f09fc0 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails_bold.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed_bold.xml new file mode 100644 index 0000000000..edce57018e --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general_bold.xml new file mode 100644 index 0000000000..5a14a69b52 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player_bold.xml new file mode 100644 index 0000000000..fde9e7cea6 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts_bold.xml new file mode 100644 index 0000000000..2b616d939b --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar_bold.xml new file mode 100644 index 0000000000..12fe4e8b79 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls_bold.xml new file mode 100644 index 0000000000..12fe4e8b79 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike_bold.xml new file mode 100644 index 0000000000..d35c3fb7b8 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock_bold.xml new file mode 100644 index 0000000000..08e788ef55 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock_bold.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc_bold.xml new file mode 100644 index 0000000000..ac63c495f8 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video_bold.xml new file mode 100644 index 0000000000..22a7d6febe --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_search_icon_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_search_icon_bold.xml new file mode 100644 index 0000000000..22fcf34b9e --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_search_icon_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_search_remove_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_search_remove_bold.xml new file mode 100644 index 0000000000..3cb5d7d788 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_search_remove_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left_bold.xml new file mode 100644 index 0000000000..f93ab850c0 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/xml/revanced_prefs_icons_bold.xml b/patches/src/main/resources/settings/xml/revanced_prefs_icons_bold.xml new file mode 100644 index 0000000000..66304a5c07 --- /dev/null +++ b/patches/src/main/resources/settings/xml/revanced_prefs_icons_bold.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file From fc988fa07823491ca952e7b90846426534a5647b Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 20 Oct 2025 21:57:08 +0400 Subject: [PATCH 36/59] fix setting availability --- .../app/revanced/extension/shared/settings/BaseSettings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java index d44053b5b6..a646a8bd96 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/BaseSettings.java @@ -25,7 +25,7 @@ public class BaseSettings { * Use the icons declared in the preferences created during patching. If no icons or styles are declared then this setting does nothing. */ public static final BooleanSetting SHOW_MENU_ICONS = new BooleanSetting("revanced_show_menu_icons", TRUE, true); - public static final BooleanSetting SETTINGS_DISABLE_BOLD_ICONS = new BooleanSetting("revanced_settings_disable_bold_icons", TRUE, true, parent(SHOW_MENU_ICONS)); + public static final BooleanSetting SETTINGS_DISABLE_BOLD_ICONS = new BooleanSetting("revanced_settings_disable_bold_icons", TRUE, true); public static final BooleanSetting SETTINGS_SEARCH_HISTORY = new BooleanSetting("revanced_settings_search_history", TRUE, true); public static final StringSetting SETTINGS_SEARCH_ENTRIES = new StringSetting("revanced_settings_search_entries", ""); From 47f1a5f9c995ff670ea6ec68f724aaae9150aafd Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 20 Oct 2025 22:18:05 +0400 Subject: [PATCH 37/59] add the last bold resources --- .../extension/shared/checks/Check.java | 6 +++-- .../CustomDialogListPreference.java | 12 ++++++++- .../settings/search/SearchHistoryManager.java | 25 +++++++++++++++---- .../shared/misc/settings/SettingsPatch.kt | 3 +++ .../revanced_ic_dialog_alert_bold.xml | 11 ++++++++ .../revanced_settings_arrow_time_bold.xml | 25 +++++++++++++++++++ ...evanced_settings_custom_checkmark_bold.xml | 25 +++++++++++++++++++ .../revanced_settings_icon_dynamic.xml | 7 ------ 8 files changed, 99 insertions(+), 15 deletions(-) create mode 100644 patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_arrow_time_bold.xml create mode 100644 patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark_bold.xml diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java index 53db12c4d7..a57e7b99e1 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java @@ -128,8 +128,10 @@ static void issueWarning(Activity activity, Collection failedChecks) { // Add icon to the dialog. ImageView iconView = new ImageView(activity); - iconView.setImageResource(Utils.getResourceIdentifierOrThrow( - ResourceType.DRAWABLE, "revanced_ic_dialog_alert")); + iconView.setImageResource(Utils.getResourceIdentifierOrThrow(ResourceType.DRAWABLE, + BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() + ? "revanced_ic_dialog_alert" + : "revanced_ic_dialog_alert_bold")); iconView.setColorFilter(Utils.getAppForegroundColor(), PorterDuff.Mode.SRC_IN); iconView.setPadding(0, 0, 0, 0); LinearLayout.LayoutParams iconParams = new LinearLayout.LayoutParams( diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java index 841a3529f2..32eccbd263 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/preference/CustomDialogListPreference.java @@ -22,6 +22,7 @@ import app.revanced.extension.shared.ResourceType; import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.shared.ui.CustomDialog; /** @@ -39,6 +40,10 @@ public class CustomDialogListPreference extends ListPreference { ResourceType.ID, "revanced_item_text"); public static final int LAYOUT_REVANCED_CUSTOM_LIST_ITEM_CHECKED = getResourceIdentifierOrThrow( ResourceType.LAYOUT, "revanced_custom_list_item_checked"); + public static final int DRAWABLE_CHECKMARK = getResourceIdentifierOrThrow( + ResourceType.DRAWABLE, "revanced_settings_custom_checkmark"); + public static final int DRAWABLE_CHECKMARK_BOLD = getResourceIdentifierOrThrow( + ResourceType.DRAWABLE, "revanced_settings_custom_checkmark_bold"); private String staticSummary = null; private CharSequence[] highlightedEntriesForDialog = null; @@ -126,9 +131,14 @@ public View getView(int position, View convertView, @NonNull ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(getContext()); view = inflater.inflate(layoutResourceId, parent, false); holder = new SubViewDataContainer(); - holder.checkIcon = view.findViewById(ID_REVANCED_CHECK_ICON); holder.placeholder = view.findViewById(ID_REVANCED_CHECK_ICON_PLACEHOLDER); holder.itemText = view.findViewById(ID_REVANCED_ITEM_TEXT); + holder.checkIcon = view.findViewById(ID_REVANCED_CHECK_ICON); + holder.checkIcon.setImageResource( + BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() + ? DRAWABLE_CHECKMARK + : DRAWABLE_CHECKMARK_BOLD + ); view.setTag(holder); } else { holder = (SubViewDataContainer) view.getTag(); diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java index 815ac40d98..c3a6705e2c 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/SearchHistoryManager.java @@ -42,6 +42,8 @@ public class SearchHistoryManager { ResourceType.ID, "clear_history_button"); private static final int ID_HISTORY_TEXT = getResourceIdentifierOrThrow( ResourceType.ID, "history_text"); + private static final int ID_HISTORY_ICON = getResourceIdentifierOrThrow( + ResourceType.ID, "history_icon"); private static final int ID_DELETE_ICON = getResourceIdentifierOrThrow( ResourceType.ID, "delete_icon"); private static final int ID_EMPTY_HISTORY_TITLE = getResourceIdentifierOrThrow( @@ -62,6 +64,10 @@ public class SearchHistoryManager { ResourceType.DRAWABLE, "revanced_settings_search_remove"); private static final int ID_SEARCH_REMOVE_ICON_BOLD = getResourceIdentifierOrThrow( ResourceType.DRAWABLE, "revanced_settings_search_remove_bold"); + private static final int ID_SEARCH_ARROW_TIME_ICON = getResourceIdentifierOrThrow( + ResourceType.DRAWABLE, "revanced_settings_arrow_time"); + private static final int ID_SEARCH_ARROW_TIME_ICON_BOLD = getResourceIdentifierOrThrow( + ResourceType.DRAWABLE, "revanced_settings_arrow_time_bold"); private final Deque searchHistory; private final Activity activity; @@ -103,7 +109,8 @@ public interface OnSelectHistoryItemListener { // Inflate search history layout. LayoutInflater inflater = LayoutInflater.from(activity); - View historyView = inflater.inflate(LAYOUT_REVANCED_PREFERENCE_SEARCH_HISTORY_SCREEN, searchHistoryContainer, false); + View historyView = inflater.inflate(LAYOUT_REVANCED_PREFERENCE_SEARCH_HISTORY_SCREEN, + searchHistoryContainer, false); searchHistoryContainer.addView(historyView, new FrameLayout.LayoutParams( FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT)); @@ -326,14 +333,22 @@ public SearchHistoryAdapter(Context context, LinearLayout container, Collection< public void notifyDataSetChanged() { container.removeAllViews(); for (String query : history) { - View view = inflater.inflate(LAYOUT_REVANCED_PREFERENCE_SEARCH_HISTORY_ITEM, container, false); + View view = inflater.inflate(LAYOUT_REVANCED_PREFERENCE_SEARCH_HISTORY_ITEM, + container, false); + // Set click listener for main item (select query). + view.setOnClickListener(v -> onSelectHistoryItemListener.onSelectHistoryItem(query)); + + // Set history icon. + ImageView historyIcon = view.findViewById(ID_HISTORY_ICON); + historyIcon.setImageResource( + BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() + ? ID_SEARCH_ARROW_TIME_ICON + : ID_SEARCH_ARROW_TIME_ICON_BOLD + ); TextView historyText = view.findViewById(ID_HISTORY_TEXT); historyText.setText(query); - // Set click listener for main item (select query). - view.setOnClickListener(v -> onSelectHistoryItemListener.onSelectHistoryItem(query)); - // Set click listener for delete icon. ImageView deleteIcon = view.findViewById(ID_DELETE_ICON); 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 e66fb73dce..a022eb48b9 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 @@ -67,9 +67,12 @@ fun settingsPatch ( ResourceGroup("drawable", // CustomListPreference resources. "revanced_ic_dialog_alert.xml", + "revanced_ic_dialog_alert_bold.xml", // Search resources. "revanced_settings_arrow_time.xml", + "revanced_settings_arrow_time_bold.xml", "revanced_settings_custom_checkmark.xml", + "revanced_settings_custom_checkmark_bold.xml", "revanced_settings_search_icon.xml", "revanced_settings_search_icon_bold.xml", "revanced_settings_search_remove.xml", diff --git a/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert_bold.xml b/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert_bold.xml new file mode 100644 index 0000000000..a292b551ee --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert_bold.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time_bold.xml new file mode 100644 index 0000000000..1666db5b22 --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark_bold.xml new file mode 100644 index 0000000000..d12c3282ac --- /dev/null +++ b/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark_bold.xml @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml b/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml index 69b5f99c8d..849921910d 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml @@ -1,11 +1,4 @@ - - - - - - - \ No newline at end of file From f2356a8be244479464f4a5cd6862a06d087b7a18 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 20 Oct 2025 23:22:22 +0400 Subject: [PATCH 38/59] fix swipe bold icon --- .../revanced_settings_screen_08_swipe_controls_bold.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls_bold.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls_bold.xml index 12fe4e8b79..6ced78823d 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls_bold.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls_bold.xml @@ -1,4 +1,5 @@ - + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + + android:fillColor="@android:color/white" + android:pathData="M 12.000145,2.0000008 C 8.8230689,1.9990926 5.6959192,2.7864027 2.9017488,4.2906678 2.3373945,4.5948398 1.9899198,5.1860103 2.000223,5.8244635 2.0930396,12.358829 5.4926743,18.31271 11.094442,21.749998 c 0.557183,0.333336 1.253849,0.333336 1.811031,0 5.601767,-3.438045 9.001096,-9.391169 9.094295,-15.9255345 0.01052,-0.6386247 -0.337035,-1.2300179 -0.9016,-1.5341683 -2.794107,-1.5040456 -5.92111,-2.2912233 -9.098023,-2.2902944 z m 0.08082,0.8705548 c 3.003625,0.013255 5.957553,0.7636027 8.599879,2.1845129 0.277414,0.151228 0.448533,0.4421907 0.44513,0.7568723 C 21.034684,12.23921 17.58825,17.8544 12.446767,21.009378 c -0.274165,0.167124 -0.619386,0.167124 -0.893551,0 C 6.4117365,17.854399 2.9652339,12.239209 2.8739372,5.8119397 2.8705209,5.4972741 3.0416092,5.2063196 3.3189962,5.0550685 6.0095892,3.608201 9.0224769,2.8570356 12.080969,2.8705556 Z M 9.6351953,6.7701615 v 8.3406435 l 7.2606727,-4.170358 z" /> diff --git a/patches/src/main/resources/sponsorblock/drawable/revanced_sb_logo_bold.xml b/patches/src/main/resources/sponsorblock/drawable/revanced_sb_logo_bold.xml new file mode 100644 index 0000000000..058128b131 --- /dev/null +++ b/patches/src/main/resources/sponsorblock/drawable/revanced_sb_logo_bold.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file From a1fd6b13d53599660cb25cdfb76c35e17b4041c4 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 21 Oct 2025 11:03:54 +0400 Subject: [PATCH 40/59] reformat xml. no functional changes --- .../drawable/revanced_ic_dialog_alert.xml | 14 +++++++------- .../drawable/revanced_settings_arrow_time.xml | 12 ++++++------ .../revanced_settings_custom_checkmark.xml | 12 ++++++------ .../revanced_settings_icon_dynamic.xml | 3 +-- .../revanced_settings_screen_00_about.xml | 12 ++++++------ .../revanced_settings_screen_01_ads.xml | 12 ++++++------ ...anced_settings_screen_02_alt_thumbnails.xml | 18 +++++++++--------- .../revanced_settings_screen_03_feed.xml | 12 ++++++------ .../revanced_settings_screen_04_general.xml | 12 ++++++------ .../revanced_settings_screen_05_player.xml | 12 ++++++------ .../revanced_settings_screen_06_shorts.xml | 16 ++++++++-------- .../revanced_settings_screen_07_seekbar.xml | 12 ++++++------ ...anced_settings_screen_08_swipe_controls.xml | 12 ++++++------ ...ttings_screen_09_return_youtube_dislike.xml | 12 ++++++------ ...evanced_settings_screen_10_sponsorblock.xml | 12 ++++++------ .../revanced_settings_screen_11_misc.xml | 12 ++++++------ .../revanced_settings_screen_12_video.xml | 12 ++++++------ .../drawable/revanced_settings_search_icon.xml | 12 ++++++------ .../revanced_settings_search_remove.xml | 12 ++++++------ .../revanced_settings_toolbar_arrow_left.xml | 12 ++++++------ 20 files changed, 121 insertions(+), 122 deletions(-) diff --git a/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert.xml b/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert.xml index d308d6f8ca..3fd2696b3a 100644 --- a/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert.xml +++ b/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert.xml @@ -1,10 +1,10 @@ + android:width="40dp" + android:height="40dp" + android:viewportWidth="40" + android:viewportHeight="40"> + android:fillColor="#000000" + android:fillType="evenOdd" + android:pathData="M22.1641,5.24609 L36.5547,30.168 C37.5156,31.8359,36.3164,33.918,34.3906,33.918 L5.60938,33.918 C3.68359,33.918,2.48438,31.8359,3.44531,30.168 L17.8359,5.24609 C18.7969,3.58203,21.2031,3.58203,22.1641,5.24609 Z M20,25 C19.0781,25,18.332,25.7461,18.332,26.668 C18.332,27.5898,19.0781,28.332,20,28.332 C20.9219,28.332,21.668,27.5898,21.668,26.668 C21.668,25.7461,20.9219,25,20,25 Z M20,13.332 C19.1445,13.332,18.4414,13.9766,18.3438,14.8047 L18.332,15 L18.332,21.668 C18.332,22.5898,19.0781,23.332,20,23.332 C20.8555,23.332,21.5586,22.6875,21.6563,21.8633 L21.668,21.668 L21.668,15 C21.668,14.0781,20.9219,13.332,20,13.332 Z M20,13.332" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time.xml b/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time.xml index 6c43a8a43a..a0b9a55c32 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_arrow_time.xml @@ -1,9 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M14.97,16.95L10,13.87V7h2v5.76l4.03,2.49L14.97,16.95zM22,12c0,5.51 -4.49,10 -10,10S2,17.51 2,12h1c0,4.96 4.04,9 9,9s9,-4.04 9,-9s-4.04,-9 -9,-9C8.81,3 5.92,4.64 4.28,7.38C4.17,7.56 4.06,7.75 3.97,7.94C3.96,7.96 3.95,7.98 3.94,8H8v1H1.96V3h1v4.74C3,7.65 3.03,7.57 3.07,7.49C3.18,7.27 3.3,7.07 3.42,6.86C5.22,3.86 8.51,2 12,2C17.51,2 22,6.49 22,12z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark.xml b/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark.xml index 0623e325f7..b7895fdd00 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_custom_checkmark.xml @@ -1,9 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M9.29446,19 L3.4,12.708 L4.24339,11.8029 L9.29446,17.1896 L20.1565,5.6 L21,6.50026 Z M9.29446,19" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml b/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml index 849921910d..bc1f5584ec 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_icon_dynamic.xml @@ -1,4 +1,3 @@ - - + \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about.xml index ddc7120197..eb0e23c75c 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_00_about.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M13,17h-2v-6h2V17zM13,7h-2v2h2V7zM12,3c-4.96,0 -9,4.04 -9,9s4.04,9 9,9c4.96,0 9,-4.04 9,-9S16.96,3 12,3M12,2c5.52,0 10,4.48 10,10s-4.48,10 -10,10C6.48,22 2,17.52 2,12S6.48,2 12,2L12,2z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads.xml index 2654631d88..fb26813b95 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_01_ads.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M17.9219,12.5 L17.9219,11.5 L21.1523,11.5 L21.1523,12.5 Z M19.0078,18.9609 L16.4219,17.0234 L17.0469,16.2305 L19.6289,18.168 Z M16.9688,7.69141 L16.3477,6.89844 L18.9297,4.96094 L19.5547,5.75391 Z M5.5,17.9609 L5.5,14.1523 L4.46094,14.1523 C4.01563,14.1523,3.63281,13.9961,3.31641,13.6836 C3.00391,13.3672,2.84766,12.9844,2.84766,12.5391 L2.84766,11.4609 C2.84766,11.0156,3.00391,10.6328,3.31641,10.3164 C3.63281,10.0039,4.01563,9.84766,4.46094,9.84766 L8.19141,9.84766 L12.1523,7.5 L12.1523,16.5 L8.19141,14.1523 L6.5,14.1523 L6.5,17.9609 Z M11.1523,14.7188 L11.1523,9.28125 L8.47266,10.8477 L4.46094,10.8477 C4.30859,10.8477,4.16797,10.9102,4.03906,11.0391 C3.91016,11.168,3.84766,11.3086,3.84766,11.4609 L3.84766,12.5391 C3.84766,12.6914,3.91016,12.832,4.03906,12.9609 C4.16797,13.0898,4.30859,13.1523,4.46094,13.1523 L8.47266,13.1523 Z M13.9219,14.8867 L13.9219,9.11328 C14.2578,9.42188,14.5273,9.82813,14.7305,10.332 C14.9375,10.8398,15.0391,11.3945,15.0391,12 C15.0391,12.6055,14.9375,13.1602,14.7305,13.668 C14.5273,14.1719,14.2578,14.5781,13.9219,14.8867 Z M7.5,12 Z M7.5,12" /> \ No newline at end of file diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails.xml index 4b9486c897..7fcbe912b7 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_02_alt_thumbnails.xml @@ -6,16 +6,16 @@ Copyright 2023 Ajay Ramachandran --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:pathData="M12.0814,1.99794 C9.37251,1.99794,6.97872,3.32778,5.20335,5.14149 C3.42798,6.9552,1.99794,9.39989,1.99794,12.1677 C1.99794,14.9355,3.10403,17.7107,4.87939,19.5244 C6.65476,21.3381,9.37195,21.9549,12.0814,21.9549 C14.7908,21.9549,17.0848,20.9067,18.8601,19.093 C20.6355,17.2793,22.002,14.9355,22.002,12.1677 C22.002,9.40046,20.8525,6.83638,19.0766,5.02267 C17.3013,3.20894,14.7903,1.99794,12.0814,1.99794 Z M11.9105,5.02102 C13.838,5.02102,15.5196,6.09439,16.7829,7.35711 C18.0462,8.61984,18.8878,10.3004,18.8878,12.2279 C18.8878,14.1554,18.2513,16.0427,16.988,17.3054 C15.7247,18.5681,13.8374,18.9333,11.9105,18.9333 C9.98355,18.9333,8.36976,18.2962,7.10645,17.0335 C5.84314,15.7708,5.11222,14.1554,5.11222,12.2278 C5.11222,10.3003,5.63697,8.47868,6.8997,7.21537 C8.16239,5.95218,9.98293,5.02102,11.9105,5.02102 Z" + android:strokeWidth="1" + android:strokeColor="?android:attr/textColorPrimary" /> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M15.3108,11.899 C15.3108,13.6514,13.8411,15.1264,12.0887,15.1264 C10.3363,15.1264,8.97704,13.6515,8.97704,11.899 C8.97704,10.1466,10.3363,8.71961,12.0887,8.71961 C13.8411,8.71961,15.3108,10.1466,15.3108,11.899 Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed.xml index 2af656695a..ce88360a8e 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_03_feed.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M4.85,19.775Q4.15,19.775 3.688,19.312Q3.225,18.85 3.225,18.15V12.55H4.225V18.15Q4.225,18.375 4.425,18.575Q4.625,18.775 4.85,18.775H12.45V19.775ZM8.625,16Q7.925,16 7.463,15.537Q7,15.075 7,14.375V8.775H8V14.375Q8,14.625 8.188,14.812Q8.375,15 8.625,15H16.225V16ZM12.375,12.225Q11.7,12.225 11.238,11.762Q10.775,11.3 10.775,10.625V5.85Q10.775,5.15 11.238,4.687Q11.7,4.225 12.375,4.225H19.15Q19.85,4.225 20.312,4.687Q20.775,5.15 20.775,5.85V10.625Q20.775,11.3 20.312,11.762Q19.85,12.225 19.15,12.225ZM12.375,11.225H19.15Q19.375,11.225 19.575,11.037Q19.775,10.85 19.775,10.625V7.225H11.775V10.625Q11.775,10.85 11.963,11.037Q12.15,11.225 12.375,11.225Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general.xml index c6a2625bbe..8c6d6cd7fb 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_04_general.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M12,9.5c1.38,0 2.5,1.12 2.5,2.5s-1.12,2.5 -2.5,2.5S9.5,13.38 9.5,12S10.62,9.5 12,9.5M12,8.5c-1.93,0 -3.5,1.57 -3.5,3.5s1.57,3.5 3.5,3.5s3.5,-1.57 3.5,-3.5S13.93,8.5 12,8.5L12,8.5zM13.22,3l0.55,2.2l0.13,0.51l0.5,0.18c0.61,0.23 1.19,0.56 1.72,0.98l0.4,0.32l0.5,-0.14l2.17,-0.62l1.22,2.11l-1.63,1.59l-0.37,0.36l0.08,0.51c0.05,0.32 0.08,0.64 0.08,0.98s-0.03,0.66 -0.08,0.98l-0.08,0.51l0.37,0.36l1.63,1.59l-1.22,2.11l-2.17,-0.62l-0.5,-0.14l-0.4,0.32c-0.53,0.43 -1.11,0.76 -1.72,0.98l-0.5,0.18l-0.13,0.51L13.22,21h-2.44l-0.55,-2.2l-0.13,-0.51l-0.5,-0.18C9,17.88 8.42,17.55 7.88,17.12l-0.4,-0.32l-0.5,0.14l-2.17,0.62L3.6,15.44l1.63,-1.59l0.37,-0.36l-0.08,-0.51C5.47,12.66 5.44,12.33 5.44,12s0.03,-0.66 0.08,-0.98l0.08,-0.51l-0.37,-0.36L3.6,8.56l1.22,-2.11l2.17,0.62l0.5,0.14l0.4,-0.32C8.42,6.45 9,6.12 9.61,5.9l0.5,-0.18l0.13,-0.51L10.78,3H13.22M14,2h-4L9.26,4.96c-0.73,0.27 -1.4,0.66 -2,1.14L4.34,5.27l-2,3.46l2.19,2.13C4.47,11.23 4.44,11.61 4.44,12s0.03,0.77 0.09,1.14l-2.19,2.13l2,3.46l2.92,-0.83c0.6,0.48 1.27,0.87 2,1.14L10,22h4l0.74,-2.96c0.73,-0.27 1.4,-0.66 2,-1.14l2.92,0.83l2,-3.46l-2.19,-2.13c0.06,-0.37 0.09,-0.75 0.09,-1.14s-0.03,-0.77 -0.09,-1.14l2.19,-2.13l-2,-3.46L16.74,6.1c-0.6,-0.48 -1.27,-0.87 -2,-1.14L14,2L14,2z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player.xml index 94c5ce84a0..160c95eb91 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_05_player.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M11.5,20.5 L11.5,15.5 L12.5,15.5 L12.5,17.5 L20.5,17.5 L20.5,18.5 L12.5,18.5 L12.5,20.5 Z M3.5,18.5 L3.5,17.5 L8.5,17.5 L8.5,18.5 Z M7.5,14.5 L7.5,12.5 L3.5,12.5 L3.5,11.5 L7.5,11.5 L7.5,9.5 L8.5,9.5 L8.5,14.5 Z M11.5,12.5 L11.5,11.5 L20.5,11.5 L20.5,12.5 Z M15.5,8.5 L15.5,3.5 L16.5,3.5 L16.5,5.5 L20.5,5.5 L20.5,6.5 L16.5,6.5 L16.5,8.5 Z M3.5,6.5 L3.5,5.5 L12.5,5.5 L12.5,6.5 Z M3.5,6.5" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts.xml index c16728ae2d..091ea60a36 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_06_shorts.xml @@ -15,15 +15,15 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M8.54688,22.2031 C7.00781,22.2031,5.51172,21.375,4.73047,19.9219 C3.66797,17.9414,4.32031,15.4531,6.21875,14.25 C6.23047,14.2422,6.24219,14.2344,6.25391,14.2305 C6.40625,14.1523,6.55469,14.0703,6.70703,13.9844 C6.59375,13.9219,6.48438,13.8594,6.37109,13.793 C5.20703,13.1211,4.49219,12.1758,4.29688,11.0508 C4.04297,9.55078,4.04297,7.65625,6.32031,6.28516 C8.07031,5.23828,9.86719,4.21484,11.6016,3.22266 C12.1797,2.89453,12.7539,2.56641,13.332,2.23438 C14.5313,1.54688,16.0195,1.51953,17.3008,2.16016 C18.5977,2.80469,19.4805,4.01563,19.6641,5.40625 C19.9297,7.17578,19.0469,8.94531,17.4609,9.80469 C17.3594,9.86328,17.2578,9.91797,17.1602,9.97656 C17.2539,10.0313,17.3477,10.0859,17.4414,10.1406 C18.7422,10.8711,19.5664,12.1172,19.6953,13.5547 C19.8242,14.9766,19.25,16.332,18.1211,17.2734 C17.7617,17.5664,17.3633,17.793,16.9805,18.0078 C16.8672,18.0703,16.7578,18.1328,16.6484,18.1953 C14.8711,19.2344,12.7617,20.457,10.5859,21.6875 C9.9375,22.0352,9.23828,22.2031,8.54688,22.2031 Z M6.69141,15.0313 C5.20703,15.9805,4.69922,17.9375,5.53125,19.4922 C6.42578,21.1484,8.49609,21.7773,10.1445,20.8906 C12.3086,19.668,14.4141,18.4453,16.1875,17.4102 C16.3008,17.3438,16.418,17.2773,16.5313,17.2148 C16.8984,17.0078,17.2461,16.8125,17.543,16.5703 C18.4336,15.8281,18.8906,14.7578,18.7891,13.6367 C18.6836,12.5039,18.0313,11.5156,16.9922,10.9336 C16.8281,10.8359,16.6641,10.7383,16.4961,10.6367 C16.3516,10.5508,16.2031,10.4609,16.043,10.3711 C15.9063,10.2891,15.8203,10.1445,15.8164,9.98438 C15.8125,9.82422,15.8984,9.67188,16.0352,9.58984 C16.3516,9.39063,16.6641,9.20703,17.0195,9.00781 C18.2773,8.32813,18.9727,6.92969,18.7617,5.53125 C18.6172,4.4375,17.9219,3.48438,16.8984,2.97656 C15.8828,2.47266,14.7188,2.49219,13.7813,3.02344 C13.207,3.35547,12.6289,3.68359,12.0547,4.01172 C10.3242,5.00391,8.53125,6.02344,6.78906,7.06641 C5.34375,7.9375,4.88281,9.04688,5.19531,10.8984 C5.34375,11.7539,5.89063,12.4648,6.82422,13 C7.15234,13.1875,7.47656,13.375,7.83984,13.5898 C7.97656,13.6719,8.0625,13.8203,8.0625,13.9805 C8.0625,14.1406,7.98047,14.2891,7.83984,14.375 C7.44531,14.6133,7.08203,14.8281,6.69141,15.0313 Z M6.69141,15.0313" /> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M10.0703,15.3555 C9.99219,15.3555,9.91406,15.3359,9.84375,15.2969 C9.69922,15.2148,9.61328,15.0625,9.61328,14.9023 L9.61328,9.08594 C9.61328,8.92188,9.69922,8.76953,9.83984,8.69141 C9.98438,8.60938,10.1563,8.60938,10.2969,8.69141 L15.3281,11.5898 C15.4688,11.6719,15.5547,11.8242,15.5547,11.9844 C15.5586,12.1484,15.4688,12.3008,15.3281,12.3789 L10.2969,15.2969 C10.2266,15.3359,10.1484,15.3555,10.0703,15.3555 Z M10.5234,9.875 L10.5234,14.1094 L14.1914,11.9883 Z M10.5234,9.875" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar.xml index 92cc9e881f..d37211fdd4 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_07_seekbar.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M4.5,14Q3.65,14 3.075,13.425Q2.5,12.85 2.5,12Q2.5,11.15 3.075,10.575Q3.65,10 4.5,10Q5.2,10 5.738,10.425Q6.275,10.85 6.425,11.5H21.5V12.5H6.425Q6.275,13.15 5.738,13.575Q5.2,14 4.5,14Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls.xml index 27ddec3fe1..d804354496 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_08_swipe_controls.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M3,21 L3,20.1328 L5.3125,20.1328 C4.33203,18.9844,3.54297,17.7266,2.95703,16.3516 C2.37109,14.9805,2.07813,13.5313,2.07813,12.0078 C2.07813,10.4883,2.37109,9.04297,2.95703,7.67578 C3.54297,6.30859,4.33203,5.04688,5.3125,3.88281 L3,3.88281 L3,3 L7.09766,3 L7.09766,7.11719 L6.23047,7.11719 L6.23047,4.17578 C5.25,5.28906,4.45703,6.50391,3.85156,7.82422 C3.24609,9.14063,2.94141,10.5352,2.94141,12.0078 C2.94141,13.4844,3.24609,14.875,3.85156,16.1875 C4.45703,17.4961,5.25,18.7031,6.23047,19.8047 L6.23047,16.9023 L7.09766,16.9023 L7.09766,21 Z M16.2969,19.8047 C15.9883,19.9141,15.668,19.9648,15.3359,19.9531 C15,19.9453,14.6836,19.8711,14.3789,19.7266 L8.0625,16.7891 L8.35938,16.1953 C8.46094,16.0156,8.59375,15.8711,8.75781,15.7656 C8.92188,15.6563,9.10547,15.5938,9.30859,15.5781 L12.1602,15.2578 L9.30469,7.44922 C9.25391,7.3125,9.26172,7.18359,9.32031,7.0625 C9.38281,6.94531,9.48047,6.85938,9.61719,6.80859 C9.75391,6.76172,9.88281,6.76563,10.0039,6.82813 C10.1211,6.88672,10.207,6.98438,10.2539,7.12109 L13.5508,16.1797 L9.80078,16.5078 L14.8086,18.8242 C14.9766,18.8984,15.1602,18.9453,15.3672,18.957 C15.5703,18.9727,15.7617,18.9453,15.9414,18.8711 L19.3867,17.6211 C20.043,17.3867,20.5195,16.957,20.8086,16.332 C21.1016,15.7109,21.1289,15.0703,20.8945,14.4102 L19.5195,10.6602 C19.4688,10.5234,19.4727,10.3945,19.5234,10.2734 C19.5781,10.1523,19.6719,10.0703,19.8125,10.0195 C19.9492,9.97266,20.0781,9.97266,20.1992,10.0273 C20.3203,10.0781,20.4023,10.1758,20.4531,10.3125 L21.8281,14.0625 C22.1719,14.9844,22.1406,15.8789,21.7383,16.75 C21.332,17.6172,20.668,18.2188,19.7422,18.5547 Z M14.5273,13.5469 L13.1563,9.76953 C13.1094,9.63281,13.1133,9.50391,13.1758,9.38281 C13.2344,9.26563,13.332,9.17969,13.4727,9.13281 C13.6094,9.08203,13.7383,9.08594,13.8555,9.14844 C13.9766,9.20703,14.0586,9.30469,14.1094,9.44141 L15.4844,13.1914 Z M17.1992,12.5586 L16.1719,9.73438 C16.125,9.59766,16.1289,9.46875,16.1914,9.35547 C16.25,9.23828,16.3477,9.16016,16.4844,9.11328 C16.625,9.0625,16.7539,9.06641,16.8711,9.12109 C16.9922,9.17188,17.0781,9.26563,17.125,9.40625 L18.1484,12.2266 Z M17.0898,15.2578 Z M17.0898,15.2578" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike.xml index 046daf7d0c..4eea6e9690 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_09_return_youtube_dislike.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M3.625,15Q3,15 2.5,14.5Q2,14 2,13.375V12.15Q2,12.025 2.025,11.862Q2.05,11.7 2.1,11.55L4.85,5.075Q5.05,4.625 5.538,4.312Q6.025,4 6.55,4H16.575V15L10.3,21.2L9.875,20.75Q9.725,20.625 9.638,20.4Q9.55,20.175 9.55,20V19.85L10.575,15ZM15.575,5H6.55Q6.325,5 6.1,5.112Q5.875,5.225 5.775,5.5L3,12V13.375Q3,13.65 3.175,13.825Q3.35,14 3.625,14H11.8L10.65,19.45L15.575,14.575ZM15.575,14.575V14Q15.575,14 15.575,13.825Q15.575,13.65 15.575,13.375V12V5.5Q15.575,5.225 15.575,5.112Q15.575,5 15.575,5ZM16.575,15V14H20V5H16.575V4H21V15Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock.xml index 0ca8266de4..be1f45953c 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_10_sponsorblock.xml @@ -6,11 +6,11 @@ Copyright 2021 Ajay Ramachandran --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M 12.000145,2.0000008 C 8.8230689,1.9990926 5.6959192,2.7864027 2.9017488,4.2906678 2.3373945,4.5948398 1.9899198,5.1860103 2.000223,5.8244635 2.0930396,12.358829 5.4926743,18.31271 11.094442,21.749998 c 0.557183,0.333336 1.253849,0.333336 1.811031,0 5.601767,-3.438045 9.001096,-9.391169 9.094295,-15.9255345 0.01052,-0.6386247 -0.337035,-1.2300179 -0.9016,-1.5341683 -2.794107,-1.5040456 -5.92111,-2.2912233 -9.098023,-2.2902944 z m 0.08082,0.8705548 c 3.003625,0.013255 5.957553,0.7636027 8.599879,2.1845129 0.277414,0.151228 0.448533,0.4421907 0.44513,0.7568723 C 21.034684,12.23921 17.58825,17.8544 12.446767,21.009378 c -0.274165,0.167124 -0.619386,0.167124 -0.893551,0 C 6.4117365,17.854399 2.9652339,12.239209 2.8739372,5.8119397 2.8705209,5.4972741 3.0416092,5.2063196 3.3189962,5.0550685 6.0095892,3.608201 9.0224769,2.8570356 12.080969,2.8705556 Z M 9.6351953,6.7701615 v 8.3406435 l 7.2606727,-4.170358 z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc.xml index 3cf7dba65d..c2d5483a71 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_11_misc.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M16.3,11.95 L12.075,7.725 16.3,3.5 20.525,7.725ZM4.625,10.625V4.625H10.625V10.625ZM13.375,19.375V13.375H19.375V19.375ZM4.625,19.375V13.375H10.625V19.375ZM5.625,9.625H9.625V5.625H5.625ZM16.325,10.575 L19.15,7.75 16.325,4.925 13.5,7.75ZM14.375,18.375H18.375V14.375H14.375ZM5.625,18.375H9.625V14.375H5.625ZM9.625,9.625ZM13.5,7.75ZM9.625,14.375ZM14.375,14.375Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video.xml b/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video.xml index 87c0b6d4f3..fe1683f0ba 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_screen_12_video.xml @@ -17,11 +17,11 @@ Copyright 2022 Google --> + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M12,19H4.625Q3.925,19 3.463,18.538Q3,18.075 3,17.375V6.625Q3,5.925 3.463,5.463Q3.925,5 4.625,5H19.375Q20.075,5 20.538,5.463Q21,5.925 21,6.625V11H20V6.625Q20,6.35 19.825,6.175Q19.65,6 19.375,6H4.625Q4.35,6 4.175,6.175Q4,6.35 4,6.625V17.375Q4,17.65 4.175,17.825Q4.35,18 4.625,18H12ZM10,15.575V8.425L15.575,12ZM17.85,20.8 L17.75,19.95Q17.175,19.825 16.8,19.6Q16.425,19.375 16.1,19.025L15.3,19.4L14.725,18.525L15.45,17.95Q15.25,17.425 15.25,16.925Q15.25,16.425 15.45,15.9L14.725,15.3L15.3,14.45L16.1,14.8Q16.425,14.475 16.8,14.25Q17.175,14.025 17.75,13.9L17.85,13.05H18.85L18.95,13.9Q19.525,14.025 19.9,14.25Q20.275,14.475 20.6,14.825L21.4,14.45L21.975,15.325L21.25,15.9Q21.45,16.425 21.45,16.925Q21.45,17.425 21.25,17.95L21.975,18.525L21.4,19.4L20.6,19.025Q20.275,19.375 19.9,19.6Q19.525,19.825 18.95,19.95L18.85,20.8ZM18.35,19.075Q19.225,19.075 19.863,18.438Q20.5,17.8 20.5,16.925Q20.5,16.05 19.863,15.413Q19.225,14.775 18.35,14.775Q17.475,14.775 16.837,15.413Q16.2,16.05 16.2,16.925Q16.2,17.8 16.837,18.438Q17.475,19.075 18.35,19.075Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_search_icon.xml b/patches/src/main/resources/settings/drawable/revanced_settings_search_icon.xml index e34340b6ca..89a59b85b3 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_search_icon.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_search_icon.xml @@ -1,9 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M11.0882,3 C6.62072,3,3,6.62368,3,11.0911 C3,15.5615,6.62368,19.1822,11.0911,19.1822 C13.172,19.1822,15.0691,18.3954,16.5029,17.1039 L20.094,20.695 C21.1138,19.6754,19.8953,20.8968,21,19.7921 L17.3822,16.1773 C18.5074,14.7874,19.1822,13.018,19.1822,11.0911 C19.1793,6.62072,15.5556,3,11.0882,3 Z M11.0882,4.27895 C14.851,4.27895,17.9004,7.32829,17.9004,11.0911 C17.9004,14.851,14.8511,17.9003,11.0882,17.9003 C7.32537,17.9003,4.27603,14.851,4.27603,11.0911 C4.27898,7.32827,7.32833,4.28189,11.0882,4.27893 Z" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_search_remove.xml b/patches/src/main/resources/settings/drawable/revanced_settings_search_remove.xml index 721d378856..62a8d1c302 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_search_remove.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_search_remove.xml @@ -1,9 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="?android:attr/textColorPrimary" + android:pathData="M7.61719,20 C7.16797,20,6.78516,19.8438,6.47266,19.5273 C6.15625,19.2148,6,18.832,6,18.3828 L6,6 L5,6 L5,5 L9,5 L9,4.23047 L15,4.23047 L15,5 L19,5 L19,6 L18,6 L18,18.3828 C18,18.8438,17.8477,19.2305,17.5391,19.5391 C17.2305,19.8477,16.8438,20,16.3828,20 Z M17,6 L7,6 L7,18.3828 C7,18.5625,7.05859,18.7109,7.17188,18.8281 C7.28906,18.9414,7.4375,19,7.61719,19 L16.3828,19 C16.5391,19,16.6797,18.9375,16.8086,18.8086 C16.9375,18.6797,17,18.5391,17,18.3828 Z M9.80859,17 L10.8086,17 L10.8086,8 L9.80859,8 Z M13.1914,17 L14.1914,17 L14.1914,8 L13.1914,8 Z M7,6 L7,19 Z M7,6" /> diff --git a/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left.xml b/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left.xml index dd8932acfd..3490e8c8c4 100644 --- a/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left.xml +++ b/patches/src/main/resources/settings/drawable/revanced_settings_toolbar_arrow_left.xml @@ -1,9 +1,9 @@ + android:width="24dp" + android:height="24dp" + android:viewportWidth="24" + android:viewportHeight="24"> + android:fillColor="#000000" + android:pathData="M11.5,3.5 L3.5,11.5 L11.5,19.5 L12.3145,18.6914 L5.69531,12.0723 L21,12.0723 L21,10.9277 L5.69531,10.9277 L12.3145,4.30859 Z" /> From 7ef70f782314b36b91562c2063b476bb92af9d44 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 21 Oct 2025 11:07:21 +0400 Subject: [PATCH 41/59] remove bold alert icon --- .../app/revanced/extension/shared/checks/Check.java | 6 ++---- .../patches/shared/misc/settings/SettingsPatch.kt | 1 - .../drawable/revanced_ic_dialog_alert_bold.xml | 11 ----------- 3 files changed, 2 insertions(+), 16 deletions(-) delete mode 100644 patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert_bold.xml diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java index a57e7b99e1..53db12c4d7 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/checks/Check.java @@ -128,10 +128,8 @@ static void issueWarning(Activity activity, Collection failedChecks) { // Add icon to the dialog. ImageView iconView = new ImageView(activity); - iconView.setImageResource(Utils.getResourceIdentifierOrThrow(ResourceType.DRAWABLE, - BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() - ? "revanced_ic_dialog_alert" - : "revanced_ic_dialog_alert_bold")); + iconView.setImageResource(Utils.getResourceIdentifierOrThrow( + ResourceType.DRAWABLE, "revanced_ic_dialog_alert")); iconView.setColorFilter(Utils.getAppForegroundColor(), PorterDuff.Mode.SRC_IN); iconView.setPadding(0, 0, 0, 0); LinearLayout.LayoutParams iconParams = new LinearLayout.LayoutParams( 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 a022eb48b9..2624cb504e 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 @@ -67,7 +67,6 @@ fun settingsPatch ( ResourceGroup("drawable", // CustomListPreference resources. "revanced_ic_dialog_alert.xml", - "revanced_ic_dialog_alert_bold.xml", // Search resources. "revanced_settings_arrow_time.xml", "revanced_settings_arrow_time_bold.xml", diff --git a/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert_bold.xml b/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert_bold.xml deleted file mode 100644 index a292b551ee..0000000000 --- a/patches/src/main/resources/settings/drawable/revanced_ic_dialog_alert_bold.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - \ No newline at end of file From 9a2f23291dba37626a5fc7bee2091bea2b344a72 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 21 Oct 2025 11:42:25 +0400 Subject: [PATCH 42/59] Don't allow bold icons if spoofing to very old targets --- .../app/revanced/extension/youtube/settings/Settings.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index c821dd45db..4d21b98352 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -537,6 +537,12 @@ public class Settings extends BaseSettings { SPOOF_APP_VERSION.resetToDefault(); } + if (!BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() + && SPOOF_APP_VERSION_TARGET.get().compareTo("19.35.00") <= 0) { + Logger.printInfo(() -> "Disabling bold icons that don't work with old spoof targets"); + BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.save(false); + } + // VR 1.61 is not selectable in the settings, and it's selected by spoof stream patch if needed. if (SPOOF_VIDEO_STREAMS_CLIENT_TYPE.get() == ClientType.ANDROID_VR_1_61_48) { SPOOF_VIDEO_STREAMS_CLIENT_TYPE.resetToDefault(); From 9984e586b4bc2ea2695904d9c6f15d7c686fa7b8 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 21 Oct 2025 11:58:14 +0400 Subject: [PATCH 43/59] Show bold search icon --- .../shared/settings/search/BaseSearchViewController.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java index 36a39b22c6..b571a9f2c7 100644 --- a/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java +++ b/extensions/shared/library/src/main/java/app/revanced/extension/shared/settings/search/BaseSearchViewController.java @@ -15,6 +15,7 @@ import android.text.TextUtils; import android.util.TypedValue; import android.view.Gravity; +import android.view.MenuItem; import android.view.View; import android.view.WindowManager; import android.view.inputmethod.EditorInfo; @@ -264,6 +265,10 @@ protected void setupToolbarMenu() { } return false; }); + + // Set bold icon if needed. + MenuItem search = toolbar.getMenu().findItem(ID_ACTION_SEARCH); + search.setIcon(getSearchIcon()); } /** From 772620c8ce4a025b5936325a7e8eaabdb8c59a33 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 21 Oct 2025 21:41:02 +0400 Subject: [PATCH 44/59] refactor --- .../patches/youtube/misc/litho/filter/LithoFilterPatch.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) 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 0375f413c6..80267b0986 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 @@ -133,10 +133,8 @@ val lithoFilterPatch = bytecodePatch( // The only static method in the class. method -> AccessFlags.STATIC.isSet(method.accessFlags) } - val emptyComponentField = classBy { - // Only one field that matches. - it.type == builderMethodDescriptor.returnType - }.fields.single() + + val emptyComponentField = classBy(builderMethodDescriptor.returnType).fields.single() componentCreateFingerprint.method.apply { val insertIndex = if (is_19_17_or_greater) { From 6d72b4a3fb6609866192fc8a9f3bcb15b7b52e5a Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 23 Oct 2025 11:37:45 +0400 Subject: [PATCH 45/59] unofficial 20.43.32 --- .../patches/shared/misc/audio/Fingerprints.kt | 12 ++++-------- .../shared/misc/audio/ForceOriginalAudioPatch.kt | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt index 51eefebe2a..fa02405c9f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt @@ -1,7 +1,7 @@ package app.revanced.patches.shared.misc.audio import app.revanced.patcher.fingerprint -import app.revanced.util.containsLiteralInstruction +import app.revanced.patcher.literal import com.android.tools.smali.dexlib2.AccessFlags internal val formatStreamModelToStringFingerprint by fingerprint { @@ -17,12 +17,8 @@ internal val formatStreamModelToStringFingerprint by fingerprint { ) } -internal const val AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG = 45666189L - internal val selectAudioStreamFingerprint by fingerprint { - returns("L") - custom { method, _ -> - method.parameters.size > 1 // Method has a large number of parameters and may change. - && method.containsLiteralInstruction(AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG) - } + instructions( + literal(45666189L) + ) } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt index 465ce80304..518c3a1c54 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/ForceOriginalAudioPatch.kt @@ -66,7 +66,7 @@ internal fun forceOriginalAudioPatch( // and instead overrides to the user region language. if (fixUseLocalizedAudioTrackFlag()) { selectAudioStreamFingerprint.method.insertLiteralOverride( - AUDIO_STREAM_IGNORE_DEFAULT_FEATURE_FLAG, + selectAudioStreamFingerprint.instructionMatches.first().index, "$EXTENSION_CLASS_DESCRIPTOR->ignoreDefaultAudioStream(Z)Z" ) } From ecda492866f7ee8eef8b1e880d0d058fb962771b Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 27 Oct 2025 11:09:55 +0400 Subject: [PATCH 46/59] finish merge --- .../app/revanced/patches/duolingo/energy/Fingerprints.kt | 4 ++-- .../patches/instagram/hide/navigation/Fingerprints.kt | 4 ++-- .../instagram/hide/navigation/HideNavigationButtons.kt | 2 +- .../patches/music/layout/compactheader/HideCategoryBar.kt | 8 ++++---- .../revanced/patches/tiktok/misc/share/Fingerprints.kt | 2 +- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt index 73dbcf304c..0fbc9e51b8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt @@ -7,13 +7,13 @@ import com.android.tools.smali.dexlib2.Opcode /** * Matches the class found in [energyConfigToStringFingerprint]. */ -internal val initializeEnergyConfigFingerprint = fingerprint { +internal val initializeEnergyConfigFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes(Opcode.RETURN_VOID) } // Class name currently is not obfuscated but it may be in the future. -internal val energyConfigToStringFingerprint = fingerprint { +internal val energyConfigToStringFingerprint by fingerprint { parameters() returns("Ljava/lang/String;") strings("EnergyConfig(", "maxEnergy=") // Partial string matches. 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 6dc01f47c5..9546b0eb03 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 @@ -5,12 +5,12 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val initializeNavigationButtonsListFingerprint = fingerprint { +internal val initializeNavigationButtonsListFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Lcom/instagram/common/session/UserSession;", "Z") returns("Ljava/util/List;") } -private val navigationButtonsEnumClassDef = fingerprint { +internal val navigationButtonsEnumClassDef by fingerprint { strings("FEED", "fragment_feed", "SEARCH", "fragment_search") } 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 e8ec3ee6f4..419b813df5 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 @@ -63,7 +63,7 @@ val hideNavigationButtonsPatch = bytecodePatch( with(navigationButtonsEnumInitFingerprint.method) { enumNameField = indexOfFirstInstructionOrThrow { opcode == Opcode.IPUT_OBJECT && - (this as TwoRegisterInstruction).registerA == 2 // The p2 register + (this as TwoRegisterInstruction).registerA == 2 // p2 register. }.let { getInstruction(it).getReference()!!.name } 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 5a62705515..92d5ad4df6 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 @@ -8,8 +8,8 @@ import app.revanced.patches.all.misc.resources.addResourcesPatch import app.revanced.patches.music.misc.extension.sharedExtensionPatch import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.music.misc.settings.settingsPatch -import app.revanced.patches.shared.misc.mapping.get -import app.revanced.patches.shared.misc.mapping.resourceMappings +import app.revanced.patches.shared.misc.mapping.ResourceType +import app.revanced.patches.shared.misc.mapping.getResourceId import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -37,14 +37,14 @@ val hideCategoryBar = bytecodePatch( ) execute { - chipCloud = resourceMappings["layout", "chip_cloud"] - addResources("music", "layout.compactheader.hideCategoryBar") PreferenceScreen.GENERAL.addPreferences( SwitchPreference("revanced_music_hide_category_bar"), ) + chipCloud = getResourceId(ResourceType.LAYOUT, "chip_cloud") + chipCloudFingerprint.method.apply { val targetIndex = chipCloudFingerprint.patternMatch!!.endIndex val targetRegister = getInstruction(targetIndex).registerA diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt index 836be89006..38e8946c12 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val urlShorteningFingerprint = fingerprint { +internal val urlShorteningFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) returns("LX/") parameters( From c95170ecbd9b2d4a4e7125baf7e2194986b4e79a Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 27 Oct 2025 11:11:51 +0400 Subject: [PATCH 47/59] fix fullscreen button vertical alignment --- .../playercontrols/PlayerControlsPatch.kt | 12 +++++++ .../youtube_controls_bottom_ui_container.xml | 2 +- .../youtube_controls_bottom_ui_container.xml | 35 +++++++++---------- 3 files changed, 30 insertions(+), 19 deletions(-) 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 00edcbe4fd..6af9b1a132 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 @@ -72,6 +72,18 @@ internal val playerControlsResourcePatch = resourcePatch { bottomLastLeftOf, ) + // Modify the fullscreen button stub attributes for correct positioning. + // The fullscreen button is lower than the ReVanced buttons (unpatched app bug). + // Issue is only present in later app targets, but this change seems to + // do no harm to earlier releases. + bottomTargetDocumentChildNodes.findElementByAttributeValueOrThrow( + "android:id", + "@id/youtube_controls_fullscreen_button_stub" + ).apply { + setAttribute("android:layout_marginBottom", "6.0dip") + setAttribute("android:layout_width", "48.0dip") + } + addTopControl = { resourceDirectoryName -> val resourceFileName = "host/layout/youtube_controls_layout.xml" val hostingResourceStream = inputStreamFromBundledResource( diff --git a/patches/src/main/resources/downloads/host/layout/youtube_controls_bottom_ui_container.xml b/patches/src/main/resources/downloads/host/layout/youtube_controls_bottom_ui_container.xml index a243eea714..a3f7a9e119 100644 --- a/patches/src/main/resources/downloads/host/layout/youtube_controls_bottom_ui_container.xml +++ b/patches/src/main/resources/downloads/host/layout/youtube_controls_bottom_ui_container.xml @@ -11,7 +11,7 @@ style="@style/YouTubePlayerButton" android:layout_width="48.0dip" android:layout_height="60.0dip" - android:paddingTop="6.5dp" + android:paddingTop="6.0dp" android:paddingBottom="0dp" android:longClickable="false" android:scaleType="center" diff --git a/patches/src/main/resources/loopvideobutton/host/layout/youtube_controls_bottom_ui_container.xml b/patches/src/main/resources/loopvideobutton/host/layout/youtube_controls_bottom_ui_container.xml index bcd7def9e7..1947f997e0 100644 --- a/patches/src/main/resources/loopvideobutton/host/layout/youtube_controls_bottom_ui_container.xml +++ b/patches/src/main/resources/loopvideobutton/host/layout/youtube_controls_bottom_ui_container.xml @@ -1,22 +1,21 @@ - + - + android:id="@+id/revanced_loop_video_button" + style="@style/YouTubePlayerButton" + android:layout_width="48.0dip" + android:layout_height="60.0dip" + android:longClickable="false" + android:paddingTop="6.0dp" + android:paddingBottom="0dp" + android:scaleType="center" + android:src="@drawable/revanced_loop_video_button_off" + yt:layout_constraintBottom_toTopOf="@+id/quick_actions_container" + yt:layout_constraintRight_toLeftOf="@+id/fullscreen_button" /> From 594317e57312a9658b76e22b73490c622c3ef711 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 27 Oct 2025 11:18:12 +0400 Subject: [PATCH 48/59] Change lowest supported version to `19.43.41` --- .../youtube/ad/general/HideAdsPatch.kt | 2 +- .../ad/getpremium/HideGetPremiumPatch.kt | 2 +- .../patches/youtube/ad/video/VideoAdsPatch.kt | 2 +- .../copyvideourl/CopyVideoUrlPatch.kt | 2 +- .../RemoveViewerDiscretionDialogPatch.kt | 2 +- .../interaction/downloads/DownloadsPatch.kt | 2 +- .../interaction/seekbar/SeekbarPatch.kt | 2 +- .../swipecontrols/SwipeControlsPatch.kt | 2 +- .../layout/autocaptions/AutoCaptionsPatch.kt | 2 +- .../layout/branding/CustomBrandingPatch.kt | 2 +- .../branding/header/ChangeHeaderPatch.kt | 2 +- .../layout/buttons/action/HideButtonsPatch.kt | 2 +- .../navigation/NavigationButtonsPatch.kt | 2 +- .../overlay/HidePlayerOverlayButtonsPatch.kt | 2 +- .../formfactor/ChangeFormFactorPatch.kt | 2 +- .../endscreencards/HideEndScreenCardsPatch.kt | 2 +- .../HideEndScreenSuggestedVideoPatch.kt | 2 +- .../DisableFullscreenAmbientModePatch.kt | 2 +- .../hide/general/HideLayoutComponentsPatch.kt | 2 +- .../hide/infocards/HideInfoCardsPatch.kt | 2 +- .../HidePlayerFlyoutMenuPatch.kt | 2 +- .../HideRelatedVideoOverlayPatch.kt | 2 +- .../DisableRollingNumberAnimationPatch.kt | 2 +- .../hide/shorts/HideShortsComponentsPatch.kt | 2 +- .../DisableSignInToTvPatchPopup.kt | 2 +- .../layout/hide/time/HideTimestampPatch.kt | 2 +- .../layout/miniplayer/MiniplayerPatch.kt | 2 +- .../panels/popup/PlayerPopupPanelsPatch.kt | 2 +- .../player/fullscreen/ExitFullscreenPatch.kt | 2 +- .../fullscreen/OpenVideosFullscreenPatch.kt | 2 +- .../CustomPlayerOverlayOpacityPatch.kt | 2 +- .../ReturnYouTubeDislikePatch.kt | 2 +- .../layout/searchbar/WideSearchbarPatch.kt | 2 +- .../shortsautoplay/ShortsAutoplayPatch.kt | 2 +- .../OpenShortsInRegularPlayerPatch.kt | 2 +- .../layout/sponsorblock/SponsorBlockPatch.kt | 2 +- .../spoofappversion/SpoofAppVersionPatch.kt | 2 +- .../layout/startpage/ChangeStartPagePatch.kt | 2 +- .../DisableResumingShortsOnStartupPatch.kt | 2 +- .../youtube/layout/theme/ThemePatch.kt | 2 +- .../thumbnails/AlternativeThumbnailsPatch.kt | 2 +- .../BypassImageRegionRestrictionsPatch.kt | 2 +- .../misc/announcements/AnnouncementsPatch.kt | 2 +- .../BackgroundPlaybackPatch.kt | 2 +- .../misc/debugging/EnableDebuggingPatch.kt | 2 +- .../spoof/SpoofDeviceDimensionsPatch.kt | 2 +- ...ckWatchHistoryDomainNameResolutionPatch.kt | 2 +- .../youtube/misc/gms/GmsCoreSupportPatch.kt | 2 +- .../DisableHapticFeedbackPatch.kt | 2 +- .../misc/links/BypassURLRedirectsPatch.kt | 2 +- .../misc/links/OpenLinksExternallyPatch.kt | 2 +- .../youtube/misc/loopvideo/LoopVideoPatch.kt | 2 +- .../misc/playservice/VersionCheckPatch.kt | 22 +++++++++++-------- .../misc/privacy/SanitizeSharingLinksPatch.kt | 2 +- .../misc/spoof/SpoofVideoStreamsPatch.kt | 2 +- .../video/audio/ForceOriginalAudioPatch.kt | 2 +- .../video/codecs/DisableVideoCodecsPatch.kt | 2 +- .../video/quality/VideoQualityPatch.kt | 2 +- .../youtube/video/speed/PlaybackSpeedPatch.kt | 2 +- 59 files changed, 71 insertions(+), 67 deletions(-) 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 59d27418a6..1ebf8fc6ca 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 @@ -76,7 +76,7 @@ val hideAdsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 c93c9e1bc3..944cc7bc3d 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 @@ -25,7 +25,7 @@ val hideGetPremiumPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 f887d43550..7a22bb1b45 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 @@ -23,7 +23,7 @@ val videoAdsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt index 103dab91ff..3eecc9a6ea 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/copyvideourl/CopyVideoUrlPatch.kt @@ -53,7 +53,7 @@ val copyVideoUrlPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 401572ec86..f5e48d41a1 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 @@ -26,7 +26,7 @@ val removeViewerDiscretionDialogPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 2d71d8a6c3..ada3c80a56 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 @@ -73,7 +73,7 @@ val downloadsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt index 64cfacb00e..02de168e40 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/seekbar/SeekbarPatch.kt @@ -20,7 +20,7 @@ val seekbarPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 6fd5fb7697..d2fec49a59 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 @@ -95,7 +95,7 @@ val swipeControlsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 a1509ea05d..97f9db7945 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 @@ -24,7 +24,7 @@ val autoCaptionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt index 5aded58d0b..322079d078 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/CustomBrandingPatch.kt @@ -25,7 +25,7 @@ val customBrandingPatch = baseCustomBrandingPatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt index a3b4dc2ce6..0a8bdaaeb7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/branding/header/ChangeHeaderPatch.kt @@ -93,7 +93,7 @@ val changeHeaderPatch = resourcePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt index 329beb7b68..ccdb239cc5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/action/HideButtonsPatch.kt @@ -25,7 +25,7 @@ val hideButtonsPatch = resourcePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 7cc05190c2..71e04928ca 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 @@ -38,7 +38,7 @@ val navigationButtonsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 1c0cfe3090..45a961ec31 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 @@ -45,7 +45,7 @@ val hidePlayerOverlayButtonsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 69e6939c24..4b7fbda4b8 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 @@ -32,7 +32,7 @@ val changeFormFactorPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 11c18cc4b7..2b1f22b019 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 @@ -63,7 +63,7 @@ val hideEndScreenCardsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 f96923be4b..88d9680410 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 @@ -31,7 +31,7 @@ val hideEndScreenSuggestedVideoPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 2eaba52b5c..b9bd758c5c 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 @@ -29,7 +29,7 @@ val disableFullscreenAmbientModePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 5e6f701552..ca4a6ef3d7 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 @@ -110,7 +110,7 @@ val hideLayoutComponentsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 6368fb5cef..7d4226f3a4 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 @@ -50,7 +50,7 @@ val hideInfoCardsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt index 551615321b..6910030c84 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/player/flyoutmenupanel/HidePlayerFlyoutMenuPatch.kt @@ -24,7 +24,7 @@ val hidePlayerFlyoutMenuPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 fa1f61c55d..d8460d1902 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 @@ -29,7 +29,7 @@ val hideRelatedVideoOverlayPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 c64e89df12..05a86d5938 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 @@ -29,7 +29,7 @@ val disableRollingNumberAnimationPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 85405aa75f..76a2f072f9 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 @@ -173,7 +173,7 @@ val hideShortsComponentsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 3813f810e1..5e4ee47a45 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 @@ -26,7 +26,7 @@ val disableSignInToTvPopupPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 a7aa35ff8d..c29d1d8400 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 @@ -23,7 +23,7 @@ val hideTimestampPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 37eea1c4ad..58bb3874e0 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 @@ -84,7 +84,7 @@ val miniplayerPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 fef1c100f2..e76185681f 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 @@ -21,7 +21,7 @@ val playerPopupPanelsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt index 6e09680830..3a1461e0be 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt @@ -21,7 +21,7 @@ internal val exitFullscreenPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 e38cfd45a6..ca35dba6d7 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 @@ -21,7 +21,7 @@ val openVideosFullscreenPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "19.43.41", "19.47.53", "20.13.41", 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 c04082c64d..ec7b9f98c2 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 @@ -27,7 +27,7 @@ val customPlayerOverlayOpacityPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 292bd5f382..9cd9fa8302 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 @@ -63,7 +63,7 @@ val returnYouTubeDislikePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 b42856f0b5..31e5886a91 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 @@ -39,7 +39,7 @@ val wideSearchbarPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 8f67165609..c270ad3a87 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 @@ -44,7 +44,7 @@ val shortsAutoplayPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt index 2ed749919d..7ce61e1b5b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/OpenShortsInRegularPlayerPatch.kt @@ -46,7 +46,7 @@ val openShortsInRegularPlayerPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt index 933d0cc252..913ad00720 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/SponsorBlockPatch.kt @@ -132,7 +132,7 @@ val sponsorBlockPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 acebf6cbda..499c0d1b30 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 @@ -38,7 +38,7 @@ val spoofAppVersionPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 147ec2aaaa..016094bf2d 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 @@ -29,7 +29,7 @@ val changeStartPagePatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 7aa9956a57..ae6c7dbdff 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 @@ -34,7 +34,7 @@ val disableResumingShortsOnStartupPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 4fd4655fa4..e2b1a3e7ba 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 @@ -156,7 +156,7 @@ val themePatch = baseThemePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt index 776224c3ca..06d45344c2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/AlternativeThumbnailsPatch.kt @@ -33,7 +33,7 @@ val alternativeThumbnailsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt index 27fd088403..c0fc57a003 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/thumbnails/BypassImageRegionRestrictionsPatch.kt @@ -27,7 +27,7 @@ val bypassImageRegionRestrictionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt index d36a42bf22..723da0edf0 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/announcements/AnnouncementsPatch.kt @@ -23,7 +23,7 @@ val announcementsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 0a0905615d..cc73834839 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 @@ -43,7 +43,7 @@ val backgroundPlaybackPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt index a4915e2a22..c34c5efd9a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/EnableDebuggingPatch.kt @@ -17,7 +17,7 @@ val enableDebuggingPatch = enableDebuggingPatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 7e8623c80f..79e8972ed1 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 @@ -24,7 +24,7 @@ val spoofDeviceDimensionsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt index 593fbe81e2..6460de7f86 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/dns/CheckWatchHistoryDomainNameResolutionPatch.kt @@ -12,7 +12,7 @@ val checkWatchHistoryDomainNameResolutionPatch = checkWatchHistoryDomainNameReso compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt index 3ea710deb8..a95c697b3e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/GmsCoreSupportPatch.kt @@ -35,7 +35,7 @@ val gmsCoreSupportPatch = gmsCoreSupportPatch( compatibleWith( YOUTUBE_PACKAGE_NAME( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 2f9bf8d097..2a8f5926a9 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 @@ -26,7 +26,7 @@ val disableHapticFeedbackPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 84494803e3..275427e4cd 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 @@ -26,7 +26,7 @@ val bypassURLRedirectsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt index 694ea17f22..e5b9332a37 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/links/OpenLinksExternallyPatch.kt @@ -41,7 +41,7 @@ val openLinksExternallyPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 5b67397acf..f2edb91c44 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 @@ -27,7 +27,7 @@ val loopVideoPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index 597f0e5908..b06abf69e9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -8,39 +8,43 @@ import kotlin.properties.Delegates // Use notNull delegate so an exception is thrown if these fields are accessed before they are set. -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_17_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_18_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_23_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_25_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_26_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_29_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_32_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_33_or_greater : Boolean by Delegates.notNull() private set -@Deprecated("19.34.42 is the lowest supported version") +@Deprecated("19.43.41 is the lowest supported version") var is_19_34_or_greater : Boolean by Delegates.notNull() private set +@Deprecated("19.43.41 is the lowest supported version") var is_19_35_or_greater : Boolean by Delegates.notNull() private set +@Deprecated("19.43.41 is the lowest supported version") var is_19_36_or_greater : Boolean by Delegates.notNull() private set +@Deprecated("19.43.41 is the lowest supported version") var is_19_41_or_greater : Boolean by Delegates.notNull() private set +@Deprecated("19.43.41 is the lowest supported version") var is_19_43_or_greater : Boolean by Delegates.notNull() private set var is_19_46_or_greater : Boolean by Delegates.notNull() diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt index ec5d21da28..2f274fc995 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatch.kt @@ -14,7 +14,7 @@ val sanitizeSharingLinksPatch = sanitizeSharingLinksPatch( ) compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt index df9e28aad1..d0a88dafa1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/SpoofVideoStreamsPatch.kt @@ -32,7 +32,7 @@ val spoofVideoStreamsPatch = spoofVideoStreamsPatch( block = { compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt index 090a737143..d1ccca680e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/audio/ForceOriginalAudioPatch.kt @@ -19,7 +19,7 @@ val forceOriginalAudioPatch = forceOriginalAudioPatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) 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 9ff8b7d0da..fe56d4b63c 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 @@ -57,7 +57,7 @@ val disableVideoCodecsPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt index 6bd3710a35..6bf6e5621b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt @@ -24,7 +24,7 @@ val videoQualityPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt index dad03c2766..6792f2747a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt @@ -28,7 +28,7 @@ val playbackSpeedPatch = bytecodePatch( compatibleWith( "com.google.android.youtube"( - "19.34.42", + "19.43.41", "20.13.41", "20.14.43", ) From 260afefaab41431bd7bf4f746be74ac5fd411bdf Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Tue, 28 Oct 2025 12:57:55 +0400 Subject: [PATCH 49/59] fix data migration --- .../java/app/revanced/extension/youtube/settings/Settings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java index ca5875aa53..082b406f32 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/settings/Settings.java @@ -517,7 +517,7 @@ public class Settings extends BaseSettings { } if (!BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.get() - && SPOOF_APP_VERSION_TARGET.get().compareTo("19.35.00") <= 0) { + && SPOOF_APP_VERSION.get() && SPOOF_APP_VERSION_TARGET.get().compareTo("19.35.00") <= 0) { Logger.printInfo(() -> "Disabling bold icons that don't work with old spoof targets"); BaseSettings.SETTINGS_DISABLE_BOLD_ICONS.save(true); } From 93160722c028f841a8f9a2bd5d4507499d15201d Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Thu, 30 Oct 2025 12:27:37 +0100 Subject: [PATCH 50/59] add temporary debug logging --- .../youtube/patches/ReturnYouTubeDislikePatch.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java index f7c0bee2d3..7c74b2929c 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/ReturnYouTubeDislikePatch.java @@ -13,9 +13,11 @@ import androidx.annotation.Nullable; import java.util.Objects; +import java.util.Set; import app.revanced.extension.shared.Logger; import app.revanced.extension.shared.Utils; +import app.revanced.extension.shared.settings.BaseSettings; import app.revanced.extension.youtube.patches.components.ReturnYouTubeDislikeFilter; import app.revanced.extension.youtube.returnyoutubedislike.ReturnYouTubeDislike; import app.revanced.extension.youtube.settings.Settings; @@ -131,6 +133,10 @@ private static CharSequence onLithoTextLoaded(@NonNull Object conversionContext, String conversionContextString = conversionContext.toString(); + if (Settings.RYD_ENABLED.get()) { // FIXME: Remove this. + Logger.printDebug(() -> "RYD conversion context: " + conversionContext); + } + if (isRollingNumber && !conversionContextString.contains("video_action_bar.e")) { return original; } From 88352d8774d439f1426636ae4933720eaee2f1bd Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Fri, 7 Nov 2025 09:00:28 +0200 Subject: [PATCH 51/59] Unofficial 20.45.32 --- patches/api/patches.api | 1 + .../layout/hide/shorts/Fingerprints.kt | 74 ++++++++++++------- .../hide/shorts/HideShortsComponentsPatch.kt | 10 ++- .../layout/panels/popup/Fingerprints.kt | 2 - .../panels/popup/PlayerPopupPanelsPatch.kt | 6 +- .../misc/playservice/VersionCheckPatch.kt | 3 + 6 files changed, 61 insertions(+), 35 deletions(-) diff --git a/patches/api/patches.api b/patches/api/patches.api index c440576b53..d5a8418b80 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -1660,6 +1660,7 @@ public final class app/revanced/patches/youtube/misc/playservice/VersionCheckPat public static final fun is_20_37_or_greater ()Z public static final fun is_20_39_or_greater ()Z public static final fun is_20_41_or_greater ()Z + public static final fun is_20_45_or_greater ()Z } public final class app/revanced/patches/youtube/misc/privacy/SanitizeSharingLinksPatchKt { 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 803090f59b..557fb9b544 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 @@ -10,20 +10,6 @@ import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val legacyRenderBottomNavigationBarParentFingerprint by fingerprint { - parameters( - "I", - "I", - "L", - "L", - "J", - "L", - ) - instructions( - string("aa") - ) -} - internal val shortsBottomBarContainerFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") @@ -36,28 +22,49 @@ internal val shortsBottomBarContainerFingerprint by fingerprint { ) } +/** + * 19.41 to 20.44. + */ internal val renderBottomNavigationBarFingerprint by fingerprint { returns("V") parameters("Ljava/lang/String;") - opcodes( - Opcode.IGET_OBJECT, - Opcode.MONITOR_ENTER, - Opcode.IGET_OBJECT, - Opcode.IF_EQZ, - Opcode.INVOKE_INTERFACE, - Opcode.MONITOR_EXIT, - Opcode.RETURN_VOID, - Opcode.MOVE_EXCEPTION, - Opcode.MONITOR_EXIT, - Opcode.THROW, + instructions( + opcode(Opcode.IGET_OBJECT, maxAfter = 0), + opcode(Opcode.MONITOR_ENTER, maxAfter = 0), + opcode(Opcode.IGET_OBJECT, maxAfter = 0), + opcode(Opcode.IF_EQZ, maxAfter = 0), + opcode(Opcode.INVOKE_INTERFACE, maxAfter = 0), + + opcode(Opcode.MONITOR_EXIT), + opcode(Opcode.RETURN_VOID, maxAfter = 0), + opcode(Opcode.MOVE_EXCEPTION, maxAfter = 0), + opcode(Opcode.MONITOR_EXIT, maxAfter = 0), + opcode(Opcode.THROW, maxAfter = 0), ) } /** - * Identical to [legacyRenderBottomNavigationBarParentFingerprint] + * Less than 19.41. + */ +internal val legacyRenderBottomNavigationBarLegacyParentFingerprint by fingerprint { + parameters( + "I", + "I", + "L", + "L", + "J", + "L", + ) + instructions( + string("aa") + ) +} + +/** + * Identical to [legacyRenderBottomNavigationBarLegacyParentFingerprint] * except this has an extra parameter. */ -internal val renderBottomNavigationBarParentFingerprint by fingerprint { +internal val renderBottomNavigationBarLegacy1941ParentFingerprint by fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters( "I", @@ -73,6 +80,19 @@ internal val renderBottomNavigationBarParentFingerprint by fingerprint { ) } +internal val renderBottomNavigationBarParentFingerprint by fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("[Ljava/lang/Class;") + parameters( + "Ljava/lang/Class;", + "Ljava/lang/Object;", + "I" + ) + instructions( + string("RPCAC") + ) +} + internal val setPivotBarVisibilityFingerprint by fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") 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 76a2f072f9..c72992a36c 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 @@ -20,6 +20,7 @@ import app.revanced.patches.youtube.misc.navigation.navigationBarHookPatch import app.revanced.patches.youtube.misc.playservice.is_19_41_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_07_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_22_or_greater +import app.revanced.patches.youtube.misc.playservice.is_20_45_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 @@ -27,7 +28,6 @@ import app.revanced.util.findElementByAttributeValueOrThrow import app.revanced.util.forEachLiteralValueInstruction import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow -import app.revanced.util.indexOfFirstLiteralInstruction import app.revanced.util.removeFromParent import app.revanced.util.returnLate import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -224,11 +224,13 @@ val hideShortsComponentsPatch = bytecodePatch( // Hook to hide the shared navigation bar when the Shorts player is opened. renderBottomNavigationBarFingerprint.match( - if (is_19_41_or_greater) { + (if (is_20_45_or_greater) { renderBottomNavigationBarParentFingerprint + } else if (is_19_41_or_greater) { + renderBottomNavigationBarLegacy1941ParentFingerprint } else { - legacyRenderBottomNavigationBarParentFingerprint - }.originalClassDef, + legacyRenderBottomNavigationBarLegacyParentFingerprint + }).originalClassDef ).method.addInstruction( 0, "invoke-static { p1 }, $FILTER_CLASS_DESCRIPTOR->hideNavigationBar(Ljava/lang/String;)V", 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 7ac0ce2a11..8cdb3aa342 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,10 +1,8 @@ package app.revanced.patches.youtube.layout.panels.popup -import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint internal val engagementPanelControllerFingerprint by fingerprint { - accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("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 e76185681f..5c6b0b818e 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 @@ -9,6 +9,8 @@ import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/DisablePlayerPopupPanelsPatch;" + val playerPopupPanelsPatch = bytecodePatch( name = "Disable player popup panels", description = "Adds an option to disable panels (such as live chat) from opening automatically.", @@ -37,7 +39,7 @@ val playerPopupPanelsPatch = bytecodePatch( engagementPanelControllerFingerprint.method.addInstructionsWithLabels( 0, """ - invoke-static { }, Lapp/revanced/extension/youtube/patches/DisablePlayerPopupPanelsPatch;->disablePlayerPopupPanels()Z + invoke-static { }, $EXTENSION_CLASS_DESCRIPTOR->disablePlayerPopupPanels()Z move-result v0 if-eqz v0, :player_popup_panels if-eqz p4, :player_popup_panels @@ -45,7 +47,7 @@ val playerPopupPanelsPatch = bytecodePatch( return-object v0 :player_popup_panels nop - """, + """ ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt index b06abf69e9..be5c6e5d6b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/playservice/VersionCheckPatch.kt @@ -93,6 +93,8 @@ var is_20_39_or_greater : Boolean by Delegates.notNull() private set var is_20_41_or_greater : Boolean by Delegates.notNull() private set +var is_20_45_or_greater : Boolean by Delegates.notNull() + private set val versionCheckPatch = resourcePatch( description = "Uses the Play Store service version to find the major/minor version of the YouTube target app.", @@ -139,5 +141,6 @@ val versionCheckPatch = resourcePatch( is_20_37_or_greater = 253805000 <= playStoreServicesVersion is_20_39_or_greater = 253980000 <= playStoreServicesVersion is_20_41_or_greater = 254205000 <= playStoreServicesVersion + is_20_45_or_greater = 254605000 <= playStoreServicesVersion } } From 7499f3d19b29fe58f91c1bf617299b6469758a32 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Nov 2025 10:35:56 +0200 Subject: [PATCH 52/59] add maven local --- settings.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/settings.gradle.kts b/settings.gradle.kts index 357fde7cdf..04e2c477d6 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -2,6 +2,7 @@ rootProject.name = "revanced-patches" pluginManagement { repositories { + mavenLocal() gradlePluginPortal() google() maven { From 49c925e95ff27eca152d49b05b195a7eea1be724 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Nov 2025 10:43:01 +0200 Subject: [PATCH 53/59] remove 'by' syntax for fingerprints --- .../revanced/patches/amazon/Fingerprints.kt | 2 +- .../patches/angulus/ads/Fingerprints.kt | 2 +- .../bandcamp/limitations/Fingerprints.kt | 2 +- .../cieid/restrictions/root/Fingerprints.kt | 2 +- .../patches/cricbuzz/ads/Fingerprints.kt | 6 ++-- .../patches/crunchyroll/ads/Fingerprints.kt | 2 +- .../patches/duolingo/ad/Fingerprints.kt | 4 +-- .../patches/duolingo/debug/Fingerprints.kt | 6 ++-- .../patches/duolingo/energy/Fingerprints.kt | 4 +-- .../facebook/ads/mainfeed/Fingerprints.kt | 6 ++-- .../facebook/ads/story/Fingerprints.kt | 4 +-- .../detection/bootloader/Fingerprints.kt | 4 +-- .../detection/root/Fingerprints.kt | 2 +- .../googlenews/customtabs/Fingerprints.kt | 2 +- .../googlenews/misc/gms/Fingerprints.kt | 2 +- .../googlephotos/misc/backup/Fingerprints.kt | 2 +- .../misc/features/Fingerprints.kt | 2 +- .../googlephotos/misc/gms/Fingerprints.kt | 2 +- .../restrictions/Fingerprints.kt | 2 +- .../patches/hexeditor/ad/Fingerprints.kt | 2 +- .../iconpackstudio/misc/pro/Fingerprints.kt | 2 +- .../idaustria/detection/root/Fingerprints.kt | 6 ++-- .../detection/signature/Fingerprints.kt | 2 +- .../patches/inshorts/ad/Fingerprints.kt | 2 +- .../patches/instagram/feed/Fingerprints.kt | 4 +-- .../feed/LimitFeedToFollowedProfiles.kt | 2 +- .../instagram/hide/explore/Fingerprints.kt | 2 +- .../instagram/hide/navigation/Fingerprints.kt | 4 +-- .../hide/navigation/HideNavigationButtons.kt | 2 +- .../instagram/hide/stories/Fingerprints.kt | 2 +- .../hide/suggestions/Fingerprints.kt | 2 +- .../instagram/misc/devmenu/Fingerprints.kt | 2 +- .../instagram/misc/links/Fingerprint.kt | 2 +- .../PermalinkResponseJsonParserFingerprint.kt | 8 ++--- .../misc/share/domain/Fingerprint.kt | 2 +- .../instagram/misc/signature/Fingerprints.kt | 4 +-- .../patches/irplus/ad/Fingerprints.kt | 2 +- .../lightroom/misc/login/Fingerprints.kt | 2 +- .../lightroom/misc/premium/Fingerprints.kt | 2 +- .../detection/license/Fingerprints.kt | 2 +- .../detection/signature/Fingerprints.kt | 2 +- .../memegenerator/misc/pro/Fingerprints.kt | 2 +- .../patches/messenger/inbox/Fingerprints.kt | 4 +-- .../patches/messenger/layout/Fingerprints.kt | 2 +- .../patches/messenger/metaai/Fingerprints.kt | 6 ++-- .../revanced/patches/meta/ads/Fingerprints.kt | 2 +- .../mifitness/misc/locale/Fingerprints.kt | 2 +- .../mifitness/misc/login/Fingerprints.kt | 2 +- .../patches/music/ad/video/Fingerprints.kt | 2 +- .../audio/exclusiveaudio/Fingerprints.kt | 2 +- .../permanentrepeat/Fingerprints.kt | 2 +- .../music/layout/branding/Fingerprints.kt | 2 +- .../music/layout/castbutton/Fingerprints.kt | 4 +-- .../layout/compactheader/Fingerprints.kt | 2 +- .../layout/navigationbar/Fingerprints.kt | 2 +- .../music/layout/premium/Fingerprints.kt | 4 +-- .../music/misc/androidauto/Fingerprints.kt | 2 +- .../misc/backgroundplayback/Fingerprints.kt | 4 +-- .../music/misc/fileprovider/Fingerprints.kt | 2 +- .../patches/music/misc/gms/Fingerprints.kt | 2 +- .../music/misc/settings/Fingerprints.kt | 2 +- .../patches/music/shared/Fingerprints.kt | 2 +- .../myexpenses/misc/pro/Fingerprints.kt | 2 +- .../patches/myfitnesspal/ads/Fingerprints.kt | 4 +-- .../revanced/patches/nunl/ads/Fingerprints.kt | 6 ++-- .../nunl/firebase/SpoofCertificatePatch.kt | 4 +-- .../misc/fix/crash/Fingerprints.kt | 2 +- .../orfon/detection/root/Fingerprints.kt | 2 +- .../patches/pandora/ads/Fingerprints.kt | 4 +-- .../patches/pandora/misc/Fingerprints.kt | 2 +- .../detection/deviceid/Fingerprints.kt | 2 +- .../detection/signature/Fingerprints.kt | 2 +- .../photomath/misc/annoyances/Fingerprints.kt | 2 +- .../misc/unlock/bookpoint/Fingerprints.kt | 2 +- .../misc/unlock/plus/Fingerprints.kt | 2 +- .../patches/piccomafr/misc/Fingerprints.kt | 2 +- .../piccomafr/tracking/Fingerprints.kt | 6 ++-- .../patches/pixiv/ads/Fingerprints.kt | 2 +- .../patches/primevideo/ads/Fingerprints.kt | 4 +-- .../primevideo/video/speed/Fingerprints.kt | 4 +-- .../purchasereminder/Fingerprints.kt | 2 +- .../reddit/ad/comments/Fingerprints.kt | 2 +- .../patches/reddit/ad/general/Fingerprints.kt | 4 +-- .../baconreader/api/Fingerprints.kt | 6 ++-- .../baconreader/fix/redgifs/Fingerprints.kt | 2 +- .../boostforreddit/ads/Fingerprints.kt | 4 +-- .../boostforreddit/api/Fingerprints.kt | 4 +-- .../fix/downloads/Fingerprints.kt | 2 +- .../fix/redgifs/Fingerprints.kt | 2 +- .../boostforreddit/fix/slink/Fingerprints.kt | 4 +-- .../infinityforreddit/api/Fingerprints.kt | 2 +- .../subscription/Fingerprints.kt | 4 +-- .../joeyforreddit/ads/Fingerprints.kt | 2 +- .../joeyforreddit/api/Fingerprints.kt | 4 +-- .../detection/piracy/Fingerprints.kt | 2 +- .../redditisfun/api/Fingerprints.kt | 6 ++-- .../relayforreddit/api/Fingerprints.kt | 12 +++---- .../customclients/slide/api/Fingerprints.kt | 2 +- .../customclients/sync/ads/Fingerprints.kt | 2 +- .../sync/detection/piracy/Fingerprints.kt | 2 +- .../annoyances/startup/Fingerprints.kt | 2 +- .../sync/syncforreddit/api/Fingerprints.kt | 8 ++--- .../syncforreddit/fix/redgifs/Fingerprints.kt | 6 ++-- .../syncforreddit/fix/slink/Fingerprints.kt | 4 +-- .../fix/thumbnail/Fingerprints.kt | 2 +- .../syncforreddit/fix/user/Fingerprints.kt | 12 +++---- .../syncforreddit/fix/video/Fingerprints.kt | 2 +- .../disablescreenshotpopup/Fingerprints.kt | 2 +- .../reddit/layout/premiumicon/Fingerprints.kt | 2 +- .../reddit/misc/tracking/url/Fingerprints.kt | 2 +- .../radio/misc/fix/crash/Fingerprints.kt | 2 +- .../radio/restrictions/device/Fingerprints.kt | 2 +- .../detection/root/Fingerprints.kt | 2 +- .../revanced/patches/shared/Fingerprints.kt | 4 +-- .../shared/layout/branding/Fingerprints.kt | 4 +-- .../shared/layout/theme/Fingerprints.kt | 2 +- .../patches/shared/misc/audio/Fingerprints.kt | 4 +-- .../shared/misc/checks/Fingerprints.kt | 4 +-- .../shared/misc/debugging/Fingerprints.kt | 10 +++--- .../shared/misc/extension/Fingerprints.kt | 2 +- .../misc/extension/SharedExtensionPatch.kt | 5 ++- .../misc/fix/verticalscroll/Fingerprints.kt | 2 +- .../patches/shared/misc/gms/Fingerprints.kt | 8 ++--- .../misc/pairip/license/Fingerprints.kt | 4 +-- .../shared/misc/privacy/Fingerprints.kt | 6 ++-- .../shared/misc/settings/Fingerprints.kt | 4 +-- .../patches/shared/misc/spoof/Fingerprints.kt | 26 +++++++------- .../misc/spoof/SpoofVideoStreamsPatch.kt | 2 +- .../functionality/filesize/Fingerprints.kt | 2 +- .../patches/songpal/badge/Fingerprints.kt | 4 +-- .../patches/soundcloud/ad/Fingerprints.kt | 4 +-- .../soundcloud/analytics/Fingerprints.kt | 2 +- .../soundcloud/offlinesync/Fingerprints.kt | 4 +-- .../patches/soundcloud/shared/Fingerprints.kt | 2 +- .../layout/hide/createbutton/Fingerprints.kt | 6 ++-- .../spotify/layout/theme/Fingerprints.kt | 8 ++--- .../spotify/misc/extension/Fingerprints.kt | 2 +- .../patches/spotify/misc/fix/Fingerprints.kt | 10 +++--- .../spotify/misc/fix/login/Fingerprints.kt | 4 +-- .../misc/lyrics/ChangeLyricsProviderPatch.kt | 2 +- .../spotify/misc/lyrics/Fingerprints.kt | 2 +- .../spotify/misc/privacy/Fingerprints.kt | 8 ++--- .../spotify/misc/widgets/Fingerprints.kt | 2 +- .../patches/spotify/shared/Fingerprints.kt | 2 +- .../strava/subscription/Fingerprints.kt | 2 +- .../patches/strava/upselling/Fingerprints.kt | 2 +- .../swissid/integritycheck/Fingerprints.kt | 2 +- .../ticktick/misc/themeunlock/Fingerprints.kt | 4 +-- .../patches/tiktok/feedfilter/Fingerprints.kt | 4 +-- .../interaction/cleardisplay/Fingerprints.kt | 2 +- .../interaction/downloads/Fingerprints.kt | 8 ++--- .../interaction/seekbar/Fingerprints.kt | 4 +-- .../tiktok/interaction/speed/Fingerprints.kt | 4 +-- .../login/disablerequirement/Fingerprints.kt | 4 +-- .../misc/login/fixgoogle/Fingerprints.kt | 4 +-- .../tiktok/misc/settings/Fingerprints.kt | 10 +++--- .../patches/tiktok/misc/share/Fingerprints.kt | 2 +- .../patches/tiktok/shared/Fingerprints.kt | 4 +-- .../revanced/patches/trakt/Fingerprints.kt | 6 ++-- .../tudortmund/lockscreen/Fingerprints.kt | 2 +- .../annoyances/notifications/Fingerprints.kt | 2 +- .../tumblr/annoyances/popups/Fingerprints.kt | 2 +- .../tumblr/featureflags/Fingerprints.kt | 2 +- .../patches/tumblr/fixes/Fingerprints.kt | 4 +-- .../tumblr/timelinefilter/Fingerprints.kt | 6 ++-- .../patches/twitch/ad/audio/Fingerprints.kt | 2 +- .../twitch/ad/embedded/Fingerprints.kt | 2 +- .../patches/twitch/ad/video/Fingerprints.kt | 6 ++-- .../twitch/chat/antidelete/Fingerprints.kt | 6 ++-- .../twitch/chat/autoclaim/Fingerprints.kt | 2 +- .../patches/twitch/debug/Fingerprints.kt | 6 ++-- .../twitch/misc/settings/Fingerprints.kt | 8 ++--- .../interaction/downloads/Fingerprints.kt | 6 ++-- .../twitter/layout/viewcount/Fingerprints.kt | 2 +- .../twitter/misc/hook/json/Fingerprints.kt | 6 ++-- .../twitter/misc/links/Fingerprints.kt | 10 +++--- .../patches/viber/ads/Fingerprints.kt | 2 +- .../patches/viber/ads/HideAdsPatch.kt | 2 +- .../patches/viber/misc/navbar/Fingerprints.kt | 2 +- .../misc/navbar/HideNavigationButtons.kt | 2 -- .../misc/firebasegetcert/Fingerprints.kt | 4 +-- .../warnwetter/misc/promocode/Fingerprints.kt | 2 +- .../patches/willhaben/ads/Fingerprints.kt | 4 +-- .../youtube/ad/general/Fingerprints.kt | 2 +- .../youtube/ad/getpremium/Fingerprints.kt | 2 +- .../patches/youtube/ad/video/Fingerprints.kt | 2 +- .../interaction/dialog/Fingerprints.kt | 2 +- .../DisableChapterSkipDoubleTapPatch.kt | 2 +- .../interaction/doubletap/Fingerprints.kt | 4 +-- .../interaction/downloads/Fingerprints.kt | 2 +- .../interaction/seekbar/Fingerprints.kt | 22 ++++++------ .../interaction/swipecontrols/Fingerprints.kt | 4 +-- .../layout/autocaptions/Fingerprints.kt | 6 ++-- .../layout/buttons/navigation/Fingerprints.kt | 12 +++---- .../layout/buttons/overlay/Fingerprints.kt | 8 ++--- .../formfactor/ChangeFormFactorPatch.kt | 2 +- .../youtube/layout/formfactor/Fingerprints.kt | 2 +- .../hide/endscreencards/Fingerprints.kt | 8 ++--- .../hide/endscreensuggestion/Fingerprints.kt | 6 ++-- .../fullscreenambientmode/Fingerprints.kt | 2 +- .../layout/hide/general/Fingerprints.kt | 26 +++++++------- .../layout/hide/infocards/Fingerprints.kt | 6 ++-- .../hide/relatedvideooverlay/Fingerprints.kt | 4 +-- .../layout/hide/shorts/Fingerprints.kt | 18 +++++----- .../hide/signintotvpopup/Fingerprints.kt | 2 +- .../youtube/layout/hide/time/Fingerprints.kt | 2 +- .../youtube/layout/miniplayer/Fingerprints.kt | 36 +++++++++---------- .../layout/panels/popup/Fingerprints.kt | 2 +- .../layout/player/fullscreen/Fingerprints.kt | 6 ++-- .../layout/player/overlay/Fingerprints.kt | 2 +- .../returnyoutubedislike/Fingerprints.kt | 24 ++++++------- .../youtube/layout/searchbar/Fingerprints.kt | 4 +-- .../youtube/layout/seekbar/Fingerprints.kt | 28 +++++++-------- .../layout/seekbar/SeekbarColorPatch.kt | 2 +- .../layout/shortsautoplay/Fingerprints.kt | 8 ++--- .../layout/shortsplayer/Fingerprints.kt | 10 +++--- .../layout/sponsorblock/Fingerprints.kt | 8 ++--- .../layout/spoofappversion/Fingerprints.kt | 4 +-- .../youtube/layout/startpage/Fingerprints.kt | 4 +-- .../layout/startupshortsreset/Fingerprints.kt | 6 ++-- .../youtube/layout/theme/Fingerprints.kt | 4 +-- .../misc/backgroundplayback/Fingerprints.kt | 12 +++---- .../youtube/misc/debugging/Fingerprints.kt | 10 +++--- .../misc/dimensions/spoof/Fingerprints.kt | 2 +- .../fix/backtoexitgesture/Fingerprints.kt | 4 +-- .../misc/fix/playbackspeed/Fingerprints.kt | 2 +- .../patches/youtube/misc/gms/Fingerprints.kt | 4 +-- .../misc/hapticfeedback/Fingerprints.kt | 8 ++--- .../youtube/misc/imageurlhook/Fingerprints.kt | 12 +++---- .../youtube/misc/links/Fingerprints.kt | 6 ++-- .../youtube/misc/litho/filter/Fingerprints.kt | 16 ++++----- .../youtube/misc/navigation/Fingerprints.kt | 26 +++++++------- .../misc/playercontrols/Fingerprints.kt | 28 +++++++-------- .../youtube/misc/playertype/Fingerprints.kt | 8 ++--- .../misc/playertype/PlayerTypeHookPatch.kt | 4 +-- .../recyclerviewtree/hook/Fingerprints.kt | 2 +- .../youtube/misc/settings/Fingerprints.kt | 8 ++--- .../patches/youtube/shared/Fingerprints.kt | 24 ++++++------- .../youtube/video/codecs/Fingerprints.kt | 2 +- .../youtube/video/information/Fingerprints.kt | 32 ++++++++--------- .../video/playerresponse/Fingerprints.kt | 12 +++---- .../youtube/video/quality/Fingerprints.kt | 8 ++--- .../video/speed/custom/Fingerprints.kt | 12 +++---- .../video/speed/remember/Fingerprints.kt | 2 +- .../youtube/video/videoid/Fingerprints.kt | 6 ++-- 245 files changed, 594 insertions(+), 599 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt index 35d31a5f9e..1339149f43 100644 --- a/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.amazon import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val deepLinkingFingerprint by fingerprint { +internal val deepLinkingFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE) returns("Z") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt index 12ded4c060..3196adb7e1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/angulus/ads/Fingerprints.kt @@ -11,7 +11,7 @@ import com.android.tools.smali.dexlib2.AccessFlags // This fingerprint targets a method that returns the daily measurement count. // This method is used to determine if the user has reached the daily limit of measurements. -internal val getDailyMeasurementCountFingerprint by fingerprint { +internal val getDailyMeasurementCountFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE) returns("I") strings("dailyMeasurementCount") diff --git a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt index c9eccaea68..15d306bc94 100644 --- a/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.bandcamp.limitations import app.revanced.patcher.fingerprint -internal val handlePlaybackLimitsFingerprint by fingerprint { +internal val handlePlaybackLimitsFingerprint = fingerprint { strings("track_id", "play_count") } diff --git a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt index 6f9c9c2c63..387b0a0be8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.cieid.restrictions.root import app.revanced.patcher.fingerprint -internal val checkRootFingerprint by fingerprint { +internal val checkRootFingerprint = fingerprint { custom { method, _ -> method.name == "onResume" && method.definingClass == "Lit/ipzs/cieid/BaseActivity;" } diff --git a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt index 4a48680994..9dd6844fda 100644 --- a/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/cricbuzz/ads/Fingerprints.kt @@ -3,12 +3,12 @@ package app.revanced.patches.cricbuzz.ads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val userStateSwitchFingerprint by fingerprint { +internal val userStateSwitchFingerprint = fingerprint { opcodes(Opcode.SPARSE_SWITCH) strings("key.user.state", "NA") } -internal val cb11ConstructorFingerprint by fingerprint { +internal val cb11ConstructorFingerprint = fingerprint { parameters( "Ljava/lang/String;", "Ljava/lang/String;", @@ -26,7 +26,7 @@ internal val cb11ConstructorFingerprint by fingerprint { } } -internal val getBottomBarFingerprint by fingerprint { +internal val getBottomBarFingerprint = fingerprint { custom { method, classDef -> method.name == "getBottomBar" && classDef.endsWith("HomeMenu;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt index 6184f77a2a..0266e0344d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/crunchyroll/ads/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.crunchyroll.ads import app.revanced.patcher.fingerprint -internal val videoUrlReadyToStringFingerprint by fingerprint { +internal val videoUrlReadyToStringFingerprint = fingerprint { strings("VideoUrlReady(url=", ", enableAds=") } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt index b7152154c1..6656e66efc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/ad/Fingerprints.kt @@ -4,14 +4,14 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val initializeMonetizationDebugSettingsFingerprint by fingerprint { +internal val initializeMonetizationDebugSettingsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) returns("V") // Parameters have not been reliable for fingerprinting between versions. opcodes(Opcode.IPUT_BOOLEAN) } -internal val monetizationDebugSettingsToStringFingerprint by fingerprint { +internal val monetizationDebugSettingsToStringFingerprint = fingerprint { strings("MonetizationDebugSettings(") // Partial string match. custom { method, _ -> method.name == "toString" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt index 26d7b69617..c3d663c838 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/debug/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val debugCategoryAllowOnReleaseBuildsFingerprint by fingerprint { +internal val debugCategoryAllowOnReleaseBuildsFingerprint = fingerprint { returns("Z") parameters() custom { method, classDef -> @@ -12,13 +12,13 @@ internal val debugCategoryAllowOnReleaseBuildsFingerprint by fingerprint { } } -internal val buildConfigProviderConstructorFingerprint by fingerprint { +internal val buildConfigProviderConstructorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters() opcodes(Opcode.CONST_4) } -internal val buildConfigProviderToStringFingerprint by fingerprint { +internal val buildConfigProviderToStringFingerprint = fingerprint { parameters() returns("Ljava/lang/String;") strings("BuildConfigProvider(") // Partial string match. diff --git a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt index 0fbc9e51b8..73dbcf304c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/duolingo/energy/Fingerprints.kt @@ -7,13 +7,13 @@ import com.android.tools.smali.dexlib2.Opcode /** * Matches the class found in [energyConfigToStringFingerprint]. */ -internal val initializeEnergyConfigFingerprint by fingerprint { +internal val initializeEnergyConfigFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes(Opcode.RETURN_VOID) } // Class name currently is not obfuscated but it may be in the future. -internal val energyConfigToStringFingerprint by fingerprint { +internal val energyConfigToStringFingerprint = fingerprint { parameters() returns("Ljava/lang/String;") strings("EnergyConfig(", "maxEnergy=") // Partial string matches. diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt index 396f44ff05..e84a448baa 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/mainfeed/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val baseModelMapperFingerprint by fingerprint { +internal val baseModelMapperFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Lcom/facebook/graphql/modelutil/BaseModelWithTree;") parameters("Ljava/lang/Class", "I", "I") @@ -17,7 +17,7 @@ internal val baseModelMapperFingerprint by fingerprint { ) } -internal val getSponsoredDataModelTemplateFingerprint by fingerprint { +internal val getSponsoredDataModelTemplateFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() @@ -33,7 +33,7 @@ internal val getSponsoredDataModelTemplateFingerprint by fingerprint { } } -internal val getStoryVisibilityFingerprint by fingerprint { +internal val getStoryVisibilityFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt index 0a93699f01..293d7ee82f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/facebook/ads/story/Fingerprints.kt @@ -3,11 +3,11 @@ package app.revanced.patches.facebook.ads.story import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.iface.value.StringEncodedValue -internal val adsInsertionFingerprint by fieldFingerprint( +internal val adsInsertionFingerprint = fieldFingerprint( fieldValue = "AdBucketDataSourceUtil\$attemptAdsInsertion\$1", ) -internal val fetchMoreAdsFingerprint by fieldFingerprint( +internal val fetchMoreAdsFingerprint = fieldFingerprint( fieldValue = "AdBucketDataSourceUtil\$attemptFetchMoreAds\$1", ) diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt index 2347d1143d..4c8ee1c541 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/bootloader/Fingerprints.kt @@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#isBootStateOk (3.0.1) -internal val bootStateFingerprint by fingerprint { +internal val bootStateFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") opcodes( @@ -30,7 +30,7 @@ internal val bootStateFingerprint by fingerprint { } // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.AttestationHelper#createKey (3.0.1) -internal val createKeyFingerprint by fingerprint { +internal val createKeyFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") strings("attestation", "SHA-256", "random", "EC", "AndroidKeyStore") diff --git a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt index 7460461e43..fec7f1249f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/finanzonline/detection/root/Fingerprints.kt @@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint // Located @ at.gv.bmf.bmf2go.taxequalization.tools.utils.RootDetection#isRooted (3.0.1) -internal val rootDetectionFingerprint by fingerprint { +internal val rootDetectionFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt index 387d1cbf61..8880c010e9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val launchCustomTabFingerprint by fingerprint { +internal val launchCustomTabFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.IPUT_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt index e23ac4bc48..6ddeb3e07f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.googlenews.misc.gms import app.revanced.patcher.fingerprint -internal val magazinesActivityOnCreateFingerprint by fingerprint { +internal val magazinesActivityOnCreateFingerprint = fingerprint { custom { methodDef, classDef -> methodDef.name == "onCreate" && classDef.endsWith("/StartActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt index 0c82cfe15e..71dda1f3ac 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/backup/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.googlephotos.misc.backup import app.revanced.patcher.fingerprint -internal val isDCIMFolderBackupControlDisabled by fingerprint { +internal val isDCIMFolderBackupControlDisabled = fingerprint { returns("Z") strings("/dcim", "/mars_files/") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt index bd63a4a409..95f2a3dba7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.googlephotos.misc.features import app.revanced.patcher.fingerprint -internal val initializeFeaturesEnumFingerprint by fingerprint { +internal val initializeFeaturesEnumFingerprint = fingerprint { strings("com.google.android.apps.photos.NEXUS_PRELOAD") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt index cbd720730a..f47c1a3d94 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.googlephotos.misc.gms import app.revanced.patcher.fingerprint -internal val homeActivityOnCreateFingerprint by fingerprint { +internal val homeActivityOnCreateFingerprint = fingerprint { custom { methodDef, classDef -> methodDef.name == "onCreate" && classDef.endsWith("/HomeActivity;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt index 431ea6c26c..62e1e5f16b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.googlerecorder.restrictions import app.revanced.patcher.fingerprint -internal val onApplicationCreateFingerprint by fingerprint { +internal val onApplicationCreateFingerprint = fingerprint { strings("com.google.android.feature.PIXEL_2017_EXPERIENCE") custom { method, classDef -> if (method.name != "onCreate") return@custom false diff --git a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt index bed5ce6300..2fa2c5b851 100644 --- a/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.hexeditor.ad import app.revanced.patcher.fingerprint -internal val primaryAdsFingerprint by fingerprint { +internal val primaryAdsFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("PreferencesHelper;") && method.name == "isAdsDisabled" } diff --git a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt index fe15366f40..84db554572 100644 --- a/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.iconpackstudio.misc.pro import app.revanced.patcher.fingerprint -internal val checkProFingerprint by fingerprint { +internal val checkProFingerprint = fingerprint { returns("Z") custom { _, classDef -> classDef.endsWith("IPSPurchaseRepository;") } } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/Fingerprints.kt index 48c0f31ff1..38f814f6d4 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.idaustria.detection.root import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val attestationSupportedCheckFingerprint by fingerprint { +internal val attestationSupportedCheckFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") custom { method, classDef -> @@ -12,7 +12,7 @@ internal val attestationSupportedCheckFingerprint by fingerprint { } } -internal val bootloaderCheckFingerprint by fingerprint { +internal val bootloaderCheckFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") custom { method, classDef -> @@ -21,7 +21,7 @@ internal val bootloaderCheckFingerprint by fingerprint { } } -internal val rootCheckFingerprint by fingerprint { +internal val rootCheckFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt index 23e2a12edd..61cd9605f1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.idaustria.detection.signature import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val spoofSignatureFingerprint by fingerprint { +internal val spoofSignatureFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE) returns("L") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt index 151718de57..573bd72e35 100644 --- a/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.inshorts.ad import app.revanced.patcher.fingerprint -internal val inshortsAdsFingerprint by fingerprint { +internal val inshortsAdsFingerprint = fingerprint { returns("V") strings("GoogleAdLoader", "exception in requestAd") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt index 2caadb41ea..dacedb40ed 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/feed/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.instagram.feed import app.revanced.patcher.fingerprint -internal val mainFeedRequestClassFingerprint by fingerprint { +internal val mainFeedRequestClassFingerprint = fingerprint { strings("Request{mReason=", ", mInstanceNumber=") } -internal val mainFeedHeaderMapFinderFingerprint by fingerprint { +internal val mainFeedHeaderMapFinderFingerprint = fingerprint { strings("pagination_source", "FEED_REQUEST_SENT") } 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 3a7033167e..8a5c4222f7 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 @@ -42,7 +42,7 @@ val limitFeedToFollowedProfiles = bytecodePatch( } } - val initMainFeedRequestFingerprint by fingerprint { + val initMainFeedRequestFingerprint = fingerprint { custom { method, classDef -> method.name == "" && classDef == mainFeedRequestClassFingerprint.classDef diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/Fingerprints.kt index a89a762cfe..a85e8eb304 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/explore/Fingerprints.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint internal const val EXPLORE_KEY_TO_BE_HIDDEN = "sectional_items" -internal val exploreResponseJsonParserFingerprint by fingerprint { +internal val exploreResponseJsonParserFingerprint = fingerprint { strings(EXPLORE_KEY_TO_BE_HIDDEN, "ExploreTopicalFeedResponse") custom { method, _ -> method.name == "parseFromJson" } } 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 9546b0eb03..786d9e7398 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 @@ -5,12 +5,12 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.BytecodePatchContext import com.android.tools.smali.dexlib2.AccessFlags -internal val initializeNavigationButtonsListFingerprint by fingerprint { +internal val initializeNavigationButtonsListFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Lcom/instagram/common/session/UserSession;", "Z") returns("Ljava/util/List;") } -internal val navigationButtonsEnumClassDef by fingerprint { +internal val navigationButtonsEnumClassDef = fingerprint { strings("FEED", "fragment_feed", "SEARCH", "fragment_search") } 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 88bd344fb5..c46cd39ad9 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 @@ -53,7 +53,7 @@ val hideNavigationButtonsPatch = bytecodePatch( // Get the field name which contains the name of the enum for the navigation button // ("fragment_clips", "fragment_share", ...) - val navigationButtonsEnumInitFingerprint by fingerprint { + val navigationButtonsEnumInitFingerprint = fingerprint { custom { method, classDef -> method.name == "" && classDef == navigationButtonsEnumClassDef.classDef diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt index 40f6ef5073..b39cd7b83d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/stories/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.instagram.hide.stories import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val getOrCreateAvatarViewFingerprint by fingerprint { +internal val getOrCreateAvatarViewFingerprint = fingerprint { parameters() returns("L") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/Fingerprints.kt index c29cbd2ac8..0f731b4f42 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/hide/suggestions/Fingerprints.kt @@ -12,6 +12,6 @@ internal val FEED_ITEM_KEYS_TO_BE_HIDDEN = arrayOf( "suggested_users", ) -internal val feedItemParseFromJsonFingerprint by fingerprint { +internal val feedItemParseFromJsonFingerprint = fingerprint { strings(*FEED_ITEM_KEYS_TO_BE_HIDDEN, "FeedItem") } 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 2ae7ada3cf..8b84606f00 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 @@ -3,7 +3,7 @@ package app.revanced.patches.instagram.misc.devmenu import app.revanced.patcher.fingerprint -internal val clearNotificationReceiverFingerprint by fingerprint { +internal val clearNotificationReceiverFingerprint = fingerprint { 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/links/Fingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt index 0244bf9cd0..b33d5ace54 100644 --- a/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt +++ b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/links/Fingerprint.kt @@ -3,7 +3,7 @@ import app.revanced.patcher.fingerprint internal const val TARGET_STRING = "Tracking.ARG_CLICK_SOURCE" -internal val inAppBrowserFunctionFingerprint by fingerprint { +internal val inAppBrowserFunctionFingerprint = fingerprint { returns("Z") strings("TrackingInfo.ARG_MODULE_NAME", TARGET_STRING) } 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 177dcf23fb..801ce5693b 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 @@ -3,22 +3,22 @@ package app.revanced.patches.instagram.misc.share import app.revanced.patcher.fingerprint import com.google.common.util.concurrent.Striped.custom -internal val permalinkResponseJsonParserFingerprint by fingerprint { +internal val permalinkResponseJsonParserFingerprint = fingerprint { strings("permalink", "PermalinkResponse") custom { method, _ -> method.name == "parseFromJson" } } -internal val storyUrlResponseJsonParserFingerprint by fingerprint { +internal val storyUrlResponseJsonParserFingerprint = fingerprint { strings("story_item_to_share_url", "StoryItemUrlResponse") custom { method, _ -> method.name == "parseFromJson" } } -internal val profileUrlResponseJsonParserFingerprint by fingerprint { +internal val profileUrlResponseJsonParserFingerprint = fingerprint { strings("profile_to_share_url", "ProfileUrlResponse") custom { method, _ -> method.name == "parseFromJson" } } -internal val liveUrlResponseJsonParserFingerprint by fingerprint { +internal val liveUrlResponseJsonParserFingerprint = fingerprint { 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/Fingerprint.kt b/patches/src/main/kotlin/app/revanced/patches/instagram/misc/share/domain/Fingerprint.kt index 0c4e550fa2..f9fcc85d13 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 @@ -3,7 +3,7 @@ package app.revanced.patches.instagram.misc.share.domain import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val getCustomShareDomainFingerprint by fingerprint { +internal val getCustomShareDomainFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() 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 1890ba252b..47ebe189b3 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 @@ -5,11 +5,11 @@ import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val isValidSignatureClassFingerprint by fingerprint { +internal val isValidSignatureClassFingerprint = fingerprint { strings("The provider for uri '", "' is not trusted: ") } -internal val isValidSignatureMethodFingerprint by fingerprint { +internal val isValidSignatureMethodFingerprint = fingerprint { parameters("L", "Z") returns("Z") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt index 431bbd99a2..80a9d43c78 100644 --- a/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.irplus.ad import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val irplusAdsFingerprint by fingerprint { +internal val irplusAdsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("L", "Z") strings("TAGGED") diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt index aefb36de6f..6345541e14 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isLoggedInFingerprint by fingerprint { +internal val isLoggedInFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) returns("Z") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt index 3d001bb99f..5a00dc68c1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val hasPurchasedFingerprint by fingerprint { +internal val hasPurchasedFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Z") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt index 3914e00b12..0dfbf5cdab 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val licenseValidationFingerprint by fingerprint { +internal val licenseValidationFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("Landroid/content/Context;") diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt index 396e7267d4..40f105525c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val verifySignatureFingerprint by fingerprint { +internal val verifySignatureFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("Landroid/app/Activity;") diff --git a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt index f6faf995af..1f16bb10ec 100644 --- a/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/memegenerator/misc/pro/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isFreeVersionFingerprint by fingerprint { +internal val isFreeVersionFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/Boolean;") parameters("Landroid/content/Context;") diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt index fb5961db24..185c88f94c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/inbox/Fingerprints.kt @@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.value.StringEncodedValue -internal val createInboxSubTabsFingerprint by fingerprint { +internal val createInboxSubTabsFingerprint = fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) opcodes( @@ -22,7 +22,7 @@ internal val createInboxSubTabsFingerprint by fingerprint { } } -internal val loadInboxAdsFingerprint by fingerprint { +internal val loadInboxAdsFingerprint = fingerprint { returns("V") strings( "ads_load_begin", diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt index 0abc4deed5..2abc12367c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/layout/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.messenger.layout import app.revanced.patcher.fingerprint -internal val isFacebookButtonEnabledFingerprint by fingerprint { +internal val isFacebookButtonEnabledFingerprint = fingerprint { parameters() returns("Z") strings("FacebookButtonTabButtonImplementation") diff --git a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt index 414dac30c7..9300efb5cd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.messenger.metaai import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint -internal val getMobileConfigBoolFingerprint by fingerprint { +internal val getMobileConfigBoolFingerprint = fingerprint { parameters("J") returns("Z") opcodes(Opcode.RETURN) @@ -12,12 +12,12 @@ internal val getMobileConfigBoolFingerprint by fingerprint { } } -internal val metaAIKillSwitchCheckFingerprint by fingerprint { +internal val metaAIKillSwitchCheckFingerprint = fingerprint { opcodes(Opcode.CONST_WIDE) strings("SearchAiagentImplementationsKillSwitch") } -internal val extensionMethodFingerprint by fingerprint { +internal val extensionMethodFingerprint = fingerprint { strings("REPLACED_BY_PATCH") custom { method, classDef -> method.name == EXTENSION_METHOD_NAME && classDef.type == EXTENSION_CLASS_DESCRIPTOR diff --git a/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt index a2aca9ef38..95d3359a92 100644 --- a/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.meta.ads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val adInjectorFingerprint by fingerprint { +internal val adInjectorFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE) returns("Z") parameters("L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt index 021e320fcb..14105f762a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.mifitness.misc.locale import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val syncBluetoothLanguageFingerprint by fingerprint { +internal val syncBluetoothLanguageFingerprint = fingerprint { opcodes(Opcode.MOVE_RESULT_OBJECT) custom { method, _ -> method.name == "syncBluetoothLanguage" && diff --git a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt index d3083e8fb9..e3eee24991 100644 --- a/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.mifitness.misc.login import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val xiaomiAccountManagerConstructorFingerprint by fingerprint { +internal val xiaomiAccountManagerConstructorFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) parameters("Landroid/content/Context;", "Z") custom { method, _ -> 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 202a2d8897..6ce0519ada 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 @@ -3,7 +3,7 @@ package app.revanced.patches.music.ad.video import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val showVideoAdsParentFingerprint by fingerprint { +internal val showVideoAdsParentFingerprint = fingerprint { opcodes( Opcode.MOVE_RESULT_OBJECT, Opcode.INVOKE_VIRTUAL, 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 0883a218f2..4ac10dd9bd 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 @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val allowExclusiveAudioPlaybackFingerprint by fingerprint { +internal val allowExclusiveAudioPlaybackFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt index 4ede1cadc3..13820d29d8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val repeatTrackFingerprint by fingerprint { +internal val repeatTrackFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt index c618afd6de..5445e19b17 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/Fingerprints.kt @@ -5,7 +5,7 @@ import app.revanced.patches.music.shared.YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceLiteral -internal val cairoSplashAnimationConfigFingerprint by fingerprint { +internal val cairoSplashAnimationConfigFingerprint = fingerprint { returns("V") parameters("Landroid/os/Bundle;") instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/Fingerprints.kt index 42e7d97a3c..605b7bedba 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/Fingerprints.kt @@ -8,13 +8,13 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import org.stringtemplate.v4.compiler.Bytecode.instructions -internal val mediaRouteButtonFingerprint by fingerprint { +internal val mediaRouteButtonFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Z") strings("MediaRouteButton") } -internal val playerOverlayChipFingerprint by fingerprint { +internal val playerOverlayChipFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") instructions( 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 089faf8f57..76e03d2c99 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 @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint import app.revanced.util.literal -internal val chipCloudFingerprint by fingerprint { +internal val chipCloudFingerprint = fingerprint { returns("V") opcodes( Opcode.CONST, 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 153e9cfd7f..a8409864e7 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 @@ -9,7 +9,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 by fingerprint { +internal val tabLayoutTextFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt index 42dbc6bcbe..29558ab4be 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/premium/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val hideGetPremiumFingerprint by fingerprint { +internal val hideGetPremiumFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -16,7 +16,7 @@ internal val hideGetPremiumFingerprint by fingerprint { strings("FEmusic_history", "FEmusic_offline") } -internal val membershipSettingsFingerprint by fingerprint { +internal val membershipSettingsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/CharSequence;") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt index 30c0ec0cbb..97dea56502 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.misc.androidauto import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val checkCertificateFingerprint by fingerprint { +internal val checkCertificateFingerprint = fingerprint { returns("Z") parameters("Ljava/lang/String;") strings( diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt index 7e408aaa91..e1cf24e1a2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/backgroundplayback/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val backgroundPlaybackDisableFingerprint by fingerprint { +internal val backgroundPlaybackDisableFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L") @@ -21,7 +21,7 @@ internal val backgroundPlaybackDisableFingerprint by fingerprint { ) } -internal val kidsBackgroundPlaybackPolicyControllerFingerprint by fingerprint { +internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "L", "Z") diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt index 2b4cc217dc..16a2d6a58f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/fileprovider/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.utils.fix.fileprovider import app.revanced.patcher.fingerprint -internal val fileProviderResolverFingerprint by fingerprint { +internal val fileProviderResolverFingerprint = fingerprint { returns("L") strings( "android.support.FILE_PROVIDER_PATHS", diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt index 9ad55f01d6..7131e143df 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.misc.gms import app.revanced.patcher.fingerprint -internal val musicActivityOnCreateFingerprint by fingerprint { +internal val musicActivityOnCreateFingerprint = fingerprint { returns("V") parameters("Landroid/os/Bundle;") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/Fingerprints.kt index 589ba1a033..580e6e7679 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/misc/settings/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.misc.settings import app.revanced.patcher.fingerprint -internal val googleApiActivityFingerprint by fingerprint { +internal val googleApiActivityFingerprint = fingerprint { returns("V") parameters("Landroid/os/Bundle;") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/music/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/music/shared/Fingerprints.kt index 3c334e376a..d6c79197d3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/shared/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint internal const val YOUTUBE_MUSIC_MAIN_ACTIVITY_CLASS_TYPE = "Lcom/google/android/apps/youtube/music/activities/MusicActivity;" -internal val mainActivityOnCreateFingerprint by fingerprint { +internal val mainActivityOnCreateFingerprint = fingerprint { returns("V") parameters("Landroid/os/Bundle;") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt index a118f681a4..6bc4c21e5c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.myexpenses.misc.pro import app.revanced.patcher.fingerprint -internal val isEnabledFingerprint by fingerprint { +internal val isEnabledFingerprint = fingerprint { returns("Z") strings("feature", "feature.licenceStatus") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt index 6afea3462f..160e2db274 100644 --- a/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/myfitnesspal/ads/Fingerprints.kt @@ -3,14 +3,14 @@ package app.revanced.patches.myfitnesspal.ads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val isPremiumUseCaseImplFingerprint by fingerprint { +internal val isPremiumUseCaseImplFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) custom { method, classDef -> classDef.endsWith("IsPremiumUseCaseImpl;") && method.name == "doWork" } } -internal val mainActivityNavigateToNativePremiumUpsellFingerprint by fingerprint { +internal val mainActivityNavigateToNativePremiumUpsellFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") custom { method, classDef -> 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 4039558061..109b973e0c 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 @@ -4,14 +4,14 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val jwPlayerConfigFingerprint by fingerprint { +internal val jwPlayerConfigFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) custom { methodDef, classDef -> classDef.type == "Lcom/jwplayer/pub/api/configuration/PlayerConfig${'$'}Builder;" && methodDef.name == "advertisingConfig" } } -internal val screenMapperFingerprint by fingerprint { +internal val screenMapperFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Lnl/nu/android/bff/domain/models/screen/ScreenEntity;") parameters("Lnl/nu/performance/api/client/objects/Screen;") @@ -27,7 +27,7 @@ internal val screenMapperFingerprint by fingerprint { } } -internal val nextPageRepositoryImplFingerprint by fingerprint { +internal val nextPageRepositoryImplFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Lnl/nu/android/bff/domain/models/Page;") parameters("Lnl/nu/performance/api/client/PacResponse;", "Ljava/lang/String;") diff --git a/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/SpoofCertificatePatch.kt b/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/SpoofCertificatePatch.kt index 1e5890a859..65944c4c1f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/SpoofCertificatePatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/nunl/firebase/SpoofCertificatePatch.kt @@ -11,9 +11,7 @@ val spoofCertificatePatch = bytecodePatch( compatibleWith("nl.sanomamedia.android.nu") execute { - getFingerprintHashForPackageFingerprints.forEach { fingerprintBuilder -> - val fingerprint by fingerprintBuilder - + getFingerprintHashForPackageFingerprints.forEach { fingerprint -> fingerprint.method.returnEarly("eae41fc018df2731a9b6ae1ac327da44a288667b") } } diff --git a/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt index 56fcf73d74..69463c510d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.openinghours.misc.fix.crash import app.revanced.patcher.fingerprint -internal val setPlaceFingerprint by fingerprint { +internal val setPlaceFingerprint = fingerprint { returns("V") parameters("Lde/simon/openinghours/models/Place;") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/Fingerprints.kt index 868138661a..525d4f37d2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/orfon/detection/root/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.orfon.detection.root import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val isDeviceRootedFingeprint by fingerprint { +internal val isDeviceRootedFingeprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/pandora/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/pandora/ads/Fingerprints.kt index 9e0a801478..e3f432e16d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pandora/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pandora/ads/Fingerprints.kt @@ -2,13 +2,13 @@ package app.revanced.patches.pandora.ads import app.revanced.patcher.fingerprint -internal val getIsAdSupportedFingerprint by fingerprint { +internal val getIsAdSupportedFingerprint = fingerprint { custom { method, classDef -> method.name == "getIsAdSupported" && classDef.endsWith("UserData;") } } -internal val requestAudioAdFingerprint by fingerprint { +internal val requestAudioAdFingerprint = fingerprint { custom { method, classDef -> method.name == "requestAudioAdFromAdSDK" && classDef.endsWith("ContentServiceOpsImpl;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/pandora/misc/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/pandora/misc/Fingerprints.kt index 4c6e675fca..2a14e0ed1b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pandora/misc/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pandora/misc/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.pandora.misc import app.revanced.patcher.fingerprint -internal val skipLimitBehaviorFingerprint by fingerprint { +internal val skipLimitBehaviorFingerprint = fingerprint { custom { method, classDef -> method.name == "getSkipLimitBehavior" && classDef.endsWith("UserData;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt index d37351f8e2..90c0bbb919 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.photomath.detection.deviceid import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint -internal val getDeviceIdFingerprint by fingerprint { +internal val getDeviceIdFingerprint = fingerprint { returns("Ljava/lang/String;") parameters() opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt index d1b24e5546..c6563270e1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.photomath.detection.signature import com.android.tools.smali.dexlib2.Opcode import app.revanced.patcher.fingerprint -internal val checkSignatureFingerprint by fingerprint { +internal val checkSignatureFingerprint = fingerprint { opcodes( Opcode.CONST_STRING, Opcode.INVOKE_STATIC, diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt index 694573b433..301f2f9a52 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/annoyances/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val hideUpdatePopupFingerprint by fingerprint { +internal val hideUpdatePopupFingerprint = fingerprint { accessFlags(AccessFlags.FINAL, AccessFlags.PUBLIC) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt index d0565792d5..6722f4223e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.photomath.misc.unlock.bookpoint import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isBookpointEnabledFingerprint by fingerprint { +internal val isBookpointEnabledFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt index bc153d400c..a9e9e80447 100644 --- a/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.photomath.misc.unlock.plus import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isPlusUnlockedFingerprint by fingerprint { +internal val isPlusUnlockedFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") strings("genius") diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt index 199cd01af7..8c2d579ef5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.piccomafr.misc import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val getAndroidIdFingerprint by fingerprint { +internal val getAndroidIdFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("Landroid/content/Context;") diff --git a/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt index e757223dd3..83b3e56f43 100644 --- a/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/piccomafr/tracking/Fingerprints.kt @@ -3,18 +3,18 @@ package app.revanced.patches.piccomafr.tracking import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val appMeasurementFingerprint by fingerprint { +internal val appMeasurementFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") strings("config/app/", "Fetching remote configuration") } -internal val facebookSDKFingerprint by fingerprint { +internal val facebookSDKFingerprint = fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings("instagram.com", "facebook.com") } -internal val firebaseInstallFingerprint by fingerprint { +internal val firebaseInstallFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE) strings( "https://%s/%s/%s", diff --git a/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt index 825a834b62..3e2addaa06 100644 --- a/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.pixiv.ads import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val shouldShowAdsFingerprint by fingerprint { +internal val shouldShowAdsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") custom { methodDef, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/Fingerprints.kt index 8af0fc2737..ac3a1c43a5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/primevideo/ads/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val enterServerInsertedAdBreakStateFingerprint by fingerprint { +internal val enterServerInsertedAdBreakStateFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) parameters("Lcom/amazon/avod/fsm/Trigger;") returns("V") @@ -19,7 +19,7 @@ internal val enterServerInsertedAdBreakStateFingerprint by fingerprint { } } -internal val doTriggerFingerprint by fingerprint { +internal val doTriggerFingerprint = fingerprint { accessFlags(AccessFlags.PROTECTED) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/Fingerprints.kt index 4f02360fe7..bd4431d567 100644 --- a/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/primevideo/video/speed/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.primevideo.video.speed import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val playbackUserControlsInitializeFingerprint by fingerprint { +internal val playbackUserControlsInitializeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) parameters("Lcom/amazon/avod/playbackclient/PlaybackInitializationContext;") returns("V") @@ -12,7 +12,7 @@ internal val playbackUserControlsInitializeFingerprint by fingerprint { } } -internal val playbackUserControlsPrepareForPlaybackFingerprint by fingerprint { +internal val playbackUserControlsPrepareForPlaybackFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) parameters("Lcom/amazon/avod/playbackclient/PlaybackContext;") returns("V") diff --git a/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt index d63bbce862..a4d2c9e221 100644 --- a/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.rar.misc.annoyances.purchasereminder import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val showReminderFingerprint by fingerprint { +internal val showReminderFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("V") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt index 91ea04763e..c99df5707a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.ad.comments import app.revanced.patcher.fingerprint -internal val hideCommentAdsFingerprint by fingerprint { +internal val hideCommentAdsFingerprint = fingerprint { strings( "link", // CommentPageRepository is not returning a link object diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt index 93310ce7e9..e7dd789123 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt @@ -3,14 +3,14 @@ package app.revanced.patches.reddit.ad.general import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val adPostFingerprint by fingerprint { +internal val adPostFingerprint = fingerprint { returns("V") // "children" are present throughout multiple versions strings("children") custom { _, classDef -> classDef.endsWith("Listing;") } } -internal val newAdPostFingerprint by fingerprint { +internal val newAdPostFingerprint = fingerprint { opcodes(Opcode.INVOKE_VIRTUAL) strings("chain", "feedElement") custom { _, classDef -> classDef.sourceFile == "AdElementConverter.kt" } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt index b3c0a957b8..bb87c21148 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/api/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.reddit.customclients.baconreader.api import app.revanced.patcher.fingerprint -internal val getAuthorizationUrlFingerprint by fingerprint { +internal val getAuthorizationUrlFingerprint = fingerprint { strings("client_id=zACVn0dSFGdWqQ") } -internal val getClientIdFingerprint by fingerprint { +internal val getClientIdFingerprint = fingerprint { strings("client_id=zACVn0dSFGdWqQ") custom { method, classDef -> if (!classDef.endsWith("RedditOAuth;")) return@custom false @@ -14,6 +14,6 @@ internal val getClientIdFingerprint by fingerprint { } } -internal val requestTokenFingerprint by fingerprint { +internal val requestTokenFingerprint = fingerprint { strings("zACVn0dSFGdWqQ", "kDm2tYpu9DqyWFFyPlNcXGEni4k") // App ID and secret. } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt index 82734e0b17..78ce2c7db3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/baconreader/fix/redgifs/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.customclients.baconreader.fix.redgifs import app.revanced.patcher.fingerprint -internal val getOkHttpClientFingerprint by fingerprint { +internal val getOkHttpClientFingerprint = fingerprint { returns("Lokhttp3/OkHttpClient;") parameters() custom { method, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt index 3462a91942..618e2f1456 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.reddit.customclients.boostforreddit.ads import app.revanced.patcher.fingerprint -internal val maxMediationFingerprint by fingerprint { +internal val maxMediationFingerprint = fingerprint { strings("MaxMediation: Attempting to initialize SDK") } -internal val admobMediationFingerprint by fingerprint { +internal val admobMediationFingerprint = fingerprint { strings("AdmobMediation: Attempting to initialize SDK") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt index a6d4543043..cc06fd3968 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt @@ -2,11 +2,11 @@ package app.revanced.patches.reddit.customclients.boostforreddit.api import app.revanced.patcher.fingerprint -internal val buildUserAgentFingerprint by fingerprint { +internal val buildUserAgentFingerprint = fingerprint { strings("%s:%s:%s (by /u/%s)") } -internal val getClientIdFingerprint by fingerprint { +internal val getClientIdFingerprint = fingerprint { custom { method, classDef -> if (!classDef.endsWith("Credentials;")) return@custom false diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt index f7a3ea815b..a2b1530b8b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.reddit.customclients.boostforreddit.fix.downloads import app.revanced.patcher.fingerprint -internal val downloadAudioFingerprint by fingerprint { +internal val downloadAudioFingerprint = fingerprint { strings("/DASH_audio.mp4", "/audio") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt index bbc71cba99..1f3560d737 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/redgifs/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val createOkHttpClientFingerprint by fingerprint { +internal val createOkHttpClientFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE) opcodes( Opcode.NEW_INSTANCE, diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt index e690af53d9..665dba5a40 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/slink/Fingerprints.kt @@ -3,14 +3,14 @@ package app.revanced.patches.reddit.customclients.boostforreddit.fix.slink import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val getOAuthAccessTokenFingerprint by fingerprint { +internal val getOAuthAccessTokenFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Ljava/lang/String") strings("access_token") custom { method, _ -> method.definingClass == "Lnet/dean/jraw/http/oauth/OAuthData;" } } -internal val handleNavigationFingerprint by fingerprint { +internal val handleNavigationFingerprint = fingerprint { strings( "android.intent.action.SEARCH", "subscription", diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt index 0d7f124f61..4bce1362c2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt @@ -2,6 +2,6 @@ package app.revanced.patches.reddit.customclients.infinityforreddit.api import app.revanced.patcher.fingerprint -internal val apiUtilsFingerprint by fingerprint { +internal val apiUtilsFingerprint = fingerprint { strings("native-lib") } \ No newline at end of file diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt index 22842f81ec..b8999d22c9 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt @@ -3,11 +3,11 @@ package app.revanced.patches.reddit.customclients.infinityforreddit.subscription import app.revanced.patcher.fingerprint import app.revanced.patcher.literal -internal val billingClientOnServiceConnectedFingerprint by fingerprint { +internal val billingClientOnServiceConnectedFingerprint = fingerprint { strings("Billing service connected") } -internal val startSubscriptionActivityFingerprint by fingerprint { +internal val startSubscriptionActivityFingerprint = fingerprint { instructions( literal(0x10008000) // Intent start flag only used in the subscription activity ) diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt index e136d57ec7..465faf1200 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.reddit.customclients.joeyforreddit.ads import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isAdFreeUserFingerprint by fingerprint { +internal val isAdFreeUserFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Z") strings("AD_FREE_USER") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt index c6c5c0abb7..e6c591748c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/api/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val authUtilityUserAgentFingerprint by fingerprint { +internal val authUtilityUserAgentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") opcodes(Opcode.APUT_OBJECT) @@ -13,7 +13,7 @@ internal val authUtilityUserAgentFingerprint by fingerprint { } } -internal val getClientIdFingerprint by fingerprint { +internal val getClientIdFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt index d8ae7417a7..76343a5309 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val piracyDetectionFingerprint by fingerprint { +internal val piracyDetectionFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt index 8eb368f4c2..3144dc775b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/redditisfun/api/Fingerprints.kt @@ -9,15 +9,15 @@ internal fun baseClientIdFingerprint(string: String) = fingerprint { strings("yyOCBp.RHJhDKd", string) } -internal val basicAuthorizationFingerprint by baseClientIdFingerprint( +internal val basicAuthorizationFingerprint = baseClientIdFingerprint( string = "fJOxVwBUyo*=f: if (!classDef.endsWith("Credentials;")) return@custom false diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt index 0290c185be..e055493bdd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.reddit.customclients.sync.ads import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val isAdsEnabledFingerprint by fingerprint { +internal val isAdsEnabledFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") strings("SyncIapHelper") diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt index 46a98af1af..e83e914d75 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/Fingerprints.kt @@ -7,7 +7,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.Reference -internal val piracyDetectionFingerprint by fingerprint { +internal val piracyDetectionFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt index 0e243f97c1..21c788a89c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.annoyances. import app.revanced.patcher.fingerprint -internal val mainActivityOnCreateFingerprint by fingerprint { +internal val mainActivityOnCreateFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("MainActivity;") && method.name == "onCreate" } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt index 41e7d5f928..c7902b1f4d 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt @@ -2,18 +2,18 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.api import app.revanced.patcher.fingerprint -internal val getAuthorizationStringFingerprint by fingerprint { +internal val getAuthorizationStringFingerprint = fingerprint { strings("authorize.compact?client_id") } -internal val getBearerTokenFingerprint by fingerprint { +internal val getBearerTokenFingerprint = fingerprint { strings("Basic") } -internal val getUserAgentFingerprint by fingerprint { +internal val getUserAgentFingerprint = fingerprint { strings("android:com.laurencedawson.reddit_sync") } -internal val imgurImageAPIFingerprint by fingerprint { +internal val imgurImageAPIFingerprint = fingerprint { strings("https://imgur-apiv3.p.rapidapi.com/3/image") } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt index 8c47e97a60..2115308d1b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/redgifs/Fingerprints.kt @@ -10,7 +10,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction11n -internal val createOkHttpClientFingerprint by fingerprint { +internal val createOkHttpClientFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("V") parameters() @@ -26,13 +26,13 @@ internal val createOkHttpClientFingerprint by fingerprint { } } -internal val getDefaultUserAgentFingerprint by fingerprint { +internal val getDefaultUserAgentFingerprint = fingerprint { custom { method, classDef -> method.name == "getDefaultUserAgent" && classDef.type == EXTENSION_CLASS_DESCRIPTOR } } -internal val getOriginalUserAgentFingerprint by fingerprint { +internal val getOriginalUserAgentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt index 641a3e99e1..f7287fcc39 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt @@ -2,11 +2,11 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.slink import app.revanced.patcher.fingerprint -internal val linkHelperOpenLinkFingerprint by fingerprint { +internal val linkHelperOpenLinkFingerprint = fingerprint { strings("Link title: ") } -internal val setAuthorizationHeaderFingerprint by fingerprint { +internal val setAuthorizationHeaderFingerprint = fingerprint { returns("Ljava/util/HashMap;") strings("Authorization", "bearer ") custom { method, _ -> method.definingClass == "Lcom/laurencedawson/reddit_sync/singleton/a;" } diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt index 6ed3118cb1..7a64031f16 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/thumbnail/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.thumbna import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val customImageViewLoadFingerprint by fingerprint { +internal val customImageViewLoadFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) parameters("Ljava/lang/String;", "Z", "Z", "I", "I") custom { _, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt index 94a9adb2ba..4bac74de77 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/user/Fingerprints.kt @@ -9,28 +9,28 @@ internal fun userEndpointFingerprint(source: String, accessFlags: Set diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt index 803192a909..2eac1cbe26 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.layout.premiumicon import app.revanced.patcher.fingerprint -internal val hasPremiumIconAccessFingerprint by fingerprint { +internal val hasPremiumIconAccessFingerprint = fingerprint { returns("Z") custom { method, classDef -> classDef.endsWith("MyAccount;") && method.name == "isPremiumSubscriber" diff --git a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt index b861b79408..3381fd2bb2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.misc.tracking.url import app.revanced.patcher.fingerprint -internal val shareLinkFormatterFingerprint by fingerprint { +internal val shareLinkFormatterFingerprint = fingerprint { custom { _, classDef -> classDef.startsWith("Lcom/reddit/sharing/") && classDef.sourceFile == "UrlUtil.kt" } diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt index cefa1ce32f..41990ae7ce 100644 --- a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/misc/fix/crash/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.samsung.radio.misc.fix.crash import app.revanced.patcher.fingerprint -internal val permissionRequestListFingerprint by fingerprint { +internal val permissionRequestListFingerprint = fingerprint { strings( "android.permission.POST_NOTIFICATIONS", "android.permission.READ_MEDIA_AUDIO", diff --git a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt index e5278adee2..8d90fb5611 100644 --- a/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/samsung/radio/restrictions/device/Fingerprints.kt @@ -6,7 +6,7 @@ import app.revanced.patches.all.misc.transformation.fromMethodReference import app.revanced.util.getReference import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val checkDeviceFingerprint by fingerprint { +internal val checkDeviceFingerprint = fingerprint { returns("Z") custom { method, _ -> /* Check for methods call to: diff --git a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt index f1b352b037..f7efe3103f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.serviceportalbund.detection.root import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val rootDetectionFingerprint by fingerprint { +internal val rootDetectionFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") custom { _, classDef -> diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt index a83f3b1d2c..73347e1fc5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt @@ -3,13 +3,13 @@ package app.revanced.patches.shared import app.revanced.patcher.fingerprint import app.revanced.patcher.string -internal val castContextFetchFingerprint by fingerprint { +internal val castContextFetchFingerprint = fingerprint { instructions( string("Error fetching CastContext.") ) } -internal val primeMethodFingerprint by fingerprint { +internal val primeMethodFingerprint = fingerprint { instructions( string("com.android.vending"), string("com.google.android.GoogleCamera") 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 4a1b9298a5..8e99078d5c 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 @@ -3,7 +3,7 @@ package app.revanced.patches.shared.layout.branding import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val numberOfPresetAppNamesExtensionFingerprint by fingerprint { +internal val numberOfPresetAppNamesExtensionFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("I") parameters() @@ -14,7 +14,7 @@ internal val numberOfPresetAppNamesExtensionFingerprint by 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 by fingerprint { +internal val notificationFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("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 46c2fe658d..692c27b97e 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 @@ -6,7 +6,7 @@ import app.revanced.patcher.methodCall import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val lithoOnBoundsChangeFingerprint by fingerprint { +internal val lithoOnBoundsChangeFingerprint = fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters("Landroid/graphics/Rect;") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt index fa02405c9f..45b34aea9a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/audio/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.literal import com.android.tools.smali.dexlib2.AccessFlags -internal val formatStreamModelToStringFingerprint by fingerprint { +internal val formatStreamModelToStringFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") custom { method, _ -> @@ -17,7 +17,7 @@ internal val formatStreamModelToStringFingerprint by fingerprint { ) } -internal val selectAudioStreamFingerprint by fingerprint { +internal val selectAudioStreamFingerprint = fingerprint { instructions( literal(45666189L) ) diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt index b63e5c04ad..0eabd2f547 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.shared.misc.checks import app.revanced.patcher.fingerprint -internal val patchInfoFingerprint by fingerprint { +internal val patchInfoFingerprint = fingerprint { custom { _, classDef -> classDef.type == "Lapp/revanced/extension/shared/checks/PatchInfo;" } } -internal val patchInfoBuildFingerprint by fingerprint { +internal val patchInfoBuildFingerprint = fingerprint { custom { _, classDef -> classDef.type == "Lapp/revanced/extension/shared/checks/PatchInfo\$Build;" } } diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt index f24048eb8a..6f183dd087 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/debugging/Fingerprints.kt @@ -3,32 +3,32 @@ package app.revanced.patches.shared.misc.debugging import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val experimentalFeatureFlagParentFingerprint by fingerprint { +internal val experimentalFeatureFlagParentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L", "J", "[B") strings("Unable to parse proto typed experiment flag: ") } -internal val experimentalBooleanFeatureFlagFingerprint by fingerprint { +internal val experimentalBooleanFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L", "J", "Z") } -internal val experimentalDoubleFeatureFlagFingerprint by fingerprint { +internal val experimentalDoubleFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("D") parameters("J", "D") } -internal val experimentalLongFeatureFlagFingerprint by fingerprint { +internal val experimentalLongFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("J") parameters("J", "J") } -internal val experimentalStringFeatureFlagFingerprint by fingerprint { +internal val experimentalStringFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("J", "Ljava/lang/String;") diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt index b61a6763da..58cc5082f1 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.shared.misc.extension import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val revancedUtilsPatchesVersionFingerprint by fingerprint { +internal val revancedUtilsPatchesVersionFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt index 907c612c3c..b4dcd66583 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/SharedExtensionPatch.kt @@ -2,8 +2,8 @@ package app.revanced.patches.shared.misc.extension import app.revanced.patcher.Fingerprint import app.revanced.patcher.FingerprintBuilder -import app.revanced.patcher.FingerprintDelegate import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.BytecodePatchContext import app.revanced.patcher.patch.bytecodePatch import app.revanced.util.returnEarly @@ -112,8 +112,7 @@ fun extensionHook( contextRegisterResolver: BytecodePatchContext.(Method) -> String = { "p0" }, fingerprintBuilderBlock: FingerprintBuilder.() -> Unit, ) = { - val fingerprint by FingerprintDelegate(block = fingerprintBuilderBlock) - ExtensionHook(fingerprint, insertIndexResolver, contextRegisterResolver) + ExtensionHook(fingerprint(block = fingerprintBuilderBlock), insertIndexResolver, contextRegisterResolver) } /** 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 8b784b2db6..80d041ada8 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 @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val canScrollVerticallyFingerprint by fingerprint { +internal val canScrollVerticallyFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() 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 02ba6c0503..e85f902bc4 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 @@ -3,7 +3,7 @@ package app.revanced.patches.shared.misc.gms import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val googlePlayUtilityFingerprint by fingerprint { +internal val googlePlayUtilityFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("I") parameters("L", "I") @@ -14,14 +14,14 @@ internal val googlePlayUtilityFingerprint by fingerprint { ) } -internal val serviceCheckFingerprint by fingerprint { +internal val serviceCheckFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("V") parameters("L", "I") strings("Google Play Services not available") } -internal val gmsCoreSupportFingerprint by fingerprint { +internal val gmsCoreSupportFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() @@ -30,7 +30,7 @@ internal val gmsCoreSupportFingerprint by fingerprint { } } -internal val originalPackageNameExtensionFingerprint by fingerprint { +internal val originalPackageNameExtensionFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() 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 509c99336c..344fd02dab 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 @@ -2,14 +2,14 @@ package app.revanced.patches.shared.misc.pairip.license import app.revanced.patcher.fingerprint -internal val processLicenseResponseFingerprint by fingerprint { +internal val processLicenseResponseFingerprint = fingerprint { custom { method, classDef -> classDef.type == "Lcom/pairip/licensecheck/LicenseClient;" && method.name == "processResponse" } } -internal val validateLicenseResponseFingerprint by fingerprint { +internal val validateLicenseResponseFingerprint = fingerprint { custom { method, classDef -> classDef.type == "Lcom/pairip/licensecheck/ResponseValidator;" && method.name == "validateResponse" diff --git a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/Fingerprints.kt index f549ffc56c..832ac71080 100644 --- a/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/shared/misc/privacy/Fingerprints.kt @@ -8,7 +8,7 @@ import app.revanced.patcher.opcode import app.revanced.patcher.string import com.android.tools.smali.dexlib2.Opcode -internal val youTubeCopyTextFingerprint by fingerprint { +internal val youTubeCopyTextFingerprint = fingerprint { returns("V") parameters("L", "Ljava/util/Map;") instructions( @@ -26,7 +26,7 @@ internal val youTubeCopyTextFingerprint by fingerprint { ) } -internal val youTubeSystemShareSheetFingerprint by fingerprint { +internal val youTubeSystemShareSheetFingerprint = fingerprint { returns("V") parameters("L", "Ljava/util/Map;") instructions( @@ -52,7 +52,7 @@ internal val youTubeSystemShareSheetFingerprint by fingerprint { ) } -internal val youTubeShareSheetFingerprint by fingerprint { +internal val youTubeShareSheetFingerprint = fingerprint { returns("V") parameters("L", "Ljava/util/Map;") instructions( 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 9d0fbb5d14..cad00d8dea 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patches.shared.misc.extension.EXTENSION_CLASS_DESCRIPTOR import com.android.tools.smali.dexlib2.AccessFlags -internal val themeLightColorResourceNameFingerprint by fingerprint { +internal val themeLightColorResourceNameFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() @@ -13,7 +13,7 @@ internal val themeLightColorResourceNameFingerprint by fingerprint { } } -internal val themeDarkColorResourceNameFingerprint by fingerprint { +internal val themeDarkColorResourceNameFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters() 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 18bef477df..894a51fb7b 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 @@ -11,7 +11,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 buildInitPlaybackRequestFingerprint by fingerprint { +internal val buildInitPlaybackRequestFingerprint = fingerprint { returns("Lorg/chromium/net/UrlRequest\$Builder;") opcodes( Opcode.MOVE_RESULT_OBJECT, @@ -23,7 +23,7 @@ internal val buildInitPlaybackRequestFingerprint by fingerprint { ) } -internal val buildPlayerRequestURIFingerprint by fingerprint { +internal val buildPlayerRequestURIFingerprint = fingerprint { returns("Ljava/lang/String;") opcodes( Opcode.INVOKE_VIRTUAL, // Register holds player request URI. @@ -39,7 +39,7 @@ internal val buildPlayerRequestURIFingerprint by fingerprint { ) } -internal val buildRequestFingerprint by fingerprint { +internal val buildRequestFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Lorg/chromium/net/UrlRequest") // UrlRequest; or UrlRequest$Builder; instructions( @@ -83,7 +83,7 @@ internal val buildRequestFingerprint by fingerprint { } } -internal val protobufClassParseByteBufferFingerprint by fingerprint { +internal val protobufClassParseByteBufferFingerprint = fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.STATIC) returns("L") parameters("L", "Ljava/nio/ByteBuffer;") @@ -96,7 +96,7 @@ internal val protobufClassParseByteBufferFingerprint by fingerprint { custom { method, _ -> method.name == "parseFrom" } } -internal val createStreamingDataFingerprint by fingerprint { +internal val createStreamingDataFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("L") opcodes( @@ -113,7 +113,7 @@ internal val createStreamingDataFingerprint by fingerprint { } } -internal val buildMediaDataSourceFingerprint by fingerprint { +internal val buildMediaDataSourceFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters( "Landroid/net/Uri;", @@ -129,7 +129,7 @@ internal val buildMediaDataSourceFingerprint by fingerprint { ) } -internal val hlsCurrentTimeFingerprint by fingerprint { +internal val hlsCurrentTimeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Z", "L") instructions( @@ -139,7 +139,7 @@ internal val hlsCurrentTimeFingerprint by fingerprint { internal const val DISABLED_BY_SABR_STREAMING_URI_STRING = "DISABLED_BY_SABR_STREAMING_URI" -internal val mediaFetchEnumConstructorFingerprint by fingerprint { +internal val mediaFetchEnumConstructorFingerprint = fingerprint { returns("V") strings( "ENABLED", @@ -148,7 +148,7 @@ internal val mediaFetchEnumConstructorFingerprint by fingerprint { ) } -internal val nerdsStatsVideoFormatBuilderFingerprint by fingerprint { +internal val nerdsStatsVideoFormatBuilderFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/String;") parameters("L") @@ -157,7 +157,7 @@ internal val nerdsStatsVideoFormatBuilderFingerprint by fingerprint { ) } -internal val patchIncludedExtensionMethodFingerprint by fingerprint { +internal val patchIncludedExtensionMethodFingerprint = fingerprint { returns("Z") parameters() custom { method, classDef -> @@ -169,7 +169,7 @@ internal val patchIncludedExtensionMethodFingerprint by fingerprint { // This code appears to replace the player config after the streams are loaded. // Flag is present in YouTube 19.34, but is missing Platypus stream replacement code until 19.43. // Flag and Platypus code is also present in newer versions of YouTube Music. -internal val mediaFetchHotConfigFingerprint by fingerprint { +internal val mediaFetchHotConfigFingerprint = fingerprint { instructions( literal(45645570L) ) @@ -177,7 +177,7 @@ internal val mediaFetchHotConfigFingerprint by fingerprint { // YT 20.10+, YT Music 8.11 - 8.14. // Flag is missing in YT Music 8.15+, and it is not known if a replacement flag/feature exists. -internal val mediaFetchHotConfigAlternativeFingerprint by fingerprint { +internal val mediaFetchHotConfigAlternativeFingerprint = fingerprint { instructions( literal(45683169L) ) @@ -187,7 +187,7 @@ internal val mediaFetchHotConfigAlternativeFingerprint by fingerprint { // but it's exact purpose is not known. If this flag is enabled while stream spoofing // then videos will never start playback and load forever. // Flag does not seem to affect playback if spoofing is off. -internal val playbackStartDescriptorFeatureFlagFingerprint by fingerprint { +internal val playbackStartDescriptorFeatureFlagFingerprint = fingerprint { parameters() returns("Z") instructions( 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 d08282c677..f8a823b959 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 @@ -297,7 +297,7 @@ internal fun spoofVideoStreamsPatch( ) } - val sabrFingerprint by fingerprint { + val sabrFingerprint = fingerprint { returns(mediaFetchEnumClass) opcodes( Opcode.SGET_OBJECT, diff --git a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt index 3b03634434..0e81d7e592 100644 --- a/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.solidexplorer2.functionality.filesize import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val onReadyFingerprint by fingerprint { +internal val onReadyFingerprint = fingerprint { opcodes( Opcode.CONST_WIDE_32, // Constant storing the 2MB limit Opcode.CMP_LONG, 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 48ef210a78..c52174f2c5 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 @@ -8,7 +8,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 by fingerprint { +internal val createTabsFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE) returns("Ljava/util/List;") custom { method, _ -> @@ -26,7 +26,7 @@ internal val createTabsFingerprint by fingerprint { } // Located @ com.sony.songpal.mdr.vim.activity.MdrRemoteBaseActivity.e#run (9.5.0) -internal val showNotificationFingerprint by fingerprint { +internal val showNotificationFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt index f6f442306f..827a48baaf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/ad/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val interceptFingerprint by fingerprint { +internal val interceptFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("L") parameters("L") @@ -16,7 +16,7 @@ internal val interceptFingerprint by fingerprint { strings("SC-Mob-UserPlan", "Configuration") } -internal val userConsumerPlanConstructorFingerprint by fingerprint { +internal val userConsumerPlanConstructorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters( "Ljava/lang/String;", diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt index 1b18832b71..2954b4d99c 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.soundcloud.analytics import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val createTrackingApiFingerprint by fingerprint { +internal val createTrackingApiFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("L") custom { methodDef, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt index fe2aab19a5..688fe36044 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/offlinesync/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val downloadOperationsURLBuilderFingerprint by fingerprint { +internal val downloadOperationsURLBuilderFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String") parameters("L", "L") @@ -15,7 +15,7 @@ internal val downloadOperationsURLBuilderFingerprint by fingerprint { ) } -internal val downloadOperationsHeaderVerificationFingerprint by fingerprint { +internal val downloadOperationsHeaderVerificationFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L") diff --git a/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt index 646bb929a7..ffea10a919 100644 --- a/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val featureConstructorFingerprint by fingerprint { +internal val featureConstructorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Ljava/lang/String;", "Z", "Ljava/util/List;") opcodes( diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt index 44af138410..d9235b8c80 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt @@ -8,12 +8,12 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Deprecated("Obsolete") -internal val navigationBarItemSetClassFingerprint by fingerprint { +internal val navigationBarItemSetClassFingerprint = fingerprint { strings("NavigationBarItemSet(") } @Deprecated("Obsolete") -internal val navigationBarItemSetConstructorFingerprint by fingerprint { +internal val navigationBarItemSetConstructorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) // Make sure the method checks whether navigation bar items are null before adding them. // If this is not true, then we cannot patch the method and potentially transform the parameters into null. @@ -26,6 +26,6 @@ internal val navigationBarItemSetConstructorFingerprint by fingerprint { } @Deprecated("Obsolete") -internal val oldNavigationBarAddItemFingerprint by fingerprint { +internal val oldNavigationBarAddItemFingerprint = fingerprint { strings("Bottom navigation tabs exceeds maximum of 5 tabs") } 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 5de56ca826..eb3ab78391 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 @@ -4,21 +4,21 @@ import app.revanced.patcher.fingerprint import app.revanced.util.containsLiteralInstruction import com.android.tools.smali.dexlib2.AccessFlags -internal val colorSpaceUtilsClassFingerprint by fingerprint { +internal val colorSpaceUtilsClassFingerprint = fingerprint { strings("The specified color must be encoded in an RGB color space.") // Partial string match. } -internal val convertArgbToRgbaFingerprint by fingerprint { +internal val convertArgbToRgbaFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) returns("J") parameters("J") } -internal val parseLottieJsonFingerprint by fingerprint { +internal val parseLottieJsonFingerprint = fingerprint { strings("Unsupported matte type: ") } -internal val parseAnimatedColorFingerprint by fingerprint { +internal val parseAnimatedColorFingerprint = fingerprint { parameters("L", "F") returns("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 7133e16de6..13b6094d32 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 @@ -2,6 +2,6 @@ package app.revanced.patches.spotify.misc.extension import app.revanced.patcher.fingerprint -internal val loadOrbitLibraryFingerprint by fingerprint { +internal val loadOrbitLibraryFingerprint = fingerprint { strings("OrbitLibraryLoader", "cst") } diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt index 177157ab1f..4bb51b5bc2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt @@ -8,11 +8,11 @@ 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 loadOrbitLibraryFingerprint by fingerprint { +internal val loadOrbitLibraryFingerprint = fingerprint { strings("/liborbit-jni-spotify.so") } -internal val setClientIdFingerprint by fingerprint { +internal val setClientIdFingerprint = fingerprint { parameters("Ljava/lang/String;") custom { method, classDef -> classDef.type == "Lcom/spotify/connectivity/ApplicationScopeConfiguration;" @@ -20,7 +20,7 @@ internal val setClientIdFingerprint by fingerprint { } } -internal val setUserAgentFingerprint by fingerprint { +internal val setUserAgentFingerprint = fingerprint { parameters("Ljava/lang/String;") custom { method, classDef -> classDef.type == "Lcom/spotify/connectivity/ApplicationScopeConfiguration;" @@ -28,11 +28,11 @@ internal val setUserAgentFingerprint by fingerprint { } } -internal val extensionFixConstantsFingerprint by fingerprint { +internal val extensionFixConstantsFingerprint = fingerprint { custom { _, classDef -> classDef.type == "Lapp/revanced/extension/spotify/misc/fix/Constants;" } } -internal val runIntegrityVerificationFingerprint by fingerprint { +internal val runIntegrityVerificationFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") opcodes( 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 8548ece446..be6b4165a1 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 @@ -4,11 +4,11 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.literal import app.revanced.util.literal -internal val katanaProxyLoginMethodHandlerClassFingerprint by fingerprint { +internal val katanaProxyLoginMethodHandlerClassFingerprint = fingerprint { strings("katana_proxy_auth") } -internal val katanaProxyLoginMethodTryAuthorizeFingerprint by fingerprint { +internal val katanaProxyLoginMethodTryAuthorizeFingerprint = fingerprint { strings("e2e") literal { 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 501e0b8097..2b6a5cf587 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 @@ -94,7 +94,7 @@ val changeLyricsProviderPatch = bytecodePatch( // region Replace the call to the HTTP client builder method used exclusively for lyrics by the modified one. - val getLyricsHttpClientFingerprint by fingerprint { + val getLyricsHttpClientFingerprint = fingerprint { returns(httpClientBuilderMethod.returnType) parameters() custom { method, _ -> 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 b0ca654162..f55fc349f4 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 @@ -5,7 +5,7 @@ import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -internal val httpClientBuilderFingerprint by fingerprint { +internal val httpClientBuilderFingerprint = fingerprint { 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 e6fabc4c9c..a84aa699bf 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 @@ -5,7 +5,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val shareCopyUrlFingerprint by fingerprint { +internal val shareCopyUrlFingerprint = fingerprint { returns("Ljava/lang/Object;") parameters("Ljava/lang/Object;") strings("clipboard", "Spotify Link") @@ -14,7 +14,7 @@ internal val shareCopyUrlFingerprint by fingerprint { } } -internal val oldShareCopyUrlFingerprint by fingerprint { +internal val oldShareCopyUrlFingerprint = fingerprint { returns("Ljava/lang/Object;") parameters("Ljava/lang/Object;") strings("clipboard", "createNewSession failed") @@ -23,7 +23,7 @@ internal val oldShareCopyUrlFingerprint by fingerprint { } } -internal val formatAndroidShareSheetUrlFingerprint by fingerprint { +internal val formatAndroidShareSheetUrlFingerprint = fingerprint { returns("Ljava/lang/String;") parameters("L", "Ljava/lang/String;") opcodes( @@ -38,7 +38,7 @@ internal val formatAndroidShareSheetUrlFingerprint by fingerprint { } } -internal val oldFormatAndroidShareSheetUrlFingerprint by fingerprint { +internal val oldFormatAndroidShareSheetUrlFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("Ljava/lang/String;") parameters("Lcom/spotify/share/social/sharedata/ShareData;", "Ljava/lang/String;") 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 81bcb2412a..3566512e84 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 @@ -3,7 +3,7 @@ package app.revanced.patches.spotify.misc.widgets import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val canBindAppWidgetPermissionFingerprint by fingerprint { +internal val canBindAppWidgetPermissionFingerprint = fingerprint { strings("android.permission.BIND_APPWIDGET") opcodes(Opcode.AND_INT_LIT8) } 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 658b3a9ef3..103f47750a 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 @@ -5,7 +5,7 @@ import com.android.tools.smali.dexlib2.AccessFlags private const val SPOTIFY_MAIN_ACTIVITY = "Lcom/spotify/music/SpotifyMainActivity;" -internal val mainActivityOnCreateFingerprint by fingerprint { +internal val mainActivityOnCreateFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/os/Bundle;") diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt index 58047cc4cf..0458f45d3e 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.strava.subscription import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val getSubscribedFingerprint by fingerprint { +internal val getSubscribedFingerprint = fingerprint { opcodes(Opcode.IGET_BOOLEAN) custom { method, classDef -> classDef.endsWith("/SubscriptionDetailResponse;") && method.name == "getSubscribed" diff --git a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt index 134c108692..1204a36f21 100644 --- a/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.strava.upselling import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val getModulesFingerprint by fingerprint { +internal val getModulesFingerprint = fingerprint { opcodes(Opcode.IGET_OBJECT) custom { method, classDef -> classDef.endsWith("/GenericLayoutEntry;") && method.name == "getModules" diff --git a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt index 6e55bd5f41..0efa845fbe 100644 --- a/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.swissid.integritycheck import app.revanced.patcher.fingerprint -internal val checkIntegrityFingerprint by fingerprint { +internal val checkIntegrityFingerprint = fingerprint { returns("V") parameters("Lcom/swisssign/deviceintegrity/model/DeviceIntegrityResult;") strings("it", "result") 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 e198d21b18..4bd688de49 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 @@ -2,13 +2,13 @@ package app.revanced.patches.ticktick.misc.themeunlock import app.revanced.patcher.fingerprint -internal val checkLockedThemesFingerprint by fingerprint { +internal val checkLockedThemesFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("Theme;") && method.name == "isLockedTheme" } } -internal val setThemeFingerprint by fingerprint { +internal val setThemeFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("ThemePreviewActivity;") && method.name == "lambda\$updateUserBtn\$1" } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt index 32cf50f13e..f85dd2d072 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/feedfilter/Fingerprints.kt @@ -4,13 +4,13 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val feedApiServiceLIZFingerprint by fingerprint { +internal val feedApiServiceLIZFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("/FeedApiService;") && method.name == "fetchFeedList" } } -internal val followFeedFingerprint by fingerprint { +internal val followFeedFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Lcom/ss/android/ugc/aweme/follow/presenter/FollowFeedList;") strings("getFollowFeedList") diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt index 43aab883c0..eb28683743 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.tiktok.interaction.cleardisplay import app.revanced.patcher.fingerprint -internal val onClearDisplayEventFingerprint by fingerprint { +internal val onClearDisplayEventFingerprint = fingerprint { custom { method, classDef -> // Internally the feature is called "Clear mode". classDef.endsWith("/ClearModePanelComponent;") && method.name == "onClearModeEvent" diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt index 5ab0efbbb6..160b49c158 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/downloads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.tiktok.interaction.downloads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val aclCommonShareFingerprint by fingerprint { +internal val aclCommonShareFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") custom { method, classDef -> @@ -12,7 +12,7 @@ internal val aclCommonShareFingerprint by fingerprint { } } -internal val aclCommonShare2Fingerprint by fingerprint { +internal val aclCommonShare2Fingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") custom { method, classDef -> @@ -21,7 +21,7 @@ internal val aclCommonShare2Fingerprint by fingerprint { } } -internal val aclCommonShare3Fingerprint by fingerprint { +internal val aclCommonShare3Fingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") custom { method, classDef -> @@ -30,7 +30,7 @@ internal val aclCommonShare3Fingerprint by fingerprint { } } -internal val downloadUriFingerprint by fingerprint { +internal val downloadUriFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Landroid/net/Uri;") parameters( diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt index 66fef7177f..ce372ea421 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt @@ -2,10 +2,10 @@ package app.revanced.patches.tiktok.interaction.seekbar import app.revanced.patcher.fingerprint -internal val setSeekBarShowTypeFingerprint by fingerprint { +internal val setSeekBarShowTypeFingerprint = fingerprint { strings("seekbar show type change, change to:") } -internal val shouldShowSeekBarFingerprint by fingerprint { +internal val shouldShowSeekBarFingerprint = fingerprint { strings("can not show seekbar, state: 1, not in resume") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt index ab224a1cca..221036bb96 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt @@ -3,13 +3,13 @@ package app.revanced.patches.tiktok.interaction.speed import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val getSpeedFingerprint by fingerprint { +internal val getSpeedFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("/BaseListFragmentPanel;") && method.name == "onFeedSpeedSelectedEvent" } } -internal val setSpeedFingerprint by fingerprint { +internal val setSpeedFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("V") parameters("Ljava/lang/String;", "Lcom/ss/android/ugc/aweme/feed/model/Aweme;", "F") 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 439f63862b..929ef86729 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 @@ -2,14 +2,14 @@ package app.revanced.patches.tiktok.misc.login.disablerequirement import app.revanced.patcher.fingerprint -internal val mandatoryLoginServiceFingerprint by fingerprint { +internal val mandatoryLoginServiceFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("/MandatoryLoginService;") && method.name == "enableForcedLogin" } } -internal val mandatoryLoginService2Fingerprint by fingerprint { +internal val mandatoryLoginService2Fingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("/MandatoryLoginService;") && method.name == "shouldShowForcedLogin" diff --git a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt index 19d045db01..a40f5251f5 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/fixgoogle/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.tiktok.misc.login.fixgoogle import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val googleAuthAvailableFingerprint by fingerprint { +internal val googleAuthAvailableFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -12,7 +12,7 @@ internal val googleAuthAvailableFingerprint by fingerprint { } } -internal val googleOneTapAuthAvailableFingerprint by fingerprint { +internal val googleOneTapAuthAvailableFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() 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 4317948c41..d1c4d6de68 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 @@ -2,32 +2,32 @@ package app.revanced.patches.tiktok.misc.settings import app.revanced.patcher.fingerprint -internal val addSettingsEntryFingerprint by fingerprint { +internal val addSettingsEntryFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("/SettingNewVersionFragment;") && method.name == "initUnitManger" } } -internal val adPersonalizationActivityOnCreateFingerprint by fingerprint { +internal val adPersonalizationActivityOnCreateFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("/AdPersonalizationActivity;") && method.name == "onCreate" } } -internal val settingsEntryFingerprint by fingerprint { +internal val settingsEntryFingerprint = fingerprint { strings("pls pass item or extends the EventUnit") } -internal val settingsEntryInfoFingerprint by fingerprint { +internal val settingsEntryInfoFingerprint = fingerprint { strings( "ExposeItem(title=", ", icon=", ) } -internal val settingsStatusLoadFingerprint by fingerprint { +internal val settingsStatusLoadFingerprint = fingerprint { 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/share/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt index 38e8946c12..836be89006 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tiktok/misc/share/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val urlShorteningFingerprint by fingerprint { +internal val urlShorteningFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) returns("LX/") parameters( 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 508d469645..3e98d213e5 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getEnterFromFingerprint by fingerprint { +internal val getEnterFromFingerprint = fingerprint { returns("Ljava/lang/String;") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Z") @@ -22,7 +22,7 @@ internal val getEnterFromFingerprint by fingerprint { } } -internal val onRenderFirstFrameFingerprint by fingerprint { +internal val onRenderFirstFrameFingerprint = fingerprint { strings("method_enable_viewpager_preload_duration") custom { _, classDef -> classDef.endsWith("/BaseListFragmentPanel;") diff --git a/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt index 0d985d88c7..4a02c62215 100644 --- a/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.trakt import app.revanced.patcher.fingerprint -internal val isVIPEPFingerprint by fingerprint { +internal val isVIPEPFingerprint = fingerprint { custom { method, classDef -> if (!classDef.endsWith("RemoteUser;")) return@custom false @@ -10,7 +10,7 @@ internal val isVIPEPFingerprint by fingerprint { } } -internal val isVIPFingerprint by fingerprint { +internal val isVIPFingerprint = fingerprint { custom { method, classDef -> if (!classDef.endsWith("RemoteUser;")) return@custom false @@ -18,7 +18,7 @@ internal val isVIPFingerprint by fingerprint { } } -internal val remoteUserFingerprint by fingerprint { +internal val remoteUserFingerprint = fingerprint { custom { _, classDef -> classDef.endsWith("RemoteUser;") } 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 0cd634ee1b..12ffa15c15 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 @@ -3,7 +3,7 @@ package app.revanced.patches.tudortmund.lockscreen import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint -internal val brightnessFingerprint by fingerprint { +internal val brightnessFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("V") parameters() 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 525f5a5e74..67e051a7ba 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 @@ -6,6 +6,6 @@ import app.revanced.patcher.fingerprint // 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 by fingerprint { +internal val isBlogNotifyEnabledFingerprint = fingerprint { strings("isEnabled --> ", "blog_notify_enabled") } diff --git a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt index 2be1a3cefb..7d00f2f1bd 100644 --- a/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt @@ -4,7 +4,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import app.revanced.patcher.fingerprint // This method is responsible for loading and displaying the visual Layout of the Gift Message Popup. -internal val showGiftMessagePopupFingerprint by fingerprint { +internal val showGiftMessagePopupFingerprint = fingerprint { accessFlags(AccessFlags.FINAL, AccessFlags.PUBLIC) returns("V") strings("activity", "anchorView", "textMessage") 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 742a8fd4d2..e24ca2884a 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 @@ -13,7 +13,7 @@ import app.revanced.patcher.fingerprint // 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 by fingerprint { +internal val getFeatureValueFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("L", "Z") 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 8d9f4cfd3d..11616fcc92 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 @@ -6,7 +6,7 @@ import app.revanced.patcher.fingerprint // 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 by fingerprint { +internal val addQueryParamFingerprint = fingerprint { parameters("Ljava/lang/String;", "Ljava/lang/String;", "Z") strings("Malformed URL. Base: ", ", Relative: ") } @@ -14,7 +14,7 @@ internal val addQueryParamFingerprint by 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 by fingerprint { +internal val httpPathParserFingerprint = fingerprint { opcodes( Opcode.IPUT_OBJECT, Opcode.IPUT_BOOLEAN, 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 75be30004a..b8ed3bfc4e 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 @@ -6,7 +6,7 @@ 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 by fingerprint { +internal val postsResponseConstructorFingerprint = fingerprint { accessFlags(AccessFlags.CONSTRUCTOR, AccessFlags.PUBLIC) custom { method, classDef -> classDef.endsWith("/PostsResponse;") && method.parameters.size == 4 } } @@ -14,7 +14,7 @@ internal val postsResponseConstructorFingerprint by 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 by fingerprint { +internal val timelineConstructorFingerprint = fingerprint { strings("timelineObjectsList") custom { method, classDef -> classDef.endsWith("/Timeline;") && method.parameters[0].type == "Ljava/util/List;" @@ -24,7 +24,7 @@ internal val timelineConstructorFingerprint by 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 by fingerprint { +internal val timelineFilterExtensionFingerprint = fingerprint { opcodes( Opcode.CONST_STRING, // "BLOCKED_OBJECT_DUMMY" Opcode.INVOKE_VIRTUAL, // HashSet.add(^) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt index 3bae02166c..21e9cb6d2a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitch.ad.audio import app.revanced.patcher.fingerprint -internal val audioAdsPresenterPlayFingerprint by fingerprint { +internal val audioAdsPresenterPlayFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("AudioAdsPlayerPresenter;") && method.name == "playAd" } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt index 209f91d2b2..3e9853bd61 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitch.ad.embedded import app.revanced.patcher.fingerprint -internal val createsUsherClientFingerprint by fingerprint { +internal val createsUsherClientFingerprint = fingerprint { custom { method, _ -> method.name == "buildOkHttpClient" && method.definingClass.endsWith("Ltv/twitch/android/network/OkHttpClientFactory;") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt index 4bd8abb2a0..d03449733f 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/ad/video/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitch.ad.video import app.revanced.patcher.fingerprint -internal val checkAdEligibilityLambdaFingerprint by fingerprint { +internal val checkAdEligibilityLambdaFingerprint = fingerprint { returns("Lio/reactivex/Single;") parameters("L") custom { method, _ -> @@ -11,7 +11,7 @@ internal val checkAdEligibilityLambdaFingerprint by fingerprint { } } -internal val contentConfigShowAdsFingerprint by fingerprint { +internal val contentConfigShowAdsFingerprint = fingerprint { returns("Z") parameters() custom { method, _ -> @@ -19,7 +19,7 @@ internal val contentConfigShowAdsFingerprint by fingerprint { } } -internal val getReadyToShowAdFingerprint by fingerprint { +internal val getReadyToShowAdFingerprint = fingerprint { returns("Ltv/twitch/android/core/mvp/presenter/StateAndAction;") parameters("L", "L") custom { method, _ -> diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt index 04ef723432..a656e34a54 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/antidelete/Fingerprints.kt @@ -3,20 +3,20 @@ package app.revanced.patches.twitch.chat.antidelete import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val chatUtilCreateDeletedSpanFingerprint by fingerprint { +internal val chatUtilCreateDeletedSpanFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("ChatUtil\$Companion;") && method.name == "createDeletedSpanFromChatMessageSpan" } } -internal val deletedMessageClickableSpanCtorFingerprint by fingerprint { +internal val deletedMessageClickableSpanCtorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) custom { _, classDef -> classDef.endsWith("DeletedMessageClickableSpan;") } } -internal val setHasModAccessFingerprint by fingerprint { +internal val setHasModAccessFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("DeletedMessageClickableSpan;") && method.name == "setHasModAccess" } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt index 59986152c0..80abc9ac41 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitch.chat.autoclaim import app.revanced.patcher.fingerprint -internal val communityPointsButtonViewDelegateFingerprint by fingerprint { +internal val communityPointsButtonViewDelegateFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("CommunityPointsButtonViewDelegate;") && method.name == "showClaimAvailable" diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt index 49a8601f26..665180c19b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/debug/Fingerprints.kt @@ -2,19 +2,19 @@ package app.revanced.patches.twitch.debug import app.revanced.patcher.fingerprint -internal val isDebugConfigEnabledFingerprint by fingerprint { +internal val isDebugConfigEnabledFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("/BuildConfigUtil;") && method.name == "isDebugConfigEnabled" } } -internal val isOmVerificationEnabledFingerprint by fingerprint { +internal val isOmVerificationEnabledFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("/BuildConfigUtil;") && method.name == "isOmVerificationEnabled" } } -internal val shouldShowDebugOptionsFingerprint by fingerprint { +internal val shouldShowDebugOptionsFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("/BuildConfigUtil;") && method.name == "shouldShowDebugOptions" } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt index f39c762e94..43d5bb39bf 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitch/misc/settings/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.twitch.misc.settings import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val menuGroupsOnClickFingerprint by fingerprint { +internal val menuGroupsOnClickFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC, AccessFlags.FINAL) returns("V") parameters("L", "L", "L") @@ -13,21 +13,21 @@ internal val menuGroupsOnClickFingerprint by fingerprint { } } -internal val menuGroupsUpdatedFingerprint by fingerprint { +internal val menuGroupsUpdatedFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("/SettingsMenuPresenter\$Event\$MenuGroupsUpdated;") && method.name == "" } } -internal val settingsActivityOnCreateFingerprint by fingerprint { +internal val settingsActivityOnCreateFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("/SettingsActivity;") && method.name == "onCreate" } } -internal val settingsMenuItemEnumFingerprint by fingerprint { +internal val settingsMenuItemEnumFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("/SettingsMenuItem;") && method.name == "" } 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 b01f75081f..623926102e 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val buildMediaOptionsSheetFingerprint by fingerprint { +internal val buildMediaOptionsSheetFingerprint = fingerprint { opcodes( Opcode.IF_EQ, Opcode.SGET_OBJECT, @@ -14,12 +14,12 @@ internal val buildMediaOptionsSheetFingerprint by fingerprint { strings("mediaEntity", "media_options_sheet") } -internal val constructMediaOptionsSheetFingerprint by fingerprint { +internal val constructMediaOptionsSheetFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) strings("captionsState") } -internal val showDownloadVideoUpsellBottomSheetFingerprint by fingerprint { +internal val showDownloadVideoUpsellBottomSheetFingerprint = fingerprint { returns("Z") strings("mediaEntity", "url") opcodes(Opcode.IF_EQZ) diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt index 199ef49c2a..625b6f0bb7 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.twitter.layout.viewcount import app.revanced.patcher.fingerprint -internal val viewCountsEnabledFingerprint by fingerprint { +internal val viewCountsEnabledFingerprint = fingerprint { returns("Z") strings("view_counts_public_visibility_enabled") } diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt index 1158df15d5..337aeb5670 100644 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/json/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.twitter.misc.hook.json import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.Opcode -internal val jsonHookPatchFingerprint by fingerprint { +internal val jsonHookPatchFingerprint = fingerprint { opcodes( Opcode.INVOKE_INTERFACE, // Add dummy hook to hooks list. // Add hooks to the hooks list. @@ -12,7 +12,7 @@ internal val jsonHookPatchFingerprint by fingerprint { custom { method, _ -> method.name == "" } } -internal val jsonInputStreamFingerprint by fingerprint { +internal val jsonInputStreamFingerprint = fingerprint { custom { method, _ -> if (method.parameterTypes.isEmpty()) { false @@ -22,6 +22,6 @@ internal val jsonInputStreamFingerprint by fingerprint { } } -internal val loganSquareFingerprint by fingerprint { +internal val loganSquareFingerprint = fingerprint { custom { _, classDef -> classDef.endsWith("LoganSquare;") } } 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 c013683afc..6117798ebf 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 @@ -3,24 +3,24 @@ package app.revanced.patches.twitter.misc.links import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val openLinkFingerprint by fingerprint { +internal val openLinkFingerprint = fingerprint { returns("V") parameters("Landroid/content/Context;", "Landroid/content/Intent;", "Landroid/os/Bundle;") } -internal val sanitizeSharingLinksFingerprint by fingerprint { +internal val sanitizeSharingLinksFingerprint = fingerprint { returns("Ljava/lang/String;") strings("", "shareParam", "sessionToken") } // Returns a shareable link string based on a tweet ID and a username. -internal val linkBuilderFingerprint by fingerprint { +internal val linkBuilderFingerprint = fingerprint { 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 by fingerprint { +internal val linkResourceGetterFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Landroid/content/res/Resources;") custom { _, classDef -> @@ -30,7 +30,7 @@ internal val linkResourceGetterFingerprint by fingerprint { } } -internal val linkSharingDomainHelperFingerprint by fingerprint { +internal val linkSharingDomainHelperFingerprint = fingerprint { custom { method, classDef -> method.name == "getShareDomain" && classDef.type == EXTENSION_CLASS_DESCRIPTOR } 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 93fd578d55..29b752cf84 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 @@ -2,6 +2,6 @@ package app.revanced.patches.viber.ads import app.revanced.patcher.fingerprint -internal val findAdStringFingerprint by fingerprint { +internal val findAdStringFingerprint = fingerprint { 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 1bbd719722..b9e3b64ce4 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 @@ -29,7 +29,7 @@ val hideAdsPatch = bytecodePatch( val targetClass = method.getInstruction(typeRefIndex).reference as TypeReference // Patch the ads-free method to always return true - val adFreeFingerprint by fingerprint { + val adFreeFingerprint = fingerprint { returns("I") parameters() custom { method, classDef -> 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 3969425dff..2f2a7bda3d 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 @@ -2,7 +2,7 @@ package app.revanced.patches.viber.misc.navbar import app.revanced.patcher.fingerprint import app.revanced.patcher.patch.BytecodePatchContext -internal val tabIdClassFingerprint by fingerprint { +internal val tabIdClassFingerprint = fingerprint { strings("shouldShowTabId") } diff --git a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt index 5e69076216..c439810b8b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt +++ b/patches/src/main/kotlin/app/revanced/patches/viber/misc/navbar/HideNavigationButtons.kt @@ -5,7 +5,6 @@ import app.revanced.patcher.patch.booleanOption import app.revanced.patcher.patch.bytecodePatch import app.revanced.patches.shared.PATCH_NAME_HIDE_NAVIGATION_BUTTONS import java.util.logging.Logger -import kotlin.collections.joinToString @Suppress("unused") val hideNavigationButtonsPatch = bytecodePatch( @@ -46,7 +45,6 @@ val hideNavigationButtonsPatch = bytecodePatch( nop """ - val shouldShowTabIdMethodFingerprint by shouldShowTabIdMethodFingerprint shouldShowTabIdMethodFingerprint.method .addInstructionsWithLabels(0, injectionInstructions) } diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt index 03ff60e0c0..6eb7bd176b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.warnwetter.misc.firebasegetcert import app.revanced.patcher.fingerprint -internal val getMessagingCertFingerprint by fingerprint { +internal val getMessagingCertFingerprint = fingerprint { returns("Ljava/lang/String;") strings( "ContentValues", @@ -11,7 +11,7 @@ internal val getMessagingCertFingerprint by fingerprint { ) } -internal val getRegistrationCertFingerprint by fingerprint { +internal val getRegistrationCertFingerprint = fingerprint { returns("Ljava/lang/String;") strings( "FirebaseRemoteConfig", diff --git a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt index 0249856381..d33880de70 100644 --- a/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt @@ -2,7 +2,7 @@ package app.revanced.patches.warnwetter.misc.promocode import app.revanced.patcher.fingerprint -internal val promoCodeUnlockFingerprint by fingerprint { +internal val promoCodeUnlockFingerprint = fingerprint { custom { method, classDef -> classDef.endsWith("PromoTokenVerification;") && method.name == "isValid" } diff --git a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt index 19fdb02d85..e326c26825 100644 --- a/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/willhaben/ads/Fingerprints.kt @@ -3,7 +3,7 @@ package app.revanced.patches.willhaben.ads import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val adResolverFingerprint by fingerprint { +internal val adResolverFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L", "L") @@ -15,7 +15,7 @@ internal val adResolverFingerprint by fingerprint { ) } -internal val whAdViewInjectorFingerprint by fingerprint { +internal val whAdViewInjectorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L", "L", "Z") 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 8091108cfc..254b440f39 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 @@ -8,7 +8,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 by fingerprint { +internal val fullScreenEngagementAdContainerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() 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 284567fec7..7629d1760d 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getPremiumViewFingerprint by fingerprint { +internal val getPremiumViewFingerprint = fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters("I", "I") 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 2ccd68aa4b..de155fbb29 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 @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.ad.video import app.revanced.patcher.fingerprint -internal val loadVideoAdsFingerprint by fingerprint { +internal val loadVideoAdsFingerprint = fingerprint { 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/interaction/dialog/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/interaction/dialog/Fingerprints.kt index d590b0c93f..ad44f3ca3a 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 @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.interaction.dialog import app.revanced.patcher.fingerprint import app.revanced.patcher.methodCall -internal val createDialogFingerprint by fingerprint { +internal val createDialogFingerprint = fingerprint { returns("V") parameters("L", "L", "Ljava/lang/String;") instructions( 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 0f415b5248..c008c64372 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 @@ -40,7 +40,7 @@ val disableDoubleTapActionsPatch = bytecodePatch( SwitchPreference("revanced_disable_chapter_skip_double_tap"), ) - val doubleTapInfoGetSeekSourceFingerprint by fingerprint { + val doubleTapInfoGetSeekSourceFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Z") returns(seekTypeEnumFingerprint.originalClassDef.type) 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 759dcd3dfb..4524a68534 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 @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.interaction.doubletap import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val seekTypeEnumFingerprint by fingerprint { +internal val seekTypeEnumFingerprint = fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "SEEK_SOURCE_SEEK_TO_NEXT_CHAPTER", @@ -11,7 +11,7 @@ internal val seekTypeEnumFingerprint by fingerprint { ) } -internal val doubleTapInfoCtorFingerprint by fingerprint { +internal val doubleTapInfoCtorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters( "Landroid/view/MotionEvent;", 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 abd9a1e125..bf31e036be 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags -internal val offlineVideoEndpointFingerprint by fingerprint { +internal val offlineVideoEndpointFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters( 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 e8a74ee4f7..b80c68b26a 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 @@ -18,7 +18,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.StringReference -internal val swipingUpGestureParentFingerprint by fingerprint { +internal val swipingUpGestureParentFingerprint = fingerprint { returns("Z") parameters() instructions( @@ -29,7 +29,7 @@ internal val swipingUpGestureParentFingerprint by fingerprint { /** * Resolves using the class found in [swipingUpGestureParentFingerprint]. */ -internal val showSwipingUpGuideFingerprint by fingerprint { +internal val showSwipingUpGuideFingerprint = fingerprint { accessFlags(AccessFlags.FINAL) returns("Z") parameters() @@ -41,13 +41,13 @@ internal val showSwipingUpGuideFingerprint by fingerprint { /** * Resolves using the class found in [swipingUpGestureParentFingerprint]. */ -internal val allowSwipingUpGestureFingerprint by fingerprint { +internal val allowSwipingUpGestureFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") } -internal val disableFastForwardLegacyFingerprint by fingerprint { +internal val disableFastForwardLegacyFingerprint = fingerprint { returns("Z") parameters() opcodes(Opcode.MOVE_RESULT) @@ -55,7 +55,7 @@ internal val disableFastForwardLegacyFingerprint by fingerprint { literal {45411330} } -internal val disableFastForwardGestureFingerprint by fingerprint { +internal val disableFastForwardGestureFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -70,7 +70,7 @@ internal val disableFastForwardGestureFingerprint by fingerprint { } } -internal val customTapAndHoldFingerprint by fingerprint { +internal val customTapAndHoldFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -90,7 +90,7 @@ internal val customTapAndHoldFingerprint by fingerprint { } } -internal val onTouchEventHandlerFingerprint by fingerprint { +internal val onTouchEventHandlerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.PUBLIC) returns("Z") parameters("L") @@ -113,7 +113,7 @@ internal val onTouchEventHandlerFingerprint by fingerprint { custom { method, _ -> method.name == "onTouchEvent" } } -internal val seekbarTappingFingerprint by fingerprint { +internal val seekbarTappingFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters("Landroid/view/MotionEvent;") @@ -131,7 +131,7 @@ internal val seekbarTappingFingerprint by fingerprint { custom { method, _ -> method.name == "onTouchEvent" } } -internal val slideToSeekFingerprint by fingerprint { +internal val slideToSeekFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;", "F") @@ -144,7 +144,7 @@ internal val slideToSeekFingerprint by fingerprint { literal { 67108864 } } -internal val fullscreenSeekbarThumbnailsQualityFingerprint by fingerprint { +internal val fullscreenSeekbarThumbnailsQualityFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -153,7 +153,7 @@ internal val fullscreenSeekbarThumbnailsQualityFingerprint by fingerprint { ) } -internal val fullscreenLargeSeekbarFeatureFlagFingerprint by fingerprint { +internal val fullscreenLargeSeekbarFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() 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 2c7dc336b6..9c6eae324d 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.literal import com.android.tools.smali.dexlib2.AccessFlags -internal val swipeControlsHostActivityFingerprint by fingerprint { +internal val swipeControlsHostActivityFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters() custom { method, _ -> @@ -12,7 +12,7 @@ internal val swipeControlsHostActivityFingerprint by fingerprint { } } -internal val swipeChangeVideoFingerprint by fingerprint { +internal val swipeChangeVideoFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( literal(45631116L) // Swipe to change fullscreen video feature flag. 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 3ecbb437e5..c657b72ec2 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val startVideoInformerFingerprint by fingerprint { +internal val startVideoInformerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") opcodes( @@ -14,14 +14,14 @@ internal val startVideoInformerFingerprint by fingerprint { strings("pc") } -internal val storyboardRendererDecoderRecommendedLevelFingerprint by fingerprint { +internal val storyboardRendererDecoderRecommendedLevelFingerprint = fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("L") strings("#-1#") } -internal val subtitleTrackFingerprint by fingerprint { +internal val subtitleTrackFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() 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 4fdae0652d..7e27980263 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 @@ -8,7 +8,7 @@ import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val addCreateButtonViewFingerprint by fingerprint { +internal val addCreateButtonViewFingerprint = fingerprint { instructions( string("Android Wear"), opcode(Opcode.IF_EQZ), @@ -16,7 +16,7 @@ internal val addCreateButtonViewFingerprint by fingerprint { ) } -internal val createPivotBarFingerprint by fingerprint { +internal val createPivotBarFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters( "Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;", @@ -29,7 +29,7 @@ internal val createPivotBarFingerprint by fingerprint { ) } -internal val animatedNavigationTabsFeatureFlagFingerprint by fingerprint { +internal val animatedNavigationTabsFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( @@ -37,7 +37,7 @@ internal val animatedNavigationTabsFeatureFlagFingerprint by fingerprint { ) } -internal val translucentNavigationStatusBarFeatureFlagFingerprint by fingerprint { +internal val translucentNavigationStatusBarFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( @@ -48,7 +48,7 @@ internal val translucentNavigationStatusBarFeatureFlagFingerprint by fingerprint /** * YouTube nav buttons. */ -internal val translucentNavigationButtonsFeatureFlagFingerprint by fingerprint { +internal val translucentNavigationButtonsFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( @@ -59,7 +59,7 @@ internal val translucentNavigationButtonsFeatureFlagFingerprint by fingerprint { /** * Device on screen back/home/recent buttons. */ -internal val translucentNavigationButtonsSystemFeatureFlagFingerprint by fingerprint { +internal val translucentNavigationButtonsSystemFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt index 128ce0e967..bec02d7566 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/buttons/overlay/Fingerprints.kt @@ -7,28 +7,28 @@ import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags -internal val mediaRouteButtonFingerprint by fingerprint { +internal val mediaRouteButtonFingerprint = fingerprint { parameters("I") custom { methodDef, _ -> methodDef.definingClass.endsWith("/MediaRouteButton;") && methodDef.name == "setVisibility" } } -internal val castButtonPlayerFeatureFlagFingerprint by fingerprint { +internal val castButtonPlayerFeatureFlagFingerprint = fingerprint { returns("Z") instructions( literal(45690091) ) } -internal val castButtonActionFeatureFlagFingerprint by fingerprint { +internal val castButtonActionFeatureFlagFingerprint = fingerprint { returns("Z") instructions( literal(45690090) ) } -internal val inflateControlsGroupLayoutStubFingerprint by fingerprint { +internal val inflateControlsGroupLayoutStubFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() returns("V") 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 4b7fbda4b8..d24da1daca 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 @@ -47,7 +47,7 @@ val changeFormFactorPatch = bytecodePatch( hookNavigationButtonCreated(EXTENSION_CLASS_DESCRIPTOR) - val createPlayerRequestBodyWithModelFingerprint by fingerprint { + val createPlayerRequestBodyWithModelFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() 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 6ffedaf77a..457d19116e 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 @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.layout.formfactor import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val formFactorEnumConstructorFingerprint by fingerprint { +internal val formFactorEnumConstructorFingerprint = fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "UNKNOWN_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 69ff8a2670..79fa1b269a 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 @@ -9,7 +9,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 by fingerprint { +internal val layoutCircleFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() returns("Landroid/view/View;") @@ -23,7 +23,7 @@ internal val layoutCircleFingerprint by fingerprint { literal { layoutCircle } } -internal val layoutIconFingerprint by fingerprint { +internal val layoutIconFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() returns("Landroid/view/View;") @@ -36,7 +36,7 @@ internal val layoutIconFingerprint by fingerprint { literal { layoutIcon } } -internal val layoutVideoFingerprint by fingerprint { +internal val layoutVideoFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) parameters() returns("Landroid/view/View;") @@ -50,7 +50,7 @@ internal val layoutVideoFingerprint by fingerprint { literal { layoutVideo } } -internal val showEndscreenCardsFingerprint by fingerprint { +internal val showEndscreenCardsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") 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 97641725fe..887963e56e 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 @@ -7,19 +7,19 @@ 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 by fingerprint { +internal val autoNavConstructorFingerprint = fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) strings("main_app_autonav") } -internal val autoNavStatusFingerprint by fingerprint { +internal val autoNavStatusFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() } -internal val removeOnLayoutChangeListenerFingerprint by fingerprint { +internal val removeOnLayoutChangeListenerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() 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 fff4d86218..b619020878 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 @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.layout.hide.fullscreenambientmode import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val setFullScreenBackgroundColorFingerprint by fingerprint { +internal val setFullScreenBackgroundColorFingerprint = fingerprint { returns("V") accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) parameters("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 b8376c5299..2739096b48 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 @@ -15,7 +15,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * 20.26+ */ -internal val hideShowMoreButtonFingerprint by fingerprint { +internal val hideShowMoreButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL, AccessFlags.SYNTHETIC) returns("V") parameters("L", "Ljava/lang/Object;") @@ -26,7 +26,7 @@ internal val hideShowMoreButtonFingerprint by fingerprint { ) } -internal val hideShowMoreLegacyButtonFingerprint by fingerprint { +internal val hideShowMoreLegacyButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( resourceLiteral(ResourceType.LAYOUT, "expand_button_down"), @@ -35,7 +35,7 @@ internal val hideShowMoreLegacyButtonFingerprint by fingerprint { ) } -internal val parseElementFromBufferFingerprint by fingerprint { +internal val parseElementFromBufferFingerprint = fingerprint { parameters("L", "L", "[B", "L", "L") instructions( opcode(Opcode.IGET_OBJECT), @@ -46,7 +46,7 @@ internal val parseElementFromBufferFingerprint by fingerprint { ) } -internal val playerOverlayFingerprint by fingerprint { +internal val playerOverlayFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") instructions( @@ -54,7 +54,7 @@ internal val playerOverlayFingerprint by fingerprint { ) } -internal val showWatermarkFingerprint by fingerprint { +internal val showWatermarkFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L") @@ -63,7 +63,7 @@ internal val showWatermarkFingerprint by fingerprint { /** * Matches same method as [wideSearchbarLayoutFingerprint]. */ -internal val yoodlesImageViewFingerprint by fingerprint { +internal val yoodlesImageViewFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") parameters("L", "L") @@ -72,7 +72,7 @@ internal val yoodlesImageViewFingerprint by fingerprint { ) } -internal val crowdfundingBoxFingerprint by fingerprint { +internal val crowdfundingBoxFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.INVOKE_VIRTUAL, @@ -82,7 +82,7 @@ internal val crowdfundingBoxFingerprint by fingerprint { literal { crowdfundingBoxId } } -internal val albumCardsFingerprint by fingerprint { +internal val albumCardsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.MOVE_RESULT_OBJECT, @@ -95,7 +95,7 @@ internal val albumCardsFingerprint by fingerprint { literal { albumCardId } } -internal val filterBarHeightFingerprint by fingerprint { +internal val filterBarHeightFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.CONST, @@ -106,7 +106,7 @@ internal val filterBarHeightFingerprint by fingerprint { literal { filterBarHeightId } } -internal val relatedChipCloudFingerprint by fingerprint { +internal val relatedChipCloudFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.CONST, @@ -116,7 +116,7 @@ internal val relatedChipCloudFingerprint by fingerprint { literal { relatedChipCloudMarginId } } -internal val searchResultsChipBarFingerprint by fingerprint { +internal val searchResultsChipBarFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.CONST, @@ -128,7 +128,7 @@ internal val searchResultsChipBarFingerprint by fingerprint { literal { barContainerHeightId } } -internal val showFloatingMicrophoneButtonFingerprint by fingerprint { +internal val showFloatingMicrophoneButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -139,7 +139,7 @@ internal val showFloatingMicrophoneButtonFingerprint by fingerprint { ) } -internal val hideViewCountFingerprint by fingerprint { +internal val hideViewCountFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Ljava/lang/CharSequence;") 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 6b1b09d585..e9432aa83d 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 @@ -6,7 +6,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val infocardsIncognitoFingerprint by fingerprint { +internal val infocardsIncognitoFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/Boolean;") parameters("L", "J") @@ -15,7 +15,7 @@ internal val infocardsIncognitoFingerprint by fingerprint { ) } -internal val infocardsIncognitoParentFingerprint by fingerprint { +internal val infocardsIncognitoParentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") instructions( @@ -23,7 +23,7 @@ internal val infocardsIncognitoParentFingerprint by fingerprint { ) } -internal val infocardsMethodCallFingerprint by fingerprint { +internal val infocardsMethodCallFingerprint = fingerprint { opcodes( Opcode.INVOKE_VIRTUAL, Opcode.IGET_OBJECT, 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 0db3338098..15ae61df1d 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 @@ -4,14 +4,14 @@ import app.revanced.patcher.fingerprint import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceLiteral -internal val relatedEndScreenResultsParentFingerprint by fingerprint { +internal val relatedEndScreenResultsParentFingerprint = fingerprint { returns("V") instructions( resourceLiteral(ResourceType.LAYOUT, "app_related_endscreen_results") ) } -internal val relatedEndScreenResultsFingerprint by fingerprint { +internal val relatedEndScreenResultsFingerprint = fingerprint { returns("V") parameters( "I", 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 557fb9b544..312c9a561c 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 @@ -10,7 +10,7 @@ import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val shortsBottomBarContainerFingerprint by fingerprint { +internal val shortsBottomBarContainerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;", "Landroid/os/Bundle;") @@ -25,7 +25,7 @@ internal val shortsBottomBarContainerFingerprint by fingerprint { /** * 19.41 to 20.44. */ -internal val renderBottomNavigationBarFingerprint by fingerprint { +internal val renderBottomNavigationBarFingerprint = fingerprint { returns("V") parameters("Ljava/lang/String;") instructions( @@ -46,7 +46,7 @@ internal val renderBottomNavigationBarFingerprint by fingerprint { /** * Less than 19.41. */ -internal val legacyRenderBottomNavigationBarLegacyParentFingerprint by fingerprint { +internal val legacyRenderBottomNavigationBarLegacyParentFingerprint = fingerprint { parameters( "I", "I", @@ -64,7 +64,7 @@ internal val legacyRenderBottomNavigationBarLegacyParentFingerprint by fingerpri * Identical to [legacyRenderBottomNavigationBarLegacyParentFingerprint] * except this has an extra parameter. */ -internal val renderBottomNavigationBarLegacy1941ParentFingerprint by fingerprint { +internal val renderBottomNavigationBarLegacy1941ParentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters( "I", @@ -80,7 +80,7 @@ internal val renderBottomNavigationBarLegacy1941ParentFingerprint by fingerprint ) } -internal val renderBottomNavigationBarParentFingerprint by fingerprint { +internal val renderBottomNavigationBarParentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("[Ljava/lang/Class;") parameters( @@ -93,7 +93,7 @@ internal val renderBottomNavigationBarParentFingerprint by fingerprint { ) } -internal val setPivotBarVisibilityFingerprint by fingerprint { +internal val setPivotBarVisibilityFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Z") @@ -103,14 +103,14 @@ internal val setPivotBarVisibilityFingerprint by fingerprint { ) } -internal val setPivotBarVisibilityParentFingerprint by fingerprint { +internal val setPivotBarVisibilityParentFingerprint = fingerprint { parameters("Z") instructions( string("FEnotifications_inbox") ) } -internal val shortsExperimentalPlayerFeatureFlagFingerprint by fingerprint { +internal val shortsExperimentalPlayerFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -119,7 +119,7 @@ internal val shortsExperimentalPlayerFeatureFlagFingerprint by fingerprint { ) } -internal val renderNextUIFeatureFlagFingerprint by fingerprint { +internal val renderNextUIFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() 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 ad973642c3..aabcdc4e5b 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceLiteral -internal val signInToTvPopupFingerprint by fingerprint { +internal val signInToTvPopupFingerprint = fingerprint { returns("Z") parameters("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 4e4526f7fa..11469ceb58 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 @@ -7,7 +7,7 @@ import app.revanced.patcher.opcode import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val timeCounterFingerprint by fingerprint { +internal val timeCounterFingerprint = fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() 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 2a264a35b5..e4f1e72c14 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 @@ -24,14 +24,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 by fingerprint { +internal val miniplayerModernConstructorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( literal(45623000L) // Magic number found in the constructor. ) } -internal val miniplayerDimensionsCalculatorParentFingerprint by fingerprint { +internal val miniplayerDimensionsCalculatorParentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") @@ -40,7 +40,7 @@ internal val miniplayerDimensionsCalculatorParentFingerprint by fingerprint { ) } -internal val miniplayerModernViewParentFingerprint by fingerprint { +internal val miniplayerModernViewParentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() @@ -52,7 +52,7 @@ internal val miniplayerModernViewParentFingerprint by fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernAddViewListenerFingerprint by fingerprint { +internal val miniplayerModernAddViewListenerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;") @@ -61,7 +61,7 @@ internal val miniplayerModernAddViewListenerFingerprint by fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernCloseButtonFingerprint by fingerprint { +internal val miniplayerModernCloseButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() @@ -74,7 +74,7 @@ internal val miniplayerModernCloseButtonFingerprint by fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernExpandButtonFingerprint by fingerprint { +internal val miniplayerModernExpandButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() @@ -87,7 +87,7 @@ internal val miniplayerModernExpandButtonFingerprint by fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernExpandCloseDrawablesFingerprint by fingerprint { +internal val miniplayerModernExpandCloseDrawablesFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") @@ -99,7 +99,7 @@ internal val miniplayerModernExpandCloseDrawablesFingerprint by fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernForwardButtonFingerprint by fingerprint { +internal val miniplayerModernForwardButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() @@ -109,7 +109,7 @@ internal val miniplayerModernForwardButtonFingerprint by fingerprint { ) } -internal val miniplayerModernOverlayViewFingerprint by fingerprint { +internal val miniplayerModernOverlayViewFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() instructions( @@ -121,7 +121,7 @@ internal val miniplayerModernOverlayViewFingerprint by fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernRewindButtonFingerprint by fingerprint { +internal val miniplayerModernRewindButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() @@ -134,7 +134,7 @@ internal val miniplayerModernRewindButtonFingerprint by fingerprint { /** * Matches using the class found in [miniplayerModernViewParentFingerprint]. */ -internal val miniplayerModernActionButtonFingerprint by fingerprint { +internal val miniplayerModernActionButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() @@ -144,7 +144,7 @@ internal val miniplayerModernActionButtonFingerprint by fingerprint { ) } -internal val miniplayerMinimumSizeFingerprint by fingerprint { +internal val miniplayerMinimumSizeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( resourceLiteral(ResourceType.DIMEN, "miniplayer_max_size"), @@ -153,7 +153,7 @@ internal val miniplayerMinimumSizeFingerprint by fingerprint { ) } -internal val miniplayerOverrideFingerprint by fingerprint { +internal val miniplayerOverrideFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") instructions( @@ -166,7 +166,7 @@ internal val miniplayerOverrideFingerprint by fingerprint { ) } -internal val miniplayerOverrideNoContextFingerprint by fingerprint { +internal val miniplayerOverrideNoContextFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("Z") instructions( @@ -177,7 +177,7 @@ internal val miniplayerOverrideNoContextFingerprint by fingerprint { /** * 20.36 and lower. Codes appears to be removed in 20.37+ */ -internal val miniplayerResponseModelSizeCheckFingerprint by fingerprint { +internal val miniplayerResponseModelSizeCheckFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("Ljava/lang/Object;", "Ljava/lang/Object;") @@ -191,7 +191,7 @@ internal val miniplayerResponseModelSizeCheckFingerprint by fingerprint { ) } -internal val miniplayerOnCloseHandlerFingerprint by fingerprint { +internal val miniplayerOnCloseHandlerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( @@ -202,13 +202,13 @@ internal val miniplayerOnCloseHandlerFingerprint by fingerprint { internal const val YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME = "Lcom/google/android/apps/youtube/app/common/player/overlay/YouTubePlayerOverlaysLayout;" -internal val playerOverlaysLayoutFingerprint by fingerprint { +internal val playerOverlaysLayoutFingerprint = fingerprint { custom { method, _ -> method.definingClass == YOUTUBE_PLAYER_OVERLAYS_LAYOUT_CLASS_NAME } } -internal val miniplayerSetIconsFingerprint by fingerprint { +internal val miniplayerSetIconsFingerprint = fingerprint { returns("V") parameters("I", "Ljava/lang/Runnable;") instructions( 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 8cdb3aa342..1f7f033920 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 @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.layout.panels.popup import app.revanced.patcher.fingerprint -internal val engagementPanelControllerFingerprint by fingerprint { +internal val engagementPanelControllerFingerprint = fingerprint { returns("L") strings( "EngagementPanelController: cannot show EngagementPanel before EngagementPanelController.init() has been called.", 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 8e60976b46..4a3ddd2c28 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 @@ -9,7 +9,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * 19.46+ */ -internal val openVideosFullscreenPortraitFingerprint by fingerprint { +internal val openVideosFullscreenPortraitFingerprint = fingerprint { returns("V") parameters("L", "Lj\$/util/Optional;") instructions( @@ -23,7 +23,7 @@ internal val openVideosFullscreenPortraitFingerprint by fingerprint { /** * Pre 19.46. */ -internal val openVideosFullscreenPortraitLegacyFingerprint by fingerprint { +internal val openVideosFullscreenPortraitLegacyFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "Lj\$/util/Optional;") @@ -42,7 +42,7 @@ internal val openVideosFullscreenPortraitLegacyFingerprint by fingerprint { ) } -internal val openVideosFullscreenHookPatchExtensionFingerprint by fingerprint { +internal val openVideosFullscreenHookPatchExtensionFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Z") parameters() 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 c5f6909c49..7af7d3490d 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 @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patches.shared.misc.mapping.ResourceType import app.revanced.patches.shared.misc.mapping.resourceLiteral -internal val createPlayerOverviewFingerprint by fingerprint { +internal val createPlayerOverviewFingerprint = fingerprint { returns("V") instructions( resourceLiteral(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 e87999f686..a138771d4b 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 @@ -6,28 +6,28 @@ import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val dislikeFingerprint by fingerprint { +internal val dislikeFingerprint = fingerprint { returns("V") instructions( string("like/dislike") ) } -internal val likeFingerprint by fingerprint { +internal val likeFingerprint = fingerprint { returns("V") instructions( string("like/like") ) } -internal val removeLikeFingerprint by fingerprint { +internal val removeLikeFingerprint = fingerprint { returns("V") instructions( string("like/removelike") ) } -internal val rollingNumberMeasureAnimatedTextFingerprint by fingerprint { +internal val rollingNumberMeasureAnimatedTextFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Lj\$/util/Optional;") parameters("L", "Ljava/lang/String;", "L") @@ -48,7 +48,7 @@ internal val rollingNumberMeasureAnimatedTextFingerprint by fingerprint { /** * Matches to class found in [rollingNumberMeasureStaticLabelParentFingerprint]. */ -internal val rollingNumberMeasureStaticLabelFingerprint by fingerprint { +internal val rollingNumberMeasureStaticLabelFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("F") parameters("Ljava/lang/String;") @@ -60,7 +60,7 @@ internal val rollingNumberMeasureStaticLabelFingerprint by fingerprint { ) } -internal val rollingNumberMeasureStaticLabelParentFingerprint by fingerprint { +internal val rollingNumberMeasureStaticLabelParentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() @@ -69,7 +69,7 @@ internal val rollingNumberMeasureStaticLabelParentFingerprint by fingerprint { ) } -internal val rollingNumberSetterFingerprint by fingerprint { +internal val rollingNumberSetterFingerprint = fingerprint { opcodes( Opcode.INVOKE_DIRECT, Opcode.IGET_OBJECT, @@ -78,7 +78,7 @@ internal val rollingNumberSetterFingerprint by fingerprint { strings("RollingNumberType required properties missing! Need") } -internal val rollingNumberTextViewFingerprint by fingerprint { +internal val rollingNumberTextViewFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "F", "F") @@ -96,14 +96,14 @@ internal val rollingNumberTextViewFingerprint by fingerprint { } } -internal val textComponentConstructorFingerprint by fingerprint { +internal val textComponentConstructorFingerprint = fingerprint { accessFlags(AccessFlags.CONSTRUCTOR, AccessFlags.PRIVATE) instructions( string("TextComponent") ) } -internal val textComponentDataFingerprint by fingerprint { +internal val textComponentDataFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("L", "L") instructions( @@ -117,7 +117,7 @@ internal val textComponentDataFingerprint by fingerprint { /** * Matches against the same class found in [textComponentConstructorFingerprint]. */ -internal val textComponentLookupFingerprint by fingerprint { +internal val textComponentLookupFingerprint = fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("L") parameters("L") @@ -126,7 +126,7 @@ internal val textComponentLookupFingerprint by fingerprint { ) } -internal val textComponentFeatureFlagFingerprint by fingerprint { +internal val textComponentFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.FINAL) returns("Z") parameters() 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 a25403c4be..53e14e1f41 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 @@ -6,7 +6,7 @@ import app.revanced.patches.shared.misc.mapping.resourceLiteral import app.revanced.patches.youtube.layout.hide.general.yoodlesImageViewFingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val setWordmarkHeaderFingerprint by fingerprint { +internal val setWordmarkHeaderFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/widget/ImageView;") @@ -19,7 +19,7 @@ internal val setWordmarkHeaderFingerprint by fingerprint { /** * Matches the same method as [yoodlesImageViewFingerprint]. */ -internal val wideSearchbarLayoutFingerprint by fingerprint { +internal val wideSearchbarLayoutFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") parameters("L", "L") 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 47581ef649..4ec8d2ad5b 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 @@ -12,7 +12,7 @@ import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val fullscreenSeekbarThumbnailsFingerprint by fingerprint { +internal val fullscreenSeekbarThumbnailsFingerprint = fingerprint { returns("Z") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() @@ -21,7 +21,7 @@ internal val fullscreenSeekbarThumbnailsFingerprint by fingerprint { ) } -internal val playerSeekbarColorFingerprint by fingerprint { +internal val playerSeekbarColorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( resourceLiteral(ResourceType.COLOR, "inline_time_bar_played_not_highlighted_color"), @@ -30,19 +30,19 @@ internal val playerSeekbarColorFingerprint by fingerprint { } // class is ControlsOverlayStyle in 20.32 and lower, and obfuscated in 20.33+ -internal val setSeekbarClickedColorFingerprint by fingerprint { +internal val setSeekbarClickedColorFingerprint = fingerprint { opcodes(Opcode.CONST_HIGH16) strings("YOUTUBE", "PREROLL", "POSTROLL", "REMOTE_LIVE", "AD_LARGE_CONTROLS") } -internal val shortsSeekbarColorFingerprint by fingerprint { +internal val shortsSeekbarColorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( resourceLiteral(ResourceType.COLOR, "reel_time_bar_played_color") ) } -internal val playerSeekbarHandle1ColorFingerprint by fingerprint { +internal val playerSeekbarHandle1ColorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( resourceLiteral(ResourceType.COLOR, "inline_time_bar_live_seekable_range"), @@ -50,7 +50,7 @@ internal val playerSeekbarHandle1ColorFingerprint by fingerprint { ) } -internal val playerSeekbarHandle2ColorFingerprint by fingerprint { +internal val playerSeekbarHandle2ColorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Landroid/content/Context;") instructions( @@ -59,7 +59,7 @@ internal val playerSeekbarHandle2ColorFingerprint by fingerprint { ) } -internal val watchHistoryMenuUseProgressDrawableFingerprint by fingerprint { +internal val watchHistoryMenuUseProgressDrawableFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") @@ -70,7 +70,7 @@ internal val watchHistoryMenuUseProgressDrawableFingerprint by fingerprint { ) } -internal val lithoLinearGradientFingerprint by fingerprint { +internal val lithoLinearGradientFingerprint = fingerprint { accessFlags(AccessFlags.STATIC) returns("Landroid/graphics/LinearGradient;") parameters("F", "F", "F", "F", "[I", "[F") @@ -79,7 +79,7 @@ internal val lithoLinearGradientFingerprint by fingerprint { /** * 19.49+ */ -internal val playerLinearGradientFingerprint by fingerprint { +internal val playerLinearGradientFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) parameters("I", "I", "I", "I", "Landroid/content/Context;", "I") returns("Landroid/graphics/LinearGradient;") @@ -94,7 +94,7 @@ internal val playerLinearGradientFingerprint by fingerprint { /** * 19.25 - 19.47 */ -internal val playerLinearGradientLegacyFingerprint by fingerprint { +internal val playerLinearGradientLegacyFingerprint = fingerprint { returns("V") instructions( resourceLiteral(ResourceType.COLOR, "yt_youtube_magenta"), @@ -107,7 +107,7 @@ internal val playerLinearGradientLegacyFingerprint by fingerprint { internal const val launchScreenLayoutTypeLotteFeatureLegacyFlag = 268507948L internal const val launchScreenLayoutTypeLotteFeatureFlag = 1073814316L -internal val launchScreenLayoutTypeFingerprint by fingerprint { +internal val launchScreenLayoutTypeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( anyInstruction( @@ -125,7 +125,7 @@ internal val launchScreenLayoutTypeFingerprint by fingerprint { internal const val LOTTIE_ANIMATION_VIEW_CLASS_TYPE = "Lcom/airbnb/lottie/LottieAnimationView;" -internal val lottieAnimationViewSetAnimationIntFingerprint by fingerprint { +internal val lottieAnimationViewSetAnimationIntFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("I") returns("V") @@ -137,7 +137,7 @@ internal val lottieAnimationViewSetAnimationIntFingerprint by fingerprint { } } -internal val lottieCompositionFactoryZipFingerprint by fingerprint { +internal val lottieCompositionFactoryZipFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) parameters("Landroid/content/Context;", "Ljava/util/zip/ZipInputStream;", "Ljava/lang/String;") returns("L") @@ -152,7 +152,7 @@ internal val lottieCompositionFactoryZipFingerprint by fingerprint { * * [Original method](https://github.com/airbnb/lottie-android/blob/26ad8bab274eac3f93dccccfa0cafc39f7408d13/lottie/src/main/java/com/airbnb/lottie/LottieCompositionFactory.java#L386) */ -internal val lottieCompositionFactoryFromJsonInputStreamFingerprint by fingerprint { +internal val lottieCompositionFactoryFromJsonInputStreamFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) parameters("Ljava/io/InputStream;", "Ljava/lang/String;") returns("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 518e22bfcb..6ef30e7691 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 @@ -225,7 +225,7 @@ val seekbarColorPatch = bytecodePatch( factoryStreamReturnType = returnType } - val lottieAnimationViewSetAnimationStreamFingerprint by fingerprint { + val lottieAnimationViewSetAnimationStreamFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters(factoryStreamReturnType.toString()) returns("V") 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 c75606b95a..ca23f18186 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 @@ -8,7 +8,7 @@ import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val reelEnumConstructorFingerprint by fingerprint { +internal val reelEnumConstructorFingerprint = fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) instructions( string("REEL_LOOP_BEHAVIOR_UNKNOWN"), @@ -19,7 +19,7 @@ internal val reelEnumConstructorFingerprint by fingerprint { ) } -internal val reelPlaybackRepeatParentFingerprint by fingerprint { +internal val reelPlaybackRepeatParentFingerprint = fingerprint { returns("V") parameters("Ljava/lang/String;", "J") instructions( @@ -30,7 +30,7 @@ internal val reelPlaybackRepeatParentFingerprint by fingerprint { /** * Matches class found in [reelPlaybackRepeatParentFingerprint]. */ -internal val reelPlaybackRepeatFingerprint by fingerprint { +internal val reelPlaybackRepeatFingerprint = fingerprint { returns("V") parameters("L") instructions( @@ -38,7 +38,7 @@ internal val reelPlaybackRepeatFingerprint by fingerprint { ) } -internal val reelPlaybackFingerprint by fingerprint { +internal val reelPlaybackFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("J") returns("V") diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt index 3882efb395..cf37e025f3 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/shortsplayer/Fingerprints.kt @@ -16,7 +16,7 @@ import com.android.tools.smali.dexlib2.Opcode * the obfuscated name of the videoId() method in PlaybackStartDescriptor. * 20.38 and lower. */ -internal val playbackStartFeatureFlagFingerprint by fingerprint { +internal val playbackStartFeatureFlagFingerprint = fingerprint { returns("Z") parameters( "Lcom/google/android/libraries/youtube/player/model/PlaybackStartDescriptor;", @@ -35,7 +35,7 @@ internal val playbackStartFeatureFlagFingerprint by fingerprint { * the obfuscated name of the videoId() method in PlaybackStartDescriptor. * 20.39+ */ -internal val watchPanelVideoIdFingerprint by fingerprint { +internal val watchPanelVideoIdFingerprint = fingerprint { returns("Ljava/lang/String;") parameters() instructions( @@ -57,7 +57,7 @@ internal val watchPanelVideoIdFingerprint by fingerprint { // Pre 19.25 -internal val shortsPlaybackIntentLegacyFingerprint by fingerprint { +internal val shortsPlaybackIntentLegacyFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters( @@ -77,7 +77,7 @@ internal val shortsPlaybackIntentLegacyFingerprint by fingerprint { ) } -internal val shortsPlaybackIntentFingerprint by fingerprint { +internal val shortsPlaybackIntentFingerprint = fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters( @@ -94,7 +94,7 @@ internal val shortsPlaybackIntentFingerprint by fingerprint { ) } -internal val exitVideoPlayerFingerprint by fingerprint { +internal val exitVideoPlayerFingerprint = fingerprint { returns("V") parameters() instructions( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt index d31d1cf9ad..0ca7014188 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/sponsorblock/Fingerprints.kt @@ -14,7 +14,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 appendTimeFingerprint by fingerprint { +internal val appendTimeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;") @@ -26,7 +26,7 @@ internal val appendTimeFingerprint by fingerprint { ) } -internal val controlsOverlayFingerprint by fingerprint { +internal val controlsOverlayFingerprint = fingerprint { returns("V") parameters() instructions( @@ -38,7 +38,7 @@ internal val controlsOverlayFingerprint by fingerprint { /** * Resolves to the class found in [seekbarFingerprint]. */ -internal val rectangleFieldInvalidatorFingerprint by fingerprint { +internal val rectangleFieldInvalidatorFingerprint = fingerprint { returns("V") parameters() instructions( @@ -46,7 +46,7 @@ internal val rectangleFieldInvalidatorFingerprint by fingerprint { ) } -internal val adProgressTextViewVisibilityFingerprint by fingerprint { +internal val adProgressTextViewVisibilityFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Z") 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 2341c01d73..bb2fe09b40 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 @@ -9,7 +9,7 @@ import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val toolBarButtonFingerprint by fingerprint { +internal val toolBarButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( @@ -28,7 +28,7 @@ internal val toolBarButtonFingerprint by fingerprint { } } -internal val spoofAppVersionFingerprint by fingerprint { +internal val spoofAppVersionFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L") 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 f25f04cd63..ebc4ad2715 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 @@ -6,14 +6,14 @@ import app.revanced.patcher.literal import app.revanced.patcher.string import com.android.tools.smali.dexlib2.Opcode -internal val intentActionFingerprint by fingerprint { +internal val intentActionFingerprint = fingerprint { parameters("Landroid/content/Intent;") instructions( string("has_handled_intent") ) } -internal val browseIdFingerprint by fingerprint { +internal val browseIdFingerprint = fingerprint { returns("Lcom/google/android/apps/youtube/app/common/ui/navigation/PaneDescriptor;") //parameters() // 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/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/startupshortsreset/Fingerprints.kt index f73cad02bd..8f345b6bf9 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 @@ -12,7 +12,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * 20.02+ */ -internal val userWasInShortsAlternativeFingerprint by fingerprint { +internal val userWasInShortsAlternativeFingerprint = fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Ljava/lang/Object;") @@ -28,7 +28,7 @@ internal val userWasInShortsAlternativeFingerprint by fingerprint { /** * Pre 20.02 */ -internal val userWasInShortsLegacyFingerprint by fingerprint { +internal val userWasInShortsLegacyFingerprint = fingerprint { returns("V") accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters("Ljava/lang/Object;") @@ -40,7 +40,7 @@ internal val userWasInShortsLegacyFingerprint by fingerprint { /** * 18.15.40+ */ -internal val userWasInShortsConfigFingerprint by fingerprint { +internal val userWasInShortsConfigFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() 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 4c74c4253c..eca98e822f 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 @@ -5,13 +5,13 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.literal import app.revanced.patches.youtube.shared.YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE -internal val useGradientLoadingScreenFingerprint by fingerprint { +internal val useGradientLoadingScreenFingerprint = fingerprint { instructions( literal(45412406L) ) } -internal val splashScreenStyleFingerprint by fingerprint { +internal val splashScreenStyleFingerprint = fingerprint { returns("V") parameters("Landroid/os/Bundle;") instructions( 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 23a6903bc4..cccc893567 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 @@ -5,7 +5,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val backgroundPlaybackManagerFingerprint by fingerprint { +internal val backgroundPlaybackManagerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L") @@ -38,7 +38,7 @@ internal val backgroundPlaybackManagerFingerprint by fingerprint { ) } -internal val backgroundPlaybackSettingsFingerprint by fingerprint { +internal val backgroundPlaybackSettingsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() @@ -54,7 +54,7 @@ internal val backgroundPlaybackSettingsFingerprint by fingerprint { literal { prefBackgroundAndOfflineCategoryId } } -internal val kidsBackgroundPlaybackPolicyControllerFingerprint by fingerprint { +internal val kidsBackgroundPlaybackPolicyControllerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "L", "L") @@ -71,7 +71,7 @@ internal val kidsBackgroundPlaybackPolicyControllerFingerprint by fingerprint { literal { 5 } } -internal val backgroundPlaybackManagerShortsFingerprint by fingerprint { +internal val backgroundPlaybackManagerShortsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L") @@ -80,7 +80,7 @@ internal val backgroundPlaybackManagerShortsFingerprint by fingerprint { ) } -internal val shortsBackgroundPlaybackFeatureFlagFingerprint by fingerprint { +internal val shortsBackgroundPlaybackFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -90,7 +90,7 @@ internal val shortsBackgroundPlaybackFeatureFlagFingerprint by fingerprint { } // Fix 'E/InputDispatcher: Window handle pip_input_consumer has no registered input channel' -internal val pipInputConsumerFeatureFlagFingerprint by fingerprint { +internal val pipInputConsumerFeatureFlagFingerprint = fingerprint { instructions( // PiP input consumer feature flag. app.revanced.patcher.literal(45638483L) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt index 03ba7a99be..8fb89cdda8 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags -internal val experimentalFeatureFlagParentFingerprint by fingerprint { +internal val experimentalFeatureFlagParentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L", "J", "[B") @@ -13,25 +13,25 @@ internal val experimentalFeatureFlagParentFingerprint by fingerprint { ) } -internal val experimentalBooleanFeatureFlagFingerprint by fingerprint { +internal val experimentalBooleanFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Z") parameters("L", "J", "Z") } -internal val experimentalDoubleFeatureFlagFingerprint by fingerprint { +internal val experimentalDoubleFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("D") parameters("J", "D") } -internal val experimentalLongFeatureFlagFingerprint by fingerprint { +internal val experimentalLongFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("J") parameters("J", "J") } -internal val experimentalStringFeatureFlagFingerprint by fingerprint { +internal val experimentalStringFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters("J", "Ljava/lang/String;") 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 6d772c5169..71fb0f9d1b 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 @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.misc.dimensions.spoof import app.revanced.patcher.fingerprint import app.revanced.patcher.string -internal val deviceDimensionsModelToStringFingerprint by fingerprint { +internal val deviceDimensionsModelToStringFingerprint = fingerprint { returns("L") instructions( string("minh."), 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 3fb5562a8b..f40e57025b 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 @@ -8,7 +8,7 @@ import app.revanced.patcher.opcode import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val scrollPositionFingerprint by fingerprint { +internal val scrollPositionFingerprint = fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) returns("V") parameters("L") @@ -20,7 +20,7 @@ internal val scrollPositionFingerprint by fingerprint { strings("scroll_position") } -internal val recyclerViewTopScrollingFingerprint by fingerprint { +internal val recyclerViewTopScrollingFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() 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 9ae70b23be..d5a255ca5f 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 @@ -12,7 +12,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 by fingerprint { +internal val playbackSpeedInFeedsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") 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 8fe2e05a5e..701f6553f9 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 @@ -8,7 +8,7 @@ import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val specificNetworkErrorViewControllerFingerprint by fingerprint { +internal val specificNetworkErrorViewControllerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -22,7 +22,7 @@ internal val specificNetworkErrorViewControllerFingerprint by 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 by fingerprint { +internal val loadingFrameLayoutControllerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") 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 d556efa94d..13efc46931 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 @@ -2,22 +2,22 @@ package app.revanced.patches.youtube.misc.hapticfeedback import app.revanced.patcher.fingerprint -internal val markerHapticsFingerprint by fingerprint { +internal val markerHapticsFingerprint = fingerprint { returns("V") strings("Failed to execute markers haptics vibrate.") } -internal val scrubbingHapticsFingerprint by fingerprint { +internal val scrubbingHapticsFingerprint = fingerprint { returns("V") strings("Failed to haptics vibrate for fine scrubbing.") } -internal val seekUndoHapticsFingerprint by fingerprint { +internal val seekUndoHapticsFingerprint = fingerprint { returns("V") strings("Failed to execute seek undo haptics vibrate.") } -internal val zoomHapticsFingerprint by fingerprint { +internal val zoomHapticsFingerprint = fingerprint { returns("V") strings("Failed to haptics vibrate for video zoom") } 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 6d7826495b..b0ec1e64e5 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 @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags -internal val onFailureFingerprint by fingerprint { +internal val onFailureFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters( @@ -19,7 +19,7 @@ internal val onFailureFingerprint by fingerprint { } // Acts as a parent fingerprint. -internal val onResponseStartedFingerprint by fingerprint { +internal val onResponseStartedFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") @@ -34,7 +34,7 @@ internal val onResponseStartedFingerprint by fingerprint { } } -internal val onSucceededFingerprint by fingerprint { +internal val onSucceededFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lorg/chromium/net/UrlRequest;", "Lorg/chromium/net/UrlResponseInfo;") @@ -45,19 +45,19 @@ internal val onSucceededFingerprint by fingerprint { internal const val CRONET_URL_REQUEST_CLASS_DESCRIPTOR = "Lorg/chromium/net/impl/CronetUrlRequest;" -internal val requestFingerprint by fingerprint { +internal val requestFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) custom { _, classDef -> classDef.type == CRONET_URL_REQUEST_CLASS_DESCRIPTOR } } -internal val messageDigestImageUrlFingerprint by fingerprint { +internal val messageDigestImageUrlFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("Ljava/lang/String;", "L") } -internal val messageDigestImageUrlParentFingerprint by fingerprint { +internal val messageDigestImageUrlParentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/String;") parameters() 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 c63e7e24f8..a1637d9b78 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 @@ -8,7 +8,7 @@ import com.android.tools.smali.dexlib2.AccessFlags /** * 20.36 and lower. */ -internal val abUriParserLegacyFingerprint by fingerprint { +internal val abUriParserLegacyFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/Object;") parameters("Ljava/lang/Object;") @@ -22,7 +22,7 @@ internal val abUriParserLegacyFingerprint by fingerprint { /** * 20.37+ */ -internal val abUriParserFingerprint by fingerprint { +internal val abUriParserFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Ljava/lang/Object;") parameters("Ljava/lang/Object;") @@ -36,7 +36,7 @@ internal val abUriParserFingerprint by fingerprint { ) } -internal val httpUriParserFingerprint by fingerprint { +internal val httpUriParserFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("Landroid/net/Uri;") parameters("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 3faa497407..185744d830 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 @@ -9,21 +9,21 @@ import app.revanced.patcher.string import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val componentCreateFingerprint by fingerprint { +internal val componentCreateFingerprint = fingerprint { instructions( string("Element missing correct type extension"), string("Element missing type") ) } -internal val lithoFilterFingerprint by fingerprint { +internal val lithoFilterFingerprint = fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) custom { _, classDef -> classDef.endsWith("/LithoFilterPatch;") } } -internal val protobufBufferReferenceFingerprint by fingerprint { +internal val protobufBufferReferenceFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("[B") @@ -40,7 +40,7 @@ internal val protobufBufferReferenceFingerprint by fingerprint { ) } -internal val protobufBufferReferenceLegacyFingerprint by fingerprint { +internal val protobufBufferReferenceLegacyFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "Ljava/nio/ByteBuffer;") @@ -52,7 +52,7 @@ internal val protobufBufferReferenceLegacyFingerprint by fingerprint { ) } -internal val emptyComponentFingerprint by fingerprint { +internal val emptyComponentFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) parameters() instructions( @@ -63,7 +63,7 @@ internal val emptyComponentFingerprint by fingerprint { } } -internal val lithoThreadExecutorFingerprint by fingerprint { +internal val lithoThreadExecutorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters("I", "I", "I") custom { method, classDef -> @@ -72,7 +72,7 @@ internal val lithoThreadExecutorFingerprint by fingerprint { } } -internal val lithoComponentNameUpbFeatureFlagFingerprint by fingerprint { +internal val lithoComponentNameUpbFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -81,7 +81,7 @@ internal val lithoComponentNameUpbFeatureFlagFingerprint by fingerprint { ) } -internal val lithoConverterBufferUpbFeatureFlagFingerprint by fingerprint { +internal val lithoConverterBufferUpbFeatureFlagFingerprint = fingerprint { returns("L") instructions( literal(45419603L) 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 5fbee6e279..a3f92fbf0d 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 @@ -11,7 +11,7 @@ import app.revanced.patches.youtube.layout.buttons.navigation.navigationButtonsP import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val actionBarSearchResultsFingerprint by fingerprint { +internal val actionBarSearchResultsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") instructions( @@ -20,7 +20,7 @@ internal val actionBarSearchResultsFingerprint by fingerprint { ) } -internal val toolbarLayoutFingerprint by fingerprint { +internal val toolbarLayoutFingerprint = fingerprint { accessFlags(AccessFlags.PROTECTED, AccessFlags.CONSTRUCTOR) instructions( resourceLiteral(ResourceType.ID, "toolbar_container"), @@ -31,7 +31,7 @@ internal val toolbarLayoutFingerprint by fingerprint { /** * Matches to https://android.googlesource.com/platform/frameworks/support/+/9eee6ba/v7/appcompat/src/android/support/v7/widget/Toolbar.java#963 */ -internal val appCompatToolbarBackButtonFingerprint by fingerprint { +internal val appCompatToolbarBackButtonFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/graphics/drawable/Drawable;") parameters() @@ -43,7 +43,7 @@ internal val appCompatToolbarBackButtonFingerprint by fingerprint { /** * Matches to the class found in [pivotBarConstructorFingerprint]. */ -internal val initializeButtonsFingerprint by fingerprint { +internal val initializeButtonsFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( @@ -55,7 +55,7 @@ internal val initializeButtonsFingerprint by fingerprint { * Extension method, used for callback into to other patches. * Specifically, [navigationButtonsPatch]. */ -internal val navigationBarHookCallbackFingerprint by fingerprint { +internal val navigationBarHookCallbackFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("V") parameters(EXTENSION_NAVIGATION_BUTTON_DESCRIPTOR, "Landroid/view/View;") @@ -68,7 +68,7 @@ internal val navigationBarHookCallbackFingerprint by fingerprint { /** * Matches to the Enum class that looks up ordinal -> instance. */ -internal val navigationEnumFingerprint by fingerprint { +internal val navigationEnumFingerprint = fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "PIVOT_HOME", @@ -81,7 +81,7 @@ internal val navigationEnumFingerprint by fingerprint { ) } -internal val pivotBarButtonsCreateDrawableViewFingerprint by fingerprint { +internal val pivotBarButtonsCreateDrawableViewFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") custom { method, _ -> @@ -91,7 +91,7 @@ internal val pivotBarButtonsCreateDrawableViewFingerprint by fingerprint { } } -internal val pivotBarButtonsCreateResourceStyledViewFingerprint by fingerprint { +internal val pivotBarButtonsCreateResourceStyledViewFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") parameters("L", "Z", "I", "L") @@ -103,7 +103,7 @@ internal val pivotBarButtonsCreateResourceStyledViewFingerprint by fingerprint { /** * 20.21+ */ -internal val pivotBarButtonsCreateResourceIntViewFingerprint by fingerprint { +internal val pivotBarButtonsCreateResourceIntViewFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") custom { method, _ -> @@ -113,7 +113,7 @@ internal val pivotBarButtonsCreateResourceIntViewFingerprint by fingerprint { } } -internal val pivotBarButtonsViewSetSelectedFingerprint by fingerprint { +internal val pivotBarButtonsViewSetSelectedFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("I", "Z") @@ -125,14 +125,14 @@ internal val pivotBarButtonsViewSetSelectedFingerprint by fingerprint { } } -internal val pivotBarConstructorFingerprint by fingerprint { +internal val pivotBarConstructorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) instructions( string("com.google.android.apps.youtube.app.endpoint.flags"), ) } -internal val imageEnumConstructorFingerprint by fingerprint { +internal val imageEnumConstructorFingerprint = fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) instructions( string("TAB_ACTIVITY_CAIRO"), @@ -140,7 +140,7 @@ internal val imageEnumConstructorFingerprint by fingerprint { ) } -internal val setEnumMapFingerprint by fingerprint { +internal val setEnumMapFingerprint = fingerprint { instructions( resourceLiteral(ResourceType.DRAWABLE, "yt_fill_bell_black_24"), methodCall(smali = "Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;", maxAfter = 10), 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 8d0a5a8e25..0148bb30f5 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 @@ -10,7 +10,7 @@ import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val playerControlsVisibilityEntityModelFingerprint by fingerprint { +internal val playerControlsVisibilityEntityModelFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC) returns("L") parameters() @@ -23,7 +23,7 @@ internal val playerControlsVisibilityEntityModelFingerprint by fingerprint { } } -internal val youtubeControlsOverlayFingerprint by fingerprint { +internal val youtubeControlsOverlayFingerprint = fingerprint { returns("V") parameters() instructions( @@ -33,7 +33,7 @@ internal val youtubeControlsOverlayFingerprint by fingerprint { ) } -internal val motionEventFingerprint by fingerprint { +internal val motionEventFingerprint = fingerprint { returns("V") parameters("Landroid/view/MotionEvent;") instructions( @@ -41,7 +41,7 @@ internal val motionEventFingerprint by fingerprint { ) } -internal val playerControlsExtensionHookListenersExistFingerprint by fingerprint { +internal val playerControlsExtensionHookListenersExistFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("Z") parameters() @@ -51,7 +51,7 @@ internal val playerControlsExtensionHookListenersExistFingerprint by fingerprint } } -internal val playerControlsExtensionHookFingerprint by fingerprint { +internal val playerControlsExtensionHookFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.STATIC) returns("V") parameters("Z") @@ -61,7 +61,7 @@ internal val playerControlsExtensionHookFingerprint by fingerprint { } } -internal val playerTopControlsInflateFingerprint by fingerprint { +internal val playerTopControlsInflateFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -72,7 +72,7 @@ internal val playerTopControlsInflateFingerprint by fingerprint { ) } -internal val playerBottomControlsInflateFingerprint by fingerprint { +internal val playerBottomControlsInflateFingerprint = fingerprint { returns("Ljava/lang/Object;") parameters() instructions( @@ -82,7 +82,7 @@ internal val playerBottomControlsInflateFingerprint by fingerprint { ) } -internal val overlayViewInflateFingerprint by fingerprint { +internal val overlayViewInflateFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/view/View;") @@ -96,13 +96,13 @@ internal val overlayViewInflateFingerprint by fingerprint { /** * Resolves to the class found in [playerTopControlsInflateFingerprint]. */ -internal val controlsOverlayVisibilityFingerprint by fingerprint { +internal val controlsOverlayVisibilityFingerprint = fingerprint { accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) returns("V") parameters("Z", "Z") } -internal val playerBottomControlsExploderFeatureFlagFingerprint by fingerprint { +internal val playerBottomControlsExploderFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -111,7 +111,7 @@ internal val playerBottomControlsExploderFeatureFlagFingerprint by fingerprint { ) } -internal val playerTopControlsExperimentalLayoutFeatureFlagFingerprint by fingerprint { +internal val playerTopControlsExperimentalLayoutFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("I") parameters() @@ -120,7 +120,7 @@ internal val playerTopControlsExperimentalLayoutFeatureFlagFingerprint by finger ) } -internal val playerControlsLargeOverlayButtonsFeatureFlagFingerprint by fingerprint { +internal val playerControlsLargeOverlayButtonsFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -129,7 +129,7 @@ internal val playerControlsLargeOverlayButtonsFeatureFlagFingerprint by fingerpr ) } -internal val playerControlsFullscreenLargeButtonsFeatureFlagFingerprint by fingerprint { +internal val playerControlsFullscreenLargeButtonsFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() @@ -138,7 +138,7 @@ internal val playerControlsFullscreenLargeButtonsFeatureFlagFingerprint by finge ) } -internal val playerControlsButtonStrokeFeatureFlagFingerprint by fingerprint { +internal val playerControlsButtonStrokeFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() 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 f3a4dba5b8..2a6b3a86aa 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 @@ -8,7 +8,7 @@ import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val playerTypeEnumFingerprint by fingerprint { +internal val playerTypeEnumFingerprint = fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) strings( "NONE", @@ -25,7 +25,7 @@ internal val playerTypeEnumFingerprint by fingerprint { ) } -internal val reelWatchPagerFingerprint by fingerprint { +internal val reelWatchPagerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Landroid/view/View;") instructions( @@ -34,7 +34,7 @@ internal val reelWatchPagerFingerprint by fingerprint { ) } -internal val videoStateEnumFingerprint by fingerprint { +internal val videoStateEnumFingerprint = fingerprint { accessFlags(AccessFlags.STATIC, AccessFlags.CONSTRUCTOR) parameters() strings( @@ -48,7 +48,7 @@ internal val videoStateEnumFingerprint by fingerprint { } // 20.33 and lower class name ControlsState. 20.34+ class name is obfuscated. -internal val controlsStateToStringFingerprint by fingerprint { +internal val controlsStateToStringFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) parameters() returns("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 b2628cdcf0..d31906239c 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 @@ -22,7 +22,7 @@ val playerTypeHookPatch = bytecodePatch( dependsOn(sharedExtensionPatch, resourceMappingPatch) execute { - val playerOverlaysSetPlayerTypeFingerprint by fingerprint { + val playerOverlaysSetPlayerTypeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters(playerTypeEnumFingerprint.originalClassDef.type) @@ -50,7 +50,7 @@ val playerTypeHookPatch = bytecodePatch( val controlStateType = controlsStateToStringFingerprint.originalClassDef.type - val videoStateFingerprint by fingerprint { + val videoStateFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters(controlStateType) 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 a2bf2ee303..fb2df5e382 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 @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val recyclerViewTreeObserverFingerprint by fingerprint { +internal val recyclerViewTreeObserverFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) opcodes( Opcode.CHECK_CAST, 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 1e08b69e6e..c3e94b66ef 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 @@ -8,7 +8,7 @@ import app.revanced.patches.shared.misc.mapping.resourceLiteral import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val licenseActivityOnCreateFingerprint by fingerprint { +internal val licenseActivityOnCreateFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/os/Bundle;") @@ -17,7 +17,7 @@ internal val licenseActivityOnCreateFingerprint by fingerprint { } } -internal val setThemeFingerprint by fingerprint { +internal val setThemeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters() @@ -26,7 +26,7 @@ internal val setThemeFingerprint by fingerprint { ) } -internal val cairoFragmentConfigFingerprint by fingerprint { +internal val cairoFragmentConfigFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") instructions( @@ -37,7 +37,7 @@ internal val cairoFragmentConfigFingerprint by 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 by fingerprint { +internal val boldIconsFeatureFlagFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters() 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 d782462d44..4a66e83b7f 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 @@ -14,7 +14,7 @@ import com.android.tools.smali.dexlib2.Opcode internal const val YOUTUBE_MAIN_ACTIVITY_CLASS_TYPE = "Lcom/google/android/apps/youtube/app/watchwhile/MainActivity;" -internal val conversionContextFingerprintToString by fingerprint { +internal val conversionContextFingerprintToString = fingerprint { parameters() strings( "ConversionContext{", // Partial string match. @@ -32,7 +32,7 @@ internal val conversionContextFingerprintToString by fingerprint { /** * Resolves to class found in [loopVideoParentFingerprint]. */ -internal val loopVideoFingerprint by fingerprint { +internal val loopVideoFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -41,7 +41,7 @@ internal val loopVideoFingerprint by fingerprint { } } -internal val loopVideoParentFingerprint by fingerprint { +internal val loopVideoParentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( @@ -50,7 +50,7 @@ internal val loopVideoParentFingerprint by fingerprint { ) } -internal val layoutConstructorFingerprint by fingerprint { +internal val layoutConstructorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") instructions( @@ -61,7 +61,7 @@ internal val layoutConstructorFingerprint by fingerprint { ) } -internal val mainActivityConstructorFingerprint by fingerprint { +internal val mainActivityConstructorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters() custom { _, classDef -> @@ -69,7 +69,7 @@ internal val mainActivityConstructorFingerprint by fingerprint { } } -internal val mainActivityOnBackPressedFingerprint by fingerprint { +internal val mainActivityOnBackPressedFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters() @@ -78,7 +78,7 @@ internal val mainActivityOnBackPressedFingerprint by fingerprint { } } -internal val mainActivityOnCreateFingerprint by fingerprint { +internal val mainActivityOnCreateFingerprint = fingerprint { returns("V") parameters("Landroid/os/Bundle;") custom { method, classDef -> @@ -86,7 +86,7 @@ internal val mainActivityOnCreateFingerprint by fingerprint { } } -internal val rollingNumberTextViewAnimationUpdateFingerprint by fingerprint { +internal val rollingNumberTextViewAnimationUpdateFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Landroid/graphics/Bitmap;") @@ -112,7 +112,7 @@ internal val rollingNumberTextViewAnimationUpdateFingerprint by fingerprint { } } -internal val seekbarFingerprint by fingerprint { +internal val seekbarFingerprint = fingerprint { returns("V") instructions( string("timed_markers_width"), @@ -122,7 +122,7 @@ internal val seekbarFingerprint by fingerprint { /** * Matches to _mutable_ class found in [seekbarFingerprint]. */ -internal val seekbarOnDrawFingerprint by fingerprint { +internal val seekbarOnDrawFingerprint = fingerprint { instructions( methodCall(smali = "Ljava/lang/Math;->round(F)I"), opcode(Opcode.MOVE_RESULT, maxAfter = 0) @@ -130,7 +130,7 @@ internal val seekbarOnDrawFingerprint by fingerprint { custom { method, _ -> method.name == "onDraw" } } -internal val subtitleButtonControllerFingerprint by fingerprint { +internal val subtitleButtonControllerFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("Lcom/google/android/libraries/youtube/player/subtitles/model/SubtitleTrack;") @@ -140,7 +140,7 @@ internal val subtitleButtonControllerFingerprint by fingerprint { ) } -internal val videoQualityChangedFingerprint by fingerprint { +internal val videoQualityChangedFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L") 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 d995003d0a..a7790191f4 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 @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.video.codecs import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val vp9CapabilityFingerprint by fingerprint { +internal val vp9CapabilityFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") strings( diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt index 5327e62448..b28b6fbf89 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt @@ -9,14 +9,14 @@ 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 createVideoPlayerSeekbarFingerprint by fingerprint { +internal val createVideoPlayerSeekbarFingerprint = fingerprint { returns("V") instructions( string("timed_markers_width"), ) } -internal val onPlaybackSpeedItemClickFingerprint by fingerprint { +internal val onPlaybackSpeedItemClickFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L", "L", "I", "J") @@ -29,12 +29,12 @@ internal val onPlaybackSpeedItemClickFingerprint by fingerprint { } } -internal val playerControllerSetTimeReferenceFingerprint by fingerprint { +internal val playerControllerSetTimeReferenceFingerprint = fingerprint { opcodes(Opcode.INVOKE_DIRECT_RANGE, Opcode.IGET_OBJECT) strings("Media progress reported outside media playback: ") } -internal val playerInitFingerprint by fingerprint { +internal val playerInitFingerprint = fingerprint { instructions( string("playVideo called on player response with no videoStreamingData."), ) @@ -43,13 +43,13 @@ internal val playerInitFingerprint by fingerprint { /** * Matched using class found in [playerInitFingerprint]. */ -internal val seekFingerprint by fingerprint { +internal val seekFingerprint = fingerprint { instructions( string("Attempting to seek during an ad"), ) } -internal val videoLengthFingerprint by fingerprint { +internal val videoLengthFingerprint = fingerprint { opcodes( Opcode.MOVE_RESULT_WIDE, Opcode.CMP_LONG, @@ -69,7 +69,7 @@ internal val videoLengthFingerprint by fingerprint { /** * Matches using class found in [mdxPlayerDirectorSetVideoStageFingerprint]. */ -internal val mdxSeekFingerprint by fingerprint { +internal val mdxSeekFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("Z") parameters("J", "L") @@ -86,7 +86,7 @@ internal val mdxSeekFingerprint by fingerprint { } } -internal val mdxPlayerDirectorSetVideoStageFingerprint by fingerprint { +internal val mdxPlayerDirectorSetVideoStageFingerprint = fingerprint { instructions( string("MdxDirector setVideoStage ad should be null when videoStage is not an Ad state "), ) @@ -95,7 +95,7 @@ internal val mdxPlayerDirectorSetVideoStageFingerprint by fingerprint { /** * Matches using class found in [mdxPlayerDirectorSetVideoStageFingerprint]. */ -internal val mdxSeekRelativeFingerprint by fingerprint { +internal val mdxSeekRelativeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) // Return type is boolean up to 19.39, and void with 19.39+. parameters("J", "L") @@ -108,7 +108,7 @@ internal val mdxSeekRelativeFingerprint by fingerprint { /** * Matches using class found in [playerInitFingerprint]. */ -internal val seekRelativeFingerprint by fingerprint { +internal val seekRelativeFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) // Return type is boolean up to 19.39, and void with 19.39+. parameters("J", "L") @@ -121,7 +121,7 @@ internal val seekRelativeFingerprint by fingerprint { /** * Resolves with the class found in [videoQualityChangedFingerprint]. */ -internal val playbackSpeedMenuSpeedChangedFingerprint by fingerprint { +internal val playbackSpeedMenuSpeedChangedFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L") @@ -130,7 +130,7 @@ internal val playbackSpeedMenuSpeedChangedFingerprint by fingerprint { ) } -internal val playbackSpeedClassFingerprint by fingerprint { +internal val playbackSpeedClassFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("L") parameters("L") @@ -146,7 +146,7 @@ internal const val YOUTUBE_VIDEO_QUALITY_CLASS_TYPE = "Lcom/google/android/libra /** * YouTube 20.19 and lower. */ -internal val videoQualityLegacyFingerprint by fingerprint { +internal val videoQualityLegacyFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters( "I", // Resolution. @@ -159,7 +159,7 @@ internal val videoQualityLegacyFingerprint by fingerprint { } } -internal val videoQualityFingerprint by fingerprint { +internal val videoQualityFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) parameters( "I", // Resolution. @@ -173,7 +173,7 @@ internal val videoQualityFingerprint by fingerprint { } } -internal val videoQualitySetterFingerprint by fingerprint { +internal val videoQualitySetterFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("[L", "I", "Z") @@ -190,7 +190,7 @@ internal val videoQualitySetterFingerprint by fingerprint { /** * Matches with the class found in [videoQualitySetterFingerprint]. */ -internal val setVideoQualityFingerprint by fingerprint { +internal val setVideoQualityFingerprint = fingerprint { returns("V") parameters("L") opcodes( 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 7d0d3b1092..c70316decf 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 @@ -7,7 +7,7 @@ import com.android.tools.smali.dexlib2.AccessFlags /** * For targets 20.26 and later. */ -internal val playerParameterBuilderFingerprint by fingerprint { +internal val playerParameterBuilderFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( @@ -36,7 +36,7 @@ internal val playerParameterBuilderFingerprint by fingerprint { /** * For targets 20.15 to 20.25 */ -internal val playerParameterBuilder2015Fingerprint by fingerprint { +internal val playerParameterBuilder2015Fingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( @@ -64,7 +64,7 @@ internal val playerParameterBuilder2015Fingerprint by fingerprint { /** * For targets 20.10 to 20.14. */ -internal val playerParameterBuilder2010Fingerprint by fingerprint { +internal val playerParameterBuilder2010Fingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( @@ -93,7 +93,7 @@ internal val playerParameterBuilder2010Fingerprint by fingerprint { /** * For targets 20.02 to 20.09. */ -internal val playerParameterBuilder2002Fingerprint by fingerprint { +internal val playerParameterBuilder2002Fingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( @@ -121,7 +121,7 @@ internal val playerParameterBuilder2002Fingerprint by fingerprint { /** * For targets 19.25 to 19.50. */ -internal val playerParameterBuilder1925Fingerprint by fingerprint { +internal val playerParameterBuilder1925Fingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( @@ -148,7 +148,7 @@ internal val playerParameterBuilder1925Fingerprint by fingerprint { /** * For targets 19.01 to 19.24. */ -internal val playerParameterBuilderLegacyFingerprint by fingerprint { +internal val playerParameterBuilderLegacyFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters( 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 12ef264e50..f968e3667d 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 @@ -6,7 +6,7 @@ import app.revanced.util.literal import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val videoQualityItemOnClickParentFingerprint by fingerprint { +internal val videoQualityItemOnClickParentFingerprint = fingerprint { returns("V") instructions( string("VIDEO_QUALITIES_MENU_BOTTOM_SHEET_FRAGMENT"), @@ -16,7 +16,7 @@ internal val videoQualityItemOnClickParentFingerprint by fingerprint { /** * Resolves to class found in [videoQualityItemOnClickFingerprint]. */ -internal val videoQualityItemOnClickFingerprint by fingerprint { +internal val videoQualityItemOnClickFingerprint = fingerprint { returns("V") parameters( "Landroid/widget/AdapterView;", @@ -29,7 +29,7 @@ internal val videoQualityItemOnClickFingerprint by fingerprint { } } -internal val videoQualityMenuOptionsFingerprint by fingerprint { +internal val videoQualityMenuOptionsFingerprint = fingerprint { accessFlags(AccessFlags.STATIC) returns("[L") parameters("Landroid/content/Context", "L", "L") @@ -43,7 +43,7 @@ internal val videoQualityMenuOptionsFingerprint by fingerprint { literal { videoQualityQuickMenuAdvancedMenuDescription } } -internal val videoQualityMenuViewInflateFingerprint by fingerprint { +internal val videoQualityMenuViewInflateFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("L") parameters("L", "L", "L") 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 d738870cfb..657bd1162e 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 @@ -13,22 +13,22 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val getOldPlaybackSpeedsFingerprint by fingerprint { +internal val getOldPlaybackSpeedsFingerprint = fingerprint { parameters("[L", "I") strings("menu_item_playback_speed") } -internal val showOldPlaybackSpeedMenuFingerprint by fingerprint { +internal val showOldPlaybackSpeedMenuFingerprint = fingerprint { instructions( resourceLiteral(ResourceType.STRING, "varispeed_unavailable_message") ) } -internal val showOldPlaybackSpeedMenuExtensionFingerprint by fingerprint { +internal val showOldPlaybackSpeedMenuExtensionFingerprint = fingerprint { custom { method, _ -> method.name == "showOldPlaybackSpeedMenu" } } -internal val speedArrayGeneratorFingerprint by fingerprint { +internal val speedArrayGeneratorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("[L") parameters("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;") @@ -45,7 +45,7 @@ internal val speedArrayGeneratorFingerprint by fingerprint { /** * 20.34+ */ -internal val speedLimiterFingerprint by fingerprint { +internal val speedLimiterFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("F", "Lcom/google/android/libraries/youtube/innertube/model/media/PlayerConfigModel;") @@ -58,7 +58,7 @@ internal val speedLimiterFingerprint by fingerprint { /** * 20.33 and lower. */ -internal val speedLimiterLegacyFingerprint by fingerprint { +internal val speedLimiterLegacyFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("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 5c73615f71..7925ba2229 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 @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.video.speed.remember import app.revanced.patcher.fingerprint import app.revanced.patcher.string -internal val initializePlaybackSpeedValuesFingerprint by fingerprint { +internal val initializePlaybackSpeedValuesFingerprint = fingerprint { parameters("[L", "I") instructions( string("menu_item_playback_speed"), 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 6c32e8eb05..8f5a505b0e 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 @@ -7,7 +7,7 @@ import app.revanced.patcher.opcode import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -internal val videoIdFingerprint by fingerprint { +internal val videoIdFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") parameters("L") @@ -20,7 +20,7 @@ internal val videoIdFingerprint by fingerprint { ) } -internal val videoIdBackgroundPlayFingerprint by fingerprint { +internal val videoIdBackgroundPlayFingerprint = fingerprint { accessFlags(AccessFlags.DECLARED_SYNCHRONIZED, AccessFlags.FINAL, AccessFlags.PUBLIC) returns("V") parameters("L") @@ -43,7 +43,7 @@ internal val videoIdBackgroundPlayFingerprint by fingerprint { } } -internal val videoIdParentFingerprint by fingerprint { +internal val videoIdParentFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("[L") parameters("L") From 675a2c42097aa2ad20303f2288a0d7f96c6d362e Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Nov 2025 18:34:00 +0200 Subject: [PATCH 54/59] add fix content provider patch --- .../patches/FixContentProviderPatch.java | 24 ++++++++++++ .../youtube/misc/debugging/Fingerprints.kt | 38 ------------------- .../FIxContentProviderPatch.kt | 35 +++++++++++++++++ .../misc/fix/contentprovider/Fingerprints.kt | 20 ++++++++++ .../FIxPlaybackSpeedWhilePlayingPatch.kt | 1 - .../youtube/misc/settings/SettingsPatch.kt | 2 + 6 files changed, 81 insertions(+), 39 deletions(-) create mode 100644 extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/FixContentProviderPatch.java delete mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/FIxContentProviderPatch.kt create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/Fingerprints.kt diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/FixContentProviderPatch.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/FixContentProviderPatch.java new file mode 100644 index 0000000000..e3bf0478a8 --- /dev/null +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/FixContentProviderPatch.java @@ -0,0 +1,24 @@ +package app.revanced.extension.youtube.patches; + +import java.util.Map; + +import app.revanced.extension.shared.Logger; + +@SuppressWarnings("unused") +public class FixContentProviderPatch { + + /** + * Injection point. + */ + public static void removeNullMapEntries(Map map) { + map.entrySet().removeIf(entry -> { + Object value = entry.getValue(); + if (value == null) { + Logger.printDebug(() -> "Removing content provider key with null value: " + entry.getKey()); + return true; + } + return false; + }); + } +} + diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt deleted file mode 100644 index 8fb89cdda8..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/Fingerprints.kt +++ /dev/null @@ -1,38 +0,0 @@ -package app.revanced.patches.youtube.misc.debugging - -import app.revanced.patcher.fingerprint -import app.revanced.patcher.string -import com.android.tools.smali.dexlib2.AccessFlags - -internal val experimentalFeatureFlagParentFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("L") - parameters("L", "J", "[B") - instructions( - string("Unable to parse proto typed experiment flag: ") - ) -} - -internal val experimentalBooleanFeatureFlagFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) - returns("Z") - parameters("L", "J", "Z") -} - -internal val experimentalDoubleFeatureFlagFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("D") - parameters("J", "D") -} - -internal val experimentalLongFeatureFlagFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("J") - parameters("J", "J") -} - -internal val experimentalStringFeatureFlagFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("Ljava/lang/String;") - parameters("J", "Ljava/lang/String;") -} 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 new file mode 100644 index 0000000000..de4e9a2b65 --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/FIxContentProviderPatch.kt @@ -0,0 +1,35 @@ +package app.revanced.patches.youtube.misc.fix.contentprovider + +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.bytecodePatch +import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction + +private const val EXTENSION_CLASS_DESCRIPTOR = + "Lapp/revanced/extension/youtube/patches/FixContentProviderPatch;" + +/** + * 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{ + dependsOn( + sharedExtensionPatch + ) + + execute { + unstableContentProviderFingerprint.let { + val insertIndex = it.instructionMatches.first().index + + it.method.apply { + val register = getInstruction(insertIndex).registerD + + it.method.addInstruction( + insertIndex, + "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 new file mode 100644 index 0000000000..7e3ab83c2c --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/contentprovider/Fingerprints.kt @@ -0,0 +1,20 @@ +package app.revanced.patches.youtube.misc.fix.contentprovider + +import app.revanced.patcher.fingerprint +import app.revanced.patcher.methodCall +import app.revanced.patcher.string +import com.android.tools.smali.dexlib2.AccessFlags + +internal val unstableContentProviderFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + parameters("Landroid/content/ContentResolver;", "[Ljava/lang/String;") + instructions( + // Early targets use HashMap and later targets use ConcurrentMap. + methodCall( + name = "putAll", + parameters = listOf("Ljava/util/Map;") + ), + string("ContentProvider query returned null cursor") + ) +} 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 b63eec7941..f97139e40f 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 @@ -29,7 +29,6 @@ private const val EXTENSION_CLASS_DESCRIPTOR = * 6. Resume the video * 7. Playback speed will incorrectly change to 1.0x. */ -@Suppress("unused") val fixPlaybackSpeedWhilePlayingPatch = bytecodePatch{ dependsOn( sharedExtensionPatch, 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 7f109d54b8..f59533a42f 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 @@ -26,6 +26,7 @@ import app.revanced.patches.shared.misc.settings.preference.TextPreference import app.revanced.patches.shared.misc.settings.settingsPatch import app.revanced.patches.youtube.misc.check.checkEnvironmentPatch import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch +import app.revanced.patches.youtube.misc.fix.contentprovider.fixContentProviderPatch import app.revanced.patches.youtube.misc.fix.playbackspeed.fixPlaybackSpeedWhilePlayingPatch import app.revanced.patches.youtube.misc.playservice.is_19_34_or_greater import app.revanced.patches.youtube.misc.playservice.is_20_31_or_greater @@ -177,6 +178,7 @@ val settingsPatch = bytecodePatch( addResourcesPatch, versionCheckPatch, fixPlaybackSpeedWhilePlayingPatch, + fixContentProviderPatch, // Currently there is no easy way to make a mandatory patch, // so for now this is a dependent of this patch. checkEnvironmentPatch, From b7c995930a60fa48c101f2c070b39d1ee62136d9 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Nov 2025 19:47:40 +0200 Subject: [PATCH 55/59] fix custom speeds over 2.0/4.0 not working --- .../speed/custom/CustomPlaybackSpeedPatch.kt | 16 +++++++++++----- .../youtube/video/speed/custom/Fingerprints.kt | 8 ++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) 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 f981e31e08..b3bc0a593f 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 @@ -26,6 +26,7 @@ import app.revanced.patches.youtube.misc.recyclerviewtree.hook.recyclerViewTreeH import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.video.speed.settingsMenuVideoSpeedGroup import app.revanced.util.indexOfFirstLiteralInstructionOrThrow +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 @@ -33,7 +34,7 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableField private const val FILTER_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/components/PlaybackSpeedMenuFilter;" -internal const val EXTENSION_CLASS_DESCRIPTOR = +private const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/youtube/patches/playback/speed/CustomPlaybackSpeedPatch;" internal val customPlaybackSpeedPatch = bytecodePatch( @@ -59,7 +60,7 @@ internal val customPlaybackSpeedPatch = bytecodePatch( TextPreference( "revanced_custom_playback_speeds", inputType = InputType.TEXT_MULTI_LINE - ), + ) ) ) @@ -82,6 +83,11 @@ internal val customPlaybackSpeedPatch = bytecodePatch( replaceInstruction(limitMaxIndex, "const/high16 v$limitMaxRegister, 8.0f") } + // Turn off client side flag that use server provided min/max speeds. + if (is_20_34_or_greater) { + serverSideMaxSpeedFeatureFlagFingerprint.method.returnEarly(false) + } + // region Force old video quality menu. // Replace the speeds float array with custom speeds. @@ -173,9 +179,9 @@ internal val customPlaybackSpeedPatch = bytecodePatch( addInstructions( index + 1, """ - invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->tapAndHoldSpeed()F - move-result v$register - """ + 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 657bd1162e..cbdd2730b5 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 @@ -28,6 +28,14 @@ internal val showOldPlaybackSpeedMenuExtensionFingerprint = fingerprint { custom { method, _ -> method.name == "showOldPlaybackSpeedMenu" } } +internal val serverSideMaxSpeedFeatureFlagFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + instructions( + literal(45719140L) + ) +} + internal val speedArrayGeneratorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) returns("[L") From afbcf3d90fd2439e5a03528c4efdec3cc06f12d9 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sat, 8 Nov 2025 22:06:54 +0200 Subject: [PATCH 56/59] fix exit fullscreen patch --- .../player/fullscreen/ExitFullscreenPatch.kt | 17 ++++++++--------- .../youtube/video/information/Fingerprints.kt | 16 ++++++++++++++++ .../video/information/VideoInformationPatch.kt | 6 ++++++ 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt index 3a1461e0be..2f9e701c50 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt @@ -9,8 +9,8 @@ import app.revanced.patches.youtube.misc.playercontrols.playerControlsPatch import app.revanced.patches.youtube.misc.playertype.playerTypeHookPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen import app.revanced.patches.youtube.misc.settings.settingsPatch -import app.revanced.patches.youtube.shared.loopVideoFingerprint -import app.revanced.patches.youtube.shared.loopVideoParentFingerprint +import app.revanced.patches.youtube.video.information.videoEndMethod +import app.revanced.patches.youtube.video.information.videoInformationPatch import app.revanced.util.addInstructionsAtControlFlowLabel @Suppress("unused") @@ -32,7 +32,8 @@ internal val exitFullscreenPatch = bytecodePatch( settingsPatch, addResourcesPatch, playerTypeHookPatch, - playerControlsPatch + playerControlsPatch, + videoInformationPatch ) // Cannot declare as top level since this patch is in the same package as @@ -48,11 +49,9 @@ internal val exitFullscreenPatch = bytecodePatch( ListPreference("revanced_exit_fullscreen") ) - loopVideoFingerprint.match(loopVideoParentFingerprint.originalClassDef).method.apply { - addInstructionsAtControlFlowLabel( - implementation!!.instructions.lastIndex, - "invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->endOfVideoReached()V", - ) - } + videoEndMethod.addInstructionsAtControlFlowLabel( + 0, + "invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->endOfVideoReached()V", + ) } } diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt index b28b6fbf89..98a292358b 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/Fingerprints.kt @@ -2,6 +2,8 @@ package app.revanced.patches.youtube.video.information import app.revanced.patcher.fieldAccess import app.revanced.patcher.fingerprint +import app.revanced.patcher.literal +import app.revanced.patcher.methodCall import app.revanced.patcher.string import app.revanced.patches.youtube.shared.videoQualityChangedFingerprint import app.revanced.util.getReference @@ -118,6 +120,20 @@ internal val seekRelativeFingerprint = fingerprint { ) } +internal val videoEndFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("Z") + parameters("J", "L") + instructions( + methodCall( + parameters = listOf(), + returnType = "V" + ), + literal(45368273L, maxAfter = 5), + string("Attempting to seek when video is not playing"), + ) +} + /** * Resolves with the class found in [videoQualityChangedFingerprint]. */ diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt index 05738010c3..b09a2dccbc 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/video/information/VideoInformationPatch.kt @@ -70,6 +70,8 @@ private var speedSelectionValueRegister = -1 private lateinit var setPlaybackSpeedMethod: MutableMethod private var setPlaybackSpeedMethodIndex = -1 +internal lateinit var videoEndMethod: MutableMethod + // Used by other patches. internal lateinit var setPlaybackSpeedContainerClassFieldReference: FieldReference private set @@ -143,6 +145,10 @@ val videoInformationPatch = bytecodePatch( } } + videoEndFingerprint.let { + videoEndMethod = navigate(it.originalMethod).to(it.instructionMatches[0].index).stop() + } + /* * Inject call for video ids */ From 81a429af7449ead32b9897ca8dec57300d42d685 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 9 Nov 2025 09:13:58 +0200 Subject: [PATCH 57/59] delete deprecated binary compatibility --- patches/api/patches.api | 16 --- .../music/layout/castbutton/HideCastButton.kt | 10 -- .../layout/hide/createbutton/Fingerprints.kt | 31 ----- .../createbutton/HideCreateButtonPatch.kt | 110 --------------- .../patches/spotify/misc/fix/Fingerprints.kt | 53 -------- .../spotify/misc/fix/SpoofClientPatch.kt | 125 ------------------ .../twitter/misc/links/Fingerprints.kt | 5 - .../links/OpenLinksWithAppChooserPatch.kt | 31 ----- 8 files changed, 381 deletions(-) delete mode 100644 patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofClientPatch.kt delete mode 100644 patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch.kt diff --git a/patches/api/patches.api b/patches/api/patches.api index 9105dac35e..dc1d7c1e06 100644 --- a/patches/api/patches.api +++ b/patches/api/patches.api @@ -376,10 +376,6 @@ public final class app/revanced/patches/music/layout/buttons/HideButtonsKt { public static final fun getHideButtons ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/music/layout/castbutton/HideCastButtonKt { - public static final fun getHideCastButton ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/music/layout/compactheader/HideCategoryBarKt { public static final fun getHideCategoryBar ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1069,10 +1065,6 @@ public final class app/revanced/patches/soundcloud/offlinesync/EnableOfflineSync public static final fun getEnableOfflineSync ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatchKt { - public static final fun getHideCreateButtonPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/spotify/layout/theme/CustomThemePatchKt { public static final fun getCustomThemePatch ()Lapp/revanced/patcher/patch/ResourcePatch; } @@ -1081,10 +1073,6 @@ public final class app/revanced/patches/spotify/misc/extension/ExtensionPatchKt public static final fun getSharedExtensionPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/spotify/misc/fix/SpoofClientPatchKt { - public static final fun getSpoofClientPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/spotify/misc/fix/login/FixFacebookLoginPatchKt { public static final fun getFixFacebookLoginPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } @@ -1317,10 +1305,6 @@ public final class app/revanced/patches/twitter/misc/links/ChangeLinkSharingDoma public static final fun getChangeLinkSharingDomainPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } -public final class app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatchKt { - public static final fun getOpenLinksWithAppChooserPatch ()Lapp/revanced/patcher/patch/BytecodePatch; -} - public final class app/revanced/patches/twitter/misc/links/SanitizeSharingLinksPatchKt { public static final fun getSanitizeSharingLinksPatch ()Lapp/revanced/patcher/patch/BytecodePatch; } diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt deleted file mode 100644 index bb6053f8ab..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/castbutton/HideCastButton.kt +++ /dev/null @@ -1,10 +0,0 @@ -package app.revanced.patches.music.layout.castbutton - -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.music.layout.buttons.hideButtons - -@Deprecated("Patch was moved", ReplaceWith("hideButtons")) -@Suppress("unused") -val hideCastButton = bytecodePatch{ - dependsOn(hideButtons) -} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt deleted file mode 100644 index d9235b8c80..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/Fingerprints.kt +++ /dev/null @@ -1,31 +0,0 @@ -package app.revanced.patches.spotify.layout.hide.createbutton - -import app.revanced.patcher.fingerprint -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 - -@Deprecated("Obsolete") -internal val navigationBarItemSetClassFingerprint = fingerprint { - strings("NavigationBarItemSet(") -} - -@Deprecated("Obsolete") -internal val navigationBarItemSetConstructorFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) - // Make sure the method checks whether navigation bar items are null before adding them. - // If this is not true, then we cannot patch the method and potentially transform the parameters into null. - opcodes(Opcode.IF_EQZ, Opcode.INVOKE_VIRTUAL) - custom { method, _ -> - method.indexOfFirstInstruction { - getReference()?.name == "add" - } >= 0 - } -} - -@Deprecated("Obsolete") -internal val oldNavigationBarAddItemFingerprint = fingerprint { - strings("Bottom navigation tabs exceeds maximum of 5 tabs") -} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt deleted file mode 100644 index 465f18d690..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/layout/hide/createbutton/HideCreateButtonPatch.kt +++ /dev/null @@ -1,110 +0,0 @@ -package app.revanced.patches.spotify.layout.hide.createbutton - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch -import app.revanced.util.getReference -import app.revanced.util.indexOfFirstInstructionOrThrow -import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference - -private const val EXTENSION_CLASS_DESCRIPTOR = - "Lapp/revanced/extension/spotify/layout/hide/createbutton/HideCreateButtonPatch;" - -@Deprecated("Patch no longer works with the latest version of Spotify, " + - "and Spotify has added this functionality to the app") -@Suppress("unused") -val hideCreateButtonPatch = bytecodePatch( - description = "Hides the \"Create\" button in the navigation bar. The latest app targets do not need this patch.", -) { - compatibleWith("com.spotify.music") - - dependsOn(sharedExtensionPatch) - - execute { - val oldNavigationBarAddItemMethod = oldNavigationBarAddItemFingerprint.originalMethodOrNull - // Only throw the fingerprint error when oldNavigationBarAddItemMethod does not exist. - val navigationBarItemSetClassDef = if (oldNavigationBarAddItemMethod == null) { - navigationBarItemSetClassFingerprint.originalClassDef - } else { - navigationBarItemSetClassFingerprint.originalClassDefOrNull - } - - if (navigationBarItemSetClassDef != null) { - // Main patch for newest and most versions. - // The NavigationBarItemSet constructor accepts multiple parameters which represent each navigation bar item. - // Each item is manually checked whether it is not null and then added to a LinkedHashSet. - // Since the order of the items can differ, we are required to check every parameter to see whether it is the - // Create button. So, for every parameter passed to the method, invoke our extension method and overwrite it - // to null in case it is the Create button. - navigationBarItemSetConstructorFingerprint.match(navigationBarItemSetClassDef).method.apply { - // Add 1 to the index because the first parameter register is `this`. - val parameterTypesWithRegister = parameterTypes.mapIndexed { index, parameterType -> - parameterType to (index + 1) - } - - val returnNullIfIsCreateButtonDescriptor = - "$EXTENSION_CLASS_DESCRIPTOR->returnNullIfIsCreateButton(Ljava/lang/Object;)Ljava/lang/Object;" - - parameterTypesWithRegister.reversed().forEach { (parameterType, parameterRegister) -> - addInstructions( - 0, - """ - invoke-static { p$parameterRegister }, $returnNullIfIsCreateButtonDescriptor - move-result-object p$parameterRegister - check-cast p$parameterRegister, $parameterType - """ - ) - } - } - } - - if (oldNavigationBarAddItemMethod != null) { - // In case an older version of the app is being patched, hook the old method which adds navigation bar items. - // Return early if the navigation bar item title resource id is the old Create button title resource id. - oldNavigationBarAddItemFingerprint.methodOrNull?.apply { - val getNavigationBarItemTitleStringIndex = indexOfFirstInstructionOrThrow { - val reference = getReference() - reference?.definingClass == "Landroid/content/res/Resources;" && reference.name == "getString" - } - // This register is a parameter register, so it can be used at the start of the method when adding - // the new instructions. - val oldNavigationBarItemTitleResIdRegister = - getInstruction(getNavigationBarItemTitleStringIndex).registerD - - // The instruction where the normal method logic starts. - val firstInstruction = getInstruction(0) - - val isOldCreateButtonDescriptor = - "$EXTENSION_CLASS_DESCRIPTOR->isOldCreateButton(I)Z" - - val returnEarlyInstruction = if (returnType == "V") { - // In older implementations the method return value is void. - "return-void" - } else { - // In newer implementations - // return null because the method return value is a BottomNavigationItemView. - "const/4 v0, 0\n" + - "return-object v0" - } - - addInstructionsWithLabels( - 0, - """ - invoke-static { v$oldNavigationBarItemTitleResIdRegister }, $isOldCreateButtonDescriptor - move-result v0 - - # If this navigation bar item is not the Create button, jump to the normal method logic. - if-eqz v0, :normal-method-logic - - $returnEarlyInstruction - """, - ExternalLabel("normal-method-logic", firstInstruction) - ) - } - } - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt deleted file mode 100644 index 4bb51b5bc2..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt +++ /dev/null @@ -1,53 +0,0 @@ -package app.revanced.patches.spotify.misc.fix - -import app.revanced.patcher.fingerprint -import app.revanced.patcher.string -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 loadOrbitLibraryFingerprint = fingerprint { - strings("/liborbit-jni-spotify.so") -} - -internal val setClientIdFingerprint = fingerprint { - parameters("Ljava/lang/String;") - custom { method, classDef -> - classDef.type == "Lcom/spotify/connectivity/ApplicationScopeConfiguration;" - && method.name == "setClientId" - } -} - -internal val setUserAgentFingerprint = fingerprint { - parameters("Ljava/lang/String;") - custom { method, classDef -> - classDef.type == "Lcom/spotify/connectivity/ApplicationScopeConfiguration;" - && method.name == "setDefaultHTTPUserAgent" - } -} - -internal val extensionFixConstantsFingerprint = fingerprint { - custom { _, classDef -> classDef.type == "Lapp/revanced/extension/spotify/misc/fix/Constants;" } -} - -internal val runIntegrityVerificationFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - opcodes( - Opcode.CHECK_CAST, - Opcode.INVOKE_VIRTUAL, - Opcode.INVOKE_STATIC, // Calendar.getInstance() - Opcode.MOVE_RESULT_OBJECT, - Opcode.INVOKE_VIRTUAL, // instance.get(6) - Opcode.MOVE_RESULT, - Opcode.IF_EQ, // if (x == instance.get(6)) return - ) - custom { method, _ -> - method.indexOfFirstInstruction { - val reference = getReference() - reference?.definingClass == "Ljava/util/Calendar;" && reference.name == "get" - } >= 0 - } -} diff --git a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofClientPatch.kt b/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofClientPatch.kt deleted file mode 100644 index d57370b3f4..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofClientPatch.kt +++ /dev/null @@ -1,125 +0,0 @@ -package app.revanced.patches.spotify.misc.fix - -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patcher.patch.intOption -import app.revanced.patcher.patch.stringOption -import app.revanced.patches.shared.misc.hex.HexPatchBuilder -import app.revanced.patches.shared.misc.hex.hexPatch -import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch -import app.revanced.util.returnEarly - -internal const val EXTENSION_CLASS_DESCRIPTOR = "Lapp/revanced/extension/spotify/misc/fix/SpoofClientPatch;" - -@Deprecated("Patch no longer functions") -@Suppress("unused") -val spoofClientPatch = bytecodePatch( - description = "Spoofs the client to fix various functions of the app.", -) { - val requestListenerPort by intOption( - key = "requestListenerPort", - default = 4345, - title = "Request listener port", - description = "The port to use for the listener that intercepts and handles spoofed requests. " + - "Port must be between 0 and 65535. " + - "Do not change this option, if you do not know what you are doing.", - validator = { - it!! - !(it < 0 || it > 65535) - } - ) - - val clientVersion by stringOption( - key = "clientVersion", - default = "iphone-9.0.58.558.g200011c", - title = "Client version", - description = "The client version used for spoofing the client token. " + - "Do not change this option, if you do not know what you are doing." - ) - - val hardwareMachine by stringOption( - key = "hardwareMachine", - default = "iPhone16,1", - title = "Hardware machine", - description = "The hardware machine used for spoofing the client token. " + - "Do not change this option, if you do not know what you are doing." - ) - - val systemVersion by stringOption( - key = "systemVersion", - default = "17.7.2", - title = "System version", - description = "The system version used for spoofing the client token. " + - "Do not change this option, if you do not know what you are doing." - ) - - dependsOn( - sharedExtensionPatch, - hexPatch(ignoreMissingTargetFiles = true, block = fun HexPatchBuilder.() { - listOf( - "arm64-v8a", - "armeabi-v7a", - "x86", - "x86_64" - ).forEach { architecture -> - "https://clienttoken.spotify.com/v1/clienttoken" to - "http://127.0.0.1:$requestListenerPort/v1/clienttoken" inFile - "lib/$architecture/liborbit-jni-spotify.so" - } - }) - ) - - compatibleWith("com.spotify.music") - - execute { - val clientVersion = clientVersion!! - val hardwareMachine = hardwareMachine!! - val systemVersion = systemVersion!! - - // region Spoof login request. - - val version = clientVersion - .substringAfter('-') - .substringBeforeLast('.') - .substringBeforeLast('.') - - setUserAgentFingerprint.method.addInstruction( - 0, - "const-string p1, \"Spotify/$version iOS/$systemVersion ($hardwareMachine)\"" - ) - - setClientIdFingerprint.method.addInstruction( - 0, "const-string p1, \"58bd3c95768941ea9eb4350aaa033eb3\"" - ) - - // endregion - - // region Spoof client-token request. - - loadOrbitLibraryFingerprint.method.addInstructions( - 0, - """ - const/16 v0, $requestListenerPort - invoke-static { v0 }, $EXTENSION_CLASS_DESCRIPTOR->launchListener(I)V - """ - ) - - mapOf( - "getClientVersion" to clientVersion, - "getSystemVersion" to systemVersion, - "getHardwareMachine" to hardwareMachine - ).forEach { (methodName, value) -> - extensionFixConstantsFingerprint.classDef.methods.single { it.name == methodName }.returnEarly(value) - } - - // endregion - - // region Disable verdicts. - - // Early return to block sending bad verdicts to the API. - runIntegrityVerificationFingerprint.method.returnEarly() - - // endregion - } -} 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 6117798ebf..90e4a16f4b 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 @@ -3,11 +3,6 @@ package app.revanced.patches.twitter.misc.links import app.revanced.patcher.fingerprint import com.android.tools.smali.dexlib2.AccessFlags -internal val openLinkFingerprint = fingerprint { - returns("V") - parameters("Landroid/content/Context;", "Landroid/content/Intent;", "Landroid/os/Bundle;") -} - internal val sanitizeSharingLinksFingerprint = fingerprint { returns("Ljava/lang/String;") strings("", "shareParam", "sessionToken") diff --git a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch.kt b/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch.kt deleted file mode 100644 index 9c109e3602..0000000000 --- a/patches/src/main/kotlin/app/revanced/patches/twitter/misc/links/OpenLinksWithAppChooserPatch.kt +++ /dev/null @@ -1,31 +0,0 @@ -package app.revanced.patches.twitter.misc.links - -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.bytecodePatch -import app.revanced.patches.twitter.misc.extension.sharedExtensionPatch - -@Deprecated("Patch is obsolete and no longer needed with the highest supported app target. " + - "This patch will soon be deleted.") -@Suppress("unused") -val openLinksWithAppChooserPatch = bytecodePatch( - description = "Instead of opening links directly, open them with an app chooser. " + - "As a result you can select a browser to open the link with.", -) { - dependsOn(sharedExtensionPatch) - - compatibleWith("com.twitter.android"("10.48.0-release.0")) - - execute { - val methodReference = - "Lapp/revanced/extension/twitter/patches/links/OpenLinksWithAppChooserPatch;->" + - "openWithChooser(Landroid/content/Context;Landroid/content/Intent;)V" - - openLinkFingerprint.method.addInstructions( - 0, - """ - invoke-static { p0, p1 }, $methodReference - return-void - """, - ) - } -} From 2687b3006b83d1f118a29e737c1c34a394e10779 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Sun, 9 Nov 2025 10:16:34 +0200 Subject: [PATCH 58/59] fix loop video not working --- .../layout/branding/CustomBrandingPatch.kt | 5 ----- .../player/fullscreen/ExitFullscreenPatch.kt | 14 +++++++++---- .../youtube/misc/loopvideo/Fingerprints.kt | 14 +++++++++++++ .../youtube/misc/loopvideo/LoopVideoPatch.kt | 17 ++++++++------- .../patches/youtube/shared/Fingerprints.kt | 21 ------------------- 5 files changed, 34 insertions(+), 37 deletions(-) create mode 100644 patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt diff --git a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt index d45160e228..3e814898f2 100644 --- a/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/music/layout/branding/CustomBrandingPatch.kt @@ -10,15 +10,10 @@ import app.revanced.patches.music.misc.gms.Constants.MUSIC_PACKAGE_NAME import app.revanced.patches.music.misc.gms.musicActivityOnCreateFingerprint import app.revanced.patches.music.misc.settings.PreferenceScreen import app.revanced.patches.shared.layout.branding.baseCustomBrandingPatch -import app.revanced.patches.shared.misc.mapping.ResourceType -import app.revanced.patches.shared.misc.mapping.getResourceId - import app.revanced.patches.shared.misc.mapping.resourceMappingPatch - import app.revanced.util.getReference import app.revanced.util.indexOfFirstInstructionOrThrow import app.revanced.util.indexOfFirstInstructionReversed -import app.revanced.util.indexOfFirstLiteralInstructionOrThrow import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.reference.MethodReference diff --git a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt index 2f9e701c50..d0bf1a5b5a 100644 --- a/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/ExitFullscreenPatch.kt @@ -12,6 +12,8 @@ import app.revanced.patches.youtube.misc.settings.settingsPatch import app.revanced.patches.youtube.video.information.videoEndMethod import app.revanced.patches.youtube.video.information.videoInformationPatch import app.revanced.util.addInstructionsAtControlFlowLabel +import app.revanced.util.indexOfFirstInstructionReversedOrThrow +import com.android.tools.smali.dexlib2.Opcode @Suppress("unused") internal val exitFullscreenPatch = bytecodePatch( @@ -49,9 +51,13 @@ internal val exitFullscreenPatch = bytecodePatch( ListPreference("revanced_exit_fullscreen") ) - videoEndMethod.addInstructionsAtControlFlowLabel( - 0, - "invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->endOfVideoReached()V", - ) + videoEndMethod.apply { + val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.RETURN_VOID) + + addInstructionsAtControlFlowLabel( + insertIndex, + "invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->endOfVideoReached()V", + ) + } } } 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 new file mode 100644 index 0000000000..3101e61dcb --- /dev/null +++ b/patches/src/main/kotlin/app/revanced/patches/youtube/misc/loopvideo/Fingerprints.kt @@ -0,0 +1,14 @@ +package app.revanced.patches.youtube.misc.loopvideo + +import app.revanced.patcher.fingerprint +import app.revanced.patcher.string +import com.android.tools.smali.dexlib2.AccessFlags + +internal val videoStartPlaybackFingerprint = fingerprint { + accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) + returns("V") + instructions( + string("play() called when the player wasn't loaded."), + string("play() blocked because Background Playability failed") + ) +} 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 f2edb91c44..5b6d7138b4 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 @@ -7,8 +7,8 @@ import app.revanced.patches.shared.misc.settings.preference.SwitchPreference import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch import app.revanced.patches.youtube.misc.loopvideo.button.loopVideoButtonPatch import app.revanced.patches.youtube.misc.settings.PreferenceScreen -import app.revanced.patches.youtube.shared.loopVideoFingerprint -import app.revanced.patches.youtube.shared.loopVideoParentFingerprint +import app.revanced.patches.youtube.video.information.videoEndMethod +import app.revanced.patches.youtube.video.information.videoInformationPatch import app.revanced.util.addInstructionsAtControlFlowLabel import app.revanced.util.indexOfFirstInstructionReversedOrThrow import com.android.tools.smali.dexlib2.Opcode @@ -22,7 +22,8 @@ val loopVideoPatch = bytecodePatch( dependsOn( sharedExtensionPatch, addResourcesPatch, - loopVideoButtonPatch + loopVideoButtonPatch, + videoInformationPatch ) compatibleWith( @@ -40,9 +41,10 @@ val loopVideoPatch = bytecodePatch( SwitchPreference("revanced_loop_video"), ) - loopVideoFingerprint.match(loopVideoParentFingerprint.originalClassDef).method.apply { - val playMethod = loopVideoParentFingerprint.method - val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.RETURN_VOID) + videoEndMethod.apply { + // Add call to start playback again, but must not allow exit fullscreen patch call + // to be reached if the video is looped. + val insertIndex = indexOfFirstInstructionReversedOrThrow(Opcode.INVOKE_VIRTUAL) + 1 addInstructionsAtControlFlowLabel( insertIndex, @@ -50,7 +52,8 @@ val loopVideoPatch = bytecodePatch( invoke-static {}, $EXTENSION_CLASS_DESCRIPTOR->shouldLoopVideo()Z move-result v0 if-eqz v0, :do_not_loop - invoke-virtual { p0 }, $playMethod + invoke-virtual { p0 }, ${videoStartPlaybackFingerprint.method} + return-void :do_not_loop nop """ 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 4a66e83b7f..6ada54fb28 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 @@ -29,27 +29,6 @@ internal val conversionContextFingerprintToString = fingerprint { } } -/** - * Resolves to class found in [loopVideoParentFingerprint]. - */ -internal val loopVideoFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - parameters() - custom { method, _ -> - method.implementation!!.instructions.count() == 3 && method.annotations.isEmpty() - } -} - -internal val loopVideoParentFingerprint = fingerprint { - accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) - returns("V") - instructions( - string("play() called when the player wasn't loaded."), - string("play() blocked because Background Playability failed") - ) -} - internal val layoutConstructorFingerprint = fingerprint { accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) returns("V") From a1a80ebc5751d2ca5740ba07e64ac3102c35de41 Mon Sep 17 00:00:00 2001 From: LisoUseInAIKyrios <118716522+LisoUseInAIKyrios@users.noreply.github.com> Date: Mon, 10 Nov 2025 10:43:08 +0200 Subject: [PATCH 59/59] fix search results patches --- .../app/revanced/extension/youtube/shared/NavigationBar.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java index 19add5c489..52d2f1dcf4 100644 --- a/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java +++ b/extensions/youtube/src/main/java/app/revanced/extension/youtube/shared/NavigationBar.java @@ -74,7 +74,7 @@ public static void setToolbar(FrameLayout layout) { */ public static boolean isSearchBarActive() { View searchbarResults = searchBarResultsRef.get(); - return searchbarResults != null && searchbarResults.getParent() != null; + return searchbarResults != null && searchbarResults.isShown(); } public static boolean isBackButtonVisible() {