From 3a3ee89518d0691ccdca4df981c72873a47a0b03 Mon Sep 17 00:00:00 2001 From: inotia00 <108592928+inotia00@users.noreply.github.com> Date: Wed, 3 Apr 2024 22:36:31 +0900 Subject: [PATCH] refactor: fix patch structure --- .../account/component/MenuComponentPatch.kt | 56 +--- .../fingerprints/MenuEntryFingerprint.kt | 2 +- .../{HideHandlePatch.kt => HandlePatch.kt} | 41 +-- ...ntSwitcherAccessibilityLabelFingerprint.kt | 2 +- ...InactiveAccountThumbnailSizeFingerprint.kt | 2 +- .../music/account/tos/TermsContainerPatch.kt | 85 ++--- .../fingerprints/TermsOfServiceFingerprint.kt | 2 +- .../component/ActionBarComponentPatch.kt | 86 ++--- .../ActionBarComponentFingerprint.kt | 2 +- .../LikeDislikeContainerFingerprint.kt | 2 +- .../music/ads/general/GeneralAdsPatch.kt | 100 +++--- .../fingerprints/FloatingLayoutFingerprint.kt | 2 +- .../InterstitialsContainerFingerprint.kt | 2 +- .../fingerprints/NotifierShelfFingerprint.kt | 2 +- .../ShowDialogCommandFingerprint.kt | 2 +- .../patches/music/ads/music/MusicAdsPatch.kt | 4 +- .../compactdialog/CompactDialogPatch.kt | 59 +--- .../fingerprints/DialogSolidFingerprint.kt | 2 +- .../flyoutpanel/component/FlyoutPanelPatch.kt | 45 +-- .../EndButtonsContainerFingerprint.kt | 2 +- .../fingerprints/SleepTimerFingerprint.kt | 2 +- .../replace/ReplaceDismissQueuePatch.kt | 34 +- .../flyoutpanel/replace/ReplaceReportPatch.kt | 39 +-- .../fingerprints/TouchOutsideFingerprint.kt | 2 +- .../shared/FlyoutPanelMenuItemPatch.kt | 6 +- .../fingerprints/MenuItemFingerprint.kt | 2 +- .../music/general/amoled/AmoledPatch.kt | 32 +- .../autocaptions/AutoCaptionsBytecodePatch.kt | 6 + .../general/autocaptions/AutoCaptionsPatch.kt | 44 +-- ...uttonShelfPatch.kt => ButtonShelfPatch.kt} | 47 +-- ...selShelfPatch.kt => CarouselShelfPatch.kt} | 47 +-- ...eCastButtonPatch.kt => CastButtonPatch.kt} | 41 +-- .../MediaRouteButtonFingerprint.kt | 2 +- .../PlayerOverlayChipFingerprint.kt | 2 +- .../general/categorybar/CategoryBarPatch.kt | 39 +-- .../fingerprints/ChipCloudFingerprint.kt | 2 +- ...inesPatch.kt => ChannelGuidelinesPatch.kt} | 47 +-- .../general/customfilter/CustomFilterPatch.kt | 47 +-- .../RemoveViewerDiscretionDialogPatch.kt | 47 --- .../ViewerDiscretionDialogBytecodePatch.kt | 6 + .../dialog/ViewerDiscretionDialogPatch.kt | 28 ++ ...mojiPickerPatch.kt => EmojiPickerPatch.kt} | 47 +-- ...tButtonPatch.kt => FloatingButtonPatch.kt} | 39 +-- .../fingerprints/FloatingButtonFingerprint.kt | 2 +- .../FloatingButtonParentFingerprint.kt | 2 +- ...ryButtonPatch.kt => HistoryButtonPatch.kt} | 39 +-- .../HistoryMenuItemFingerprint.kt | 2 +- .../HistoryMenuItemOfflineTabFingerprint.kt | 2 +- .../landscapemode/LandScapeModePatch.kt | 56 ++-- .../TabletIdentifierFingerprint.kt | 2 +- .../OldStyleLibraryShelfPatch.kt | 42 +-- .../fingerprints/BrowseIdFingerprint.kt | 2 +- ...ylistCardPatch.kt => PlaylistCardPatch.kt} | 47 +-- .../redirection/DislikeRedirectionPatch.kt | 37 +-- ...ampleShelfPatch.kt => SampleShelfPatch.kt} | 47 +-- .../general/startpage/ChangeStartPagePatch.kt | 37 +-- .../fingerprints/ColdStartUpFingerprint.kt | 2 +- ...ttonPatch.kt => TapToUpdateButtonPatch.kt} | 37 +-- .../fingerprints/ContentPillInFingerprint.kt | 2 +- .../tooltip/TooltipContentViewPatch.kt | 33 +- .../TooltipContentViewFingerprint.kt | 2 +- .../voicesearch/VoiceSearchButtonPatch.kt | 44 +-- .../branding/icon/CustomBrandingIconPatch.kt | 30 +- .../branding/name/CustomBrandingNamePatch.kt | 38 +-- .../DoubleTapOverlayBackgroundPatch.kt | 46 +-- .../OverlayFilterBytecodePatch.kt | 4 +- .../overlayfilter/OverlayFilterPatch.kt | 37 +-- .../DesignBottomSheetDialogFingerprint.kt | 2 +- .../playeroverlay/PlayerOverlayFilterPatch.kt | 48 +-- .../backgroundplay/BackgroundPlayPatch.kt | 31 +- .../BackgroundPlaybackFingerprint.kt | 2 +- .../misc/bitrate/BitrateDefaultValuePatch.kt | 30 +- .../music/misc/codecs/CodecsUnlockPatch.kt | 47 --- .../codecs/ForceOpusCodecBytecodePatch.kt | 8 + .../music/misc/codecs/ForceOpusCodecPatch.kt | 29 ++ .../music/misc/debugging/DebuggingPatch.kt | 32 +- .../exclusiveaudio/ExclusiveAudioPatch.kt | 54 +-- .../DataSavingSettingsFragmentFingerprint.kt | 7 +- .../MusicBrowserServiceFingerprint.kt | 2 +- .../fingerprints/PodCastConfigFingerprint.kt | 2 +- .../MinimizedPlaybackPatch.kt | 31 +- .../MinimizedPlaybackManagerFingerprint.kt | 2 +- .../music/misc/premium/GetPremiumPatch.kt | 90 +++++ .../music/misc/premium/HideGetPremiumPatch.kt | 123 ------- .../AccountMenuFooterFingerprint.kt | 2 +- .../fingerprints/HideGetPremiumFingerprint.kt | 2 +- .../MembershipSettingsFingerprint.kt | 2 +- .../MembershipSettingsParentFingerprint.kt | 2 +- .../SpoofAppVersionBytecodePatch.kt | 8 + .../spoofappversion/SpoofAppVersionPatch.kt | 48 +-- .../misc/tastebuilder/TasteBuilderPatch.kt | 33 +- .../TasteBuilderConstructorFingerprint.kt | 2 +- .../TasteBuilderSyntheticFingerprint.kt | 2 +- .../tracking/SanitizeUrlQueryBytecodePatch.kt | 15 + .../misc/tracking/SanitizeUrlQueryPatch.kt | 46 +-- .../ShareLinkFormatterFingerprint.kt | 2 +- .../misc/translations/TranslationsPatch.kt | 87 +++-- .../black/BlackNavigationBarPatch.kt | 39 +-- .../fingerprints/TabLayoutFingerprint.kt | 2 +- .../component/NavigationBarComponentPatch.kt | 66 ++-- .../fingerprints/TabLayoutTextFingerprint.kt | 2 +- .../colormatchplayer/ColorMatchPlayerPatch.kt | 39 +-- .../minimizedplayer/MinimizedPlayerPatch.kt | 49 +-- .../MinimizedPlayerFingerprint.kt | 2 +- .../nextprevious/MiniPlayerButtonPatch.kt | 49 +-- .../MiniPlayerButtonResourcePatch.kt | 2 + .../MiniPlayerParentFingerprint.kt | 2 +- .../MppWatchWhileLayoutFingerprint.kt | 2 +- .../NextButtonVisibilityFingerprint.kt | 2 +- .../PlayerPatchConstructorFingerprint.kt | 6 +- .../OldPlayerBackgroundPatch.kt | 62 +--- .../OldPlayerBackgroundFingerprint.kt | 5 +- .../oldplayerlayout/OldPlayerLayoutPatch.kt | 62 +--- .../OldPlayerLayoutFingerprint.kt | 2 +- .../player/repeat/RememberRepeatPatch.kt | 37 +-- .../fingerprints/RepeatTrackFingerprint.kt | 2 +- .../player/replace/ReplaceCastButtonPatch.kt | 38 +-- .../CastButtonContainerFingerprint.kt | 2 +- .../music/player/share/ShareButtonPatch.kt | 39 +-- .../RemixGenericButtonFingerprint.kt | 2 +- .../player/shuffle/RememberShufflePatch.kt | 61 ++-- .../MusicPlaybackControlsFingerprint.kt | 6 +- .../ShuffleClassReferenceFingerprint.kt | 2 +- .../SwipeToDismissMiniPlayerPatch.kt | 45 +-- .../HandleSearchRenderedFingerprint.kt | 2 +- .../HandleSignInEventFingerprint.kt | 2 +- .../InteractionLoggingEnumFingerprint.kt | 2 +- .../MiniPlayerDefaultTextFingerprint.kt | 2 +- ...iPlayerDefaultViewVisibilityFingerprint.kt | 5 +- .../MusicActivityWidgetFingerprint.kt | 2 +- .../fingerprints/SwipeToCloseFingerprint.kt | 2 +- .../music/player/zenmode/ZenModePatch.kt | 55 +--- .../fingerprints/ZenModeFingerprint.kt | 2 +- .../MiniPlayerConstructorFingerprint.kt | 2 +- .../PendingIntentReceiverFingerprint.kt | 2 +- .../SeekBarConstructorFingerprint.kt | 2 +- .../SwitchToggleColorFingerprint.kt | 2 +- .../TouchExplorationHoverEventFingerprint.kt | 2 +- .../AndroidAutoCertificatePatch.kt | 31 +- .../CertificateCheckFingerprint.kt | 2 +- .../FileProviderResolverFingerprint.kt | 2 +- .../music/utils/gms/GmsCoreSupportPatch.kt | 19 +- .../music/utils/integrations/Constants.kt | 32 +- .../fingerprints/InitFingerprint.kt | 2 +- .../mainactivity/MainActivityResolvePatch.kt | 10 +- .../fingerprints/MainActivityFingerprint.kt | 2 +- .../OverrideQualityHookPatch.kt | 30 +- .../VideoQualityListFingerprint.kt | 2 +- .../VideoQualityPatchFingerprint.kt | 5 +- .../VideoQualityTextFingerprint.kt | 2 +- .../overridespeed/OverrideSpeedHookPatch.kt | 7 +- .../fingerprints/PlaybackSpeedFingerprint.kt | 2 +- ...PlaybackSpeedOnClickListenerFingerprint.kt | 2 +- .../PlaybackSpeedParentFingerprint.kt | 2 +- .../PlaybackSpeedPatchFingerprint.kt | 2 +- .../playerresponse/PlayerResponsePatch.kt | 5 +- .../PlaybackStartDescriptorFingerprint.kt | 2 +- .../fingerprint/PlayerTypeFingerprint.kt | 6 +- .../utils/resourceid/SharedResourceIdPatch.kt | 143 ++++---- .../ReturnYouTubeDislikeBytecodePatch.kt | 36 +- .../ReturnYouTubeDislikePatch.kt | 34 +- .../fingerprints/DislikeFingerprint.kt | 2 +- .../fingerprints/LikeFingerprint.kt | 2 +- .../fingerprints/RemoveLikeFingerprint.kt | 2 +- .../fingerprints/TextComponentFingerprint.kt | 2 +- .../music/utils/settings/SettingsPatch.kt | 47 +-- .../GoogleApiActivityFingerprint.kt | 2 +- .../fingerprints/PreferenceFingerprint.kt | 2 +- .../SettingsHeadersFragmentFingerprint.kt | 2 +- .../sponsorblock/SponsorBlockBytecodePatch.kt | 129 +++----- .../utils/sponsorblock/SponsorBlockPatch.kt | 39 +-- ...cPlaybackControlsTimeBarDrawFingerprint.kt | 4 +- ...backControlsTimeBarOnMeasureFingerprint.kt | 4 +- .../fingerprints/SeekbarOnDrawFingerprint.kt | 4 +- .../utils/videotype/VideoTypeHookPatch.kt | 8 +- .../fingerprint/VideoTypeFingerprint.kt | 2 +- .../fingerprint/VideoTypeParentFingerprint.kt | 2 +- .../CustomPlaybackSpeedBytecodePatch.kt | 9 + .../customspeed/CustomPlaybackSpeedPatch.kt | 42 +-- .../information/VideoInformationPatch.kt | 13 +- .../BackgroundPlaybackVideoIdFingerprint.kt | 16 - ...kgroundPlaybackVideoIdParentFingerprint.kt | 12 - ...erControllerSetTimeReferenceFingerprint.kt | 2 +- .../fingerprints/VideoEndFingerprint.kt | 2 +- .../fingerprints/VideoLengthFingerprint.kt | 2 +- .../music/video/quality/VideoQualityPatch.kt | 41 +-- .../UserQualityChangeFingerprint.kt | 2 +- .../music/video/speed/PlaybackSpeedPatch.kt | 35 +- .../PlaybackSpeedBottomSheetFingerprint.kt | 2 +- ...aybackSpeedBottomSheetParentFingerprint.kt | 2 +- .../music/video/videoid/VideoIdPatch.kt | 5 +- .../fingerprints/VideoIdParentFingerprint.kt | 2 +- .../{HideBannerPatch.kt => BannerAdsPatch.kt} | 2 +- ...eCommentAdsPatch.kt => CommentAdsPatch.kt} | 10 +- ...ingerprint.kt => CommentAdsFingerprint.kt} | 2 +- .../general/{HideAdsPatch.kt => AdsPatch.kt} | 48 ++- .../general/fingerprints/AdPostFingerprint.kt | 8 +- .../fingerprints/NewAdPostFingerprint.kt | 2 +- .../branding/name/CustomBrandingNamePatch.kt | 22 +- .../packagename/ChangePackageNamePatch.kt | 22 +- .../navigation/NavigationButtonsPatch.kt | 25 +- .../BottomNavScreenFingerprint.kt | 2 +- .../layout/premiumicon/PremiumIconPatch.kt | 23 +- .../fingerprints/PremiumIconFingerprint.kt | 5 +- .../RecentlyVisitedShelfPatch.kt | 29 +- .../CommunityDrawerPresenterFingerprint.kt | 2 +- .../screenshotpopup/ScreenshotPopupPatch.kt | 28 +- .../ScreenshotTakenBannerFingerprint.kt | 2 +- ...DialogPatch.kt => SubRedditDialogPatch.kt} | 28 +- .../FrequentUpdatesSheetScreenFingerprint.kt | 2 +- .../RedditAlertDialogsFingerprint.kt | 2 +- .../layout/toolbar/ToolBarButtonPatch.kt | 28 +- .../HomePagerScreenFingerprint.kt | 2 +- .../misc/openlink/OpenLinksDirectlyPatch.kt | 29 +- .../misc/openlink/OpenLinksExternallyPatch.kt | 25 +- .../ScreenNavigatorFingerprint.kt | 2 +- .../tracking/url/SanitizeUrlQueryPatch.kt | 25 +- .../ShareLinkFormatterFingerprint.kt | 2 +- .../reddit/utils/integrations/Constants.kt | 14 +- .../fingerprints/InitFingerprint.kt | 2 +- .../utils/settings/SettingsBytecodePatch.kt | 6 +- .../reddit/utils/settings/SettingsPatch.kt | 28 +- ...AcknowledgementsLabelBuilderFingerprint.kt | 2 +- ...LicensesMenuActivityOnCreateFingerprint.kt | 2 +- .../SettingsStatusLoadFingerprint.kt | 2 +- .../{AbstractAdsPatch.kt => BaseAdsPatch.kt} | 2 +- .../ads/fingerprints/MusicAdsFingerprint.kt | 2 +- .../ads/fingerprints/VideoAdsFingerprint.kt | 2 +- ...tionsPatch.kt => BaseAutoCaptionsPatch.kt} | 2 +- .../StartVideoInformerFingerprint.kt | 2 +- .../fingerprints/SubtitleTrackFingerprint.kt | 2 +- ...tch.kt => BaseCustomPlaybackSpeedPatch.kt} | 2 +- .../SpeedArrayGeneratorFingerprint.kt | 2 +- .../SpeedLimiterFallBackFingerprint.kt | 2 +- .../fingerprints/SpeedLimiterFingerprint.kt | 2 +- ....kt => BaseViewerDiscretionDialogPatch.kt} | 2 +- .../fingerprints/DrawableFingerprint.kt | 2 +- ...ementsPatch.kt => StringsElementsUtils.kt} | 18 +- .../shared/gms/BaseGmsCoreSupportPatch.kt | 2 +- .../CastContextFetchFingerprint.kt | 2 +- .../CastDynamiteModuleFingerprint.kt | 2 +- .../CastDynamiteModuleV2Fingerprint.kt | 2 +- .../GooglePlayUtilityFingerprint.kt | 2 +- .../fingerprints/PrimeMethodFingerprint.kt | 2 +- .../fingerprints/ServiceCheckFingerprint.kt | 2 +- .../patches/shared/integrations/Constants.kt | 2 +- .../patches/shared/litho/LithoFilterPatch.kt | 2 +- .../LithoFilterPatchConstructorFingerprint.kt | 2 +- .../fingerprints/PathBuilderFingerprint.kt | 2 +- .../fingerprints/SetByteBufferFingerprint.kt | 2 +- .../shared/mapping/ResourceMappingPatch.kt | 3 +- .../patches/shared/mapping/ResourceType.kt | 1 + ...sCodecsPatch.kt => BaseOpusCodecsPatch.kt} | 30 +- .../fingerprints/CodecReferenceFingerprint.kt | 2 +- .../fingerprints/CodecSelectorFingerprint.kt | 2 +- ...oundPatch.kt => OverlayBackgroundUtils.kt} | 24 +- .../settings/AbstractSettingsResourcePatch.kt | 35 -- .../fingerprints/SharedSettingFingerprint.kt | 2 +- .../BaseSpoofAppVersionPatch.kt} | 8 +- .../fingerprints/ClientInfoFingerprint.kt | 4 +- .../ClientInfoParentFingerprint.kt | 8 + ...yPatch.kt => BaseSanitizeUrlQueryPatch.kt} | 2 +- .../CopyTextEndpointFingerprint.kt | 2 +- .../shared/transformation/MethodCall.kt | 1 + ...nslationsPatch.kt => TranslationsUtils.kt} | 15 +- .../ClientInfoParentFingerprint.kt | 8 - ...archButtonPatch.kt => VoiceSearchUtils.kt} | 25 +- .../ads/fullscreen/FullscreenAdsPatch.kt | 63 ++-- .../InterstitialsContainerFingerprint.kt | 2 +- .../ShowDialogCommandFingerprint.kt | 2 +- .../youtube/ads/general/GeneralAdsPatch.kt | 55 +--- ...eGetPremiumPatch.kt => GetPremiumPatch.kt} | 2 +- .../CompactYpcOfferModuleViewFingerprint.kt | 2 +- .../ads/video/VideoAdsBytecodePatch.kt | 9 + .../youtube/ads/video/VideoAdsPatch.kt | 54 +-- .../general/AlternativeThumbnailsPatch.kt | 53 +-- .../buttoncontainer/ButtonContainerPatch.kt | 54 +-- .../comment/CommentComponentPatch.kt | 70 +--- ...amEmojiPickerOnClickListenerFingerprint.kt | 2 +- ...LiveStreamEmojiPickerOpacityFingerprint.kt | 2 +- .../ShortsLiveStreamThanksFingerprint.kt | 2 +- .../gestures/BottomPlayerGesturesPatch.kt | 70 +--- .../BottomPlayerGesturesFingerprint.kt | 2 +- .../flyoutpanel/feed/FeedFlyoutPanelPatch.kt | 54 +-- .../BottomSheetMenuItemBuilderFingerprint.kt | 2 +- ...omSheetMenuItemBuilderLegacyFingerprint.kt | 2 +- .../ContextualMenuItemBuilderFingerprint.kt | 2 +- .../oldqualitylayout/OldQualityLayoutPatch.kt | 64 +--- .../oldspeedlayout/OldSpeedLayoutPatch.kt | 35 +- ...tomPlaybackSpeedIntegrationsFingerprint.kt | 7 +- ...PlaybackRateBottomSheetClassFingerprint.kt | 2 +- .../player/PlayerFlyoutPanelPatch.kt | 83 ++--- .../AdditionalSettingsConfigFingerprint.kt | 8 - .../AdvancedQualityBottomSheetFingerprint.kt | 2 +- .../CaptionsBottomSheetFingerprint.kt | 2 +- .../{player => toggle}/ChangeTogglePatch.kt | 80 ++--- .../AdditionalSettingsConfigFingerprint.kt | 8 + .../CinematicLightingFingerprint.kt | 4 +- .../PlaybackLoopInitFingerprint.kt | 4 +- .../PlaybackLoopOnClickListenerFingerprint.kt | 4 +- .../fingerprints/StableVolumeFingerprint.kt | 4 +- ...reviewPatch.kt => AutoplayPreviewPatch.kt} | 51 +-- .../CompactControlsOverlayPatch.kt | 61 +--- ...erlayPatch.kt => EndScreenOverlayPatch.kt} | 51 +-- .../EndScreenResultsParentFingerprint.kt | 2 +- .../forcefullscreen/ForceFullscreenPatch.kt | 72 +--- .../ClientSettingEndpointFingerprint.kt | 2 +- .../VideoPortraitParentFingerprint.kt | 2 +- .../fullscreenpanels/FullscreenPanelsPatch.kt | 81 +++++ .../HideFullscreenPanelsPatch.kt | 136 -------- .../FullscreenEngagementPanelFingerprint.kt | 2 +- .../FullscreenViewAdderFingerprint.kt | 16 - .../landscapemode/LandScapeModePatch.kt | 111 +++++++ .../disable/DisableLandScapeModePatch.kt | 98 ------ .../BroadcastReceiverFingerprint.kt | 4 +- .../LandScapeModeConfigFingerprint.kt | 4 +- .../OrientationParentFingerprint.kt | 4 +- .../OrientationPrimaryFingerprint.kt | 4 +- .../OrientationSecondaryFingerprint.kt | 4 +- .../keep/KeepLandScapeModePatch.kt | 91 ----- .../QuickActionsComponentsPatch.kt | 43 +++ .../quickactions/QuickActionsPatch.kt | 70 ---- .../general/accountmenu/AccountMenuPatch.kt | 79 ++--- .../fingerprints/AccountListFingerprint.kt | 2 +- .../AccountListParentFingerprint.kt | 2 +- .../fingerprints/AccountMenuFingerprint.kt | 2 +- .../AccountMenuParentFingerprint.kt | 2 +- .../AccountMenuPatchFingerprint.kt | 5 +- .../SetViewGroupMarginFingerprint.kt | 2 +- .../autocaptions/AutoCaptionsBytecodePatch.kt | 6 + .../general/autocaptions/AutoCaptionsPatch.kt | 52 +-- .../autopopuppanels/PlayerPopupPanelsPatch.kt | 56 +--- .../EngagementPanelControllerFingerprint.kt | 3 +- ...eCastButtonPatch.kt => CastButtonPatch.kt} | 49 +-- .../fingerprints/CastButtonFingerprint.kt | 3 +- .../general/categorybar/CategoryBarPatch.kt | 55 +--- .../FilterBarHeightFingerprint.kt | 2 +- .../RelatedChipCloudFingerprint.kt | 2 +- .../SearchResultsChipBarFingerprint.kt | 2 +- .../ChannelListSubMenuPatch.kt | 56 +--- .../ChannelListSubMenuFingerprint.kt | 2 +- .../ChannelProfileComponentsPatch.kt | 47 +-- .../DefaultsTabsBarFingerprint.kt | 2 +- .../crowdfundingbox/CrowdfundingBoxPatch.kt | 51 +-- .../CrowdfundingBoxFingerprint.kt | 2 +- .../DescriptionComponentsPatch.kt | 58 +--- .../TextViewComponentFingerprint.kt | 2 +- .../RemoveViewerDiscretionDialogPatch.kt | 67 ---- .../ViewerDiscretionDialogBytecodePatch.kt | 10 + .../dialog/ViewerDiscretionDialogPatch.kt | 34 ++ .../fingerprints/AgeVerifiedFingerprint.kt | 2 +- .../FloatingMicrophonePatch.kt | 51 +-- .../FloatingMicrophoneFingerprint.kt | 2 +- .../{HideHandlePatch.kt => HandlePatch.kt} | 51 +-- ...ntSwitcherAccessibilityLabelFingerprint.kt | 2 +- .../LatestVideosButtonPatch.kt | 51 +-- .../LatestVideosButtonFingerprint.kt | 2 +- .../general/layout/LayoutComponentsPatch.kt | 59 +--- .../GradientLoadingScreenPatch.kt | 84 +---- ...GradientLoadingScreenPrimaryFingerprint.kt | 2 +- ...adientLoadingScreenSecondaryFingerprint.kt | 2 +- .../loadmorebutton/LoadMoreButtonPatch.kt | 51 +-- .../fingerprints/LoadMoreButtonFingerprint.kt | 2 +- .../general/mixplaylists/MixPlaylistsPatch.kt | 158 +++------ .../fingerprints/ElementParserFingerprint.kt | 12 +- .../ElementParserParentFingerprint.kt | 11 + .../EmptyFlatBufferFingerprint.kt | 18 - .../searchterm/SearchTermThumbnailPatch.kt | 120 ++----- .../CreateSearchSuggestionsFingerprint.kt | 2 +- .../general/snackbar/HideSnackBarPatch.kt | 81 ----- .../youtube/general/snackbar/SnackBarPatch.kt | 50 +++ ...int.kt => BottomUiContainerFingerprint.kt} | 2 +- .../general/songsearch/SongSearchPatch.kt | 48 +-- .../VoiceSearchConfigFingerprint.kt | 2 +- .../general/startpage/ChangeStartPagePatch.kt | 49 +-- .../fingerprints/StartActivityFingerprint.kt | 2 +- .../SuggestionsShelfPatch.kt | 51 +-- .../fingerprints/BreakingNewsFingerprint.kt | 4 +- .../tabletminiplayer/TabletMiniPlayerPatch.kt | 123 ++----- ...niPlayerDimensionsCalculatorFingerprint.kt | 2 +- .../MiniPlayerOverrideFingerprint.kt | 2 +- .../MiniPlayerOverrideNoContextFingerprint.kt | 2 +- ...PlayerResponseModelSizeCheckFingerprint.kt | 2 +- .../general/toolbar/ToolBarButtonPatch.kt | 50 +-- .../trendingsearches/TrendingSearchesPatch.kt | 97 +----- .../fingerprints/SearchBarEntryFingerprint.kt | 19 -- .../TrendingSearchConfigFingerprint.kt | 10 + .../widesearchbar/WideSearchBarPatch.kt | 51 +-- .../SetActionBarRingoFingerprint.kt | 2 +- .../SetWordMarkHeaderFingerprint.kt | 2 +- .../fingerprints/YouActionBarFingerprint.kt | 2 +- .../animated/AnimatedButtonBackgroundPatch.kt | 44 +-- .../branding/icon/CustomBrandingIconPatch.kt | 44 +-- .../branding/name/CustomBrandingNamePatch.kt | 52 +-- .../DoubleTapOverlayBackgroundPatch.kt | 56 +--- .../doubletaplength/DoubleTapLengthPatch.kt | 44 +-- .../layout/header/PremiumHeadingPatch.kt | 44 +-- .../pipnotification/PiPNotificationPatch.kt | 48 +-- .../PiPNotificationFingerprint.kt | 2 +- .../AddSplashAnimationPatch.kt | 50 +-- .../youtube/layout/theme/MaterialYouPatch.kt | 46 +-- ...ralThemePatch.kt => ThemeBytecodePatch.kt} | 1 + .../youtube/layout/theme/ThemePatch.kt | 46 +-- .../layout/tooltip/TooltipContentViewPatch.kt | 47 +-- .../TooltipContentViewFingerprint.kt | 2 +- .../voicesearch/VoiceSearchButtonPatch.kt | 76 ++--- .../ambientmode/AmbientModeSwitchPatch.kt | 109 ++---- .../AmbientModeInFullscreenFingerprint.kt | 2 +- .../fingerprints/PowerSaveModeFingerprint.kt | 2 +- .../audio/ForceOpusCodecBytecodePatch.kt | 8 + .../misc/codec/audio/ForceOpusCodecPatch.kt | 53 +-- .../misc/codec/video/ForceVideoCodecPatch.kt | 90 ++--- .../fingerprints/VideoPrimaryFingerprint.kt | 2 +- .../fingerprints/VideoPropsFingerprint.kt | 2 +- .../VideoPropsParentFingerprint.kt | 2 +- .../fingerprints/VideoSecondaryFingerprint.kt | 2 +- .../youtube/misc/debugging/DebuggingPatch.kt | 44 +-- ...kt => OpenLinksExternallyBytecodePatch.kt} | 56 +--- .../OpenLinksExternallyPatch.kt | 31 ++ .../misc/language/LanguageSelectorPatch.kt | 45 +-- .../fingerprints/GeneralPrefsFingerprint.kt | 2 +- .../GeneralPrefsLegacyFingerprint.kt | 2 +- .../misc/layoutswitch/LayoutSwitchPatch.kt | 78 ++--- .../fingerprints/GetFormFactorFingerprint.kt | 2 +- .../MinimizedPlaybackPatch.kt | 65 +--- ...izedPlaybackPolicyControllerFingerprint.kt | 11 +- .../MinimizedPlaybackManagerFingerprint.kt | 2 +- .../MinimizedPlaybackSettingsFingerprint.kt | 2 +- .../fingerprints/PiPControllerFingerprint.kt | 2 +- .../OpenLinksDirectlyPatch.kt | 45 +-- .../youtube/misc/quic/QUICProtocolPatch.kt | 45 +-- .../CronetEngineBuilderFingerprint.kt | 7 +- ...erimentalCronetEngineBuilderFingerprint.kt | 7 +- .../NewSplashAnimationPatch.kt | 46 +-- ...tchWhileActivityWithOutFlagsFingerprint.kt | 2 +- .../SpoofAppVersionBytecodePatch.kt | 8 + .../spoofappversion/SpoofAppVersionPatch.kt | 61 +--- .../SpoofDeviceDimensionsPatch.kt | 45 +-- ...eviceDimensionsModelToStringFingerprint.kt | 2 +- .../tracking/SanitizeUrlQueryBytecodePatch.kt | 71 ++++ .../misc/tracking/SanitizeUrlQueryPatch.kt | 99 +----- .../ShareLinkFormatterFingerprint.kt | 2 +- .../SystemShareLinkFormatterFingerprint.kt | 2 +- .../misc/translations/TranslationsPatch.kt | 98 ++---- .../misc/updatescreen/UpdateScreenPatch.kt | 45 +-- ...pBlockingCheckResultToStringFingerprint.kt | 2 +- .../navigation/label/NavigationLabelPatch.kt | 64 +--- .../PivotBarSetTextFingerprint.kt | 10 +- .../NavigationButtonsPatch.kt | 57 +--- .../fingerprints/AutoMotiveFingerprint.kt | 2 +- .../PivotBarButtonViewFingerprint.kt | 2 +- .../fingerprints/PivotBarEnumFingerprint.kt | 2 +- .../tabletnavbar/TabletNavigationBarPatch.kt | 49 +-- .../PivotBarChangedFingerprint.kt | 7 +- .../fingerprints/PivotBarStyleFingerprint.kt | 6 +- .../alwaysrepeat/AlwaysRepeatPatch.kt | 14 +- .../AutoNavInformerFingerprint.kt | 2 +- .../download/hook/DownloadButtonHookPatch.kt | 6 +- .../DownloadActionsFingerprint.kt | 2 +- .../fingerprints/PiPPlaybackFingerprint.kt | 2 +- .../FullScreenButtonFingerprint.kt | 2 +- .../general/OverlayButtonsPatch.kt | 106 +++--- ...yButtonPatch.kt => AutoplayButtonPatch.kt} | 53 +-- ...sButtonPatch.kt => CaptionsButtonPatch.kt} | 60 +--- .../LithoSubtitleButtonConfigFingerprint.kt | 2 +- ...ontrolsOverlaySubtitleButtonFingerprint.kt | 2 +- ...eButtonPatch.kt => CollapseButtonPatch.kt} | 51 +-- .../fingerprints/LiveChatFingerprint.kt | 2 +- ...enCardsPatch.kt => EndScreenCardsPatch.kt} | 72 ++-- .../fingerprints/LayoutCircleFingerprint.kt | 2 +- .../fingerprints/LayoutIconFingerprint.kt | 2 +- .../fingerprints/LayoutVideoFingerprint.kt | 2 +- ...erlayPatch.kt => FilmstripOverlayPatch.kt} | 67 +--- .../FilmStripOverlayConfigFingerprint.kt | 2 +- .../FilmStripOverlayInteractionFingerprint.kt | 2 +- .../FilmStripOverlayParentFingerprint.kt | 2 +- .../FilmStripOverlayPreviewFingerprint.kt | 2 +- .../FineScrubbingOverlayFingerprint.kt | 2 +- .../hapticfeedback/HapticFeedBackPatch.kt | 83 ++--- .../fingerprints/MarkerHapticsFingerprint.kt | 2 +- .../ScrubbingHapticsFingerprint.kt | 2 +- .../fingerprints/SeekHapticsFingerprint.kt | 8 +- .../SeekUndoHapticsFingerprint.kt | 2 +- .../fingerprints/ZoomHapticsFingerprint.kt | 2 +- ...ideInfoCardsPatch.kt => InfoCardsPatch.kt} | 56 +--- .../InfoCardsIncognitoFingerprint.kt | 2 +- ...usicButtonPatch.kt => MusicButtonPatch.kt} | 53 +-- .../MusicAppDeeplinkButtonFingerprint.kt | 2 +- ...MusicAppDeeplinkButtonParentFingerprint.kt | 2 +- .../HidePlayerButtonBackgroundPatch.kt | 65 ---- .../PlayerButtonBackgroundPatch.kt | 35 ++ .../CustomPlayerOverlayOpacityPatch.kt | 51 +-- ...tonPatch.kt => PreviousNextButtonPatch.kt} | 49 +-- .../player/seekmessage/SeekMessagePatch.kt | 79 ++--- .../SeekEduContainerFingerprint.kt | 2 +- .../SeekEduUndoOverlayFingerprint.kt | 2 +- .../player/speedoverlay/SpeedOverlayPatch.kt | 78 +---- .../RestoreSlideToSeekBehaviorFingerprint.kt | 2 +- .../fingerprints/SpeedOverlayFingerprint.kt | 2 +- .../suggestactions/SuggestedActionsPatch.kt | 53 +-- .../SuggestedActionsFingerprint.kt | 2 +- .../SuggestedVideoOverlayPatch.kt | 70 +--- .../CoreContainerBuilderFingerprint.kt | 2 +- .../MiniPlayerPlayButtonFingerprint.kt | 2 +- .../TouchAreaOnClickListenerFingerprint.kt | 2 +- ...rmarkPatch.kt => ChannelWatermarkPatch.kt} | 72 ++-- ...Fingerprint.kt => WatermarkFingerprint.kt} | 2 +- ...print.kt => WatermarkParentFingerprint.kt} | 2 +- .../append/AppendTimeStampInformationPatch.kt | 53 +-- .../seekbar/color/SeekbarColorPatch.kt | 57 +--- .../ControlsOverlayStyleFingerprint.kt | 2 +- .../ShortsSeekbarColorFingerprint.kt | 2 +- .../{HideSeekbarPatch.kt => SeekbarPatch.kt} | 55 +--- .../seekbar/tapping/SeekbarTappingPatch.kt | 49 +-- .../fingerprints/SeekbarTappingFingerprint.kt | 2 +- .../NewThumbnailPreviewPatch.kt | 69 +--- ...ideTimeStampPatch.kt => TimeStampPatch.kt} | 57 +--- .../fingerprints/TimeCounterFingerprint.kt | 2 +- .../shorts/components/ShortsComponentPatch.kt | 59 +--- .../components/ShortsNavigationBarPatch.kt | 8 +- .../ShortsSubscriptionsButtonPatch.kt | 6 +- .../shorts/components/ShortsToolBarPatch.kt | 6 +- .../BottomNavigationBarFingerprint.kt | 2 +- .../RenderBottomNavigationBarFingerprint.kt | 2 +- .../fingerprints/SetPivotBarFingerprint.kt | 2 +- .../fingerprints/ShortsButtonFingerprint.kt | 2 +- .../ShortsInfoPanelFingerprint.kt | 2 +- .../ShortsPaidPromotionFingerprint.kt | 2 +- .../fingerprints/ShortsPivotFingerprint.kt | 2 +- .../ShortsPivotLegacyFingerprint.kt | 2 +- .../ShortsSubscriptionsFingerprint.kt | 2 +- .../ShortsSubscriptionsTabletFingerprint.kt | 2 +- ...rtsSubscriptionsTabletParentFingerprint.kt | 2 +- .../fingerprints/ToolBarBannerFingerprint.kt | 2 +- .../outlinebutton/ShortsOutlineButtonPatch.kt | 44 +-- .../shorts/repeat/ShortsRepeatPatch.kt | 51 +-- .../ReelEnumConstructorFingerprint.kt | 2 +- .../fingerprints/ReelEnumStaticFingerprint.kt | 2 +- ...tch.kt => ResumingShortsOnStartupPatch.kt} | 59 +--- .../UserWasInShortsABConfigFingerprint.kt | 2 +- .../UserWasInShortsFingerprint.kt | 2 +- .../swipe/controls/SwipeControlsPatch.kt | 49 +-- .../FullScreenEngagementOverlayFingerprint.kt | 2 +- .../fingerprints/HDRBrightnessFingerprint.kt | 2 +- .../SwipeControlsHostActivityFingerprint.kt | 5 +- .../fingerprints/BrowseIdClassFingerprint.kt | 2 +- ...Patch.kt => ControlsOverlayConfigPatch.kt} | 2 +- .../ControlsOverlayConfigFingerprint.kt | 2 +- .../LayoutConstructorFingerprint.kt | 2 +- .../fingerprints/LayoutSwitchFingerprint.kt | 2 +- .../NewVideoQualityChangedFingerprint.kt | 2 +- .../OrganicPlaybackContextModelFingerprint.kt | 2 +- .../PivotBarCreateButtonViewFingerprint.kt | 2 +- ...layerControlsVisibilityModelFingerprint.kt | 2 +- .../PlayerSeekbarColorFingerprint.kt | 2 +- .../QualityMenuViewInflateFingerprint.kt | 2 +- .../utils/fingerprints/SeekbarFingerprint.kt | 2 +- .../fingerprints/SeekbarOnDrawFingerprint.kt | 2 +- .../ThumbnailPreviewConfigFingerprint.kt | 2 +- .../fingerprints/TotalTimeFingerprint.kt | 2 +- .../utils/fingerprints/VideoEndFingerprint.kt | 2 +- .../VideoQualitySetterFingerprint.kt | 2 +- .../YouTubeControlsOverlayFingerprint.kt | 2 +- .../DoubleBackToClosePatch.kt | 10 +- .../fingerprint/ScrollPositionFingerprint.kt | 2 +- .../fingerprint/ScrollTopFingerprint.kt | 2 +- .../fingerprint/ScrollTopParentFingerprint.kt | 2 +- .../FullscreenButtonViewStubPatch.kt | 39 +++ .../FullscreenButtonViewStubFingerprint.kt | 8 + .../parameter/SpoofPlayerParameterPatch.kt | 51 +-- .../fingerprints/ShortsPlaybackFingerprint.kt | 2 +- .../SwipeRefreshLayoutFingerprint.kt | 2 +- .../youtube/utils/gms/GmsCoreSupportPatch.kt | 31 +- .../youtube/utils/integrations/Constants.kt | 50 ++- .../APIPlayerServiceFingerprint.kt | 2 +- .../ApplicationInitFingerprint.kt | 2 +- ...mbeddedPlayerControlsOverlayFingerprint.kt | 2 +- .../fingerprints/EmbeddedPlayerFingerprint.kt | 2 +- .../RemoteEmbedFragmentFingerprint.kt | 2 +- .../RemoteEmbeddedPlayerFingerprint.kt | 2 +- .../StandalonePlayerActivityFingerprint.kt | 2 +- .../fingerprint/LockModeStateFingerprint.kt | 2 +- .../fingerprints/MainActivityFingerprint.kt | 2 +- .../MobileTopBarButtonOnClickFingerprint.kt | 2 +- .../fingerprints/PivotBarIndexFingerprint.kt | 2 +- ...ettingsActivityOnBackPressedFingerprint.kt | 2 +- .../OverrideQualityHookPatch.kt | 30 +- .../VideoQualityListFingerprint.kt | 2 +- .../VideoQualityPatchFingerprint.kt | 5 +- .../VideoQualityTextFingerprint.kt | 2 +- .../overridespeed/OverrideSpeedHookPatch.kt | 29 +- .../PlaybackSpeedChangedFingerprint.kt | 2 +- .../PlaybackSpeedParentFingerprint.kt | 2 +- .../PlaybackSpeedPatchFingerprint.kt | 5 +- .../fingerprints/SpeedClassFingerprint.kt | 2 +- .../playercontrols/PlayerControlsPatch.kt | 146 ++++---- .../BottomControlsInflateFingerprint.kt | 2 +- .../ControlsLayoutInflateFingerprint.kt | 2 +- ...eenEngagementSpeedEduVisibleFingerprint.kt | 2 +- ...mentSpeedEduVisibleToStringFingerprint.kt} | 2 +- .../PlayerControlsVisibilityFingerprint.kt | 2 +- .../QuickSeekVisibleFingerprint.kt | 11 +- .../fingerprints/SeekEDUVisibleFingerprint.kt | 11 +- .../fingerprints/UserScrubbingFingerprint.kt | 11 +- .../playerresponse/PlayerResponsePatch.kt | 2 +- .../PlayerParameterBuilderFingerprint.kt | 4 +- .../fingerprint/PlayerTypeFingerprint.kt | 2 +- .../fingerprint/VideoStateFingerprint.kt | 2 +- .../quickactions/QuickActionsHookPatch.kt | 31 +- .../QuickActionsElementFingerprint.kt | 2 +- ...ttomSheetRecyclerViewBuilderFingerprint.kt | 2 +- .../RecyclerViewTreeObserverFingerprint.kt | 2 +- .../utils/resourceid/SharedResourceIdPatch.kt | 311 +++++++++--------- .../general/ReturnYouTubeDislikePatch.kt | 47 +-- .../fingerprints/DislikeFingerprint.kt | 2 +- .../general/fingerprints/LikeFingerprint.kt | 2 +- .../fingerprints/RemoveLikeFingerprint.kt | 2 +- .../TextComponentConstructorFingerprint.kt | 2 +- .../TextComponentContextFingerprint.kt | 2 +- .../ReturnYouTubeDislikeRollingNumberPatch.kt | 12 +- ...ingNumberMeasureAnimatedTextFingerprint.kt | 2 +- ...lingNumberMeasureStaticLabelFingerprint.kt | 2 +- ...llingNumberMeasureTextParentFingerprint.kt | 2 +- .../RollingNumberSetterFingerprint.kt | 2 +- ...umberTextViewAnimationUpdateFingerprint.kt | 4 +- .../RollingNumberTextViewFingerprint.kt | 2 +- .../fingerprints/IncognitoFingerprint.kt | 2 +- .../fingerprints/ShortsTextViewFingerprint.kt | 2 +- .../TextComponentSpecFingerprint.kt | 2 +- .../utils/settings/SettingsBytecodePatch.kt | 2 - .../youtube/utils/settings/SettingsPatch.kt | 69 ++-- .../ThemeSetterSystemFingerprint.kt | 2 +- .../utils/sponsorblock/SponsorBlockPatch.kt | 46 +-- .../RectangleFieldInvalidatorFingerprint.kt | 2 +- .../SegmentPlaybackControllerFingerprint.kt | 2 +- .../fingerprints/ToolBarButtonFingerprint.kt | 2 +- .../fingerprints/ToolBarPatchFingerprint.kt | 5 +- .../utils/videoid/general/VideoIdPatch.kt | 9 +- ...erControllerSetTimeReferenceFingerprint.kt | 2 +- .../general/fingerprint/VideoIdFingerprint.kt | 2 +- .../fingerprint/VideoIdParentFingerprint.kt | 2 +- .../fingerprint/VideoLengthFingerprint.kt | 2 +- .../VideoIdWithoutShortsPatch.kt | 5 +- .../VideoIdWithoutShortsFingerprint.kt | 2 +- .../CustomPlaybackSpeedBytecodePatch.kt | 9 + .../customspeed/CustomPlaybackSpeedPatch.kt | 56 +--- ...sableHdrVideoPatch.kt => HDRVideoPatch.kt} | 51 +-- ...erprint.kt => HDRCapabilityFingerprint.kt} | 2 +- .../video/quality/VideoQualityPatch.kt | 47 +-- .../youtube/video/speed/PlaybackSpeedPatch.kt | 47 +-- .../NewPlaybackSpeedChangedFingerprint.kt | 2 +- .../PlaybackSpeedInitializeFingerprint.kt | 2 +- .../kotlin/app/revanced/util/BytecodeUtils.kt | 65 +++- .../kotlin/app/revanced/util/ResourceUtils.kt | 2 + .../revanced/util/patch/BaseBytecodePatch.kt | 23 ++ .../revanced/util/patch/BaseResourcePatch.kt | 20 ++ .../youtube/settings/xml/revanced_prefs.xml | 3 +- 657 files changed, 4374 insertions(+), 9404 deletions(-) rename src/main/kotlin/app/revanced/patches/music/account/handle/{HideHandlePatch.kt => HandlePatch.kt} (79%) create mode 100644 src/main/kotlin/app/revanced/patches/music/general/autocaptions/AutoCaptionsBytecodePatch.kt rename src/main/kotlin/app/revanced/patches/music/general/buttonshelf/{HideButtonShelfPatch.kt => ButtonShelfPatch.kt} (51%) rename src/main/kotlin/app/revanced/patches/music/general/carouselshelf/{HideCarouselShelfPatch.kt => CarouselShelfPatch.kt} (52%) rename src/main/kotlin/app/revanced/patches/music/general/castbutton/{HideCastButtonPatch.kt => CastButtonPatch.kt} (75%) rename src/main/kotlin/app/revanced/patches/music/general/channelguidelines/{HideChannelGuidelinesPatch.kt => ChannelGuidelinesPatch.kt} (52%) delete mode 100644 src/main/kotlin/app/revanced/patches/music/general/dialog/RemoveViewerDiscretionDialogPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/general/dialog/ViewerDiscretionDialogBytecodePatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/general/dialog/ViewerDiscretionDialogPatch.kt rename src/main/kotlin/app/revanced/patches/music/general/emojipicker/{HideEmojiPickerPatch.kt => EmojiPickerPatch.kt} (52%) rename src/main/kotlin/app/revanced/patches/music/general/floatingbutton/{NewPlaylistButtonPatch.kt => FloatingButtonPatch.kt} (71%) rename src/main/kotlin/app/revanced/patches/music/general/historybutton/{HideHistoryButtonPatch.kt => HistoryButtonPatch.kt} (74%) rename src/main/kotlin/app/revanced/patches/music/general/playlistcard/{HidePlaylistCardPatch.kt => PlaylistCardPatch.kt} (51%) rename src/main/kotlin/app/revanced/patches/music/general/sampleshelf/{HideSampleShelfPatch.kt => SampleShelfPatch.kt} (51%) rename src/main/kotlin/app/revanced/patches/music/general/taptoupdate/{HideTapToUpdateButtonPatch.kt => TapToUpdateButtonPatch.kt} (64%) delete mode 100644 src/main/kotlin/app/revanced/patches/music/misc/codecs/CodecsUnlockPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/misc/codecs/ForceOpusCodecBytecodePatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/misc/codecs/ForceOpusCodecPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/misc/premium/GetPremiumPatch.kt delete mode 100644 src/main/kotlin/app/revanced/patches/music/misc/premium/HideGetPremiumPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/misc/spoofappversion/SpoofAppVersionBytecodePatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/misc/tracking/SanitizeUrlQueryBytecodePatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/music/video/customspeed/CustomPlaybackSpeedBytecodePatch.kt delete mode 100644 src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/BackgroundPlaybackVideoIdFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/BackgroundPlaybackVideoIdParentFingerprint.kt rename src/main/kotlin/app/revanced/patches/reddit/ad/banner/{HideBannerPatch.kt => BannerAdsPatch.kt} (96%) rename src/main/kotlin/app/revanced/patches/reddit/ad/comments/{HideCommentAdsPatch.kt => CommentAdsPatch.kt} (83%) rename src/main/kotlin/app/revanced/patches/reddit/ad/comments/fingerprints/{HideCommentAdsFingerprint.kt => CommentAdsFingerprint.kt} (91%) rename src/main/kotlin/app/revanced/patches/reddit/ad/general/{HideAdsPatch.kt => AdsPatch.kt} (73%) rename src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/{RemoveSubRedditDialogPatch.kt => SubRedditDialogPatch.kt} (85%) rename src/main/kotlin/app/revanced/patches/shared/ads/{AbstractAdsPatch.kt => BaseAdsPatch.kt} (98%) rename src/main/kotlin/app/revanced/patches/shared/captions/{AbstractAutoCaptionsPatch.kt => BaseAutoCaptionsPatch.kt} (98%) rename src/main/kotlin/app/revanced/patches/shared/customspeed/{AbstractCustomPlaybackSpeedPatch.kt => BaseCustomPlaybackSpeedPatch.kt} (98%) rename src/main/kotlin/app/revanced/patches/shared/dialog/{AbstractRemoveViewerDiscretionDialogPatch.kt => BaseViewerDiscretionDialogPatch.kt} (97%) rename src/main/kotlin/app/revanced/patches/shared/elements/{AbstractRemoveStringsElementsPatch.kt => StringsElementsUtils.kt} (51%) rename src/main/kotlin/app/revanced/patches/shared/opus/{AbstractOpusCodecsPatch.kt => BaseOpusCodecsPatch.kt} (67%) rename src/main/kotlin/app/revanced/patches/shared/overlaybackground/{AbstractOverlayBackgroundPatch.kt => OverlayBackgroundUtils.kt} (61%) delete mode 100644 src/main/kotlin/app/revanced/patches/shared/settings/AbstractSettingsResourcePatch.kt rename src/main/kotlin/app/revanced/patches/shared/{versionspoof/AbstractVersionSpoofPatch.kt => spoofappversion/BaseSpoofAppVersionPatch.kt} (85%) rename src/main/kotlin/app/revanced/patches/shared/{versionspoof => spoofappversion}/fingerprints/ClientInfoFingerprint.kt (74%) create mode 100644 src/main/kotlin/app/revanced/patches/shared/spoofappversion/fingerprints/ClientInfoParentFingerprint.kt rename src/main/kotlin/app/revanced/patches/shared/tracking/{AbstractSanitizeUrlQueryPatch.kt => BaseSanitizeUrlQueryPatch.kt} (97%) rename src/main/kotlin/app/revanced/patches/shared/translations/{AbstractTranslationsPatch.kt => TranslationsUtils.kt} (61%) delete mode 100644 src/main/kotlin/app/revanced/patches/shared/versionspoof/fingerprints/ClientInfoParentFingerprint.kt rename src/main/kotlin/app/revanced/patches/shared/voicesearch/{AbstractVoiceSearchButtonPatch.kt => VoiceSearchUtils.kt} (64%) rename src/main/kotlin/app/revanced/patches/youtube/ads/getpremium/{HideGetPremiumPatch.kt => GetPremiumPatch.kt} (97%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/ads/video/VideoAdsBytecodePatch.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/AdditionalSettingsConfigFingerprint.kt rename src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/{player => toggle}/ChangeTogglePatch.kt (77%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/AdditionalSettingsConfigFingerprint.kt rename src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/{player => toggle}/fingerprints/CinematicLightingFingerprint.kt (72%) rename src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/{player => toggle}/fingerprints/PlaybackLoopInitFingerprint.kt (76%) rename src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/{player => toggle}/fingerprints/PlaybackLoopOnClickListenerFingerprint.kt (70%) rename src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/{player => toggle}/fingerprints/StableVolumeFingerprint.kt (72%) rename src/main/kotlin/app/revanced/patches/youtube/fullscreen/autoplaypreview/{HideAutoplayPreviewPatch.kt => AutoplayPreviewPatch.kt} (67%) rename src/main/kotlin/app/revanced/patches/youtube/fullscreen/endscreenoverlay/{HideEndScreenOverlayPatch.kt => EndScreenOverlayPatch.kt} (63%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/FullscreenPanelsPatch.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/HideFullscreenPanelsPatch.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/fingerprints/FullscreenViewAdderFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/LandScapeModePatch.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/DisableLandScapeModePatch.kt rename src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/{keep => }/fingerprints/BroadcastReceiverFingerprint.kt (80%) rename src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/{keep => }/fingerprints/LandScapeModeConfigFingerprint.kt (55%) rename src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/{disable => }/fingerprints/OrientationParentFingerprint.kt (53%) rename src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/{disable => }/fingerprints/OrientationPrimaryFingerprint.kt (76%) rename src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/{disable => }/fingerprints/OrientationSecondaryFingerprint.kt (73%) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/keep/KeepLandScapeModePatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/fullscreen/quickactions/QuickActionsComponentsPatch.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/fullscreen/quickactions/QuickActionsPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/AutoCaptionsBytecodePatch.kt rename src/main/kotlin/app/revanced/patches/youtube/general/castbutton/{HideCastButtonPatch.kt => CastButtonPatch.kt} (51%) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/general/dialog/RemoveViewerDiscretionDialogPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/general/dialog/ViewerDiscretionDialogBytecodePatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/general/dialog/ViewerDiscretionDialogPatch.kt rename src/main/kotlin/app/revanced/patches/youtube/general/handle/{HideHandlePatch.kt => HandlePatch.kt} (71%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/fingerprints/ElementParserParentFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/fingerprints/EmptyFlatBufferFingerprint.kt delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/general/snackbar/HideSnackBarPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/general/snackbar/SnackBarPatch.kt rename src/main/kotlin/app/revanced/patches/youtube/general/snackbar/fingerprints/{HideSnackBarFingerprint.kt => BottomUiContainerFingerprint.kt} (87%) rename src/main/kotlin/app/revanced/patches/youtube/general/{suggestions => suggestionshelf}/SuggestionsShelfPatch.kt (62%) rename src/main/kotlin/app/revanced/patches/youtube/general/{suggestions => suggestionshelf}/fingerprints/BreakingNewsFingerprint.kt (79%) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/general/trendingsearches/fingerprints/SearchBarEntryFingerprint.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/general/trendingsearches/fingerprints/TrendingSearchConfigFingerprint.kt rename src/main/kotlin/app/revanced/patches/youtube/layout/theme/{GeneralThemePatch.kt => ThemeBytecodePatch.kt} (99%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/codec/audio/ForceOpusCodecBytecodePatch.kt rename src/main/kotlin/app/revanced/patches/youtube/misc/externalbrowser/{ExternalBrowserPatch.kt => OpenLinksExternallyBytecodePatch.kt} (51%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/externalbrowser/OpenLinksExternallyPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/spoofappversion/SpoofAppVersionBytecodePatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/misc/tracking/SanitizeUrlQueryBytecodePatch.kt rename src/main/kotlin/app/revanced/patches/youtube/player/autoplaybutton/{HideAutoplayButtonPatch.kt => AutoplayButtonPatch.kt} (66%) rename src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/{HideCaptionsButtonPatch.kt => CaptionsButtonPatch.kt} (69%) rename src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/{HideCollapseButtonPatch.kt => CollapseButtonPatch.kt} (73%) rename src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/{HideEndScreenCardsPatch.kt => EndScreenCardsPatch.kt} (59%) rename src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/{HideFilmstripOverlayPatch.kt => FilmstripOverlayPatch.kt} (79%) rename src/main/kotlin/app/revanced/patches/youtube/player/infocards/{HideInfoCardsPatch.kt => InfoCardsPatch.kt} (62%) rename src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/{HideMusicButtonPatch.kt => MusicButtonPatch.kt} (63%) delete mode 100644 src/main/kotlin/app/revanced/patches/youtube/player/playerbuttonbg/HidePlayerButtonBackgroundPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/player/playerbuttonbg/PlayerButtonBackgroundPatch.kt rename src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/{HidePreviousNextButtonPatch.kt => PreviousNextButtonPatch.kt} (66%) rename src/main/kotlin/app/revanced/patches/youtube/player/watermark/{HideChannelWatermarkPatch.kt => ChannelWatermarkPatch.kt} (52%) rename src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/{HideWatermarkFingerprint.kt => WatermarkFingerprint.kt} (89%) rename src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/{HideWatermarkParentFingerprint.kt => WatermarkParentFingerprint.kt} (85%) rename src/main/kotlin/app/revanced/patches/youtube/seekbar/hide/{HideSeekbarPatch.kt => SeekbarPatch.kt} (58%) rename src/main/kotlin/app/revanced/patches/youtube/seekbar/timestamps/{HideTimeStampPatch.kt => TimeStampPatch.kt} (58%) rename src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/{DisableResumingShortsOnStartupPatch.kt => ResumingShortsOnStartupPatch.kt} (73%) rename src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/{DisableControlsOverlayConfigPatch.kt => ControlsOverlayConfigPatch.kt} (95%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/fix/fullscreen/FullscreenButtonViewStubPatch.kt create mode 100644 src/main/kotlin/app/revanced/patches/youtube/utils/fix/fullscreen/fingerprints/FullscreenButtonViewStubFingerprint.kt rename src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/{FullscreenEngagementSpeedEduVisibleParentFingerprint.kt => FullscreenEngagementSpeedEduVisibleToStringFingerprint.kt} (82%) rename src/main/kotlin/app/revanced/patches/youtube/utils/{ => playerresponse}/fingerprints/PlayerParameterBuilderFingerprint.kt (82%) rename src/main/kotlin/app/revanced/patches/youtube/utils/{ => returnyoutubedislike/rollingnumber}/fingerprints/RollingNumberTextViewAnimationUpdateFingerprint.kt (84%) create mode 100644 src/main/kotlin/app/revanced/patches/youtube/video/customspeed/CustomPlaybackSpeedBytecodePatch.kt rename src/main/kotlin/app/revanced/patches/youtube/video/hdr/{DisableHdrVideoPatch.kt => HDRVideoPatch.kt} (50%) rename src/main/kotlin/app/revanced/patches/youtube/video/hdr/fingerprints/{HdrCapabilitiesFingerprint.kt => HDRCapabilityFingerprint.kt} (77%) create mode 100644 src/main/kotlin/app/revanced/util/patch/BaseBytecodePatch.kt create mode 100644 src/main/kotlin/app/revanced/util/patch/BaseResourcePatch.kt diff --git a/src/main/kotlin/app/revanced/patches/music/account/component/MenuComponentPatch.kt b/src/main/kotlin/app/revanced/patches/music/account/component/MenuComponentPatch.kt index 0f1e6f8e2..92353523f 100644 --- a/src/main/kotlin/app/revanced/patches/music/account/component/MenuComponentPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/account/component/MenuComponentPatch.kt @@ -3,63 +3,41 @@ package app.revanced.patches.music.account.component import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.music.account.component.fingerprints.MenuEntryFingerprint -import app.revanced.patches.music.utils.integrations.Constants.ACCOUNT +import app.revanced.patches.music.utils.integrations.Constants.ACCOUNT_CLASS_DESCRIPTOR +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.getTargetIndexWithMethodReferenceName +import app.revanced.util.patch.BaseBytecodePatch 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 -@Patch( +@Suppress("unused") +object MenuComponentPatch : BaseBytecodePatch( name = "Hide account menu", description = "Adds the ability to hide account menu elements using a custom filter.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object MenuComponentPatch : BytecodePatch( - setOf(MenuEntryFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(MenuEntryFingerprint) ) { override fun execute(context: BytecodeContext) { MenuEntryFingerprint.result?.let { it.mutableMethod.apply { - val textIndex = targetIndex("setText") - val viewIndex = targetIndex("addView") + val textIndex = getTargetIndexWithMethodReferenceName("setText") + val viewIndex = getTargetIndexWithMethodReferenceName("addView") val textRegister = getInstruction(textIndex).registerD val viewRegister = getInstruction(viewIndex).registerD addInstruction( textIndex + 1, - "invoke-static {v$textRegister, v$viewRegister}, $ACCOUNT->hideAccountMenu(Ljava/lang/CharSequence;Landroid/view/View;)V" + "invoke-static {v$textRegister, v$viewRegister}, $ACCOUNT_CLASS_DESCRIPTOR->hideAccountMenu(Ljava/lang/CharSequence;Landroid/view/View;)V" ) } } ?: throw MenuEntryFingerprint.exception @@ -81,12 +59,4 @@ object MenuComponentPatch : BytecodePatch( "revanced_hide_account_menu" ) } - - private fun MutableMethod.targetIndex(descriptor: String): Int { - return implementation?.let { - it.instructions.indexOfFirst { instruction -> - ((instruction as? ReferenceInstruction)?.reference as? MethodReference)?.name == descriptor - } - } ?: throw PatchException("No Method Implementation found!") - } } diff --git a/src/main/kotlin/app/revanced/patches/music/account/component/fingerprints/MenuEntryFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/account/component/fingerprints/MenuEntryFingerprint.kt index 8c08a649d..794ee6c59 100644 --- a/src/main/kotlin/app/revanced/patches/music/account/component/fingerprints/MenuEntryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/account/component/fingerprints/MenuEntryFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.account.component.fingerprints import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MenuEntry import app.revanced.util.fingerprint.LiteralValueFingerprint -object MenuEntryFingerprint : LiteralValueFingerprint( +internal object MenuEntryFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { MenuEntry } ) diff --git a/src/main/kotlin/app/revanced/patches/music/account/handle/HideHandlePatch.kt b/src/main/kotlin/app/revanced/patches/music/account/handle/HandlePatch.kt similarity index 79% rename from src/main/kotlin/app/revanced/patches/music/account/handle/HideHandlePatch.kt rename to src/main/kotlin/app/revanced/patches/music/account/handle/HandlePatch.kt index 2d87dc598..8a6e9f1dc 100644 --- a/src/main/kotlin/app/revanced/patches/music/account/handle/HideHandlePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/account/handle/HandlePatch.kt @@ -4,48 +4,29 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.account.handle.fingerprints.AccountSwitcherAccessibilityLabelFingerprint import app.revanced.patches.music.account.handle.fingerprints.NamesInactiveAccountThumbnailSizeFingerprint -import app.revanced.patches.music.utils.integrations.Constants.ACCOUNT +import app.revanced.patches.music.utils.integrations.Constants.ACCOUNT_CLASS_DESCRIPTOR +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getTargetIndexWithMethodReferenceName +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object HandlePatch : BaseBytecodePatch( name = "Hide handle", description = "Adds an option to hide the handle in the account menu.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object HideHandlePatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( AccountSwitcherAccessibilityLabelFingerprint, NamesInactiveAccountThumbnailSizeFingerprint ) @@ -64,7 +45,7 @@ object HideHandlePatch : BytecodePatch( replaceInstruction( setVisibilityIndex, - "invoke-static {v${textViewInstruction.registerC}, v${textViewInstruction.registerD}}, $ACCOUNT->hideHandle(Landroid/widget/TextView;I)V" + "invoke-static {v${textViewInstruction.registerC}, v${textViewInstruction.registerD}}, $ACCOUNT_CLASS_DESCRIPTOR->hideHandle(Landroid/widget/TextView;I)V" ) } } ?: throw AccountSwitcherAccessibilityLabelFingerprint.exception @@ -79,7 +60,7 @@ object HideHandlePatch : BytecodePatch( addInstructions( targetIndex, """ - invoke-static {v$targetRegister}, $ACCOUNT->hideHandle(Z)Z + invoke-static {v$targetRegister}, $ACCOUNT_CLASS_DESCRIPTOR->hideHandle(Z)Z move-result v$targetRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/music/account/handle/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/account/handle/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt index 4295e8bd7..4248854c2 100644 --- a/src/main/kotlin/app/revanced/patches/music/account/handle/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/account/handle/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.account.handle.fingerprints import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.AccountSwitcherAccessibility import app.revanced.util.fingerprint.LiteralValueFingerprint -object AccountSwitcherAccessibilityLabelFingerprint : LiteralValueFingerprint( +internal object AccountSwitcherAccessibilityLabelFingerprint : LiteralValueFingerprint( returnType = "V", parameters = listOf("L", "Ljava/lang/Object;"), literalSupplier = { AccountSwitcherAccessibility } diff --git a/src/main/kotlin/app/revanced/patches/music/account/handle/fingerprints/NamesInactiveAccountThumbnailSizeFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/account/handle/fingerprints/NamesInactiveAccountThumbnailSizeFingerprint.kt index cef825d17..1f4f67d0c 100644 --- a/src/main/kotlin/app/revanced/patches/music/account/handle/fingerprints/NamesInactiveAccountThumbnailSizeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/account/handle/fingerprints/NamesInactiveAccountThumbnailSizeFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.NamesIn import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object NamesInactiveAccountThumbnailSizeFingerprint : LiteralValueFingerprint( +internal object NamesInactiveAccountThumbnailSizeFingerprint : LiteralValueFingerprint( returnType = "V", parameters = listOf("L", "Ljava/lang/Object;"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/account/tos/TermsContainerPatch.kt b/src/main/kotlin/app/revanced/patches/music/account/tos/TermsContainerPatch.kt index b0885fd4f..63ea6d680 100644 --- a/src/main/kotlin/app/revanced/patches/music/account/tos/TermsContainerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/account/tos/TermsContainerPatch.kt @@ -4,83 +4,46 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch -import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.account.tos.fingerprints.TermsOfServiceFingerprint -import app.revanced.patches.music.utils.integrations.Constants.ACCOUNT +import app.revanced.patches.music.utils.integrations.Constants.ACCOUNT_CLASS_DESCRIPTOR +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c +import app.revanced.util.getTargetIndexWithReference +import app.revanced.util.patch.BaseBytecodePatch +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -@Patch( +@Suppress("unused") +object TermsContainerPatch : BaseBytecodePatch( name = "Hide terms container", description = "Adds an option to hide the terms of service container in the account menu.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object TermsContainerPatch : BytecodePatch( - setOf(TermsOfServiceFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(TermsOfServiceFingerprint) ) { override fun execute(context: BytecodeContext) { TermsOfServiceFingerprint.result?.let { it.mutableMethod.apply { - var insertIndex = 0 + val insertIndex = getTargetIndexWithReference("/PrivacyTosFooter;->setVisibility(I)V") + val visibilityRegister = + getInstruction(insertIndex).registerD - for (index in implementation!!.instructions.size - 1 downTo 0) { - if (getInstruction(index).opcode != Opcode.INVOKE_VIRTUAL) continue - - val targetReference = - getInstruction(index).reference.toString() - - if (targetReference.endsWith("/PrivacyTosFooter;->setVisibility(I)V")) { - insertIndex = index - - val visibilityRegister = - getInstruction(insertIndex).registerD - - addInstruction( - index + 1, - "const/4 v$visibilityRegister, 0x0" - ) - addInstructions( - index, """ - invoke-static {}, $ACCOUNT->hideTermsContainer()I - move-result v$visibilityRegister - """ - ) - - break - } - } - if (insertIndex == 0) - throw PatchException("target Instruction not found!") + addInstruction( + insertIndex + 1, + "const/4 v$visibilityRegister, 0x0" + ) + addInstructions( + insertIndex, """ + invoke-static {}, $ACCOUNT_CLASS_DESCRIPTOR->hideTermsContainer()I + move-result v$visibilityRegister + """ + ) } } ?: throw TermsOfServiceFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/music/account/tos/fingerprints/TermsOfServiceFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/account/tos/fingerprints/TermsOfServiceFingerprint.kt index 5049d83f7..5f379ca9e 100644 --- a/src/main/kotlin/app/revanced/patches/music/account/tos/fingerprints/TermsOfServiceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/account/tos/fingerprints/TermsOfServiceFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.account.tos.fingerprints import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.TosFooter import app.revanced.util.fingerprint.LiteralValueFingerprint -object TermsOfServiceFingerprint : LiteralValueFingerprint( +internal object TermsOfServiceFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", literalSupplier = { TosFooter } ) diff --git a/src/main/kotlin/app/revanced/patches/music/actionbar/component/ActionBarComponentPatch.kt b/src/main/kotlin/app/revanced/patches/music/actionbar/component/ActionBarComponentPatch.kt index d0879f187..ff2931614 100644 --- a/src/main/kotlin/app/revanced/patches/music/actionbar/component/ActionBarComponentPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/actionbar/component/ActionBarComponentPatch.kt @@ -6,91 +6,68 @@ 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.extensions.InstructionExtensions.removeInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.music.actionbar.component.fingerprints.ActionBarComponentFingerprint import app.revanced.patches.music.actionbar.component.fingerprints.LikeDislikeContainerFingerprint import app.revanced.patches.music.actionbar.component.fingerprints.LikeDislikeContainerVisibilityFingerprint -import app.revanced.patches.music.utils.integrations.Constants.ACTIONBAR +import app.revanced.patches.music.utils.integrations.Constants.ACTIONBAR_CLASS_DESCRIPTOR +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.LikeDislikeContainer import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.music.video.information.VideoInformationPatch import app.revanced.util.exception +import app.revanced.util.getTargetIndexWithMethodReferenceName +import app.revanced.util.getTargetIndexWithReference import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.indexOfFirstInstruction +import app.revanced.util.patch.BaseBytecodePatch 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.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference import kotlin.math.min -@Patch( +@Suppress("unused") +object ActionBarComponentPatch : BaseBytecodePatch( name = "Hide action bar component", description = "Adds options to hide action bar components and replace the offline download button with an external download button.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class, VideoInformationPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object ActionBarComponentPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( ActionBarComponentFingerprint, LikeDislikeContainerFingerprint ) ) { - private var spannedReference = "" - override fun execute(context: BytecodeContext) { ActionBarComponentFingerprint.result?.let { it.mutableMethod.apply { - val instructions = implementation!!.instructions // hook download button - val addViewIndex = instructions.indexOfLast { instruction -> - ((instruction as? ReferenceInstruction)?.reference as? MethodReference)?.name == "addView" - } + val addViewIndex = getTargetIndexWithMethodReferenceName("addView") val addViewRegister = getInstruction(addViewIndex).registerD addInstruction( addViewIndex + 1, - "invoke-static {v$addViewRegister}, $ACTIONBAR->hookDownloadButton(Landroid/view/View;)V" + "invoke-static {v$addViewRegister}, $ACTIONBAR_CLASS_DESCRIPTOR->hookDownloadButton(Landroid/view/View;)V" ) // hide action button label - val noLabelIndex = instructions.indexOfFirst { instruction -> - val reference = (instruction as? ReferenceInstruction)?.reference.toString() - instruction.opcode == Opcode.INVOKE_DIRECT + val noLabelIndex = indexOfFirstInstruction { + val reference = (this as? ReferenceInstruction)?.reference.toString() + opcode == Opcode.INVOKE_DIRECT && reference.endsWith("(Landroid/content/Context;)V") && !reference.contains("Lcom/google/android/libraries/youtube/common/ui/YouTubeButton;") } - 2 - - val replaceIndex = instructions.indexOfFirst { instruction -> - val reference = (instruction as? ReferenceInstruction)?.reference.toString() - instruction.opcode == Opcode.INVOKE_DIRECT + val replaceIndex = indexOfFirstInstruction { + val reference = (this as? ReferenceInstruction)?.reference.toString() + opcode == Opcode.INVOKE_DIRECT && reference.endsWith("Lcom/google/android/libraries/youtube/common/ui/YouTubeButton;->(Landroid/content/Context;)V") } - 2 val replaceInstruction = getInstruction(replaceIndex) @@ -98,7 +75,7 @@ object ActionBarComponentPatch : BytecodePatch( addInstructionsWithLabels( replaceIndex + 1, """ - invoke-static {}, $ACTIONBAR->hideActionBarLabel()Z + invoke-static {}, $ACTIONBAR_CLASS_DESCRIPTOR->hideActionBarLabel()Z move-result v${replaceInstruction.registerA} if-nez v${replaceInstruction.registerA}, :hidden iget-object v${replaceInstruction.registerA}, v${replaceInstruction.registerB}, $replaceReference @@ -107,21 +84,16 @@ object ActionBarComponentPatch : BytecodePatch( removeInstruction(replaceIndex) // hide action button - val hasNextIndex = instructions.indexOfFirst { instruction -> - ((instruction as? ReferenceInstruction)?.reference as? MethodReference)?.name == "hasNext" - } - + val hasNextIndex = getTargetIndexWithMethodReferenceName("hasNext") val freeRegister = min(implementation!!.registerCount - parameters.size - 2, 15) - val spannedIndex = instructions.indexOfFirst { instruction -> - spannedReference = (instruction as? ReferenceInstruction)?.reference.toString() - spannedReference.endsWith("Landroid/text/Spanned;") - } + val spannedIndex = getTargetIndexWithReference(")Landroid/text/Spanned;") val spannedRegister = getInstruction(spannedIndex).registerC + val spannedReference = getInstruction(spannedIndex).reference addInstructionsWithLabels( spannedIndex + 1, """ - invoke-static {}, $ACTIONBAR->hideActionButton()Z + invoke-static {}, $ACTIONBAR_CLASS_DESCRIPTOR->hideActionButton()Z move-result v$freeRegister if-nez v$freeRegister, :hidden invoke-static {v$spannedRegister}, $spannedReference @@ -138,12 +110,12 @@ object ActionBarComponentPatch : BytecodePatch( addInstruction( buttonTypeIndex + 2, - "invoke-static {v$buttonTypeRegister}, $ACTIONBAR->setButtonType(Ljava/lang/Object;)V" + "invoke-static {v$buttonTypeRegister}, $ACTIONBAR_CLASS_DESCRIPTOR->setButtonType(Ljava/lang/Object;)V" ) addInstruction( buttonTypeDownloadIndex, - "invoke-static {v$buttonTypeDownloadRegister}, $ACTIONBAR->setButtonTypeDownload(I)V" + "invoke-static {v$buttonTypeDownloadRegister}, $ACTIONBAR_CLASS_DESCRIPTOR->setButtonTypeDownload(I)V" ) } } ?: throw ActionBarComponentFingerprint.exception @@ -163,7 +135,7 @@ object ActionBarComponentPatch : BytecodePatch( addInstructions( targetIndex + 1, """ - invoke-static {v$targetRegister}, $ACTIONBAR->hideLikeDislikeButton(Z)Z + invoke-static {v$targetRegister}, $ACTIONBAR_CLASS_DESCRIPTOR->hideLikeDislikeButton(Z)Z move-result v$targetRegister """ ) @@ -176,7 +148,7 @@ object ActionBarComponentPatch : BytecodePatch( addInstruction( insertIndex + 1, - "invoke-static {v$insertRegister}, $ACTIONBAR->hideLikeDislikeButton(Landroid/view/View;)V" + "invoke-static {v$insertRegister}, $ACTIONBAR_CLASS_DESCRIPTOR->hideLikeDislikeButton(Landroid/view/View;)V" ) } } ?: throw LikeDislikeContainerFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/music/actionbar/component/fingerprints/ActionBarComponentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/actionbar/component/fingerprints/ActionBarComponentFingerprint.kt index bb535da1a..7978eb4b0 100644 --- a/src/main/kotlin/app/revanced/patches/music/actionbar/component/fingerprints/ActionBarComponentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/actionbar/component/fingerprints/ActionBarComponentFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ActionBarComponentFingerprint : LiteralValueFingerprint( +internal object ActionBarComponentFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "L"), diff --git a/src/main/kotlin/app/revanced/patches/music/actionbar/component/fingerprints/LikeDislikeContainerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/actionbar/component/fingerprints/LikeDislikeContainerFingerprint.kt index df1542262..7ec66d0e8 100644 --- a/src/main/kotlin/app/revanced/patches/music/actionbar/component/fingerprints/LikeDislikeContainerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/actionbar/component/fingerprints/LikeDislikeContainerFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.LikeDis import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object LikeDislikeContainerFingerprint : LiteralValueFingerprint( +internal object LikeDislikeContainerFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, literalSupplier = { LikeDislikeContainer } diff --git a/src/main/kotlin/app/revanced/patches/music/ads/general/GeneralAdsPatch.kt b/src/main/kotlin/app/revanced/patches/music/ads/general/GeneralAdsPatch.kt index effb750cf..1758abcae 100644 --- a/src/main/kotlin/app/revanced/patches/music/ads/general/GeneralAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/ads/general/GeneralAdsPatch.kt @@ -4,17 +4,14 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.music.ads.general.fingerprints.FloatingLayoutFingerprint import app.revanced.patches.music.ads.general.fingerprints.InterstitialsContainerFingerprint import app.revanced.patches.music.ads.general.fingerprints.NotifierShelfFingerprint import app.revanced.patches.music.ads.general.fingerprints.ShowDialogCommandFingerprint import app.revanced.patches.music.ads.music.MusicAdsPatch -import app.revanced.patches.music.navigation.component.NavigationBarComponentPatch import app.revanced.patches.music.utils.integrations.Constants.ADS_PATH +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.ButtonContainer @@ -25,39 +22,21 @@ import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.util.exception import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object GeneralAdsPatch : BaseBytecodePatch( name = "Hide general ads", description = "Adds options to hide general ads.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, MusicAdsPatch::class, - NavigationBarComponentPatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object GeneralAdsPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( FloatingLayoutFingerprint, InterstitialsContainerFingerprint, NotifierShelfFingerprint, @@ -103,14 +82,6 @@ object GeneralAdsPatch : BytecodePatch( it.mutableMethod.apply { // In this method, custom dialog is created and shown. // There were no issues despite adding “return-void” to the first index. - // - // If an issue occurs due to patching due to server-side changes in the future, - // Find the instruction whose name is "show" in [MethodReference] and click the 'AlertDialog.BUTTON_POSITIVE' button. - // - // In this case, an instruction for 'getButton' must be added to smali, not in integrations - // (This custom dialog cannot be cast to [AlertDialog] or [Dialog]) - // - // See the comments below. addInstructionsWithLabels( 0, """ @@ -121,33 +92,38 @@ object GeneralAdsPatch : BytecodePatch( """, ExternalLabel("show", getInstruction(0)) ) - /* - val dialogIndex = getTargetIndexWithMethodReferenceName("show") - val dialogReference = getInstruction(dialogIndex).reference - val dialogDefiningClass = (dialogReference as MethodReference).definingClass - val getButtonMethod = context.findClass(dialogDefiningClass)!! - .mutableClass.methods.first { method -> - method.parameters == listOf("I") - && method.returnType == "Landroid/widget/Button;" - } - val getButtonCall = dialogDefiningClass + "->" + getButtonMethod.name + "(I)Landroid/widget/Button;" + // If an issue occurs due to patching due to server-side changes in the future, + // Find the instruction whose name is "show" in [MethodReference] and click the 'AlertDialog.BUTTON_POSITIVE' button. + // + // In this case, an instruction for 'getButton' must be added to smali, not in integrations + // (This custom dialog cannot be cast to [AlertDialog] or [Dialog]) + // + // See the comments below. - val dialogRegister = getInstruction(dialogIndex).registerC - val freeIndex = getTargetIndex(dialogIndex, Opcode.IF_EQZ) - val freeRegister = getInstruction(freeIndex).registerA + // val dialogIndex = getTargetIndexWithMethodReferenceName("show") + // val dialogReference = getInstruction(dialogIndex).reference + // val dialogDefiningClass = (dialogReference as MethodReference).definingClass + // val getButtonMethod = context.findClass(dialogDefiningClass)!! + // .mutableClass.methods.first { method -> + // method.parameters == listOf("I") + // && method.returnType == "Landroid/widget/Button;" + // } + // val getButtonCall = dialogDefiningClass + "->" + getButtonMethod.name + "(I)Landroid/widget/Button;" + // val dialogRegister = getInstruction(dialogIndex).registerC + // val freeIndex = getTargetIndex(dialogIndex, Opcode.IF_EQZ) + // val freeRegister = getInstruction(freeIndex).registerA - addInstructions( - dialogIndex + 1, """ - # Get the 'AlertDialog.BUTTON_POSITIVE' from custom dialog - # Since this custom dialog cannot be cast to AlertDialog or Dialog, - # It should come from smali, not integrations. - const/4 v$freeRegister, -0x1 - invoke-virtual {v$dialogRegister, $freeRegister}, $getButtonCall - move-result-object $freeRegister - invoke-static {$freeRegister}, $FULLSCREEN_ADS_CLASS_DESCRIPTOR->confirmDialog(Landroid/widget/Button;)V - """ - ) - */ + // addInstructions( + // dialogIndex + 1, """ + // # Get the 'AlertDialog.BUTTON_POSITIVE' from custom dialog + // # Since this custom dialog cannot be cast to AlertDialog or Dialog, + // # It should come from smali, not integrations. + // const/4 v$freeRegister, -0x1 + // invoke-virtual {v$dialogRegister, $freeRegister}, $getButtonCall + // move-result-object $freeRegister + // invoke-static {$freeRegister}, $FULLSCREEN_ADS_CLASS_DESCRIPTOR->confirmDialog(Landroid/widget/Button;)V + // """ + // ) } } ?: throw ShowDialogCommandFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/FloatingLayoutFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/FloatingLayoutFingerprint.kt index 733ff72af..ec2956f36 100644 --- a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/FloatingLayoutFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/FloatingLayoutFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.Floatin import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object FloatingLayoutFingerprint : LiteralValueFingerprint( +internal object FloatingLayoutFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/InterstitialsContainerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/InterstitialsContainerFingerprint.kt index 40cad9408..a85f134c7 100644 --- a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/InterstitialsContainerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/InterstitialsContainerFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.ads.general.fingerprints import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.InterstitialsContainer import app.revanced.util.fingerprint.LiteralValueFingerprint -object InterstitialsContainerFingerprint : LiteralValueFingerprint( +internal object InterstitialsContainerFingerprint : LiteralValueFingerprint( returnType = "V", strings= listOf("overlay_controller_param"), literalSupplier = { InterstitialsContainer } diff --git a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/NotifierShelfFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/NotifierShelfFingerprint.kt index e75bc9600..e0ba63d86 100644 --- a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/NotifierShelfFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/NotifierShelfFingerprint.kt @@ -7,7 +7,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MusicNo import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags -object NotifierShelfFingerprint : MethodFingerprint( +internal object NotifierShelfFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, customFingerprint = { methodDef, _ -> diff --git a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/ShowDialogCommandFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/ShowDialogCommandFingerprint.kt index 3c415adb6..80ea26f7b 100644 --- a/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/ShowDialogCommandFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/ads/general/fingerprints/ShowDialogCommandFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.ads.general.fingerprints import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.SlidingDialogAnimation import app.revanced.util.fingerprint.LiteralValueFingerprint -object ShowDialogCommandFingerprint : LiteralValueFingerprint( +internal object ShowDialogCommandFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { SlidingDialogAnimation } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/ads/music/MusicAdsPatch.kt b/src/main/kotlin/app/revanced/patches/music/ads/music/MusicAdsPatch.kt index 9eb70f2c7..a193cf29b 100644 --- a/src/main/kotlin/app/revanced/patches/music/ads/music/MusicAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/ads/music/MusicAdsPatch.kt @@ -1,9 +1,9 @@ package app.revanced.patches.music.ads.music import app.revanced.patches.music.utils.integrations.Constants.ADS_PATH -import app.revanced.patches.shared.ads.AbstractAdsPatch +import app.revanced.patches.shared.ads.BaseAdsPatch -object MusicAdsPatch : AbstractAdsPatch( +object MusicAdsPatch : BaseAdsPatch( "$ADS_PATH/MusicAdsPatch;", "hideMusicAds" ) diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/compactdialog/CompactDialogPatch.kt b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/compactdialog/CompactDialogPatch.kt index 7129155d2..ffebd2714 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/compactdialog/CompactDialogPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/compactdialog/CompactDialogPatch.kt @@ -2,61 +2,36 @@ package app.revanced.patches.music.flyoutpanel.compactdialog import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.music.flyoutpanel.compactdialog.fingerprints.DialogSolidFingerprint -import app.revanced.patches.music.utils.integrations.Constants.FLYOUT +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.FLYOUT_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.getWalkerMethod +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object CompactDialogPatch : BaseBytecodePatch( name = "Enable compact dialog", description = "Adds an option to enable the compact flyout menu on phones.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object CompactDialogPatch : BytecodePatch( - setOf(DialogSolidFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(DialogSolidFingerprint) ) { override fun execute(context: BytecodeContext) { DialogSolidFingerprint.result?.let { - with( - context - .toMethodWalker(it.method) - .nextMethod(it.scanResult.patternScanResult!!.endIndex, true) - .getMethod() as MutableMethod - ) { - addInstructions( - 2, """ - invoke-static {p0}, $FLYOUT->enableCompactDialog(I)I - move-result p0 - """ - ) - } + val walkerMethod = it.getWalkerMethod(context, it.scanResult.patternScanResult!!.endIndex) + walkerMethod.addInstructions( + 2, """ + invoke-static {p0}, $FLYOUT_CLASS_DESCRIPTOR->enableCompactDialog(I)I + move-result p0 + """ + ) } ?: throw DialogSolidFingerprint.exception SettingsPatch.addMusicPreference( diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/compactdialog/fingerprints/DialogSolidFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/compactdialog/fingerprints/DialogSolidFingerprint.kt index fcddc4a07..5d47af14a 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/compactdialog/fingerprints/DialogSolidFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/compactdialog/fingerprints/DialogSolidFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object DialogSolidFingerprint : LiteralValueFingerprint( +internal object DialogSolidFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/component/FlyoutPanelPatch.kt b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/component/FlyoutPanelPatch.kt index 3f3f225a4..429e9c23a 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/component/FlyoutPanelPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/component/FlyoutPanelPatch.kt @@ -3,14 +3,12 @@ package app.revanced.patches.music.flyoutpanel.component import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.flyoutpanel.component.fingerprints.EndButtonsContainerFingerprint import app.revanced.patches.music.flyoutpanel.component.fingerprints.SleepTimerFingerprint import app.revanced.patches.music.flyoutpanel.shared.FlyoutPanelMenuItemPatch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.COMPONENTS_PATH -import app.revanced.patches.music.utils.integrations.Constants.FLYOUT +import app.revanced.patches.music.utils.integrations.Constants.FLYOUT_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.EndButtonsContainer import app.revanced.patches.music.utils.settings.CategoryType @@ -19,43 +17,29 @@ import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.util.exception import app.revanced.util.getTargetIndex import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object FlyoutPanelPatch : BaseBytecodePatch( name = "Hide flyout panel", description = "Adds options to hide flyout panel components.", - dependencies = [ + dependencies = setOf( FlyoutPanelMenuItemPatch::class, LithoFilterPatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object FlyoutPanelPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( EndButtonsContainerFingerprint, SleepTimerFingerprint ) ) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/PlayerFlyoutPanelsFilter;" + override fun execute(context: BytecodeContext) { FlyoutPanelMenuItemPatch.hideComponents() @@ -67,7 +51,7 @@ object FlyoutPanelPatch : BytecodePatch( addInstruction( targetIndex + 1, - "invoke-static {v$targetRegister}, $FLYOUT->hideLikeDislikeContainer(Landroid/view/View;)V" + "invoke-static {v$targetRegister}, $FLYOUT_CLASS_DESCRIPTOR->hideLikeDislikeContainer(Landroid/view/View;)V" ) } } ?: throw EndButtonsContainerFingerprint.exception @@ -234,7 +218,4 @@ object FlyoutPanelPatch : BytecodePatch( "false" ) } - - private const val FILTER_CLASS_DESCRIPTOR = - "$COMPONENTS_PATH/PlayerFlyoutPanelsFilter;" } diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/component/fingerprints/EndButtonsContainerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/component/fingerprints/EndButtonsContainerFingerprint.kt index ab6a6e62d..76162f1c2 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/component/fingerprints/EndButtonsContainerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/component/fingerprints/EndButtonsContainerFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.flyoutpanel.component.fingerprints import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.EndButtonsContainer import app.revanced.util.fingerprint.LiteralValueFingerprint -object EndButtonsContainerFingerprint : LiteralValueFingerprint( +internal object EndButtonsContainerFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { EndButtonsContainer } ) diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/component/fingerprints/SleepTimerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/component/fingerprints/SleepTimerFingerprint.kt index c33f80337..ac91d20a8 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/component/fingerprints/SleepTimerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/component/fingerprints/SleepTimerFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.flyoutpanel.component.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint -object SleepTimerFingerprint : LiteralValueFingerprint( +internal object SleepTimerFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), literalSupplier = { 45372767 } diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/replace/ReplaceDismissQueuePatch.kt b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/replace/ReplaceDismissQueuePatch.kt index 60fd2ed68..d5bbbe553 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/replace/ReplaceDismissQueuePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/replace/ReplaceDismissQueuePatch.kt @@ -1,42 +1,24 @@ package app.revanced.patches.music.flyoutpanel.replace import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.flyoutpanel.shared.FlyoutPanelMenuItemPatch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.music.video.information.VideoInformationPatch +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object ReplaceDismissQueuePatch : BaseBytecodePatch( name = "Replace dismiss queue", description = "Adds an option to replace \"Dismiss queue\" with \"Watch on YouTube\" in the flyout menu.", - dependencies = [ + dependencies = setOf( FlyoutPanelMenuItemPatch::class, SettingsPatch::class, VideoInformationPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object ReplaceDismissQueuePatch : BytecodePatch(emptySet()) { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { override fun execute(context: BytecodeContext) { FlyoutPanelMenuItemPatch.replaceComponents() diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/replace/ReplaceReportPatch.kt b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/replace/ReplaceReportPatch.kt index 07b317dd1..9efa298d4 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/replace/ReplaceReportPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/replace/ReplaceReportPatch.kt @@ -3,51 +3,32 @@ package app.revanced.patches.music.flyoutpanel.replace import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.flyoutpanel.replace.fingerprints.TouchOutsideFingerprint import app.revanced.patches.music.flyoutpanel.shared.FlyoutPanelMenuItemPatch -import app.revanced.patches.music.utils.integrations.Constants.FLYOUT +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.FLYOUT_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.overridespeed.OverrideSpeedHookPatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getTargetIndexWithMethodReferenceName +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -@Patch( +@Suppress("unused") +object ReplaceReportPatch : BaseBytecodePatch( name = "Replace report", description = "Adds an option to replace \"Report\" with \"Playback speed\" in the flyout menu.", - dependencies = [ + dependencies = setOf( FlyoutPanelMenuItemPatch::class, OverrideSpeedHookPatch::class, ReplaceReportResourcePatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object ReplaceReportPatch : BytecodePatch( - setOf(TouchOutsideFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(TouchOutsideFingerprint) ) { override fun execute(context: BytecodeContext) { FlyoutPanelMenuItemPatch.replaceComponents() @@ -59,7 +40,7 @@ object ReplaceReportPatch : BytecodePatch( addInstruction( setOnClickListenerIndex + 1, - "sput-object v$setOnClickListenerRegister, $FLYOUT->touchOutSideView:Landroid/view/View;" + "sput-object v$setOnClickListenerRegister, $FLYOUT_CLASS_DESCRIPTOR->touchOutSideView:Landroid/view/View;" ) } } ?: throw TouchOutsideFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/replace/fingerprints/TouchOutsideFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/replace/fingerprints/TouchOutsideFingerprint.kt index 09b634178..d3107516b 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/replace/fingerprints/TouchOutsideFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/replace/fingerprints/TouchOutsideFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.flyoutpanel.replace.fingerprints import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.TouchOutside import app.revanced.util.fingerprint.LiteralValueFingerprint -object TouchOutsideFingerprint : LiteralValueFingerprint( +internal object TouchOutsideFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", literalSupplier = { TouchOutside } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/shared/FlyoutPanelMenuItemPatch.kt b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/shared/FlyoutPanelMenuItemPatch.kt index 2fa5b6b5d..8edd55ff3 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/shared/FlyoutPanelMenuItemPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/shared/FlyoutPanelMenuItemPatch.kt @@ -8,7 +8,7 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.music.flyoutpanel.shared.fingerprints.MenuItemFingerprint -import app.revanced.patches.music.utils.integrations.Constants.FLYOUT +import app.revanced.patches.music.utils.integrations.Constants.FLYOUT_CLASS_DESCRIPTOR import app.revanced.util.exception import app.revanced.util.getTargetIndex import app.revanced.util.indexOfFirstInstruction @@ -58,7 +58,7 @@ object FlyoutPanelMenuItemPatch : BytecodePatch( addInstructionsWithLabels( enumIndex + 1, """ - invoke-static {v$enumRegister}, $FLYOUT->hideComponents(Ljava/lang/Enum;)Z + invoke-static {v$enumRegister}, $FLYOUT_CLASS_DESCRIPTOR->hideComponents(Ljava/lang/Enum;)Z move-result v$freeRegister if-nez v$freeRegister, :hide """, ExternalLabel("hide", getInstruction(implementation!!.instructions.size - 1)) @@ -74,7 +74,7 @@ object FlyoutPanelMenuItemPatch : BytecodePatch( addInstruction( enumIndex + 1, - "invoke-static {v$enumRegister, v$textViewRegister, v$imageViewRegister}, $FLYOUT->replaceComponents(Ljava/lang/Enum;Landroid/widget/TextView;Landroid/widget/ImageView;)V" + "invoke-static {v$enumRegister, v$textViewRegister, v$imageViewRegister}, $FLYOUT_CLASS_DESCRIPTOR->replaceComponents(Ljava/lang/Enum;Landroid/widget/TextView;Landroid/widget/ImageView;)V" ) } instructionAdded = true diff --git a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/shared/fingerprints/MenuItemFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/shared/fingerprints/MenuItemFingerprint.kt index e8785541e..53998416c 100644 --- a/src/main/kotlin/app/revanced/patches/music/flyoutpanel/shared/fingerprints/MenuItemFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/flyoutpanel/shared/fingerprints/MenuItemFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object MenuItemFingerprint : MethodFingerprint( +internal object MenuItemFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/general/amoled/AmoledPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/amoled/AmoledPatch.kt index cbc8e9cd4..22891ab4c 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/amoled/AmoledPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/amoled/AmoledPatch.kt @@ -1,37 +1,19 @@ package app.revanced.patches.music.general.amoled import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.UTILS_PATH import app.revanced.patches.shared.drawable.DrawableColorPatch +import app.revanced.util.patch.BaseResourcePatch import org.w3c.dom.Element -@Patch( +@Suppress("DEPRECATION", "unused") +object AmoledPatch : BaseResourcePatch( name = "Amoled", description = "Applies a pure black theme to some components.", - dependencies = [DrawableColorPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ], -) -@Suppress("unused") -object AmoledPatch : ResourcePatch() { + dependencies = setOf(DrawableColorPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE +) { override fun execute(context: ResourceContext) { DrawableColorPatch.injectCall("$UTILS_PATH/DrawableColorPatch;->getColor(I)I") diff --git a/src/main/kotlin/app/revanced/patches/music/general/autocaptions/AutoCaptionsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/music/general/autocaptions/AutoCaptionsBytecodePatch.kt new file mode 100644 index 000000000..443fc43a5 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/general/autocaptions/AutoCaptionsBytecodePatch.kt @@ -0,0 +1,6 @@ +package app.revanced.patches.music.general.autocaptions + +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR +import app.revanced.patches.shared.captions.BaseAutoCaptionsPatch + +object AutoCaptionsBytecodePatch : BaseAutoCaptionsPatch(GENERAL_CLASS_DESCRIPTOR) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/general/autocaptions/AutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/autocaptions/AutoCaptionsPatch.kt index 1423ea062..2df5c1eb5 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/autocaptions/AutoCaptionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/autocaptions/AutoCaptionsPatch.kt @@ -1,47 +1,27 @@ package app.revanced.patches.music.general.autocaptions -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.music.utils.integrations.Constants.GENERAL +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.music.video.videoid.VideoIdPatch -import app.revanced.patches.shared.captions.AbstractAutoCaptionsPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object AutoCaptionsPatch : BaseResourcePatch( name = "Disable auto captions", description = "Adds an option to disable captions from being automatically enabled.", - dependencies = [ + dependencies = setOf( + AutoCaptionsBytecodePatch::class, SettingsPatch::class, VideoIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ], -) -@Suppress("unused") -object AutoCaptionsPatch : AbstractAutoCaptionsPatch( - GENERAL + ), + compatiblePackages = COMPATIBLE_PACKAGE ) { - override fun execute(context: BytecodeContext) { - super.execute(context) + override fun execute(context: ResourceContext) { - VideoIdPatch.hookBackgroundPlayVideoId("$GENERAL->newVideoStarted(Ljava/lang/String;)V") + VideoIdPatch.hookBackgroundPlayVideoId("$GENERAL_CLASS_DESCRIPTOR->newVideoStarted(Ljava/lang/String;)V") SettingsPatch.addMusicPreference( CategoryType.GENERAL, diff --git a/src/main/kotlin/app/revanced/patches/music/general/buttonshelf/HideButtonShelfPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/buttonshelf/ButtonShelfPatch.kt similarity index 51% rename from src/main/kotlin/app/revanced/patches/music/general/buttonshelf/HideButtonShelfPatch.kt rename to src/main/kotlin/app/revanced/patches/music/general/buttonshelf/ButtonShelfPatch.kt index 74039f21d..b705ae4fc 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/buttonshelf/HideButtonShelfPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/buttonshelf/ButtonShelfPatch.kt @@ -1,42 +1,28 @@ package app.revanced.patches.music.general.buttonshelf -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object ButtonShelfPatch : BaseResourcePatch( name = "Hide button shelf", description = "Adds an option to hide the button shelf from the homepage and explore tab.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object HideButtonShelfPatch : BytecodePatch(emptySet()) { - override fun execute(context: BytecodeContext) { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/ButtonShelfFilter;" + + override fun execute(context: ResourceContext) { + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) SettingsPatch.addMusicPreference( CategoryType.GENERAL, @@ -44,10 +30,5 @@ object HideButtonShelfPatch : BytecodePatch(emptySet()) { "false" ) - LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) - } - - private const val FILTER_CLASS_DESCRIPTOR = - "$COMPONENTS_PATH/ButtonShelfFilter;" } diff --git a/src/main/kotlin/app/revanced/patches/music/general/carouselshelf/HideCarouselShelfPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/carouselshelf/CarouselShelfPatch.kt similarity index 52% rename from src/main/kotlin/app/revanced/patches/music/general/carouselshelf/HideCarouselShelfPatch.kt rename to src/main/kotlin/app/revanced/patches/music/general/carouselshelf/CarouselShelfPatch.kt index 9338a7678..ffb2fd00d 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/carouselshelf/HideCarouselShelfPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/carouselshelf/CarouselShelfPatch.kt @@ -1,42 +1,28 @@ package app.revanced.patches.music.general.carouselshelf -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object CarouselShelfPatch : BaseResourcePatch( name = "Hide carousel shelf", description = "Adds an option to hide the carousel shelf from the homepage and explore tab.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object HideCarouselShelfPatch : BytecodePatch(emptySet()) { - override fun execute(context: BytecodeContext) { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/CarouselShelfFilter;" + + override fun execute(context: ResourceContext) { + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) SettingsPatch.addMusicPreference( CategoryType.GENERAL, @@ -44,10 +30,5 @@ object HideCarouselShelfPatch : BytecodePatch(emptySet()) { "false" ) - LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) - } - - private const val FILTER_CLASS_DESCRIPTOR = - "$COMPONENTS_PATH/CarouselShelfFilter;" } diff --git a/src/main/kotlin/app/revanced/patches/music/general/castbutton/HideCastButtonPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/castbutton/CastButtonPatch.kt similarity index 75% rename from src/main/kotlin/app/revanced/patches/music/general/castbutton/HideCastButtonPatch.kt rename to src/main/kotlin/app/revanced/patches/music/general/castbutton/CastButtonPatch.kt index 70fca835a..5bfb85840 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/castbutton/HideCastButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/castbutton/CastButtonPatch.kt @@ -4,49 +4,30 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.general.castbutton.fingerprints.MediaRouteButtonFingerprint import app.revanced.patches.music.general.castbutton.fingerprints.PlayerOverlayChipFingerprint -import app.revanced.patches.music.utils.integrations.Constants.GENERAL +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.PlayerOverlayChip import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object CastButtonPatch : BaseBytecodePatch( name = "Hide cast button", description = "Adds an option to hide the cast button.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object HideCastButtonPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( MediaRouteButtonFingerprint, PlayerOverlayChipFingerprint ) @@ -63,7 +44,7 @@ object HideCastButtonPatch : BytecodePatch( setVisibilityMethod?.apply { addInstructions( 0, """ - invoke-static {p1}, $GENERAL->hideCastButton(I)I + invoke-static {p1}, $GENERAL_CLASS_DESCRIPTOR->hideCastButton(I)I move-result p1 """ ) @@ -80,7 +61,7 @@ object HideCastButtonPatch : BytecodePatch( addInstruction( targetIndex + 1, - "invoke-static {v$targetRegister}, $GENERAL->hideCastButton(Landroid/view/View;)V" + "invoke-static {v$targetRegister}, $GENERAL_CLASS_DESCRIPTOR->hideCastButton(Landroid/view/View;)V" ) } } ?: throw PlayerOverlayChipFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/music/general/castbutton/fingerprints/MediaRouteButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/castbutton/fingerprints/MediaRouteButtonFingerprint.kt index 9b48294cb..de0d3d633 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/castbutton/fingerprints/MediaRouteButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/castbutton/fingerprints/MediaRouteButtonFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object MediaRouteButtonFingerprint : MethodFingerprint( +internal object MediaRouteButtonFingerprint : MethodFingerprint( returnType = "Z", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, strings = listOf("MediaRouteButton") diff --git a/src/main/kotlin/app/revanced/patches/music/general/castbutton/fingerprints/PlayerOverlayChipFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/castbutton/fingerprints/PlayerOverlayChipFingerprint.kt index 553b75e2b..c71ecebc5 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/castbutton/fingerprints/PlayerOverlayChipFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/castbutton/fingerprints/PlayerOverlayChipFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.PlayerO import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object PlayerOverlayChipFingerprint : LiteralValueFingerprint( +internal object PlayerOverlayChipFingerprint : LiteralValueFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, literalSupplier = { PlayerOverlayChip } diff --git a/src/main/kotlin/app/revanced/patches/music/general/categorybar/CategoryBarPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/categorybar/CategoryBarPatch.kt index c0961c507..06b2be61b 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/categorybar/CategoryBarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/categorybar/CategoryBarPatch.kt @@ -3,45 +3,26 @@ package app.revanced.patches.music.general.categorybar import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.general.categorybar.fingerprints.ChipCloudFingerprint -import app.revanced.patches.music.utils.integrations.Constants.GENERAL +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object CategoryBarPatch : BaseBytecodePatch( name = "Hide category bar", description = "Adds an option to hide the category bar.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object CategoryBarPatch : BytecodePatch( - setOf(ChipCloudFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(ChipCloudFingerprint) ) { override fun execute(context: BytecodeContext) { ChipCloudFingerprint.result?.let { @@ -51,7 +32,7 @@ object CategoryBarPatch : BytecodePatch( addInstruction( targetIndex + 1, - "invoke-static { v$targetRegister }, $GENERAL->hideCategoryBar(Landroid/view/View;)V" + "invoke-static { v$targetRegister }, $GENERAL_CLASS_DESCRIPTOR->hideCategoryBar(Landroid/view/View;)V" ) } } ?: throw ChipCloudFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/music/general/categorybar/fingerprints/ChipCloudFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/categorybar/fingerprints/ChipCloudFingerprint.kt index 443309a29..2d38e31c9 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/categorybar/fingerprints/ChipCloudFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/categorybar/fingerprints/ChipCloudFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.ChipClo import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object ChipCloudFingerprint : LiteralValueFingerprint( +internal object ChipCloudFingerprint : LiteralValueFingerprint( returnType = "V", opcodes = listOf( Opcode.CONST, diff --git a/src/main/kotlin/app/revanced/patches/music/general/channelguidelines/HideChannelGuidelinesPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/channelguidelines/ChannelGuidelinesPatch.kt similarity index 52% rename from src/main/kotlin/app/revanced/patches/music/general/channelguidelines/HideChannelGuidelinesPatch.kt rename to src/main/kotlin/app/revanced/patches/music/general/channelguidelines/ChannelGuidelinesPatch.kt index 4bb6b815d..0cc1824ba 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/channelguidelines/HideChannelGuidelinesPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/channelguidelines/ChannelGuidelinesPatch.kt @@ -1,42 +1,28 @@ package app.revanced.patches.music.general.channelguidelines -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object ChannelGuidelinesPatch : BaseResourcePatch( name = "Hide channel guidelines", description = "Adds an option to hide the channel guidelines at the top of the comments section.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object HideChannelGuidelinesPatch : BytecodePatch(emptySet()) { - override fun execute(context: BytecodeContext) { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/ChannelGuidelinesFilter;" + + override fun execute(context: ResourceContext) { + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) SettingsPatch.addMusicPreference( CategoryType.GENERAL, @@ -44,10 +30,5 @@ object HideChannelGuidelinesPatch : BytecodePatch(emptySet()) { "true" ) - LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) - } - - private const val FILTER_CLASS_DESCRIPTOR = - "$COMPONENTS_PATH/ChannelGuidelinesFilter;" } diff --git a/src/main/kotlin/app/revanced/patches/music/general/customfilter/CustomFilterPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/customfilter/CustomFilterPatch.kt index 489c93a3f..d89f606b3 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/customfilter/CustomFilterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/customfilter/CustomFilterPatch.kt @@ -1,42 +1,28 @@ package app.revanced.patches.music.general.customfilter -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object CustomFilterPatch : BaseResourcePatch( name = "Enable custom filter", description = "Adds a custom filter which can be used to hide layout components.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object CustomFilterPatch : BytecodePatch(emptySet()) { - override fun execute(context: BytecodeContext) { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/CustomFilter;" + + override fun execute(context: ResourceContext) { + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) SettingsPatch.addMusicPreference( CategoryType.GENERAL, @@ -49,10 +35,5 @@ object CustomFilterPatch : BytecodePatch(emptySet()) { "revanced_custom_filter" ) - LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) - } - - private const val FILTER_CLASS_DESCRIPTOR = - "$COMPONENTS_PATH/CustomFilter;" } diff --git a/src/main/kotlin/app/revanced/patches/music/general/dialog/RemoveViewerDiscretionDialogPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/dialog/RemoveViewerDiscretionDialogPatch.kt deleted file mode 100644 index 8f847ed7f..000000000 --- a/src/main/kotlin/app/revanced/patches/music/general/dialog/RemoveViewerDiscretionDialogPatch.kt +++ /dev/null @@ -1,47 +0,0 @@ -package app.revanced.patches.music.general.dialog - -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.music.utils.integrations.Constants.GENERAL -import app.revanced.patches.music.utils.settings.CategoryType -import app.revanced.patches.music.utils.settings.SettingsPatch -import app.revanced.patches.shared.dialog.AbstractRemoveViewerDiscretionDialogPatch - -@Patch( - name = "Remove viewer discretion dialog", - description = "Adds an option to remove the dialog that appears when opening a video that has been age-restricted " + - "by accepting it automatically. This does not bypass the age restriction.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object RemoveViewerDiscretionDialogPatch : AbstractRemoveViewerDiscretionDialogPatch( - GENERAL -) { - override fun execute(context: BytecodeContext) { - super.execute(context) - - SettingsPatch.addMusicPreference( - CategoryType.GENERAL, - "revanced_remove_viewer_discretion_dialog", - "false" - ) - } -} diff --git a/src/main/kotlin/app/revanced/patches/music/general/dialog/ViewerDiscretionDialogBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/music/general/dialog/ViewerDiscretionDialogBytecodePatch.kt new file mode 100644 index 000000000..08d9787e7 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/general/dialog/ViewerDiscretionDialogBytecodePatch.kt @@ -0,0 +1,6 @@ +package app.revanced.patches.music.general.dialog + +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR +import app.revanced.patches.shared.dialog.BaseViewerDiscretionDialogPatch + +object ViewerDiscretionDialogBytecodePatch : BaseViewerDiscretionDialogPatch(GENERAL_CLASS_DESCRIPTOR) diff --git a/src/main/kotlin/app/revanced/patches/music/general/dialog/ViewerDiscretionDialogPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/dialog/ViewerDiscretionDialogPatch.kt new file mode 100644 index 000000000..b9d6ff5b5 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/general/dialog/ViewerDiscretionDialogPatch.kt @@ -0,0 +1,28 @@ +package app.revanced.patches.music.general.dialog + +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.settings.CategoryType +import app.revanced.patches.music.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch + +@Suppress("unused") +object ViewerDiscretionDialogPatch : BaseResourcePatch( + name = "Remove viewer discretion dialog", + description = "Adds an option to remove the dialog that appears when opening a video that has been age-restricted " + + "by accepting it automatically. This does not bypass the age restriction.", + dependencies = setOf( + SettingsPatch::class, + ViewerDiscretionDialogBytecodePatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + override fun execute(context: ResourceContext) { + + SettingsPatch.addMusicPreference( + CategoryType.GENERAL, + "revanced_remove_viewer_discretion_dialog", + "false" + ) + } +} diff --git a/src/main/kotlin/app/revanced/patches/music/general/emojipicker/HideEmojiPickerPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/emojipicker/EmojiPickerPatch.kt similarity index 52% rename from src/main/kotlin/app/revanced/patches/music/general/emojipicker/HideEmojiPickerPatch.kt rename to src/main/kotlin/app/revanced/patches/music/general/emojipicker/EmojiPickerPatch.kt index bc7ea0d3f..d29434486 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/emojipicker/HideEmojiPickerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/emojipicker/EmojiPickerPatch.kt @@ -1,42 +1,28 @@ package app.revanced.patches.music.general.emojipicker -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object EmojiPickerPatch : BaseResourcePatch( name = "Hide emoji picker and time stamp", description = "Adds an option to hide the emoji picker and time stamp when typing comments.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object HideEmojiPickerPatch : BytecodePatch(emptySet()) { - override fun execute(context: BytecodeContext) { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/EmojiPickerFilter;" + + override fun execute(context: ResourceContext) { + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) SettingsPatch.addMusicPreference( CategoryType.GENERAL, @@ -44,10 +30,5 @@ object HideEmojiPickerPatch : BytecodePatch(emptySet()) { "false" ) - LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) - } - - private const val FILTER_CLASS_DESCRIPTOR = - "$COMPONENTS_PATH/EmojiPickerFilter;" } diff --git a/src/main/kotlin/app/revanced/patches/music/general/floatingbutton/NewPlaylistButtonPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/floatingbutton/FloatingButtonPatch.kt similarity index 71% rename from src/main/kotlin/app/revanced/patches/music/general/floatingbutton/NewPlaylistButtonPatch.kt rename to src/main/kotlin/app/revanced/patches/music/general/floatingbutton/FloatingButtonPatch.kt index 184e6273e..de0ecf910 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/floatingbutton/NewPlaylistButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/floatingbutton/FloatingButtonPatch.kt @@ -3,46 +3,27 @@ package app.revanced.patches.music.general.floatingbutton import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.music.general.floatingbutton.fingerprints.FloatingButtonFingerprint import app.revanced.patches.music.general.floatingbutton.fingerprints.FloatingButtonParentFingerprint -import app.revanced.patches.music.utils.integrations.Constants.GENERAL +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object FloatingButtonPatch : BaseBytecodePatch( name = "Hide new playlist button", description = "Adds an option to hide the \"New playlist\" button in the library.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object NewPlaylistButtonPatch : BytecodePatch( - setOf(FloatingButtonParentFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(FloatingButtonParentFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -56,7 +37,7 @@ object NewPlaylistButtonPatch : BytecodePatch( it.mutableMethod.apply { addInstructionsWithLabels( 1, """ - invoke-static {}, $GENERAL->hideNewPlaylistButton()Z + invoke-static {}, $GENERAL_CLASS_DESCRIPTOR->hideNewPlaylistButton()Z move-result v0 if-eqz v0, :show return-void diff --git a/src/main/kotlin/app/revanced/patches/music/general/floatingbutton/fingerprints/FloatingButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/floatingbutton/fingerprints/FloatingButtonFingerprint.kt index 686fdd2af..9f69c5209 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/floatingbutton/fingerprints/FloatingButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/floatingbutton/fingerprints/FloatingButtonFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.general.floatingbutton.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object FloatingButtonFingerprint : MethodFingerprint( +internal object FloatingButtonFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("L"), opcodes = listOf(Opcode.AND_INT_LIT16) diff --git a/src/main/kotlin/app/revanced/patches/music/general/floatingbutton/fingerprints/FloatingButtonParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/floatingbutton/fingerprints/FloatingButtonParentFingerprint.kt index b0132cbdb..c8f5ad107 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/floatingbutton/fingerprints/FloatingButtonParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/floatingbutton/fingerprints/FloatingButtonParentFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object FloatingButtonParentFingerprint : LiteralValueFingerprint( +internal object FloatingButtonParentFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/music/general/historybutton/HideHistoryButtonPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/historybutton/HistoryButtonPatch.kt similarity index 74% rename from src/main/kotlin/app/revanced/patches/music/general/historybutton/HideHistoryButtonPatch.kt rename to src/main/kotlin/app/revanced/patches/music/general/historybutton/HistoryButtonPatch.kt index 2b3c0664f..082c5b427 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/historybutton/HideHistoryButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/historybutton/HistoryButtonPatch.kt @@ -3,46 +3,27 @@ package app.revanced.patches.music.general.historybutton import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.general.historybutton.fingerprints.HistoryMenuItemFingerprint import app.revanced.patches.music.general.historybutton.fingerprints.HistoryMenuItemOfflineTabFingerprint -import app.revanced.patches.music.utils.integrations.Constants.GENERAL +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -@Patch( +@Suppress("unused") +object HistoryButtonPatch : BaseBytecodePatch( name = "Hide history button", description = "Adds an option to hide the history button in the toolbar.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object HideHistoryButtonPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( HistoryMenuItemFingerprint, HistoryMenuItemOfflineTabFingerprint ) @@ -60,7 +41,7 @@ object HideHistoryButtonPatch : BytecodePatch( addInstructions( insertIndex, """ - invoke-static {v$insertRegister}, $GENERAL->hideHistoryButton(Z)Z + invoke-static {v$insertRegister}, $GENERAL_CLASS_DESCRIPTOR->hideHistoryButton(Z)Z move-result v$insertRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/music/general/historybutton/fingerprints/HistoryMenuItemFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/historybutton/fingerprints/HistoryMenuItemFingerprint.kt index 7bb38b5ae..b4b276085 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/historybutton/fingerprints/HistoryMenuItemFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/historybutton/fingerprints/HistoryMenuItemFingerprint.kt @@ -7,7 +7,7 @@ import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object HistoryMenuItemFingerprint : MethodFingerprint( +internal object HistoryMenuItemFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/Menu;"), diff --git a/src/main/kotlin/app/revanced/patches/music/general/historybutton/fingerprints/HistoryMenuItemOfflineTabFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/historybutton/fingerprints/HistoryMenuItemOfflineTabFingerprint.kt index 2776fa6b1..ac98be844 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/historybutton/fingerprints/HistoryMenuItemOfflineTabFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/historybutton/fingerprints/HistoryMenuItemOfflineTabFingerprint.kt @@ -8,7 +8,7 @@ import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object HistoryMenuItemOfflineTabFingerprint : MethodFingerprint( +internal object HistoryMenuItemOfflineTabFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/Menu;"), diff --git a/src/main/kotlin/app/revanced/patches/music/general/landscapemode/LandScapeModePatch.kt b/src/main/kotlin/app/revanced/patches/music/general/landscapemode/LandScapeModePatch.kt index bca6b8470..117c3e2a7 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/landscapemode/LandScapeModePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/landscapemode/LandScapeModePatch.kt @@ -2,53 +2,41 @@ package app.revanced.patches.music.general.landscapemode import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patches.music.general.landscapemode.fingerprints.TabletIdentifierFingerprint -import app.revanced.patches.music.utils.integrations.Constants.GENERAL +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object LandScapeModePatch : BaseBytecodePatch( name = "Enable landscape mode", description = "Adds an option to enable landscape mode when rotating the screen on phones.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object LandScapeModePatch : BytecodePatch( - setOf(TabletIdentifierFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(TabletIdentifierFingerprint) ) { override fun execute(context: BytecodeContext) { TabletIdentifierFingerprint.result?.let { - it.mutableMethod.addInstructions( - it.scanResult.patternScanResult!!.endIndex + 1, """ - invoke-static {p0}, $GENERAL->enableLandScapeMode(Z)Z - move-result p0 - """ - ) + it.mutableMethod.apply { + val targetIndex = it.scanResult.patternScanResult!!.endIndex + val targetRegister = getInstruction(targetIndex).registerA + + addInstructions( + targetIndex + 1, """ + invoke-static {v$targetRegister}, $GENERAL_CLASS_DESCRIPTOR->enableLandScapeMode(Z)Z + move-result v$targetRegister + """ + ) + } } ?: throw TabletIdentifierFingerprint.exception SettingsPatch.addMusicPreference( diff --git a/src/main/kotlin/app/revanced/patches/music/general/landscapemode/fingerprints/TabletIdentifierFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/landscapemode/fingerprints/TabletIdentifierFingerprint.kt index 06600e8fb..d9105934e 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/landscapemode/fingerprints/TabletIdentifierFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/landscapemode/fingerprints/TabletIdentifierFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object TabletIdentifierFingerprint : LiteralValueFingerprint( +internal object TabletIdentifierFingerprint : LiteralValueFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/music/general/oldstylelibraryshelf/OldStyleLibraryShelfPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/oldstylelibraryshelf/OldStyleLibraryShelfPatch.kt index e96fe9439..be788de0f 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/oldstylelibraryshelf/OldStyleLibraryShelfPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/oldstylelibraryshelf/OldStyleLibraryShelfPatch.kt @@ -3,53 +3,37 @@ package app.revanced.patches.music.general.oldstylelibraryshelf import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.general.oldstylelibraryshelf.fingerprints.BrowseIdFingerprint -import app.revanced.patches.music.utils.integrations.Constants.GENERAL +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getStringInstructionIndex +import app.revanced.util.getTargetIndexReversed +import app.revanced.util.patch.BaseBytecodePatch +import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object OldStyleLibraryShelfPatch : BaseBytecodePatch( name = "Enable old style library shelf", description = "Adds an option to return the library tab to the old style.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object OldStyleLibraryShelfPatch : BytecodePatch( - setOf(BrowseIdFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(BrowseIdFingerprint) ) { override fun execute(context: BytecodeContext) { BrowseIdFingerprint.result?.let { it.mutableMethod.apply { - val targetIndex = getStringInstructionIndex("FEmusic_offline") - 5 + val stringIndex = getStringInstructionIndex("FEmusic_offline") + val targetIndex = getTargetIndexReversed(stringIndex, Opcode.IGET_OBJECT) val targetRegister = getInstruction(targetIndex).registerA addInstructions( targetIndex + 1, """ - invoke-static {v$targetRegister}, $GENERAL->enableOldStyleLibraryShelf(Ljava/lang/String;)Ljava/lang/String; + invoke-static {v$targetRegister}, $GENERAL_CLASS_DESCRIPTOR->enableOldStyleLibraryShelf(Ljava/lang/String;)Ljava/lang/String; move-result-object v$targetRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/music/general/oldstylelibraryshelf/fingerprints/BrowseIdFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/oldstylelibraryshelf/fingerprints/BrowseIdFingerprint.kt index 4562f739e..4fbc74a4e 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/oldstylelibraryshelf/fingerprints/BrowseIdFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/oldstylelibraryshelf/fingerprints/BrowseIdFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object BrowseIdFingerprint : LiteralValueFingerprint( +internal object BrowseIdFingerprint : LiteralValueFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/music/general/playlistcard/HidePlaylistCardPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/playlistcard/PlaylistCardPatch.kt similarity index 51% rename from src/main/kotlin/app/revanced/patches/music/general/playlistcard/HidePlaylistCardPatch.kt rename to src/main/kotlin/app/revanced/patches/music/general/playlistcard/PlaylistCardPatch.kt index 559d4cc9b..9852a6f05 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/playlistcard/HidePlaylistCardPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/playlistcard/PlaylistCardPatch.kt @@ -1,42 +1,28 @@ package app.revanced.patches.music.general.playlistcard -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object PlaylistCardPatch : BaseResourcePatch( name = "Hide playlist card", description = "Adds an option to hide the playlist card from the homepage.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object HidePlaylistCardPatch : BytecodePatch(emptySet()) { - override fun execute(context: BytecodeContext) { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/PlaylistCardFilter;" + + override fun execute(context: ResourceContext) { + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) SettingsPatch.addMusicPreference( CategoryType.GENERAL, @@ -44,10 +30,5 @@ object HidePlaylistCardPatch : BytecodePatch(emptySet()) { "false" ) - LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) - } - - private const val FILTER_CLASS_DESCRIPTOR = - "$COMPONENTS_PATH/PlaylistCardFilter;" } diff --git a/src/main/kotlin/app/revanced/patches/music/general/redirection/DislikeRedirectionPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/redirection/DislikeRedirectionPatch.kt index 50372a72a..7c7247d39 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/redirection/DislikeRedirectionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/redirection/DislikeRedirectionPatch.kt @@ -3,14 +3,12 @@ package app.revanced.patches.music.general.redirection import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.music.general.redirection.fingerprints.DislikeButtonOnClickListenerFingerprint import app.revanced.patches.music.utils.fingerprints.PendingIntentReceiverFingerprint -import app.revanced.patches.music.utils.integrations.Constants.GENERAL +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception @@ -19,37 +17,20 @@ import app.revanced.util.getTargetIndexReversed import app.revanced.util.getTargetIndexWithReference import app.revanced.util.getWalkerMethod import app.revanced.util.indexOfFirstInstruction +import app.revanced.util.patch.BaseBytecodePatch 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.MethodReference import com.android.tools.smali.dexlib2.iface.reference.Reference -@Patch( +@Suppress("unused") +object DislikeRedirectionPatch : BaseBytecodePatch( name = "Disable dislike redirection", description = "Adds an option to disable redirection to the next track when clicking dislike button.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object DislikeRedirectionPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( DislikeButtonOnClickListenerFingerprint, PendingIntentReceiverFingerprint ) @@ -105,7 +86,7 @@ object DislikeRedirectionPatch : BytecodePatch( addInstructionsWithLabels( targetIndex + 1, """ - invoke-static {}, $GENERAL->disableDislikeRedirection()Z + invoke-static {}, $GENERAL_CLASS_DESCRIPTOR->disableDislikeRedirection()Z move-result v$insertRegister if-nez v$insertRegister, :disable """, ExternalLabel("disable", getInstruction(onClickIndex + 1)) diff --git a/src/main/kotlin/app/revanced/patches/music/general/sampleshelf/HideSampleShelfPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/sampleshelf/SampleShelfPatch.kt similarity index 51% rename from src/main/kotlin/app/revanced/patches/music/general/sampleshelf/HideSampleShelfPatch.kt rename to src/main/kotlin/app/revanced/patches/music/general/sampleshelf/SampleShelfPatch.kt index 94b72101f..405276ff4 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/sampleshelf/HideSampleShelfPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/sampleshelf/SampleShelfPatch.kt @@ -1,42 +1,28 @@ package app.revanced.patches.music.general.sampleshelf -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object SampleShelfPatch : BaseResourcePatch( name = "Hide sample shelf", description = "Adds an option to hide the sample shelf from the homepage.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object HideSampleShelfPatch : BytecodePatch(emptySet()) { - override fun execute(context: BytecodeContext) { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/SampleShelfFilter;" + + override fun execute(context: ResourceContext) { + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) SettingsPatch.addMusicPreference( CategoryType.GENERAL, @@ -44,10 +30,5 @@ object HideSampleShelfPatch : BytecodePatch(emptySet()) { "false" ) - LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) - } - - private const val FILTER_CLASS_DESCRIPTOR = - "$COMPONENTS_PATH/SampleShelfFilter;" } diff --git a/src/main/kotlin/app/revanced/patches/music/general/startpage/ChangeStartPagePatch.kt b/src/main/kotlin/app/revanced/patches/music/general/startpage/ChangeStartPagePatch.kt index 4e6251e15..1ef9dec5b 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/startpage/ChangeStartPagePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/startpage/ChangeStartPagePatch.kt @@ -4,43 +4,24 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.general.startpage.fingerprints.ColdStartUpFingerprint -import app.revanced.patches.music.utils.integrations.Constants.GENERAL +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.music.utils.settings.SettingsPatch.contexts import app.revanced.util.copyXmlNode import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object ChangeStartPagePatch : BaseBytecodePatch( name = "Change start page", description = "Adds an option to set which page the app opens in instead of the homepage.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object ChangeStartPagePatch : BytecodePatch( - setOf(ColdStartUpFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(ColdStartUpFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -51,7 +32,7 @@ object ChangeStartPagePatch : BytecodePatch( addInstructions( targetIndex + 1, """ - invoke-static {v$targetRegister}, $GENERAL->changeStartPage(Ljava/lang/String;)Ljava/lang/String; + invoke-static {v$targetRegister}, $GENERAL_CLASS_DESCRIPTOR->changeStartPage(Ljava/lang/String;)Ljava/lang/String; move-result-object v$targetRegister return-object v$targetRegister """ diff --git a/src/main/kotlin/app/revanced/patches/music/general/startpage/fingerprints/ColdStartUpFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/startpage/fingerprints/ColdStartUpFingerprint.kt index f3648a208..cfd4a9179 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/startpage/fingerprints/ColdStartUpFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/startpage/fingerprints/ColdStartUpFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ColdStartUpFingerprint : MethodFingerprint( +internal object ColdStartUpFingerprint : MethodFingerprint( returnType = "Ljava/lang/String;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/general/taptoupdate/HideTapToUpdateButtonPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/taptoupdate/TapToUpdateButtonPatch.kt similarity index 64% rename from src/main/kotlin/app/revanced/patches/music/general/taptoupdate/HideTapToUpdateButtonPatch.kt rename to src/main/kotlin/app/revanced/patches/music/general/taptoupdate/TapToUpdateButtonPatch.kt index 05828d7d9..e6e48ada9 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/taptoupdate/HideTapToUpdateButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/taptoupdate/TapToUpdateButtonPatch.kt @@ -3,41 +3,22 @@ package app.revanced.patches.music.general.taptoupdate import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.music.general.taptoupdate.fingerprints.ContentPillInFingerprint -import app.revanced.patches.music.utils.integrations.Constants.GENERAL +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object TapToUpdateButtonPatch : BaseBytecodePatch( name = "Hide tap to update button", description = "Adds an option to hide the tap to update button.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object HideTapToUpdateButtonPatch : BytecodePatch( - setOf(ContentPillInFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(ContentPillInFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -46,7 +27,7 @@ object HideTapToUpdateButtonPatch : BytecodePatch( addInstructionsWithLabels( 0, """ - invoke-static {}, $GENERAL->hideTapToUpdateButton()Z + invoke-static {}, $GENERAL_CLASS_DESCRIPTOR->hideTapToUpdateButton()Z move-result v0 if-eqz v0, :show return-void diff --git a/src/main/kotlin/app/revanced/patches/music/general/taptoupdate/fingerprints/ContentPillInFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/taptoupdate/fingerprints/ContentPillInFingerprint.kt index aa6efcd66..60ada9ff5 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/taptoupdate/fingerprints/ContentPillInFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/taptoupdate/fingerprints/ContentPillInFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.general.taptoupdate.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object ContentPillInFingerprint : MethodFingerprint( +internal object ContentPillInFingerprint : MethodFingerprint( returnType = "V", strings = listOf("Content pill VE is null") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/general/tooltip/TooltipContentViewPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/tooltip/TooltipContentViewPatch.kt index 8952df9a8..29c60497b 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/tooltip/TooltipContentViewPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/tooltip/TooltipContentViewPatch.kt @@ -2,38 +2,19 @@ package app.revanced.patches.music.general.tooltip import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.general.tooltip.fingerprints.TooltipContentViewFingerprint +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object TooltipContentViewPatch : BaseBytecodePatch( name = "Hide tooltip content", description = "Hides the tooltip box that appears when opening the app for the first time.", - dependencies = [SharedResourceIdPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object TooltipContentViewPatch : BytecodePatch( - setOf(TooltipContentViewFingerprint) + dependencies = setOf(SharedResourceIdPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(TooltipContentViewFingerprint) ) { override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/music/general/tooltip/fingerprints/TooltipContentViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/general/tooltip/fingerprints/TooltipContentViewFingerprint.kt index 6caa17a2c..fe7ad9630 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/tooltip/fingerprints/TooltipContentViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/tooltip/fingerprints/TooltipContentViewFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.ToolTip import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object TooltipContentViewFingerprint : LiteralValueFingerprint( +internal object TooltipContentViewFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/music/general/voicesearch/VoiceSearchButtonPatch.kt b/src/main/kotlin/app/revanced/patches/music/general/voicesearch/VoiceSearchButtonPatch.kt index b83289a7c..c44934941 100644 --- a/src/main/kotlin/app/revanced/patches/music/general/voicesearch/VoiceSearchButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/general/voicesearch/VoiceSearchButtonPatch.kt @@ -1,33 +1,23 @@ package app.revanced.patches.music.general.voicesearch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.voicesearch.AbstractVoiceSearchButtonPatch +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.shared.voicesearch.VoiceSearchUtils.patchXml +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object VoiceSearchButtonPatch : BaseResourcePatch( name = "Hide voice search button", description = "Hides the voice search button in the search bar.", - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ], + compatiblePackages = COMPATIBLE_PACKAGE, use = false -) -@Suppress("unused") -object VoiceSearchButtonPatch : AbstractVoiceSearchButtonPatch( - arrayOf("search_toolbar_view.xml"), - arrayOf("height", "width") -) +) { + override fun execute(context: ResourceContext) { + + context.patchXml( + arrayOf("search_toolbar_view.xml"), + arrayOf("height", "width") + ) + + } +} diff --git a/src/main/kotlin/app/revanced/patches/music/layout/branding/icon/CustomBrandingIconPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/branding/icon/CustomBrandingIconPatch.kt index 6930ef47c..8e39b40d5 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/branding/icon/CustomBrandingIconPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/branding/icon/CustomBrandingIconPatch.kt @@ -2,38 +2,20 @@ package app.revanced.patches.music.layout.branding.icon import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.util.ResourceGroup import app.revanced.util.copyResources +import app.revanced.util.patch.BaseResourcePatch import java.io.File import java.nio.file.Files -@Patch( +@Suppress("DEPRECATION", "unused") +object CustomBrandingIconPatch : BaseResourcePatch( name = "Custom branding icon YouTube Music", description = "Changes the YouTube Music app icon to the icon specified in options.json.", - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object CustomBrandingIconPatch : ResourcePatch() { + compatiblePackages = COMPATIBLE_PACKAGE +) { private const val DEFAULT_ICON_KEY = "Revancify Blue" private val availableIcon = mapOf( diff --git a/src/main/kotlin/app/revanced/patches/music/layout/branding/name/CustomBrandingNamePatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/branding/name/CustomBrandingNamePatch.kt index 921d1a4a7..51f1559d3 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/branding/name/CustomBrandingNamePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/branding/name/CustomBrandingNamePatch.kt @@ -2,37 +2,17 @@ package app.revanced.patches.music.layout.branding.name import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.LANGUAGE_LIST -import app.revanced.patches.shared.elements.AbstractRemoveStringsElementsPatch +import app.revanced.patches.shared.elements.StringsElementsUtils.removeStringsElements +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("DEPRECATION", "unused") +object CustomBrandingNamePatch : BaseResourcePatch( name = "Custom branding name YouTube Music", description = "Renames the YouTube Music app to the name specified in options.json.", - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object CustomBrandingNamePatch : AbstractRemoveStringsElementsPatch( - LANGUAGE_LIST, - arrayOf("app_launcher_name", "app_name") + compatiblePackages = COMPATIBLE_PACKAGE ) { private const val APP_NAME_NOTIFICATION = "ReVanced Extended Music" private const val APP_NAME_LAUNCHER = "RVX Music" @@ -62,7 +42,11 @@ object CustomBrandingNamePatch : AbstractRemoveStringsElementsPatch( ) override fun execute(context: ResourceContext) { - super.execute(context) + + context.removeStringsElements( + LANGUAGE_LIST, + arrayOf("app_launcher_name", "app_name") + ) AppNameNotification?.let { notificationName -> AppNameLauncher?.let { launcherName -> diff --git a/src/main/kotlin/app/revanced/patches/music/layout/doubletapbackground/DoubleTapOverlayBackgroundPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/doubletapbackground/DoubleTapOverlayBackgroundPatch.kt index ef340ec23..4853c24e1 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/doubletapbackground/DoubleTapOverlayBackgroundPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/doubletapbackground/DoubleTapOverlayBackgroundPatch.kt @@ -1,33 +1,21 @@ package app.revanced.patches.music.layout.doubletapbackground -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.overlaybackground.AbstractOverlayBackgroundPatch +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.shared.overlaybackground.OverlayBackgroundUtils.removeOverlayBackground +import app.revanced.util.patch.BaseResourcePatch -@Patch( - name = "Hide double tap overlay filter", - description = "Removes the dark overlay when double-tapping to seek.", - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ], - use = false -) @Suppress("unused") -object DoubleTapOverlayBackgroundPatch : AbstractOverlayBackgroundPatch( - arrayOf("quick_seek_overlay.xml"), - arrayOf("tap_bloom_view", "dark_background") -) \ No newline at end of file +object DoubleTapOverlayBackgroundPatch : BaseResourcePatch( + name = "Hide double tap overlay filter", + description = "Hides the dark overlay when double-tapping to seek.", + compatiblePackages = COMPATIBLE_PACKAGE, + use = false +) { + override fun execute(context: ResourceContext) { + context.removeOverlayBackground( + arrayOf("quick_seek_overlay.xml"), + arrayOf("tap_bloom_view", "dark_background") + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/OverlayFilterBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/OverlayFilterBytecodePatch.kt index d1d785b71..96a462f9d 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/OverlayFilterBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/OverlayFilterBytecodePatch.kt @@ -6,7 +6,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.layout.overlayfilter.fingerprints.DesignBottomSheetDialogFingerprint -import app.revanced.patches.music.utils.integrations.Constants.GENERAL +import app.revanced.patches.music.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.integrations.IntegrationsPatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.util.exception @@ -33,7 +33,7 @@ object OverlayFilterBytecodePatch : BytecodePatch( insertIndex, """ invoke-virtual {p0}, $definingClass->getWindow()Landroid/view/Window; move-result-object v$freeRegister - invoke-static {v$freeRegister}, $GENERAL->disableDimBehind(Landroid/view/Window;)V + invoke-static {v$freeRegister}, $GENERAL_CLASS_DESCRIPTOR->disableDimBehind(Landroid/view/Window;)V """ ) } diff --git a/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/OverlayFilterPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/OverlayFilterPatch.kt index b3207ef6c..8ae2fc97b 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/OverlayFilterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/OverlayFilterPatch.kt @@ -1,36 +1,17 @@ package app.revanced.patches.music.layout.overlayfilter import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.util.patch.BaseResourcePatch -@Patch( - name = "Disable overlay filter", - description = "Removes the dark overlay when comment, share, save to playlist, and flyout panels are open.", - dependencies = [OverlayFilterBytecodePatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ], +@Suppress("DEPRECATION", "unused") +object OverlayFilterPatch : BaseResourcePatch( + name = "Hide overlay filter", + description = "Hides the dark overlay when comment, share, save to playlist, and flyout panels are open.", + dependencies = setOf(OverlayFilterBytecodePatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, use = false -) -@Suppress("unused") -object OverlayFilterPatch : ResourcePatch() { - +) { override fun execute(context: ResourceContext) { val styleFile = context["res/values/styles.xml"] diff --git a/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/fingerprints/DesignBottomSheetDialogFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/fingerprints/DesignBottomSheetDialogFingerprint.kt index e21595e80..ae4fc69e7 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/fingerprints/DesignBottomSheetDialogFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/overlayfilter/fingerprints/DesignBottomSheetDialogFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.DesignB import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object DesignBottomSheetDialogFingerprint : LiteralValueFingerprint( +internal object DesignBottomSheetDialogFingerprint : LiteralValueFingerprint( returnType = "V", parameters = emptyList(), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/layout/playeroverlay/PlayerOverlayFilterPatch.kt b/src/main/kotlin/app/revanced/patches/music/layout/playeroverlay/PlayerOverlayFilterPatch.kt index a881ef99f..c96ba5eb9 100644 --- a/src/main/kotlin/app/revanced/patches/music/layout/playeroverlay/PlayerOverlayFilterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/layout/playeroverlay/PlayerOverlayFilterPatch.kt @@ -1,33 +1,21 @@ -package app.revanced.patches.music.layout.doubletapbackground +package app.revanced.patches.music.layout.playeroverlay -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.overlaybackground.AbstractOverlayBackgroundPatch +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.shared.overlaybackground.OverlayBackgroundUtils.removeOverlayBackground +import app.revanced.util.patch.BaseResourcePatch -@Patch( - name = "Hide player overlay filter", - description = "Removes the dark overlay when single-tapping player.", - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ], - use = false -) @Suppress("unused") -object PlayerOverlayFilterPatch : AbstractOverlayBackgroundPatch( - arrayOf("music_controls_overlay.xml"), - arrayOf("player_control_screen") -) \ No newline at end of file +object PlayerOverlayFilterPatch : BaseResourcePatch( + name = "Hide player overlay filter", + description = "Hides the dark overlay when single-tapping player.", + compatiblePackages = COMPATIBLE_PACKAGE, + use = false +) { + override fun execute(context: ResourceContext) { + context.removeOverlayBackground( + arrayOf("music_controls_overlay.xml"), + arrayOf("player_control_screen") + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/misc/backgroundplay/BackgroundPlayPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/backgroundplay/BackgroundPlayPatch.kt index ca1d55649..4d41b60c9 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/backgroundplay/BackgroundPlayPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/backgroundplay/BackgroundPlayPatch.kt @@ -2,36 +2,17 @@ package app.revanced.patches.music.misc.backgroundplay import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.misc.backgroundplay.fingerprints.BackgroundPlaybackFingerprint +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object BackgroundPlayPatch : BaseBytecodePatch( name = "Background play", description = "Enables playing music in the background.", - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object BackgroundPlayPatch : BytecodePatch( - setOf(BackgroundPlaybackFingerprint) + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(BackgroundPlaybackFingerprint) ) { override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/music/misc/backgroundplay/fingerprints/BackgroundPlaybackFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/backgroundplay/fingerprints/BackgroundPlaybackFingerprint.kt index 3853bac45..a5ce37823 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/backgroundplay/fingerprints/BackgroundPlaybackFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/backgroundplay/fingerprints/BackgroundPlaybackFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object BackgroundPlaybackFingerprint : LiteralValueFingerprint( +internal object BackgroundPlaybackFingerprint : LiteralValueFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/music/misc/bitrate/BitrateDefaultValuePatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/bitrate/BitrateDefaultValuePatch.kt index 86f1e0579..202222f5f 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/bitrate/BitrateDefaultValuePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/bitrate/BitrateDefaultValuePatch.kt @@ -1,33 +1,15 @@ package app.revanced.patches.music.misc.bitrate import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("DEPRECATION", "unused") +object BitrateDefaultValuePatch : BaseResourcePatch( name = "Bitrate default value", description = "Sets the audio quality to \"Always High\" when you first install the app.", - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object BitrateDefaultValuePatch : ResourcePatch() { + compatiblePackages = COMPATIBLE_PACKAGE +) { override fun execute(context: ResourceContext) { context.xmlEditor[RESOURCE_FILE_PATH].use { editor -> editor.file.getElementsByTagName("com.google.android.apps.youtube.music.ui.preference.PreferenceCategoryCompat") diff --git a/src/main/kotlin/app/revanced/patches/music/misc/codecs/CodecsUnlockPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/codecs/CodecsUnlockPatch.kt deleted file mode 100644 index adcd82489..000000000 --- a/src/main/kotlin/app/revanced/patches/music/misc/codecs/CodecsUnlockPatch.kt +++ /dev/null @@ -1,47 +0,0 @@ -package app.revanced.patches.music.misc.codecs - -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.music.utils.integrations.Constants.MISC_PATH -import app.revanced.patches.music.utils.settings.CategoryType -import app.revanced.patches.music.utils.settings.SettingsPatch -import app.revanced.patches.shared.opus.AbstractOpusCodecsPatch - -@Patch( - name = "Enable opus codec", - description = "Adds an option use the opus audio codec instead of the mp4a audio codec.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object CodecsUnlockPatch : AbstractOpusCodecsPatch( - "$MISC_PATH/OpusCodecPatch;->enableOpusCodec()Z" -) { - override fun execute(context: BytecodeContext) { - super.execute(context) - - SettingsPatch.addMusicPreference( - CategoryType.MISC, - "revanced_enable_opus_codec", - "true" - ) - - } -} diff --git a/src/main/kotlin/app/revanced/patches/music/misc/codecs/ForceOpusCodecBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/codecs/ForceOpusCodecBytecodePatch.kt new file mode 100644 index 000000000..bdf2eda5e --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/misc/codecs/ForceOpusCodecBytecodePatch.kt @@ -0,0 +1,8 @@ +package app.revanced.patches.music.misc.codecs + +import app.revanced.patches.music.utils.integrations.Constants.MISC_PATH +import app.revanced.patches.shared.opus.BaseOpusCodecsPatch + +object ForceOpusCodecBytecodePatch : BaseOpusCodecsPatch( + "$MISC_PATH/OpusCodecPatch;->enableOpusCodec()Z" +) diff --git a/src/main/kotlin/app/revanced/patches/music/misc/codecs/ForceOpusCodecPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/codecs/ForceOpusCodecPatch.kt new file mode 100644 index 000000000..cf95865be --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/misc/codecs/ForceOpusCodecPatch.kt @@ -0,0 +1,29 @@ +package app.revanced.patches.music.misc.codecs + +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.settings.CategoryType +import app.revanced.patches.music.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch + + +@Suppress("unused") +object ForceOpusCodecPatch : BaseResourcePatch( + name = "Enable opus codec", + description = "Adds an option use the opus audio codec instead of the mp4a audio codec.", + dependencies = setOf( + ForceOpusCodecBytecodePatch::class, + SettingsPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + override fun execute(context: ResourceContext) { + + SettingsPatch.addMusicPreference( + CategoryType.MISC, + "revanced_enable_opus_codec", + "true" + ) + + } +} diff --git a/src/main/kotlin/app/revanced/patches/music/misc/debugging/DebuggingPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/debugging/DebuggingPatch.kt index fb378ccd8..88f2ef9a9 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/debugging/DebuggingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/debugging/DebuggingPatch.kt @@ -1,37 +1,19 @@ package app.revanced.patches.music.misc.debugging import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object DebuggingPatch : BaseResourcePatch( name = "Enable debug logging", description = "Adds an option to enable debug logging.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ], + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, use = false -) -@Suppress("unused") -object DebuggingPatch : ResourcePatch() { +) { override fun execute(context: ResourceContext) { SettingsPatch.addMusicPreference( diff --git a/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/ExclusiveAudioPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/ExclusiveAudioPatch.kt index c8aecf49c..5cc4d60c3 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/ExclusiveAudioPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/ExclusiveAudioPatch.kt @@ -4,44 +4,25 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.music.misc.exclusiveaudio.fingerprints.DataSavingSettingsFragmentFingerprint import app.revanced.patches.music.misc.exclusiveaudio.fingerprints.MusicBrowserServiceFingerprint import app.revanced.patches.music.misc.exclusiveaudio.fingerprints.PodCastConfigFingerprint +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.util.exception import app.revanced.util.getStringInstructionIndex +import app.revanced.util.getWalkerMethod +import app.revanced.util.patch.BaseBytecodePatch 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.instruction.ReferenceInstruction -@Patch( +@Suppress("unused") +object ExclusiveAudioPatch : BaseBytecodePatch( name = "Exclusive audio playback", description = "Unlocks the option to play music without video.", - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object ExclusiveAudioPatch : BytecodePatch( - setOf( + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( DataSavingSettingsFragmentFingerprint, MusicBrowserServiceFingerprint, PodCastConfigFingerprint @@ -64,19 +45,14 @@ object ExclusiveAudioPatch : BytecodePatch( if (!targetReference.toString().endsWith("()Z")) continue - with( - context - .toMethodWalker(it.method) - .nextMethod(index, true) - .getMethod() as MutableMethod - ) { - addInstructions( - 0, """ - const/4 v0, 0x1 - return v0 - """ - ) - } + val walkerMethod = getWalkerMethod(context, index) + + walkerMethod.addInstructions( + 0, """ + const/4 v0, 0x1 + return v0 + """ + ) break } } diff --git a/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/fingerprints/DataSavingSettingsFragmentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/fingerprints/DataSavingSettingsFragmentFingerprint.kt index c18012b87..ebfda5a57 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/fingerprints/DataSavingSettingsFragmentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/fingerprints/DataSavingSettingsFragmentFingerprint.kt @@ -2,9 +2,12 @@ package app.revanced.patches.music.misc.exclusiveaudio.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object DataSavingSettingsFragmentFingerprint : MethodFingerprint( +internal object DataSavingSettingsFragmentFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("Landroid/os/Bundle;", "Ljava/lang/String;"), strings = listOf("pref_key_dont_play_nma_video"), - customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/DataSavingSettingsFragment;") && methodDef.name == "onCreatePreferences" } + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("/DataSavingSettingsFragment;") + && methodDef.name == "onCreatePreferences" + } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/fingerprints/MusicBrowserServiceFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/fingerprints/MusicBrowserServiceFingerprint.kt index a0afdec37..fe39a360c 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/fingerprints/MusicBrowserServiceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/fingerprints/MusicBrowserServiceFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object MusicBrowserServiceFingerprint : MethodFingerprint( +internal object MusicBrowserServiceFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Ljava/lang/String;", "Landroid/os/Bundle;"), diff --git a/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/fingerprints/PodCastConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/fingerprints/PodCastConfigFingerprint.kt index 4ffdfac20..c4c75fa8f 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/fingerprints/PodCastConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/exclusiveaudio/fingerprints/PodCastConfigFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object PodCastConfigFingerprint : LiteralValueFingerprint( +internal object PodCastConfigFingerprint : LiteralValueFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/misc/minimizedplayback/MinimizedPlaybackPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/minimizedplayback/MinimizedPlaybackPatch.kt index 0a2bc8e39..c59142f1d 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/minimizedplayback/MinimizedPlaybackPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/minimizedplayback/MinimizedPlaybackPatch.kt @@ -2,36 +2,17 @@ package app.revanced.patches.music.misc.minimizedplayback import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.misc.minimizedplayback.fingerprints.MinimizedPlaybackManagerFingerprint +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object MinimizedPlaybackPatch : BaseBytecodePatch( name = "Enable minimized playback", description = "Enables playback in miniplayer for Kids music.", - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object MinimizedPlaybackPatch : BytecodePatch( - setOf(MinimizedPlaybackManagerFingerprint) + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(MinimizedPlaybackManagerFingerprint) ) { override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/music/misc/minimizedplayback/fingerprints/MinimizedPlaybackManagerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/minimizedplayback/fingerprints/MinimizedPlaybackManagerFingerprint.kt index e57fff8a4..9f2991f11 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/minimizedplayback/fingerprints/MinimizedPlaybackManagerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/minimizedplayback/fingerprints/MinimizedPlaybackManagerFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object MinimizedPlaybackManagerFingerprint : MethodFingerprint( +internal object MinimizedPlaybackManagerFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("I", "L", "Z"), diff --git a/src/main/kotlin/app/revanced/patches/music/misc/premium/GetPremiumPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/premium/GetPremiumPatch.kt new file mode 100644 index 000000000..e6564aaf6 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/misc/premium/GetPremiumPatch.kt @@ -0,0 +1,90 @@ +package app.revanced.patches.music.misc.premium + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patches.music.misc.premium.fingerprints.AccountMenuFooterFingerprint +import app.revanced.patches.music.misc.premium.fingerprints.HideGetPremiumFingerprint +import app.revanced.patches.music.misc.premium.fingerprints.MembershipSettingsFingerprint +import app.revanced.patches.music.misc.premium.fingerprints.MembershipSettingsParentFingerprint +import app.revanced.patches.music.navigation.component.NavigationBarComponentPatch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch +import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.PrivacyTosFooter +import app.revanced.util.exception +import app.revanced.util.getTargetIndex +import app.revanced.util.getTargetIndexWithReference +import app.revanced.util.getWalkerMethod +import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch +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.instruction.TwoRegisterInstruction + +@Suppress("unused") +object GetPremiumPatch : BaseBytecodePatch( + name = "Hide get premium", + description = "Hides the \"Get Music Premium\" label from the account menu and settings.", + dependencies = setOf( + NavigationBarComponentPatch::class, + SharedResourceIdPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( + AccountMenuFooterFingerprint, + HideGetPremiumFingerprint, + MembershipSettingsParentFingerprint + ) +) { + override fun execute(context: BytecodeContext) { + + // Hides get premium button at the bottom of the account switching menu + HideGetPremiumFingerprint.result?.let { + it.mutableMethod.apply { + val insertIndex = it.scanResult.patternScanResult!!.startIndex + val register = getInstruction(insertIndex).registerA + + addInstruction( + insertIndex + 1, + "const/4 v$register, 0x0" + ) + } + } ?: throw HideGetPremiumFingerprint.exception + + // Hides get premium button at the top of the account switching menu + AccountMenuFooterFingerprint.result?.let { + it.mutableMethod.apply { + val constIndex = getWideLiteralInstructionIndex(PrivacyTosFooter) + val walkerIndex = getTargetIndex(constIndex + 2, Opcode.INVOKE_VIRTUAL) + val viewIndex = getTargetIndex(constIndex, Opcode.IGET_OBJECT) + val viewReference = getInstruction(viewIndex).reference.toString() + + val walkerMethod = getWalkerMethod(context, walkerIndex) + walkerMethod.apply { + val insertIndex = getTargetIndexWithReference(viewReference) + val nullCheckIndex = getTargetIndex(insertIndex - 1, Opcode.IF_NEZ) + val nullCheckRegister = getInstruction(nullCheckIndex).registerA + + addInstruction( + nullCheckIndex, + "const/4 v$nullCheckRegister, 0x0" + ) + } + } + } ?: throw AccountMenuFooterFingerprint.exception + + // Hides premium membership menu in settings + MembershipSettingsParentFingerprint.result?.classDef?.let { classDef -> + MembershipSettingsFingerprint.resolve(context, classDef) + MembershipSettingsFingerprint.result?.mutableMethod?.addInstructions( + 0, """ + const/4 v0, 0x0 + return-object v0 + """ + ) ?: throw MembershipSettingsFingerprint.exception + } ?: throw MembershipSettingsParentFingerprint.exception + + } +} diff --git a/src/main/kotlin/app/revanced/patches/music/misc/premium/HideGetPremiumPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/premium/HideGetPremiumPatch.kt deleted file mode 100644 index 7137acb62..000000000 --- a/src/main/kotlin/app/revanced/patches/music/misc/premium/HideGetPremiumPatch.kt +++ /dev/null @@ -1,123 +0,0 @@ -package app.revanced.patches.music.misc.premium - -import app.revanced.patcher.data.BytecodeContext -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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.music.misc.premium.fingerprints.AccountMenuFooterFingerprint -import app.revanced.patches.music.misc.premium.fingerprints.HideGetPremiumFingerprint -import app.revanced.patches.music.misc.premium.fingerprints.MembershipSettingsFingerprint -import app.revanced.patches.music.misc.premium.fingerprints.MembershipSettingsParentFingerprint -import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch -import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.PrivacyTosFooter -import app.revanced.util.exception -import app.revanced.util.getWideLiteralInstructionIndex -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.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.reference.Reference - -@Patch( - name = "Hide get premium", - description = "Hides the \"Get Music Premium\" label from the account menu and settings.", - dependencies = [SharedResourceIdPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object HideGetPremiumPatch : BytecodePatch( - setOf( - AccountMenuFooterFingerprint, - HideGetPremiumFingerprint, - MembershipSettingsParentFingerprint - ) -) { - override fun execute(context: BytecodeContext) { - - HideGetPremiumFingerprint.result?.let { - it.mutableMethod.apply { - val insertIndex = it.scanResult.patternScanResult!!.startIndex - val register = getInstruction(insertIndex).registerA - - addInstruction( - insertIndex + 1, - "const/4 v$register, 0x0" - ) - } - } ?: throw HideGetPremiumFingerprint.exception - - - AccountMenuFooterFingerprint.result?.let { - it.mutableMethod.apply { - val targetIndex = getWideLiteralInstructionIndex(PrivacyTosFooter) + 4 - targetReference = getInstruction(targetIndex + 1).reference - - with( - context - .toMethodWalker(this) - .nextMethod(targetIndex, true) - .getMethod() as MutableMethod - ) { - this.implementation!!.instructions.apply { - for ((index, instruction) in withIndex()) { - if (instruction.opcode != Opcode.IGET_OBJECT) continue - - if (getInstruction(index).reference == targetReference) { - val targetRegister = - getInstruction(index + 2).registerA - - addInstruction( - index, - "const/16 v$targetRegister, 0x8" - ) - - break - } - } - } - } - } - } ?: throw AccountMenuFooterFingerprint.exception - - MembershipSettingsParentFingerprint.result?.let { parentResult -> - MembershipSettingsFingerprint.also { - it.resolve( - context, - parentResult.classDef - ) - }.result?.let { - it.mutableMethod.apply { - addInstructions( - 0, """ - const/4 v0, 0x0 - return-object v0 - """ - ) - } - } ?: throw MembershipSettingsFingerprint.exception - } ?: throw MembershipSettingsParentFingerprint.exception - - } - - private lateinit var targetReference: Reference -} diff --git a/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/AccountMenuFooterFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/AccountMenuFooterFingerprint.kt index eb80a26e4..18bb5b5de 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/AccountMenuFooterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/AccountMenuFooterFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object AccountMenuFooterFingerprint : LiteralValueFingerprint( +internal object AccountMenuFooterFingerprint : LiteralValueFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/HideGetPremiumFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/HideGetPremiumFingerprint.kt index 20009d4c9..c5c1c7dc7 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/HideGetPremiumFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/HideGetPremiumFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object HideGetPremiumFingerprint : MethodFingerprint( +internal object HideGetPremiumFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/MembershipSettingsFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/MembershipSettingsFingerprint.kt index 600467700..cc5a264f0 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/MembershipSettingsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/MembershipSettingsFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object MembershipSettingsFingerprint : MethodFingerprint( +internal object MembershipSettingsFingerprint : MethodFingerprint( returnType = "Ljava/lang/CharSequence;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList() diff --git a/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/MembershipSettingsParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/MembershipSettingsParentFingerprint.kt index 4c0957760..676ab6bb1 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/MembershipSettingsParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/premium/fingerprints/MembershipSettingsParentFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object MembershipSettingsParentFingerprint : MethodFingerprint( +internal object MembershipSettingsParentFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/misc/spoofappversion/SpoofAppVersionBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/spoofappversion/SpoofAppVersionBytecodePatch.kt new file mode 100644 index 000000000..c1f5f4726 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/misc/spoofappversion/SpoofAppVersionBytecodePatch.kt @@ -0,0 +1,8 @@ +package app.revanced.patches.music.misc.spoofappversion + +import app.revanced.patches.music.utils.integrations.Constants.MISC_PATH +import app.revanced.patches.shared.spoofappversion.BaseSpoofAppVersionPatch + +object SpoofAppVersionBytecodePatch : BaseSpoofAppVersionPatch( + "$MISC_PATH/SpoofAppVersionPatch;->getVersionOverride(Ljava/lang/String;)Ljava/lang/String;" +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/misc/spoofappversion/SpoofAppVersionPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/spoofappversion/SpoofAppVersionPatch.kt index de065450e..3bf38798a 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/spoofappversion/SpoofAppVersionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/spoofappversion/SpoofAppVersionPatch.kt @@ -1,49 +1,29 @@ package app.revanced.patches.music.misc.spoofappversion -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.music.utils.integrations.Constants.MISC_PATH +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch -import app.revanced.patches.music.utils.settings.SettingsPatch.contexts -import app.revanced.patches.shared.versionspoof.AbstractVersionSpoofPatch import app.revanced.util.copyXmlNode +import app.revanced.util.patch.BaseResourcePatch -@Patch( - name = "Spoof app version", - description = "Adds options to spoof the YouTube Music client version. " + - "This can remove the radio mode restriction in Canadian regions or disable real-time lyrics.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) @Suppress("unused") -object SpoofAppVersionPatch : AbstractVersionSpoofPatch( - "$MISC_PATH/SpoofAppVersionPatch;->getVersionOverride(Ljava/lang/String;)Ljava/lang/String;" +object SpoofAppVersionPatch : BaseResourcePatch( + name = "Spoof app version", + description = "Adds options to spoof the YouTube Music client version. " + + "This can remove the radio mode restriction in Canadian regions or disable real-time lyrics.", + dependencies = setOf( + SettingsPatch::class, + SpoofAppVersionBytecodePatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE ) { - override fun execute(context: BytecodeContext) { - super.execute(context) + override fun execute(context: ResourceContext) { /** * Copy arrays */ - contexts.copyXmlNode("music/spoofappversion/host", "values/arrays.xml", "resources") + context.copyXmlNode("music/spoofappversion/host", "values/arrays.xml", "resources") SettingsPatch.addMusicPreference( CategoryType.MISC, diff --git a/src/main/kotlin/app/revanced/patches/music/misc/tastebuilder/TasteBuilderPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/tastebuilder/TasteBuilderPatch.kt index 0de996340..43d84c4b5 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/tastebuilder/TasteBuilderPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/tastebuilder/TasteBuilderPatch.kt @@ -4,44 +4,25 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.misc.tastebuilder.fingerprints.TasteBuilderConstructorFingerprint import app.revanced.patches.music.misc.tastebuilder.fingerprints.TasteBuilderSyntheticFingerprint +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MusicTasteBuilderShelf import app.revanced.util.exception import app.revanced.util.getTargetIndex import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object TasteBuilderPatch : BaseBytecodePatch( name = "Hide taste builder", description = "Hides the \"Tell us which artists you like\" card from the homepage.", - dependencies = [SharedResourceIdPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object TasteBuilderPatch : BytecodePatch( - setOf(TasteBuilderConstructorFingerprint) + dependencies = setOf(SharedResourceIdPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(TasteBuilderConstructorFingerprint) ) { override fun execute(context: BytecodeContext) { TasteBuilderConstructorFingerprint.result?.let { parentResult -> diff --git a/src/main/kotlin/app/revanced/patches/music/misc/tastebuilder/fingerprints/TasteBuilderConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/tastebuilder/fingerprints/TasteBuilderConstructorFingerprint.kt index b17d3255c..622ffefbe 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/tastebuilder/fingerprints/TasteBuilderConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/tastebuilder/fingerprints/TasteBuilderConstructorFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MusicTa import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object TasteBuilderConstructorFingerprint : LiteralValueFingerprint( +internal object TasteBuilderConstructorFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, literalSupplier = { MusicTasteBuilderShelf } diff --git a/src/main/kotlin/app/revanced/patches/music/misc/tastebuilder/fingerprints/TasteBuilderSyntheticFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/tastebuilder/fingerprints/TasteBuilderSyntheticFingerprint.kt index 362106f19..6d0825a9e 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/tastebuilder/fingerprints/TasteBuilderSyntheticFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/tastebuilder/fingerprints/TasteBuilderSyntheticFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object TasteBuilderSyntheticFingerprint : MethodFingerprint( +internal object TasteBuilderSyntheticFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL or AccessFlags.SYNTHETIC, parameters = listOf("L", "Ljava/lang/Object;"), diff --git a/src/main/kotlin/app/revanced/patches/music/misc/tracking/SanitizeUrlQueryBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/tracking/SanitizeUrlQueryBytecodePatch.kt new file mode 100644 index 000000000..259af32ce --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/misc/tracking/SanitizeUrlQueryBytecodePatch.kt @@ -0,0 +1,15 @@ +package app.revanced.patches.music.misc.tracking + +import app.revanced.patches.music.misc.tracking.fingerprints.ShareLinkFormatterFingerprint +import app.revanced.patches.music.utils.integrations.Constants.MISC_PATH +import app.revanced.patches.shared.tracking.BaseSanitizeUrlQueryPatch +import app.revanced.patches.shared.tracking.fingerprints.CopyTextEndpointFingerprint + +object SanitizeUrlQueryBytecodePatch : BaseSanitizeUrlQueryPatch( + "$MISC_PATH/SanitizeUrlQueryPatch;", + listOf( + CopyTextEndpointFingerprint, + ShareLinkFormatterFingerprint + ), + null +) diff --git a/src/main/kotlin/app/revanced/patches/music/misc/tracking/SanitizeUrlQueryPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/tracking/SanitizeUrlQueryPatch.kt index a0bd820e6..fabff8534 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/tracking/SanitizeUrlQueryPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/tracking/SanitizeUrlQueryPatch.kt @@ -1,48 +1,22 @@ package app.revanced.patches.music.misc.tracking -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.music.misc.tracking.fingerprints.ShareLinkFormatterFingerprint -import app.revanced.patches.music.utils.integrations.Constants.MISC_PATH +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch -import app.revanced.patches.shared.tracking.AbstractSanitizeUrlQueryPatch -import app.revanced.patches.shared.tracking.fingerprints.CopyTextEndpointFingerprint +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object SanitizeUrlQueryPatch : BaseResourcePatch( name = "Sanitize sharing links", description = "Adds an option to remove tracking query parameters from URLs when sharing links.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object SanitizeUrlQueryPatch : AbstractSanitizeUrlQueryPatch( - "$MISC_PATH/SanitizeUrlQueryPatch;", - listOf( - CopyTextEndpointFingerprint, - ShareLinkFormatterFingerprint + dependencies = setOf( + SanitizeUrlQueryBytecodePatch::class, + SettingsPatch::class ), - null + compatiblePackages = COMPATIBLE_PACKAGE ) { - override fun execute(context: BytecodeContext) { - super.execute(context) + override fun execute(context: ResourceContext) { SettingsPatch.addMusicPreference( CategoryType.MISC, diff --git a/src/main/kotlin/app/revanced/patches/music/misc/tracking/fingerprints/ShareLinkFormatterFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/misc/tracking/fingerprints/ShareLinkFormatterFingerprint.kt index 3e47cc71d..151493d52 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/tracking/fingerprints/ShareLinkFormatterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/tracking/fingerprints/ShareLinkFormatterFingerprint.kt @@ -8,7 +8,7 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference /** * Sharing panel of YouTube Music */ -object ShareLinkFormatterFingerprint : MethodFingerprint( +internal object ShareLinkFormatterFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("L", "Ljava/util/Map;"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/misc/translations/TranslationsPatch.kt b/src/main/kotlin/app/revanced/patches/music/misc/translations/TranslationsPatch.kt index 1c14ee7d2..87284b44c 100644 --- a/src/main/kotlin/app/revanced/patches/music/misc/translations/TranslationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/misc/translations/TranslationsPatch.kt @@ -1,56 +1,45 @@ package app.revanced.patches.music.misc.translations -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.settings.SettingsPatch -import app.revanced.patches.shared.translations.AbstractTranslationsPatch +import app.revanced.patches.shared.translations.TranslationsUtils.copyXml +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object TranslationsPatch : BaseResourcePatch( name = "Translations", description = "Adds Crowdin translations for YouTube Music.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE +) { + override fun execute(context: ResourceContext) { + context.copyXml( + "music", + arrayOf( + "bg-rBG", + "bn", + "cs-rCZ", + "el-rGR", + "es-rES", + "fr-rFR", + "id-rID", + "in", + "it-rIT", + "ja-rJP", + "ko-rKR", + "nl-rNL", + "pl-rPL", + "pt-rBR", + "ro-rRO", + "ru-rRU", + "tr-rTR", + "uk-rUA", + "vi-rVN", + "zh-rCN", + "zh-rTW" + ) ) - ] -) -@Suppress("unused") -object TranslationsPatch : AbstractTranslationsPatch( - "music", - arrayOf( - "bg-rBG", - "bn", - "cs-rCZ", - "el-rGR", - "es-rES", - "fr-rFR", - "id-rID", - "in", - "it-rIT", - "ja-rJP", - "ko-rKR", - "nl-rNL", - "pl-rPL", - "pt-rBR", - "ro-rRO", - "ru-rRU", - "tr-rTR", - "uk-rUA", - "vi-rVN", - "zh-rCN", - "zh-rTW" - ) -) + + } +} diff --git a/src/main/kotlin/app/revanced/patches/music/navigation/black/BlackNavigationBarPatch.kt b/src/main/kotlin/app/revanced/patches/music/navigation/black/BlackNavigationBarPatch.kt index 0e4281a6f..8e2111c41 100644 --- a/src/main/kotlin/app/revanced/patches/music/navigation/black/BlackNavigationBarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/navigation/black/BlackNavigationBarPatch.kt @@ -3,45 +3,26 @@ package app.revanced.patches.music.navigation.black import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.navigation.black.fingerprints.TabLayoutFingerprint -import app.revanced.patches.music.utils.integrations.Constants.NAVIGATION +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.NAVIGATION_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object BlackNavigationBarPatch : BaseBytecodePatch( name = "Enable black navigation bar", description = "Adds an option to set the navigation bar color to black.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object BlackNavigationBarPatch : BytecodePatch( - setOf(TabLayoutFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(TabLayoutFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -52,7 +33,7 @@ object BlackNavigationBarPatch : BytecodePatch( addInstructions( targetIndex + 1, """ - invoke-static {}, $NAVIGATION->enableBlackNavigationBar()I + invoke-static {}, $NAVIGATION_CLASS_DESCRIPTOR->enableBlackNavigationBar()I move-result v$targetRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/music/navigation/black/fingerprints/TabLayoutFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/navigation/black/fingerprints/TabLayoutFingerprint.kt index 1af22909e..a526fbb8a 100644 --- a/src/main/kotlin/app/revanced/patches/music/navigation/black/fingerprints/TabLayoutFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/navigation/black/fingerprints/TabLayoutFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object TabLayoutFingerprint : LiteralValueFingerprint( +internal object TabLayoutFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/navigation/component/NavigationBarComponentPatch.kt b/src/main/kotlin/app/revanced/patches/music/navigation/component/NavigationBarComponentPatch.kt index 306fc7917..ef92a6fee 100644 --- a/src/main/kotlin/app/revanced/patches/music/navigation/component/NavigationBarComponentPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/navigation/component/NavigationBarComponentPatch.kt @@ -3,59 +3,45 @@ package app.revanced.patches.music.navigation.component import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.navigation.component.fingerprints.TabLayoutTextFingerprint -import app.revanced.patches.music.utils.integrations.Constants.NAVIGATION +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.NAVIGATION_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.getTargetIndex +import app.revanced.util.getTargetIndexWithMethodReferenceName import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch 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.instruction.formats.Instruction35c -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -@Patch( +@Suppress("DEPRECATION", "SpellCheckingInspection", "unused") +object NavigationBarComponentPatch : BaseBytecodePatch( name = "Hide navigation bar component", description = "Adds options to hide navigation bar components.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object NavigationBarComponentPatch : BytecodePatch( - setOf(TabLayoutTextFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(TabLayoutTextFingerprint) ) { + private const val FLAG = "android:layout_weight" + private const val RESOURCE_FILE_PATH = "res/layout/image_with_text_tab.xml" + override fun execute(context: BytecodeContext) { /** * Hide navigation labels */ TabLayoutTextFingerprint.result?.let { it.mutableMethod.apply { - val targetIndex = getWideLiteralInstructionIndex(SharedResourceIdPatch.Text1) + 3 + val constIndex = getWideLiteralInstructionIndex(SharedResourceIdPatch.Text1) + val targetIndex = getTargetIndex(constIndex, Opcode.CHECK_CAST) val targetParameter = getInstruction(targetIndex).reference val targetRegister = getInstruction(targetIndex).registerA @@ -64,7 +50,7 @@ object NavigationBarComponentPatch : BytecodePatch( addInstruction( targetIndex + 1, - "invoke-static {v$targetRegister}, $NAVIGATION->hideNavigationLabel(Landroid/widget/TextView;)V" + "invoke-static {v$targetRegister}, $NAVIGATION_CLASS_DESCRIPTOR->hideNavigationLabel(Landroid/widget/TextView;)V" ) } } ?: throw TabLayoutTextFingerprint.exception @@ -89,24 +75,19 @@ object NavigationBarComponentPatch : BytecodePatch( it.mutableMethod.apply { val enumIndex = it.scanResult.patternScanResult!!.startIndex + 3 val enumRegister = getInstruction(enumIndex).registerA + val insertEnumIndex = getTargetIndex(Opcode.AND_INT_LIT8) - 2 - val insertIndex = implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.AND_INT_LIT8 - } - 2 - - val pivotTabIndex = implementation!!.instructions.indexOfFirst { instruction -> - ((instruction as? ReferenceInstruction)?.reference as? MethodReference)?.name == "getVisibility" - } + val pivotTabIndex = getTargetIndexWithMethodReferenceName("getVisibility") val pivotTabRegister = getInstruction(pivotTabIndex).registerC addInstruction( pivotTabIndex, - "invoke-static {v$pivotTabRegister}, $NAVIGATION->hideNavigationButton(Landroid/view/View;)V" + "invoke-static {v$pivotTabRegister}, $NAVIGATION_CLASS_DESCRIPTOR->hideNavigationButton(Landroid/view/View;)V" ) addInstruction( - insertIndex, - "sput-object v$enumRegister, $NAVIGATION->lastPivotTab:Ljava/lang/Enum;" + insertEnumIndex, + "sput-object v$enumRegister, $NAVIGATION_CLASS_DESCRIPTOR->lastPivotTab:Ljava/lang/Enum;" ) } } ?: throw TabLayoutTextFingerprint.exception @@ -147,7 +128,4 @@ object NavigationBarComponentPatch : BytecodePatch( "true" ) } - - private const val FLAG = "android:layout_weight" - private const val RESOURCE_FILE_PATH = "res/layout/image_with_text_tab.xml" } diff --git a/src/main/kotlin/app/revanced/patches/music/navigation/component/fingerprints/TabLayoutTextFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/navigation/component/fingerprints/TabLayoutTextFingerprint.kt index 6d2eecf41..4bd367b02 100644 --- a/src/main/kotlin/app/revanced/patches/music/navigation/component/fingerprints/TabLayoutTextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/navigation/component/fingerprints/TabLayoutTextFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object TabLayoutTextFingerprint : LiteralValueFingerprint( +internal object TabLayoutTextFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/ColorMatchPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/ColorMatchPlayerPatch.kt index de56891ef..5da975855 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/ColorMatchPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/colormatchplayer/ColorMatchPlayerPatch.kt @@ -5,12 +5,10 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWith import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.extensions.or -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.utils.fingerprints.MiniPlayerConstructorFingerprint import app.revanced.patches.music.utils.fingerprints.SwitchToggleColorFingerprint -import app.revanced.patches.music.utils.integrations.Constants.PLAYER +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.ColorGrey import app.revanced.patches.music.utils.settings.CategoryType @@ -19,6 +17,7 @@ import app.revanced.util.exception import app.revanced.util.getTargetIndex import app.revanced.util.getTargetIndexReversed import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.MethodParameter @@ -26,34 +25,16 @@ 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.Reference -@Patch( +@Suppress("unused") +object ColorMatchPlayerPatch : BaseBytecodePatch( name = "Enable color match player", description = "Adds an option to match the color of the miniplayer to the fullscreen player.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object ColorMatchPlayerPatch : BytecodePatch( - setOf(MiniPlayerConstructorFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(MiniPlayerConstructorFingerprint) ) { private lateinit var invokeVirtualReference: Reference private lateinit var iGetReference: Reference @@ -98,7 +79,7 @@ object ColorMatchPlayerPatch : BytecodePatch( addInstructionsWithLabels( invokeDirectIndex + 1, """ - invoke-static {}, $PLAYER->enableColorMatchPlayer()Z + invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->enableColorMatchPlayer()Z move-result v$freeRegister if-eqz v$freeRegister, :off invoke-virtual {p1}, $invokeVirtualReference diff --git a/src/main/kotlin/app/revanced/patches/music/player/minimizedplayer/MinimizedPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/minimizedplayer/MinimizedPlayerPatch.kt index 23c98fe2e..07d644f37 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/minimizedplayer/MinimizedPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/minimizedplayer/MinimizedPlayerPatch.kt @@ -2,54 +2,35 @@ package app.revanced.patches.music.player.minimizedplayer import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patches.music.player.minimizedplayer.fingerprints.MinimizedPlayerFingerprint -import app.revanced.patches.music.utils.integrations.Constants.PLAYER +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object MinimizedPlayerPatch : BaseBytecodePatch( name = "Enable force minimized player", description = "Adds an option to keep the miniplayer minimized even when another track is played.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object MinimizedPlayerPatch : BytecodePatch( - setOf(MinimizedPlayerFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(MinimizedPlayerFingerprint) ) { override fun execute(context: BytecodeContext) { MinimizedPlayerFingerprint.result?.let { - with(it.mutableMethod) { - val index = it.scanResult.patternScanResult!!.endIndex - val register = - (implementation!!.instructions[index] as OneRegisterInstruction).registerA + it.mutableMethod.apply { + val insertIndex = it.scanResult.patternScanResult!!.endIndex + val insertRegister = getInstruction(insertIndex).registerA addInstructions( - index, """ - invoke-static {v$register}, $PLAYER->enableForceMinimizedPlayer(Z)Z - move-result v$register + insertIndex, """ + invoke-static {v$insertRegister}, $PLAYER_CLASS_DESCRIPTOR->enableForceMinimizedPlayer(Z)Z + move-result v$insertRegister """ ) } diff --git a/src/main/kotlin/app/revanced/patches/music/player/minimizedplayer/fingerprints/MinimizedPlayerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/minimizedplayer/fingerprints/MinimizedPlayerFingerprint.kt index 39d865eea..d342cc3ad 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/minimizedplayer/fingerprints/MinimizedPlayerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/minimizedplayer/fingerprints/MinimizedPlayerFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object MinimizedPlayerFingerprint : MethodFingerprint( +internal object MinimizedPlayerFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "L"), diff --git a/src/main/kotlin/app/revanced/patches/music/player/nextprevious/MiniPlayerButtonPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/nextprevious/MiniPlayerButtonPatch.kt index f1fa85dc8..6c940bc3b 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/nextprevious/MiniPlayerButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/nextprevious/MiniPlayerButtonPatch.kt @@ -6,10 +6,7 @@ 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.extensions.or -import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.music.player.nextprevious.fingerprints.MiniPlayerParentFingerprint @@ -18,7 +15,8 @@ import app.revanced.patches.music.player.nextprevious.fingerprints.NextButtonVis import app.revanced.patches.music.player.nextprevious.fingerprints.PlayerPatchConstructorFingerprint import app.revanced.patches.music.utils.fingerprints.MiniPlayerConstructorFingerprint import app.revanced.patches.music.utils.fingerprints.PendingIntentReceiverFingerprint -import app.revanced.patches.music.utils.integrations.Constants.PLAYER +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MiniPlayerPlayPauseReplayButton import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.TopEnd @@ -30,6 +28,7 @@ import app.revanced.util.getStringInstructionIndex import app.revanced.util.getTargetIndex import app.revanced.util.getTargetIndexReversed import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction @@ -38,35 +37,17 @@ 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.ImmutableField -@Patch( +@Suppress("unused") +object MiniPlayerButtonPatch : BaseBytecodePatch( name = "Enable next previous button", description = "Adds an options to show the next and previous buttons to the miniplayer.", - dependencies = [ + dependencies = setOf( MiniPlayerButtonResourcePatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object MiniPlayerButtonPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( MiniPlayerConstructorFingerprint, MiniPlayerParentFingerprint, MppWatchWhileLayoutFingerprint, @@ -124,7 +105,7 @@ object MiniPlayerButtonPatch : BytecodePatch( addInstructions( targetIndex + 1, """ - invoke-static {v$targetRegister}, $PLAYER->enableMiniPlayerNextButton(Z)Z + invoke-static {v$targetRegister}, $PLAYER_CLASS_DESCRIPTOR->enableMiniPlayerNextButton(Z)Z move-result v$targetRegister """ ) @@ -170,7 +151,7 @@ object MiniPlayerButtonPatch : BytecodePatch( const v$miniPlayerPlayPauseReplayButtonRegister, $viewId invoke-virtual {v$parentViewRegister, v$miniPlayerPlayPauseReplayButtonRegister}, Landroid/view/View;->findViewById(I)Landroid/view/View; move-result-object v$miniPlayerPlayPauseReplayButtonRegister - invoke-static {v$miniPlayerPlayPauseReplayButtonRegister}, $PLAYER->$methodName(Landroid/view/View;)V + invoke-static {v$miniPlayerPlayPauseReplayButtonRegister}, $PLAYER_CLASS_DESCRIPTOR->$methodName(Landroid/view/View;)V """ ) } @@ -189,7 +170,7 @@ object MiniPlayerButtonPatch : BytecodePatch( const v$constRegister, $viewId invoke-virtual {v$findViewByIdRegister, v$constRegister}, $definingClass->findViewById(I)Landroid/view/View; move-result-object v$constRegister - sput-object v$constRegister, $PLAYER->$fieldName:Landroid/view/View; + sput-object v$constRegister, $PLAYER_CLASS_DESCRIPTOR->$fieldName:Landroid/view/View; """ ) } @@ -201,7 +182,7 @@ object MiniPlayerButtonPatch : BytecodePatch( addInstructions( invokeStaticIndex, """ - invoke-static {v$viewArrayRegister}, $PLAYER->getViewArray([Landroid/view/View;)[Landroid/view/View; + invoke-static {v$viewArrayRegister}, $PLAYER_CLASS_DESCRIPTOR->getViewArray([Landroid/view/View;)[Landroid/view/View; move-result-object v$viewArrayRegister """ ) @@ -225,7 +206,7 @@ object MiniPlayerButtonPatch : BytecodePatch( ?.apply { addInstruction( implementation!!.instructions.size - 1, - "sput-object p0, $PLAYER->$fieldName:$onClickReferenceDefiningClass" + "sput-object p0, $PLAYER_CLASS_DESCRIPTOR->$fieldName:$onClickReferenceDefiningClass" ) } ?: throw PatchException("onClickClass not found!") @@ -246,7 +227,7 @@ object MiniPlayerButtonPatch : BytecodePatch( ) addInstructionsWithLabels( 0, """ - sget-object v0, $PLAYER->$fieldName:$onClickReferenceDefiningClass + sget-object v0, $PLAYER_CLASS_DESCRIPTOR->$fieldName:$onClickReferenceDefiningClass if-eqz v0, :ignore invoke-virtual {v0}, $onClickReference :ignore diff --git a/src/main/kotlin/app/revanced/patches/music/player/nextprevious/MiniPlayerButtonResourcePatch.kt b/src/main/kotlin/app/revanced/patches/music/player/nextprevious/MiniPlayerButtonResourcePatch.kt index 032dc821e..2683fc44d 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/nextprevious/MiniPlayerButtonResourcePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/nextprevious/MiniPlayerButtonResourcePatch.kt @@ -1,3 +1,5 @@ +@file:Suppress("DEPRECATION") + package app.revanced.patches.music.player.nextprevious import app.revanced.patcher.data.ResourceContext diff --git a/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/MiniPlayerParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/MiniPlayerParentFingerprint.kt index 31e081085..b9c153727 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/MiniPlayerParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/MiniPlayerParentFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MiniPla import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object MiniPlayerParentFingerprint : LiteralValueFingerprint( +internal object MiniPlayerParentFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/MppWatchWhileLayoutFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/MppWatchWhileLayoutFingerprint.kt index 320d59ad8..cc28303f1 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/MppWatchWhileLayoutFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/MppWatchWhileLayoutFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MiniPla import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.Opcode -object MppWatchWhileLayoutFingerprint : MethodFingerprint( +internal object MppWatchWhileLayoutFingerprint : MethodFingerprint( returnType = "V", opcodes = listOf(Opcode.NEW_ARRAY), customFingerprint = { methodDef, _ -> diff --git a/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/NextButtonVisibilityFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/NextButtonVisibilityFingerprint.kt index c729d391d..adeb0719e 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/NextButtonVisibilityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/NextButtonVisibilityFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object NextButtonVisibilityFingerprint : MethodFingerprint( +internal object NextButtonVisibilityFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/PlayerPatchConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/PlayerPatchConstructorFingerprint.kt index 798b0c8f7..8a69e02cc 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/PlayerPatchConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/nextprevious/fingerprints/PlayerPatchConstructorFingerprint.kt @@ -1,12 +1,12 @@ package app.revanced.patches.music.player.nextprevious.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -import app.revanced.patches.music.utils.integrations.Constants.PLAYER +import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR -object PlayerPatchConstructorFingerprint : MethodFingerprint( +internal object PlayerPatchConstructorFingerprint : MethodFingerprint( returnType = "V", customFingerprint = { methodDef, _ -> - methodDef.definingClass == PLAYER + methodDef.definingClass == PLAYER_CLASS_DESCRIPTOR && methodDef.name == "" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/player/oldplayerbackground/OldPlayerBackgroundPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/oldplayerbackground/OldPlayerBackgroundPatch.kt index 5257f2f0d..edf535fb7 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/oldplayerbackground/OldPlayerBackgroundPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/oldplayerbackground/OldPlayerBackgroundPatch.kt @@ -1,64 +1,30 @@ package app.revanced.patches.music.player.oldplayerbackground import app.revanced.patcher.data.BytecodeContext -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.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.player.oldplayerbackground.fingerprints.OldPlayerBackgroundFingerprint -import app.revanced.patches.music.utils.integrations.Constants.PLAYER +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch -import app.revanced.util.getTargetIndex -import app.revanced.util.getWideLiteralInstructionIndex -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import app.revanced.util.literalInstructionBooleanHook +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object OldPlayerBackgroundPatch : BaseBytecodePatch( name = "Enable old player background", description = "Adds an option to return the player background to the old style. Deprecated on YT Music 6.34.51+.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ], + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(OldPlayerBackgroundFingerprint), use = false -) -@Suppress("unused") -object OldPlayerBackgroundPatch : BytecodePatch( - setOf(OldPlayerBackgroundFingerprint) ) { override fun execute(context: BytecodeContext) { - OldPlayerBackgroundFingerprint.result?.let { - it.mutableMethod.apply { - val startIndex = getWideLiteralInstructionIndex(45415319) - val targetIndex = getTargetIndex(startIndex, Opcode.MOVE_RESULT) - val targetRegister = getInstruction(targetIndex).registerA - - addInstructions( - targetIndex + 1, """ - invoke-static {v$targetRegister}, $PLAYER->enableOldPlayerBackground(Z)Z - move-result v$targetRegister - """ - ) - } - } ?: throw PatchException("This version is not supported. Please use YT Music 6.33.52 or earlier.") + OldPlayerBackgroundFingerprint.literalInstructionBooleanHook( + 45415319, + "$PLAYER_CLASS_DESCRIPTOR->enableOldPlayerBackground(Z)Z", + "Please use YT Music 6.33.52 or earlier." + ) SettingsPatch.addMusicPreference( CategoryType.PLAYER, diff --git a/src/main/kotlin/app/revanced/patches/music/player/oldplayerbackground/fingerprints/OldPlayerBackgroundFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/oldplayerbackground/fingerprints/OldPlayerBackgroundFingerprint.kt index 47b0d9b07..1ef690dc9 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/oldplayerbackground/fingerprints/OldPlayerBackgroundFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/oldplayerbackground/fingerprints/OldPlayerBackgroundFingerprint.kt @@ -2,7 +2,10 @@ package app.revanced.patches.music.player.oldplayerbackground.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint -object OldPlayerBackgroundFingerprint : LiteralValueFingerprint( +/** + * Deprecated in YouTube Music v6.34.51+ + */ +internal object OldPlayerBackgroundFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), literalSupplier = { 45415319 } diff --git a/src/main/kotlin/app/revanced/patches/music/player/oldplayerlayout/OldPlayerLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/oldplayerlayout/OldPlayerLayoutPatch.kt index 420f21ebf..5d5a5c5db 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/oldplayerlayout/OldPlayerLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/oldplayerlayout/OldPlayerLayoutPatch.kt @@ -1,64 +1,30 @@ package app.revanced.patches.music.player.oldplayerlayout import app.revanced.patcher.data.BytecodeContext -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.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.player.oldplayerlayout.fingerprints.OldPlayerLayoutFingerprint -import app.revanced.patches.music.utils.integrations.Constants.PLAYER +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch -import app.revanced.util.getTargetIndex -import app.revanced.util.getWideLiteralInstructionIndex -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import app.revanced.util.literalInstructionBooleanHook +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object OldPlayerLayoutPatch : BaseBytecodePatch( name = "Enable old player layout", description = "Adds an option to return the player layout to the old style. Deprecated on YT Music 6.31.55+.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ], + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(OldPlayerLayoutFingerprint), use = false -) -@Suppress("unused") -object OldPlayerLayoutPatch : BytecodePatch( - setOf(OldPlayerLayoutFingerprint) ) { override fun execute(context: BytecodeContext) { - OldPlayerLayoutFingerprint.result?.let { - it.mutableMethod.apply { - val startIndex = getWideLiteralInstructionIndex(45399578) - val targetIndex = getTargetIndex(startIndex, Opcode.MOVE_RESULT) - val targetRegister = getInstruction(targetIndex).registerA - - addInstructions( - targetIndex + 1, """ - invoke-static {v$targetRegister}, $PLAYER->enableOldPlayerLayout(Z)Z - move-result v$targetRegister - """ - ) - } - } ?: throw PatchException("This version is not supported. Please use YT Music 6.29.58 or earlier.") + OldPlayerLayoutFingerprint.literalInstructionBooleanHook( + 45399578, + "$PLAYER_CLASS_DESCRIPTOR->enableOldPlayerLayout(Z)Z", + "Please use YT Music 6.29.58 or earlier." + ) SettingsPatch.addMusicPreference( CategoryType.PLAYER, diff --git a/src/main/kotlin/app/revanced/patches/music/player/oldplayerlayout/fingerprints/OldPlayerLayoutFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/oldplayerlayout/fingerprints/OldPlayerLayoutFingerprint.kt index 62fd614e4..5b632fa31 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/oldplayerlayout/fingerprints/OldPlayerLayoutFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/oldplayerlayout/fingerprints/OldPlayerLayoutFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint /** * Deprecated in YouTube Music v6.31.55+ */ -object OldPlayerLayoutFingerprint : LiteralValueFingerprint( +internal object OldPlayerLayoutFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), literalSupplier = { 45399578 } diff --git a/src/main/kotlin/app/revanced/patches/music/player/repeat/RememberRepeatPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/repeat/RememberRepeatPatch.kt index 92b3b1357..023f7008f 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/repeat/RememberRepeatPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/repeat/RememberRepeatPatch.kt @@ -3,41 +3,22 @@ package app.revanced.patches.music.player.repeat import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.player.repeat.fingerprints.RepeatTrackFingerprint -import app.revanced.patches.music.utils.integrations.Constants.PLAYER +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object RememberRepeatPatch : BaseBytecodePatch( name = "Remember repeat state", description = "Adds an option to remember the state of the repeat toggle.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object RememberRepeatPatch : BytecodePatch( - setOf(RepeatTrackFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(RepeatTrackFingerprint) ) { override fun execute(context: BytecodeContext) { RepeatTrackFingerprint.result?.let { @@ -47,7 +28,7 @@ object RememberRepeatPatch : BytecodePatch( addInstructions( targetIndex, """ - invoke-static {v$targetRegister}, $PLAYER->rememberRepeatState(Z)Z + invoke-static {v$targetRegister}, $PLAYER_CLASS_DESCRIPTOR->rememberRepeatState(Z)Z move-result v$targetRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/music/player/repeat/fingerprints/RepeatTrackFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/repeat/fingerprints/RepeatTrackFingerprint.kt index 1a38f8cbf..355ebbe05 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/repeat/fingerprints/RepeatTrackFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/repeat/fingerprints/RepeatTrackFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object RepeatTrackFingerprint : MethodFingerprint( +internal object RepeatTrackFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "L"), diff --git a/src/main/kotlin/app/revanced/patches/music/player/replace/ReplaceCastButtonPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/replace/ReplaceCastButtonPatch.kt index ada18a422..b49987085 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/replace/ReplaceCastButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/replace/ReplaceCastButtonPatch.kt @@ -4,11 +4,9 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.player.replace.fingerprints.CastButtonContainerFingerprint -import app.revanced.patches.music.utils.integrations.Constants.PLAYER +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.integrations.Constants.UTILS_PATH import app.revanced.patches.music.utils.mainactivity.MainActivityResolvePatch import app.revanced.patches.music.utils.mainactivity.MainActivityResolvePatch.mainActivityClassDef @@ -23,6 +21,7 @@ import app.revanced.util.ResourceGroup import app.revanced.util.copyResources import app.revanced.util.exception import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch 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 @@ -30,37 +29,20 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c import com.android.tools.smali.dexlib2.iface.reference.MethodReference -@Patch( +@Suppress("unused") +object ReplaceCastButtonPatch : BaseBytecodePatch( name = "Replace cast button", description = "Adds an option to replace the cast button in the player with the \"Open music\" button.", - dependencies = [ + dependencies = setOf( MainActivityResolvePatch::class, PlayerResponsePatch::class, SettingsPatch::class, SharedResourceIdPatch::class, VideoTypeHookPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ], + ), + compatiblePackages = COMPATIBLE_PACKAGE, use = false -) -@Suppress("unused") -object ReplaceCastButtonPatch : BytecodePatch(emptySet()) { +) { override fun execute(context: BytecodeContext) { CastButtonContainerFingerprint.resolve(context, mainActivityClassDef) @@ -87,7 +69,7 @@ object ReplaceCastButtonPatch : BytecodePatch(emptySet()) { addInstruction( index + 1, "invoke-static {v$freeRegister, v${viewGroupInstruction.registerC}, v${viewGroupInstruction.registerD}}, " + - PLAYER + + PLAYER_CLASS_DESCRIPTOR + "->" + "replaceCastButton(Landroid/app/Activity;Landroid/view/ViewGroup;Landroid/view/View;)V" ) diff --git a/src/main/kotlin/app/revanced/patches/music/player/replace/fingerprints/CastButtonContainerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/replace/fingerprints/CastButtonContainerFingerprint.kt index 0daf1d097..8a40da7da 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/replace/fingerprints/CastButtonContainerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/replace/fingerprints/CastButtonContainerFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.player.replace.fingerprints import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.PlayerCastMediaRouteButton import app.revanced.util.fingerprint.LiteralValueFingerprint -object CastButtonContainerFingerprint : LiteralValueFingerprint( +internal object CastButtonContainerFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { PlayerCastMediaRouteButton } ) diff --git a/src/main/kotlin/app/revanced/patches/music/player/share/ShareButtonPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/share/ShareButtonPatch.kt index ca86569f7..80df0e887 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/share/ShareButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/share/ShareButtonPatch.kt @@ -3,45 +3,26 @@ package app.revanced.patches.music.player.share import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.player.share.fingerprints.RemixGenericButtonFingerprint -import app.revanced.patches.music.utils.integrations.Constants.PLAYER +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object ShareButtonPatch : BaseBytecodePatch( name = "Hide fullscreen share button", description = "Adds an option to hide the share button in the fullscreen player.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object ShareButtonPatch : BytecodePatch( - setOf(RemixGenericButtonFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(RemixGenericButtonFingerprint) ) { override fun execute(context: BytecodeContext) { RemixGenericButtonFingerprint.result?.let { @@ -51,7 +32,7 @@ object ShareButtonPatch : BytecodePatch( addInstructions( targetIndex + 1, """ - invoke-static {v$targetRegister}, $PLAYER->hideFullscreenShareButton(I)I + invoke-static {v$targetRegister}, $PLAYER_CLASS_DESCRIPTOR->hideFullscreenShareButton(I)I move-result v$targetRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/music/player/share/fingerprints/RemixGenericButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/share/fingerprints/RemixGenericButtonFingerprint.kt index 6d8db73d8..ef0af7e5d 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/share/fingerprints/RemixGenericButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/share/fingerprints/RemixGenericButtonFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object RemixGenericButtonFingerprint : LiteralValueFingerprint( +internal object RemixGenericButtonFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/player/shuffle/RememberShufflePatch.kt b/src/main/kotlin/app/revanced/patches/music/player/shuffle/RememberShufflePatch.kt index 4cf44547f..055fecc9b 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/shuffle/RememberShufflePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/shuffle/RememberShufflePatch.kt @@ -6,18 +6,17 @@ 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.extensions.or -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.music.player.shuffle.fingerprints.MusicPlaybackControlsFingerprint import app.revanced.patches.music.player.shuffle.fingerprints.ShuffleClassReferenceFingerprint -import app.revanced.patches.music.utils.integrations.Constants.PLAYER +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import app.revanced.util.transformFields import app.revanced.util.traverseClassHierarchy import com.android.tools.smali.dexlib2.AccessFlags @@ -29,35 +28,24 @@ import com.android.tools.smali.dexlib2.immutable.ImmutableField import com.android.tools.smali.dexlib2.immutable.ImmutableMethod import com.android.tools.smali.dexlib2.util.MethodUtil -@Patch( +@Suppress("unused") +object RememberShufflePatch : BaseBytecodePatch( name = "Remember shuffle state", description = "Adds an option to remember the state of the shuffle toggle.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object RememberShufflePatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( MusicPlaybackControlsFingerprint, ShuffleClassReferenceFingerprint ) ) { + private const val PLAYBACK_CONTROLS_CLASS_DESCRIPTOR = + "Lcom/google/android/apps/youtube/music/watchpage/MusicPlaybackControls;" + + private lateinit var objectClass: String + private lateinit var imageViewReference: Reference + private lateinit var shuffleStateLabel: String + override fun execute(context: BytecodeContext) { ShuffleClassReferenceFingerprint.result?.let { @@ -68,7 +56,7 @@ object RememberShufflePatch : BytecodePatch( ((instruction as? ReferenceInstruction)?.reference as? FieldReference)?.type == "Landroid/widget/ImageView;" } - SHUFFLE_CLASS = it.classDef.type + objectClass = it.classDef.type val shuffleReference1 = descriptor(startIndex) val shuffleReference2 = descriptor(startIndex + 1) @@ -94,7 +82,7 @@ object RememberShufflePatch : BytecodePatch( constructorMethod.apply { addInstruction( implementation!!.instructions.size - 1, - "sput-object p0, $PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$SHUFFLE_CLASS" + "sput-object p0, $PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$objectClass" ) } @@ -103,7 +91,7 @@ object RememberShufflePatch : BytecodePatch( 0, """ move-object v0, p0 """ + shuffleStateLabel + """ - invoke-static {v1}, $PLAYER->setShuffleState(I)V + invoke-static {v1}, $PLAYER_CLASS_DESCRIPTOR->setShuffleState(I)V """ ) } @@ -134,7 +122,7 @@ object RememberShufflePatch : BytecodePatch( val shuffleField = ImmutableField( definingClass, "shuffleClass", - SHUFFLE_CLASS, + objectClass, AccessFlags.PUBLIC or AccessFlags.STATIC, null, annotations, @@ -153,10 +141,10 @@ object RememberShufflePatch : BytecodePatch( shuffleMethod.addInstructionsWithLabels( 0, """ - invoke-static {}, $PLAYER->getShuffleState()I + invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->getShuffleState()I move-result v2 if-nez v2, :dont_shuffle - sget-object v0, $PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$SHUFFLE_CLASS + sget-object v0, $PLAYBACK_CONTROLS_CLASS_DESCRIPTOR->shuffleClass:$objectClass """ + shuffleStateLabel + """ iget-object v3, v0, $imageViewReference invoke-virtual {v3}, Landroid/widget/ImageView;->performClick()Z @@ -180,13 +168,6 @@ object RememberShufflePatch : BytecodePatch( } - private const val PLAYBACK_CONTROLS_CLASS_DESCRIPTOR = - "Lcom/google/android/apps/youtube/music/watchpage/MusicPlaybackControls;" - - private lateinit var SHUFFLE_CLASS: String - private lateinit var imageViewReference: Reference - private lateinit var shuffleStateLabel: String - private fun MutableMethod.descriptor(index: Int): Reference { return getInstruction(index).reference } diff --git a/src/main/kotlin/app/revanced/patches/music/player/shuffle/fingerprints/MusicPlaybackControlsFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/shuffle/fingerprints/MusicPlaybackControlsFingerprint.kt index 93cb048bc..2b6e559c5 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/shuffle/fingerprints/MusicPlaybackControlsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/shuffle/fingerprints/MusicPlaybackControlsFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object MusicPlaybackControlsFingerprint : MethodFingerprint( +internal object MusicPlaybackControlsFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Z"), @@ -14,5 +14,7 @@ object MusicPlaybackControlsFingerprint : MethodFingerprint( Opcode.INVOKE_VIRTUAL, Opcode.RETURN_VOID ), - customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/MusicPlaybackControls;") } + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("/MusicPlaybackControls;") + } ) diff --git a/src/main/kotlin/app/revanced/patches/music/player/shuffle/fingerprints/ShuffleClassReferenceFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/shuffle/fingerprints/ShuffleClassReferenceFingerprint.kt index 8776c6d91..4f91c86a2 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/shuffle/fingerprints/ShuffleClassReferenceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/shuffle/fingerprints/ShuffleClassReferenceFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ShuffleClassReferenceFingerprint : MethodFingerprint( +internal object ShuffleClassReferenceFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/SwipeToDismissMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/SwipeToDismissMiniPlayerPatch.kt index 16c3a757e..bda49451d 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/SwipeToDismissMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/SwipeToDismissMiniPlayerPatch.kt @@ -4,10 +4,7 @@ import app.revanced.patcher.data.BytecodeContext 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.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.music.player.swipetodismiss.fingerprints.HandleSearchRenderedFingerprint @@ -17,7 +14,8 @@ import app.revanced.patches.music.player.swipetodismiss.fingerprints.MiniPlayerD import app.revanced.patches.music.player.swipetodismiss.fingerprints.MiniPlayerDefaultViewVisibilityFingerprint import app.revanced.patches.music.player.swipetodismiss.fingerprints.MusicActivityWidgetFingerprint import app.revanced.patches.music.player.swipetodismiss.fingerprints.SwipeToCloseFingerprint -import app.revanced.patches.music.utils.integrations.Constants.PLAYER +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch @@ -28,6 +26,7 @@ import app.revanced.util.getTargetIndex import app.revanced.util.getTargetIndexReversed import app.revanced.util.getTargetIndexWithFieldReferenceType import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch 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 @@ -37,34 +36,16 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference import com.android.tools.smali.dexlib2.iface.reference.Reference import kotlin.properties.Delegates -@Patch( +@Suppress("unused") +object SwipeToDismissMiniPlayerPatch : BaseBytecodePatch( name = "Enable swipe to dismiss miniplayer", description = "Adds an option to swipe down to dismiss the miniplayer.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object SwipeToDismissMiniPlayerPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( HandleSearchRenderedFingerprint, InteractionLoggingEnumFingerprint, MiniPlayerDefaultTextFingerprint, @@ -93,7 +74,7 @@ object SwipeToDismissMiniPlayerPatch : BytecodePatch( addInstructions( insertIndex, """ - invoke-static {v$targetRegister}, $PLAYER->enableSwipeToDismissMiniPlayer(Z)Z + invoke-static {v$targetRegister}, $PLAYER_CLASS_DESCRIPTOR->enableSwipeToDismissMiniPlayer(Z)Z move-result v$targetRegister """ ) @@ -145,7 +126,7 @@ object SwipeToDismissMiniPlayerPatch : BytecodePatch( addInstructionsWithLabels( insertIndex, """ - invoke-static {}, $PLAYER->enableSwipeToDismissMiniPlayer()Z + invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->enableSwipeToDismissMiniPlayer()Z move-result v$freeRegister if-nez v$freeRegister, :dismiss iget-object v$primaryRegister, v$primaryRegister, $iGetObjectReference @@ -178,7 +159,7 @@ object SwipeToDismissMiniPlayerPatch : BytecodePatch( addInstructions( insertIndex, """ - invoke-static {v$insertRegister}, $PLAYER->enableSwipeToDismissMiniPlayer(Ljava/lang/Object;)Ljava/lang/Object; + invoke-static {v$insertRegister}, $PLAYER_CLASS_DESCRIPTOR->enableSwipeToDismissMiniPlayer(Ljava/lang/Object;)Ljava/lang/Object; move-result-object v$insertRegister """ ) @@ -205,7 +186,7 @@ object SwipeToDismissMiniPlayerPatch : BytecodePatch( addInstructionsWithLabels( bottomSheetBehaviorIndex - 2, """ - invoke-static {}, $PLAYER->enableSwipeToDismissMiniPlayer()Z + invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->enableSwipeToDismissMiniPlayer()Z move-result v$freeRegister if-nez v$freeRegister, :dismiss """, ExternalLabel("dismiss", getInstruction(bottomSheetBehaviorIndex + 1)) diff --git a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/HandleSearchRenderedFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/HandleSearchRenderedFingerprint.kt index 94d5c535b..012f02ebc 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/HandleSearchRenderedFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/HandleSearchRenderedFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.player.swipetodismiss.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object HandleSearchRenderedFingerprint : MethodFingerprint( +internal object HandleSearchRenderedFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("L"), customFingerprint = { methodDef, _ -> methodDef.name == "handleSearchRendered" } diff --git a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/HandleSignInEventFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/HandleSignInEventFingerprint.kt index 03dc02e3d..58cf2c27c 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/HandleSignInEventFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/HandleSignInEventFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.player.swipetodismiss.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object HandleSignInEventFingerprint : MethodFingerprint( +internal object HandleSignInEventFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("L"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/InteractionLoggingEnumFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/InteractionLoggingEnumFingerprint.kt index 5cd05fe51..39afea39c 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/InteractionLoggingEnumFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/InteractionLoggingEnumFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.player.swipetodismiss.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object InteractionLoggingEnumFingerprint : MethodFingerprint( +internal object InteractionLoggingEnumFingerprint : MethodFingerprint( returnType = "V", strings = listOf("INTERACTION_LOGGING_GESTURE_TYPE_SWIPE") ) diff --git a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/MiniPlayerDefaultTextFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/MiniPlayerDefaultTextFingerprint.kt index 38c20031a..fe2db5faa 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/MiniPlayerDefaultTextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/MiniPlayerDefaultTextFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MiniPla import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object MiniPlayerDefaultTextFingerprint : LiteralValueFingerprint( +internal object MiniPlayerDefaultTextFingerprint : LiteralValueFingerprint( returnType = "V", parameters = listOf("Ljava/lang/Object;"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/MiniPlayerDefaultViewVisibilityFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/MiniPlayerDefaultViewVisibilityFingerprint.kt index 96a501d2e..200a20219 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/MiniPlayerDefaultViewVisibilityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/MiniPlayerDefaultViewVisibilityFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object MiniPlayerDefaultViewVisibilityFingerprint : MethodFingerprint( +internal object MiniPlayerDefaultViewVisibilityFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/View;", "F"), @@ -16,6 +16,7 @@ object MiniPlayerDefaultViewVisibilityFingerprint : MethodFingerprint( Opcode.INVOKE_VIRTUAL ), customFingerprint = { methodDef, classDef -> - methodDef.name == "a" && classDef.methods.count() == 3 + methodDef.name == "a" + && classDef.methods.count() == 3 } ) diff --git a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/MusicActivityWidgetFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/MusicActivityWidgetFingerprint.kt index fbbef4bed..47daebcfc 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/MusicActivityWidgetFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/MusicActivityWidgetFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.player.swipetodismiss.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.util.containsWideLiteralInstructionIndex -object MusicActivityWidgetFingerprint : MethodFingerprint( +internal object MusicActivityWidgetFingerprint : MethodFingerprint( customFingerprint = handler@{ methodDef, _ -> if (!methodDef.definingClass.endsWith("/MusicActivity;")) return@handler false diff --git a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/SwipeToCloseFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/SwipeToCloseFingerprint.kt index 19f655adf..c0deb3d63 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/SwipeToCloseFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/swipetodismiss/fingerprints/SwipeToCloseFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.player.swipetodismiss.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint -object SwipeToCloseFingerprint : LiteralValueFingerprint( +internal object SwipeToCloseFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), literalSupplier = { 45398432 } diff --git a/src/main/kotlin/app/revanced/patches/music/player/zenmode/ZenModePatch.kt b/src/main/kotlin/app/revanced/patches/music/player/zenmode/ZenModePatch.kt index f37094810..0177625fa 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/zenmode/ZenModePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/zenmode/ZenModePatch.kt @@ -3,52 +3,33 @@ package app.revanced.patches.music.player.zenmode import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.music.player.zenmode.fingerprints.ZenModeFingerprint import app.revanced.patches.music.utils.fingerprints.MiniPlayerConstructorFingerprint import app.revanced.patches.music.utils.fingerprints.SwitchToggleColorFingerprint -import app.revanced.patches.music.utils.integrations.Constants.PLAYER +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.music.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.music.utils.videotype.VideoTypeHookPatch import app.revanced.util.exception import app.revanced.util.getTargetIndex +import app.revanced.util.getWalkerMethod +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object ZenModePatch : BaseBytecodePatch( name = "Enable zen mode", description = "Adds an option to change the player background to light grey to reduce eye strain.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class, VideoTypeHookPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object ZenModePatch : BytecodePatch( - setOf(MiniPlayerConstructorFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(MiniPlayerConstructorFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -68,7 +49,7 @@ object ZenModePatch : BytecodePatch( addInstructions( insertIndex, """ - invoke-static {v$targetRegister}, $PLAYER->enableZenMode(I)I + invoke-static {v$targetRegister}, $PLAYER_CLASS_DESCRIPTOR->enableZenMode(I)I move-result v$targetRegister """ ) @@ -76,17 +57,15 @@ object ZenModePatch : BytecodePatch( } SwitchToggleColorFingerprint.result?.let { - val invokeDirectIndex = it.mutableMethod.getTargetIndex(0, Opcode.INVOKE_DIRECT) - val targetMethod = context.toMethodWalker(it.method) - .nextMethod(invokeDirectIndex, true) - .getMethod() as MutableMethod + it.mutableMethod.apply { + val invokeDirectIndex = getTargetIndex(Opcode.INVOKE_DIRECT) + val walkerMethod = getWalkerMethod(context, invokeDirectIndex) - targetMethod.apply { - addInstructions( + walkerMethod.addInstructions( 0, """ - invoke-static {p1}, $PLAYER->enableZenMode(I)I + invoke-static {p1}, $PLAYER_CLASS_DESCRIPTOR->enableZenMode(I)I move-result p1 - invoke-static {p2}, $PLAYER->enableZenMode(I)I + invoke-static {p2}, $PLAYER_CLASS_DESCRIPTOR->enableZenMode(I)I move-result p2 """ ) diff --git a/src/main/kotlin/app/revanced/patches/music/player/zenmode/fingerprints/ZenModeFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/player/zenmode/fingerprints/ZenModeFingerprint.kt index 8dadbed7d..337a8df45 100644 --- a/src/main/kotlin/app/revanced/patches/music/player/zenmode/fingerprints/ZenModeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/player/zenmode/fingerprints/ZenModeFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ZenModeFingerprint : MethodFingerprint( +internal object ZenModeFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "J"), diff --git a/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/MiniPlayerConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/MiniPlayerConstructorFingerprint.kt index 00c9a819f..4a38e2e07 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/MiniPlayerConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/MiniPlayerConstructorFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.ColorGr import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.MiniPlayerPlayPauseReplayButton import app.revanced.util.containsWideLiteralInstructionIndex -object MiniPlayerConstructorFingerprint : MethodFingerprint( +internal object MiniPlayerConstructorFingerprint : MethodFingerprint( returnType = "V", strings = listOf("sharedToggleMenuItemMutations"), customFingerprint = { methodDef, _ -> diff --git a/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/PendingIntentReceiverFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/PendingIntentReceiverFingerprint.kt index 96129f1a8..27b2dfc83 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/PendingIntentReceiverFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/PendingIntentReceiverFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.utils.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object PendingIntentReceiverFingerprint : MethodFingerprint( +internal object PendingIntentReceiverFingerprint : MethodFingerprint( returnType = "V", strings = listOf("YTM Dislike", "YTM Next", "YTM Previous"), customFingerprint = { methodDef, _ -> diff --git a/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/SeekBarConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/SeekBarConstructorFingerprint.kt index 3aecea124..cf5d9a27f 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/SeekBarConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/SeekBarConstructorFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.utils.fingerprints import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.InlineTimeBarAdBreakMarkerColor import app.revanced.util.fingerprint.LiteralValueFingerprint -object SeekBarConstructorFingerprint : LiteralValueFingerprint( +internal object SeekBarConstructorFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { InlineTimeBarAdBreakMarkerColor } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/SwitchToggleColorFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/SwitchToggleColorFingerprint.kt index e819795dd..e367e1c88 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/SwitchToggleColorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/fingerprints/SwitchToggleColorFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SwitchToggleColorFingerprint : MethodFingerprint( +internal object SwitchToggleColorFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = listOf("L", "J"), diff --git a/src/main/kotlin/app/revanced/patches/music/utils/fix/accessibility/fingerprints/TouchExplorationHoverEventFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/fix/accessibility/fingerprints/TouchExplorationHoverEventFingerprint.kt index 1d96fe08a..97920323e 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/fix/accessibility/fingerprints/TouchExplorationHoverEventFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/fix/accessibility/fingerprints/TouchExplorationHoverEventFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.utils.fix.accessibility.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object TouchExplorationHoverEventFingerprint : MethodFingerprint( +internal object TouchExplorationHoverEventFingerprint : MethodFingerprint( returnType = "Z", customFingerprint = { methodDef, _ -> methodDef.name == "onTouchExplorationHoverEvent" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/fix/androidauto/AndroidAutoCertificatePatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/fix/androidauto/AndroidAutoCertificatePatch.kt index db967cd97..45305c1d0 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/fix/androidauto/AndroidAutoCertificatePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/fix/androidauto/AndroidAutoCertificatePatch.kt @@ -2,36 +2,17 @@ package app.revanced.patches.music.utils.fix.androidauto import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.utils.fix.androidauto.fingerprints.CertificateCheckFingerprint +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object AndroidAutoCertificatePatch : BaseBytecodePatch( name = "Certificate spoof", description = "Enables YouTube Music to work with Android Auto by spoofing the YouTube Music certificate.", - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object AndroidAutoCertificatePatch : BytecodePatch( - setOf(CertificateCheckFingerprint) + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(CertificateCheckFingerprint) ) { override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/music/utils/fix/androidauto/fingerprints/CertificateCheckFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/fix/androidauto/fingerprints/CertificateCheckFingerprint.kt index ac8e0010b..42f473471 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/fix/androidauto/fingerprints/CertificateCheckFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/fix/androidauto/fingerprints/CertificateCheckFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.utils.fix.androidauto.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object CertificateCheckFingerprint : MethodFingerprint( +internal object CertificateCheckFingerprint : MethodFingerprint( returnType = "Z", parameters = listOf("L"), strings = listOf("X509") diff --git a/src/main/kotlin/app/revanced/patches/music/utils/fix/fileprovider/fingerprints/FileProviderResolverFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/fix/fileprovider/fingerprints/FileProviderResolverFingerprint.kt index 1f06a6a2f..cb33c9338 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/fix/fileprovider/fingerprints/FileProviderResolverFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/fix/fileprovider/fingerprints/FileProviderResolverFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.utils.fix.fileprovider.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object FileProviderResolverFingerprint : MethodFingerprint( +internal object FileProviderResolverFingerprint : MethodFingerprint( returnType = "L", strings = listOf( "android.support.FILE_PROVIDER_PATHS", diff --git a/src/main/kotlin/app/revanced/patches/music/utils/gms/GmsCoreSupportPatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/gms/GmsCoreSupportPatch.kt index 38fbb606e..4791cf964 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/gms/GmsCoreSupportPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/gms/GmsCoreSupportPatch.kt @@ -2,6 +2,7 @@ package app.revanced.patches.music.utils.gms import app.revanced.patches.music.utils.fix.clientspoof.ClientSpoofPatch import app.revanced.patches.music.utils.fix.fileprovider.FileProviderPatch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.IntegrationsPatch import app.revanced.patches.music.utils.mainactivity.fingerprints.MainActivityFingerprint import app.revanced.patches.shared.gms.BaseGmsCoreSupportPatch @@ -15,21 +16,5 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch( integrationsPatchDependency = IntegrationsPatch::class, dependencies = setOf(ClientSpoofPatch::class, PackageNamePatch::class, FileProviderPatch::class), gmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch, - compatiblePackages = setOf( - CompatiblePackage( - "com.google.android.apps.youtube.music", - setOf( - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ), - ), - ) + compatiblePackages = COMPATIBLE_PACKAGE ) diff --git a/src/main/kotlin/app/revanced/patches/music/utils/integrations/Constants.kt b/src/main/kotlin/app/revanced/patches/music/utils/integrations/Constants.kt index 3b292a320..5ae815305 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/integrations/Constants.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/integrations/Constants.kt @@ -1,5 +1,7 @@ package app.revanced.patches.music.utils.integrations +import app.revanced.patcher.patch.Patch + @Suppress("MemberVisibilityCanBePrivate") object Constants { const val INTEGRATIONS_PATH = "Lapp/revanced/integrations/music" @@ -17,12 +19,30 @@ object Constants { const val VIDEO_PATH = "$PATCHES_PATH/video" const val UTILS_PATH = "$PATCHES_PATH/utils" - const val ACCOUNT = "$ACCOUNT_PATH/AccountPatch;" - const val ACTIONBAR = "$ACTIONBAR_PATH/ActionBarPatch;" - const val FLYOUT = "$FLYOUT_PATH/FlyoutPatch;" - const val GENERAL = "$GENERAL_PATH/GeneralPatch;" - const val NAVIGATION = "$NAVIGATION_PATH/NavigationPatch;" - const val PLAYER = "$PLAYER_PATH/PlayerPatch;" + const val ACCOUNT_CLASS_DESCRIPTOR = "$ACCOUNT_PATH/AccountPatch;" + const val ACTIONBAR_CLASS_DESCRIPTOR = "$ACTIONBAR_PATH/ActionBarPatch;" + const val FLYOUT_CLASS_DESCRIPTOR = "$FLYOUT_PATH/FlyoutPatch;" + const val GENERAL_CLASS_DESCRIPTOR = "$GENERAL_PATH/GeneralPatch;" + const val NAVIGATION_CLASS_DESCRIPTOR = "$NAVIGATION_PATH/NavigationPatch;" + const val PLAYER_CLASS_DESCRIPTOR = "$PLAYER_PATH/PlayerPatch;" + + val COMPATIBLE_PACKAGE = setOf( + Patch.CompatiblePackage( + "com.google.android.apps.youtube.music", + setOf( + "6.21.52", + "6.22.52", + "6.23.56", + "6.25.53", + "6.26.51", + "6.27.54", + "6.28.53", + "6.29.58", + "6.31.55", + "6.33.52" + ) + ) + ) val LANGUAGE_LIST = arrayOf( "values", diff --git a/src/main/kotlin/app/revanced/patches/music/utils/integrations/fingerprints/InitFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/integrations/fingerprints/InitFingerprint.kt index 5b3cf515d..db4e2f507 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/integrations/fingerprints/InitFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/integrations/fingerprints/InitFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.shared.integrations.BaseIntegrationsPatch.Integratio import com.android.tools.smali.dexlib2.Opcode @Suppress("DEPRECATION") -object InitFingerprint : IntegrationsFingerprint( +internal object InitFingerprint : IntegrationsFingerprint( returnType = "V", parameters = emptyList(), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/MainActivityResolvePatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/MainActivityResolvePatch.kt index ca844fea2..9cd92cc43 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/MainActivityResolvePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/MainActivityResolvePatch.kt @@ -26,11 +26,9 @@ object MainActivityResolvePatch : BytecodePatch( methods: String, descriptor: String ) { - onCreateMethod.apply { - addInstruction( - 2, - "invoke-static/range {p0 .. p0}, $UTILS_PATH/$methods;->$descriptor(Landroid/app/Activity;)V" - ) - } + onCreateMethod.addInstruction( + 2, + "invoke-static/range {p0 .. p0}, $UTILS_PATH/$methods;->$descriptor(Landroid/app/Activity;)V" + ) } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/fingerprints/MainActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/fingerprints/MainActivityFingerprint.kt index 317db8cfc..9b4469fca 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/fingerprints/MainActivityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/mainactivity/fingerprints/MainActivityFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.utils.mainactivity.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object MainActivityFingerprint : MethodFingerprint( +internal object MainActivityFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("Landroid/os/Bundle;"), strings = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/utils/overridequality/OverrideQualityHookPatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/overridequality/OverrideQualityHookPatch.kt index 54ec8fee0..e06385b71 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/overridequality/OverrideQualityHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/overridequality/OverrideQualityHookPatch.kt @@ -30,6 +30,15 @@ object OverrideQualityHookPatch : BytecodePatch( VideoQualityTextFingerprint ) ) { + private const val INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR = + "$VIDEO_PATH/VideoQualityPatch;" + + private const val INTEGRATIONS_VIDEO_UTILS_CLASS_DESCRIPTOR = + "$INTEGRATIONS_PATH/utils/VideoUtils;" + + private lateinit var objectClass: String + private lateinit var objectMethod: String + override fun execute(context: BytecodeContext) { VideoQualityListFingerprint.result?.let { @@ -38,14 +47,14 @@ object OverrideQualityHookPatch : BytecodePatch( val overrideMethod = it.mutableClass.methods.find { method -> method.parameterTypes.first() == "I" } - QUALITY_CLASS = it.method.definingClass - QUALITY_METHOD = overrideMethod?.name + objectClass = it.method.definingClass + objectMethod = overrideMethod?.name ?: throw PatchException("Failed to find hook method") constructorMethod.apply { addInstruction( 2, - "sput-object p0, $INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR->qualityClass:$QUALITY_CLASS" + "sput-object p0, $INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR->qualityClass:$objectClass" ) } @@ -66,7 +75,7 @@ object OverrideQualityHookPatch : BytecodePatch( ImmutableField( definingClass, "qualityClass", - QUALITY_CLASS, + objectClass, AccessFlags.PUBLIC or AccessFlags.STATIC, null, annotations, @@ -76,8 +85,8 @@ object OverrideQualityHookPatch : BytecodePatch( addInstructions( 0, """ - sget-object v0, $INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR->qualityClass:$QUALITY_CLASS - invoke-virtual {v0, p0}, $QUALITY_CLASS->$QUALITY_METHOD(I)V + sget-object v0, $INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR->qualityClass:$objectClass + invoke-virtual {v0, p0}, $objectClass->$objectMethod(I)V """ ) } @@ -95,13 +104,4 @@ object OverrideQualityHookPatch : BytecodePatch( } } ?: throw VideoQualityTextFingerprint.exception } - - private const val INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR = - "$VIDEO_PATH/VideoQualityPatch;" - - private const val INTEGRATIONS_VIDEO_UTILS_CLASS_DESCRIPTOR = - "$INTEGRATIONS_PATH/utils/VideoUtils;" - - private lateinit var QUALITY_CLASS: String - private lateinit var QUALITY_METHOD: String } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/overridequality/fingerprints/VideoQualityListFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/overridequality/fingerprints/VideoQualityListFingerprint.kt index 379e6c1fe..bdd783195 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/overridequality/fingerprints/VideoQualityListFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/overridequality/fingerprints/VideoQualityListFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.Quality import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object VideoQualityListFingerprint : LiteralValueFingerprint( +internal object VideoQualityListFingerprint : LiteralValueFingerprint( returnType = "V", parameters = listOf("L"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/utils/overridequality/fingerprints/VideoQualityPatchFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/overridequality/fingerprints/VideoQualityPatchFingerprint.kt index ba146524b..726265eaa 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/overridequality/fingerprints/VideoQualityPatchFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/overridequality/fingerprints/VideoQualityPatchFingerprint.kt @@ -2,14 +2,15 @@ package app.revanced.patches.music.utils.overridequality.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.music.utils.integrations.Constants.VIDEO_PATH import com.android.tools.smali.dexlib2.AccessFlags -object VideoQualityPatchFingerprint : MethodFingerprint( +internal object VideoQualityPatchFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("I"), customFingerprint = { methodDef, _ -> - methodDef.definingClass == "Lapp/revanced/integrations/music/patches/video/VideoQualityPatch;" + methodDef.definingClass == "$VIDEO_PATH/VideoQualityPatch;" && methodDef.name == "overrideQuality" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/overridequality/fingerprints/VideoQualityTextFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/overridequality/fingerprints/VideoQualityTextFingerprint.kt index ed865f1d2..51f9daa8e 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/overridequality/fingerprints/VideoQualityTextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/overridequality/fingerprints/VideoQualityTextFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object VideoQualityTextFingerprint : MethodFingerprint( +internal object VideoQualityTextFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("[L", "I", "Z"), diff --git a/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/OverrideSpeedHookPatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/OverrideSpeedHookPatch.kt index a6d0c1c93..0d1e51c19 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/OverrideSpeedHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/OverrideSpeedHookPatch.kt @@ -8,7 +8,6 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.or import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableField.Companion.toMutable -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.music.utils.integrations.Constants.INTEGRATIONS_PATH import app.revanced.patches.music.utils.integrations.Constants.VIDEO_PATH import app.revanced.patches.music.utils.overridespeed.fingerprints.PlaybackSpeedFingerprint @@ -17,6 +16,7 @@ import app.revanced.patches.music.utils.overridespeed.fingerprints.PlaybackSpeed import app.revanced.patches.music.utils.overridespeed.fingerprints.PlaybackSpeedPatchFingerprint import app.revanced.util.exception import app.revanced.util.getTargetIndex +import app.revanced.util.getWalkerMethod import app.revanced.util.getWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode @@ -93,10 +93,7 @@ object OverrideSpeedHookPatch : BytecodePatch( val speedRegister = getInstruction(startIndex + 1).registerA - val speedMethod = context - .toMethodWalker(this) - .nextMethod(endIndex, true) - .getMethod() as MutableMethod + val speedMethod = getWalkerMethod(context, endIndex) speedMethod.addInstruction( speedMethod.implementation!!.instructions.size - 1, diff --git a/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedFingerprint.kt index 23a847910..89e5a6008 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object PlaybackSpeedFingerprint : MethodFingerprint( +internal object PlaybackSpeedFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedOnClickListenerFingerprint.kt index 0a2e8394b..3ac3f0cd7 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedOnClickListenerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedOnClickListenerFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags -object PlaybackSpeedOnClickListenerFingerprint : MethodFingerprint( +internal object PlaybackSpeedOnClickListenerFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/View;"), diff --git a/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedParentFingerprint.kt index fef5a64db..13a78f6ae 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedParentFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object PlaybackSpeedParentFingerprint : MethodFingerprint( +internal object PlaybackSpeedParentFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedPatchFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedPatchFingerprint.kt index 501143cb9..a398082d9 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedPatchFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/overridespeed/fingerprints/PlaybackSpeedPatchFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patches.music.utils.integrations.Constants.VIDEO_PATH import com.android.tools.smali.dexlib2.AccessFlags -object PlaybackSpeedPatchFingerprint : MethodFingerprint( +internal object PlaybackSpeedPatchFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/music/utils/playerresponse/PlayerResponsePatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/playerresponse/PlayerResponsePatch.kt index 6384d904c..39c13d7b9 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/playerresponse/PlayerResponsePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/playerresponse/PlayerResponsePatch.kt @@ -37,9 +37,8 @@ object PlayerResponsePatch : BytecodePatch( override fun execute(context: BytecodeContext) { - PlaybackStartDescriptorFingerprint.result?.let { - insertMethod = it.mutableMethod - } ?: throw PlaybackStartDescriptorFingerprint.exception + insertMethod = PlaybackStartDescriptorFingerprint.result?.mutableMethod + ?: throw PlaybackStartDescriptorFingerprint.exception } diff --git a/src/main/kotlin/app/revanced/patches/music/utils/playerresponse/fingerprints/PlaybackStartDescriptorFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/playerresponse/fingerprints/PlaybackStartDescriptorFingerprint.kt index e312b9e7b..1a66e47e8 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/playerresponse/fingerprints/PlaybackStartDescriptorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/playerresponse/fingerprints/PlaybackStartDescriptorFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object PlaybackStartDescriptorFingerprint : MethodFingerprint( +internal object PlaybackStartDescriptorFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "L", parameters = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/utils/playertype/fingerprint/PlayerTypeFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/playertype/fingerprint/PlayerTypeFingerprint.kt index 4004508e6..9cde15328 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/playertype/fingerprint/PlayerTypeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/playertype/fingerprint/PlayerTypeFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object PlayerTypeFingerprint : MethodFingerprint( +internal object PlayerTypeFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), @@ -15,5 +15,7 @@ object PlayerTypeFingerprint : MethodFingerprint( Opcode.IPUT_OBJECT, Opcode.RETURN_VOID ), - customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/MppWatchWhileLayout;") } + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("/MppWatchWhileLayout;") + } ) diff --git a/src/main/kotlin/app/revanced/patches/music/utils/resourceid/SharedResourceIdPatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/resourceid/SharedResourceIdPatch.kt index aa2cb764f..2b790ad35 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/resourceid/SharedResourceIdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/resourceid/SharedResourceIdPatch.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.mapping.ResourceMappingPatch -import app.revanced.patches.shared.mapping.ResourceType +import app.revanced.patches.shared.mapping.ResourceMappingPatch.getId import app.revanced.patches.shared.mapping.ResourceType.BOOL import app.revanced.patches.shared.mapping.ResourceType.COLOR import app.revanced.patches.shared.mapping.ResourceType.DIMEN @@ -15,82 +15,77 @@ import app.revanced.patches.shared.mapping.ResourceType.STYLE @Patch(dependencies = [ResourceMappingPatch::class]) object SharedResourceIdPatch : ResourcePatch() { - var AccountSwitcherAccessibility: Long = -1 - var ButtonContainer: Long = -1 - var ButtonIconPaddingMedium: Long = -1 - var ChipCloud: Long = -1 - var ColorGrey: Long = -1 - var DesignBottomSheetDialog: Long = -1 - var DialogSolid: Long = -1 - var EndButtonsContainer: Long = -1 - var FloatingLayout: Long = -1 - var HistoryMenuItem: Long = -1 - var InlineTimeBarAdBreakMarkerColor: Long = -1 - var InterstitialsContainer: Long = -1 - var IsTablet: Long = -1 - var LikeDislikeContainer: Long = -1 - var MenuEntry: Long = -1 - var MiniPlayerDefaultText: Long = -1 - var MiniPlayerMdxPlaying: Long = -1 - var MiniPlayerPlayPauseReplayButton: Long = -1 - var MusicNotifierShelf: Long = -1 - var MusicTasteBuilderShelf: Long = -1 - var NamesInactiveAccountThumbnailSize: Long = -1 - var OfflineSettingsMenuItem: Long = -1 - var PlayerCastMediaRouteButton: Long = -1 - var PlayerOverlayChip: Long = -1 - var PrivacyTosFooter: Long = -1 - var QualityAuto: Long = -1 - var RemixGenericButtonSize: Long = -1 - var SlidingDialogAnimation: Long = -1 - var Text1: Long = -1 - var ToolTipContentView: Long = -1 - var TopEnd: Long = -1 - var TopStart: Long = -1 - var TosFooter: Long = -1 - var TouchOutside: Long = -1 + var AccountSwitcherAccessibility = -1L + var ButtonContainer = -1L + var ButtonIconPaddingMedium = -1L + var ChipCloud = -1L + var ColorGrey = -1L + var DesignBottomSheetDialog = -1L + var DialogSolid = -1L + var EndButtonsContainer = -1L + var FloatingLayout = -1L + var HistoryMenuItem = -1L + var InlineTimeBarAdBreakMarkerColor = -1L + var InterstitialsContainer = -1L + var IsTablet = -1L + var LikeDislikeContainer = -1L + var MenuEntry = -1L + var MiniPlayerDefaultText = -1L + var MiniPlayerMdxPlaying = -1L + var MiniPlayerPlayPauseReplayButton = -1L + var MusicNotifierShelf = -1L + var MusicTasteBuilderShelf = -1L + var NamesInactiveAccountThumbnailSize = -1L + var OfflineSettingsMenuItem = -1L + var PlayerCastMediaRouteButton = -1L + var PlayerOverlayChip = -1L + var PrivacyTosFooter = -1L + var QualityAuto = -1L + var RemixGenericButtonSize = -1L + var SlidingDialogAnimation = -1L + var Text1 = -1L + var ToolTipContentView = -1L + var TopEnd = -1L + var TopStart = -1L + var TosFooter = -1L + var TouchOutside = -1L override fun execute(context: ResourceContext) { - fun find(resourceType: ResourceType, resourceName: String) = ResourceMappingPatch - .resourceMappings - .find { it.type == resourceType.value && it.name == resourceName }?.id - ?: -1 - - AccountSwitcherAccessibility = find(STRING, "account_switcher_accessibility_label") - ButtonContainer = find(ID, "button_container") - ButtonIconPaddingMedium = find(DIMEN, "button_icon_padding_medium") - ChipCloud = find(LAYOUT, "chip_cloud") - ColorGrey = find(COLOR, "ytm_color_grey_12") - DesignBottomSheetDialog = find(LAYOUT, "design_bottom_sheet_dialog") - DialogSolid = find(STYLE, "Theme.YouTubeMusic.Dialog.Solid") - EndButtonsContainer = find(ID, "end_buttons_container") - FloatingLayout = find(ID, "floating_layout") - HistoryMenuItem = find(ID, "history_menu_item") - InlineTimeBarAdBreakMarkerColor = find(COLOR, "inline_time_bar_ad_break_marker_color") - InterstitialsContainer = find(ID, "interstitials_container") - IsTablet = find(BOOL, "is_tablet") - LikeDislikeContainer = find(ID, "like_dislike_container") - MenuEntry = find(LAYOUT, "menu_entry") - MiniPlayerDefaultText = find(STRING, "mini_player_default_text") - MiniPlayerMdxPlaying = find(STRING, "mini_player_mdx_playing") - MiniPlayerPlayPauseReplayButton = find(ID, "mini_player_play_pause_replay_button") - MusicNotifierShelf = find(LAYOUT, "music_notifier_shelf") - MusicTasteBuilderShelf = find(LAYOUT, "music_tastebuilder_shelf") - NamesInactiveAccountThumbnailSize = find(DIMEN, "names_inactive_account_thumbnail_size") - OfflineSettingsMenuItem = find(ID, "offline_settings_menu_item") - PlayerCastMediaRouteButton = find(LAYOUT, "player_cast_media_route_button") - PlayerOverlayChip = find(ID, "player_overlay_chip") - PrivacyTosFooter = find(ID, "privacy_tos_footer") - QualityAuto = find(STRING, "quality_auto") - RemixGenericButtonSize = find(DIMEN, "remix_generic_button_size") - SlidingDialogAnimation = find(STYLE, "SlidingDialogAnimation") - Text1 = find(ID, "text1") - ToolTipContentView = find(LAYOUT, "tooltip_content_view") - TopEnd = find(ID, "TOP_END") - TopStart = find(ID, "TOP_START") - TosFooter = find(ID, "tos_footer") - TouchOutside = find(ID, "touch_outside") + AccountSwitcherAccessibility = getId(STRING, "account_switcher_accessibility_label") + ButtonContainer = getId(ID, "button_container") + ButtonIconPaddingMedium = getId(DIMEN, "button_icon_padding_medium") + ChipCloud = getId(LAYOUT, "chip_cloud") + ColorGrey = getId(COLOR, "ytm_color_grey_12") + DesignBottomSheetDialog = getId(LAYOUT, "design_bottom_sheet_dialog") + DialogSolid = getId(STYLE, "Theme.YouTubeMusic.Dialog.Solid") + EndButtonsContainer = getId(ID, "end_buttons_container") + FloatingLayout = getId(ID, "floating_layout") + HistoryMenuItem = getId(ID, "history_menu_item") + InlineTimeBarAdBreakMarkerColor = getId(COLOR, "inline_time_bar_ad_break_marker_color") + InterstitialsContainer = getId(ID, "interstitials_container") + IsTablet = getId(BOOL, "is_tablet") + LikeDislikeContainer = getId(ID, "like_dislike_container") + MenuEntry = getId(LAYOUT, "menu_entry") + MiniPlayerDefaultText = getId(STRING, "mini_player_default_text") + MiniPlayerMdxPlaying = getId(STRING, "mini_player_mdx_playing") + MiniPlayerPlayPauseReplayButton = getId(ID, "mini_player_play_pause_replay_button") + MusicNotifierShelf = getId(LAYOUT, "music_notifier_shelf") + MusicTasteBuilderShelf = getId(LAYOUT, "music_tastebuilder_shelf") + NamesInactiveAccountThumbnailSize = getId(DIMEN, "names_inactive_account_thumbnail_size") + OfflineSettingsMenuItem = getId(ID, "offline_settings_menu_item") + PlayerCastMediaRouteButton = getId(LAYOUT, "player_cast_media_route_button") + PlayerOverlayChip = getId(ID, "player_overlay_chip") + PrivacyTosFooter = getId(ID, "privacy_tos_footer") + QualityAuto = getId(STRING, "quality_auto") + RemixGenericButtonSize = getId(DIMEN, "remix_generic_button_size") + SlidingDialogAnimation = getId(STYLE, "SlidingDialogAnimation") + Text1 = getId(ID, "text1") + ToolTipContentView = getId(LAYOUT, "tooltip_content_view") + TopEnd = getId(ID, "TOP_END") + TopStart = getId(ID, "TOP_START") + TosFooter = getId(ID, "tos_footer") + TouchOutside = getId(ID, "touch_outside") } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/ReturnYouTubeDislikeBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/ReturnYouTubeDislikeBytecodePatch.kt index aa1731a12..85062a167 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/ReturnYouTubeDislikeBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/ReturnYouTubeDislikeBytecodePatch.kt @@ -5,7 +5,6 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.utils.integrations.Constants.UTILS_PATH import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch @@ -15,9 +14,10 @@ import app.revanced.patches.music.utils.returnyoutubedislike.fingerprints.Remove import app.revanced.patches.music.utils.returnyoutubedislike.fingerprints.TextComponentFingerprint import app.revanced.patches.music.video.videoid.VideoIdPatch import app.revanced.util.exception +import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c +import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction @Patch( dependencies = [ @@ -55,28 +55,18 @@ object ReturnYouTubeDislikeBytecodePatch : BytecodePatch( TextComponentFingerprint.result?.let { it.mutableMethod.apply { - var insertIndex = -1 - for ((index, instruction) in implementation!!.instructions.withIndex()) { - if (instruction.opcode != Opcode.INVOKE_STATIC) continue + val insertIndex = indexOfFirstInstruction { + opcode == Opcode.INVOKE_STATIC + && (this as ReferenceInstruction).reference.toString().endsWith("Ljava/lang/CharSequence;") + } + 2 + val insertRegister = getInstruction(insertIndex - 1).registerA - val reference = getInstruction(index).reference.toString() - if (!reference.endsWith("Ljava/lang/CharSequence;") && !reference.endsWith("Landroid/text/Spanned;")) continue - - val insertRegister = getInstruction(index + 1).registerA - - insertIndex = index + 2 - - addInstructions( - insertIndex, """ - invoke-static {v$insertRegister}, $INTEGRATIONS_RYD_CLASS_DESCRIPTOR->onSpannedCreated(Landroid/text/Spanned;)Landroid/text/Spanned; - move-result-object v$insertRegister - """ - ) - - break - } - if (insertIndex == -1) - throw PatchException("target Instruction not found!") + addInstructions( + insertIndex, """ + invoke-static {v$insertRegister}, $INTEGRATIONS_RYD_CLASS_DESCRIPTOR->onSpannedCreated(Landroid/text/Spanned;)Landroid/text/Spanned; + move-result-object v$insertRegister + """ + ) } } ?: throw TextComponentFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/ReturnYouTubeDislikePatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/ReturnYouTubeDislikePatch.kt index 5fec7cc39..87d528c58 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/ReturnYouTubeDislikePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/ReturnYouTubeDislikePatch.kt @@ -1,42 +1,24 @@ package app.revanced.patches.music.utils.returnyoutubedislike import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.settings.ResourceUtils.RETURN_YOUTUBE_DISLIKE_SETTINGS_KEY import app.revanced.patches.music.utils.settings.ResourceUtils.addReVancedMusicPreference import app.revanced.patches.music.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch import org.w3c.dom.Element import org.w3c.dom.Node -@Patch( +@Suppress("DEPRECATION", "unused") +object ReturnYouTubeDislikePatch : BaseResourcePatch( name = "Return YouTube Dislike", description = "Adds an option to show the dislike count of songs using the Return YouTube Dislike API.", - dependencies = [ + dependencies = setOf( ReturnYouTubeDislikeBytecodePatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object ReturnYouTubeDislikePatch : ResourcePatch() { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { override fun execute(context: ResourceContext) { context.addReVancedMusicPreference(RETURN_YOUTUBE_DISLIKE_SETTINGS_KEY) diff --git a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/DislikeFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/DislikeFingerprint.kt index 07c8cb4a7..0e8c9cd2b 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/DislikeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/DislikeFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.utils.returnyoutubedislike.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object DislikeFingerprint : MethodFingerprint( +internal object DislikeFingerprint : MethodFingerprint( returnType = "V", strings = listOf("like/dislike") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/LikeFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/LikeFingerprint.kt index 484e3d360..ca44fb135 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/LikeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/LikeFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.utils.returnyoutubedislike.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object LikeFingerprint : MethodFingerprint( +internal object LikeFingerprint : MethodFingerprint( returnType = "V", strings = listOf("like/like") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/RemoveLikeFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/RemoveLikeFingerprint.kt index 2f968affd..2e4335bc3 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/RemoveLikeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/RemoveLikeFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.utils.returnyoutubedislike.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object RemoveLikeFingerprint : MethodFingerprint( +internal object RemoveLikeFingerprint : MethodFingerprint( returnType = "V", strings = listOf("like/removelike") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/TextComponentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/TextComponentFingerprint.kt index be8808351..5dc90e3ea 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/TextComponentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/returnyoutubedislike/fingerprints/TextComponentFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch.ButtonI import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object TextComponentFingerprint : LiteralValueFingerprint( +internal object TextComponentFingerprint : LiteralValueFingerprint( returnType = "V", opcodes = listOf(Opcode.CONST_HIGH16), literalSupplier = { ButtonIconPaddingMedium } diff --git a/src/main/kotlin/app/revanced/patches/music/utils/settings/SettingsPatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/settings/SettingsPatch.kt index 08e3eb4c4..c01ea7507 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/settings/SettingsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/settings/SettingsPatch.kt @@ -1,9 +1,8 @@ package app.revanced.patches.music.utils.settings import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.utils.fix.accessibility.AccessibilityNodeInfoPatch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.settings.ResourceUtils.YOUTUBE_MUSIC_SETTINGS_KEY import app.revanced.patches.music.utils.settings.ResourceUtils.addMusicPreference import app.revanced.patches.music.utils.settings.ResourceUtils.addMusicPreferenceCategory @@ -11,50 +10,32 @@ import app.revanced.patches.music.utils.settings.ResourceUtils.addMusicPreferenc import app.revanced.patches.music.utils.settings.ResourceUtils.addMusicPreferenceWithoutSummary import app.revanced.patches.music.utils.settings.ResourceUtils.addReVancedMusicPreference import app.revanced.patches.music.utils.settings.ResourceUtils.sortMusicPreferenceCategory -import app.revanced.patches.shared.settings.AbstractSettingsResourcePatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources import app.revanced.util.copyXmlNode +import app.revanced.util.patch.BaseResourcePatch import org.w3c.dom.Element import java.io.Closeable import java.util.concurrent.Executors import java.util.concurrent.TimeUnit -@Patch( +@Suppress("DEPRECATION", "SpellCheckingInspection", "unused") +object SettingsPatch : BaseResourcePatch( name = "Settings", description = "Adds ReVanced Extended settings to YouTube Music.", - dependencies = [ + dependencies = setOf( AccessibilityNodeInfoPatch::class, SettingsBytecodePatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("DEPRECATION", "unused") -object SettingsPatch : AbstractSettingsResourcePatch( - "music/settings" + ), + compatiblePackages = COMPATIBLE_PACKAGE, + requiresIntegrations = true ), Closeable { private val THREAD_COUNT = Runtime.getRuntime().availableProcessors() private val threadPoolExecutor = Executors.newFixedThreadPool(THREAD_COUNT) lateinit var contexts: ResourceContext - internal var upward0636: Boolean = false - internal var upward0642: Boolean = false + internal var upward0636 = false + internal var upward0642 = false override fun execute(context: ResourceContext) { contexts = context @@ -95,6 +76,11 @@ object SettingsPatch : AbstractSettingsResourcePatch( .also { it.shutdown() } .awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS) + /** + * copy strings + */ + context.copyXmlNode("music/settings/host", "values/strings.xml", "resources") + /** * create directory for the untranslated language resources */ @@ -144,9 +130,6 @@ object SettingsPatch : AbstractSettingsResourcePatch( } context.addReVancedMusicPreference(YOUTUBE_MUSIC_SETTINGS_KEY) - - super.execute(context) - } internal fun addMusicPreference( diff --git a/src/main/kotlin/app/revanced/patches/music/utils/settings/fingerprints/GoogleApiActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/settings/fingerprints/GoogleApiActivityFingerprint.kt index 7aab144ee..2003003b8 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/settings/fingerprints/GoogleApiActivityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/settings/fingerprints/GoogleApiActivityFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.music.utils.settings.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object GoogleApiActivityFingerprint : MethodFingerprint( +internal object GoogleApiActivityFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("Landroid/os/Bundle;"), customFingerprint = { methodDef, _ -> diff --git a/src/main/kotlin/app/revanced/patches/music/utils/settings/fingerprints/PreferenceFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/settings/fingerprints/PreferenceFingerprint.kt index bf242489f..34668c178 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/settings/fingerprints/PreferenceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/settings/fingerprints/PreferenceFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object PreferenceFingerprint : MethodFingerprint( +internal object PreferenceFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PROTECTED.value, parameters = listOf("Z"), diff --git a/src/main/kotlin/app/revanced/patches/music/utils/settings/fingerprints/SettingsHeadersFragmentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/settings/fingerprints/SettingsHeadersFragmentFingerprint.kt index 76ba5e92e..db5cd378c 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/settings/fingerprints/SettingsHeadersFragmentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/settings/fingerprints/SettingsHeadersFragmentFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.utils.settings.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object SettingsHeadersFragmentFingerprint : MethodFingerprint( +internal object SettingsHeadersFragmentFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("L"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/SponsorBlockBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/SponsorBlockBytecodePatch.kt index 9c0c84712..e1891aa48 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/SponsorBlockBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/SponsorBlockBytecodePatch.kt @@ -7,20 +7,20 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.music.utils.fingerprints.SeekBarConstructorFingerprint +import app.revanced.patches.music.utils.integrations.Constants.INTEGRATIONS_PATH import app.revanced.patches.music.utils.resourceid.SharedResourceIdPatch -import app.revanced.patches.music.utils.sponsorblock.bytecode.fingerprints.MusicPlaybackControlsTimeBarDrawFingerprint -import app.revanced.patches.music.utils.sponsorblock.bytecode.fingerprints.MusicPlaybackControlsTimeBarOnMeasureFingerprint -import app.revanced.patches.music.utils.sponsorblock.bytecode.fingerprints.SeekbarOnDrawFingerprint +import app.revanced.patches.music.utils.sponsorblock.fingerprints.MusicPlaybackControlsTimeBarDrawFingerprint +import app.revanced.patches.music.utils.sponsorblock.fingerprints.MusicPlaybackControlsTimeBarOnMeasureFingerprint +import app.revanced.patches.music.utils.sponsorblock.fingerprints.SeekbarOnDrawFingerprint import app.revanced.patches.music.video.information.VideoInformationPatch import app.revanced.patches.music.video.videoid.VideoIdPatch import app.revanced.util.exception -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction3rc +import app.revanced.util.getTargetIndexWithMethodReferenceName +import app.revanced.util.getTargetIndexWithMethodReferenceNameReversed 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.instruction.formats.Instruction35c import com.android.tools.smali.dexlib2.iface.reference.FieldReference -import com.android.tools.smali.dexlib2.iface.reference.MethodReference @Patch( dependencies = [ @@ -37,7 +37,7 @@ object SponsorBlockBytecodePatch : BytecodePatch( ) ) { private const val INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR = - "Lapp/revanced/integrations/music/sponsorblock/SegmentPlaybackController;" + "$INTEGRATIONS_PATH/sponsorblock/SegmentPlaybackController;" private lateinit var rectangleFieldName: String override fun execute(context: BytecodeContext) { @@ -52,68 +52,43 @@ object SponsorBlockBytecodePatch : BytecodePatch( ) } - /** * Responsible for seekbar in fullscreen */ - SeekBarConstructorFingerprint.result?.classDef?.let { classDef -> - SeekbarOnDrawFingerprint.also { - it.resolve( - context, - classDef + val seekBarClass = SeekBarConstructorFingerprint.result?.mutableClass + ?: throw SeekBarConstructorFingerprint.exception + SeekbarOnDrawFingerprint.resolve(context, seekBarClass) + + SeekbarOnDrawFingerprint.result?.let { + it.mutableMethod.apply { + // Initialize seekbar method + addInstructions( + 0, """ + move-object/from16 v0, p0 + const-string v1, "${VideoInformationPatch.rectangleFieldName}" + invoke-static {v0, v1}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarRect(Ljava/lang/Object;Ljava/lang/String;)V + """ ) - }.result?.let { - it.mutableMethod.apply { - // Initialize seekbar method - addInstructions( - 0, """ - move-object/from16 v0, p0 - const-string v1, "${VideoInformationPatch.rectangleFieldName}" - invoke-static {v0, v1}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarRect(Ljava/lang/Object;Ljava/lang/String;)V - """ - ) - // Set seekbar thickness - for ((index, instruction) in implementation!!.instructions.withIndex()) { - if (instruction.opcode != Opcode.INVOKE_STATIC) continue + // Set seekbar thickness + val roundIndex = getTargetIndexWithMethodReferenceName("round") + 1 + val roundRegister = getInstruction(roundIndex).registerA + addInstruction( + roundIndex + 1, + "invoke-static {v$roundRegister}, " + + "$INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarThickness(I)V" + ) - val invokeInstruction = getInstruction(index) - if ((invokeInstruction.reference as MethodReference).name != "round") continue - - val insertIndex = index + 2 - - addInstruction( - insertIndex, - "invoke-static {v${invokeInstruction.registerC}}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->setSponsorBarThickness(I)V" - ) - break - } - - // Draw segment - for ((index, instruction) in implementation!!.instructions.withIndex()) { - if (instruction.opcode != Opcode.INVOKE_VIRTUAL_RANGE) continue - - val invokeInstruction = instruction as BuilderInstruction3rc - if ((invokeInstruction.reference as MethodReference).name != "restore") continue - - val drawSegmentInstructionInsertIndex = index - 1 - - val (canvasInstance, centerY) = - getInstruction( - drawSegmentInstructionInsertIndex - ).let { drawSegmentInstruction -> - drawSegmentInstruction.registerC to drawSegmentInstruction.registerE - } - - addInstruction( - drawSegmentInstructionInsertIndex, - "invoke-static {v$canvasInstance, v$centerY}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->drawSponsorTimeBars(Landroid/graphics/Canvas;F)V" - ) - break - } - } - } ?: throw SeekbarOnDrawFingerprint.exception - } ?: throw SeekBarConstructorFingerprint.exception + // Draw segment + val drawCircleIndex = getTargetIndexWithMethodReferenceNameReversed("drawCircle") + val drawCircleInstruction = getInstruction(drawCircleIndex) + addInstruction( + drawCircleIndex, + "invoke-static {v${drawCircleInstruction.registerC}, v${drawCircleInstruction.registerE}}, " + + "$INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->drawSponsorTimeBars(Landroid/graphics/Canvas;F)V" + ) + } + } ?: throw SeekbarOnDrawFingerprint.exception /** @@ -140,25 +115,13 @@ object SponsorBlockBytecodePatch : BytecodePatch( ) // Draw segment - for ((index, instruction) in implementation!!.instructions.withIndex()) { - if (instruction.opcode != Opcode.INVOKE_VIRTUAL) continue - - val invokeInstruction = getInstruction(index) - if ((invokeInstruction.reference as MethodReference).name != "drawCircle") continue - - val (canvasInstance, centerY) = - getInstruction( - index - ).let { drawSegmentInstruction -> - drawSegmentInstruction.registerC to drawSegmentInstruction.registerE - } - - addInstruction( - index, - "invoke-static {v$canvasInstance, v$centerY}, $INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->drawSponsorTimeBars(Landroid/graphics/Canvas;F)V" - ) - break - } + val drawCircleIndex = getTargetIndexWithMethodReferenceName("drawCircle") + val drawCircleInstruction = getInstruction(drawCircleIndex) + addInstruction( + drawCircleIndex, + "invoke-static {v${drawCircleInstruction.registerC}, v${drawCircleInstruction.registerE}}, " + + "$INTEGRATIONS_SEGMENT_PLAYBACK_CONTROLLER_CLASS_DESCRIPTOR->drawSponsorTimeBars(Landroid/graphics/Canvas;F)V" + ) } } ?: throw MusicPlaybackControlsTimeBarDrawFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/SponsorBlockPatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/SponsorBlockPatch.kt index 9d1292d89..e35c2f967 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/SponsorBlockPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/SponsorBlockPatch.kt @@ -1,42 +1,24 @@ package app.revanced.patches.music.utils.sponsorblock import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.settings.ResourceUtils import app.revanced.patches.music.utils.settings.ResourceUtils.hookPreference import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("DEPRECATION", "unused") +object SponsorBlockPatch : BaseResourcePatch( name = "SponsorBlock", description = "Adds options to enable and configure SponsorBlock, which can skip undesired video segments such as non-music sections.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SponsorBlockBytecodePatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object SponsorBlockPatch : ResourcePatch() { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { override fun execute(context: ResourceContext) { /** @@ -60,6 +42,7 @@ object SponsorBlockPatch : ResourcePatch() { ) val publicFile = context["res/values/public.xml"] + val preferenceFile = context["res/xml/sponsorblock_prefs.xml"] publicFile.writeText( publicFile.readText() @@ -69,8 +52,8 @@ object SponsorBlockPatch : ResourcePatch() { ) ) - context["res/xml/sponsorblock_prefs.xml"].writeText( - context["res/xml/sponsorblock_prefs.xml"].readText() + preferenceFile.writeText( + preferenceFile.readText() .replace( "\"com.google.android.apps.youtube.music\"", "\"" + ResourceUtils.musicPackageName + "\"" diff --git a/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/MusicPlaybackControlsTimeBarDrawFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/MusicPlaybackControlsTimeBarDrawFingerprint.kt index dafc5155d..143909af5 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/MusicPlaybackControlsTimeBarDrawFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/MusicPlaybackControlsTimeBarDrawFingerprint.kt @@ -1,8 +1,8 @@ -package app.revanced.patches.music.utils.sponsorblock.bytecode.fingerprints +package app.revanced.patches.music.utils.sponsorblock.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object MusicPlaybackControlsTimeBarDrawFingerprint : MethodFingerprint( +internal object MusicPlaybackControlsTimeBarDrawFingerprint : MethodFingerprint( returnType = "V", customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/MusicPlaybackControlsTimeBar;") diff --git a/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/MusicPlaybackControlsTimeBarOnMeasureFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/MusicPlaybackControlsTimeBarOnMeasureFingerprint.kt index 8435d1585..da7c262f1 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/MusicPlaybackControlsTimeBarOnMeasureFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/MusicPlaybackControlsTimeBarOnMeasureFingerprint.kt @@ -1,9 +1,9 @@ -package app.revanced.patches.music.utils.sponsorblock.bytecode.fingerprints +package app.revanced.patches.music.utils.sponsorblock.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object MusicPlaybackControlsTimeBarOnMeasureFingerprint : MethodFingerprint( +internal object MusicPlaybackControlsTimeBarOnMeasureFingerprint : MethodFingerprint( returnType = "V", opcodes = listOf( Opcode.IGET_OBJECT, diff --git a/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/SeekbarOnDrawFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/SeekbarOnDrawFingerprint.kt index b0013300e..48e8787fa 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/SeekbarOnDrawFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/sponsorblock/fingerprints/SeekbarOnDrawFingerprint.kt @@ -1,7 +1,7 @@ -package app.revanced.patches.music.utils.sponsorblock.bytecode.fingerprints +package app.revanced.patches.music.utils.sponsorblock.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object SeekbarOnDrawFingerprint : MethodFingerprint( +internal object SeekbarOnDrawFingerprint : MethodFingerprint( customFingerprint = { methodDef, _ -> methodDef.name == "onDraw" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/utils/videotype/VideoTypeHookPatch.kt b/src/main/kotlin/app/revanced/patches/music/utils/videotype/VideoTypeHookPatch.kt index 0cf6db34e..e1e988f6d 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/videotype/VideoTypeHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/videotype/VideoTypeHookPatch.kt @@ -10,10 +10,13 @@ import app.revanced.patches.music.utils.videotype.fingerprint.VideoTypeParentFin import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -@Suppress("unused") +@Suppress("SpellCheckingInspection", "unused") object VideoTypeHookPatch : BytecodePatch( setOf(VideoTypeParentFingerprint) ) { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = + "$UTILS_PATH/VideoTypeHookPatch;" + override fun execute(context: BytecodeContext) { VideoTypeParentFingerprint.result?.let { parentResult -> @@ -41,7 +44,4 @@ object VideoTypeHookPatch : BytecodePatch( } ?: throw VideoTypeFingerprint.exception } ?: throw VideoTypeParentFingerprint.exception } - - private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "$UTILS_PATH/VideoTypeHookPatch;" } diff --git a/src/main/kotlin/app/revanced/patches/music/utils/videotype/fingerprint/VideoTypeFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/videotype/fingerprint/VideoTypeFingerprint.kt index a6046385f..34fa9415f 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/videotype/fingerprint/VideoTypeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/videotype/fingerprint/VideoTypeFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object VideoTypeFingerprint : MethodFingerprint( +internal object VideoTypeFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/music/utils/videotype/fingerprint/VideoTypeParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/utils/videotype/fingerprint/VideoTypeParentFingerprint.kt index 83b2ccaa0..28a9a0010 100644 --- a/src/main/kotlin/app/revanced/patches/music/utils/videotype/fingerprint/VideoTypeParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/utils/videotype/fingerprint/VideoTypeParentFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object VideoTypeParentFingerprint : MethodFingerprint( +internal object VideoTypeParentFingerprint : MethodFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L", "L"), diff --git a/src/main/kotlin/app/revanced/patches/music/video/customspeed/CustomPlaybackSpeedBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/music/video/customspeed/CustomPlaybackSpeedBytecodePatch.kt new file mode 100644 index 000000000..3e4ae4f71 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/music/video/customspeed/CustomPlaybackSpeedBytecodePatch.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.music.video.customspeed + +import app.revanced.patches.music.utils.integrations.Constants.VIDEO_PATH +import app.revanced.patches.shared.customspeed.BaseCustomPlaybackSpeedPatch + +object CustomPlaybackSpeedBytecodePatch : BaseCustomPlaybackSpeedPatch( + "$VIDEO_PATH/CustomPlaybackSpeedPatch;", + 3.0f +) diff --git a/src/main/kotlin/app/revanced/patches/music/video/customspeed/CustomPlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/music/video/customspeed/CustomPlaybackSpeedPatch.kt index 2e509a19c..22b16f137 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/customspeed/CustomPlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/customspeed/CustomPlaybackSpeedPatch.kt @@ -1,42 +1,22 @@ package app.revanced.patches.music.video.customspeed -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.music.utils.integrations.Constants.VIDEO_PATH +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.settings.CategoryType import app.revanced.patches.music.utils.settings.SettingsPatch -import app.revanced.patches.shared.customspeed.AbstractCustomPlaybackSpeedPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object CustomPlaybackSpeedPatch : BaseResourcePatch( name = "Custom playback speed", description = "Adds an option to customize available playback speeds.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ], -) -@Suppress("unused") -object CustomPlaybackSpeedPatch : AbstractCustomPlaybackSpeedPatch( - "$VIDEO_PATH/CustomPlaybackSpeedPatch;", - 3.0f + dependencies = setOf( + CustomPlaybackSpeedBytecodePatch::class, + SettingsPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE ) { - override fun execute(context: BytecodeContext) { - super.execute(context) + override fun execute(context: ResourceContext) { SettingsPatch.addMusicPreferenceWithIntent( CategoryType.VIDEO, diff --git a/src/main/kotlin/app/revanced/patches/music/video/information/VideoInformationPatch.kt b/src/main/kotlin/app/revanced/patches/music/video/information/VideoInformationPatch.kt index 58a4232a4..306965575 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/information/VideoInformationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/information/VideoInformationPatch.kt @@ -17,6 +17,9 @@ import app.revanced.patches.music.video.information.fingerprints.VideoEndFingerp import app.revanced.patches.music.video.information.fingerprints.VideoLengthFingerprint import app.revanced.patches.music.video.videoid.VideoIdPatch import app.revanced.util.exception +import app.revanced.util.getTargetIndexWithFieldReferenceTypeReversed +import app.revanced.util.getTargetIndexWithMethodReferenceNameReversed +import app.revanced.util.getWalkerMethod import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -131,9 +134,9 @@ object VideoInformationPatch : BytecodePatch( ) }.result?.let { it.mutableMethod.apply { - val rectangleReference = - getInstruction(implementation!!.instructions.count() - 3).reference - rectangleFieldName = (rectangleReference as FieldReference).name + val invalidateIndex = getTargetIndexWithMethodReferenceNameReversed("invalidate") + val rectangleIndex = getTargetIndexWithFieldReferenceTypeReversed(invalidateIndex + 1, "Landroid/graphics/Rect;") + rectangleFieldName = (getInstruction(rectangleIndex).reference as FieldReference).name val videoLengthRegisterIndex = it.scanResult.patternScanResult!!.startIndex + 1 val videoLengthRegister = @@ -154,9 +157,7 @@ object VideoInformationPatch : BytecodePatch( * Set the video time method */ PlayerControllerSetTimeReferenceFingerprint.result?.let { - timeMethod = context.toMethodWalker(it.method) - .nextMethod(it.scanResult.patternScanResult!!.startIndex, true) - .getMethod() as MutableMethod + timeMethod = it.getWalkerMethod(context, it.scanResult.patternScanResult!!.startIndex) } ?: throw PlayerControllerSetTimeReferenceFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/BackgroundPlaybackVideoIdFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/BackgroundPlaybackVideoIdFingerprint.kt deleted file mode 100644 index eab38dbad..000000000 --- a/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/BackgroundPlaybackVideoIdFingerprint.kt +++ /dev/null @@ -1,16 +0,0 @@ -package app.revanced.patches.music.video.information.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -object BackgroundPlaybackVideoIdFingerprint : MethodFingerprint( - returnType = "V", - parameters = listOf("L", "L", "L"), - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - opcodes = listOf( - Opcode.INVOKE_INTERFACE, - Opcode.MOVE_RESULT_OBJECT - ) -) diff --git a/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/BackgroundPlaybackVideoIdParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/BackgroundPlaybackVideoIdParentFingerprint.kt deleted file mode 100644 index 578441bb1..000000000 --- a/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/BackgroundPlaybackVideoIdParentFingerprint.kt +++ /dev/null @@ -1,12 +0,0 @@ -package app.revanced.patches.music.video.information.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.AccessFlags - -object BackgroundPlaybackVideoIdParentFingerprint : MethodFingerprint( - returnType = "V", - parameters = emptyList(), - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - strings = listOf("currentWatchNextResponse") -) diff --git a/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/PlayerControllerSetTimeReferenceFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/PlayerControllerSetTimeReferenceFingerprint.kt index 96143fc82..fd3d8660c 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/PlayerControllerSetTimeReferenceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/PlayerControllerSetTimeReferenceFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.video.information.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object PlayerControllerSetTimeReferenceFingerprint : MethodFingerprint( +internal object PlayerControllerSetTimeReferenceFingerprint : MethodFingerprint( returnType = "V", opcodes = listOf( Opcode.INVOKE_DIRECT_RANGE, diff --git a/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/VideoEndFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/VideoEndFingerprint.kt index 156d4726b..1cf4df4ba 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/VideoEndFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/VideoEndFingerprint.kt @@ -2,6 +2,6 @@ package app.revanced.patches.music.video.information.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object VideoEndFingerprint : MethodFingerprint( +internal object VideoEndFingerprint : MethodFingerprint( strings = listOf("Attempting to seek during an ad") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/VideoLengthFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/VideoLengthFingerprint.kt index b95634548..09da6b37d 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/VideoLengthFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/information/fingerprints/VideoLengthFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.video.information.fingerprints import app.revanced.util.fingerprint.MethodReferenceNameFingerprint import com.android.tools.smali.dexlib2.Opcode -object VideoLengthFingerprint : MethodReferenceNameFingerprint( +internal object VideoLengthFingerprint : MethodReferenceNameFingerprint( opcodes = listOf( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT_WIDE, diff --git a/src/main/kotlin/app/revanced/patches/music/video/quality/VideoQualityPatch.kt b/src/main/kotlin/app/revanced/patches/music/video/quality/VideoQualityPatch.kt index efbb44997..57f53320f 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/quality/VideoQualityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/quality/VideoQualityPatch.kt @@ -3,10 +3,8 @@ package app.revanced.patches.music.video.quality import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.VIDEO_PATH import app.revanced.patches.music.utils.overridequality.OverrideQualityHookPatch import app.revanced.patches.music.utils.settings.CategoryType @@ -14,38 +12,24 @@ import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.music.video.quality.fingerprints.UserQualityChangeFingerprint import app.revanced.patches.music.video.videoid.VideoIdPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c -@Patch( +@Suppress("unused") +object VideoQualityPatch : BaseBytecodePatch( name = "Remember video quality", description = "Adds an option to remember the last video quality selected.", - dependencies = [ + dependencies = setOf( OverrideQualityHookPatch::class, SettingsPatch::class, VideoIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object VideoQualityPatch : BytecodePatch( - setOf(UserQualityChangeFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(UserQualityChangeFingerprint) ) { + private const val INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR = + "$VIDEO_PATH/VideoQualityPatch;" + override fun execute(context: BytecodeContext) { UserQualityChangeFingerprint.result?.let { @@ -81,7 +65,4 @@ object VideoQualityPatch : BytecodePatch( ) } - - private const val INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR = - "$VIDEO_PATH/VideoQualityPatch;" } diff --git a/src/main/kotlin/app/revanced/patches/music/video/quality/fingerprints/UserQualityChangeFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/video/quality/fingerprints/UserQualityChangeFingerprint.kt index 5cd6cff6d..180ae66c9 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/quality/fingerprints/UserQualityChangeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/quality/fingerprints/UserQualityChangeFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.music.video.quality.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object UserQualityChangeFingerprint : MethodFingerprint( +internal object UserQualityChangeFingerprint : MethodFingerprint( returnType = "V", opcodes = listOf( Opcode.CONST_STRING, diff --git a/src/main/kotlin/app/revanced/patches/music/video/speed/PlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/music/video/speed/PlaybackSpeedPatch.kt index 46a19b5ce..750f54d5a 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/speed/PlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/speed/PlaybackSpeedPatch.kt @@ -3,9 +3,7 @@ package app.revanced.patches.music.video.speed import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.music.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.music.utils.integrations.Constants.VIDEO_PATH import app.revanced.patches.music.utils.overridespeed.OverrideSpeedHookPatch import app.revanced.patches.music.utils.settings.CategoryType @@ -13,36 +11,19 @@ import app.revanced.patches.music.utils.settings.SettingsPatch import app.revanced.patches.music.video.speed.fingerprints.PlaybackSpeedBottomSheetFingerprint import app.revanced.patches.music.video.speed.fingerprints.PlaybackSpeedBottomSheetParentFingerprint import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -@Patch( +@Suppress("unused") +object PlaybackSpeedPatch : BaseBytecodePatch( name = "Remember playback speed", description = "Adds an option to remember the last playback speed selected.", - dependencies = [ + dependencies = setOf( OverrideSpeedHookPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.apps.youtube.music", - [ - "6.21.52", - "6.22.52", - "6.23.56", - "6.25.53", - "6.26.51", - "6.27.54", - "6.28.53", - "6.29.58", - "6.31.55", - "6.33.52" - ] - ) - ] -) -@Suppress("unused") -object PlaybackSpeedPatch : BytecodePatch( - setOf(PlaybackSpeedBottomSheetParentFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(PlaybackSpeedBottomSheetParentFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = "$VIDEO_PATH/PlaybackSpeedPatch;" diff --git a/src/main/kotlin/app/revanced/patches/music/video/speed/fingerprints/PlaybackSpeedBottomSheetFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/video/speed/fingerprints/PlaybackSpeedBottomSheetFingerprint.kt index 8e9d8bcb1..15ef29037 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/speed/fingerprints/PlaybackSpeedBottomSheetFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/speed/fingerprints/PlaybackSpeedBottomSheetFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object PlaybackSpeedBottomSheetFingerprint : MethodFingerprint( +internal object PlaybackSpeedBottomSheetFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/music/video/speed/fingerprints/PlaybackSpeedBottomSheetParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/video/speed/fingerprints/PlaybackSpeedBottomSheetParentFingerprint.kt index 75a264fc8..6751715b6 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/speed/fingerprints/PlaybackSpeedBottomSheetParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/speed/fingerprints/PlaybackSpeedBottomSheetParentFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object PlaybackSpeedBottomSheetParentFingerprint : MethodFingerprint( +internal object PlaybackSpeedBottomSheetParentFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/music/video/videoid/VideoIdPatch.kt b/src/main/kotlin/app/revanced/patches/music/video/videoid/VideoIdPatch.kt index 63e2e8474..a7d60b130 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/videoid/VideoIdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/videoid/VideoIdPatch.kt @@ -11,6 +11,7 @@ import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.music.video.videoid.fingerprints.PlayerResponseModelStoryboardRendererFingerprint import app.revanced.patches.music.video.videoid.fingerprints.VideoIdParentFingerprint import app.revanced.util.exception +import app.revanced.util.getTargetIndexReversed 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 @@ -66,9 +67,7 @@ object VideoIdPatch : BytecodePatch( override fun close () { backgroundPlaybackMethod.apply { - val videoIdIndex = implementation!!.instructions.indexOfLast { - it.opcode == Opcode.IGET_OBJECT - } + val videoIdIndex = getTargetIndexReversed(Opcode.IGET_OBJECT) val videoIdRegister = getInstruction(videoIdIndex).registerB val videoIdReference = getInstruction(videoIdIndex).reference val videoIdInstructionCall = "iget-object p0, v$videoIdRegister, $videoIdReference" diff --git a/src/main/kotlin/app/revanced/patches/music/video/videoid/fingerprints/VideoIdParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/music/video/videoid/fingerprints/VideoIdParentFingerprint.kt index 4c2de4ec4..c4272c94d 100644 --- a/src/main/kotlin/app/revanced/patches/music/video/videoid/fingerprints/VideoIdParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/music/video/videoid/fingerprints/VideoIdParentFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object VideoIdParentFingerprint : MethodFingerprint( +internal object VideoIdParentFingerprint : MethodFingerprint( returnType = "V", parameters = emptyList(), accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, diff --git a/src/main/kotlin/app/revanced/patches/reddit/ad/banner/HideBannerPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/ad/banner/BannerAdsPatch.kt similarity index 96% rename from src/main/kotlin/app/revanced/patches/reddit/ad/banner/HideBannerPatch.kt rename to src/main/kotlin/app/revanced/patches/reddit/ad/banner/BannerAdsPatch.kt index d1ddc70e2..724f14346 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/ad/banner/HideBannerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/ad/banner/BannerAdsPatch.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch @Suppress("DEPRECATION") -object HideBannerPatch : ResourcePatch() { +object BannerAdsPatch : ResourcePatch() { private const val RESOURCE_FILE_PATH = "res/layout/merge_listheader_link_detail.xml" override fun execute(context: ResourceContext) { context.xmlEditor[RESOURCE_FILE_PATH].use { diff --git a/src/main/kotlin/app/revanced/patches/reddit/ad/comments/HideCommentAdsPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/ad/comments/CommentAdsPatch.kt similarity index 83% rename from src/main/kotlin/app/revanced/patches/reddit/ad/comments/HideCommentAdsPatch.kt rename to src/main/kotlin/app/revanced/patches/reddit/ad/comments/CommentAdsPatch.kt index fc0ac4769..8c328992d 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/ad/comments/HideCommentAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/ad/comments/CommentAdsPatch.kt @@ -5,19 +5,19 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWith import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.reddit.ad.comments.fingerprints.HideCommentAdsFingerprint +import app.revanced.patches.reddit.ad.comments.fingerprints.CommentAdsFingerprint import app.revanced.patches.reddit.utils.integrations.Constants.PATCHES_PATH import app.revanced.util.exception import app.revanced.util.getWalkerMethod -object HideCommentAdsPatch : BytecodePatch( - setOf(HideCommentAdsFingerprint) +object CommentAdsPatch : BytecodePatch( + setOf(CommentAdsFingerprint) ) { private const val INTEGRATION_METHOD_DESCRIPTOR = "$PATCHES_PATH/GeneralAdsPatch;->hideCommentAds()Z" override fun execute(context: BytecodeContext) { - HideCommentAdsFingerprint.result?.apply { + CommentAdsFingerprint.result?.apply { val walkerMethod = getWalkerMethod(context, scanResult.patternScanResult!!.startIndex) walkerMethod.apply { addInstructionsWithLabels( @@ -31,7 +31,7 @@ object HideCommentAdsPatch : BytecodePatch( """, ExternalLabel("show", getInstruction(0)) ) } - } ?: throw HideCommentAdsFingerprint.exception + } ?: throw CommentAdsFingerprint.exception } } diff --git a/src/main/kotlin/app/revanced/patches/reddit/ad/comments/fingerprints/HideCommentAdsFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/ad/comments/fingerprints/CommentAdsFingerprint.kt similarity index 91% rename from src/main/kotlin/app/revanced/patches/reddit/ad/comments/fingerprints/HideCommentAdsFingerprint.kt rename to src/main/kotlin/app/revanced/patches/reddit/ad/comments/fingerprints/CommentAdsFingerprint.kt index 6d23c3f7d..d7efeb314 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/ad/comments/fingerprints/HideCommentAdsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/ad/comments/fingerprints/CommentAdsFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object HideCommentAdsFingerprint : MethodFingerprint( +internal object CommentAdsFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/reddit/ad/general/HideAdsPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/ad/general/AdsPatch.kt similarity index 73% rename from src/main/kotlin/app/revanced/patches/reddit/ad/general/HideAdsPatch.kt rename to src/main/kotlin/app/revanced/patches/reddit/ad/general/AdsPatch.kt index e6ecf30ed..40b3a0f48 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/ad/general/HideAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/ad/general/AdsPatch.kt @@ -4,50 +4,40 @@ import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.reddit.ad.banner.HideBannerPatch -import app.revanced.patches.reddit.ad.comments.HideCommentAdsPatch +import app.revanced.patches.reddit.ad.banner.BannerAdsPatch +import app.revanced.patches.reddit.ad.comments.CommentAdsPatch import app.revanced.patches.reddit.ad.general.fingerprints.AdPostFingerprint import app.revanced.patches.reddit.ad.general.fingerprints.NewAdPostFingerprint +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.reddit.utils.integrations.Constants.PATCHES_PATH import app.revanced.patches.reddit.utils.settings.SettingsBytecodePatch.updateSettingsStatus import app.revanced.patches.reddit.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getTargetIndexWithFieldReferenceName import app.revanced.util.getTargetIndexWithMethodReferenceName +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object AdsPatch : BaseBytecodePatch( name = "Hide ads", description = "Adds options to hide ads.", - dependencies = [HideBannerPatch::class, HideCommentAdsPatch::class, SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ], - requiresIntegrations = true, -) -@Suppress("unused") -object HideAdsPatch : BytecodePatch( - setOf( + dependencies = setOf( + BannerAdsPatch::class, + CommentAdsPatch::class, + SettingsPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( AdPostFingerprint, NewAdPostFingerprint - ) + ), + requiresIntegrations = true ) { - private const val INTEGRATIONS_OLD_METHOD_DESCRIPTOR = - "$PATCHES_PATH/GeneralAdsPatch;->hideOldPostAds(Ljava/util/List;)Ljava/util/List;" - - private const val INTEGRATIONS_NEW_METHOD_DESCRIPTOR = - "$PATCHES_PATH/GeneralAdsPatch;->hideNewPostAds()Z" + private const val INTEGRATIONS_CLASS_DESCRIPTOR = + "$PATCHES_PATH/GeneralAdsPatch;" override fun execute(context: BytecodeContext) { // region Filter promoted ads (does not work in popular or latest feed) @@ -58,7 +48,7 @@ object HideAdsPatch : BytecodePatch( addInstructions( targetIndex, """ - invoke-static {v$targetRegister}, $INTEGRATIONS_OLD_METHOD_DESCRIPTOR + invoke-static {v$targetRegister}, $INTEGRATIONS_CLASS_DESCRIPTOR->hideOldPostAds(Ljava/util/List;)Ljava/util/List; move-result-object v$targetRegister """ ) @@ -76,7 +66,7 @@ object HideAdsPatch : BytecodePatch( addInstructionsWithLabels( targetIndex, """ - invoke-static {}, $INTEGRATIONS_NEW_METHOD_DESCRIPTOR + invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->hideNewPostAds()Z move-result v$targetRegister if-nez v$targetRegister, :show """, ExternalLabel("show", getInstruction(targetIndex + 1)) diff --git a/src/main/kotlin/app/revanced/patches/reddit/ad/general/fingerprints/AdPostFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/ad/general/fingerprints/AdPostFingerprint.kt index ff7ef3937..c03351b83 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/ad/general/fingerprints/AdPostFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/ad/general/fingerprints/AdPostFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object AdPostFingerprint : MethodFingerprint( +internal object AdPostFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, opcodes = listOf( @@ -17,5 +17,9 @@ object AdPostFingerprint : MethodFingerprint( "children", "uxExperiences" ), - customFingerprint = { methodDef, classDef -> methodDef.definingClass.endsWith("/Listing;") && methodDef.name == "" && classDef.sourceFile == "Listing.kt" }, + customFingerprint = { methodDef, classDef -> + methodDef.definingClass.endsWith("/Listing;") + && methodDef.name == "" + && classDef.sourceFile == "Listing.kt" + }, ) diff --git a/src/main/kotlin/app/revanced/patches/reddit/ad/general/fingerprints/NewAdPostFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/ad/general/fingerprints/NewAdPostFingerprint.kt index d8f72ea30..9deb15958 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/ad/general/fingerprints/NewAdPostFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/ad/general/fingerprints/NewAdPostFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object NewAdPostFingerprint : MethodFingerprint( +internal object NewAdPostFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, opcodes = listOf(Opcode.INVOKE_VIRTUAL), diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/branding/name/CustomBrandingNamePatch.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/branding/name/CustomBrandingNamePatch.kt index f014dd5a0..177866895 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/branding/name/CustomBrandingNamePatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/branding/name/CustomBrandingNamePatch.kt @@ -1,29 +1,19 @@ package app.revanced.patches.reddit.layout.branding.name import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.util.patch.BaseResourcePatch import java.io.FileWriter import java.nio.file.Files -@Patch( +@Suppress("DEPRECATION", "unused") +object CustomBrandingNamePatch : BaseResourcePatch( name = "Custom branding name Reddit", description = "Renames the Reddit app to the name specified in options.json.", - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ], + compatiblePackages = COMPATIBLE_PACKAGE, use = false -) -@Suppress("DEPRECATION", "unused") -object CustomBrandingNamePatch : ResourcePatch() { +) { private const val ORIGINAL_APP_NAME = "Reddit" private const val APP_NAME = "RVX Reddit" diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/branding/packagename/ChangePackageNamePatch.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/branding/packagename/ChangePackageNamePatch.kt index 03baf91c0..18d1d638b 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/branding/packagename/ChangePackageNamePatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/branding/packagename/ChangePackageNamePatch.kt @@ -1,29 +1,19 @@ package app.revanced.patches.reddit.layout.branding.packagename import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.util.patch.BaseResourcePatch import org.w3c.dom.Element import java.io.Closeable -@Patch( +@Suppress("DEPRECATION", "unused") +object ChangePackageNamePatch : BaseResourcePatch( name = "Change package name", description = "Changes the package name for Reddit to the name specified in options.json.", - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ], + compatiblePackages = COMPATIBLE_PACKAGE, use = false -) -@Suppress("DEPRECATION", "unused") -object ChangePackageNamePatch : ResourcePatch(), Closeable { +), Closeable { private const val PACKAGE_NAME_REDDIT = "com.reddit.frontpage" private const val CLONE_PACKAGE_NAME_REDDIT = "$PACKAGE_NAME_REDDIT.revanced" private const val DEFAULT_PACKAGE_NAME_REDDIT = "$PACKAGE_NAME_REDDIT.rvx" diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/navigation/NavigationButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/navigation/NavigationButtonsPatch.kt index b509a1d79..4a301daa4 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/navigation/NavigationButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/navigation/NavigationButtonsPatch.kt @@ -3,33 +3,22 @@ package app.revanced.patches.reddit.layout.navigation import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.reddit.layout.navigation.fingerprints.BottomNavScreenFingerprint +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.reddit.utils.integrations.Constants.PATCHES_PATH import app.revanced.patches.reddit.utils.settings.SettingsBytecodePatch.updateSettingsStatus import app.revanced.patches.reddit.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -@Patch( +@Suppress("unused") +object NavigationButtonsPatch : BaseBytecodePatch( name = "Hide navigation buttons", description = "Adds options to hide buttons in the navigation bar.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ] -) -@Suppress("unused") -object NavigationButtonsPatch : BytecodePatch( - setOf(BottomNavScreenFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(BottomNavScreenFingerprint) ) { private const val INTEGRATIONS_METHOD_DESCRIPTOR = "$PATCHES_PATH/NavigationButtonsPatch;->hideNavigationButtons(Landroid/view/ViewGroup;)V" diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/navigation/fingerprints/BottomNavScreenFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/navigation/fingerprints/BottomNavScreenFingerprint.kt index 0778a0c7e..660204a77 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/navigation/fingerprints/BottomNavScreenFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/navigation/fingerprints/BottomNavScreenFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object BottomNavScreenFingerprint : MethodFingerprint( +internal object BottomNavScreenFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/PremiumIconPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/PremiumIconPatch.kt index c7611abb0..ab8a048ea 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/PremiumIconPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/PremiumIconPatch.kt @@ -2,28 +2,17 @@ package app.revanced.patches.reddit.layout.premiumicon import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.reddit.layout.premiumicon.fingerprints.PremiumIconFingerprint +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object PremiumIconPatch : BaseBytecodePatch( name = "Premium icon", description = "Unlocks premium app icons.", - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ] -) -@Suppress("unused") -object PremiumIconPatch : BytecodePatch( - setOf(PremiumIconFingerprint) + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(PremiumIconFingerprint) ) { override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/fingerprints/PremiumIconFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/fingerprints/PremiumIconFingerprint.kt index 9d3aeeae4..af43f14cf 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/fingerprints/PremiumIconFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/fingerprints/PremiumIconFingerprint.kt @@ -2,10 +2,11 @@ package app.revanced.patches.reddit.layout.premiumicon.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object PremiumIconFingerprint : MethodFingerprint( +internal object PremiumIconFingerprint : MethodFingerprint( returnType = "Z", customFingerprint = { methodDef, classDef -> methodDef.definingClass.endsWith("/MyAccount;") - && methodDef.name == "isPremiumSubscriber" && classDef.sourceFile == "MyAccount.kt" + && methodDef.name == "isPremiumSubscriber" + && classDef.sourceFile == "MyAccount.kt" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/recentlyvisited/RecentlyVisitedShelfPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/recentlyvisited/RecentlyVisitedShelfPatch.kt index a005b7b5b..ea4e63f34 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/recentlyvisited/RecentlyVisitedShelfPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/recentlyvisited/RecentlyVisitedShelfPatch.kt @@ -3,11 +3,9 @@ package app.revanced.patches.reddit.layout.recentlyvisited import app.revanced.patcher.data.BytecodeContext 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.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.reddit.layout.recentlyvisited.fingerprints.CommunityDrawerPresenterFingerprint +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.reddit.utils.integrations.Constants.PATCHES_PATH import app.revanced.patches.reddit.utils.settings.SettingsBytecodePatch.updateSettingsStatus import app.revanced.patches.reddit.utils.settings.SettingsPatch @@ -16,31 +14,24 @@ import app.revanced.util.getTargetIndex import app.revanced.util.getTargetIndexReversed import app.revanced.util.getTargetIndexWithFieldReferenceName import app.revanced.util.getTargetIndexWithReference +import app.revanced.util.patch.BaseBytecodePatch 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.Reference -@Patch( +@Suppress("unused") +object RecentlyVisitedShelfPatch : BaseBytecodePatch( name = "Hide recently visited shelf", description = "Adds an option to hide the recently visited shelf in the sidebar.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ] -) -@Suppress("unused") -object RecentlyVisitedShelfPatch : BytecodePatch( - setOf(CommunityDrawerPresenterFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(CommunityDrawerPresenterFingerprint) ) { private const val INTEGRATIONS_METHOD_DESCRIPTOR = - "$PATCHES_PATH/RecentlyVisitedShelfPatch;->hideRecentlyVisitedShelf(Ljava/util/List;)Ljava/util/List;" + "$PATCHES_PATH/RecentlyVisitedShelfPatch;" + + "->" + + "hideRecentlyVisitedShelf(Ljava/util/List;)Ljava/util/List;" override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/recentlyvisited/fingerprints/CommunityDrawerPresenterFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/recentlyvisited/fingerprints/CommunityDrawerPresenterFingerprint.kt index 74d0e6a4c..c7dc57cca 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/recentlyvisited/fingerprints/CommunityDrawerPresenterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/recentlyvisited/fingerprints/CommunityDrawerPresenterFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object CommunityDrawerPresenterFingerprint : MethodFingerprint( +internal object CommunityDrawerPresenterFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/screenshotpopup/ScreenshotPopupPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/screenshotpopup/ScreenshotPopupPatch.kt index 341912cde..3690d1c4b 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/screenshotpopup/ScreenshotPopupPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/screenshotpopup/ScreenshotPopupPatch.kt @@ -3,34 +3,26 @@ package app.revanced.patches.reddit.layout.screenshotpopup import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.reddit.layout.screenshotpopup.fingerprints.ScreenshotTakenBannerFingerprint +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.reddit.utils.integrations.Constants.PATCHES_PATH import app.revanced.patches.reddit.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.reddit.utils.settings.SettingsBytecodePatch.updateSettingsStatus import app.revanced.patches.reddit.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object ScreenshotPopupPatch : BaseBytecodePatch( name = "Disable screenshot popup", description = "Adds an option to disable the popup that shows up when taking a screenshot.", - dependencies = [SettingsPatch::class, SharedResourceIdPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ] -) -@Suppress("unused") -object ScreenshotPopupPatch : BytecodePatch( - setOf(ScreenshotTakenBannerFingerprint) + dependencies = setOf( + SettingsPatch::class, + SharedResourceIdPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(ScreenshotTakenBannerFingerprint) ) { private const val INTEGRATIONS_METHOD_DESCRIPTOR = "$PATCHES_PATH/ScreenshotPopupPatch;->disableScreenshotPopup()Z" diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/screenshotpopup/fingerprints/ScreenshotTakenBannerFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/screenshotpopup/fingerprints/ScreenshotTakenBannerFingerprint.kt index 15659aae2..541efade0 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/screenshotpopup/fingerprints/ScreenshotTakenBannerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/screenshotpopup/fingerprints/ScreenshotTakenBannerFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.patches.reddit.utils.resourceid.SharedResourceIdPatch.Screen import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags -object ScreenshotTakenBannerFingerprint : MethodFingerprint( +internal object ScreenshotTakenBannerFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, customFingerprint = { methodDef, classDef -> diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/RemoveSubRedditDialogPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/SubRedditDialogPatch.kt similarity index 85% rename from src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/RemoveSubRedditDialogPatch.kt rename to src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/SubRedditDialogPatch.kt index e0a4d1145..caa94ebf9 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/RemoveSubRedditDialogPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/SubRedditDialogPatch.kt @@ -3,11 +3,9 @@ package app.revanced.patches.reddit.layout.subredditdialog import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.reddit.layout.subredditdialog.fingerprints.FrequentUpdatesSheetScreenFingerprint import app.revanced.patches.reddit.layout.subredditdialog.fingerprints.RedditAlertDialogsFingerprint +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.reddit.utils.integrations.Constants.PATCHES_PATH import app.revanced.patches.reddit.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.reddit.utils.resourceid.SharedResourceIdPatch.CancelButton @@ -16,26 +14,20 @@ import app.revanced.patches.reddit.utils.settings.SettingsBytecodePatch.updateSe import app.revanced.patches.reddit.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object SubRedditDialogPatch : BaseBytecodePatch( name = "Remove subreddit dialog", description = "Adds options to remove the NSFW community warning and notifications suggestion dialogs by dismissing them automatically.", - dependencies = [SettingsPatch::class, SharedResourceIdPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ] -) -@Suppress("unused") -object RemoveSubRedditDialogPatch : BytecodePatch( - setOf( + dependencies = setOf( + SettingsPatch::class, + SharedResourceIdPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( FrequentUpdatesSheetScreenFingerprint, RedditAlertDialogsFingerprint ) diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/fingerprints/FrequentUpdatesSheetScreenFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/fingerprints/FrequentUpdatesSheetScreenFingerprint.kt index c96ea2a45..33e648aac 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/fingerprints/FrequentUpdatesSheetScreenFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/fingerprints/FrequentUpdatesSheetScreenFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.patches.reddit.utils.resourceid.SharedResourceIdPatch.Cancel import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags -object FrequentUpdatesSheetScreenFingerprint : MethodFingerprint( +internal object FrequentUpdatesSheetScreenFingerprint : MethodFingerprint( returnType = "Landroid/view/View;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, customFingerprint = { methodDef, classDef -> diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/fingerprints/RedditAlertDialogsFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/fingerprints/RedditAlertDialogsFingerprint.kt index f11daf975..44515f97b 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/fingerprints/RedditAlertDialogsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/subredditdialog/fingerprints/RedditAlertDialogsFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.patches.reddit.utils.resourceid.SharedResourceIdPatch.TextAp import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags -object RedditAlertDialogsFingerprint : MethodFingerprint( +internal object RedditAlertDialogsFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, customFingerprint = { methodDef, classDef -> diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/toolbar/ToolBarButtonPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/toolbar/ToolBarButtonPatch.kt index 20388478f..6c8b80c3d 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/toolbar/ToolBarButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/toolbar/ToolBarButtonPatch.kt @@ -3,10 +3,8 @@ package app.revanced.patches.reddit.layout.toolbar import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.reddit.layout.toolbar.fingerprints.HomePagerScreenFingerprint +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.reddit.utils.integrations.Constants.PATCHES_PATH import app.revanced.patches.reddit.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.reddit.utils.resourceid.SharedResourceIdPatch.ToolBarNavSearchCtaContainer @@ -14,29 +12,19 @@ import app.revanced.patches.reddit.utils.settings.SettingsBytecodePatch.updateSe import app.revanced.patches.reddit.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object ToolBarButtonPatch : BaseBytecodePatch( name = "Hide toolbar button", description = "Adds an option to hide the r/place or Reddit recap button in the toolbar.", - dependencies = - [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ] -) -@Suppress("unused") -object ToolBarButtonPatch : BytecodePatch( - setOf(HomePagerScreenFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(HomePagerScreenFingerprint) ) { private const val INTEGRATIONS_METHOD_DESCRIPTOR = "$PATCHES_PATH/ToolBarButtonPatch;->hideToolBarButton(Landroid/view/View;)V" diff --git a/src/main/kotlin/app/revanced/patches/reddit/layout/toolbar/fingerprints/HomePagerScreenFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/layout/toolbar/fingerprints/HomePagerScreenFingerprint.kt index bab257b10..4f42a5df8 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/layout/toolbar/fingerprints/HomePagerScreenFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/layout/toolbar/fingerprints/HomePagerScreenFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.patches.reddit.utils.resourceid.SharedResourceIdPatch.ToolBa import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags -object HomePagerScreenFingerprint : MethodFingerprint( +internal object HomePagerScreenFingerprint : MethodFingerprint( returnType = "Landroid/view/View;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/LayoutInflater;", "Landroid/view/ViewGroup;"), diff --git a/src/main/kotlin/app/revanced/patches/reddit/misc/openlink/OpenLinksDirectlyPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/misc/openlink/OpenLinksDirectlyPatch.kt index 7337f99f4..067fe112b 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/misc/openlink/OpenLinksDirectlyPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/misc/openlink/OpenLinksDirectlyPatch.kt @@ -2,35 +2,26 @@ package app.revanced.patches.reddit.misc.openlink import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.reddit.misc.openlink.fingerprints.ScreenNavigatorFingerprint +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.reddit.utils.integrations.Constants.PATCHES_PATH import app.revanced.patches.reddit.utils.settings.SettingsBytecodePatch.updateSettingsStatus import app.revanced.patches.reddit.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object OpenLinksDirectlyPatch : BaseBytecodePatch( name = "Open links directly", description = "Adds an option to skip over redirection URLs in external links.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ] -) -@Suppress("unused") -object OpenLinksDirectlyPatch : BytecodePatch( - setOf(ScreenNavigatorFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(ScreenNavigatorFingerprint) ) { private const val INTEGRATIONS_METHOD_DESCRIPTOR = - "$PATCHES_PATH/OpenLinksDirectlyPatch;->parseRedirectUri(Landroid/net/Uri;)Landroid/net/Uri;" + "$PATCHES_PATH/OpenLinksDirectlyPatch;" + + "->" + + "parseRedirectUri(Landroid/net/Uri;)Landroid/net/Uri;" override fun execute(context: BytecodeContext) { ScreenNavigatorFingerprint.result?.let { diff --git a/src/main/kotlin/app/revanced/patches/reddit/misc/openlink/OpenLinksExternallyPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/misc/openlink/OpenLinksExternallyPatch.kt index d158d557a..6c6e0fd53 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/misc/openlink/OpenLinksExternallyPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/misc/openlink/OpenLinksExternallyPatch.kt @@ -3,34 +3,23 @@ package app.revanced.patches.reddit.misc.openlink import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.reddit.misc.openlink.fingerprints.ScreenNavigatorFingerprint +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.reddit.utils.integrations.Constants.PATCHES_PATH import app.revanced.patches.reddit.utils.settings.SettingsBytecodePatch.updateSettingsStatus import app.revanced.patches.reddit.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getStringInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object OpenLinksExternallyPatch : BaseBytecodePatch( name = "Open links externally", description = "Adds an option to always open links in your browser instead of in the in-app-browser.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ] -) -@Suppress("unused") -object OpenLinksExternallyPatch : BytecodePatch( - setOf(ScreenNavigatorFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(ScreenNavigatorFingerprint) ) { private const val INTEGRATIONS_METHOD_DESCRIPTOR = "$PATCHES_PATH/OpenLinksExternallyPatch;" diff --git a/src/main/kotlin/app/revanced/patches/reddit/misc/openlink/fingerprints/ScreenNavigatorFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/misc/openlink/fingerprints/ScreenNavigatorFingerprint.kt index cd8d1abf2..9892550f0 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/misc/openlink/fingerprints/ScreenNavigatorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/misc/openlink/fingerprints/ScreenNavigatorFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ScreenNavigatorFingerprint : MethodFingerprint( +internal object ScreenNavigatorFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt index cb740530f..26b6f959a 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt @@ -3,33 +3,22 @@ package app.revanced.patches.reddit.misc.tracking.url import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.reddit.misc.tracking.url.fingerprints.ShareLinkFormatterFingerprint +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.reddit.utils.integrations.Constants.PATCHES_PATH import app.revanced.patches.reddit.utils.settings.SettingsBytecodePatch.updateSettingsStatus import app.revanced.patches.reddit.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object SanitizeUrlQueryPatch : BaseBytecodePatch( name = "Sanitize sharing links", description = "Adds an option to remove tracking query parameters from URLs when sharing links.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ] -) -@Suppress("unused") -object SanitizeUrlQueryPatch : BytecodePatch( - setOf(ShareLinkFormatterFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(ShareLinkFormatterFingerprint) ) { private const val SANITIZE_METHOD_DESCRIPTOR = "$PATCHES_PATH/SanitizeUrlQueryPatch;->stripQueryParameters()Z" diff --git a/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/fingerprints/ShareLinkFormatterFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/fingerprints/ShareLinkFormatterFingerprint.kt index fd4ef96e4..efb4135fe 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/fingerprints/ShareLinkFormatterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/fingerprints/ShareLinkFormatterFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.reddit.misc.tracking.url.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object ShareLinkFormatterFingerprint : MethodFingerprint( +internal object ShareLinkFormatterFingerprint : MethodFingerprint( returnType = "Ljava/lang/String;", parameters = listOf("Ljava/lang/String;", "Ljava/util/Map;"), customFingerprint = { methodDef, classDef -> diff --git a/src/main/kotlin/app/revanced/patches/reddit/utils/integrations/Constants.kt b/src/main/kotlin/app/revanced/patches/reddit/utils/integrations/Constants.kt index f8555307e..8541d7008 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/utils/integrations/Constants.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/utils/integrations/Constants.kt @@ -1,7 +1,19 @@ package app.revanced.patches.reddit.utils.integrations -@Suppress("MemberVisibilityCanBePrivate") +import app.revanced.patcher.patch.Patch + +@Suppress("MemberVisibilityCanBePrivate", "SpellCheckingInspection") object Constants { const val INTEGRATIONS_PATH = "Lapp/revanced/integrations/reddit" const val PATCHES_PATH = "$INTEGRATIONS_PATH/patches" + + val COMPATIBLE_PACKAGE = setOf( + Patch.CompatiblePackage( + "com.reddit.frontpage", + setOf( + "2023.12.0", + "2024.04.0" + ) + ) + ) } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/reddit/utils/integrations/fingerprints/InitFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/utils/integrations/fingerprints/InitFingerprint.kt index 05b51f66b..d5d3dbcad 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/utils/integrations/fingerprints/InitFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/utils/integrations/fingerprints/InitFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.reddit.utils.integrations.fingerprints import app.revanced.patches.shared.integrations.BaseIntegrationsPatch.IntegrationsFingerprint @Suppress("DEPRECATION") -object InitFingerprint : IntegrationsFingerprint( +internal object InitFingerprint : IntegrationsFingerprint( customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/FrontpageApplication;") && methodDef.name == "onCreate" diff --git a/src/main/kotlin/app/revanced/patches/reddit/utils/settings/SettingsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/reddit/utils/settings/SettingsBytecodePatch.kt index 0645353d3..3f07599d7 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/utils/settings/SettingsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/utils/settings/SettingsBytecodePatch.kt @@ -33,10 +33,10 @@ object SettingsBytecodePatch : BytecodePatch( private const val INTEGRATIONS_METHOD_DESCRIPTOR = "$INTEGRATIONS_PATH/settings/ActivityHook;->initialize(Landroid/app/Activity;)V" - private lateinit var settingsMethod: MutableMethod + private lateinit var settingsStatusLoadMethod: MutableMethod internal fun updateSettingsStatus(description: String) { - settingsMethod.addInstruction( + settingsStatusLoadMethod.addInstruction( 0, "invoke-static {}, $INTEGRATIONS_PATH/settings/SettingsStatus;->$description()V" ) @@ -92,7 +92,7 @@ object SettingsBytecodePatch : BytecodePatch( } } ?: throw OssLicensesMenuActivityOnCreateFingerprint.exception - settingsMethod = SettingsStatusLoadFingerprint.result?.mutableMethod + settingsStatusLoadMethod = SettingsStatusLoadFingerprint.result?.mutableMethod ?: throw SettingsStatusLoadFingerprint.exception } diff --git a/src/main/kotlin/app/revanced/patches/reddit/utils/settings/SettingsPatch.kt b/src/main/kotlin/app/revanced/patches/reddit/utils/settings/SettingsPatch.kt index f83305ccf..ce86cefa6 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/utils/settings/SettingsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/utils/settings/SettingsPatch.kt @@ -2,32 +2,22 @@ package app.revanced.patches.reddit.utils.settings import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.reddit.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.reddit.utils.integrations.IntegrationsPatch +import app.revanced.util.patch.BaseResourcePatch import kotlin.io.path.exists -@Patch( +@Suppress("DEPRECATION") +object SettingsPatch : BaseResourcePatch( name = "Settings", description = "Adds ReVanced Extended settings to Reddit.", - dependencies = [ + dependencies = setOf( IntegrationsPatch::class, SettingsBytecodePatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.reddit.frontpage", - [ - "2023.12.0", - "2024.04.0" - ] - ) - ], - requiresIntegrations = true, -) -@Suppress("DEPRECATION") -object SettingsPatch : ResourcePatch() { + ), + compatiblePackages = COMPATIBLE_PACKAGE, + requiresIntegrations = true +) { override fun execute(context: ResourceContext) { /** diff --git a/src/main/kotlin/app/revanced/patches/reddit/utils/settings/fingerprints/AcknowledgementsLabelBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/utils/settings/fingerprints/AcknowledgementsLabelBuilderFingerprint.kt index 257a12645..6954a037c 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/utils/settings/fingerprints/AcknowledgementsLabelBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/utils/settings/fingerprints/AcknowledgementsLabelBuilderFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.patches.reddit.utils.resourceid.SharedResourceIdPatch.LabelA import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags -object AcknowledgementsLabelBuilderFingerprint : MethodFingerprint( +internal object AcknowledgementsLabelBuilderFingerprint : MethodFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroidx/preference/Preference;"), diff --git a/src/main/kotlin/app/revanced/patches/reddit/utils/settings/fingerprints/OssLicensesMenuActivityOnCreateFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/utils/settings/fingerprints/OssLicensesMenuActivityOnCreateFingerprint.kt index d622cbd33..a33560555 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/utils/settings/fingerprints/OssLicensesMenuActivityOnCreateFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/utils/settings/fingerprints/OssLicensesMenuActivityOnCreateFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.reddit.utils.settings.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object OssLicensesMenuActivityOnCreateFingerprint : MethodFingerprint( +internal object OssLicensesMenuActivityOnCreateFingerprint : MethodFingerprint( returnType = "V", opcodes = listOf( Opcode.IGET_BOOLEAN, diff --git a/src/main/kotlin/app/revanced/patches/reddit/utils/settings/fingerprints/SettingsStatusLoadFingerprint.kt b/src/main/kotlin/app/revanced/patches/reddit/utils/settings/fingerprints/SettingsStatusLoadFingerprint.kt index e539fb1e2..1d044bec7 100644 --- a/src/main/kotlin/app/revanced/patches/reddit/utils/settings/fingerprints/SettingsStatusLoadFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/reddit/utils/settings/fingerprints/SettingsStatusLoadFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.reddit.utils.settings.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patches.reddit.utils.integrations.Constants.INTEGRATIONS_PATH -object SettingsStatusLoadFingerprint : MethodFingerprint( +internal object SettingsStatusLoadFingerprint : MethodFingerprint( customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("$INTEGRATIONS_PATH/settings/SettingsStatus;") && methodDef.name == "load" diff --git a/src/main/kotlin/app/revanced/patches/shared/ads/AbstractAdsPatch.kt b/src/main/kotlin/app/revanced/patches/shared/ads/BaseAdsPatch.kt similarity index 98% rename from src/main/kotlin/app/revanced/patches/shared/ads/AbstractAdsPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/ads/BaseAdsPatch.kt index 6b47286cc..287849422 100644 --- a/src/main/kotlin/app/revanced/patches/shared/ads/AbstractAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/ads/BaseAdsPatch.kt @@ -15,7 +15,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.MethodReference -abstract class AbstractAdsPatch( +abstract class BaseAdsPatch( private val classDescriptor: String, private val methodDescriptor: String ) : BytecodePatch( diff --git a/src/main/kotlin/app/revanced/patches/shared/ads/fingerprints/MusicAdsFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/ads/fingerprints/MusicAdsFingerprint.kt index 94b92dcd7..f3fb5c800 100644 --- a/src/main/kotlin/app/revanced/patches/shared/ads/fingerprints/MusicAdsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/ads/fingerprints/MusicAdsFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object MusicAdsFingerprint : LiteralValueFingerprint( +internal object MusicAdsFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/shared/ads/fingerprints/VideoAdsFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/ads/fingerprints/VideoAdsFingerprint.kt index 65256d765..1368233d3 100644 --- a/src/main/kotlin/app/revanced/patches/shared/ads/fingerprints/VideoAdsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/ads/fingerprints/VideoAdsFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.shared.ads.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object VideoAdsFingerprint : MethodFingerprint( +internal object VideoAdsFingerprint : MethodFingerprint( returnType = "V", strings = listOf("markFillRequested", "requestEnterSlot") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/captions/AbstractAutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/shared/captions/BaseAutoCaptionsPatch.kt similarity index 98% rename from src/main/kotlin/app/revanced/patches/shared/captions/AbstractAutoCaptionsPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/captions/BaseAutoCaptionsPatch.kt index e7110ebac..d147f76d8 100644 --- a/src/main/kotlin/app/revanced/patches/shared/captions/AbstractAutoCaptionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/captions/BaseAutoCaptionsPatch.kt @@ -15,7 +15,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.reference.MethodReference -abstract class AbstractAutoCaptionsPatch( +abstract class BaseAutoCaptionsPatch( private val classDescriptor: String ) : BytecodePatch( setOf( diff --git a/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/StartVideoInformerFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/StartVideoInformerFingerprint.kt index 90730fcab..4cf71adad 100644 --- a/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/StartVideoInformerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/StartVideoInformerFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object StartVideoInformerFingerprint : MethodFingerprint( +internal object StartVideoInformerFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/SubtitleTrackFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/SubtitleTrackFingerprint.kt index 5763545ae..4d5f9a8b5 100644 --- a/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/SubtitleTrackFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/captions/fingerprints/SubtitleTrackFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SubtitleTrackFingerprint : MethodFingerprint( +internal object SubtitleTrackFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/shared/customspeed/AbstractCustomPlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/shared/customspeed/BaseCustomPlaybackSpeedPatch.kt similarity index 98% rename from src/main/kotlin/app/revanced/patches/shared/customspeed/AbstractCustomPlaybackSpeedPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/customspeed/BaseCustomPlaybackSpeedPatch.kt index 6fbc47b84..2bcb3f0a6 100644 --- a/src/main/kotlin/app/revanced/patches/shared/customspeed/AbstractCustomPlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/customspeed/BaseCustomPlaybackSpeedPatch.kt @@ -15,7 +15,7 @@ import app.revanced.util.indexOfFirstInstruction import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -abstract class AbstractCustomPlaybackSpeedPatch( +abstract class BaseCustomPlaybackSpeedPatch( private val descriptor: String, private val maxSpeed: Float ) : BytecodePatch( diff --git a/src/main/kotlin/app/revanced/patches/shared/customspeed/fingerprints/SpeedArrayGeneratorFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/customspeed/fingerprints/SpeedArrayGeneratorFingerprint.kt index 64125aeb6..3ef1b18f7 100644 --- a/src/main/kotlin/app/revanced/patches/shared/customspeed/fingerprints/SpeedArrayGeneratorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/customspeed/fingerprints/SpeedArrayGeneratorFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SpeedArrayGeneratorFingerprint : MethodFingerprint( +internal object SpeedArrayGeneratorFingerprint : MethodFingerprint( returnType = "[L", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/shared/customspeed/fingerprints/SpeedLimiterFallBackFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/customspeed/fingerprints/SpeedLimiterFallBackFingerprint.kt index 79d76d45b..16c6771ca 100644 --- a/src/main/kotlin/app/revanced/patches/shared/customspeed/fingerprints/SpeedLimiterFallBackFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/customspeed/fingerprints/SpeedLimiterFallBackFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SpeedLimiterFallBackFingerprint : MethodFingerprint( +internal object SpeedLimiterFallBackFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/shared/customspeed/fingerprints/SpeedLimiterFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/customspeed/fingerprints/SpeedLimiterFingerprint.kt index efd40f8bd..f3b4ba966 100644 --- a/src/main/kotlin/app/revanced/patches/shared/customspeed/fingerprints/SpeedLimiterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/customspeed/fingerprints/SpeedLimiterFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SpeedLimiterFingerprint : MethodFingerprint( +internal object SpeedLimiterFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("F"), diff --git a/src/main/kotlin/app/revanced/patches/shared/dialog/AbstractRemoveViewerDiscretionDialogPatch.kt b/src/main/kotlin/app/revanced/patches/shared/dialog/BaseViewerDiscretionDialogPatch.kt similarity index 97% rename from src/main/kotlin/app/revanced/patches/shared/dialog/AbstractRemoveViewerDiscretionDialogPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/dialog/BaseViewerDiscretionDialogPatch.kt index a0b1c66d2..1a5820f0f 100644 --- a/src/main/kotlin/app/revanced/patches/shared/dialog/AbstractRemoveViewerDiscretionDialogPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/dialog/BaseViewerDiscretionDialogPatch.kt @@ -12,7 +12,7 @@ import app.revanced.util.getTargetIndexWithMethodReferenceName import app.revanced.util.getWalkerMethod import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -abstract class AbstractRemoveViewerDiscretionDialogPatch( +abstract class BaseViewerDiscretionDialogPatch( private val classDescriptor: String, private val additionalFingerprints: Set = emptySet() ) : BytecodePatch( diff --git a/src/main/kotlin/app/revanced/patches/shared/drawable/fingerprints/DrawableFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/drawable/fingerprints/DrawableFingerprint.kt index 2d2dc3205..b6eff75e5 100644 --- a/src/main/kotlin/app/revanced/patches/shared/drawable/fingerprints/DrawableFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/drawable/fingerprints/DrawableFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object DrawableFingerprint : MethodFingerprint( +internal object DrawableFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/shared/elements/AbstractRemoveStringsElementsPatch.kt b/src/main/kotlin/app/revanced/patches/shared/elements/StringsElementsUtils.kt similarity index 51% rename from src/main/kotlin/app/revanced/patches/shared/elements/AbstractRemoveStringsElementsPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/elements/StringsElementsUtils.kt index 73a2b7f17..3431d5c8d 100644 --- a/src/main/kotlin/app/revanced/patches/shared/elements/AbstractRemoveStringsElementsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/elements/StringsElementsUtils.kt @@ -1,21 +1,18 @@ package app.revanced.patches.shared.elements import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import kotlin.io.path.exists @Suppress("DEPRECATION") -abstract class AbstractRemoveStringsElementsPatch( - private val paths: Array, - private val replacements: Array -) : ResourcePatch() { - override fun execute(context: ResourceContext) { +object StringsElementsUtils { + internal fun ResourceContext.removeStringsElements( + paths: Array, + replacements: Array + ) { paths.forEach { path -> - val resDirectory = context["res"] - val targetXmlPath = resDirectory.resolve(path).resolve("strings.xml").toPath() + val targetXmlPath = this["res"].resolve(path).resolve("strings.xml") if (targetXmlPath.exists()) { - val targetXml = context["res/$path/strings.xml"] + val targetXml = this["res/$path/strings.xml"] replacements.forEach replacementsLoop@{ replacement -> targetXml.writeText( @@ -27,3 +24,4 @@ abstract class AbstractRemoveStringsElementsPatch( } } } + diff --git a/src/main/kotlin/app/revanced/patches/shared/gms/BaseGmsCoreSupportPatch.kt b/src/main/kotlin/app/revanced/patches/shared/gms/BaseGmsCoreSupportPatch.kt index 422de4e98..ad26be13f 100644 --- a/src/main/kotlin/app/revanced/patches/shared/gms/BaseGmsCoreSupportPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/gms/BaseGmsCoreSupportPatch.kt @@ -120,7 +120,7 @@ abstract class BaseGmsCoreSupportPatch( val implementation = methodDef.implementation ?: return@classLoop val mutableMethod by lazy { - mutableClass.methods.first { MethodUtil.methodSignaturesMatch(it, methodDef) } + mutableClass.methods.first { method -> MethodUtil.methodSignaturesMatch(method, methodDef) } } implementation.instructions.forEachIndexed insnLoop@{ index, instruction -> diff --git a/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/CastContextFetchFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/CastContextFetchFingerprint.kt index 2cc78aac7..bb3cf5c70 100644 --- a/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/CastContextFetchFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/CastContextFetchFingerprint.kt @@ -2,6 +2,6 @@ package app.revanced.patches.shared.gms.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object CastContextFetchFingerprint : MethodFingerprint( +internal object CastContextFetchFingerprint : MethodFingerprint( strings = listOf("Error fetching CastContext.") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/CastDynamiteModuleFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/CastDynamiteModuleFingerprint.kt index e05f9781b..b109574dc 100644 --- a/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/CastDynamiteModuleFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/CastDynamiteModuleFingerprint.kt @@ -2,6 +2,6 @@ package app.revanced.patches.shared.gms.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object CastDynamiteModuleFingerprint : MethodFingerprint( +internal object CastDynamiteModuleFingerprint : MethodFingerprint( strings = listOf("com.google.android.gms.cast.framework.internal.CastDynamiteModuleImpl") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/CastDynamiteModuleV2Fingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/CastDynamiteModuleV2Fingerprint.kt index 1d9df0f83..a00275974 100644 --- a/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/CastDynamiteModuleV2Fingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/CastDynamiteModuleV2Fingerprint.kt @@ -2,6 +2,6 @@ package app.revanced.patches.shared.gms.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object CastDynamiteModuleV2Fingerprint : MethodFingerprint( +internal object CastDynamiteModuleV2Fingerprint : MethodFingerprint( strings = listOf("Failed to load module via V2: ") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/GooglePlayUtilityFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/GooglePlayUtilityFingerprint.kt index 635519b36..84ba2cbab 100644 --- a/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/GooglePlayUtilityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/GooglePlayUtilityFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object GooglePlayUtilityFingerprint : MethodFingerprint( +internal object GooglePlayUtilityFingerprint : MethodFingerprint( returnType = "I", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L", "I"), diff --git a/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/PrimeMethodFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/PrimeMethodFingerprint.kt index 10c98bc35..1517b011a 100644 --- a/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/PrimeMethodFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/PrimeMethodFingerprint.kt @@ -2,6 +2,6 @@ package app.revanced.patches.shared.gms.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object PrimeMethodFingerprint : MethodFingerprint( +internal object PrimeMethodFingerprint : MethodFingerprint( strings = listOf("com.google.android.GoogleCamera", "com.android.vending") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/ServiceCheckFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/ServiceCheckFingerprint.kt index 6bad6f3b1..a7f0860db 100644 --- a/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/ServiceCheckFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/gms/fingerprints/ServiceCheckFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object ServiceCheckFingerprint : MethodFingerprint( +internal object ServiceCheckFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L", "I"), diff --git a/src/main/kotlin/app/revanced/patches/shared/integrations/Constants.kt b/src/main/kotlin/app/revanced/patches/shared/integrations/Constants.kt index 8c2bc18e7..602f141aa 100644 --- a/src/main/kotlin/app/revanced/patches/shared/integrations/Constants.kt +++ b/src/main/kotlin/app/revanced/patches/shared/integrations/Constants.kt @@ -1,6 +1,6 @@ package app.revanced.patches.shared.integrations -@Suppress("MemberVisibilityCanBePrivate") +@Suppress("MemberVisibilityCanBePrivate", "SpellCheckingInspection") object Constants { const val INTEGRATIONS_PATH = "Lapp/revanced/integrations/shared" const val COMPONENTS_PATH = "$INTEGRATIONS_PATH/patches/components" diff --git a/src/main/kotlin/app/revanced/patches/shared/litho/LithoFilterPatch.kt b/src/main/kotlin/app/revanced/patches/shared/litho/LithoFilterPatch.kt index a592330f8..861b8fbc0 100644 --- a/src/main/kotlin/app/revanced/patches/shared/litho/LithoFilterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/litho/LithoFilterPatch.kt @@ -23,7 +23,7 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import java.io.Closeable -@Suppress("unused") +@Suppress("SpellCheckingInspection", "unused") object LithoFilterPatch : BytecodePatch( setOf( LithoFilterPatchConstructorFingerprint, diff --git a/src/main/kotlin/app/revanced/patches/shared/litho/fingerprints/LithoFilterPatchConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/litho/fingerprints/LithoFilterPatchConstructorFingerprint.kt index 1bb8a72b4..af0ce820b 100644 --- a/src/main/kotlin/app/revanced/patches/shared/litho/fingerprints/LithoFilterPatchConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/litho/fingerprints/LithoFilterPatchConstructorFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patches.shared.integrations.Constants.COMPONENTS_PATH import com.android.tools.smali.dexlib2.AccessFlags -object LithoFilterPatchConstructorFingerprint : MethodFingerprint( +internal object LithoFilterPatchConstructorFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC or AccessFlags.CONSTRUCTOR, customFingerprint = { methodDef, _ -> diff --git a/src/main/kotlin/app/revanced/patches/shared/litho/fingerprints/PathBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/litho/fingerprints/PathBuilderFingerprint.kt index ac73b9fab..4eb2e44db 100644 --- a/src/main/kotlin/app/revanced/patches/shared/litho/fingerprints/PathBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/litho/fingerprints/PathBuilderFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object PathBuilderFingerprint : MethodFingerprint( +internal object PathBuilderFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/shared/litho/fingerprints/SetByteBufferFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/litho/fingerprints/SetByteBufferFingerprint.kt index 5a544bc9c..bfa2fc004 100644 --- a/src/main/kotlin/app/revanced/patches/shared/litho/fingerprints/SetByteBufferFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/litho/fingerprints/SetByteBufferFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SetByteBufferFingerprint : MethodFingerprint( +internal object SetByteBufferFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("I", "Ljava/nio/ByteBuffer;"), diff --git a/src/main/kotlin/app/revanced/patches/shared/mapping/ResourceMappingPatch.kt b/src/main/kotlin/app/revanced/patches/shared/mapping/ResourceMappingPatch.kt index 4bfa2a3fe..cf46b4553 100644 --- a/src/main/kotlin/app/revanced/patches/shared/mapping/ResourceMappingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/mapping/ResourceMappingPatch.kt @@ -9,8 +9,7 @@ import java.util.concurrent.TimeUnit @Suppress("DEPRECATION") object ResourceMappingPatch : ResourcePatch() { - internal lateinit var resourceMappings: List - private set + private lateinit var resourceMappings: List private val THREAD_COUNT = Runtime.getRuntime().availableProcessors() private val threadPoolExecutor = Executors.newFixedThreadPool(THREAD_COUNT) diff --git a/src/main/kotlin/app/revanced/patches/shared/mapping/ResourceType.kt b/src/main/kotlin/app/revanced/patches/shared/mapping/ResourceType.kt index e1cd02943..ba86dfe3e 100644 --- a/src/main/kotlin/app/revanced/patches/shared/mapping/ResourceType.kt +++ b/src/main/kotlin/app/revanced/patches/shared/mapping/ResourceType.kt @@ -1,5 +1,6 @@ package app.revanced.patches.shared.mapping +@Suppress("unused") enum class ResourceType(val value: String) { ATTR("attr"), BOOL("bool"), diff --git a/src/main/kotlin/app/revanced/patches/shared/opus/AbstractOpusCodecsPatch.kt b/src/main/kotlin/app/revanced/patches/shared/opus/BaseOpusCodecsPatch.kt similarity index 67% rename from src/main/kotlin/app/revanced/patches/shared/opus/AbstractOpusCodecsPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/opus/BaseOpusCodecsPatch.kt index 94f3a9088..974cced74 100644 --- a/src/main/kotlin/app/revanced/patches/shared/opus/AbstractOpusCodecsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/opus/BaseOpusCodecsPatch.kt @@ -4,17 +4,16 @@ import app.revanced.patcher.data.BytecodeContext 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.PatchException import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.shared.opus.fingerprints.CodecReferenceFingerprint import app.revanced.patches.shared.opus.fingerprints.CodecSelectorFingerprint import app.revanced.util.exception -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.util.getTargetIndexWithReference 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.Reference -abstract class AbstractOpusCodecsPatch( +abstract class BaseOpusCodecsPatch( private val descriptor: String ) : BytecodePatch( setOf( @@ -22,24 +21,14 @@ abstract class AbstractOpusCodecsPatch( CodecSelectorFingerprint ) ) { + private lateinit var targetReference: Reference + override fun execute(context: BytecodeContext) { - CodecReferenceFingerprint.result?.mutableMethod?.let { - it.implementation!!.instructions.apply { - var targetIndex = 0 - for ((index, instruction) in withIndex()) { - if (instruction.opcode != Opcode.INVOKE_STATIC) continue - - val targetParameter = it.getInstruction(index).reference - - if (targetParameter.toString().endsWith("Ljava/util/Set;")) { - targetReference = targetParameter - targetIndex = index - break - } - } - if (targetIndex == 0) - throw PatchException("Target method not found!") + CodecReferenceFingerprint.result?.let { + it.mutableMethod.apply { + val targetIndex = getTargetIndexWithReference("Ljava/util/Set;") + targetReference = getInstruction(targetIndex).reference } } ?: throw CodecReferenceFingerprint.exception @@ -59,8 +48,5 @@ abstract class AbstractOpusCodecsPatch( ) } } ?: throw CodecSelectorFingerprint.exception - } - - private lateinit var targetReference: Reference } diff --git a/src/main/kotlin/app/revanced/patches/shared/opus/fingerprints/CodecReferenceFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/opus/fingerprints/CodecReferenceFingerprint.kt index e687ff5a0..b69d083a1 100644 --- a/src/main/kotlin/app/revanced/patches/shared/opus/fingerprints/CodecReferenceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/opus/fingerprints/CodecReferenceFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object CodecReferenceFingerprint : MethodFingerprint( +internal object CodecReferenceFingerprint : MethodFingerprint( returnType = "J", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/shared/opus/fingerprints/CodecSelectorFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/opus/fingerprints/CodecSelectorFingerprint.kt index 62ded6635..926383250 100644 --- a/src/main/kotlin/app/revanced/patches/shared/opus/fingerprints/CodecSelectorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/opus/fingerprints/CodecSelectorFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object CodecSelectorFingerprint : MethodFingerprint( +internal object CodecSelectorFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/shared/overlaybackground/AbstractOverlayBackgroundPatch.kt b/src/main/kotlin/app/revanced/patches/shared/overlaybackground/OverlayBackgroundUtils.kt similarity index 61% rename from src/main/kotlin/app/revanced/patches/shared/overlaybackground/AbstractOverlayBackgroundPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/overlaybackground/OverlayBackgroundUtils.kt index 0f2e64619..7dc96350d 100644 --- a/src/main/kotlin/app/revanced/patches/shared/overlaybackground/AbstractOverlayBackgroundPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/overlaybackground/OverlayBackgroundUtils.kt @@ -1,31 +1,29 @@ package app.revanced.patches.shared.overlaybackground import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch import app.revanced.util.doRecursively import org.w3c.dom.Element -import kotlin.io.path.exists @Suppress("DEPRECATION") -abstract class AbstractOverlayBackgroundPatch( - private val files: Array, - private val targetId: Array, -) : ResourcePatch() { - override fun execute(context: ResourceContext) { - val resDirectory = context["res"] - +object OverlayBackgroundUtils { + internal fun ResourceContext.removeOverlayBackground( + files: Array, + targetId: Array, + ) { files.forEach { file -> - val targetXmlPath = resDirectory.resolve("layout").resolve(file).toPath() + val targetXmlPath = this["res"].resolve("layout").resolve(file) if (targetXmlPath.exists()) { targetId.forEach { identifier -> - context.xmlEditor["res/layout/$file"].use { editor -> + this.xmlEditor["res/layout/$file"].use { editor -> editor.file.doRecursively { arrayOf("height", "width").forEach replacement@{ replacement -> if (it !is Element) return@replacement if (it.attributes.getNamedItem("android:id")?.nodeValue?.endsWith(identifier) == true) { - it.getAttributeNode("android:layout_$replacement")?.let { attribute -> attribute.textContent = "0.0dip" } + it.getAttributeNode("android:layout_$replacement")?.let { attribute -> + attribute.textContent = "0.0dip" + } } } } @@ -33,6 +31,6 @@ abstract class AbstractOverlayBackgroundPatch( } } } - } } + diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/AbstractSettingsResourcePatch.kt b/src/main/kotlin/app/revanced/patches/shared/settings/AbstractSettingsResourcePatch.kt deleted file mode 100644 index d7775bfbb..000000000 --- a/src/main/kotlin/app/revanced/patches/shared/settings/AbstractSettingsResourcePatch.kt +++ /dev/null @@ -1,35 +0,0 @@ -package app.revanced.patches.shared.settings - -import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.util.ResourceGroup -import app.revanced.util.copyResources -import app.revanced.util.copyXmlNode - -/** - * Abstract settings resource patch - * - * @param sourceDirectory Source directory to copy the preference template from - */ -abstract class AbstractSettingsResourcePatch( - private val sourceDirectory: String -) : ResourcePatch() { - override fun execute(context: ResourceContext) { - val sourceHostDirectory = "$sourceDirectory/host" - val isYouTube = sourceDirectory.startsWith("youtube") - /** - * Copy strings - */ - context.copyXmlNode(sourceHostDirectory, "values/strings.xml", "resources") - - /** - * Copy ReVanced Settings - */ - if (isYouTube) { - context.copyResources( - sourceDirectory, - ResourceGroup("xml", "revanced_prefs.xml") - ) - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/shared/settings/fingerprints/SharedSettingFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/settings/fingerprints/SharedSettingFingerprint.kt index 928564446..2b3f05e66 100644 --- a/src/main/kotlin/app/revanced/patches/shared/settings/fingerprints/SharedSettingFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/settings/fingerprints/SharedSettingFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.shared.settings.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import app.revanced.patches.shared.integrations.Constants.INTEGRATIONS_SETTING_CLASS_DESCRIPTOR -object SharedSettingFingerprint : MethodFingerprint( +internal object SharedSettingFingerprint : MethodFingerprint( returnType = "V", customFingerprint = { methodDef, _ -> methodDef.definingClass == INTEGRATIONS_SETTING_CLASS_DESCRIPTOR diff --git a/src/main/kotlin/app/revanced/patches/shared/versionspoof/AbstractVersionSpoofPatch.kt b/src/main/kotlin/app/revanced/patches/shared/spoofappversion/BaseSpoofAppVersionPatch.kt similarity index 85% rename from src/main/kotlin/app/revanced/patches/shared/versionspoof/AbstractVersionSpoofPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/spoofappversion/BaseSpoofAppVersionPatch.kt index 56320ab55..9c6d8fde9 100644 --- a/src/main/kotlin/app/revanced/patches/shared/versionspoof/AbstractVersionSpoofPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/spoofappversion/BaseSpoofAppVersionPatch.kt @@ -1,18 +1,18 @@ -package app.revanced.patches.shared.versionspoof +package app.revanced.patches.shared.spoofappversion import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patches.shared.versionspoof.fingerprints.ClientInfoFingerprint -import app.revanced.patches.shared.versionspoof.fingerprints.ClientInfoParentFingerprint +import app.revanced.patches.shared.spoofappversion.fingerprints.ClientInfoFingerprint +import app.revanced.patches.shared.spoofappversion.fingerprints.ClientInfoParentFingerprint import app.revanced.util.exception import app.revanced.util.getTargetIndexReversed import app.revanced.util.getTargetIndexWithFieldReferenceName import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -abstract class AbstractVersionSpoofPatch( +abstract class BaseSpoofAppVersionPatch( private val descriptor: String ) : BytecodePatch( setOf(ClientInfoParentFingerprint) diff --git a/src/main/kotlin/app/revanced/patches/shared/versionspoof/fingerprints/ClientInfoFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/spoofappversion/fingerprints/ClientInfoFingerprint.kt similarity index 74% rename from src/main/kotlin/app/revanced/patches/shared/versionspoof/fingerprints/ClientInfoFingerprint.kt rename to src/main/kotlin/app/revanced/patches/shared/spoofappversion/fingerprints/ClientInfoFingerprint.kt index 762d97920..96c51053a 100644 --- a/src/main/kotlin/app/revanced/patches/shared/versionspoof/fingerprints/ClientInfoFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/spoofappversion/fingerprints/ClientInfoFingerprint.kt @@ -1,11 +1,11 @@ -package app.revanced.patches.shared.versionspoof.fingerprints +package app.revanced.patches.shared.spoofappversion.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ClientInfoFingerprint : MethodFingerprint( +internal object ClientInfoFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/shared/spoofappversion/fingerprints/ClientInfoParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/spoofappversion/fingerprints/ClientInfoParentFingerprint.kt new file mode 100644 index 000000000..799a153ef --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/shared/spoofappversion/fingerprints/ClientInfoParentFingerprint.kt @@ -0,0 +1,8 @@ +package app.revanced.patches.shared.spoofappversion.fingerprints + +import app.revanced.patcher.fingerprint.MethodFingerprint + +internal object ClientInfoParentFingerprint : MethodFingerprint( + returnType = "V", + strings = listOf("Android Wear") +) diff --git a/src/main/kotlin/app/revanced/patches/shared/tracking/AbstractSanitizeUrlQueryPatch.kt b/src/main/kotlin/app/revanced/patches/shared/tracking/BaseSanitizeUrlQueryPatch.kt similarity index 97% rename from src/main/kotlin/app/revanced/patches/shared/tracking/AbstractSanitizeUrlQueryPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/tracking/BaseSanitizeUrlQueryPatch.kt index c07d1b484..508b3d6ee 100644 --- a/src/main/kotlin/app/revanced/patches/shared/tracking/AbstractSanitizeUrlQueryPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/tracking/BaseSanitizeUrlQueryPatch.kt @@ -8,7 +8,7 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -abstract class AbstractSanitizeUrlQueryPatch( +abstract class BaseSanitizeUrlQueryPatch( private val descriptor: String, private val sharedFingerprints: List, private val additionalFingerprints: List? = null diff --git a/src/main/kotlin/app/revanced/patches/shared/tracking/fingerprints/CopyTextEndpointFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/tracking/fingerprints/CopyTextEndpointFingerprint.kt index 752687d59..aea9eff2d 100644 --- a/src/main/kotlin/app/revanced/patches/shared/tracking/fingerprints/CopyTextEndpointFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/shared/tracking/fingerprints/CopyTextEndpointFingerprint.kt @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * Copy URL from sharing panel */ -object CopyTextEndpointFingerprint : MethodFingerprint( +internal object CopyTextEndpointFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("L", "Ljava/util/Map;"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/shared/transformation/MethodCall.kt b/src/main/kotlin/app/revanced/patches/shared/transformation/MethodCall.kt index 8621bbf2b..b581112ac 100644 --- a/src/main/kotlin/app/revanced/patches/shared/transformation/MethodCall.kt +++ b/src/main/kotlin/app/revanced/patches/shared/transformation/MethodCall.kt @@ -10,6 +10,7 @@ import com.android.tools.smali.dexlib2.iface.reference.MethodReference typealias Instruction35cInfo = Triple +@Suppress("unused") interface IMethodCall { val definedClassName: String val methodName: String diff --git a/src/main/kotlin/app/revanced/patches/shared/translations/AbstractTranslationsPatch.kt b/src/main/kotlin/app/revanced/patches/shared/translations/TranslationsUtils.kt similarity index 61% rename from src/main/kotlin/app/revanced/patches/shared/translations/AbstractTranslationsPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/translations/TranslationsUtils.kt index 1b8bb166c..4096bd1d3 100644 --- a/src/main/kotlin/app/revanced/patches/shared/translations/AbstractTranslationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/translations/TranslationsUtils.kt @@ -1,26 +1,25 @@ package app.revanced.patches.shared.translations import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch import app.revanced.util.classLoader import java.nio.file.Files import java.nio.file.StandardCopyOption @Suppress("DEPRECATION") -abstract class AbstractTranslationsPatch( - private val sourceDirectory: String, - private val languageArray: Array -) : ResourcePatch() { - override fun execute(context: ResourceContext) { +object TranslationsUtils { + internal fun ResourceContext.copyXml( + sourceDirectory: String, + languageArray: Array + ) { languageArray.forEach { language -> val directory = "values-$language-v21" val relativePath = "$language/strings.xml" - context["res/$directory"].mkdir() + this["res/$directory"].mkdir() Files.copy( classLoader.getResourceAsStream("$sourceDirectory/translations/$relativePath")!!, - context["res"].resolve("$directory/strings.xml").toPath(), + this["res"].resolve("$directory/strings.xml").toPath(), StandardCopyOption.REPLACE_EXISTING ) } diff --git a/src/main/kotlin/app/revanced/patches/shared/versionspoof/fingerprints/ClientInfoParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/shared/versionspoof/fingerprints/ClientInfoParentFingerprint.kt deleted file mode 100644 index 9a875e581..000000000 --- a/src/main/kotlin/app/revanced/patches/shared/versionspoof/fingerprints/ClientInfoParentFingerprint.kt +++ /dev/null @@ -1,8 +0,0 @@ -package app.revanced.patches.shared.versionspoof.fingerprints - -import app.revanced.patcher.fingerprint.MethodFingerprint - -object ClientInfoParentFingerprint : MethodFingerprint( - returnType = "V", - strings = listOf("Android Wear") -) diff --git a/src/main/kotlin/app/revanced/patches/shared/voicesearch/AbstractVoiceSearchButtonPatch.kt b/src/main/kotlin/app/revanced/patches/shared/voicesearch/VoiceSearchUtils.kt similarity index 64% rename from src/main/kotlin/app/revanced/patches/shared/voicesearch/AbstractVoiceSearchButtonPatch.kt rename to src/main/kotlin/app/revanced/patches/shared/voicesearch/VoiceSearchUtils.kt index 0eb482f2a..4f8a3557a 100644 --- a/src/main/kotlin/app/revanced/patches/shared/voicesearch/AbstractVoiceSearchButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/shared/voicesearch/VoiceSearchUtils.kt @@ -1,28 +1,24 @@ package app.revanced.patches.shared.voicesearch import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch import org.w3c.dom.Element -import kotlin.io.path.exists @Suppress("DEPRECATION") -abstract class AbstractVoiceSearchButtonPatch( - private val paths: Array, - private val replacements: Array -) : ResourcePatch() { - private companion object { - const val IMAGE_VIEW_TAG = "android.support.v7.widget.AppCompatImageView" - const val VOICE_SEARCH_ID = "@id/voice_search" - } +object VoiceSearchUtils { + private const val IMAGE_VIEW_TAG = "android.support.v7.widget.AppCompatImageView" + private const val VOICE_SEARCH_ID = "@id/voice_search" - override fun execute(context: ResourceContext) { - val resDirectory = context["res"] + internal fun ResourceContext.patchXml( + paths: Array, + replacements: Array + ) { + val resDirectory = this["res"] paths.forEach { path -> - val targetXmlPath = resDirectory.resolve("layout").resolve(path).toPath() + val targetXmlPath = resDirectory.resolve("layout").resolve(path) if (targetXmlPath.exists()) { - context.xmlEditor["res/layout/$path"].use { editor -> + this.xmlEditor["res/layout/$path"].use { editor -> val document = editor.file val imageViewTags = document.getElementsByTagName(IMAGE_VIEW_TAG) List(imageViewTags.length) { imageViewTags.item(it) as Element } @@ -38,6 +34,5 @@ abstract class AbstractVoiceSearchButtonPatch( } } } - } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/ads/fullscreen/FullscreenAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ads/fullscreen/FullscreenAdsPatch.kt index 43536c819..d7ce81b74 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ads/fullscreen/FullscreenAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ads/fullscreen/FullscreenAdsPatch.kt @@ -51,14 +51,6 @@ object FullscreenAdsPatch : BytecodePatch( it.mutableMethod.apply { // In this method, custom dialog is created and shown. // There were no issues despite adding “return-void” to the first index. - // - // If an issue occurs due to patching due to server-side changes in the future, - // Find the instruction whose name is "show" in [MethodReference] and click the 'AlertDialog.BUTTON_POSITIVE' button. - // - // In this case, an instruction for 'getButton' must be added to smali, not in integrations - // (This custom dialog cannot be cast to [AlertDialog] or [Dialog]) - // - // See the comments below. addInstructionsWithLabels( 0, """ @@ -69,33 +61,38 @@ object FullscreenAdsPatch : BytecodePatch( """, ExternalLabel("show", getInstruction(0)) ) - /* - val dialogIndex = getTargetIndexWithMethodReferenceName("show") - val dialogReference = getInstruction(dialogIndex).reference - val dialogDefiningClass = (dialogReference as MethodReference).definingClass - val getButtonMethod = context.findClass(dialogDefiningClass)!! - .mutableClass.methods.first { method -> - method.parameters == listOf("I") - && method.returnType == "Landroid/widget/Button;" - } - val getButtonCall = dialogDefiningClass + "->" + getButtonMethod.name + "(I)Landroid/widget/Button;" + // If an issue occurs due to patching due to server-side changes in the future, + // Find the instruction whose name is "show" in [MethodReference] and click the 'AlertDialog.BUTTON_POSITIVE' button. + // + // In this case, an instruction for 'getButton' must be added to smali, not in integrations + // (This custom dialog cannot be cast to [AlertDialog] or [Dialog]) + // + // See the comments below. - val dialogRegister = getInstruction(dialogIndex).registerC - val freeIndex = getTargetIndex(dialogIndex, Opcode.IF_EQZ) - val freeRegister = getInstruction(freeIndex).registerA + // val dialogIndex = getTargetIndexWithMethodReferenceName("show") + // val dialogReference = getInstruction(dialogIndex).reference + // val dialogDefiningClass = (dialogReference as MethodReference).definingClass + // val getButtonMethod = context.findClass(dialogDefiningClass)!! + // .mutableClass.methods.first { method -> + // method.parameters == listOf("I") + // && method.returnType == "Landroid/widget/Button;" + // } + // val getButtonCall = dialogDefiningClass + "->" + getButtonMethod.name + "(I)Landroid/widget/Button;" + // val dialogRegister = getInstruction(dialogIndex).registerC + // val freeIndex = getTargetIndex(dialogIndex, Opcode.IF_EQZ) + // val freeRegister = getInstruction(freeIndex).registerA - addInstructions( - dialogIndex + 1, """ - # Get the 'AlertDialog.BUTTON_POSITIVE' from custom dialog - # Since this custom dialog cannot be cast to AlertDialog or Dialog, - # It should come from smali, not integrations. - const/4 v$freeRegister, -0x1 - invoke-virtual {v$dialogRegister, $freeRegister}, $getButtonCall - move-result-object $freeRegister - invoke-static {$freeRegister}, $FULLSCREEN_ADS_CLASS_DESCRIPTOR->confirmDialog(Landroid/widget/Button;)V - """ - ) - */ + // addInstructions( + // dialogIndex + 1, """ + // # Get the 'AlertDialog.BUTTON_POSITIVE' from custom dialog + // # Since this custom dialog cannot be cast to AlertDialog or Dialog, + // # It should come from smali, not integrations. + // const/4 v$freeRegister, -0x1 + // invoke-virtual {v$dialogRegister, $freeRegister}, $getButtonCall + // move-result-object $freeRegister + // invoke-static {$freeRegister}, $FULLSCREEN_ADS_CLASS_DESCRIPTOR->confirmDialog(Landroid/widget/Button;)V + // """ + // ) } } ?: throw ShowDialogCommandFingerprint.exception } diff --git a/src/main/kotlin/app/revanced/patches/youtube/ads/fullscreen/fingerprints/InterstitialsContainerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/ads/fullscreen/fingerprints/InterstitialsContainerFingerprint.kt index deed3788d..67bc7ad91 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ads/fullscreen/fingerprints/InterstitialsContainerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ads/fullscreen/fingerprints/InterstitialsContainerFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.ads.fullscreen.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.InterstitialsContainer import app.revanced.util.fingerprint.LiteralValueFingerprint -object InterstitialsContainerFingerprint : LiteralValueFingerprint( +internal object InterstitialsContainerFingerprint : LiteralValueFingerprint( returnType = "V", strings= listOf("overlay_controller_param"), literalSupplier = { InterstitialsContainer } diff --git a/src/main/kotlin/app/revanced/patches/youtube/ads/fullscreen/fingerprints/ShowDialogCommandFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/ads/fullscreen/fingerprints/ShowDialogCommandFingerprint.kt index 0cccaf22a..aff237c96 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ads/fullscreen/fingerprints/ShowDialogCommandFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ads/fullscreen/fingerprints/ShowDialogCommandFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.ads.fullscreen.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.SlidingDialogAnimation import app.revanced.util.fingerprint.LiteralValueFingerprint -object ShowDialogCommandFingerprint : LiteralValueFingerprint( +internal object ShowDialogCommandFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { SlidingDialogAnimation } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/ads/general/GeneralAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ads/general/GeneralAdsPatch.kt index c15e7fbe3..770a362eb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ads/general/GeneralAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ads/general/GeneralAdsPatch.kt @@ -1,65 +1,35 @@ package app.revanced.patches.youtube.ads.general import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.ads.fullscreen.FullscreenAdsPatch -import app.revanced.patches.youtube.ads.getpremium.HideGetPremiumPatch +import app.revanced.patches.youtube.ads.getpremium.GetPremiumPatch import app.revanced.patches.youtube.utils.fix.doublebacktoclose.DoubleBackToClosePatch import app.revanced.patches.youtube.utils.fix.swiperefresh.SwipeRefreshPatch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.copyXmlNode import app.revanced.util.doRecursively +import app.revanced.util.patch.BaseResourcePatch import app.revanced.util.startsWithAny import org.w3c.dom.Element -@Patch( +@Suppress("DEPRECATION", "unused") +object GeneralAdsPatch : BaseResourcePatch( name = "Hide general ads", description = "Adds options to hide general ads.", - dependencies = [ + dependencies = setOf( DoubleBackToClosePatch::class, FullscreenAdsPatch::class, GeneralAdsBytecodePatch::class, - HideGetPremiumPatch::class, + GetPremiumPatch::class, LithoFilterPatch::class, SettingsPatch::class, SwipeRefreshPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object GeneralAdsPatch : ResourcePatch() { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { private val resourceFileNames = arrayOf( "promoted_", "promotion_", @@ -81,8 +51,11 @@ object GeneralAdsPatch : ResourcePatch() { "Top" ) + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/AdsFilter;" + override fun execute(context: ResourceContext) { - LithoFilterPatch.addFilter("$COMPONENTS_PATH/AdsFilter;") + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) context.forEach { diff --git a/src/main/kotlin/app/revanced/patches/youtube/ads/getpremium/HideGetPremiumPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ads/getpremium/GetPremiumPatch.kt similarity index 97% rename from src/main/kotlin/app/revanced/patches/youtube/ads/getpremium/HideGetPremiumPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/ads/getpremium/GetPremiumPatch.kt index 0ce9e7550..d42acd7a2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ads/getpremium/HideGetPremiumPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ads/getpremium/GetPremiumPatch.kt @@ -10,7 +10,7 @@ import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.util.exception import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -object HideGetPremiumPatch : BytecodePatch( +object GetPremiumPatch : BytecodePatch( setOf(CompactYpcOfferModuleViewFingerprint) ) { private const val FILTER_CLASS_DESCRIPTOR = diff --git a/src/main/kotlin/app/revanced/patches/youtube/ads/getpremium/fingerprints/CompactYpcOfferModuleViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/ads/getpremium/fingerprints/CompactYpcOfferModuleViewFingerprint.kt index 05b9760dc..a715b09c6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ads/getpremium/fingerprints/CompactYpcOfferModuleViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ads/getpremium/fingerprints/CompactYpcOfferModuleViewFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object CompactYpcOfferModuleViewFingerprint : MethodFingerprint( +internal object CompactYpcOfferModuleViewFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, parameters = listOf("I", "I"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/ads/video/VideoAdsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ads/video/VideoAdsBytecodePatch.kt new file mode 100644 index 000000000..ee93133b3 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/ads/video/VideoAdsBytecodePatch.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.youtube.ads.video + +import app.revanced.patches.shared.ads.BaseAdsPatch +import app.revanced.patches.youtube.utils.integrations.Constants.ADS_PATH + +object VideoAdsBytecodePatch : BaseAdsPatch( + "$ADS_PATH/VideoAdsPatch;", + "hideVideoAds" +) diff --git a/src/main/kotlin/app/revanced/patches/youtube/ads/video/VideoAdsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/ads/video/VideoAdsPatch.kt index f944e88d7..f5c4eab84 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/ads/video/VideoAdsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/ads/video/VideoAdsPatch.kt @@ -1,53 +1,21 @@ package app.revanced.patches.youtube.ads.video -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.ads.AbstractAdsPatch -import app.revanced.patches.youtube.utils.integrations.Constants.ADS_PATH +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object VideoAdsPatch : BaseResourcePatch( name = "Hide video ads", description = "Adds an option to hide ads in the video player.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object VideoAdsPatch : AbstractAdsPatch( - "$ADS_PATH/VideoAdsPatch;", - "hideVideoAds" + dependencies = setOf( + SettingsPatch::class, + VideoAdsBytecodePatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE ) { - override fun execute(context: BytecodeContext) { - super.execute(context) + override fun execute(context: ResourceContext) { /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/alternativethumbnails/general/AlternativeThumbnailsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/alternativethumbnails/general/AlternativeThumbnailsPatch.kt index afa4d5c13..f25d2cae2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/alternativethumbnails/general/AlternativeThumbnailsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/alternativethumbnails/general/AlternativeThumbnailsPatch.kt @@ -5,9 +5,6 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstructions import app.revanced.patcher.fingerprint.MethodFingerprint -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patches.youtube.alternativethumbnails.general.fingerprints.MessageDigestImageUrlFingerprint @@ -16,11 +13,13 @@ import app.revanced.patches.youtube.alternativethumbnails.general.fingerprints.c import app.revanced.patches.youtube.alternativethumbnails.general.fingerprints.cronet.request.callback.OnFailureFingerprint import app.revanced.patches.youtube.alternativethumbnails.general.fingerprints.cronet.request.callback.OnResponseStartedFingerprint import app.revanced.patches.youtube.alternativethumbnails.general.fingerprints.cronet.request.callback.OnSucceededFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.ALTERNATIVE_THUMBNAILS +import app.revanced.patches.youtube.utils.integrations.Constants.ALTERNATIVE_THUMBNAILS_CLASS_DESCRIPTOR +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch.contexts import app.revanced.util.copyXmlNode import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation @@ -28,43 +27,13 @@ import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference import com.android.tools.smali.dexlib2.immutable.ImmutableMethod -@Patch( +@Suppress("unused") +object AlternativeThumbnailsPatch : BaseBytecodePatch( name = "Alternative thumbnails", description = "Adds options to replace video thumbnails using the DeArrow API or image captures from the video.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object AlternativeThumbnailsPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( MessageDigestImageUrlParentFingerprint, OnResponseStartedFingerprint, RequestFingerprint, @@ -134,17 +103,17 @@ object AlternativeThumbnailsPatch : BytecodePatch( MessageDigestImageUrlFingerprint.resolveAndLetMutableMethod(MessageDigestImageUrlParentFingerprint) { loadImageUrlMethod = it - addImageUrlHook(ALTERNATIVE_THUMBNAILS, true) + addImageUrlHook(ALTERNATIVE_THUMBNAILS_CLASS_DESCRIPTOR, true) } OnSucceededFingerprint.resolveAndLetMutableMethod(OnResponseStartedFingerprint) { loadImageSuccessCallbackMethod = it - addImageUrlSuccessCallbackHook(ALTERNATIVE_THUMBNAILS) + addImageUrlSuccessCallbackHook(ALTERNATIVE_THUMBNAILS_CLASS_DESCRIPTOR) } OnFailureFingerprint.resolveAndLetMutableMethod(OnResponseStartedFingerprint) { loadImageErrorCallbackMethod = it - addImageUrlErrorCallbackHook(ALTERNATIVE_THUMBNAILS) + addImageUrlErrorCallbackHook(ALTERNATIVE_THUMBNAILS_CLASS_DESCRIPTOR) } // The URL is required for the failure callback hook, but the URL field is obfuscated. diff --git a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/buttoncontainer/ButtonContainerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/buttoncontainer/ButtonContainerPatch.kt index ce4fe5ef9..29f1f78d0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/buttoncontainer/ButtonContainerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/buttoncontainer/ButtonContainerPatch.kt @@ -1,55 +1,27 @@ package app.revanced.patches.youtube.buttomplayer.buttoncontainer -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.data.ResourceContext import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object ButtonContainerPatch : BaseResourcePatch( name = "Hide button container", description = "Adds options to hide action buttons below the video player.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ButtonContainerPatch : BytecodePatch(emptySet()) { - override fun execute(context: BytecodeContext) { + ), + compatiblePackages = COMPATIBLE_PACKAGE, +) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/ButtonsFilter;" - LithoFilterPatch.addFilter("$COMPONENTS_PATH/ButtonsFilter;") + override fun execute(context: ResourceContext) { + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/CommentComponentPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/CommentComponentPatch.kt index 4fbd80a5c..f99d53175 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/CommentComponentPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/CommentComponentPatch.kt @@ -4,70 +4,41 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.buttomplayer.comment.fingerprints.ShortsLiveStreamEmojiPickerOnClickListenerFingerprint import app.revanced.patches.youtube.buttomplayer.comment.fingerprints.ShortsLiveStreamEmojiPickerOpacityFingerprint import app.revanced.patches.youtube.buttomplayer.comment.fingerprints.ShortsLiveStreamThanksFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.BOTTOM_PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.BOTTOM_PLAYER_CLASS_DESCRIPTOR +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getTargetIndex +import app.revanced.util.getWalkerMethod import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch 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 -@Patch( +@Suppress("unused") +object CommentComponentPatch : BaseBytecodePatch( name = "Hide comment component", description = "Adds options to hide components related to comments.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object CommentComponentPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( ShortsLiveStreamEmojiPickerOnClickListenerFingerprint, ShortsLiveStreamEmojiPickerOpacityFingerprint ) ) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/CommentsFilter;" override fun execute(context: BytecodeContext) { ShortsLiveStreamEmojiPickerOpacityFingerprint.result?.let { @@ -77,7 +48,7 @@ object CommentComponentPatch : BytecodePatch( addInstruction( insertIndex, - "invoke-static {v$insertRegister}, $BOTTOM_PLAYER->changeEmojiPickerOpacity(Landroid/widget/ImageView;)V" + "invoke-static {v$insertRegister}, $BOTTOM_PLAYER_CLASS_DESCRIPTOR->changeEmojiPickerOpacity(Landroid/widget/ImageView;)V" ) } } ?: throw ShortsLiveStreamEmojiPickerOpacityFingerprint.exception @@ -86,20 +57,15 @@ object CommentComponentPatch : BytecodePatch( parentResult.mutableMethod.apply { val emojiPickerEndpointIndex = getWideLiteralInstructionIndex(126326492) val emojiPickerOnClickListenerIndex = getTargetIndex(emojiPickerEndpointIndex, Opcode.INVOKE_DIRECT) - val emojiPickerOnClickListenerMethod = - context.toMethodWalker(this) - .nextMethod(emojiPickerOnClickListenerIndex, true) - .getMethod() as MutableMethod + val emojiPickerOnClickListenerMethod = getWalkerMethod(context, emojiPickerOnClickListenerIndex) emojiPickerOnClickListenerMethod.apply { - val insertIndex = implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.IF_EQZ - } + val insertIndex = getTargetIndex(Opcode.IF_EQZ) val insertRegister = getInstruction(insertIndex).registerA addInstructions( insertIndex, """ - invoke-static {v$insertRegister}, $BOTTOM_PLAYER->disableEmojiPickerOnClickListener(Ljava/lang/Object;)Ljava/lang/Object; + invoke-static {v$insertRegister}, $BOTTOM_PLAYER_CLASS_DESCRIPTOR->disableEmojiPickerOnClickListener(Ljava/lang/Object;)Ljava/lang/Object; move-result-object v$insertRegister """ ) @@ -118,7 +84,7 @@ object CommentComponentPatch : BytecodePatch( addInstructions( insertIndex,""" - invoke-static { v${insertInstruction.registerC}, v${insertInstruction.registerD} }, $BOTTOM_PLAYER->hideThanksButton(Landroid/view/View;I)I + invoke-static { v${insertInstruction.registerC}, v${insertInstruction.registerD} }, $BOTTOM_PLAYER_CLASS_DESCRIPTOR->hideThanksButton(Landroid/view/View;I)I move-result v${insertInstruction.registerD} """ ) @@ -126,7 +92,7 @@ object CommentComponentPatch : BytecodePatch( } } - LithoFilterPatch.addFilter("$COMPONENTS_PATH/CommentsFilter;") + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/fingerprints/ShortsLiveStreamEmojiPickerOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/fingerprints/ShortsLiveStreamEmojiPickerOnClickListenerFingerprint.kt index 7d47d04a2..29a7efda8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/fingerprints/ShortsLiveStreamEmojiPickerOnClickListenerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/fingerprints/ShortsLiveStreamEmojiPickerOnClickListenerFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.buttomplayer.comment.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object ShortsLiveStreamEmojiPickerOnClickListenerFingerprint : LiteralValueFingerprint( +internal object ShortsLiveStreamEmojiPickerOnClickListenerFingerprint : LiteralValueFingerprint( returnType = "V", parameters = listOf("L"), accessFlags = AccessFlags.PUBLIC.value, diff --git a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/fingerprints/ShortsLiveStreamEmojiPickerOpacityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/fingerprints/ShortsLiveStreamEmojiPickerOpacityFingerprint.kt index 43defbace..adf3522f5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/fingerprints/ShortsLiveStreamEmojiPickerOpacityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/fingerprints/ShortsLiveStreamEmojiPickerOpacityFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Emoji import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object ShortsLiveStreamEmojiPickerOpacityFingerprint : LiteralValueFingerprint( +internal object ShortsLiveStreamEmojiPickerOpacityFingerprint : LiteralValueFingerprint( returnType = "Landroid/widget/ImageView;", accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/fingerprints/ShortsLiveStreamThanksFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/fingerprints/ShortsLiveStreamThanksFingerprint.kt index 30fc91d00..ac70ba220 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/fingerprints/ShortsLiveStreamThanksFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/comment/fingerprints/ShortsLiveStreamThanksFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ShortsLiveStreamThanksFingerprint : MethodFingerprint( +internal object ShortsLiveStreamThanksFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/View;", "Z"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/gestures/BottomPlayerGesturesPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/gestures/BottomPlayerGesturesPatch.kt index 508a1602f..74e68c75e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/gestures/BottomPlayerGesturesPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/gestures/BottomPlayerGesturesPatch.kt @@ -1,71 +1,27 @@ package app.revanced.patches.youtube.buttomplayer.gestures import app.revanced.patcher.data.BytecodeContext -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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.buttomplayer.gestures.fingerprints.BottomPlayerGesturesFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.BOTTOM_PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.BOTTOM_PLAYER_CLASS_DESCRIPTOR +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.exception -import app.revanced.util.getWideLiteralInstructionIndex -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import app.revanced.util.literalInstructionBooleanHook +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object BottomPlayerGesturesPatch : BaseBytecodePatch( name = "Enable bottom player gestures", description = "Adds an option to enter fullscreen when swiping down below the video player.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object BottomPlayerGesturesPatch : BytecodePatch( - setOf(BottomPlayerGesturesFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(BottomPlayerGesturesFingerprint) ) { override fun execute(context: BytecodeContext) { - BottomPlayerGesturesFingerprint.result?.let { - it.mutableMethod.apply { - val targetIndex = getWideLiteralInstructionIndex(45372793) + 3 - val targetRegister = getInstruction(targetIndex).registerA - - addInstructions( - targetIndex + 1, """ - invoke-static {}, $BOTTOM_PLAYER->enableBottomPlayerGestures()Z - move-result v$targetRegister - """ - ) - } - } ?: throw BottomPlayerGesturesFingerprint.exception + BottomPlayerGesturesFingerprint.literalInstructionBooleanHook( + 45372793, + "$BOTTOM_PLAYER_CLASS_DESCRIPTOR->enableBottomPlayerGestures()Z" + ) /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/gestures/fingerprints/BottomPlayerGesturesFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/gestures/fingerprints/BottomPlayerGesturesFingerprint.kt index ecce689b7..57f745b39 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/gestures/fingerprints/BottomPlayerGesturesFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/buttomplayer/gestures/fingerprints/BottomPlayerGesturesFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.buttomplayer.gestures.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint -object BottomPlayerGesturesFingerprint : LiteralValueFingerprint( +internal object BottomPlayerGesturesFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { 45372793 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/FeedFlyoutPanelPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/FeedFlyoutPanelPatch.kt index e9504b4ca..d686e955d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/FeedFlyoutPanelPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/FeedFlyoutPanelPatch.kt @@ -4,62 +4,31 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.flyoutpanel.feed.fingerprints.BottomSheetMenuItemBuilderFingerprint import app.revanced.patches.youtube.flyoutpanel.feed.fingerprints.BottomSheetMenuItemBuilderLegacyFingerprint import app.revanced.patches.youtube.flyoutpanel.feed.fingerprints.ContextualMenuItemBuilderFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.FLYOUT_PANEL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.FLYOUT_PANEL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch 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.formats.Instruction35c import com.android.tools.smali.dexlib2.iface.reference.MethodReference -@Patch( +@Suppress("unused") +object FeedFlyoutPanelPatch : BaseBytecodePatch( name = "Hide feed flyout panel", description = "Adds the ability to hide feed flyout panel components using a custom filter.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object FeedFlyoutPanelPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( BottomSheetMenuItemBuilderFingerprint, BottomSheetMenuItemBuilderLegacyFingerprint, ContextualMenuItemBuilderFingerprint @@ -86,7 +55,7 @@ object FeedFlyoutPanelPatch : BytecodePatch( addInstructions( targetIndex + 1, """ - invoke-static {v$targetRegister}, $FLYOUT_PANEL->hideFeedFlyoutPanel(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; + invoke-static {v$targetRegister}, $FLYOUT_PANEL_CLASS_DESCRIPTOR->hideFeedFlyoutPanel(Ljava/lang/CharSequence;)Ljava/lang/CharSequence; move-result-object v$targetRegister """ ) @@ -108,7 +77,8 @@ object FeedFlyoutPanelPatch : BytecodePatch( addInstruction( targetIndex + 1, - "invoke-static {v${targetInstruction.registerC}, v${targetInstruction.registerD}}, $FLYOUT_PANEL->hideFeedFlyoutPanel(Landroid/widget/TextView;Ljava/lang/CharSequence;)V" + "invoke-static {v${targetInstruction.registerC}, v${targetInstruction.registerD}}, " + + "$FLYOUT_PANEL_CLASS_DESCRIPTOR->hideFeedFlyoutPanel(Landroid/widget/TextView;Ljava/lang/CharSequence;)V" ) } } ?: throw ContextualMenuItemBuilderFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/fingerprints/BottomSheetMenuItemBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/fingerprints/BottomSheetMenuItemBuilderFingerprint.kt index 5a5d3c99e..d9d15c7c3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/fingerprints/BottomSheetMenuItemBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/fingerprints/BottomSheetMenuItemBuilderFingerprint.kt @@ -8,7 +8,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * Compatible with YouTube v19.11.43~ */ -object BottomSheetMenuItemBuilderFingerprint : MethodFingerprint( +internal object BottomSheetMenuItemBuilderFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "L", parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/fingerprints/BottomSheetMenuItemBuilderLegacyFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/fingerprints/BottomSheetMenuItemBuilderLegacyFingerprint.kt index 861854485..2ba93d8a9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/fingerprints/BottomSheetMenuItemBuilderLegacyFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/fingerprints/BottomSheetMenuItemBuilderLegacyFingerprint.kt @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * Compatible with ~YouTube v19.10.39 */ -object BottomSheetMenuItemBuilderLegacyFingerprint : MethodFingerprint( +internal object BottomSheetMenuItemBuilderLegacyFingerprint : MethodFingerprint( returnType = "L", parameters = listOf("L"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/fingerprints/ContextualMenuItemBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/fingerprints/ContextualMenuItemBuilderFingerprint.kt index c72641cfd..5f1bb6b2a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/fingerprints/ContextualMenuItemBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/feed/fingerprints/ContextualMenuItemBuilderFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ContextualMenuItemBuilderFingerprint : LiteralValueFingerprint( +internal object ContextualMenuItemBuilderFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL or AccessFlags.SYNTHETIC, parameters = listOf("L", "L"), returnType = "V", diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldqualitylayout/OldQualityLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldqualitylayout/OldQualityLayoutPatch.kt index aa595e0e5..aa8b83dd2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldqualitylayout/OldQualityLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldqualitylayout/OldQualityLayoutPatch.kt @@ -4,16 +4,14 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 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.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.utils.fingerprints.QualityMenuViewInflateFingerprint import app.revanced.patches.youtube.utils.fingerprints.VideoQualitySetterFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH -import app.revanced.patches.youtube.utils.integrations.Constants.FLYOUT_PANEL +import app.revanced.patches.youtube.utils.integrations.Constants.FLYOUT_PANEL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.recyclerview.BottomSheetRecyclerViewPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch @@ -21,61 +19,35 @@ import app.revanced.util.exception import app.revanced.util.getReference import app.revanced.util.getTargetIndex import app.revanced.util.indexOfFirstInstruction +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode 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 -@Patch( +@Suppress("unused") +object OldQualityLayoutPatch : BaseBytecodePatch( name = "Enable old quality layout", description = "Adds an option to restore the old video quality menu with specific video resolution options.", - dependencies = [ + dependencies = setOf( BottomSheetRecyclerViewPatch::class, LithoFilterPatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object OldQualityLayoutPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( QualityMenuViewInflateFingerprint, VideoQualitySetterFingerprint ) ) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/VideoQualityMenuFilter;" + override fun execute(context: BytecodeContext) { /** - * Old method + * Non-litho view, used in old clients and Shorts. */ val videoQualityClass = VideoQualitySetterFingerprint.result?.mutableMethod?.definingClass ?: throw VideoQualitySetterFingerprint.exception @@ -87,7 +59,7 @@ object OldQualityLayoutPatch : BytecodePatch( addInstruction( insertIndex + 1, - "invoke-static { v$insertRegister }, $FLYOUT_PANEL->enableOldQualityMenu(Landroid/widget/ListView;)V" + "invoke-static { v$insertRegister }, $FLYOUT_PANEL_CLASS_DESCRIPTOR->enableOldQualityMenu(Landroid/widget/ListView;)V" ) } val onItemClickMethod = @@ -104,7 +76,7 @@ object OldQualityLayoutPatch : BytecodePatch( addInstructionsWithLabels( insertIndex, """ - invoke-static {}, $FLYOUT_PANEL->enableOldQualityMenu()Z + invoke-static {}, $FLYOUT_PANEL_CLASS_DESCRIPTOR->enableOldQualityMenu()Z move-result v$insertRegister if-nez v$insertRegister, :show """, ExternalLabel("show", getInstruction(jumpIndex)) @@ -113,11 +85,11 @@ object OldQualityLayoutPatch : BytecodePatch( } ?: throw QualityMenuViewInflateFingerprint.exception /** - * New method + * Litho view */ - BottomSheetRecyclerViewPatch.injectCall("$FLYOUT_PANEL->onFlyoutMenuCreate(Landroid/support/v7/widget/RecyclerView;)V") + BottomSheetRecyclerViewPatch.injectCall("$FLYOUT_PANEL_CLASS_DESCRIPTOR->onFlyoutMenuCreate(Landroid/support/v7/widget/RecyclerView;)V") - LithoFilterPatch.addFilter("$COMPONENTS_PATH/VideoQualityMenuFilter;") + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/OldSpeedLayoutPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/OldSpeedLayoutPatch.kt index 079457c84..02b1a1eea 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/OldSpeedLayoutPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/OldSpeedLayoutPatch.kt @@ -20,8 +20,7 @@ import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.immutable.ImmutableField @Patch( - dependencies = - [ + dependencies = [ BottomSheetRecyclerViewPatch::class, LithoFilterPatch::class ] @@ -32,6 +31,15 @@ object OldSpeedLayoutPatch : BytecodePatch( PlaybackRateBottomSheetClassFingerprint ) ) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/PlaybackSpeedMenuFilter;" + + private const val INTEGRATIONS_CLASS_DESCRIPTOR = + "$VIDEO_PATH/CustomPlaybackSpeedPatch;" + + private lateinit var playbackRateBottomSheetClass: String + private lateinit var playbackRateBottomSheetBuilderMethod: String + override fun execute(context: BytecodeContext) { /** @@ -39,15 +47,15 @@ object OldSpeedLayoutPatch : BytecodePatch( */ PlaybackRateBottomSheetClassFingerprint.result?.let { it.mutableMethod.apply { - PLAYBACK_RATE_BOTTOM_SHEET_CLASS = definingClass - PLAYBACK_RATE_BOTTOM_SHEET_BUILDER_METHOD = + playbackRateBottomSheetClass = definingClass + playbackRateBottomSheetBuilderMethod = it.mutableClass.methods.find { method -> method.parameters.isEmpty() && method.returnType == "V" } ?.name ?: throw PatchException("Could not find PlaybackRateBottomSheetBuilderMethod") addInstruction( 0, - "sput-object p0, $INTEGRATIONS_CLASS_DESCRIPTOR->playbackRateBottomSheetClass:$PLAYBACK_RATE_BOTTOM_SHEET_CLASS" + "sput-object p0, $INTEGRATIONS_CLASS_DESCRIPTOR->playbackRateBottomSheetClass:$playbackRateBottomSheetClass" ) } } ?: throw PlaybackRateBottomSheetClassFingerprint.exception @@ -63,7 +71,7 @@ object OldSpeedLayoutPatch : BytecodePatch( ImmutableField( definingClass, "playbackRateBottomSheetClass", - PLAYBACK_RATE_BOTTOM_SHEET_CLASS, + playbackRateBottomSheetClass, AccessFlags.PUBLIC or AccessFlags.STATIC, null, annotations, @@ -76,28 +84,19 @@ object OldSpeedLayoutPatch : BytecodePatch( addInstructionsWithLabels( 0, """ - sget-object v0, $INTEGRATIONS_CLASS_DESCRIPTOR->playbackRateBottomSheetClass:$PLAYBACK_RATE_BOTTOM_SHEET_CLASS + sget-object v0, $INTEGRATIONS_CLASS_DESCRIPTOR->playbackRateBottomSheetClass:$playbackRateBottomSheetClass if-nez v0, :not_null return-void :not_null - invoke-virtual {v0}, $PLAYBACK_RATE_BOTTOM_SHEET_CLASS->$PLAYBACK_RATE_BOTTOM_SHEET_BUILDER_METHOD()V + invoke-virtual {v0}, $playbackRateBottomSheetClass->$playbackRateBottomSheetBuilderMethod()V """ ) } } ?: throw CustomPlaybackSpeedIntegrationsFingerprint.exception - /** - * New method - */ BottomSheetRecyclerViewPatch.injectCall("$INTEGRATIONS_CLASS_DESCRIPTOR->onFlyoutMenuCreate(Landroid/support/v7/widget/RecyclerView;)V") - LithoFilterPatch.addFilter("$COMPONENTS_PATH/PlaybackSpeedMenuFilter;") + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) } - - private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "$VIDEO_PATH/CustomPlaybackSpeedPatch;" - - private lateinit var PLAYBACK_RATE_BOTTOM_SHEET_CLASS: String - private lateinit var PLAYBACK_RATE_BOTTOM_SHEET_BUILDER_METHOD: String } diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/CustomPlaybackSpeedIntegrationsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/CustomPlaybackSpeedIntegrationsFingerprint.kt index 8350e20c0..8606f341a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/CustomPlaybackSpeedIntegrationsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/CustomPlaybackSpeedIntegrationsFingerprint.kt @@ -4,9 +4,12 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object CustomPlaybackSpeedIntegrationsFingerprint : MethodFingerprint( +internal object CustomPlaybackSpeedIntegrationsFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.STATIC, parameters = emptyList(), - customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/CustomPlaybackSpeedPatch;") && methodDef.name == "showOldPlaybackSpeedMenu" } + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("/CustomPlaybackSpeedPatch;") + && methodDef.name == "showOldPlaybackSpeedMenu" + } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/PlaybackRateBottomSheetClassFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/PlaybackRateBottomSheetClassFingerprint.kt index 2c656dc2e..71a5afeca 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/PlaybackRateBottomSheetClassFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/oldspeedlayout/fingerprints/PlaybackRateBottomSheetClassFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object PlaybackRateBottomSheetClassFingerprint : MethodFingerprint( +internal object PlaybackRateBottomSheetClassFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("[L", "I"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/PlayerFlyoutPanelPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/PlayerFlyoutPanelPatch.kt index 1b8e5b87c..d8b39b965 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/PlayerFlyoutPanelPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/PlayerFlyoutPanelPatch.kt @@ -1,84 +1,54 @@ package app.revanced.patches.youtube.flyoutpanel.player import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.fingerprint.MethodFingerprint -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.flyoutpanel.player.fingerprints.AdvancedQualityBottomSheetFingerprint import app.revanced.patches.youtube.flyoutpanel.player.fingerprints.CaptionsBottomSheetFingerprint import app.revanced.patches.youtube.utils.fingerprints.QualityMenuViewInflateFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH -import app.revanced.patches.youtube.utils.integrations.Constants.FLYOUT_PANEL +import app.revanced.patches.youtube.utils.integrations.Constants.FLYOUT_PANEL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.BottomSheetFooterText import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.exception -import app.revanced.util.getWideLiteralInstructionIndex -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import app.revanced.util.literalInstructionViewHook +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object PlayerFlyoutPanelPatch : BaseBytecodePatch( name = "Hide player flyout panel", description = "Adds options to hide player flyout panel components.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, PlayerTypeHookPatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object PlayerFlyoutPanelPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( AdvancedQualityBottomSheetFingerprint, CaptionsBottomSheetFingerprint, QualityMenuViewInflateFingerprint ) ) { + private const val PANELS_FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/PlayerFlyoutPanelsFilter;" + + private const val PANELS_FOOTER_FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/PlayerFlyoutPanelsFooterFilter;" + override fun execute(context: BytecodeContext) { arrayOf( AdvancedQualityBottomSheetFingerprint to "hideFooterQuality", CaptionsBottomSheetFingerprint to "hideFooterCaptions", QualityMenuViewInflateFingerprint to "hideFooterQuality" ).map { (fingerprint, name) -> - fingerprint.injectCall(name) + fingerprint.literalInstructionViewHook(BottomSheetFooterText, "$FLYOUT_PANEL_CLASS_DESCRIPTOR->$name(Landroid/view/View;)V") } - LithoFilterPatch.addFilter("$COMPONENTS_PATH/PlayerFlyoutPanelsFilter;") - LithoFilterPatch.addFilter("$COMPONENTS_PATH/PlayerFlyoutPanelsFooterFilter;") + LithoFilterPatch.addFilter(PANELS_FILTER_CLASS_DESCRIPTOR) + LithoFilterPatch.addFilter(PANELS_FOOTER_FILTER_CLASS_DESCRIPTOR) /** * Add settings @@ -95,19 +65,4 @@ object PlayerFlyoutPanelPatch : BytecodePatch( SettingsPatch.updatePatchStatus("Hide player flyout panel") } - - private fun MethodFingerprint.injectCall(descriptor: String) { - result?.let { - it.mutableMethod.apply { - val insertIndex = getWideLiteralInstructionIndex(BottomSheetFooterText) + 3 - val insertRegister = - getInstruction(insertIndex).registerA - - addInstruction( - insertIndex, - "invoke-static {v$insertRegister}, $FLYOUT_PANEL->$descriptor(Landroid/view/View;)V" - ) - } - } ?: throw exception - } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/AdditionalSettingsConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/AdditionalSettingsConfigFingerprint.kt deleted file mode 100644 index d23fb2659..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/AdditionalSettingsConfigFingerprint.kt +++ /dev/null @@ -1,8 +0,0 @@ -package app.revanced.patches.youtube.flyoutpanel.player.fingerprints - -import app.revanced.util.fingerprint.LiteralValueFingerprint - -object AdditionalSettingsConfigFingerprint : LiteralValueFingerprint( - returnType = "Z", - literalSupplier = { 45412662 } -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/AdvancedQualityBottomSheetFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/AdvancedQualityBottomSheetFingerprint.kt index 3e40cae2e..cee2b1e26 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/AdvancedQualityBottomSheetFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/AdvancedQualityBottomSheetFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object AdvancedQualityBottomSheetFingerprint : LiteralValueFingerprint( +internal object AdvancedQualityBottomSheetFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "L", "L"), returnType = "L", diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/CaptionsBottomSheetFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/CaptionsBottomSheetFingerprint.kt index 616992892..9de7d4099 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/CaptionsBottomSheetFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/CaptionsBottomSheetFingerprint.kt @@ -7,7 +7,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Subti import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags -object CaptionsBottomSheetFingerprint : MethodFingerprint( +internal object CaptionsBottomSheetFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, customFingerprint = { methodDef, _ -> methodDef.containsWideLiteralInstructionIndex(BottomSheetFooterText) diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/ChangeTogglePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/ChangeTogglePatch.kt similarity index 77% rename from src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/ChangeTogglePatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/ChangeTogglePatch.kt index 65e276d85..15df73345 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/ChangeTogglePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/ChangeTogglePatch.kt @@ -1,68 +1,38 @@ -package app.revanced.patches.youtube.flyoutpanel.player +package app.revanced.patches.youtube.flyoutpanel.toggle import app.revanced.patcher.data.BytecodeContext 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.fingerprint.MethodFingerprint -import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.youtube.flyoutpanel.player.fingerprints.AdditionalSettingsConfigFingerprint -import app.revanced.patches.youtube.flyoutpanel.player.fingerprints.CinematicLightingFingerprint -import app.revanced.patches.youtube.flyoutpanel.player.fingerprints.PlaybackLoopInitFingerprint -import app.revanced.patches.youtube.flyoutpanel.player.fingerprints.PlaybackLoopOnClickListenerFingerprint -import app.revanced.patches.youtube.flyoutpanel.player.fingerprints.StableVolumeFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.FLYOUT_PANEL +import app.revanced.patches.youtube.flyoutpanel.toggle.fingerprints.AdditionalSettingsConfigFingerprint +import app.revanced.patches.youtube.flyoutpanel.toggle.fingerprints.CinematicLightingFingerprint +import app.revanced.patches.youtube.flyoutpanel.toggle.fingerprints.PlaybackLoopInitFingerprint +import app.revanced.patches.youtube.flyoutpanel.toggle.fingerprints.PlaybackLoopOnClickListenerFingerprint +import app.revanced.patches.youtube.flyoutpanel.toggle.fingerprints.StableVolumeFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.FLYOUT_PANEL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getStringInstructionIndex import app.revanced.util.getTargetIndex import app.revanced.util.getTargetIndexReversed +import app.revanced.util.indexOfFirstInstruction +import app.revanced.util.patch.BaseBytecodePatch 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.instruction.ReferenceInstruction -@Patch( +@Suppress("unused") +object ChangeTogglePatch : BaseBytecodePatch( name = "Change player flyout panel toggles", description = "Adds an option to use text toggles instead of switch toggles within the additional settings menu.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ChangeTogglePatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( AdditionalSettingsConfigFingerprint, CinematicLightingFingerprint, PlaybackLoopOnClickListenerFingerprint, @@ -111,9 +81,9 @@ object ChangeTogglePatch : BytecodePatch( ) { fingerprint.result?.let { it.mutableMethod.apply { - val referenceIndex = implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.INVOKE_VIRTUAL - && (instruction as ReferenceInstruction).reference.toString().endsWith(methodToCall) + val referenceIndex = indexOfFirstInstruction { + opcode == Opcode.INVOKE_VIRTUAL + && (this as ReferenceInstruction).reference.toString().endsWith(methodToCall) } if (referenceIndex > 0) { val insertRegister = @@ -121,7 +91,7 @@ object ChangeTogglePatch : BytecodePatch( addInstructions( referenceIndex + 2, """ - invoke-static {v$insertRegister}, $FLYOUT_PANEL->changeSwitchToggle(Z)Z + invoke-static {v$insertRegister}, $FLYOUT_PANEL_CLASS_DESCRIPTOR->changeSwitchToggle(Z)Z move-result v$insertRegister """ ) @@ -139,9 +109,9 @@ object ChangeTogglePatch : BytecodePatch( val stableVolumeMethod = StableVolumeFingerprint.result?.mutableMethod ?: throw StableVolumeFingerprint.exception - val stringReferenceIndex = stableVolumeMethod.implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.INVOKE_VIRTUAL - && (instruction as ReferenceInstruction).reference.toString().endsWith("(Ljava/lang/String;Ljava/lang/String;)V") + val stringReferenceIndex = stableVolumeMethod.indexOfFirstInstruction { + opcode == Opcode.INVOKE_VIRTUAL + && (this as ReferenceInstruction).reference.toString().endsWith("(Ljava/lang/String;Ljava/lang/String;)V") } if (stringReferenceIndex < 0) throw PatchException("Target reference was not found in ${StableVolumeFingerprint.javaClass.simpleName}.") @@ -171,18 +141,18 @@ object ChangeTogglePatch : BytecodePatch( addInstructionsWithLabels( insertIndex, """ const/4 v$freeRegisterC, 0x1 - invoke-static {v$freeRegisterC}, $FLYOUT_PANEL->changeSwitchToggle(Z)Z + invoke-static {v$freeRegisterC}, $FLYOUT_PANEL_CLASS_DESCRIPTOR->changeSwitchToggle(Z)Z move-result v$freeRegisterC if-nez v$freeRegisterC, :ignore sget-object v$freeRegisterC, Ljava/lang/Boolean;->FALSE:Ljava/lang/Boolean; if-eq v$freeRegisterC, v$freeRegisterE, :toggle_off const-string v$freeRegisterE, "stable_volume_on" - invoke-static {v$freeRegisterE}, $FLYOUT_PANEL->getToggleString(Ljava/lang/String;)Ljava/lang/String; + invoke-static {v$freeRegisterE}, $FLYOUT_PANEL_CLASS_DESCRIPTOR->getToggleString(Ljava/lang/String;)Ljava/lang/String; move-result-object v$freeRegisterE goto :set_string :toggle_off const-string v$freeRegisterE, "stable_volume_off" - invoke-static {v$freeRegisterE}, $FLYOUT_PANEL->getToggleString(Ljava/lang/String;)Ljava/lang/String; + invoke-static {v$freeRegisterE}, $FLYOUT_PANEL_CLASS_DESCRIPTOR->getToggleString(Ljava/lang/String;)Ljava/lang/String; move-result-object v$freeRegisterE :set_string iget-object v$freeRegisterC, p0, $iGetObjectPrimaryReference diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/AdditionalSettingsConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/AdditionalSettingsConfigFingerprint.kt new file mode 100644 index 000000000..0407c310c --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/AdditionalSettingsConfigFingerprint.kt @@ -0,0 +1,8 @@ +package app.revanced.patches.youtube.flyoutpanel.toggle.fingerprints + +import app.revanced.util.fingerprint.LiteralValueFingerprint + +internal object AdditionalSettingsConfigFingerprint : LiteralValueFingerprint( + returnType = "Z", + literalSupplier = { 45412662 } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/CinematicLightingFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/CinematicLightingFingerprint.kt similarity index 72% rename from src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/CinematicLightingFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/CinematicLightingFingerprint.kt index ca00234ec..c2ddbd985 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/CinematicLightingFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/CinematicLightingFingerprint.kt @@ -1,10 +1,10 @@ -package app.revanced.patches.youtube.flyoutpanel.player.fingerprints +package app.revanced.patches.youtube.flyoutpanel.toggle.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object CinematicLightingFingerprint : MethodFingerprint( +internal object CinematicLightingFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Ljava/lang/Object;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/PlaybackLoopInitFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/PlaybackLoopInitFingerprint.kt similarity index 76% rename from src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/PlaybackLoopInitFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/PlaybackLoopInitFingerprint.kt index d2752bf4b..8e8817af9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/PlaybackLoopInitFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/PlaybackLoopInitFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.flyoutpanel.player.fingerprints +package app.revanced.patches.youtube.flyoutpanel.toggle.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint @@ -7,7 +7,7 @@ import com.android.tools.smali.dexlib2.AccessFlags /** * Resolves with the class found in [PlaybackLoopOnClickListenerFingerprint]. */ -object PlaybackLoopInitFingerprint : MethodFingerprint( +internal object PlaybackLoopInitFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/PlaybackLoopOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/PlaybackLoopOnClickListenerFingerprint.kt similarity index 70% rename from src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/PlaybackLoopOnClickListenerFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/PlaybackLoopOnClickListenerFingerprint.kt index 765553098..069ffa98c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/PlaybackLoopOnClickListenerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/PlaybackLoopOnClickListenerFingerprint.kt @@ -1,10 +1,10 @@ -package app.revanced.patches.youtube.flyoutpanel.player.fingerprints +package app.revanced.patches.youtube.flyoutpanel.toggle.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object PlaybackLoopOnClickListenerFingerprint : MethodFingerprint( +internal object PlaybackLoopOnClickListenerFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("I", "Z"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/StableVolumeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/StableVolumeFingerprint.kt similarity index 72% rename from src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/StableVolumeFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/StableVolumeFingerprint.kt index d44533c35..28c536149 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/player/fingerprints/StableVolumeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/flyoutpanel/toggle/fingerprints/StableVolumeFingerprint.kt @@ -1,10 +1,10 @@ -package app.revanced.patches.youtube.flyoutpanel.player.fingerprints +package app.revanced.patches.youtube.flyoutpanel.toggle.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object StableVolumeFingerprint : MethodFingerprint( +internal object StableVolumeFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Ljava/lang/Object;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/autoplaypreview/HideAutoplayPreviewPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/autoplaypreview/AutoplayPreviewPatch.kt similarity index 67% rename from src/main/kotlin/app/revanced/patches/youtube/fullscreen/autoplaypreview/HideAutoplayPreviewPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/fullscreen/autoplaypreview/AutoplayPreviewPatch.kt index e01ff301e..7f48a288b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/autoplaypreview/HideAutoplayPreviewPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/autoplaypreview/AutoplayPreviewPatch.kt @@ -3,12 +3,10 @@ package app.revanced.patches.youtube.fullscreen.autoplaypreview import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.utils.fingerprints.LayoutConstructorFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.AutoNavPreviewStub import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.AutoNavToggle @@ -16,48 +14,19 @@ import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getStringInstructionIndex import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object AutoplayPreviewPatch : BaseBytecodePatch( name = "Hide autoplay preview", description = "Adds an option to hide the autoplay preview container when in fullscreen.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideAutoplayPreviewPatch : BytecodePatch( - setOf(LayoutConstructorFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(LayoutConstructorFingerprint) ) { override fun execute(context: BytecodeContext) { LayoutConstructorFingerprint.result?.let { @@ -69,7 +38,7 @@ object HideAutoplayPreviewPatch : BytecodePatch( addInstructionsWithLabels( insertIndex, """ - invoke-static {}, $FULLSCREEN->hideAutoPlayPreview()Z + invoke-static {}, $FULLSCREEN_CLASS_DESCRIPTOR->hideAutoPlayPreview()Z move-result v$dummyRegister if-nez v$dummyRegister, :hidden """, ExternalLabel("hidden", getInstruction(jumpIndex)) diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/compactcontrolsoverlay/CompactControlsOverlayPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/compactcontrolsoverlay/CompactControlsOverlayPatch.kt index f2b6e20f3..6d307f939 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/compactcontrolsoverlay/CompactControlsOverlayPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/compactcontrolsoverlay/CompactControlsOverlayPatch.kt @@ -3,74 +3,39 @@ package app.revanced.patches.youtube.fullscreen.compactcontrolsoverlay import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.utils.fingerprints.YouTubeControlsOverlayFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.getWalkerMethod +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object CompactControlsOverlayPatch : BaseBytecodePatch( name = "Enable compact controls overlay", description = "Adds an option to make the fullscreen controls compact.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object CompactControlsOverlayPatch : BytecodePatch( - setOf(YouTubeControlsOverlayFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(YouTubeControlsOverlayFingerprint) ) { override fun execute(context: BytecodeContext) { YouTubeControlsOverlayFingerprint.result?.let { - with( - context - .toMethodWalker(it.method) - .nextMethod(it.scanResult.patternScanResult!!.startIndex, true) - .getMethod() as MutableMethod - ) { + val walkerMethod = it.getWalkerMethod(context, it.scanResult.patternScanResult!!.startIndex) + walkerMethod.apply { val insertIndex = implementation!!.instructions.size - 1 val targetRegister = getInstruction(insertIndex).registerA addInstructions( insertIndex, """ - invoke-static {v$targetRegister}, $FULLSCREEN->enableCompactControlsOverlay(Z)Z + invoke-static {v$targetRegister}, $FULLSCREEN_CLASS_DESCRIPTOR->enableCompactControlsOverlay(Z)Z move-result v$targetRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/endscreenoverlay/HideEndScreenOverlayPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/endscreenoverlay/EndScreenOverlayPatch.kt similarity index 63% rename from src/main/kotlin/app/revanced/patches/youtube/fullscreen/endscreenoverlay/HideEndScreenOverlayPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/fullscreen/endscreenoverlay/EndScreenOverlayPatch.kt index 137837c8d..2f06e9749 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/endscreenoverlay/HideEndScreenOverlayPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/endscreenoverlay/EndScreenOverlayPatch.kt @@ -3,57 +3,26 @@ package app.revanced.patches.youtube.fullscreen.endscreenoverlay import app.revanced.patcher.data.BytecodeContext 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.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.fullscreen.endscreenoverlay.fingerprints.EndScreenResultsParentFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object EndScreenOverlayPatch : BaseBytecodePatch( name = "Hide end screen overlay", description = "Adds an option to hide the overlay in fullscreen when swiping up and at the end of videos.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideEndScreenOverlayPatch : BytecodePatch( - setOf(EndScreenResultsParentFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(EndScreenResultsParentFingerprint) ) { override fun execute(context: BytecodeContext) { EndScreenResultsParentFingerprint.result?.let { @@ -61,7 +30,7 @@ object HideEndScreenOverlayPatch : BytecodePatch( ?.apply { addInstructionsWithLabels( 0, """ - invoke-static {}, $FULLSCREEN->hideEndScreenOverlay()Z + invoke-static {}, $FULLSCREEN_CLASS_DESCRIPTOR->hideEndScreenOverlay()Z move-result v0 if-eqz v0, :show return-void diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/endscreenoverlay/fingerprints/EndScreenResultsParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/endscreenoverlay/fingerprints/EndScreenResultsParentFingerprint.kt index f2ca5112f..0efee2eab 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/endscreenoverlay/fingerprints/EndScreenResultsParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/endscreenoverlay/fingerprints/EndScreenResultsParentFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.fullscreen.endscreenoverlay.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.AppRelatedEndScreenResults import app.revanced.util.fingerprint.LiteralValueFingerprint -object EndScreenResultsParentFingerprint : LiteralValueFingerprint( +internal object EndScreenResultsParentFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { AppRelatedEndScreenResults } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/forcefullscreen/ForceFullscreenPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/forcefullscreen/ForceFullscreenPatch.kt index a29947970..aa42b10f8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/forcefullscreen/ForceFullscreenPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/forcefullscreen/ForceFullscreenPatch.kt @@ -4,60 +4,29 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.fullscreen.forcefullscreen.fingerprints.ClientSettingEndpointFingerprint import app.revanced.patches.youtube.fullscreen.forcefullscreen.fingerprints.VideoPortraitParentFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getStringInstructionIndex +import app.revanced.util.getTargetIndex +import app.revanced.util.patch.BaseBytecodePatch 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.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object ForceFullscreenPatch : BaseBytecodePatch( name = "Force fullscreen", description = "Adds an option to forcefully open videos in fullscreen.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ForceFullscreenPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( ClientSettingEndpointFingerprint, VideoPortraitParentFingerprint ) @@ -81,7 +50,7 @@ object ForceFullscreenPatch : BytecodePatch( addInstructions( watchDescriptorMethodIndex, """ - invoke-static {v$watchDescriptorRegister}, $FULLSCREEN->forceFullscreen(Z)Z + invoke-static {v$watchDescriptorRegister}, $FULLSCREEN_CLASS_DESCRIPTOR->forceFullscreen(Z)Z move-result v$watchDescriptorRegister """ ) @@ -93,7 +62,7 @@ object ForceFullscreenPatch : BytecodePatch( insertIndex, """ iget-object v$freeRegister, v$classRegister, $getActivityReference check-cast v$freeRegister, Landroid/app/Activity; - sput-object v$freeRegister, $FULLSCREEN->watchDescriptorActivity:Landroid/app/Activity; + sput-object v$freeRegister, $FULLSCREEN_CLASS_DESCRIPTOR->watchDescriptorActivity:Landroid/app/Activity; """ ) } @@ -107,8 +76,8 @@ object ForceFullscreenPatch : BytecodePatch( it.mutableMethod.apply { val stringIndex = getStringInstructionIndex("Acquiring NetLatencyActionLogger failed. taskId=") - val invokeIndex = getTargetIndexTo(stringIndex, Opcode.INVOKE_INTERFACE) - val targetIndex = getTargetIndexTo(invokeIndex, Opcode.CHECK_CAST) + val invokeIndex = getTargetIndex(stringIndex, Opcode.INVOKE_INTERFACE) + val targetIndex = getTargetIndex(invokeIndex, Opcode.CHECK_CAST) val targetClass = context .findClass(getInstruction(targetIndex).reference.toString())!! .mutableClass @@ -117,7 +86,7 @@ object ForceFullscreenPatch : BytecodePatch( ?.apply { addInstruction( 1, - "invoke-static {p1, p2}, $FULLSCREEN->setVideoPortrait(II)V" + "invoke-static {p1, p2}, $FULLSCREEN_CLASS_DESCRIPTOR->setVideoPortrait(II)V" ) } ?: throw PatchException("Could not find targetMethod") } @@ -137,17 +106,4 @@ object ForceFullscreenPatch : BytecodePatch( SettingsPatch.updatePatchStatus("Force fullscreen") } - - private fun MutableMethod.getTargetIndexTo( - startIndex: Int, - opcode: Opcode - ): Int { - for (index in startIndex until implementation!!.instructions.size) { - if (getInstruction(index).opcode != opcode) - continue - - return index - } - throw PatchException("Failed to find target index") - } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/forcefullscreen/fingerprints/ClientSettingEndpointFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/forcefullscreen/fingerprints/ClientSettingEndpointFingerprint.kt index 1f2e01078..f48f47596 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/forcefullscreen/fingerprints/ClientSettingEndpointFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/forcefullscreen/fingerprints/ClientSettingEndpointFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object ClientSettingEndpointFingerprint : MethodFingerprint( +internal object ClientSettingEndpointFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "Ljava/util/Map;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/forcefullscreen/fingerprints/VideoPortraitParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/forcefullscreen/fingerprints/VideoPortraitParentFingerprint.kt index 1edd51148..3539c0352 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/forcefullscreen/fingerprints/VideoPortraitParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/forcefullscreen/fingerprints/VideoPortraitParentFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object VideoPortraitParentFingerprint : MethodFingerprint( +internal object VideoPortraitParentFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "Ljava/util/Map;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/FullscreenPanelsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/FullscreenPanelsPatch.kt new file mode 100644 index 000000000..bda87b971 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/FullscreenPanelsPatch.kt @@ -0,0 +1,81 @@ +package app.revanced.patches.youtube.fullscreen.fullscreenpanels + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.youtube.fullscreen.fullscreenpanels.fingerprints.FullscreenEngagementPanelFingerprint +import app.revanced.patches.youtube.utils.fingerprints.LayoutConstructorFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN_CLASS_DESCRIPTOR +import app.revanced.patches.youtube.utils.quickactions.QuickActionsHookPatch +import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.FullScreenEngagementPanel +import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.exception +import app.revanced.util.getTargetIndex +import app.revanced.util.getTargetIndexWithMethodReferenceName +import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction + +@Suppress("unused") +object FullscreenPanelsPatch : BaseBytecodePatch( + name = "Hide fullscreen panels", + description = "Adds an option to hide panels such as live chat when in fullscreen.", + dependencies = setOf( + QuickActionsHookPatch::class, + SettingsPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( + FullscreenEngagementPanelFingerprint, + LayoutConstructorFingerprint + ) +) { + override fun execute(context: BytecodeContext) { + + FullscreenEngagementPanelFingerprint.result?.let { + it.mutableMethod.apply { + val literalIndex = getWideLiteralInstructionIndex(FullScreenEngagementPanel) + val targetIndex = getTargetIndex(literalIndex, Opcode.CHECK_CAST) + val targetRegister = getInstruction(targetIndex).registerA + + addInstruction( + targetIndex + 1, + "invoke-static {v$targetRegister}, $FULLSCREEN_CLASS_DESCRIPTOR->hideFullscreenPanels(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V" + ) + } + } ?: throw FullscreenEngagementPanelFingerprint.exception + + LayoutConstructorFingerprint.result?.let { + it.mutableMethod.apply { + val dummyIndex = getWideLiteralInstructionIndex(159962) + val dummyRegister = getInstruction(dummyIndex).registerA + val addViewIndex = getTargetIndexWithMethodReferenceName("addView") + + addInstructionsWithLabels( + addViewIndex, """ + invoke-static {}, $FULLSCREEN_CLASS_DESCRIPTOR->showFullscreenTitle()Z + move-result v$dummyRegister + if-eqz v$dummyRegister, :hidden + """, ExternalLabel("hidden", getInstruction(addViewIndex + 1)) + ) + } + } ?: throw LayoutConstructorFingerprint.exception + + /** + * Add settings + */ + SettingsPatch.addPreference( + arrayOf( + "PREFERENCE: FULLSCREEN_SETTINGS", + "SETTINGS: HIDE_FULLSCREEN_PANELS" + ) + ) + + SettingsPatch.updatePatchStatus("Hide fullscreen panels") + + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/HideFullscreenPanelsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/HideFullscreenPanelsPatch.kt deleted file mode 100644 index 1418aef18..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/HideFullscreenPanelsPatch.kt +++ /dev/null @@ -1,136 +0,0 @@ -package app.revanced.patches.youtube.fullscreen.fullscreenpanels - -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -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.extensions.InstructionExtensions.removeInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.youtube.fullscreen.fullscreenpanels.fingerprints.FullscreenEngagementPanelFingerprint -import app.revanced.patches.youtube.fullscreen.fullscreenpanels.fingerprints.FullscreenViewAdderFingerprint -import app.revanced.patches.youtube.utils.fingerprints.LayoutConstructorFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN -import app.revanced.patches.youtube.utils.quickactions.QuickActionsHookPatch -import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.FullScreenEngagementPanel -import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.exception -import app.revanced.util.getWideLiteralInstructionIndex -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.instruction.formats.Instruction35c - -@Patch( - name = "Hide fullscreen panels", - description = "Adds an option to hide panels such as live chat when in fullscreen.", - dependencies = [ - QuickActionsHookPatch::class, - SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideFullscreenPanelsPatch : BytecodePatch( - setOf( - FullscreenEngagementPanelFingerprint, - FullscreenViewAdderFingerprint, - LayoutConstructorFingerprint - ) -) { - override fun execute(context: BytecodeContext) { - - FullscreenEngagementPanelFingerprint.result?.let { - it.mutableMethod.apply { - val targetIndex = getWideLiteralInstructionIndex(FullScreenEngagementPanel) + 3 - val targetRegister = getInstruction(targetIndex).registerA - - addInstruction( - targetIndex + 1, - "invoke-static {v$targetRegister}, $FULLSCREEN->hideFullscreenPanels(Landroidx/coordinatorlayout/widget/CoordinatorLayout;)V" - ) - } - } ?: throw FullscreenEngagementPanelFingerprint.exception - - FullscreenViewAdderFingerprint.result?.let { - it.mutableMethod.apply { - val endIndex = it.scanResult.patternScanResult!!.endIndex - val register = getInstruction(endIndex).registerD - - for (i in 1..3) removeInstruction(endIndex - i) - - addInstructions( - endIndex - 3, """ - invoke-static {}, $FULLSCREEN->hideFullscreenPanels()I - move-result v$register - """ - ) - } - } - - LayoutConstructorFingerprint.result?.let { - it.mutableMethod.apply { - val dummyRegister = - getInstruction(getWideLiteralInstructionIndex(159962)).registerA - - val invokeIndex = implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.INVOKE_VIRTUAL && - ((instruction as ReferenceInstruction).reference.toString() == - "Landroid/widget/FrameLayout;->addView(Landroid/view/View;)V") - } - - addInstructionsWithLabels( - invokeIndex, """ - invoke-static {}, $FULLSCREEN->showFullscreenTitle()Z - move-result v$dummyRegister - if-eqz v$dummyRegister, :hidden - """, ExternalLabel("hidden", getInstruction(invokeIndex + 1)) - ) - } - } ?: throw LayoutConstructorFingerprint.exception - - /** - * Add settings - */ - SettingsPatch.addPreference( - arrayOf( - "PREFERENCE: FULLSCREEN_SETTINGS", - "SETTINGS: HIDE_FULLSCREEN_PANELS" - ) - ) - - SettingsPatch.updatePatchStatus("Hide fullscreen panels") - - } -} diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/fingerprints/FullscreenEngagementPanelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/fingerprints/FullscreenEngagementPanelFingerprint.kt index bc5d70c37..7b863d329 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/fingerprints/FullscreenEngagementPanelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/fingerprints/FullscreenEngagementPanelFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.fullscreen.fullscreenpanels.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.FullScreenEngagementPanel import app.revanced.util.fingerprint.LiteralValueFingerprint -object FullscreenEngagementPanelFingerprint : LiteralValueFingerprint( +internal object FullscreenEngagementPanelFingerprint : LiteralValueFingerprint( returnType = "L", parameters = listOf("L"), literalSupplier = { FullScreenEngagementPanel } diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/fingerprints/FullscreenViewAdderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/fingerprints/FullscreenViewAdderFingerprint.kt deleted file mode 100644 index 13cfdb2ae..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/fullscreenpanels/fingerprints/FullscreenViewAdderFingerprint.kt +++ /dev/null @@ -1,16 +0,0 @@ -package app.revanced.patches.youtube.fullscreen.fullscreenpanels.fingerprints - -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.Opcode - -object FullscreenViewAdderFingerprint : MethodFingerprint( - parameters = listOf("L", "L"), - opcodes = listOf( - Opcode.IGET_BOOLEAN, - Opcode.IF_EQ, - Opcode.GOTO, - Opcode.CONST_4, - Opcode.INVOKE_VIRTUAL - ), - customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/FullscreenEngagementPanelOverlay;") } -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/LandScapeModePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/LandScapeModePatch.kt new file mode 100644 index 000000000..6306220d8 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/LandScapeModePatch.kt @@ -0,0 +1,111 @@ +package app.revanced.patches.youtube.fullscreen.landscapemode + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.addInstructions +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patches.youtube.fullscreen.landscapemode.fingerprints.BroadcastReceiverFingerprint +import app.revanced.patches.youtube.fullscreen.landscapemode.fingerprints.LandScapeModeConfigFingerprint +import app.revanced.patches.youtube.fullscreen.landscapemode.fingerprints.OrientationParentFingerprint +import app.revanced.patches.youtube.fullscreen.landscapemode.fingerprints.OrientationPrimaryFingerprint +import app.revanced.patches.youtube.fullscreen.landscapemode.fingerprints.OrientationSecondaryFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN_CLASS_DESCRIPTOR +import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.exception +import app.revanced.util.getStringInstructionIndex +import app.revanced.util.getTargetIndex +import app.revanced.util.patch.BaseBytecodePatch +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction + +@Suppress("unused") +object LandScapeModePatch : BaseBytecodePatch( + name = "Landscape mode", + description = "Adds an option to disable landscape mode when entering fullscreen" + + "and an option to keep landscape mode when turning the screen off and on in fullscreen.", + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( + BroadcastReceiverFingerprint, + LandScapeModeConfigFingerprint, + OrientationParentFingerprint + ) +) { + override fun execute(context: BytecodeContext) { + /** + * Disable landscape mode + */ + OrientationParentFingerprint.result?.classDef?.let { classDef -> + arrayOf( + OrientationPrimaryFingerprint, + OrientationSecondaryFingerprint + ).forEach { fingerprint -> + fingerprint.resolve(context, classDef) + + fingerprint.result?.let { + it.mutableMethod.apply { + val index = it.scanResult.patternScanResult!!.endIndex + val register = getInstruction(index).registerA + + addInstructions( + index + 1, """ + invoke-static {v$register}, $FULLSCREEN_CLASS_DESCRIPTOR->disableLandScapeMode(Z)Z + move-result v$register + """ + ) + } + } ?: throw fingerprint.exception + } + } ?: throw OrientationParentFingerprint.exception + + /** + * Keep landscape mode + */ + LandScapeModeConfigFingerprint.result?.let { + it.mutableMethod.apply { + val insertIndex = implementation!!.instructions.size - 1 + val insertRegister = getInstruction(insertIndex).registerA + + addInstructions( + insertIndex, """ + invoke-static {v$insertRegister}, $FULLSCREEN_CLASS_DESCRIPTOR->keepFullscreen(Z)Z + move-result v$insertRegister + """ + ) + } + + BroadcastReceiverFingerprint.result?.let { result -> + result.mutableMethod.apply { + val stringIndex = getStringInstructionIndex("android.intent.action.SCREEN_ON") + val insertIndex = getTargetIndex(stringIndex, Opcode.IF_EQZ) + 1 + + addInstruction( + insertIndex, + "invoke-static {}, $FULLSCREEN_CLASS_DESCRIPTOR->setScreenStatus()V" + ) + } + } ?: throw BroadcastReceiverFingerprint.exception + + SettingsPatch.addPreference( + arrayOf( + "SETTINGS: KEEP_LANDSCAPE_MODE" + ) + ) + } // no exceptions are raised for compatibility with all versions. + + /** + * Add settings + */ + SettingsPatch.addPreference( + arrayOf( + "PREFERENCE: FULLSCREEN_SETTINGS", + "SETTINGS: FULLSCREEN_EXPERIMENTAL_FLAGS", + "SETTINGS: DISABLE_LANDSCAPE_MODE" + ) + ) + + SettingsPatch.updatePatchStatus("Landscape mode") + + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/DisableLandScapeModePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/DisableLandScapeModePatch.kt deleted file mode 100644 index 86ba8f770..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/DisableLandScapeModePatch.kt +++ /dev/null @@ -1,98 +0,0 @@ -package app.revanced.patches.youtube.fullscreen.landscapemode.disable - -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.fingerprint.MethodFingerprintResult -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.youtube.fullscreen.landscapemode.disable.fingerprints.OrientationParentFingerprint -import app.revanced.patches.youtube.fullscreen.landscapemode.disable.fingerprints.OrientationPrimaryFingerprint -import app.revanced.patches.youtube.fullscreen.landscapemode.disable.fingerprints.OrientationSecondaryFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN -import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.exception -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -@Patch( - name = "Disable landscape mode", - description = "Adds an option to disable landscape mode when entering fullscreen.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object DisableLandScapeModePatch : BytecodePatch( - setOf(OrientationParentFingerprint) -) { - override fun execute(context: BytecodeContext) { - OrientationParentFingerprint.result?.classDef?.let { classDef -> - arrayOf( - OrientationPrimaryFingerprint, - OrientationSecondaryFingerprint - ).forEach { - it.also { it.resolve(context, classDef) }.result?.injectOverride() - ?: throw it.exception - } - } ?: throw OrientationParentFingerprint.exception - - /** - * Add settings - */ - SettingsPatch.addPreference( - arrayOf( - "PREFERENCE: FULLSCREEN_SETTINGS", - "SETTINGS: FULLSCREEN_EXPERIMENTAL_FLAGS", - "SETTINGS: DISABLE_LANDSCAPE_MODE" - ) - ) - - SettingsPatch.updatePatchStatus("Disable landscape mode") - - } - - private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "$FULLSCREEN->disableLandScapeMode(Z)Z" - - private fun MethodFingerprintResult.injectOverride() { - mutableMethod.apply { - val index = scanResult.patternScanResult!!.endIndex - val register = getInstruction(index).registerA - - addInstructions( - index + 1, """ - invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR - move-result v$register - """ - ) - } - } -} diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/keep/fingerprints/BroadcastReceiverFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/BroadcastReceiverFingerprint.kt similarity index 80% rename from src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/keep/fingerprints/BroadcastReceiverFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/BroadcastReceiverFingerprint.kt index a4e45139c..e6af2829b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/keep/fingerprints/BroadcastReceiverFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/BroadcastReceiverFingerprint.kt @@ -1,10 +1,10 @@ -package app.revanced.patches.youtube.fullscreen.landscapemode.keep.fingerprints +package app.revanced.patches.youtube.fullscreen.landscapemode.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object BroadcastReceiverFingerprint : MethodFingerprint( +internal object BroadcastReceiverFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/content/Context;", "Landroid/content/Intent;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/keep/fingerprints/LandScapeModeConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/LandScapeModeConfigFingerprint.kt similarity index 55% rename from src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/keep/fingerprints/LandScapeModeConfigFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/LandScapeModeConfigFingerprint.kt index 2fc653ee0..02bd1977a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/keep/fingerprints/LandScapeModeConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/LandScapeModeConfigFingerprint.kt @@ -1,11 +1,11 @@ -package app.revanced.patches.youtube.fullscreen.landscapemode.keep.fingerprints +package app.revanced.patches.youtube.fullscreen.landscapemode.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint /** * This fingerprint is compatible with YouTube v18.42.41+ */ -object LandScapeModeConfigFingerprint : LiteralValueFingerprint( +internal object LandScapeModeConfigFingerprint : LiteralValueFingerprint( returnType = "Z", literalSupplier = { 45446428 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/fingerprints/OrientationParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/OrientationParentFingerprint.kt similarity index 53% rename from src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/fingerprints/OrientationParentFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/OrientationParentFingerprint.kt index 337083580..5538ef668 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/fingerprints/OrientationParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/OrientationParentFingerprint.kt @@ -1,8 +1,8 @@ -package app.revanced.patches.youtube.fullscreen.landscapemode.disable.fingerprints +package app.revanced.patches.youtube.fullscreen.landscapemode.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object OrientationParentFingerprint : MethodFingerprint( +internal object OrientationParentFingerprint : MethodFingerprint( returnType = "Z", strings = listOf("NoClassDefFoundError thrown while verifying stack trace.") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/fingerprints/OrientationPrimaryFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/OrientationPrimaryFingerprint.kt similarity index 76% rename from src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/fingerprints/OrientationPrimaryFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/OrientationPrimaryFingerprint.kt index 2446f373a..5e526331a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/fingerprints/OrientationPrimaryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/OrientationPrimaryFingerprint.kt @@ -1,11 +1,11 @@ -package app.revanced.patches.youtube.fullscreen.landscapemode.disable.fingerprints +package app.revanced.patches.youtube.fullscreen.landscapemode.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object OrientationPrimaryFingerprint : MethodFingerprint( +internal object OrientationPrimaryFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/fingerprints/OrientationSecondaryFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/OrientationSecondaryFingerprint.kt similarity index 73% rename from src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/fingerprints/OrientationSecondaryFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/OrientationSecondaryFingerprint.kt index 5699c135d..bc2dbb2dd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/disable/fingerprints/OrientationSecondaryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/fingerprints/OrientationSecondaryFingerprint.kt @@ -1,11 +1,11 @@ -package app.revanced.patches.youtube.fullscreen.landscapemode.disable.fingerprints +package app.revanced.patches.youtube.fullscreen.landscapemode.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object OrientationSecondaryFingerprint : MethodFingerprint( +internal object OrientationSecondaryFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/keep/KeepLandScapeModePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/keep/KeepLandScapeModePatch.kt deleted file mode 100644 index 42d99eaf8..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/landscapemode/keep/KeepLandScapeModePatch.kt +++ /dev/null @@ -1,91 +0,0 @@ -package app.revanced.patches.youtube.fullscreen.landscapemode.keep - -import app.revanced.patcher.data.BytecodeContext -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.patch.BytecodePatch -import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.youtube.fullscreen.landscapemode.keep.fingerprints.BroadcastReceiverFingerprint -import app.revanced.patches.youtube.fullscreen.landscapemode.keep.fingerprints.LandScapeModeConfigFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN -import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.exception -import app.revanced.util.getStringInstructionIndex -import app.revanced.util.getTargetIndex -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction - -@Patch( - name = "Keep landscape mode", - description = "Adds an option to keep landscape mode when turning the screen off and on in fullscreen.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], - use = false -) -@Suppress("unused") -object KeepLandScapeModePatch : BytecodePatch( - setOf( - BroadcastReceiverFingerprint, - LandScapeModeConfigFingerprint - ) -) { - override fun execute(context: BytecodeContext) { - LandScapeModeConfigFingerprint.result?.let { - it.mutableMethod.apply { - val insertIndex = implementation!!.instructions.size - 1 - val insertRegister = getInstruction(insertIndex).registerA - - addInstructions( - insertIndex, """ - invoke-static {v$insertRegister}, $FULLSCREEN->keepFullscreen(Z)Z - move-result v$insertRegister - """ - ) - } - } ?: throw PatchException("This version is not supported. Please use YouTube 18.42.41 or later.") - - BroadcastReceiverFingerprint.result?.let { result -> - result.mutableMethod.apply { - val stringIndex = getStringInstructionIndex("android.intent.action.SCREEN_ON") - val insertIndex = getTargetIndex(stringIndex, Opcode.IF_EQZ) + 1 - - addInstruction( - insertIndex, - "invoke-static {}, $FULLSCREEN->setScreenStatus()V" - ) - } - } ?: throw BroadcastReceiverFingerprint.exception - - /** - * Add settings - */ - SettingsPatch.addPreference( - arrayOf( - "PREFERENCE: FULLSCREEN_SETTINGS", - "SETTINGS: FULLSCREEN_EXPERIMENTAL_FLAGS", - "SETTINGS: KEEP_LANDSCAPE_MODE" - ) - ) - - SettingsPatch.updatePatchStatus("Keep landscape mode") - - } -} diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/quickactions/QuickActionsComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/quickactions/QuickActionsComponentsPatch.kt new file mode 100644 index 000000000..b3310ba75 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/quickactions/QuickActionsComponentsPatch.kt @@ -0,0 +1,43 @@ +package app.revanced.patches.youtube.fullscreen.quickactions + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH +import app.revanced.patches.youtube.utils.quickactions.QuickActionsHookPatch +import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseBytecodePatch + +@Suppress("unused") +object QuickActionsComponentsPatch : BaseBytecodePatch( + name = "Quick actions components", + description = "Adds options to hide and customize components below the seekbar in fullscreen.", + dependencies = setOf( + LithoFilterPatch::class, + QuickActionsHookPatch::class, + SettingsPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/QuickActionFilter;" + + override fun execute(context: BytecodeContext) { + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) + + QuickActionsHookPatch.injectQuickActionMargin() + + /** + * Add settings + */ + SettingsPatch.addPreference( + arrayOf( + "PREFERENCE: BOTTOM_PLAYER_SETTINGS", + "SETTINGS: QUICK_ACTIONS_COMPONENTS" + ) + ) + + SettingsPatch.updatePatchStatus("Quick actions components") + + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/quickactions/QuickActionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/fullscreen/quickactions/QuickActionsPatch.kt deleted file mode 100644 index 63bef40de..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/fullscreen/quickactions/QuickActionsPatch.kt +++ /dev/null @@ -1,70 +0,0 @@ -package app.revanced.patches.youtube.fullscreen.quickactions - -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.litho.LithoFilterPatch -import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH -import app.revanced.patches.youtube.utils.quickactions.QuickActionsHookPatch -import app.revanced.patches.youtube.utils.settings.SettingsPatch - -@Patch( - name = "Quick actions components", - description = "Adds options to hide and customize components below the seekbar in fullscreen.", - dependencies = [ - LithoFilterPatch::class, - QuickActionsHookPatch::class, - SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object QuickActionsPatch : BytecodePatch(emptySet()) { - override fun execute(context: BytecodeContext) { - LithoFilterPatch.addFilter("$COMPONENTS_PATH/QuickActionFilter;") - - QuickActionsHookPatch.injectQuickActionMargin() - - /** - * Add settings - */ - SettingsPatch.addPreference( - arrayOf( - "PREFERENCE: BOTTOM_PLAYER_SETTINGS", - "SETTINGS: QUICK_ACTIONS_COMPONENTS" - ) - ) - - SettingsPatch.updatePatchStatus("Quick actions components") - - } -} diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/AccountMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/AccountMenuPatch.kt index e5911d1b8..811a2e032 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/AccountMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/AccountMenuPatch.kt @@ -4,62 +4,31 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.general.accountmenu.fingerprints.AccountListFingerprint import app.revanced.patches.youtube.general.accountmenu.fingerprints.AccountListParentFingerprint import app.revanced.patches.youtube.general.accountmenu.fingerprints.AccountMenuFingerprint import app.revanced.patches.youtube.general.accountmenu.fingerprints.AccountMenuParentFingerprint import app.revanced.patches.youtube.general.accountmenu.fingerprints.AccountMenuPatchFingerprint import app.revanced.patches.youtube.general.accountmenu.fingerprints.SetViewGroupMarginFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -@Patch( +@Suppress("unused") +object AccountMenuPatch : BaseBytecodePatch( name = "Hide account menu", description = "Adds the ability to hide account menu elements using a custom filter in the account menu and You tab.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object AccountMenuPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( AccountListParentFingerprint, AccountMenuParentFingerprint, AccountMenuPatchFingerprint @@ -68,12 +37,9 @@ object AccountMenuPatch : BytecodePatch( override fun execute(context: BytecodeContext) { AccountListParentFingerprint.result?.let { parentResult -> - AccountListFingerprint.also { - it.resolve( - context, - parentResult.classDef - ) - }.result?.let { + AccountListFingerprint.resolve(context, parentResult.classDef) + + AccountListFingerprint.result?.let { it.mutableMethod.apply { val targetIndex = it.scanResult.patternScanResult!!.startIndex + 3 val targetInstruction = getInstruction(targetIndex) @@ -81,19 +47,17 @@ object AccountMenuPatch : BytecodePatch( addInstruction( targetIndex, "invoke-static {v${targetInstruction.registerC}, v${targetInstruction.registerD}}, " + - "$GENERAL->hideAccountList(Landroid/view/View;Ljava/lang/CharSequence;)V" + "$GENERAL_CLASS_DESCRIPTOR->hideAccountList(Landroid/view/View;Ljava/lang/CharSequence;)V" ) } } ?: throw AccountListFingerprint.exception } ?: throw AccountListParentFingerprint.exception AccountMenuParentFingerprint.result?.let { parentResult -> - AccountMenuFingerprint.also { - it.resolve( - context, - parentResult.classDef - ) - }.result?.let { + AccountMenuFingerprint.resolve(context, parentResult.classDef) + SetViewGroupMarginFingerprint.resolve(context, parentResult.classDef) + + AccountMenuFingerprint.result?.let { it.mutableMethod.apply { val targetIndex = it.scanResult.patternScanResult!!.startIndex + 2 val targetInstruction = getInstruction(targetIndex) @@ -101,17 +65,12 @@ object AccountMenuPatch : BytecodePatch( addInstruction( targetIndex, "invoke-static {v${targetInstruction.registerC}, v${targetInstruction.registerD}}, " + - "$GENERAL->hideAccountMenu(Landroid/view/View;Ljava/lang/CharSequence;)V" + "$GENERAL_CLASS_DESCRIPTOR->hideAccountMenu(Landroid/view/View;Ljava/lang/CharSequence;)V" ) } } ?: throw AccountMenuFingerprint.exception - SetViewGroupMarginFingerprint.also { - it.resolve( - context, - parentResult.classDef - ) - }.result?.let { + SetViewGroupMarginFingerprint.result?.let { it.mutableMethod.apply { val setViewGroupMarginIndex = it.scanResult.patternScanResult!!.startIndex val setViewGroupMarginReference = diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountListFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountListFingerprint.kt index 1f5cfffac..84b492612 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountListFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountListFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object AccountListFingerprint : MethodFingerprint( +internal object AccountListFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL or AccessFlags.SYNTHETIC, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountListParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountListParentFingerprint.kt index 5b2b822fe..cded93375 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountListParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountListParentFingerprint.kt @@ -3,6 +3,6 @@ package app.revanced.patches.youtube.general.accountmenu.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.CompactListItem import app.revanced.util.fingerprint.LiteralValueFingerprint -object AccountListParentFingerprint : LiteralValueFingerprint( +internal object AccountListParentFingerprint : LiteralValueFingerprint( literalSupplier = { CompactListItem } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountMenuFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountMenuFingerprint.kt index ae664150e..a37c9bf13 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountMenuFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountMenuFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.general.accountmenu.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object AccountMenuFingerprint : MethodFingerprint( +internal object AccountMenuFingerprint : MethodFingerprint( returnType = "V", opcodes = listOf( Opcode.INVOKE_STATIC, diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountMenuParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountMenuParentFingerprint.kt index 802e64dfd..c703ce4a1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountMenuParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountMenuParentFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Compa import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object AccountMenuParentFingerprint : LiteralValueFingerprint( +internal object AccountMenuParentFingerprint : LiteralValueFingerprint( opcodes = listOf( Opcode.CONST, Opcode.CONST_4, diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountMenuPatchFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountMenuPatchFingerprint.kt index d4a314dac..b6bc7a4fb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountMenuPatchFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/AccountMenuPatchFingerprint.kt @@ -2,13 +2,14 @@ package app.revanced.patches.youtube.general.accountmenu.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import com.android.tools.smali.dexlib2.AccessFlags -object AccountMenuPatchFingerprint : MethodFingerprint( +internal object AccountMenuPatchFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.STATIC, customFingerprint = { methodDef, _ -> - methodDef.definingClass == "Lapp/revanced/integrations/youtube/patches/general/GeneralPatch;" + methodDef.definingClass == GENERAL_CLASS_DESCRIPTOR && methodDef.name == "hideAccountMenu" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/SetViewGroupMarginFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/SetViewGroupMarginFingerprint.kt index df953eb0e..c32c88933 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/SetViewGroupMarginFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/accountmenu/fingerprints/SetViewGroupMarginFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SetViewGroupMarginFingerprint : MethodFingerprint( +internal object SetViewGroupMarginFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = listOf("Z"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/AutoCaptionsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/AutoCaptionsBytecodePatch.kt new file mode 100644 index 000000000..ff4669673 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/AutoCaptionsBytecodePatch.kt @@ -0,0 +1,6 @@ +package app.revanced.patches.youtube.general.autocaptions + +import app.revanced.patches.shared.captions.BaseAutoCaptionsPatch +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR + +object AutoCaptionsBytecodePatch : BaseAutoCaptionsPatch(GENERAL_CLASS_DESCRIPTOR) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/AutoCaptionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/AutoCaptionsPatch.kt index deb0d1a57..e6445a5b1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/AutoCaptionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/autocaptions/AutoCaptionsPatch.kt @@ -1,58 +1,26 @@ package app.revanced.patches.youtube.general.autocaptions import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.captions.AbstractAutoCaptionsPatch -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.videoid.general.VideoIdPatch +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object AutoCaptionsPatch : BaseBytecodePatch( name = "Disable auto captions", description = "Adds an option to disable captions from being automatically enabled.", - dependencies = [ + dependencies = setOf( + AutoCaptionsBytecodePatch::class, SettingsPatch::class, VideoIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object AutoCaptionsPatch : AbstractAutoCaptionsPatch( - GENERAL + ), + compatiblePackages = COMPATIBLE_PACKAGE ) { override fun execute(context: BytecodeContext) { - super.execute(context) - VideoIdPatch.injectCall("$GENERAL->newVideoStarted(Ljava/lang/String;)V") + VideoIdPatch.injectCall("$GENERAL_CLASS_DESCRIPTOR->newVideoStarted(Ljava/lang/String;)V") /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/autopopuppanels/PlayerPopupPanelsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/autopopuppanels/PlayerPopupPanelsPatch.kt index 98a3939ef..83339de42 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/autopopuppanels/PlayerPopupPanelsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/autopopuppanels/PlayerPopupPanelsPatch.kt @@ -3,52 +3,21 @@ package app.revanced.patches.youtube.general.autopopuppanels import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.general.autopopuppanels.fingerprints.EngagementPanelControllerFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object PlayerPopupPanelsPatch : BaseBytecodePatch( name = "Hide auto player popup panels", description = "Adds an option to hide panels (such as live chat) from opening automatically.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object PlayerPopupPanelsPatch : BytecodePatch( - setOf(EngagementPanelControllerFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(EngagementPanelControllerFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -56,13 +25,14 @@ object PlayerPopupPanelsPatch : BytecodePatch( it.mutableMethod.apply { addInstructionsWithLabels( 0, """ - invoke-static {}, $GENERAL->hideAutoPlayerPopupPanels()Z + invoke-static {}, $GENERAL_CLASS_DESCRIPTOR->hideAutoPlayerPopupPanels()Z move-result v0 - if-eqz v0, :player_popup_panels_shown - if-eqz p4, :player_popup_panels_shown + if-eqz v0, :shown + # The type of the fourth parameter is boolean. + if-eqz p4, :shown const/4 v0, 0x0 return-object v0 - """, ExternalLabel("player_popup_panels_shown", getInstruction(0)) + """, ExternalLabel("shown", getInstruction(0)) ) } } ?: throw EngagementPanelControllerFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/autopopuppanels/fingerprints/EngagementPanelControllerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/autopopuppanels/fingerprints/EngagementPanelControllerFingerprint.kt index 9479ee0e8..0957621d6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/autopopuppanels/fingerprints/EngagementPanelControllerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/autopopuppanels/fingerprints/EngagementPanelControllerFingerprint.kt @@ -4,9 +4,10 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object EngagementPanelControllerFingerprint : MethodFingerprint( +internal object EngagementPanelControllerFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, + parameters = listOf("L", "L", "Z", "Z"), strings = listOf( "EngagementPanelController: cannot show EngagementPanel before EngagementPanelController.init() has been called.", "[EngagementPanel] Cannot show EngagementPanel before EngagementPanelController.init() has been called." diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/castbutton/HideCastButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/castbutton/CastButtonPatch.kt similarity index 51% rename from src/main/kotlin/app/revanced/patches/youtube/general/castbutton/HideCastButtonPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/general/castbutton/CastButtonPatch.kt index cc2f1cfca..e9af5d3ba 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/castbutton/HideCastButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/castbutton/CastButtonPatch.kt @@ -2,58 +2,27 @@ package app.revanced.patches.youtube.general.castbutton import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.general.castbutton.fingerprints.CastButtonFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object CastButtonPatch : BaseBytecodePatch( name = "Hide cast button", description = "Adds an option to hide the cast button.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideCastButtonPatch : BytecodePatch( - setOf(CastButtonFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(CastButtonFingerprint) ) { override fun execute(context: BytecodeContext) { CastButtonFingerprint.result?.let { it.mutableMethod.apply { addInstructions( 0, """ - invoke-static {p1}, $GENERAL->hideCastButton(I)I + invoke-static {p1}, $GENERAL_CLASS_DESCRIPTOR->hideCastButton(I)I move-result p1 """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/castbutton/fingerprints/CastButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/castbutton/fingerprints/CastButtonFingerprint.kt index 6d86b488d..a30f5bbe9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/castbutton/fingerprints/CastButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/castbutton/fingerprints/CastButtonFingerprint.kt @@ -2,7 +2,8 @@ package app.revanced.patches.youtube.general.castbutton.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object CastButtonFingerprint : MethodFingerprint( +internal object CastButtonFingerprint : MethodFingerprint( + parameters = listOf("I"), customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/MediaRouteButton;") && methodDef.name == "setVisibility" diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/CategoryBarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/CategoryBarPatch.kt index 0e7047359..c9b02faff 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/CategoryBarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/CategoryBarPatch.kt @@ -4,59 +4,28 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.fingerprint.MethodFingerprint -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.general.categorybar.fingerprints.FilterBarHeightFingerprint import app.revanced.patches.youtube.general.categorybar.fingerprints.RelatedChipCloudFingerprint import app.revanced.patches.youtube.general.categorybar.fingerprints.SearchResultsChipBarFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object CategoryBarPatch : BaseBytecodePatch( name = "Hide category bar", description = "Adds an option to hide the category bar in feeds.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object CategoryBarPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( FilterBarHeightFingerprint, RelatedChipCloudFingerprint, SearchResultsChipBarFingerprint @@ -66,19 +35,19 @@ object CategoryBarPatch : BytecodePatch( FilterBarHeightFingerprint.patch { register -> """ - invoke-static { v$register }, $GENERAL->hideCategoryBarInFeed(I)I + invoke-static { v$register }, $GENERAL_CLASS_DESCRIPTOR->hideCategoryBarInFeed(I)I move-result v$register """ } RelatedChipCloudFingerprint.patch(1) { register -> "invoke-static { v$register }, " + - "$GENERAL->hideCategoryBarInRelatedVideo(Landroid/view/View;)V" + "$GENERAL_CLASS_DESCRIPTOR->hideCategoryBarInRelatedVideo(Landroid/view/View;)V" } SearchResultsChipBarFingerprint.patch(-1, -2) { register -> """ - invoke-static { v$register }, $GENERAL->hideCategoryBarInSearchResults(I)I + invoke-static { v$register }, $GENERAL_CLASS_DESCRIPTOR->hideCategoryBarInSearchResults(I)I move-result v$register """ } diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/fingerprints/FilterBarHeightFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/fingerprints/FilterBarHeightFingerprint.kt index 8a1efbe97..384756576 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/fingerprints/FilterBarHeightFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/fingerprints/FilterBarHeightFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object FilterBarHeightFingerprint : LiteralValueFingerprint( +internal object FilterBarHeightFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/fingerprints/RelatedChipCloudFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/fingerprints/RelatedChipCloudFingerprint.kt index ab8dc547f..cf1e83672 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/fingerprints/RelatedChipCloudFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/fingerprints/RelatedChipCloudFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object RelatedChipCloudFingerprint : LiteralValueFingerprint( +internal object RelatedChipCloudFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/fingerprints/SearchResultsChipBarFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/fingerprints/SearchResultsChipBarFingerprint.kt index b80d4adcc..a50b3ca59 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/fingerprints/SearchResultsChipBarFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/categorybar/fingerprints/SearchResultsChipBarFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SearchResultsChipBarFingerprint : LiteralValueFingerprint( +internal object SearchResultsChipBarFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/channellistsubmenu/ChannelListSubMenuPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/channellistsubmenu/ChannelListSubMenuPatch.kt index 4a4f5ce1e..4d6cbee3f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/channellistsubmenu/ChannelListSubMenuPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/channellistsubmenu/ChannelListSubMenuPatch.kt @@ -3,62 +3,34 @@ package app.revanced.patches.youtube.general.channellistsubmenu import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.general.channellistsubmenu.fingerprints.ChannelListSubMenuFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object ChannelListSubMenuPatch : BaseBytecodePatch( name = "Hide channel avatar section", description = "Adds an option to hide the channel avatar section of the subscription feed.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ChannelListSubMenuPatch : BytecodePatch( - setOf(ChannelListSubMenuFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(ChannelListSubMenuFingerprint) ) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/ChannelListSubMenuFilter;" + override fun execute(context: BytecodeContext) { - LithoFilterPatch.addFilter("$COMPONENTS_PATH/ChannelListSubMenuFilter;") + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) ChannelListSubMenuFingerprint.result?.let { it.mutableMethod.apply { @@ -67,7 +39,7 @@ object ChannelListSubMenuPatch : BytecodePatch( addInstruction( endIndex + 1, - "invoke-static {v$register}, $GENERAL->hideChannelListSubMenu(Landroid/view/View;)V" + "invoke-static {v$register}, $GENERAL_CLASS_DESCRIPTOR->hideChannelListSubMenu(Landroid/view/View;)V" ) } } ?: throw ChannelListSubMenuFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/channellistsubmenu/fingerprints/ChannelListSubMenuFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/channellistsubmenu/fingerprints/ChannelListSubMenuFingerprint.kt index 8a336ecca..bc138d9a8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/channellistsubmenu/fingerprints/ChannelListSubMenuFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/channellistsubmenu/fingerprints/ChannelListSubMenuFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Chann import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object ChannelListSubMenuFingerprint : LiteralValueFingerprint( +internal object ChannelListSubMenuFingerprint : LiteralValueFingerprint( opcodes = listOf( Opcode.CONST, Opcode.CONST_4, diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/channelprofile/ChannelProfileComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/channelprofile/ChannelProfileComponentsPatch.kt index 933807f80..90039a052 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/channelprofile/ChannelProfileComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/channelprofile/ChannelProfileComponentsPatch.kt @@ -3,60 +3,29 @@ package app.revanced.patches.youtube.general.channelprofile import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.general.channelprofile.fingerprints.DefaultsTabsBarFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.TabsBarTextTabView import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object ChannelProfileComponentsPatch : BaseBytecodePatch( name = "Hide channel profile components", description = "Adds an option to hide channel profile components.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ChannelProfileComponentsPatch : BytecodePatch( - setOf(DefaultsTabsBarFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(DefaultsTabsBarFingerprint) ) { private const val FILTER_CLASS_DESCRIPTOR = "$COMPONENTS_PATH/ChannelProfileFilter;" diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/channelprofile/fingerprints/DefaultsTabsBarFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/channelprofile/fingerprints/DefaultsTabsBarFingerprint.kt index c53270278..022be2a71 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/channelprofile/fingerprints/DefaultsTabsBarFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/channelprofile/fingerprints/DefaultsTabsBarFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.general.channelprofile.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.TabsBarTextTabView import app.revanced.util.fingerprint.LiteralValueFingerprint -object DefaultsTabsBarFingerprint : LiteralValueFingerprint( +internal object DefaultsTabsBarFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", parameters = listOf("Ljava/lang/CharSequence;", "Ljava/lang/CharSequence;", "Z"), literalSupplier = { TabsBarTextTabView } diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/crowdfundingbox/CrowdfundingBoxPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/crowdfundingbox/CrowdfundingBoxPatch.kt index 6a06cfacb..4dfb7bdc0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/crowdfundingbox/CrowdfundingBoxPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/crowdfundingbox/CrowdfundingBoxPatch.kt @@ -3,56 +3,25 @@ package app.revanced.patches.youtube.general.crowdfundingbox import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.general.crowdfundingbox.fingerprints.CrowdfundingBoxFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object CrowdfundingBoxPatch : BaseBytecodePatch( name = "Hide crowdfunding box", description = "Adds an option to hide the crowdfunding box between the player and video description.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object CrowdfundingBoxPatch : BytecodePatch( - setOf(CrowdfundingBoxFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(CrowdfundingBoxFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -63,7 +32,7 @@ object CrowdfundingBoxPatch : BytecodePatch( addInstruction( insertIndex, - "invoke-static {v$register}, $GENERAL->hideCrowdfundingBox(Landroid/view/View;)V" + "invoke-static {v$register}, $GENERAL_CLASS_DESCRIPTOR->hideCrowdfundingBox(Landroid/view/View;)V" ) } } ?: throw CrowdfundingBoxFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/crowdfundingbox/fingerprints/CrowdfundingBoxFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/crowdfundingbox/fingerprints/CrowdfundingBoxFingerprint.kt index acf358e9c..4d6833482 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/crowdfundingbox/fingerprints/CrowdfundingBoxFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/crowdfundingbox/fingerprints/CrowdfundingBoxFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object CrowdfundingBoxFingerprint : LiteralValueFingerprint( +internal object CrowdfundingBoxFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, opcodes = listOf( Opcode.INVOKE_VIRTUAL, diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/descriptions/DescriptionComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/descriptions/DescriptionComponentsPatch.kt index 0d03a42e6..93f9c84a3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/descriptions/DescriptionComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/descriptions/DescriptionComponentsPatch.kt @@ -3,61 +3,33 @@ package app.revanced.patches.youtube.general.descriptions import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.general.descriptions.fingerprints.TextViewComponentFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.recyclerview.BottomSheetRecyclerViewPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getTargetIndexWithMethodReferenceName +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -@Patch( +@Suppress("unused") +object DescriptionComponentsPatch : BaseBytecodePatch( name = "Description components", description = "Adds an option to hide or disable description components.", - dependencies = [ + dependencies = setOf( BottomSheetRecyclerViewPatch::class, LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object DescriptionComponentsPatch : BytecodePatch( - setOf(TextViewComponentFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(TextViewComponentFingerprint) ) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/DescriptionsFilter;" + override fun execute(context: BytecodeContext) { if (SettingsPatch.upward1902) { @@ -69,12 +41,12 @@ object DescriptionComponentsPatch : BytecodePatch( replaceInstruction( insertIndex, "invoke-static {v${insertInstruction.registerC}, v${insertInstruction.registerD}}, " + - "$GENERAL->disableDescriptionInteraction(Landroid/widget/TextView;Z)V" + "$GENERAL_CLASS_DESCRIPTOR->disableDescriptionInteraction(Landroid/widget/TextView;Z)V" ) } } ?: throw TextViewComponentFingerprint.exception - BottomSheetRecyclerViewPatch.injectCall("$GENERAL->onDescriptionPanelCreate(Landroid/support/v7/widget/RecyclerView;)V") + BottomSheetRecyclerViewPatch.injectCall("$GENERAL_CLASS_DESCRIPTOR->onDescriptionPanelCreate(Landroid/support/v7/widget/RecyclerView;)V") /** * Add settings @@ -86,7 +58,7 @@ object DescriptionComponentsPatch : BytecodePatch( ) } - LithoFilterPatch.addFilter("$COMPONENTS_PATH/DescriptionsFilter;") + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/descriptions/fingerprints/TextViewComponentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/descriptions/fingerprints/TextViewComponentFingerprint.kt index 683389178..d41170a0f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/descriptions/fingerprints/TextViewComponentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/descriptions/fingerprints/TextViewComponentFingerprint.kt @@ -7,7 +7,7 @@ import com.android.tools.smali.dexlib2.Opcode * This fingerprint is compatible with YouTube v18.35.xx~ * Nonetheless, the patch works in YouTube v19.02.xx~ */ -object TextViewComponentFingerprint : MethodReferenceNameFingerprint( +internal object TextViewComponentFingerprint : MethodReferenceNameFingerprint( returnType = "V", opcodes = listOf(Opcode.CMPL_FLOAT), reference = { "setBreakStrategy" } diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/dialog/RemoveViewerDiscretionDialogPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/dialog/RemoveViewerDiscretionDialogPatch.kt deleted file mode 100644 index 3a9d38890..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/general/dialog/RemoveViewerDiscretionDialogPatch.kt +++ /dev/null @@ -1,67 +0,0 @@ -package app.revanced.patches.youtube.general.dialog - -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.dialog.AbstractRemoveViewerDiscretionDialogPatch -import app.revanced.patches.youtube.general.dialog.fingerprints.AgeVerifiedFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL -import app.revanced.patches.youtube.utils.settings.SettingsPatch - -@Patch( - name = "Remove viewer discretion dialog", - description = "Adds an option to remove the dialog that appears when opening a video that has been age-restricted " + - "by accepting it automatically. This does not bypass the age restriction.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object RemoveViewerDiscretionDialogPatch : AbstractRemoveViewerDiscretionDialogPatch( - GENERAL, - setOf(AgeVerifiedFingerprint) -) { - override fun execute(context: BytecodeContext) { - super.execute(context) - - /** - * Add settings - */ - SettingsPatch.addPreference( - arrayOf( - "PREFERENCE: GENERAL_SETTINGS", - "SETTINGS: REMOVE_VIEWER_DISCRETION_DIALOG" - ) - ) - - SettingsPatch.updatePatchStatus("Remove viewer discretion dialog") - - } -} diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/dialog/ViewerDiscretionDialogBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/dialog/ViewerDiscretionDialogBytecodePatch.kt new file mode 100644 index 000000000..40d1ffae3 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/general/dialog/ViewerDiscretionDialogBytecodePatch.kt @@ -0,0 +1,10 @@ +package app.revanced.patches.youtube.general.dialog + +import app.revanced.patches.shared.dialog.BaseViewerDiscretionDialogPatch +import app.revanced.patches.youtube.general.dialog.fingerprints.AgeVerifiedFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR + +object ViewerDiscretionDialogBytecodePatch : BaseViewerDiscretionDialogPatch( + GENERAL_CLASS_DESCRIPTOR, + setOf(AgeVerifiedFingerprint) +) diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/dialog/ViewerDiscretionDialogPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/dialog/ViewerDiscretionDialogPatch.kt new file mode 100644 index 000000000..f23fc9234 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/general/dialog/ViewerDiscretionDialogPatch.kt @@ -0,0 +1,34 @@ +package app.revanced.patches.youtube.general.dialog + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseBytecodePatch + +@Suppress("unused") +object ViewerDiscretionDialogPatch : BaseBytecodePatch( + name = "Remove viewer discretion dialog", + description = "Adds an option to remove the dialog that appears when opening a video that has been age-restricted " + + "by accepting it automatically. This does not bypass the age restriction.", + dependencies = setOf( + SettingsPatch::class, + ViewerDiscretionDialogBytecodePatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + override fun execute(context: BytecodeContext) { + + /** + * Add settings + */ + SettingsPatch.addPreference( + arrayOf( + "PREFERENCE: GENERAL_SETTINGS", + "SETTINGS: REMOVE_VIEWER_DISCRETION_DIALOG" + ) + ) + + SettingsPatch.updatePatchStatus("Remove viewer discretion dialog") + + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/dialog/fingerprints/AgeVerifiedFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/dialog/fingerprints/AgeVerifiedFingerprint.kt index c5cd86b2b..f6d7f8c7e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/dialog/fingerprints/AgeVerifiedFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/dialog/fingerprints/AgeVerifiedFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object AgeVerifiedFingerprint : MethodFingerprint( +internal object AgeVerifiedFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "Ljava/util/Map;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/floatingmicrophone/FloatingMicrophonePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/floatingmicrophone/FloatingMicrophonePatch.kt index 4556a94d3..1f0f14765 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/floatingmicrophone/FloatingMicrophonePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/floatingmicrophone/FloatingMicrophonePatch.kt @@ -3,56 +3,25 @@ package app.revanced.patches.youtube.general.floatingmicrophone import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.general.floatingmicrophone.fingerprints.FloatingMicrophoneFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object FloatingMicrophonePatch : BaseBytecodePatch( name = "Hide floating microphone", description = "Adds an option to hide the floating microphone button when searching.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object FloatingMicrophonePatch : BytecodePatch( - setOf(FloatingMicrophoneFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(FloatingMicrophoneFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -63,7 +32,7 @@ object FloatingMicrophonePatch : BytecodePatch( addInstructions( insertIndex + 1, """ - invoke-static {v$register}, $GENERAL->hideFloatingMicrophone(Z)Z + invoke-static {v$register}, $GENERAL_CLASS_DESCRIPTOR->hideFloatingMicrophone(Z)Z move-result v$register """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/floatingmicrophone/fingerprints/FloatingMicrophoneFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/floatingmicrophone/fingerprints/FloatingMicrophoneFingerprint.kt index 8a62910c4..ca1e0ae4f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/floatingmicrophone/fingerprints/FloatingMicrophoneFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/floatingmicrophone/fingerprints/FloatingMicrophoneFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object FloatingMicrophoneFingerprint : LiteralValueFingerprint( +internal object FloatingMicrophoneFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/handle/HideHandlePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/handle/HandlePatch.kt similarity index 71% rename from src/main/kotlin/app/revanced/patches/youtube/general/handle/HideHandlePatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/general/handle/HandlePatch.kt index b6457be59..afd300200 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/handle/HideHandlePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/handle/HandlePatch.kt @@ -3,13 +3,11 @@ package app.revanced.patches.youtube.general.handle import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.general.handle.fingerprints.AccountSwitcherAccessibilityLabelFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.AccountSwitcherAccessibility import app.revanced.patches.youtube.utils.settings.SettingsPatch @@ -17,50 +15,21 @@ import app.revanced.util.exception import app.revanced.util.getTargetIndex import app.revanced.util.getTargetIndexWithMethodReferenceName import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -@Patch( +@Suppress("unused") +object HandlePatch : BaseBytecodePatch( name = "Hide handle", description = "Adds options to hide the handle in the account switcher and You tab.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideHandlePatch : BytecodePatch( - setOf(AccountSwitcherAccessibilityLabelFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(AccountSwitcherAccessibilityLabelFingerprint) ) { private const val FILTER_CLASS_DESCRIPTOR = "$COMPONENTS_PATH/HandlesFilter;" @@ -76,7 +45,7 @@ object HideHandlePatch : BytecodePatch( addInstructions( insertIndex, """ - invoke-static {v$visibilityRegister}, $GENERAL->hideHandle(I)I + invoke-static {v$visibilityRegister}, $GENERAL_CLASS_DESCRIPTOR->hideHandle(I)I move-result v$visibilityRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/handle/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/handle/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt index 3197cd1d4..f023ffbeb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/handle/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/handle/fingerprints/AccountSwitcherAccessibilityLabelFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.general.handle.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.AccountSwitcherAccessibility import app.revanced.util.fingerprint.LiteralValueFingerprint -object AccountSwitcherAccessibilityLabelFingerprint : LiteralValueFingerprint( +internal object AccountSwitcherAccessibilityLabelFingerprint : LiteralValueFingerprint( returnType = "V", parameters = listOf("L", "Ljava/lang/Object;"), literalSupplier = { AccountSwitcherAccessibility } diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/latestvideosbutton/LatestVideosButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/latestvideosbutton/LatestVideosButtonPatch.kt index 6498dd36f..f42264da9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/latestvideosbutton/LatestVideosButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/latestvideosbutton/LatestVideosButtonPatch.kt @@ -3,56 +3,25 @@ package app.revanced.patches.youtube.general.latestvideosbutton import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.general.latestvideosbutton.fingerprints.LatestVideosButtonFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object LatestVideosButtonPatch : BaseBytecodePatch( name = "Hide latest videos button", description = "Adds options to hide latest videos button in home feed.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object LatestVideosButtonPatch : BytecodePatch( - setOf(LatestVideosButtonFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(LatestVideosButtonFingerprint) ) { override fun execute(context: BytecodeContext) { LatestVideosButtonFingerprint.result?.let { @@ -62,7 +31,7 @@ object LatestVideosButtonPatch : BytecodePatch( addInstruction( targetIndex + 1, - "invoke-static {v$targetRegister}, $GENERAL->hideLatestVideosButton(Landroid/view/View;)V" + "invoke-static {v$targetRegister}, $GENERAL_CLASS_DESCRIPTOR->hideLatestVideosButton(Landroid/view/View;)V" ) } } ?: throw LatestVideosButtonFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/latestvideosbutton/fingerprints/LatestVideosButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/latestvideosbutton/fingerprints/LatestVideosButtonFingerprint.kt index 38a071c55..07ee4d7e2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/latestvideosbutton/fingerprints/LatestVideosButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/latestvideosbutton/fingerprints/LatestVideosButtonFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object LatestVideosButtonFingerprint : LiteralValueFingerprint( +internal object LatestVideosButtonFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "Z"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/layout/LayoutComponentsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/layout/LayoutComponentsPatch.kt index a5cd34b15..dc02b6fc4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/layout/LayoutComponentsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/layout/LayoutComponentsPatch.kt @@ -1,56 +1,33 @@ package app.revanced.patches.youtube.general.layout import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object LayoutComponentsPatch : BaseBytecodePatch( name = "Hide layout components", description = "Adds options to hide general layout components.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object LayoutComponentsPatch : BytecodePatch(emptySet()) { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + private const val CHANNEL_BAR_FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/ChannelBarFilter;" + private const val CUSTOM_FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/CustomFilter;" + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/LayoutComponentsFilter;" + override fun execute(context: BytecodeContext) { - LithoFilterPatch.addFilter("$COMPONENTS_PATH/ChannelBarFilter;") - LithoFilterPatch.addFilter("$COMPONENTS_PATH/CustomFilter;") - LithoFilterPatch.addFilter("$COMPONENTS_PATH/LayoutComponentsFilter;") + LithoFilterPatch.addFilter(CHANNEL_BAR_FILTER_CLASS_DESCRIPTOR) + LithoFilterPatch.addFilter(CUSTOM_FILTER_CLASS_DESCRIPTOR) + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/GradientLoadingScreenPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/GradientLoadingScreenPatch.kt index 810cfc7d1..d8f7aebb0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/GradientLoadingScreenPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/GradientLoadingScreenPatch.kt @@ -1,56 +1,21 @@ package app.revanced.patches.youtube.general.loadingscreen import app.revanced.patcher.data.BytecodeContext -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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.general.loadingscreen.fingerprints.GradientLoadingScreenPrimaryFingerprint import app.revanced.patches.youtube.general.loadingscreen.fingerprints.GradientLoadingScreenSecondaryFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.exception -import app.revanced.util.getWideLiteralInstructionIndex -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import app.revanced.util.literalInstructionBooleanHook +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object GradientLoadingScreenPatch : BaseBytecodePatch( name = "Enable gradient loading screen", description = "Adds an option to enable gradient loading screen.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object GradientLoadingScreenPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( GradientLoadingScreenPrimaryFingerprint, GradientLoadingScreenSecondaryFingerprint ) @@ -60,34 +25,13 @@ object GradientLoadingScreenPatch : BytecodePatch( /** * YouTube v18.29.38 ~ */ - GradientLoadingScreenSecondaryFingerprint.result?.let { - it.mutableMethod.apply { - val targetIndex = getWideLiteralInstructionIndex(45418917) + 2 - val targetRegister = getInstruction(targetIndex).registerA - - addInstructions( - targetIndex + 1, """ - invoke-static { }, $GENERAL->enableGradientLoadingScreen()Z - move-result v$targetRegister - """ - ) - } + mapOf( + GradientLoadingScreenPrimaryFingerprint to 45412406, + GradientLoadingScreenSecondaryFingerprint to 45418917 + ).forEach { (fingerprint, literal) -> + fingerprint.literalInstructionBooleanHook(literal, "$GENERAL_CLASS_DESCRIPTOR->enableGradientLoadingScreen()Z") } - GradientLoadingScreenPrimaryFingerprint.result?.let { - it.mutableMethod.apply { - val targetIndex = getWideLiteralInstructionIndex(45412406) + 2 - val targetRegister = getInstruction(targetIndex).registerA - - addInstructions( - targetIndex + 1, """ - invoke-static { }, $GENERAL->enableGradientLoadingScreen()Z - move-result v$targetRegister - """ - ) - } - } ?: throw GradientLoadingScreenPrimaryFingerprint.exception - /** * Add settings */ diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenPrimaryFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenPrimaryFingerprint.kt index 6a04b7b31..19b454e54 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenPrimaryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenPrimaryFingerprint.kt @@ -2,6 +2,6 @@ package app.revanced.patches.youtube.general.loadingscreen.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint -object GradientLoadingScreenPrimaryFingerprint : LiteralValueFingerprint( +internal object GradientLoadingScreenPrimaryFingerprint : LiteralValueFingerprint( literalSupplier = { 45412406 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenSecondaryFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenSecondaryFingerprint.kt index 883671b57..5834fb42b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenSecondaryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/loadingscreen/fingerprints/GradientLoadingScreenSecondaryFingerprint.kt @@ -2,6 +2,6 @@ package app.revanced.patches.youtube.general.loadingscreen.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint -object GradientLoadingScreenSecondaryFingerprint : LiteralValueFingerprint( +internal object GradientLoadingScreenSecondaryFingerprint : LiteralValueFingerprint( literalSupplier = { 45418917 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/loadmorebutton/LoadMoreButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/loadmorebutton/LoadMoreButtonPatch.kt index 798783769..6d255de9f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/loadmorebutton/LoadMoreButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/loadmorebutton/LoadMoreButtonPatch.kt @@ -3,57 +3,26 @@ package app.revanced.patches.youtube.general.loadmorebutton import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.general.loadmorebutton.fingerprints.LoadMoreButtonFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object LoadMoreButtonPatch : BaseBytecodePatch( name = "Hide load more button", description = "Adds an option to hide the button under videos that loads similar videos.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object LoadMoreButtonPatch : BytecodePatch( - setOf(LoadMoreButtonFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(LoadMoreButtonFingerprint) ) { override fun execute(context: BytecodeContext) { LoadMoreButtonFingerprint.result?.let { @@ -69,7 +38,7 @@ object LoadMoreButtonPatch : BytecodePatch( addInstruction( targetIndex, - "invoke-static {v$targetRegister}, $GENERAL->hideLoadMoreButton(Landroid/view/View;)V" + "invoke-static {v$targetRegister}, $GENERAL_CLASS_DESCRIPTOR->hideLoadMoreButton(Landroid/view/View;)V" ) } ?: throw PatchException("Failed to find getView method") } ?: throw LoadMoreButtonFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/loadmorebutton/fingerprints/LoadMoreButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/loadmorebutton/fingerprints/LoadMoreButtonFingerprint.kt index 7084928c0..7bd5d6344 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/loadmorebutton/fingerprints/LoadMoreButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/loadmorebutton/fingerprints/LoadMoreButtonFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Expan import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object LoadMoreButtonFingerprint : LiteralValueFingerprint( +internal object LoadMoreButtonFingerprint : LiteralValueFingerprint( opcodes = listOf( Opcode.CONST, Opcode.CONST_4, diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/MixPlaylistsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/MixPlaylistsPatch.kt index f8823ac89..962098be3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/MixPlaylistsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/MixPlaylistsPatch.kt @@ -4,119 +4,72 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.general.mixplaylists.fingerprints.ElementParserFingerprint -import app.revanced.patches.youtube.general.mixplaylists.fingerprints.EmptyFlatBufferFingerprint +import app.revanced.patches.youtube.general.mixplaylists.fingerprints.ElementParserParentFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception -import app.revanced.util.getStringInstructionIndex +import app.revanced.util.getTargetIndex +import app.revanced.util.indexOfFirstInstruction +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode 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.MethodReference -@Patch( +@Suppress("unused") +object MixPlaylistsPatch : BaseBytecodePatch( name = "Hide mix playlists", description = "Adds an option to hide mix playlists in feed.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object MixPlaylistsPatch : BytecodePatch( - setOf( - ElementParserFingerprint, - EmptyFlatBufferFingerprint - ) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(ElementParserParentFingerprint) ) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/MixPlaylistsFilter;" + override fun execute(context: BytecodeContext) { - /** - * Separated from bytebuffer patch - * Target method is only used for Hide MixPlaylists patch - */ - ElementParserFingerprint.result - ?: EmptyFlatBufferFingerprint.result - ?: throw EmptyFlatBufferFingerprint.exception + ElementParserParentFingerprint.result?.let { parentResult -> + ElementParserFingerprint.resolve(context, parentResult.classDef) + ElementParserFingerprint.result?.let { + it.mutableMethod.apply { + val freeRegister = implementation!!.registerCount - parameters.size - 2 + val insertIndex = indexOfFirstInstruction { + val reference = ((this as? ReferenceInstruction)?.reference as? MethodReference) - /** - * ~ YouTube v18.29.38 - */ - EmptyFlatBufferFingerprint.result?.let { - it.mutableMethod.apply { - val insertIndex = implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.CHECK_CAST - } + 1 - val jumpIndex = - getStringInstructionIndex("Failed to convert Element to Flatbuffers: %s") + 2 + reference?.parameterTypes?.size == 1 + && reference.parameterTypes.first() == "[B" + && reference.returnType.startsWith("L") + } - val freeIndex = it.scanResult.patternScanResult!!.startIndex - 1 + val objectIndex = getTargetIndex(Opcode.MOVE_OBJECT) + val objectRegister = getInstruction(objectIndex).registerA - inject(freeIndex, insertIndex, jumpIndex) - } - } + val jumpIndex = it.scanResult.patternScanResult!!.startIndex - /** - * YouTube v18.30.xx~ - */ - ElementParserFingerprint.result?.let { - it.mutableMethod.apply { - val methodInstructions = implementation!!.instructions + addInstructionsWithLabels( + insertIndex, """ + invoke-static {v$objectRegister, v$freeRegister}, $FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z + move-result v$freeRegister + if-nez v$freeRegister, :filter + """, ExternalLabel("filter", getInstruction(jumpIndex)) + ) - val insertIndex = methodInstructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.INVOKE_INTERFACE - && (instruction as? ReferenceInstruction)?.reference.toString() - .contains("[B") + addInstruction( + 0, + "move-object/from16 v$freeRegister, p3" + ) } - val freeIndex = it.scanResult.patternScanResult!!.startIndex - 1 - - for (index in methodInstructions.size - 1 downTo 0) { - if (getInstruction(index).opcode != Opcode.INVOKE_INTERFACE_RANGE) continue - - val jumpIndex = index + 1 - - inject(freeIndex, insertIndex, jumpIndex) - - break - } - } - } + } ?: throw ElementParserFingerprint.exception + } ?: throw ElementParserParentFingerprint.exception LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) @@ -133,31 +86,4 @@ object MixPlaylistsPatch : BytecodePatch( SettingsPatch.updatePatchStatus("Hide mix playlists") } - - private const val FILTER_CLASS_DESCRIPTOR = - "$COMPONENTS_PATH/MixPlaylistsFilter;" - - private fun MutableMethod.inject( - freeIndex: Int, - insertIndex: Int, - jumpIndex: Int - ) { - val freeRegister = getInstruction(freeIndex).registerA - val objectIndex = implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.MOVE_OBJECT - } - val objectRegister = getInstruction(objectIndex).registerA - addInstructionsWithLabels( - insertIndex, """ - invoke-static {v$objectRegister, v$freeRegister}, $FILTER_CLASS_DESCRIPTOR->filterMixPlaylists(Ljava/lang/Object;[B)Z - move-result v$freeRegister - if-nez v$freeRegister, :not_an_ad - """, ExternalLabel("not_an_ad", getInstruction(jumpIndex)) - ) - - addInstruction( - 0, - "move-object/from16 v$freeRegister, p3" - ) - } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/fingerprints/ElementParserFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/fingerprints/ElementParserFingerprint.kt index 54361b3bb..2408736ed 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/fingerprints/ElementParserFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/fingerprints/ElementParserFingerprint.kt @@ -5,14 +5,14 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ElementParserFingerprint : MethodFingerprint( +internal object ElementParserFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + parameters = listOf("L", "L", "[B", "L", "L"), opcodes = listOf( - Opcode.INVOKE_VIRTUAL_RANGE, + Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, - Opcode.IGET_BOOLEAN, - Opcode.IF_EQZ - ), - strings = listOf("Failed to parse Element") + Opcode.IGET_OBJECT, + Opcode.RETURN_OBJECT + ) ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/fingerprints/ElementParserParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/fingerprints/ElementParserParentFingerprint.kt new file mode 100644 index 000000000..fdbe0270a --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/fingerprints/ElementParserParentFingerprint.kt @@ -0,0 +1,11 @@ +package app.revanced.patches.youtube.general.mixplaylists.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.patcher.fingerprint.MethodFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object ElementParserParentFingerprint : MethodFingerprint( + returnType = "L", + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + strings = listOf("Element tree missing id in debug mode.") +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/fingerprints/EmptyFlatBufferFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/fingerprints/EmptyFlatBufferFingerprint.kt deleted file mode 100644 index 41b83a6d8..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/general/mixplaylists/fingerprints/EmptyFlatBufferFingerprint.kt +++ /dev/null @@ -1,18 +0,0 @@ -package app.revanced.patches.youtube.general.mixplaylists.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import com.android.tools.smali.dexlib2.AccessFlags -import com.android.tools.smali.dexlib2.Opcode - -object EmptyFlatBufferFingerprint : MethodFingerprint( - returnType = "L", - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - opcodes = listOf( - Opcode.INVOKE_VIRTUAL_RANGE, - Opcode.MOVE_RESULT_OBJECT, - Opcode.IGET_BOOLEAN, - Opcode.IF_EQZ - ), - strings = listOf("Failed to convert Element to Flatbuffers: %s") -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/searchterm/SearchTermThumbnailPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/searchterm/SearchTermThumbnailPatch.kt index a71a9bd18..7eb8f89d7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/searchterm/SearchTermThumbnailPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/searchterm/SearchTermThumbnailPatch.kt @@ -4,82 +4,40 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.general.searchterm.fingerprints.CreateSearchSuggestionsFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction +import app.revanced.util.getTargetIndexWithReference +import app.revanced.util.getTargetIndexWithReferenceReversed +import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object SearchTermThumbnailPatch : BaseBytecodePatch( name = "Hide search term thumbnail", description = "Adds an option to hide thumbnails in the search term history.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object SearchTermThumbnailPatch : BytecodePatch( - setOf(CreateSearchSuggestionsFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(CreateSearchSuggestionsFingerprint) ) { override fun execute(context: BytecodeContext) { CreateSearchSuggestionsFingerprint.result?.let { result -> result.mutableMethod.apply { - val instructions = implementation!!.instructions + val relativeIndex = getWideLiteralInstructionIndex(40) + val replaceIndex = getTargetIndexWithReferenceReversed( + relativeIndex, + "Landroid/widget/ImageView;->setVisibility(I)V" + ) - 1 - val relativeIndex = instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.CONST_16 - && (instruction as NarrowLiteralInstruction).narrowLiteral == 40 - } - - val replaceIndex = - getTargetIndexDownTo( - relativeIndex, - Opcode.INVOKE_VIRTUAL, - "Landroid/widget/ImageView;->setVisibility(I)V" - ) - 1 - - val jumpIndex = - getTargetIndexUpTo( - relativeIndex, - Opcode.INVOKE_STATIC, - "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;" - ) + 4 + val jumpIndex = getTargetIndexWithReference( + relativeIndex, + "Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;" + ) + 4 val replaceIndexInstruction = getInstruction(replaceIndex) val replaceIndexReference = @@ -87,7 +45,7 @@ object SearchTermThumbnailPatch : BytecodePatch( addInstructionsWithLabels( replaceIndex + 1, """ - invoke-static { }, $GENERAL->hideSearchTermThumbnail()Z + invoke-static { }, $GENERAL_CLASS_DESCRIPTOR->hideSearchTermThumbnail()Z move-result v${replaceIndexInstruction.registerA} if-nez v${replaceIndexInstruction.registerA}, :hidden iget-object v${replaceIndexInstruction.registerA}, v${replaceIndexInstruction.registerB}, $replaceIndexReference @@ -110,40 +68,4 @@ object SearchTermThumbnailPatch : BytecodePatch( SettingsPatch.updatePatchStatus("Hide search term thumbnail") } - - private fun MutableMethod.getTargetIndexDownTo( - startIndex: Int, - opcode: Opcode, - reference: String - ): Int { - for (index in startIndex downTo 0) { - if (getInstruction(index).opcode != opcode) - continue - - val targetReference = getInstruction(index).reference.toString() - if (targetReference != reference) - continue - - return index - } - throw PatchException("Failed to find hook method") - } - - private fun MutableMethod.getTargetIndexUpTo( - startIndex: Int, - opcode: Opcode, - reference: String - ): Int { - for (index in startIndex until implementation!!.instructions.size) { - if (getInstruction(index).opcode != opcode) - continue - - val targetReference = getInstruction(index).reference.toString() - if (targetReference != reference) - continue - - return index - } - throw PatchException("Failed to find hook method") - } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/searchterm/fingerprints/CreateSearchSuggestionsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/searchterm/fingerprints/CreateSearchSuggestionsFingerprint.kt index 5163f2262..5525720ad 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/searchterm/fingerprints/CreateSearchSuggestionsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/searchterm/fingerprints/CreateSearchSuggestionsFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object CreateSearchSuggestionsFingerprint : MethodFingerprint( +internal object CreateSearchSuggestionsFingerprint : MethodFingerprint( returnType = "Landroid/view/View;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("I", "Landroid/view/View;", "Landroid/view/ViewGroup;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/snackbar/HideSnackBarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/snackbar/HideSnackBarPatch.kt deleted file mode 100644 index 982757996..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/general/snackbar/HideSnackBarPatch.kt +++ /dev/null @@ -1,81 +0,0 @@ -package app.revanced.patches.youtube.general.snackbar - -import app.revanced.patcher.data.BytecodeContext -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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.youtube.general.snackbar.fingerprints.HideSnackBarFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL -import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.exception - -@Patch( - name = "Hide snack bar", - description = "Adds an option to hide the snack bar action popup.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideSnackBarPatch : BytecodePatch( - setOf(HideSnackBarFingerprint) -) { - override fun execute(context: BytecodeContext) { - - HideSnackBarFingerprint.result?.let { - it.mutableMethod.apply { - addInstructionsWithLabels( - 0, """ - invoke-static {}, $GENERAL->hideSnackBar()Z - move-result v0 - if-eqz v0, :default - return-void - """, ExternalLabel("default", getInstruction(0)) - ) - } - } ?: throw HideSnackBarFingerprint.exception - - /** - * Add settings - */ - SettingsPatch.addPreference( - arrayOf( - "PREFERENCE: GENERAL_SETTINGS", - "SETTINGS: HIDE_SNACK_BAR" - ) - ) - - SettingsPatch.updatePatchStatus("Hide snack bar") - - } -} diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/snackbar/SnackBarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/snackbar/SnackBarPatch.kt new file mode 100644 index 000000000..98d079e5b --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/general/snackbar/SnackBarPatch.kt @@ -0,0 +1,50 @@ +package app.revanced.patches.youtube.general.snackbar + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.youtube.general.snackbar.fingerprints.BottomUiContainerFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR +import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch + +@Suppress("unused") +object SnackBarPatch : BaseBytecodePatch( + name = "Hide snack bar", + description = "Adds an option to hide the snack bar action popup.", + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(BottomUiContainerFingerprint) +) { + override fun execute(context: BytecodeContext) { + + BottomUiContainerFingerprint.result?.let { + it.mutableMethod.apply { + addInstructionsWithLabels( + 0, """ + invoke-static {}, $GENERAL_CLASS_DESCRIPTOR->hideSnackBar()Z + move-result v0 + if-eqz v0, :show + return-void + """, ExternalLabel("show", getInstruction(0)) + ) + } + } ?: throw BottomUiContainerFingerprint.exception + + /** + * Add settings + */ + SettingsPatch.addPreference( + arrayOf( + "PREFERENCE: GENERAL_SETTINGS", + "SETTINGS: HIDE_SNACK_BAR" + ) + ) + + SettingsPatch.updatePatchStatus("Hide snack bar") + + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/snackbar/fingerprints/HideSnackBarFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/snackbar/fingerprints/BottomUiContainerFingerprint.kt similarity index 87% rename from src/main/kotlin/app/revanced/patches/youtube/general/snackbar/fingerprints/HideSnackBarFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/general/snackbar/fingerprints/BottomUiContainerFingerprint.kt index 4c2c5bb5d..2d493600c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/snackbar/fingerprints/HideSnackBarFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/snackbar/fingerprints/BottomUiContainerFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object HideSnackBarFingerprint : MethodFingerprint( +internal object BottomUiContainerFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/songsearch/SongSearchPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/songsearch/SongSearchPatch.kt index 2121b2e42..ff65d34aa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/songsearch/SongSearchPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/songsearch/SongSearchPatch.kt @@ -2,51 +2,21 @@ package app.revanced.patches.youtube.general.songsearch import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.general.songsearch.fingerprints.VoiceSearchConfigFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object SongSearchPatch : BaseBytecodePatch( name = "Enable song search", description = "Adds an option to enable song search in the voice search screen.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(VoiceSearchConfigFingerprint), use = false -) -@Suppress("unused") -object SongSearchPatch : BytecodePatch( - setOf(VoiceSearchConfigFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -54,7 +24,7 @@ object SongSearchPatch : BytecodePatch( it.mutableMethod.apply { addInstructions( 0, """ - invoke-static { }, $GENERAL->enableSongSearch()Z + invoke-static { }, $GENERAL_CLASS_DESCRIPTOR->enableSongSearch()Z move-result v0 return v0 """ diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/songsearch/fingerprints/VoiceSearchConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/songsearch/fingerprints/VoiceSearchConfigFingerprint.kt index e053f22ef..714eae68a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/songsearch/fingerprints/VoiceSearchConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/songsearch/fingerprints/VoiceSearchConfigFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint /** * This fingerprint is compatible with YouTube v18.30.37+ */ -object VoiceSearchConfigFingerprint : LiteralValueFingerprint( +internal object VoiceSearchConfigFingerprint : LiteralValueFingerprint( returnType = "Z", literalSupplier = { 45417109 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/startpage/ChangeStartPagePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/startpage/ChangeStartPagePatch.kt index 4263cc7f2..f5d18593f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/startpage/ChangeStartPagePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/startpage/ChangeStartPagePatch.kt @@ -2,60 +2,29 @@ package app.revanced.patches.youtube.general.startpage import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.general.startpage.fingerprints.StartActivityFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch.contexts import app.revanced.util.copyXmlNode import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object ChangeStartPagePatch : BaseBytecodePatch( name = "Change start page", description = "Adds an option to set which page the app opens in instead of the homepage.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ChangeStartPagePatch : BytecodePatch( - setOf(StartActivityFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(StartActivityFingerprint) ) { override fun execute(context: BytecodeContext) { StartActivityFingerprint.result?.let { it.mutableMethod.apply { addInstruction( 0, - "invoke-static { p1 }, $GENERAL->changeStartPage(Landroid/content/Intent;)V" + "invoke-static { p1 }, $GENERAL_CLASS_DESCRIPTOR->changeStartPage(Landroid/content/Intent;)V" ) } } ?: throw StartActivityFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/startpage/fingerprints/StartActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/startpage/fingerprints/StartActivityFingerprint.kt index 7f305ec6f..735185042 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/startpage/fingerprints/StartActivityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/startpage/fingerprints/StartActivityFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.general.startpage.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object StartActivityFingerprint : MethodFingerprint( +internal object StartActivityFingerprint : MethodFingerprint( parameters = listOf("Landroid/content/Intent;"), customFingerprint = { methodDef, classDef -> methodDef.name == "startActivity" diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/suggestions/SuggestionsShelfPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/suggestionshelf/SuggestionsShelfPatch.kt similarity index 62% rename from src/main/kotlin/app/revanced/patches/youtube/general/suggestions/SuggestionsShelfPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/general/suggestionshelf/SuggestionsShelfPatch.kt index 297250bd0..dec9b19be 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/suggestions/SuggestionsShelfPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/suggestionshelf/SuggestionsShelfPatch.kt @@ -1,60 +1,29 @@ -package app.revanced.patches.youtube.general.suggestions +package app.revanced.patches.youtube.general.suggestionshelf import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch -import app.revanced.patches.youtube.general.suggestions.fingerprints.BreakingNewsFingerprint +import app.revanced.patches.youtube.general.suggestionshelf.fingerprints.BreakingNewsFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.navbarindex.NavBarIndexHookPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object SuggestionsShelfPatch : BaseBytecodePatch( name = "Hide suggestions shelf", description = "Adds an option to hide the suggestions shelf in feed.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, NavBarIndexHookPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object SuggestionsShelfPatch : BytecodePatch( - setOf(BreakingNewsFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(BreakingNewsFingerprint) ) { private const val FILTER_CLASS_DESCRIPTOR = "$COMPONENTS_PATH/SuggestionsShelfFilter;" diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/suggestions/fingerprints/BreakingNewsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/suggestionshelf/fingerprints/BreakingNewsFingerprint.kt similarity index 79% rename from src/main/kotlin/app/revanced/patches/youtube/general/suggestions/fingerprints/BreakingNewsFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/general/suggestionshelf/fingerprints/BreakingNewsFingerprint.kt index b6ce00338..e4d839a49 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/suggestions/fingerprints/BreakingNewsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/suggestionshelf/fingerprints/BreakingNewsFingerprint.kt @@ -1,4 +1,4 @@ -package app.revanced.patches.youtube.general.suggestions.fingerprints +package app.revanced.patches.youtube.general.suggestionshelf.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.HorizontalCardList @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object BreakingNewsFingerprint : LiteralValueFingerprint( +internal object BreakingNewsFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, opcodes = listOf( Opcode.CONST, diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/TabletMiniPlayerPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/TabletMiniPlayerPatch.kt index 6a438c476..d81f9be7b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/TabletMiniPlayerPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/TabletMiniPlayerPatch.kt @@ -3,63 +3,34 @@ package app.revanced.patches.youtube.general.tabletminiplayer import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.fingerprint.MethodFingerprintResult -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.general.tabletminiplayer.fingerprints.MiniPlayerDimensionsCalculatorFingerprint import app.revanced.patches.youtube.general.tabletminiplayer.fingerprints.MiniPlayerOverrideFingerprint import app.revanced.patches.youtube.general.tabletminiplayer.fingerprints.MiniPlayerOverrideNoContextFingerprint import app.revanced.patches.youtube.general.tabletminiplayer.fingerprints.MiniPlayerResponseModelSizeCheckFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getStringInstructionIndex +import app.revanced.util.getTargetIndex +import app.revanced.util.getTargetIndexReversed +import app.revanced.util.getWalkerMethod +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object TabletMiniPlayerPatch : BaseBytecodePatch( name = "Enable tablet mini player", description = "Adds an option to enable the tablet mini player layout.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object TabletMiniPlayerPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( MiniPlayerDimensionsCalculatorFingerprint, MiniPlayerResponseModelSizeCheckFingerprint, MiniPlayerOverrideFingerprint @@ -68,31 +39,31 @@ object TabletMiniPlayerPatch : BytecodePatch( override fun execute(context: BytecodeContext) { MiniPlayerDimensionsCalculatorFingerprint.result?.let { parentResult -> - MiniPlayerOverrideNoContextFingerprint.also { - it.resolve( - context, - parentResult.classDef - ) - }.result?.let { result -> - val (method, _, parameterRegister) = result.addProxyCall() - method.insertOverride( - method.implementation!!.instructions.size - 1, - parameterRegister - ) + MiniPlayerOverrideNoContextFingerprint.resolve(context, parentResult.classDef) + MiniPlayerOverrideNoContextFingerprint.result?.let { + it.mutableMethod.apply { + hook(getTargetIndex(Opcode.RETURN)) + hook(getTargetIndexReversed(Opcode.RETURN)) + } } ?: throw MiniPlayerOverrideNoContextFingerprint.exception } ?: throw MiniPlayerDimensionsCalculatorFingerprint.exception MiniPlayerOverrideFingerprint.result?.let { it.mutableMethod.apply { - (context.toMethodWalker(this) - .nextMethod(getStringInstructionIndex("appName") + 2, true) - .getMethod() as MutableMethod) - .instructionProxyCall() + val walkerMethod = getWalkerMethod(context, getStringInstructionIndex("appName") + 2) + + walkerMethod.apply { + hook(getTargetIndex(Opcode.RETURN)) + hook(getTargetIndexReversed(Opcode.RETURN)) + } } } ?: throw MiniPlayerOverrideFingerprint.exception - MiniPlayerResponseModelSizeCheckFingerprint.result?.addProxyCall() - ?: throw MiniPlayerResponseModelSizeCheckFingerprint.exception + MiniPlayerResponseModelSizeCheckFingerprint.result?.let { + it.mutableMethod.apply { + hook(it.scanResult.patternScanResult!!.endIndex) + } + } ?: throw MiniPlayerResponseModelSizeCheckFingerprint.exception /** * Add settings @@ -108,40 +79,14 @@ object TabletMiniPlayerPatch : BytecodePatch( } - // helper methods - private fun MethodFingerprintResult.addProxyCall(): Triple { - val (method, scanIndex, parameterRegister) = this.unwrap() - method.insertOverride(scanIndex, parameterRegister) + private fun MutableMethod.hook(index: Int) { + val register = getInstruction(index).registerA - return Triple(method, scanIndex, parameterRegister) - } - - private fun MutableMethod.insertOverride(index: Int, overrideRegister: Int) { - this.addInstructions( + addInstructions( index, """ - invoke-static {v$overrideRegister}, $GENERAL->enableTabletMiniPlayer(Z)Z - move-result v$overrideRegister + invoke-static {v$register}, $GENERAL_CLASS_DESCRIPTOR->enableTabletMiniPlayer(Z)Z + move-result v$register """ ) } - - private fun MutableMethod.instructionProxyCall() { - val insertInstructions = this.implementation!!.instructions - for ((index, instruction) in insertInstructions.withIndex()) { - if (instruction.opcode != Opcode.RETURN) continue - val parameterRegister = this.getInstruction(index).registerA - this.insertOverride(index, parameterRegister) - this.insertOverride(insertInstructions.size - 1, parameterRegister) - break - } - } - - private fun MethodFingerprintResult.unwrap(): Triple { - val scanIndex = this.scanResult.patternScanResult!!.endIndex - val method = this.mutableMethod - val parameterRegister = - method.getInstruction(scanIndex).registerA - - return Triple(method, scanIndex, parameterRegister) - } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerDimensionsCalculatorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerDimensionsCalculatorFingerprint.kt index ec745d1a9..1b5f9bb2d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerDimensionsCalculatorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerDimensionsCalculatorFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Float import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object MiniPlayerDimensionsCalculatorFingerprint : LiteralValueFingerprint( +internal object MiniPlayerDimensionsCalculatorFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, literalSupplier = { FloatyBarTopMargin } diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerOverrideFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerOverrideFingerprint.kt index cac3a9292..34261a003 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerOverrideFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerOverrideFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object MiniPlayerOverrideFingerprint : MethodFingerprint( +internal object MiniPlayerOverrideFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt index bfc63399f..234a4d6aa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerOverrideNoContextFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object MiniPlayerOverrideNoContextFingerprint : MethodFingerprint( +internal object MiniPlayerOverrideNoContextFingerprint : MethodFingerprint( returnType = "Z", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, opcodes = listOf(Opcode.RETURN), // anchor to insert the instruction diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt index 2a6717ce6..7d0c7f515 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/tabletminiplayer/fingerprints/MiniPlayerResponseModelSizeCheckFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object MiniPlayerResponseModelSizeCheckFingerprint : MethodFingerprint( +internal object MiniPlayerResponseModelSizeCheckFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/ToolBarButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/ToolBarButtonPatch.kt index fcafa2b5c..f1f097d42 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/ToolBarButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/toolbar/ToolBarButtonPatch.kt @@ -1,55 +1,25 @@ package app.revanced.patches.youtube.general.toolbar import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.toolbar.ToolBarHookPatch +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object ToolBarButtonPatch : BaseBytecodePatch( name = "Hide toolbar button", description = "Adds an option to hide the button in the toolbar.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, ToolBarHookPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ToolBarButtonPatch : BytecodePatch(emptySet()) { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { override fun execute(context: BytecodeContext) { - ToolBarHookPatch.injectCall("$GENERAL->hideToolBarButton") + ToolBarHookPatch.injectCall("$GENERAL_CLASS_DESCRIPTOR->hideToolBarButton") /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/trendingsearches/TrendingSearchesPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/trendingsearches/TrendingSearchesPatch.kt index 3a81510ab..6a216487b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/trendingsearches/TrendingSearchesPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/trendingsearches/TrendingSearchesPatch.kt @@ -1,89 +1,27 @@ package app.revanced.patches.youtube.general.trendingsearches import app.revanced.patcher.data.BytecodeContext -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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.youtube.general.trendingsearches.fingerprints.SearchBarEntryFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL -import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch -import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.YtOutlineArrowTimeBlack -import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.YtOutlineFireBlack -import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.YtOutlineNewSearchBlack -import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.YtOutlineSearchBlack +import app.revanced.patches.youtube.general.trendingsearches.fingerprints.TrendingSearchConfigFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.exception -import app.revanced.util.getWideLiteralInstructionIndex -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction +import app.revanced.util.literalInstructionBooleanHook +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object TrendingSearchesPatch : BaseBytecodePatch( name = "Hide trending searches", description = "Adds an option to hide trending searches in the search bar.", - dependencies = [ - SettingsPatch::class, - SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object TrendingSearchesPatch : BytecodePatch( - setOf(SearchBarEntryFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(TrendingSearchConfigFingerprint) ) { override fun execute(context: BytecodeContext) { - SearchBarEntryFingerprint.result?.let { - it.mutableMethod.apply { - SearchTerm.entries - .map { searchTerm -> getWideLiteralInstructionIndex(searchTerm.resourceId) to searchTerm.booleanValue } - .sortedBy { searchTerm -> searchTerm.first } - .reversed() - .forEach { (targetIndex, booleanValue) -> - if (targetIndex > 1) { - val freeRegister = getInstruction(targetIndex).registerA - val viewRegister = - getInstruction(targetIndex - 1).registerA - - addInstructions( - targetIndex, """ - const/4 v$freeRegister, $booleanValue - invoke-static {v$viewRegister, v$freeRegister}, $GENERAL->hideTrendingSearches(Landroid/widget/ImageView;Z)V - """ - ) - } - } - } - } ?: throw SearchBarEntryFingerprint.exception + TrendingSearchConfigFingerprint.literalInstructionBooleanHook( + 45399984, + "$GENERAL_CLASS_DESCRIPTOR->hideTrendingSearches(Z)Z" + ) /** * Add settings @@ -98,11 +36,4 @@ object TrendingSearchesPatch : BytecodePatch( SettingsPatch.updatePatchStatus("Hide trending searches") } - - private enum class SearchTerm(val resourceId: Long, val booleanValue: Int) { - HISTORY(YtOutlineArrowTimeBlack, 0), - SEARCH(YtOutlineSearchBlack, 0), - NEW_SEARCH(YtOutlineNewSearchBlack, 0), - TRENDING(YtOutlineFireBlack, 1) - } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/trendingsearches/fingerprints/SearchBarEntryFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/trendingsearches/fingerprints/SearchBarEntryFingerprint.kt deleted file mode 100644 index 653f6e221..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/general/trendingsearches/fingerprints/SearchBarEntryFingerprint.kt +++ /dev/null @@ -1,19 +0,0 @@ -package app.revanced.patches.youtube.general.trendingsearches.fingerprints - -import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint -import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.YtOutlineArrowTimeBlack -import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.YtOutlineFireBlack -import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.YtOutlineSearchBlack -import app.revanced.util.containsWideLiteralInstructionIndex -import com.android.tools.smali.dexlib2.AccessFlags - -object SearchBarEntryFingerprint : MethodFingerprint( - returnType = "L", - accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, - customFingerprint = { methodDef, _ -> - methodDef.containsWideLiteralInstructionIndex(YtOutlineArrowTimeBlack) - && methodDef.containsWideLiteralInstructionIndex(YtOutlineFireBlack) - && methodDef.containsWideLiteralInstructionIndex(YtOutlineSearchBlack) - } -) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/trendingsearches/fingerprints/TrendingSearchConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/trendingsearches/fingerprints/TrendingSearchConfigFingerprint.kt new file mode 100644 index 000000000..dd178b319 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/general/trendingsearches/fingerprints/TrendingSearchConfigFingerprint.kt @@ -0,0 +1,10 @@ +package app.revanced.patches.youtube.general.trendingsearches.fingerprints + +import app.revanced.patcher.extensions.or +import app.revanced.util.fingerprint.LiteralValueFingerprint +import com.android.tools.smali.dexlib2.AccessFlags + +internal object TrendingSearchConfigFingerprint : LiteralValueFingerprint( + accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, + literalSupplier = { 45399984 } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/WideSearchBarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/WideSearchBarPatch.kt index 8560356e0..22b942659 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/WideSearchBarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/WideSearchBarPatch.kt @@ -3,60 +3,29 @@ package app.revanced.patches.youtube.general.widesearchbar import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.general.widesearchbar.fingerprints.SetActionBarRingoFingerprint import app.revanced.patches.youtube.general.widesearchbar.fingerprints.SetWordMarkHeaderFingerprint import app.revanced.patches.youtube.general.widesearchbar.fingerprints.YouActionBarFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.GENERAL_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch.contexts import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("DEPRECATION", "unused") +object WideSearchBarPatch : BaseBytecodePatch( name = "Enable wide search bar", description = "Adds an option to replace the search icon with a wide search bar. This will hide the YouTube logo when active.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object WideSearchBarPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( SetActionBarRingoFingerprint, SetWordMarkHeaderFingerprint ) @@ -135,7 +104,7 @@ object WideSearchBarPatch : BytecodePatch( addInstructions( insertIndex, """ - invoke-static {v$insertRegister}, $GENERAL->$descriptor(Z)Z + invoke-static {v$insertRegister}, $GENERAL_CLASS_DESCRIPTOR->$descriptor(Z)Z move-result v$insertRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/fingerprints/SetActionBarRingoFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/fingerprints/SetActionBarRingoFingerprint.kt index 0de2bc4aa..92da9d98e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/fingerprints/SetActionBarRingoFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/fingerprints/SetActionBarRingoFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Actio import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object SetActionBarRingoFingerprint : LiteralValueFingerprint( +internal object SetActionBarRingoFingerprint : LiteralValueFingerprint( returnType = "L", parameters = listOf("L", "L"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/fingerprints/SetWordMarkHeaderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/fingerprints/SetWordMarkHeaderFingerprint.kt index f5882a591..8b4056558 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/fingerprints/SetWordMarkHeaderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/fingerprints/SetWordMarkHeaderFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SetWordMarkHeaderFingerprint : MethodFingerprint( +internal object SetWordMarkHeaderFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", parameters = listOf("Landroid/widget/ImageView;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/fingerprints/YouActionBarFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/fingerprints/YouActionBarFingerprint.kt index 27cfe0f54..6854cda08 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/fingerprints/YouActionBarFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/general/widesearchbar/fingerprints/YouActionBarFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object YouActionBarFingerprint : MethodFingerprint( +internal object YouActionBarFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/animated/AnimatedButtonBackgroundPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/animated/AnimatedButtonBackgroundPatch.kt index f7adb40a7..51022e21f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/animated/AnimatedButtonBackgroundPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/animated/AnimatedButtonBackgroundPatch.kt @@ -1,50 +1,20 @@ package app.revanced.patches.youtube.layout.animated import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object AnimatedButtonBackgroundPatch : BaseResourcePatch( name = "Hide animated button background", description = "Hides the background of the pause and play animated buttons in the Shorts player.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, use = false -) -@Suppress("unused") -object AnimatedButtonBackgroundPatch : ResourcePatch() { +) { override fun execute(context: ResourceContext) { /** * Copy json diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt index bfdcb7f9f..712355543 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/icon/CustomBrandingIconPatch.kt @@ -2,54 +2,24 @@ package app.revanced.patches.youtube.layout.branding.icon import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.ResourceUtils.updatePatchStatusIcon import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources +import app.revanced.util.patch.BaseResourcePatch import org.w3c.dom.Element import java.io.File import java.nio.file.Files -@Patch( +@Suppress("DEPRECATION", "unused") +object CustomBrandingIconPatch : BaseResourcePatch( name = "Custom branding icon YouTube", description = "Change the YouTube launcher icon to the icon specified in options.json.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object CustomBrandingIconPatch : ResourcePatch() { + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE +) { private const val DEFAULT_ICON_KEY = "Revancify Blue" private val availableIcon = mapOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/name/CustomBrandingNamePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/name/CustomBrandingNamePatch.kt index f4e3ca43d..3df728f87 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/branding/name/CustomBrandingNamePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/branding/name/CustomBrandingNamePatch.kt @@ -2,52 +2,20 @@ package app.revanced.patches.youtube.layout.branding.name import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption -import app.revanced.patches.shared.elements.AbstractRemoveStringsElementsPatch +import app.revanced.patches.shared.elements.StringsElementsUtils.removeStringsElements +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.LANGUAGE_LIST import app.revanced.patches.youtube.utils.settings.ResourceUtils.updatePatchStatusLabel import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("DEPRECATION", "unused") +object CustomBrandingNamePatch : BaseResourcePatch( name = "Custom branding name YouTube", description = "Rename the YouTube app to the name specified in options.json.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object CustomBrandingNamePatch : AbstractRemoveStringsElementsPatch( - LANGUAGE_LIST, - arrayOf("application_name") + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE ) { private const val APP_NAME = "ReVanced Extended" @@ -64,7 +32,11 @@ object CustomBrandingNamePatch : AbstractRemoveStringsElementsPatch( ) override fun execute(context: ResourceContext) { - super.execute(context) + + context.removeStringsElements( + LANGUAGE_LIST, + arrayOf("application_name") + ) AppName?.let { context.xmlEditor["res/values/strings.xml"].use { editor -> diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/doubletapbackground/DoubleTapOverlayBackgroundPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/doubletapbackground/DoubleTapOverlayBackgroundPatch.kt index 387304df9..5cbc3b0c9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/doubletapbackground/DoubleTapOverlayBackgroundPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/doubletapbackground/DoubleTapOverlayBackgroundPatch.kt @@ -1,53 +1,25 @@ package app.revanced.patches.youtube.layout.doubletapbackground import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.overlaybackground.AbstractOverlayBackgroundPatch +import app.revanced.patches.shared.overlaybackground.OverlayBackgroundUtils.removeOverlayBackground +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( - name = "Hide double tap overlay filter", - description = "Hides the double tap dark filter layer.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], - use = false -) @Suppress("unused") -object DoubleTapOverlayBackgroundPatch : AbstractOverlayBackgroundPatch( - arrayOf("quick_seek_overlay.xml"), - arrayOf("tap_bloom_view", "dark_background") +object DoubleTapOverlayBackgroundPatch : BaseResourcePatch( + name = "Hide double tap overlay filter", + description = "Hides the dark overlay when double-tapping to seek.", + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + use = false ) { override fun execute(context: ResourceContext) { - super.execute(context) + + context.removeOverlayBackground( + arrayOf("quick_seek_overlay.xml"), + arrayOf("tap_bloom_view", "dark_background") + ) SettingsPatch.updatePatchStatus("Hide double tap overlay filter") diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/doubletaplength/DoubleTapLengthPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/doubletaplength/DoubleTapLengthPatch.kt index f94f7c144..d7a689860 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/doubletaplength/DoubleTapLengthPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/doubletaplength/DoubleTapLengthPatch.kt @@ -2,51 +2,21 @@ package app.revanced.patches.youtube.layout.doubletaplength import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.ResourceUtils.addEntryValues import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object DoubleTapLengthPatch : BaseResourcePatch( name = "Custom double tap length", description = "Add 'double-tap to seek' value.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object DoubleTapLengthPatch : ResourcePatch() { + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE +) { private val DoubleTapLengthArrays by stringPatchOption( key = "DoubleTapLengthArrays", default = "3, 5, 10, 15, 20, 30, 60, 120, 180", diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/header/PremiumHeadingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/header/PremiumHeadingPatch.kt index ff44aee12..e4cc8524c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/header/PremiumHeadingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/header/PremiumHeadingPatch.kt @@ -2,51 +2,21 @@ package app.revanced.patches.youtube.layout.header import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.booleanPatchOption +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.ResourceUtils.updatePatchStatusHeader import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch import kotlin.io.path.copyTo -@Patch( +@Suppress("DEPRECATION", "unused") +object PremiumHeadingPatch : BaseResourcePatch( name = "Premium heading", description = "Show or hide the premium heading.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, use = false -) -@Suppress("unused") -object PremiumHeadingPatch : ResourcePatch() { +) { private const val DEFAULT_HEADING_RES = "yt_wordmark_header" private const val PREMIUM_HEADING_RES = "yt_premium_wordmark_header" diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/pipnotification/PiPNotificationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/pipnotification/PiPNotificationPatch.kt index 098000f3b..0bf6a64f3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/pipnotification/PiPNotificationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/pipnotification/PiPNotificationPatch.kt @@ -2,57 +2,25 @@ package app.revanced.patches.youtube.layout.pipnotification import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.layout.pipnotification.fingerprints.PiPNotificationFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -@Patch( +@Suppress("unused") +object PiPNotificationPatch : BaseBytecodePatch( name = "Disable pip notification", description = "Disable pip notification when you first launch pip mode.", - dependencies = - [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object PiPNotificationPatch : BytecodePatch( - setOf(PiPNotificationFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(PiPNotificationFingerprint) ) { override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/pipnotification/fingerprints/PiPNotificationFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/pipnotification/fingerprints/PiPNotificationFingerprint.kt index 866104323..ac3a07c36 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/pipnotification/fingerprints/PiPNotificationFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/pipnotification/fingerprints/PiPNotificationFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.EditS import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object PiPNotificationFingerprint : LiteralValueFingerprint( +internal object PiPNotificationFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/splashanimation/AddSplashAnimationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/splashanimation/AddSplashAnimationPatch.kt index 44a0e2854..c3eaa6ba6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/splashanimation/AddSplashAnimationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/splashanimation/AddSplashAnimationPatch.kt @@ -1,58 +1,28 @@ package app.revanced.patches.youtube.layout.splashanimation import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources import app.revanced.util.copyXmlNode -import kotlin.io.path.exists +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("DEPRECATION", "unused") +object AddSplashAnimationPatch : BaseResourcePatch( name = "Add splash animation", description = "Adds old style splash animation.", - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, use = false -) -@Suppress("unused") -object AddSplashAnimationPatch : ResourcePatch() { +) { override fun execute(context: ResourceContext) { - val resDirectory = context["res"] - val targetXml = resDirectory.resolve("drawable").resolve("avd_anim.xml").toPath() - /** * avd_anim.xml removed from YouTube v18.19.36+ */ + val targetXml = context["res"].resolve("drawable").resolve("avd_anim.xml") + if (!targetXml.exists()) { /** diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/MaterialYouPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/MaterialYouPatch.kt index 28bb10050..f332a100a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/MaterialYouPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/MaterialYouPatch.kt @@ -1,56 +1,26 @@ package app.revanced.patches.youtube.layout.theme import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.layout.theme.ThemeBytecodePatch.isMonetPatchIncluded +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.ResourceUtils.updatePatchStatusTheme import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources import app.revanced.util.copyXmlNode +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("DEPRECATION", "unused") +object MaterialYouPatch : BaseResourcePatch( name = "MaterialYou", description = "Enables MaterialYou theme for Android 12+", - dependencies = [ + dependencies = setOf( SettingsPatch::class, ThemeBytecodePatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], + ), + compatiblePackages = COMPATIBLE_PACKAGE, use = false -) -@Suppress("unused") -object MaterialYouPatch : ResourcePatch() { +) { override fun execute(context: ResourceContext) { arrayOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/GeneralThemePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt similarity index 99% rename from src/main/kotlin/app/revanced/patches/youtube/layout/theme/GeneralThemePatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt index a1d072a12..31184a87d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/GeneralThemePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemeBytecodePatch.kt @@ -8,6 +8,7 @@ import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH import org.w3c.dom.Element @Patch(dependencies = [DrawableColorPatch::class]) +@Suppress("DEPRECATION") object ThemeBytecodePatch : ResourcePatch() { override fun execute(context: ResourceContext) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt index e3deba145..4de902c20 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/theme/ThemePatch.kt @@ -2,54 +2,24 @@ package app.revanced.patches.youtube.layout.theme import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption import app.revanced.patches.youtube.layout.theme.ThemeBytecodePatch.isMonetPatchIncluded +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.ResourceUtils.updatePatchStatusTheme import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch import org.w3c.dom.Element -@Patch( +@Suppress("DEPRECATION", "unused") +object ThemePatch : BaseResourcePatch( name = "Theme", description = "Change the app's theme to the values specified in options.json.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, ThemeBytecodePatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ThemePatch : ResourcePatch() { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { private const val AMOLED_BLACK_COLOR = "@android:color/black" private const val CATPPUCCIN_MOCHA_COLOR = "#FF181825" private const val DARK_PINK_COLOR = "#FF290025" diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tooltip/TooltipContentViewPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tooltip/TooltipContentViewPatch.kt index 233dcb4ab..95f7006ab 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tooltip/TooltipContentViewPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tooltip/TooltipContentViewPatch.kt @@ -2,54 +2,23 @@ package app.revanced.patches.youtube.layout.tooltip import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.layout.tooltip.fingerprints.TooltipContentViewFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object TooltipContentViewPatch : BaseBytecodePatch( name = "Hide tooltip content", description = "Hides the tooltip box that appears on first install.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object TooltipContentViewPatch : BytecodePatch( - setOf(TooltipContentViewFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(TooltipContentViewFingerprint) ) { override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/tooltip/fingerprints/TooltipContentViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/tooltip/fingerprints/TooltipContentViewFingerprint.kt index f96dbfecc..6fae48c41 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/tooltip/fingerprints/TooltipContentViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/tooltip/fingerprints/TooltipContentViewFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ToolT import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object TooltipContentViewFingerprint : LiteralValueFingerprint( +internal object TooltipContentViewFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/layout/voicesearch/VoiceSearchButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/layout/voicesearch/VoiceSearchButtonPatch.kt index 09b854315..a9dc29374 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/layout/voicesearch/VoiceSearchButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/layout/voicesearch/VoiceSearchButtonPatch.kt @@ -1,63 +1,35 @@ package app.revanced.patches.youtube.layout.voicesearch import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.voicesearch.AbstractVoiceSearchButtonPatch +import app.revanced.patches.shared.voicesearch.VoiceSearchUtils.patchXml +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( - name = "Hide voice search button", - description = "Hide voice search button in search bar.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], - use = false -) @Suppress("unused") -object VoiceSearchButtonPatch : AbstractVoiceSearchButtonPatch( - arrayOf( - "action_bar_search_results_view_mic.xml", - "action_bar_search_view.xml", - "action_bar_search_view_grey.xml", - "action_bar_search_view_mic_out.xml" - ), - arrayOf( - "height", - "marginEnd", - "marginStart", - "width" - ) +object VoiceSearchButtonPatch : BaseResourcePatch( + name = "Hide voice search button", + description = "Hides the voice search button in the search bar.", + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + use = false ) { override fun execute(context: ResourceContext) { - super.execute(context) + + context.patchXml( + arrayOf( + "action_bar_search_results_view_mic.xml", + "action_bar_search_view.xml", + "action_bar_search_view_grey.xml", + "action_bar_search_view_mic_out.xml" + ), + arrayOf( + "height", + "marginEnd", + "marginStart", + "width" + ) + ) SettingsPatch.updatePatchStatus("Hide voice search button") } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/ambientmode/AmbientModeSwitchPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/ambientmode/AmbientModeSwitchPatch.kt index 2a55af85c..87ef41454 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/ambientmode/AmbientModeSwitchPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/ambientmode/AmbientModeSwitchPatch.kt @@ -3,59 +3,26 @@ package app.revanced.patches.youtube.misc.ambientmode import app.revanced.patcher.data.BytecodeContext 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.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.misc.ambientmode.fingerprints.AmbientModeInFullscreenFingerprint import app.revanced.patches.youtube.misc.ambientmode.fingerprints.PowerSaveModeFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception -import app.revanced.util.getWideLiteralInstructionIndex -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.util.getTargetIndexWithMethodReferenceNameReversed +import app.revanced.util.literalInstructionBooleanHook +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -@Patch( +@Suppress("unused") +object AmbientModeSwitchPatch : BaseBytecodePatch( name = "Ambient mode switch", description = "Adds an option to bypass the restrictions of ambient mode or disable it completely.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object AmbientModeSwitchPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( AmbientModeInFullscreenFingerprint, PowerSaveModeFingerprint ) @@ -64,43 +31,22 @@ object AmbientModeSwitchPatch : BytecodePatch( PowerSaveModeFingerprint.result?.let { it.mutableMethod.apply { - var insertIndex = -1 + val powerSaveModePrimaryIndex = getTargetIndexWithMethodReferenceNameReversed("isPowerSaveMode") + val powerSaveModeSecondaryIndex = getTargetIndexWithMethodReferenceNameReversed(powerSaveModePrimaryIndex - 1, "isPowerSaveMode") - for ((index, instruction) in implementation!!.instructions.withIndex()) { - if (instruction.opcode != Opcode.INVOKE_VIRTUAL) continue - - val invokeInstruction = instruction as Instruction35c - if ((invokeInstruction.reference as MethodReference).name != "isPowerSaveMode") continue - - val targetRegister = getInstruction(index + 1).registerA - - insertIndex = index + 2 - - addInstructions( - insertIndex, """ - invoke-static {v$targetRegister}, $MISC_PATH/AmbientModePatch;->bypassPowerSaveModeRestrictions(Z)Z - move-result v$targetRegister - """ - ) + arrayOf( + powerSaveModePrimaryIndex, + powerSaveModeSecondaryIndex + ).forEach { index -> + hook(index) } - if (insertIndex == -1) - throw PatchException("Couldn't find PowerManager reference") } } ?: throw PowerSaveModeFingerprint.exception - AmbientModeInFullscreenFingerprint.result?.let { - it.mutableMethod.apply { - val targetIndex = getWideLiteralInstructionIndex(45389368) + 3 - val targetRegister = getInstruction(targetIndex).registerA - - addInstructions( - targetIndex + 1, """ - invoke-static {}, $FULLSCREEN->disableAmbientMode()Z - move-result v$targetRegister - """ - ) - } - } ?: throw AmbientModeInFullscreenFingerprint.exception + AmbientModeInFullscreenFingerprint.literalInstructionBooleanHook( + 45389368, + "$FULLSCREEN_CLASS_DESCRIPTOR->disableAmbientMode()Z" + ) /** * Add settings @@ -115,4 +61,15 @@ object AmbientModeSwitchPatch : BytecodePatch( SettingsPatch.updatePatchStatus("Ambient mode switch") } + + private fun MutableMethod.hook(index: Int) { + val register = getInstruction(index + 1).registerA + + addInstructions( + index + 2, """ + invoke-static {v$register}, $MISC_PATH/AmbientModePatch;->bypassPowerSaveModeRestrictions(Z)Z + move-result v$register + """ + ) + } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/ambientmode/fingerprints/AmbientModeInFullscreenFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/ambientmode/fingerprints/AmbientModeInFullscreenFingerprint.kt index 4dc57447a..ae0d3ab36 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/ambientmode/fingerprints/AmbientModeInFullscreenFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/ambientmode/fingerprints/AmbientModeInFullscreenFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.misc.ambientmode.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint -object AmbientModeInFullscreenFingerprint : LiteralValueFingerprint( +internal object AmbientModeInFullscreenFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { 45389368 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/ambientmode/fingerprints/PowerSaveModeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/ambientmode/fingerprints/PowerSaveModeFingerprint.kt index 9505de169..4df39ad3b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/ambientmode/fingerprints/PowerSaveModeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/ambientmode/fingerprints/PowerSaveModeFingerprint.kt @@ -7,7 +7,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c import com.android.tools.smali.dexlib2.iface.reference.MethodReference -object PowerSaveModeFingerprint : MethodFingerprint( +internal object PowerSaveModeFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Ljava/lang/Object;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/audio/ForceOpusCodecBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/audio/ForceOpusCodecBytecodePatch.kt new file mode 100644 index 000000000..333f30c70 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/audio/ForceOpusCodecBytecodePatch.kt @@ -0,0 +1,8 @@ +package app.revanced.patches.youtube.misc.codec.audio + +import app.revanced.patches.shared.opus.BaseOpusCodecsPatch +import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH + +object ForceOpusCodecBytecodePatch : BaseOpusCodecsPatch( + "$MISC_PATH/CodecOverridePatch;->shouldForceOpus()Z" +) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/audio/ForceOpusCodecPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/audio/ForceOpusCodecPatch.kt index 27dbc452f..9550e678b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/audio/ForceOpusCodecPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/audio/ForceOpusCodecPatch.kt @@ -1,52 +1,21 @@ package app.revanced.patches.youtube.misc.codec.audio -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.opus.AbstractOpusCodecsPatch -import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object ForceOpusCodecPatch : BaseResourcePatch( name = "Force opus codec", description = "Adds an option to force the opus audio codec instead of the mp4a audio codec.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ForceOpusCodecPatch : AbstractOpusCodecsPatch( - "$MISC_PATH/CodecOverridePatch;->shouldForceOpus()Z" + dependencies = setOf( + ForceOpusCodecBytecodePatch::class, + SettingsPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE ) { - override fun execute(context: BytecodeContext) { - super.execute(context) + override fun execute(context: ResourceContext) { /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/ForceVideoCodecPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/ForceVideoCodecPatch.kt index 2bc1f0d5d..e43457cf6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/ForceVideoCodecPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/ForceVideoCodecPatch.kt @@ -5,64 +5,37 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.fingerprint.MethodFingerprintResult -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.misc.codec.video.fingerprints.VideoPrimaryFingerprint import app.revanced.patches.youtube.misc.codec.video.fingerprints.VideoPropsFingerprint import app.revanced.patches.youtube.misc.codec.video.fingerprints.VideoPropsParentFingerprint import app.revanced.patches.youtube.misc.codec.video.fingerprints.VideoSecondaryFingerprint import app.revanced.patches.youtube.utils.fingerprints.LayoutSwitchFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception -import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.dexbacked.reference.DexBackedFieldReference +import app.revanced.util.getTargetIndexWithFieldReferenceName +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -@Patch( +@Suppress("unused") +object ForceVideoCodecPatch : BaseBytecodePatch( name = "Force video codec", description = "Adds an option to force the video codec.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ForceVideoCodecPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( LayoutSwitchFingerprint, VideoPropsParentFingerprint ) ) { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = + "$MISC_PATH/CodecOverridePatch;" + + private const val INTEGRATIONS_CLASS_METHOD_REFERENCE = + "$INTEGRATIONS_CLASS_DESCRIPTOR->shouldForceCodec(Z)Z" + override fun execute(context: BytecodeContext) { LayoutSwitchFingerprint.result?.classDef?.let { classDef -> @@ -106,12 +79,6 @@ object ForceVideoCodecPatch : BytecodePatch( } - private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "$MISC_PATH/CodecOverridePatch;" - - private const val INTEGRATIONS_CLASS_METHOD_REFERENCE = - "$INTEGRATIONS_CLASS_DESCRIPTOR->shouldForceCodec(Z)Z" - private fun MethodFingerprintResult.injectOverride() { mutableMethod.apply { val startIndex = scanResult.patternScanResult!!.startIndex @@ -144,28 +111,15 @@ object ForceVideoCodecPatch : BytecodePatch( fieldName: String, descriptor: String ) { - val targetString = "Landroid/os/Build;->" + - fieldName + - ":Ljava/lang/String;" + val index = getTargetIndexWithFieldReferenceName(fieldName) + val register = getInstruction(index).registerA - for ((index, instruction) in implementation!!.instructions.withIndex()) { - if (instruction.opcode != Opcode.SGET_OBJECT) continue - - val indexString = - ((instruction as? ReferenceInstruction)?.reference as? DexBackedFieldReference).toString() - - if (indexString != targetString) continue - - val register = getInstruction(index).registerA - - addInstructions( - index + 1, """ - invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->$descriptor(Ljava/lang/String;)Ljava/lang/String; - move-result-object v$register - """ - ) - break - } + addInstructions( + index + 1, """ + invoke-static {v$register}, $INTEGRATIONS_CLASS_DESCRIPTOR->$descriptor(Ljava/lang/String;)Ljava/lang/String; + move-result-object v$register + """ + ) } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoPrimaryFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoPrimaryFingerprint.kt index d6b133108..c4342122a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoPrimaryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoPrimaryFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object VideoPrimaryFingerprint : MethodFingerprint( +internal object VideoPrimaryFingerprint : MethodFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("I"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoPropsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoPropsFingerprint.kt index e8067054e..96c7e9c88 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoPropsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoPropsFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object VideoPropsFingerprint : MethodFingerprint( +internal object VideoPropsFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoPropsParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoPropsParentFingerprint.kt index 935d2e334..64afb8428 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoPropsParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoPropsParentFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.misc.codec.video.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object VideoPropsParentFingerprint : MethodFingerprint( +internal object VideoPropsParentFingerprint : MethodFingerprint( returnType = "V", strings = listOf("Android Wear") ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoSecondaryFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoSecondaryFingerprint.kt index 8c1146ac7..e4e9b63bc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoSecondaryFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/codec/video/fingerprints/VideoSecondaryFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object VideoSecondaryFingerprint : MethodFingerprint( +internal object VideoSecondaryFingerprint : MethodFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L", "I"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/DebuggingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/DebuggingPatch.kt index e167981eb..cc3e0efee 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/DebuggingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/debugging/DebuggingPatch.kt @@ -1,48 +1,18 @@ package app.revanced.patches.youtube.misc.debugging import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object DebuggingPatch : BaseResourcePatch( name = "Enable debug logging", description = "Adds an option to enable debug logging.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, use = false -) -@Suppress("unused") -object DebuggingPatch : ResourcePatch() { +) { override fun execute(context: ResourceContext) { /** diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/externalbrowser/ExternalBrowserPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/externalbrowser/OpenLinksExternallyBytecodePatch.kt similarity index 51% rename from src/main/kotlin/app/revanced/patches/youtube/misc/externalbrowser/ExternalBrowserPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/misc/externalbrowser/OpenLinksExternallyBytecodePatch.kt index 86b6d8b15..f54ee93ab 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/externalbrowser/ExternalBrowserPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/externalbrowser/OpenLinksExternallyBytecodePatch.kt @@ -1,13 +1,9 @@ package app.revanced.patches.youtube.misc.externalbrowser -import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.shared.transformation.BaseTransformInstructionsPatch import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH -import app.revanced.patches.youtube.utils.settings.SettingsPatch import com.android.tools.smali.dexlib2.iface.ClassDef import com.android.tools.smali.dexlib2.iface.Method import com.android.tools.smali.dexlib2.iface.instruction.Instruction @@ -15,42 +11,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.reference.StringReference -@Patch( - name = "Enable external browser", - description = "Adds an option to always open links in your browser instead of in the in-app-browser.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ExternalBrowserPatch : BaseTransformInstructionsPatch>( +object OpenLinksExternallyBytecodePatch : BaseTransformInstructionsPatch>( ) { override fun filterMap( classDef: ClassDef, @@ -77,19 +38,4 @@ object ExternalBrowserPatch : BaseTransformInstructionsPatch>( """ ) } - - override fun execute(context: BytecodeContext) { - super.execute(context) - - /** - * Add settings - */ - SettingsPatch.addPreference( - arrayOf( - "SETTINGS: ENABLE_EXTERNAL_BROWSER" - ) - ) - - SettingsPatch.updatePatchStatus("Enable external browser") - } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/externalbrowser/OpenLinksExternallyPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/externalbrowser/OpenLinksExternallyPatch.kt new file mode 100644 index 000000000..bb59768cf --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/externalbrowser/OpenLinksExternallyPatch.kt @@ -0,0 +1,31 @@ +package app.revanced.patches.youtube.misc.externalbrowser + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseBytecodePatch + +@Suppress("unused") +object OpenLinksExternallyPatch : BaseBytecodePatch( + name = "Enable external browser", + description = "Adds an option to always open links in your browser instead of in the in-app-browser.", + dependencies = setOf( + OpenLinksExternallyBytecodePatch::class, + SettingsPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { + override fun execute(context: BytecodeContext) { + + /** + * Add settings + */ + SettingsPatch.addPreference( + arrayOf( + "SETTINGS: ENABLE_EXTERNAL_BROWSER" + ) + ) + + SettingsPatch.updatePatchStatus("Enable external browser") + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/language/LanguageSelectorPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/language/LanguageSelectorPatch.kt index 442b9ee85..2a6c24d5a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/language/LanguageSelectorPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/language/LanguageSelectorPatch.kt @@ -3,53 +3,22 @@ package app.revanced.patches.youtube.misc.language import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.misc.language.fingerprints.GeneralPrefsFingerprint import app.revanced.patches.youtube.misc.language.fingerprints.GeneralPrefsLegacyFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object LanguageSelectorPatch : BaseBytecodePatch( name = "Enable language switch", description = "Adds an option to enable or disable language switching toggle.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object LanguageSelectorPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( GeneralPrefsFingerprint, GeneralPrefsLegacyFingerprint ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/language/fingerprints/GeneralPrefsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/language/fingerprints/GeneralPrefsFingerprint.kt index f221d9300..2b06a07e6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/language/fingerprints/GeneralPrefsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/language/fingerprints/GeneralPrefsFingerprint.kt @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * Compatible with YouTube v18.33.40~ */ -object GeneralPrefsFingerprint : MethodFingerprint( +internal object GeneralPrefsFingerprint : MethodFingerprint( returnType = "V", parameters = emptyList(), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/language/fingerprints/GeneralPrefsLegacyFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/language/fingerprints/GeneralPrefsLegacyFingerprint.kt index edb07fb65..8c9c944fa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/language/fingerprints/GeneralPrefsLegacyFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/language/fingerprints/GeneralPrefsLegacyFingerprint.kt @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * Compatible with ~YouTube v18.32.39 */ -object GeneralPrefsLegacyFingerprint : MethodFingerprint( +internal object GeneralPrefsLegacyFingerprint : MethodFingerprint( returnType = "V", parameters = emptyList(), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/LayoutSwitchPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/LayoutSwitchPatch.kt index e2d553c3d..6b6cd125a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/LayoutSwitchPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/LayoutSwitchPatch.kt @@ -1,69 +1,48 @@ package app.revanced.patches.youtube.misc.layoutswitch import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.misc.layoutswitch.fingerprints.GetFormFactorFingerprint import app.revanced.patches.youtube.utils.fingerprints.LayoutSwitchFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.getStringInstructionIndex +import app.revanced.util.getTargetIndex +import app.revanced.util.getTargetIndexReversed +import app.revanced.util.patch.BaseBytecodePatch +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object LayoutSwitchPatch : BaseBytecodePatch( name = "Layout switch", description = "Adds an option to trick dpi to use tablet or phone layout.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object LayoutSwitchPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( GetFormFactorFingerprint, LayoutSwitchFingerprint ) ) { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = + "$MISC_PATH/LayoutOverridePatch;" override fun execute(context: BytecodeContext) { + // tablet layout GetFormFactorFingerprint.result?.let { it.mutableMethod.apply { - val jumpIndex = it.scanResult.patternScanResult!!.endIndex - 4 + val jumpIndex = getTargetIndexReversed(Opcode.SGET_OBJECT) addInstructionsWithLabels( 0, """ - invoke-static { }, $MISC_PATH/LayoutOverridePatch;->enableTabletLayout()Z + invoke-static { }, $INTEGRATIONS_CLASS_DESCRIPTOR->enableTabletLayout()Z move-result v0 # Free register if-nez v0, :is_large_form_factor """, @@ -73,13 +52,14 @@ object LayoutSwitchPatch : BytecodePatch( ) ) } - } ?: GetFormFactorFingerprint.exception + } ?: throw GetFormFactorFingerprint.exception + // phone layout LayoutSwitchFingerprint.result?.let { it.mutableMethod.apply { addInstructions( 4, """ - invoke-static {p0}, $MISC_PATH/LayoutOverridePatch;->getLayoutOverride(I)I + invoke-static {p0}, $INTEGRATIONS_CLASS_DESCRIPTOR->getLayoutOverride(I)I move-result p0 """ ) @@ -99,4 +79,18 @@ object LayoutSwitchPatch : BytecodePatch( SettingsPatch.updatePatchStatus("Layout switch") } + + private fun MutableMethod.injectEnum( + enumName: String, + fieldName: String + ) { + val stringIndex = getStringInstructionIndex(enumName) + val insertIndex = getTargetIndex(stringIndex, Opcode.SPUT_OBJECT) + val insertRegister = getInstruction(insertIndex).registerA + + addInstruction( + insertIndex + 1, + "sput-object v$insertRegister, $INTEGRATIONS_CLASS_DESCRIPTOR->$fieldName:Ljava/lang/Enum;" + ) + } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/GetFormFactorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/GetFormFactorFingerprint.kt index 0617efcc8..d621f9b68 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/GetFormFactorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/layoutswitch/fingerprints/GetFormFactorFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object GetFormFactorFingerprint : MethodFingerprint( +internal object GetFormFactorFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, returnType = "L", parameters = listOf("Landroid/content/Context;", "Ljava/util/List;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt index ea856d2e9..16c0a71b2 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/MinimizedPlaybackPatch.kt @@ -4,68 +4,40 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.KidsMinimizedPlaybackPolicyControllerFingerprint import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackManagerFingerprint import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.MinimizedPlaybackSettingsFingerprint import app.revanced.patches.youtube.misc.minimizedplayback.fingerprints.PiPControllerFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH import app.revanced.patches.youtube.utils.integrations.IntegrationsPatch import app.revanced.patches.youtube.utils.playertype.PlayerTypeHookPatch import app.revanced.util.exception +import app.revanced.util.getWalkerMethod +import app.revanced.util.patch.BaseBytecodePatch 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.MethodReference -@Patch( +@Suppress("unused") +object MinimizedPlaybackPatch : BaseBytecodePatch( name = "Enable minimized playback", description = "Enables minimized and background playback.", - dependencies = [ + dependencies = setOf( IntegrationsPatch::class, PlayerTypeHookPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object MinimizedPlaybackPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( KidsMinimizedPlaybackPolicyControllerFingerprint, MinimizedPlaybackManagerFingerprint, MinimizedPlaybackSettingsFingerprint, PiPControllerFingerprint ) ) { + private const val INTEGRATIONS_METHOD_REFERENCE = + "$MISC_PATH/MinimizedPlaybackPatch;->isPlaybackNotShort()Z" + override fun execute(context: BytecodeContext) { KidsMinimizedPlaybackPolicyControllerFingerprint.result?.let { it.mutableMethod.apply { @@ -96,10 +68,7 @@ object MinimizedPlaybackPatch : BytecodePatch( } val booleanIndex = booleanCalls.elementAt(1).index - val booleanMethod = - context.toMethodWalker(this) - .nextMethod(booleanIndex, true) - .getMethod() as MutableMethod + val booleanMethod = getWalkerMethod(context, booleanIndex) booleanMethod.addInstructions( 0, """ @@ -111,10 +80,7 @@ object MinimizedPlaybackPatch : BytecodePatch( } ?: throw MinimizedPlaybackSettingsFingerprint.exception PiPControllerFingerprint.result?.let { - val targetMethod = context - .toMethodWalker(it.method) - .nextMethod(it.scanResult.patternScanResult!!.endIndex, true) - .getMethod() as MutableMethod + val targetMethod = it.getWalkerMethod(context, it.scanResult.patternScanResult!!.endIndex) targetMethod.apply { val targetRegister = getInstruction(0).registerA @@ -126,7 +92,4 @@ object MinimizedPlaybackPatch : BytecodePatch( } } ?: throw PiPControllerFingerprint.exception } - - private const val INTEGRATIONS_METHOD_REFERENCE = - "$MISC_PATH/MinimizedPlaybackPatch;->isPlaybackNotShort()Z" } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/KidsMinimizedPlaybackPolicyControllerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/KidsMinimizedPlaybackPolicyControllerFingerprint.kt index bc9a16cd6..e211422cc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/KidsMinimizedPlaybackPolicyControllerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/KidsMinimizedPlaybackPolicyControllerFingerprint.kt @@ -1,12 +1,11 @@ package app.revanced.patches.youtube.misc.minimizedplayback.fingerprints import app.revanced.patcher.extensions.or -import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction -object KidsMinimizedPlaybackPolicyControllerFingerprint : MethodFingerprint( +internal object KidsMinimizedPlaybackPolicyControllerFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("I", "L", "L"), @@ -39,9 +38,5 @@ object KidsMinimizedPlaybackPolicyControllerFingerprint : MethodFingerprint( Opcode.INVOKE_VIRTUAL, Opcode.RETURN_VOID ), - customFingerprint = { methodDef, _ -> - methodDef.implementation!!.instructions.any { - ((it as? NarrowLiteralInstruction)?.narrowLiteral == 5) - } - } + literalSupplier = { 5 } ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/MinimizedPlaybackManagerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/MinimizedPlaybackManagerFingerprint.kt index 2d5a9a6b3..3fa0a8355 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/MinimizedPlaybackManagerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/MinimizedPlaybackManagerFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object MinimizedPlaybackManagerFingerprint : LiteralValueFingerprint( +internal object MinimizedPlaybackManagerFingerprint : LiteralValueFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/MinimizedPlaybackSettingsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/MinimizedPlaybackSettingsFingerprint.kt index 81a74ca65..00384bc94 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/MinimizedPlaybackSettingsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/MinimizedPlaybackSettingsFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object MinimizedPlaybackSettingsFingerprint : LiteralValueFingerprint( +internal object MinimizedPlaybackSettingsFingerprint : LiteralValueFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/PiPControllerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/PiPControllerFingerprint.kt index aad082a5c..94d3f2aaa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/PiPControllerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/minimizedplayback/fingerprints/PiPControllerFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object PiPControllerFingerprint : LiteralValueFingerprint( +internal object PiPControllerFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/openlinksdirectly/OpenLinksDirectlyPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/openlinksdirectly/OpenLinksDirectlyPatch.kt index f5dbd9463..c2a215742 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/openlinksdirectly/OpenLinksDirectlyPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/openlinksdirectly/OpenLinksDirectlyPatch.kt @@ -3,55 +3,24 @@ package app.revanced.patches.youtube.misc.openlinksdirectly import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.misc.openlinksdirectly.fingerprints.OpenLinksDirectlyFingerprintPrimary import app.revanced.patches.youtube.misc.openlinksdirectly.fingerprints.OpenLinksDirectlyFingerprintSecondary +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c import com.android.tools.smali.dexlib2.iface.reference.MethodReference -@Patch( +@Suppress("unused") +object OpenLinksDirectlyPatch : BaseBytecodePatch( name = "Enable open links directly", description = "Adds an option to skip over redirection URLs in external links.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object OpenLinksDirectlyPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( OpenLinksDirectlyFingerprintPrimary, OpenLinksDirectlyFingerprintSecondary ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/quic/QUICProtocolPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/quic/QUICProtocolPatch.kt index d584aa612..9a3392f66 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/quic/QUICProtocolPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/quic/QUICProtocolPatch.kt @@ -2,52 +2,21 @@ package app.revanced.patches.youtube.misc.quic import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.misc.quic.fingerprints.CronetEngineBuilderFingerprint import app.revanced.patches.youtube.misc.quic.fingerprints.ExperimentalCronetEngineBuilderFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object QUICProtocolPatch : BaseBytecodePatch( name = "Disable QUIC protocol", description = "Adds an option to disable CronetEngine's QUIC protocol.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object QUICProtocolPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( CronetEngineBuilderFingerprint, ExperimentalCronetEngineBuilderFingerprint ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/quic/fingerprints/CronetEngineBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/quic/fingerprints/CronetEngineBuilderFingerprint.kt index 4f9167f39..2c67eac49 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/quic/fingerprints/CronetEngineBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/quic/fingerprints/CronetEngineBuilderFingerprint.kt @@ -3,9 +3,12 @@ package app.revanced.patches.youtube.misc.quic.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object CronetEngineBuilderFingerprint : MethodFingerprint( +internal object CronetEngineBuilderFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC.value, parameters = listOf("Z"), - customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/CronetEngine\$Builder;") && methodDef.name == "enableQuic" } + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("/CronetEngine\$Builder;") + && methodDef.name == "enableQuic" + } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/quic/fingerprints/ExperimentalCronetEngineBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/quic/fingerprints/ExperimentalCronetEngineBuilderFingerprint.kt index be42a14ca..62e47719c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/quic/fingerprints/ExperimentalCronetEngineBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/quic/fingerprints/ExperimentalCronetEngineBuilderFingerprint.kt @@ -3,9 +3,12 @@ package app.revanced.patches.youtube.misc.quic.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object ExperimentalCronetEngineBuilderFingerprint : MethodFingerprint( +internal object ExperimentalCronetEngineBuilderFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC.value, parameters = listOf("Z"), - customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/ExperimentalCronetEngine\$Builder;") && methodDef.name == "enableQuic" } + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("/ExperimentalCronetEngine\$Builder;") + && methodDef.name == "enableQuic" + } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/NewSplashAnimationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/NewSplashAnimationPatch.kt index 3d4663fec..a0d0ecc30 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/NewSplashAnimationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/NewSplashAnimationPatch.kt @@ -3,11 +3,9 @@ package app.revanced.patches.youtube.misc.splashanimation import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.misc.splashanimation.fingerprints.WatchWhileActivityWithOutFlagsFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch.mainActivityMutableClass @@ -16,50 +14,22 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.DarkS import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object NewSplashAnimationPatch : BaseBytecodePatch( name = "Enable new splash animation", description = "Adds an option to enable a new type of splash animation.", - dependencies = [ + dependencies = setOf( MainActivityResolvePatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object NewSplashAnimationPatch : BytecodePatch(emptySet()) { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = "$MISC_PATH/SplashAnimationPatch;" diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/fingerprints/WatchWhileActivityWithOutFlagsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/fingerprints/WatchWhileActivityWithOutFlagsFingerprint.kt index efe8ebd3f..c623e38d5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/fingerprints/WatchWhileActivityWithOutFlagsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/splashanimation/fingerprints/WatchWhileActivityWithOutFlagsFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.DarkS import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.Opcode -object WatchWhileActivityWithOutFlagsFingerprint : MethodFingerprint( +internal object WatchWhileActivityWithOutFlagsFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("Landroid/os/Bundle;"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/spoofappversion/SpoofAppVersionBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/spoofappversion/SpoofAppVersionBytecodePatch.kt new file mode 100644 index 000000000..6ba283525 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/spoofappversion/SpoofAppVersionBytecodePatch.kt @@ -0,0 +1,8 @@ +package app.revanced.patches.youtube.misc.spoofappversion + +import app.revanced.patches.shared.spoofappversion.BaseSpoofAppVersionPatch +import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH + +object SpoofAppVersionBytecodePatch : BaseSpoofAppVersionPatch( + "$MISC_PATH/SpoofAppVersionPatch;->getVersionOverride(Ljava/lang/String;)Ljava/lang/String;" +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/spoofappversion/SpoofAppVersionPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/spoofappversion/SpoofAppVersionPatch.kt index 7011fb80c..1968a0be1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/spoofappversion/SpoofAppVersionPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/spoofappversion/SpoofAppVersionPatch.kt @@ -1,65 +1,32 @@ package app.revanced.patches.youtube.misc.spoofappversion -import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.versionspoof.AbstractVersionSpoofPatch -import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.patches.youtube.utils.settings.SettingsPatch.contexts import app.revanced.util.copyXmlNode +import app.revanced.util.patch.BaseResourcePatch import org.w3c.dom.Element -@Patch( +@Suppress("DEPRECATION", "unused") +object SpoofAppVersionPatch : BaseResourcePatch( name = "Spoof app version", description = "Adds options to spoof the YouTube client version. " + "This can be used to restore old UI elements and features.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object SpoofAppVersionPatch : AbstractVersionSpoofPatch( - "$MISC_PATH/SpoofAppVersionPatch;->getVersionOverride(Ljava/lang/String;)Ljava/lang/String;" + dependencies = setOf( + SettingsPatch::class, + SpoofAppVersionBytecodePatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE ) { - override fun execute(context: BytecodeContext) { - super.execute(context) + override fun execute(context: ResourceContext) { /** * Copy arrays */ - contexts.copyXmlNode("youtube/spoofappversion/host", "values/arrays.xml", "resources") + context.copyXmlNode("youtube/spoofappversion/host", "values/arrays.xml", "resources") if (SettingsPatch.upward1834) { - contexts.appendChild( + context.appendChild( arrayOf( "revanced_spoof_app_version_target_entry" to "@string/revanced_spoof_app_version_target_entry_18_33_40", "revanced_spoof_app_version_target_entry_value" to "18.33.40", @@ -67,7 +34,7 @@ object SpoofAppVersionPatch : AbstractVersionSpoofPatch( ) if (SettingsPatch.upward1839) { - contexts.appendChild( + context.appendChild( arrayOf( "revanced_spoof_app_version_target_entry" to "@string/revanced_spoof_app_version_target_entry_18_38_45", "revanced_spoof_app_version_target_entry_value" to "18.38.45" @@ -75,7 +42,7 @@ object SpoofAppVersionPatch : AbstractVersionSpoofPatch( ) if (SettingsPatch.upward1849) { - contexts.appendChild( + context.appendChild( arrayOf( "revanced_spoof_app_version_target_entry" to "@string/revanced_spoof_app_version_target_entry_18_48_39", "revanced_spoof_app_version_target_entry_value" to "18.48.39" diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/spoofdimensions/SpoofDeviceDimensionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/spoofdimensions/SpoofDeviceDimensionsPatch.kt index 373b564a5..b754cef75 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/spoofdimensions/SpoofDeviceDimensionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/spoofdimensions/SpoofDeviceDimensionsPatch.kt @@ -2,52 +2,21 @@ package app.revanced.patches.youtube.misc.spoofdimensions import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.misc.spoofdimensions.fingerprints.DeviceDimensionsModelToStringFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.util.MethodUtil -@Patch( +@Suppress("unused") +object SpoofDeviceDimensionsPatch : BaseBytecodePatch( name = "Spoof device dimensions", description = "Adds an option to spoof the device dimensions which unlocks higher video qualities if they aren't available on the device.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object SpoofDeviceDimensionsPatch : BytecodePatch( - setOf(DeviceDimensionsModelToStringFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(DeviceDimensionsModelToStringFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = "$MISC_PATH/SpoofDeviceDimensionsPatch;" diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/spoofdimensions/fingerprints/DeviceDimensionsModelToStringFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/spoofdimensions/fingerprints/DeviceDimensionsModelToStringFingerprint.kt index 6b424a877..f9980d03c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/spoofdimensions/fingerprints/DeviceDimensionsModelToStringFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/spoofdimensions/fingerprints/DeviceDimensionsModelToStringFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.misc.spoofdimensions.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object DeviceDimensionsModelToStringFingerprint : MethodFingerprint( +internal object DeviceDimensionsModelToStringFingerprint : MethodFingerprint( returnType = "L", strings = listOf("minh.", ";maxh.") ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/SanitizeUrlQueryBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/SanitizeUrlQueryBytecodePatch.kt new file mode 100644 index 000000000..5512eb0a8 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/SanitizeUrlQueryBytecodePatch.kt @@ -0,0 +1,71 @@ +package app.revanced.patches.youtube.misc.tracking + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction +import app.revanced.patches.shared.tracking.BaseSanitizeUrlQueryPatch +import app.revanced.patches.shared.tracking.fingerprints.CopyTextEndpointFingerprint +import app.revanced.patches.youtube.misc.tracking.fingerprints.ShareLinkFormatterFingerprint +import app.revanced.patches.youtube.misc.tracking.fingerprints.SystemShareLinkFormatterFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH +import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.exception +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 + +object SanitizeUrlQueryBytecodePatch : BaseSanitizeUrlQueryPatch( + "$MISC_PATH/SanitizeUrlQueryPatch;", + listOf(CopyTextEndpointFingerprint), + listOf( + ShareLinkFormatterFingerprint, + SystemShareLinkFormatterFingerprint + ) +) { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = + "$MISC_PATH/SanitizeUrlQueryPatch;" + + override fun execute(context: BytecodeContext) { + super.execute(context) + + arrayOf( + ShareLinkFormatterFingerprint, + SystemShareLinkFormatterFingerprint + ).forEach { fingerprint -> + fingerprint.result?.let { + it.mutableMethod.apply { + for ((index, instruction) in implementation!!.instructions.withIndex()) { + if (instruction.opcode != Opcode.INVOKE_VIRTUAL) + continue + + if ((instruction as ReferenceInstruction).reference.toString() != "Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;") + continue + + if (getInstruction(index + 1).opcode != Opcode.GOTO) + continue + + val invokeInstruction = instruction as FiveRegisterInstruction + + replaceInstruction( + index, + "invoke-static {v${invokeInstruction.registerC}, v${invokeInstruction.registerD}, v${invokeInstruction.registerE}}, " + + "$INTEGRATIONS_CLASS_DESCRIPTOR->stripQueryParameters(Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;)V" + ) + } + } + } ?: throw fingerprint.exception + } + + + /** + * Add settings + */ + SettingsPatch.addPreference( + arrayOf( + "SETTINGS: SANITIZE_SHARING_LINKS" + ) + ) + + SettingsPatch.updatePatchStatus("Sanitize sharing links") + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/SanitizeUrlQueryPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/SanitizeUrlQueryPatch.kt index d606d4364..fa989eb11 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/SanitizeUrlQueryPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/SanitizeUrlQueryPatch.kt @@ -1,98 +1,21 @@ package app.revanced.patches.youtube.misc.tracking -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.tracking.AbstractSanitizeUrlQueryPatch -import app.revanced.patches.shared.tracking.fingerprints.CopyTextEndpointFingerprint -import app.revanced.patches.youtube.misc.tracking.fingerprints.ShareLinkFormatterFingerprint -import app.revanced.patches.youtube.misc.tracking.fingerprints.SystemShareLinkFormatterFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.exception -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 app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object SanitizeUrlQueryPatch : BaseResourcePatch( name = "Sanitize sharing links", description = "Adds an option to remove tracking query parameters from URLs when sharing links.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object SanitizeUrlQueryPatch : AbstractSanitizeUrlQueryPatch( - "$MISC_PATH/SanitizeUrlQueryPatch;", - listOf(CopyTextEndpointFingerprint), - listOf( - ShareLinkFormatterFingerprint, - SystemShareLinkFormatterFingerprint - ) + dependencies = setOf( + SanitizeUrlQueryBytecodePatch::class, + SettingsPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE ) { - private const val INTEGRATIONS_CLASS_DESCRIPTOR = - "$MISC_PATH/SanitizeUrlQueryPatch;" - - override fun execute(context: BytecodeContext) { - super.execute(context) - - arrayOf( - ShareLinkFormatterFingerprint, - SystemShareLinkFormatterFingerprint - ).forEach { fingerprint -> - fingerprint.result?.let { - it.mutableMethod.apply { - for ((index, instruction) in implementation!!.instructions.withIndex()) { - if (instruction.opcode != Opcode.INVOKE_VIRTUAL) - continue - - if ((instruction as ReferenceInstruction).reference.toString() != "Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;") - continue - - if (getInstruction(index + 1).opcode != Opcode.GOTO) - continue - - val invokeInstruction = instruction as FiveRegisterInstruction - - replaceInstruction( - index, - "invoke-static {v${invokeInstruction.registerC}, v${invokeInstruction.registerD}, v${invokeInstruction.registerE}}, " - + "$INTEGRATIONS_CLASS_DESCRIPTOR->stripQueryParameters(Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;)V" - ) - } - } - } ?: throw fingerprint.exception - } - + override fun execute(context: ResourceContext) { /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/fingerprints/ShareLinkFormatterFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/fingerprints/ShareLinkFormatterFingerprint.kt index f3dd4a53c..4b7688764 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/fingerprints/ShareLinkFormatterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/fingerprints/ShareLinkFormatterFingerprint.kt @@ -11,7 +11,7 @@ import com.android.tools.smali.dexlib2.iface.reference.FieldReference * This fingerprint is quite complex to be compatible with all versions from YouTube v18.25.40 to the latest version. * If you drop supporting the old version, please change the fingerprint to be more intuitive. */ -object ShareLinkFormatterFingerprint : MethodFingerprint( +internal object ShareLinkFormatterFingerprint : MethodFingerprint( opcodes = listOf( Opcode.IGET_OBJECT, Opcode.CHECK_CAST, diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/fingerprints/SystemShareLinkFormatterFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/fingerprints/SystemShareLinkFormatterFingerprint.kt index cb68c5964..63df46e82 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/fingerprints/SystemShareLinkFormatterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/tracking/fingerprints/SystemShareLinkFormatterFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint /** * Sharing panel of System */ -object SystemShareLinkFormatterFingerprint : MethodFingerprint( +internal object SystemShareLinkFormatterFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("L", "Ljava/util/Map;"), strings = listOf("YTShare_Logging_Share_Intent_Endpoint_Byte_Array") diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/translations/TranslationsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/translations/TranslationsPatch.kt index 740dab08f..f7e25dacb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/translations/TranslationsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/translations/TranslationsPatch.kt @@ -1,75 +1,47 @@ package app.revanced.patches.youtube.misc.translations import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.translations.AbstractTranslationsPatch +import app.revanced.patches.shared.translations.TranslationsUtils.copyXml +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object TranslationsPatch : BaseResourcePatch( name = "Translations", description = "Add Crowdin translations for YouTube.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object TranslationsPatch : AbstractTranslationsPatch( - "youtube", - arrayOf( - "ar", - "bg-rBG", - "bn", - "de-rDE", - "el-rGR", - "es-rES", - "fi-rFI", - "fr-rFR", - "hu-rHU", - "id-rID", - "in", - "it-rIT", - "ja-rJP", - "ko-rKR", - "pl-rPL", - "pt-rBR", - "ru-rRU", - "tr-rTR", - "uk-rUA", - "vi-rVN", - "zh-rCN", - "zh-rTW" - ) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE ) { override fun execute(context: ResourceContext) { - super.execute(context) + + context.copyXml( + "youtube", + arrayOf( + "ar", + "bg-rBG", + "bn", + "de-rDE", + "el-rGR", + "es-rES", + "fi-rFI", + "fr-rFR", + "hu-rHU", + "id-rID", + "in", + "it-rIT", + "ja-rJP", + "ko-rKR", + "pl-rPL", + "pt-rBR", + "ru-rRU", + "tr-rTR", + "uk-rUA", + "vi-rVN", + "zh-rCN", + "zh-rTW" + ) + ) SettingsPatch.updatePatchStatus("Translations") } diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/updatescreen/UpdateScreenPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/updatescreen/UpdateScreenPatch.kt index 4f679b799..1bfd7209e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/updatescreen/UpdateScreenPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/updatescreen/UpdateScreenPatch.kt @@ -2,52 +2,21 @@ package app.revanced.patches.youtube.misc.updatescreen import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.misc.updatescreen.fingerprints.AppBlockingCheckResultToStringFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.util.MethodUtil -@Patch( +@Suppress("unused") +object UpdateScreenPatch : BaseBytecodePatch( name = "Disable update screen", description = "Disable the \"Update your app\" screen that appears when using an outdated client.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object UpdateScreenPatch : BytecodePatch( - setOf(AppBlockingCheckResultToStringFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(AppBlockingCheckResultToStringFingerprint) ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = "$MISC_PATH/UpdateScreenPatch;" diff --git a/src/main/kotlin/app/revanced/patches/youtube/misc/updatescreen/fingerprints/AppBlockingCheckResultToStringFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/misc/updatescreen/fingerprints/AppBlockingCheckResultToStringFingerprint.kt index 376fac4f7..65bcff8f9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/misc/updatescreen/fingerprints/AppBlockingCheckResultToStringFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/misc/updatescreen/fingerprints/AppBlockingCheckResultToStringFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.misc.updatescreen.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object AppBlockingCheckResultToStringFingerprint : MethodFingerprint( +internal object AppBlockingCheckResultToStringFingerprint : MethodFingerprint( returnType = "Ljava/lang/String;", strings = listOf("AppBlockingCheckResult{intent=") ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/navigation/label/NavigationLabelPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/navigation/label/NavigationLabelPatch.kt index 3744f3d97..70a6d05a0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/navigation/label/NavigationLabelPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/navigation/label/NavigationLabelPatch.kt @@ -3,69 +3,33 @@ package app.revanced.patches.youtube.navigation.label import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.navigation.label.fingerprints.PivotBarSetTextFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.NAVIGATION +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.NAVIGATION_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction +import app.revanced.util.getTargetIndexWithMethodReferenceName +import app.revanced.util.patch.BaseBytecodePatch +import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -@Patch( +@Suppress("unused") +object NavigationLabelPatch : BaseBytecodePatch( name = "Hide navigation label", description = "Adds an option to hide navigation bar labels.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object NavigationLabelPatch : BytecodePatch( - setOf(PivotBarSetTextFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(PivotBarSetTextFingerprint) ) { override fun execute(context: BytecodeContext) { PivotBarSetTextFingerprint.result?.let { it.mutableMethod.apply { - val targetIndex = it.scanResult.patternScanResult!!.endIndex - 2 - val targetReference = - getInstruction(targetIndex).reference.toString() - val targetRegister = getInstruction(targetIndex).registerA - - if (targetReference != "Landroid/widget/TextView;") - throw PivotBarSetTextFingerprint.exception + val targetIndex = getTargetIndexWithMethodReferenceName("setText") + val targetRegister = getInstruction(targetIndex).registerC addInstruction( - targetIndex + 1, - "invoke-static {v$targetRegister}, $NAVIGATION->hideNavigationLabel(Landroid/widget/TextView;)V" + targetIndex, + "invoke-static {v$targetRegister}, $NAVIGATION_CLASS_DESCRIPTOR->hideNavigationLabel(Landroid/widget/TextView;)V" ) } } ?: throw PivotBarSetTextFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/navigation/label/fingerprints/PivotBarSetTextFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/navigation/label/fingerprints/PivotBarSetTextFingerprint.kt index 0f94cfc73..ebda48a82 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/navigation/label/fingerprints/PivotBarSetTextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/navigation/label/fingerprints/PivotBarSetTextFingerprint.kt @@ -5,17 +5,11 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object PivotBarSetTextFingerprint : MethodFingerprint( +internal object PivotBarSetTextFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, - parameters = listOf("L", "L", "L"), + parameters = listOf("Lcom/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar;", "Landroid/widget/TextView;", "Ljava/lang/CharSequence;"), opcodes = listOf( - Opcode.IPUT_OBJECT, - Opcode.INVOKE_DIRECT, - Opcode.INVOKE_VIRTUAL, - Opcode.IPUT_OBJECT, - Opcode.MOVE_OBJECT, - Opcode.CHECK_CAST, Opcode.INVOKE_VIRTUAL, Opcode.RETURN_VOID ), diff --git a/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/NavigationButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/NavigationButtonsPatch.kt index 735982c6d..9dfb8ed46 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/NavigationButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/NavigationButtonsPatch.kt @@ -4,15 +4,13 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.navigation.navigationbuttons.fingerprints.AutoMotiveFingerprint import app.revanced.patches.youtube.navigation.navigationbuttons.fingerprints.PivotBarButtonViewFingerprint import app.revanced.patches.youtube.navigation.navigationbuttons.fingerprints.PivotBarEnumFingerprint import app.revanced.patches.youtube.utils.fingerprints.PivotBarCreateButtonViewFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.NAVIGATION +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.NAVIGATION_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ImageOnlyTab import app.revanced.patches.youtube.utils.settings.SettingsPatch @@ -20,50 +18,21 @@ import app.revanced.util.exception import app.revanced.util.getStringInstructionIndex import app.revanced.util.getTargetIndex import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.Opcode.MOVE_RESULT_OBJECT import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object NavigationButtonsPatch : BaseBytecodePatch( name = "Hide navigation buttons", description = "Adds options to hide and change navigation buttons (such as the Shorts button).", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object NavigationButtonsPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( AutoMotiveFingerprint, PivotBarCreateButtonViewFingerprint ) @@ -124,7 +93,7 @@ object NavigationButtonsPatch : BytecodePatch( addInstructions( insertIndex, """ - invoke-static {v$register}, $NAVIGATION->switchCreateNotification(Z)Z + invoke-static {v$register}, $NAVIGATION_CLASS_DESCRIPTOR->switchCreateNotification(Z)Z move-result v$register """ ) @@ -148,17 +117,17 @@ object NavigationButtonsPatch : BytecodePatch( private const val REGISTER_TEMPLATE_REPLACEMENT: String = "REGISTER_INDEX" private const val ENUM_HOOK = - "sput-object v$REGISTER_TEMPLATE_REPLACEMENT, $NAVIGATION" + + "sput-object v$REGISTER_TEMPLATE_REPLACEMENT, $NAVIGATION_CLASS_DESCRIPTOR" + "->" + "lastPivotTab:Ljava/lang/Enum;" private const val BUTTON_HOOK = - "invoke-static { v$REGISTER_TEMPLATE_REPLACEMENT }, $NAVIGATION" + + "invoke-static { v$REGISTER_TEMPLATE_REPLACEMENT }, $NAVIGATION_CLASS_DESCRIPTOR" + "->" + "hideNavigationButton(Landroid/view/View;)V" private const val CREATE_BUTTON_HOOK = - "invoke-static { v$REGISTER_TEMPLATE_REPLACEMENT }, $NAVIGATION" + + "invoke-static { v$REGISTER_TEMPLATE_REPLACEMENT }, $NAVIGATION_CLASS_DESCRIPTOR" + "->" + "hideCreateButton(Landroid/view/View;)V" diff --git a/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/fingerprints/AutoMotiveFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/fingerprints/AutoMotiveFingerprint.kt index bfe608944..495cd81f1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/fingerprints/AutoMotiveFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/fingerprints/AutoMotiveFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.navigation.navigationbuttons.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object AutoMotiveFingerprint : MethodFingerprint( +internal object AutoMotiveFingerprint : MethodFingerprint( opcodes = listOf( Opcode.GOTO, Opcode.INVOKE_STATIC, diff --git a/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/fingerprints/PivotBarButtonViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/fingerprints/PivotBarButtonViewFingerprint.kt index 87f4e0a18..42fe2c704 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/fingerprints/PivotBarButtonViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/fingerprints/PivotBarButtonViewFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.navigation.navigationbuttons.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object PivotBarButtonViewFingerprint : MethodFingerprint( +internal object PivotBarButtonViewFingerprint : MethodFingerprint( opcodes = listOf( Opcode.INVOKE_VIRTUAL_RANGE, Opcode.MOVE_RESULT_OBJECT, // target reference diff --git a/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/fingerprints/PivotBarEnumFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/fingerprints/PivotBarEnumFingerprint.kt index 8c1fd1afc..ef11f90be 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/fingerprints/PivotBarEnumFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/navigation/navigationbuttons/fingerprints/PivotBarEnumFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.navigation.navigationbuttons.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object PivotBarEnumFingerprint : MethodFingerprint( +internal object PivotBarEnumFingerprint : MethodFingerprint( opcodes = listOf( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT_OBJECT, diff --git a/src/main/kotlin/app/revanced/patches/youtube/navigation/tabletnavbar/TabletNavigationBarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/navigation/tabletnavbar/TabletNavigationBarPatch.kt index 2accf6db2..889ce25c1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/navigation/tabletnavbar/TabletNavigationBarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/navigation/tabletnavbar/TabletNavigationBarPatch.kt @@ -4,53 +4,22 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.fingerprint.MethodFingerprintResult -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.navigation.tabletnavbar.fingerprints.PivotBarChangedFingerprint import app.revanced.patches.youtube.navigation.tabletnavbar.fingerprints.PivotBarStyleFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.NAVIGATION +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.NAVIGATION_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object TabletNavigationBarPatch : BaseBytecodePatch( name = "Enable tablet navigation bar", description = "Adds an option to enable the tablet navigation bar.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object TabletNavigationBarPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( PivotBarChangedFingerprint, PivotBarStyleFingerprint ) @@ -85,7 +54,7 @@ object TabletNavigationBarPatch : BytecodePatch( mutableMethod.addInstructions( targetIndex + 1, """ - invoke-static {v$register}, $NAVIGATION->enableTabletNavBar(Z)Z + invoke-static {v$register}, $NAVIGATION_CLASS_DESCRIPTOR->enableTabletNavBar(Z)Z move-result v$register """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/navigation/tabletnavbar/fingerprints/PivotBarChangedFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/navigation/tabletnavbar/fingerprints/PivotBarChangedFingerprint.kt index 03cca687f..726bb3d13 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/navigation/tabletnavbar/fingerprints/PivotBarChangedFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/navigation/tabletnavbar/fingerprints/PivotBarChangedFingerprint.kt @@ -3,11 +3,14 @@ package app.revanced.patches.youtube.navigation.tabletnavbar.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object PivotBarChangedFingerprint : MethodFingerprint( +internal object PivotBarChangedFingerprint : MethodFingerprint( returnType = "V", opcodes = listOf( Opcode.INVOKE_STATIC, Opcode.MOVE_RESULT ), - customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/PivotBar;") && methodDef.name == "onConfigurationChanged" } + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("/PivotBar;") + && methodDef.name == "onConfigurationChanged" + } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/navigation/tabletnavbar/fingerprints/PivotBarStyleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/navigation/tabletnavbar/fingerprints/PivotBarStyleFingerprint.kt index 150d39b62..d58faf9c9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/navigation/tabletnavbar/fingerprints/PivotBarStyleFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/navigation/tabletnavbar/fingerprints/PivotBarStyleFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.navigation.tabletnavbar.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object PivotBarStyleFingerprint : MethodFingerprint( +internal object PivotBarStyleFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("L"), opcodes = listOf( @@ -11,5 +11,7 @@ object PivotBarStyleFingerprint : MethodFingerprint( Opcode.MOVE_RESULT, Opcode.XOR_INT_2ADDR ), - customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("/PivotBar;") } + customFingerprint = { methodDef, _ -> + methodDef.definingClass.endsWith("/PivotBar;") + } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/alwaysrepeat/AlwaysRepeatPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/alwaysrepeat/AlwaysRepeatPatch.kt index 0adaadf77..23cc670c6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/alwaysrepeat/AlwaysRepeatPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/alwaysrepeat/AlwaysRepeatPatch.kt @@ -4,10 +4,10 @@ import app.revanced.patcher.data.BytecodeContext 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.youtube.overlaybutton.alwaysrepeat.fingerprints.AutoNavInformerFingerprint import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH import app.revanced.util.exception +import app.revanced.util.getWalkerMethod import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction object AlwaysRepeatPatch : BytecodePatch( @@ -16,19 +16,15 @@ object AlwaysRepeatPatch : BytecodePatch( override fun execute(context: BytecodeContext) { AutoNavInformerFingerprint.result?.let { - with( - context - .toMethodWalker(it.method) - .nextMethod(it.scanResult.patternScanResult!!.startIndex, true) - .getMethod() as MutableMethod - ) { - val index = implementation!!.instructions.size - 1 - 1 + val walkerMethod = it.getWalkerMethod(context, it.scanResult.patternScanResult!!.startIndex) + walkerMethod.apply { + val index = implementation!!.instructions.size - 2 val register = getInstruction(index).registerA addInstructions( index + 1, """ invoke-static {v$register}, $UTILS_PATH/AlwaysRepeatPatch;->enableAlwaysRepeat(Z)Z - move-result v0 + move-result v$register """ ) } diff --git a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/alwaysrepeat/fingerprints/AutoNavInformerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/alwaysrepeat/fingerprints/AutoNavInformerFingerprint.kt index 541d480f1..c1a629f2c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/alwaysrepeat/fingerprints/AutoNavInformerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/alwaysrepeat/fingerprints/AutoNavInformerFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object AutoNavInformerFingerprint : LiteralValueFingerprint( +internal object AutoNavInformerFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/download/hook/DownloadButtonHookPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/download/hook/DownloadButtonHookPatch.kt index c6159eb85..a8a935cc9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/download/hook/DownloadButtonHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/download/hook/DownloadButtonHookPatch.kt @@ -12,6 +12,8 @@ import app.revanced.util.exception object DownloadButtonHookPatch : BytecodePatch( setOf(DownloadActionsFingerprint) ) { + private const val INTEGRATIONS_CLASS_DESCRIPTOR = + "$UTILS_PATH/HookDownloadButtonPatch;" override fun execute(context: BytecodeContext) { DownloadActionsFingerprint.result?.let { it.mutableMethod.apply { @@ -19,10 +21,10 @@ object DownloadButtonHookPatch : BytecodePatch( addInstructionsWithLabels( targetIndex, """ - invoke-static {}, $UTILS_PATH/HookDownloadButtonPatch;->shouldHookDownloadButton()Z + invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->shouldHookDownloadButton()Z move-result v0 if-eqz v0, :default - invoke-static {}, $UTILS_PATH/HookDownloadButtonPatch;->startDownloadActivity()V + invoke-static {}, $INTEGRATIONS_CLASS_DESCRIPTOR->startDownloadActivity()V return-void """, ExternalLabel("default", getInstruction(targetIndex)) ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/download/hook/fingerprints/DownloadActionsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/download/hook/fingerprints/DownloadActionsFingerprint.kt index 4d009e212..055b84f00 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/download/hook/fingerprints/DownloadActionsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/download/hook/fingerprints/DownloadActionsFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object DownloadActionsFingerprint : MethodFingerprint( +internal object DownloadActionsFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, parameters = listOf("L", "L", "Z"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/download/pip/fingerprints/PiPPlaybackFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/download/pip/fingerprints/PiPPlaybackFingerprint.kt index 2eb6f8f9b..b376fa6ed 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/download/pip/fingerprints/PiPPlaybackFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/download/pip/fingerprints/PiPPlaybackFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.overlaybutton.download.pip.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object PiPPlaybackFingerprint : MethodFingerprint( +internal object PiPPlaybackFingerprint : MethodFingerprint( returnType = "Z", parameters = listOf("Lcom/google/android/libraries/youtube/innertube/model/player/PlayerResponseModel;"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/fullscreen/fingerprints/FullScreenButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/fullscreen/fingerprints/FullScreenButtonFingerprint.kt index 75a4fbf97..ad9382780 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/fullscreen/fingerprints/FullScreenButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/fullscreen/fingerprints/FullScreenButtonFingerprint.kt @@ -7,7 +7,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.FullS import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags -object FullScreenButtonFingerprint : MethodFingerprint( +internal object FullScreenButtonFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/View;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/general/OverlayButtonsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/general/OverlayButtonsPatch.kt index c1e21d41b..a63a783b9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/general/OverlayButtonsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/overlaybutton/general/OverlayButtonsPatch.kt @@ -1,14 +1,13 @@ package app.revanced.patches.youtube.overlaybutton.general import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.booleanPatchOption import app.revanced.patches.youtube.overlaybutton.alwaysrepeat.AlwaysRepeatPatch import app.revanced.patches.youtube.overlaybutton.download.hook.DownloadButtonHookPatch import app.revanced.patches.youtube.overlaybutton.download.pip.DisablePiPPatch import app.revanced.patches.youtube.overlaybutton.fullscreen.FullscreenButtonPatch +import app.revanced.patches.youtube.utils.fix.fullscreen.FullscreenButtonViewStubPatch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.OVERLAY_BUTTONS_PATH import app.revanced.patches.youtube.utils.overridespeed.OverrideSpeedHookPatch import app.revanced.patches.youtube.utils.playercontrols.PlayerControlsPatch @@ -19,54 +18,27 @@ import app.revanced.util.ResourceGroup import app.revanced.util.copyResources import app.revanced.util.copyXmlNode import app.revanced.util.doRecursively +import app.revanced.util.patch.BaseResourcePatch import org.w3c.dom.Element -@Patch( +@Suppress("DEPRECATION", "unused") +object OverlayButtonsPatch : BaseResourcePatch( name = "Overlay buttons", description = "Adds an option to display overlay buttons in the video player.", - dependencies = [ + dependencies = setOf( AlwaysRepeatPatch::class, DisablePiPPatch::class, DownloadButtonHookPatch::class, FullscreenButtonPatch::class, + FullscreenButtonViewStubPatch::class, OverrideSpeedHookPatch::class, PlayerControlsPatch::class, SettingsPatch::class, SharedResourceIdPatch::class, VideoIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object OverlayButtonsPatch : ResourcePatch() { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { private val OutlineIcon by booleanPatchOption( key = "OutlineIcon", default = false, @@ -88,14 +60,14 @@ object OverlayButtonsPatch : ResourcePatch() { * Inject hook */ arrayOf( - "AlwaysRepeat", - "CopyVideoUrl", - "CopyVideoUrlTimestamp", - "ExternalDownload", - "SpeedDialog" - ).forEach { patch -> - PlayerControlsPatch.initializeControl("$OVERLAY_BUTTONS_PATH/$patch;") - PlayerControlsPatch.injectVisibility("$OVERLAY_BUTTONS_PATH/$patch;") + "AlwaysRepeat;", + "CopyVideoUrl;", + "CopyVideoUrlTimestamp;", + "ExternalDownload;", + "SpeedDialog;" + ).forEach { className -> + PlayerControlsPatch.initializeControl("$OVERLAY_BUTTONS_PATH/$className") + PlayerControlsPatch.injectVisibility("$OVERLAY_BUTTONS_PATH/$className") } /** @@ -174,6 +146,11 @@ object OverlayButtonsPatch : ResourcePatch() { "android.support.constraint.ConstraintLayout" ) + val fullscreenButtonId = if (SettingsPatch.upward1909) + "youtube_controls_fullscreen_button_stub" + else + "fullscreen_button" + val bottomPadding = if (WiderBottomPadding == true) "31.0dip" else "22.0dip" context.xmlEditor["res/layout/youtube_controls_bottom_ui_container.xml"].use { editor -> editor.file.doRecursively loop@{ @@ -186,15 +163,15 @@ object OverlayButtonsPatch : ResourcePatch() { } } - // Adjust Fullscreen Button size and padding it.getAttributeNode("android:id")?.let { attribute -> + // Adjust Fullscreen Button size and padding arrayOf( "speed_dialog_button", "copy_video_url_button", "copy_video_url_timestamp_button", "always_repeat_button", "external_download_button", - "fullscreen_button" + fullscreenButtonId ).forEach { targetId -> if (attribute.textContent.endsWith(targetId)) { arrayOf( @@ -203,7 +180,7 @@ object OverlayButtonsPatch : ResourcePatch() { "48.0dip" to arrayOf("layout_height", "layout_width") ).forEach { (replace, attributes) -> attributes.forEach { name -> - it.getAttributeNode("android:$name").textContent = replace + it.getAttributeNode("android:$name")?.textContent = replace } } } @@ -226,6 +203,37 @@ object OverlayButtonsPatch : ResourcePatch() { } } + arrayOf( + "youtube_controls_cf_fullscreen_button.xml", + "youtube_controls_fullscreen_button.xml" + ).forEach { xmlFile -> + val targetXml = context["res"].resolve("layout").resolve(xmlFile) + if (targetXml.exists()) { + context.xmlEditor["res/layout/$xmlFile"].use { editor -> + editor.file.doRecursively loop@{ + if (it !is Element) return@loop + + it.getAttributeNode("android:id")?.let { attribute -> + // Adjust Fullscreen Button size and padding + if (attribute.textContent.endsWith("fullscreen_button")) { + arrayOf( + "0.0dip" to arrayOf("paddingLeft", "paddingRight"), + bottomPadding to arrayOf("paddingBottom"), + "48.0dip" to arrayOf("layout_height", "layout_width") + ).forEach { (replace, attributes) -> + attributes.forEach { name -> + it.getAttributeNode("android:$name")?.textContent = replace + } + } + } + } + } + } + } + + } + + /** * Add settings */ diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/autoplaybutton/HideAutoplayButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/autoplaybutton/AutoplayButtonPatch.kt similarity index 66% rename from src/main/kotlin/app/revanced/patches/youtube/player/autoplaybutton/HideAutoplayButtonPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/player/autoplaybutton/AutoplayButtonPatch.kt index 2c80fa7c2..590cc0a73 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/autoplaybutton/HideAutoplayButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/autoplaybutton/AutoplayButtonPatch.kt @@ -3,12 +3,10 @@ package app.revanced.patches.youtube.player.autoplaybutton import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.utils.fingerprints.LayoutConstructorFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.AutoNavPreviewStub import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.VideoZoomIndicatorLayout @@ -16,48 +14,19 @@ import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getStringInstructionIndex import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object AutoplayButtonPatch : BaseBytecodePatch( name = "Hide autoplay button", description = "Adds an option to hide the autoplay button in the video player.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, - SharedResourceIdPatch::class, - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideAutoplayButtonPatch : BytecodePatch( - setOf(LayoutConstructorFingerprint) + SharedResourceIdPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(LayoutConstructorFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -70,7 +39,7 @@ object HideAutoplayButtonPatch : BytecodePatch( addInstructionsWithLabels( insertIndex, """ - invoke-static {}, $PLAYER->hideAutoPlayButton()Z + invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->hideAutoPlayButton()Z move-result v$dummyRegister if-nez v$dummyRegister, :hidden """, ExternalLabel("hidden", getInstruction(jumpIndex)) diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/HideCaptionsButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/CaptionsButtonPatch.kt similarity index 69% rename from src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/HideCaptionsButtonPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/CaptionsButtonPatch.kt index 0c9bfad83..8c8cf7452 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/HideCaptionsButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/CaptionsButtonPatch.kt @@ -4,64 +4,36 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.player.captionsbutton.fingerprints.LithoSubtitleButtonConfigFingerprint import app.revanced.patches.youtube.player.captionsbutton.fingerprints.YouTubeControlsOverlaySubtitleButtonFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object CaptionsButtonPatch : BaseBytecodePatch( name = "Hide captions button", description = "Adds an option to hide the captions button in the video player.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class, - SharedResourceIdPatch::class, - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideCaptionsButtonBytecodePatch : BytecodePatch( - setOf( + SharedResourceIdPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( LithoSubtitleButtonConfigFingerprint, YouTubeControlsOverlaySubtitleButtonFingerprint ) ) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/CaptionsFilter;" + override fun execute(context: BytecodeContext) { /** @@ -77,7 +49,7 @@ object HideCaptionsButtonBytecodePatch : BytecodePatch( addInstructions( insertIndex, """ - invoke-static {v$insertRegister}, $PLAYER->hideCaptionsButton(Z)Z + invoke-static {v$insertRegister}, $PLAYER_CLASS_DESCRIPTOR->hideCaptionsButton(Z)Z move-result v$insertRegister """ ) @@ -91,12 +63,12 @@ object HideCaptionsButtonBytecodePatch : BytecodePatch( addInstruction( insertIndex, - "invoke-static {v$insertRegister}, $PLAYER->hideCaptionsButton(Landroid/view/View;)V" + "invoke-static {v$insertRegister}, $PLAYER_CLASS_DESCRIPTOR->hideCaptionsButton(Landroid/view/View;)V" ) } } ?: throw YouTubeControlsOverlaySubtitleButtonFingerprint.exception - LithoFilterPatch.addFilter("$COMPONENTS_PATH/CaptionsFilter;") + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/fingerprints/LithoSubtitleButtonConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/fingerprints/LithoSubtitleButtonConfigFingerprint.kt index 51cd100a1..c6a20c2a3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/fingerprints/LithoSubtitleButtonConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/fingerprints/LithoSubtitleButtonConfigFingerprint.kt @@ -8,7 +8,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint * When this value is TRUE, litho subtitle button is used. * In this case, the empty area remains, so set this value to FALSE. */ -object LithoSubtitleButtonConfigFingerprint : LiteralValueFingerprint( +internal object LithoSubtitleButtonConfigFingerprint : LiteralValueFingerprint( returnType = "Z", literalSupplier = { 45421555 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/fingerprints/YouTubeControlsOverlaySubtitleButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/fingerprints/YouTubeControlsOverlaySubtitleButtonFingerprint.kt index cf2f5a0a4..e1782db2f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/fingerprints/YouTubeControlsOverlaySubtitleButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/captionsbutton/fingerprints/YouTubeControlsOverlaySubtitleButtonFingerprint.kt @@ -11,7 +11,7 @@ import com.android.tools.smali.dexlib2.AccessFlags * * This fingerprint is compatible from YouTube v18.25.40 to YouTube v18.45.43 */ -object YouTubeControlsOverlaySubtitleButtonFingerprint : LiteralValueFingerprint( +internal object YouTubeControlsOverlaySubtitleButtonFingerprint : LiteralValueFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, literalSupplier = { YoutubeControlsOverlaySubtitleButton } diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/HideCollapseButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/CollapseButtonPatch.kt similarity index 73% rename from src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/HideCollapseButtonPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/CollapseButtonPatch.kt index deabc3e27..c41962efd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/HideCollapseButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/CollapseButtonPatch.kt @@ -3,59 +3,28 @@ package app.revanced.patches.youtube.player.collapsebutton import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.player.collapsebutton.fingerprints.LiveChatFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.findMutableMethodOf +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction35c -@Patch( +@Suppress("unused") +object CollapseButtonPatch : BaseBytecodePatch( name = "Hide collapse button", description = "Adds an option to hide the collapse button in the video player.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideCollapseButtonPatch : BytecodePatch( - setOf(LiveChatFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(LiveChatFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -86,7 +55,7 @@ object HideCollapseButtonPatch : BytecodePatch( addInstructions( index, """ - invoke-static {v$firstRegister, v$secondRegister}, ${Constants.PLAYER}->hidePlayerButton(Landroid/view/View;I)I + invoke-static {v$firstRegister, v$secondRegister}, $PLAYER_CLASS_DESCRIPTOR->hidePlayerButton(Landroid/view/View;I)I move-result v$secondRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/fingerprints/LiveChatFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/fingerprints/LiveChatFingerprint.kt index b49320af9..ccd641ca9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/fingerprints/LiveChatFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/collapsebutton/fingerprints/LiveChatFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.LiveC import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object LiveChatFingerprint : LiteralValueFingerprint( +internal object LiveChatFingerprint : LiteralValueFingerprint( opcodes = listOf(Opcode.NEW_INSTANCE), literalSupplier = { LiveChatButton } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/HideEndScreenCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/EndScreenCardsPatch.kt similarity index 59% rename from src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/HideEndScreenCardsPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/EndScreenCardsPatch.kt index b0d96339c..0a8851256 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/HideEndScreenCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/EndScreenCardsPatch.kt @@ -3,85 +3,51 @@ package app.revanced.patches.youtube.player.endscreencards import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.fingerprint.MethodFingerprint -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.player.endscreencards.fingerprints.LayoutCircleFingerprint import app.revanced.patches.youtube.player.endscreencards.fingerprints.LayoutIconFingerprint import app.revanced.patches.youtube.player.endscreencards.fingerprints.LayoutVideoFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object EndScreenCardsPatch : BaseBytecodePatch( name = "Hide end screen cards", description = "Adds an option to hide suggested video cards at the end of the video in the video player.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, - SharedResourceIdPatch::class, - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideEndScreenCardsPatch : BytecodePatch( - setOf( + SharedResourceIdPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( LayoutCircleFingerprint, LayoutIconFingerprint, - LayoutVideoFingerprint, + LayoutVideoFingerprint ) ) { override fun execute(context: BytecodeContext) { - fun MethodFingerprint.injectHideCall() { - result?.let { + listOf( + LayoutCircleFingerprint, + LayoutIconFingerprint, + LayoutVideoFingerprint + ).forEach{ fingerprint -> + fingerprint.result?.let { it.mutableMethod.apply { val insertIndex = it.scanResult.patternScanResult!!.endIndex val viewRegister = getInstruction(insertIndex).registerA addInstruction( insertIndex + 1, - "invoke-static { v$viewRegister }, $PLAYER->hideEndScreenCards(Landroid/view/View;)V" + "invoke-static { v$viewRegister }, $PLAYER_CLASS_DESCRIPTOR->hideEndScreenCards(Landroid/view/View;)V" ) } - } ?: throw exception + } ?: throw fingerprint.exception } - listOf( - LayoutCircleFingerprint, - LayoutIconFingerprint, - LayoutVideoFingerprint - ).forEach(MethodFingerprint::injectHideCall) - /** * Add settings */ diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/fingerprints/LayoutCircleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/fingerprints/LayoutCircleFingerprint.kt index f02f2f5e0..4902a02ef 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/fingerprints/LayoutCircleFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/fingerprints/LayoutCircleFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.EndSc import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object LayoutCircleFingerprint : LiteralValueFingerprint( +internal object LayoutCircleFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", opcodes = listOf( Opcode.CONST, diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/fingerprints/LayoutIconFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/fingerprints/LayoutIconFingerprint.kt index 236e76b22..e70f82564 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/fingerprints/LayoutIconFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/fingerprints/LayoutIconFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.EndSc import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object LayoutIconFingerprint : LiteralValueFingerprint( +internal object LayoutIconFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", opcodes = listOf( Opcode.INVOKE_VIRTUAL, diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/fingerprints/LayoutVideoFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/fingerprints/LayoutVideoFingerprint.kt index 0be600c9a..cdc1186ba 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/fingerprints/LayoutVideoFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/endscreencards/fingerprints/LayoutVideoFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.EndSc import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object LayoutVideoFingerprint : LiteralValueFingerprint( +internal object LayoutVideoFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", opcodes = listOf( Opcode.CONST, diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/HideFilmstripOverlayPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/FilmstripOverlayPatch.kt similarity index 79% rename from src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/HideFilmstripOverlayPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/FilmstripOverlayPatch.kt index cc809d940..4da233c93 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/HideFilmstripOverlayPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/FilmstripOverlayPatch.kt @@ -4,10 +4,7 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction -import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.player.filmstripoverlay.fingerprints.FilmStripOverlayConfigFingerprint @@ -15,58 +12,30 @@ import app.revanced.patches.youtube.player.filmstripoverlay.fingerprints.FilmStr import app.revanced.patches.youtube.player.filmstripoverlay.fingerprints.FilmStripOverlayParentFingerprint import app.revanced.patches.youtube.player.filmstripoverlay.fingerprints.FilmStripOverlayPreviewFingerprint import app.revanced.patches.youtube.player.filmstripoverlay.fingerprints.FineScrubbingOverlayFingerprint -import app.revanced.patches.youtube.utils.controlsoverlay.DisableControlsOverlayConfigPatch -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.controlsoverlay.ControlsOverlayConfigPatch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch 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.instruction.TwoRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction -@Patch( +@Suppress("unused") +object FilmstripOverlayPatch : BaseBytecodePatch( name = "Hide filmstrip overlay", description = "Adds an option to hide filmstrip overlay in the video player.", - dependencies = [ - DisableControlsOverlayConfigPatch::class, + dependencies = setOf( + ControlsOverlayConfigPatch::class, SettingsPatch::class, - SharedResourceIdPatch::class, - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideFilmstripOverlayPatch : BytecodePatch( - setOf( + SharedResourceIdPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( FilmStripOverlayParentFingerprint, FineScrubbingOverlayFingerprint ) @@ -79,12 +48,8 @@ object HideFilmstripOverlayPatch : BytecodePatch( FilmStripOverlayInteractionFingerprint, FilmStripOverlayPreviewFingerprint ).forEach { fingerprint -> - fingerprint.also { - it.resolve( - context, - classDef - ) - }.result?.mutableMethod?.injectHook() + fingerprint.resolve(context, classDef) + fingerprint.result?.mutableMethod?.injectHook() ?: throw fingerprint.exception } } ?: throw FilmStripOverlayParentFingerprint.exception @@ -106,7 +71,7 @@ object HideFilmstripOverlayPatch : BytecodePatch( addInstructionsWithLabels( insertIndex + 1, literalComponent + """ - invoke-static {}, $PLAYER->hideFilmstripOverlay()Z + invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->hideFilmstripOverlay()Z move-result v${replaceInstruction.registerA} if-nez v${replaceInstruction.registerA}, :hidden iget-object v${replaceInstruction.registerA}, v${replaceInstruction.registerB}, $replaceReference @@ -186,7 +151,7 @@ object HideFilmstripOverlayPatch : BytecodePatch( private fun MutableMethod.injectHook() { addInstructionsWithLabels( 0, """ - invoke-static {}, $PLAYER->hideFilmstripOverlay()Z + invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->hideFilmstripOverlay()Z move-result v0 if-eqz v0, :shown const/4 v0, 0x0 diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayConfigFingerprint.kt index e4f58fb62..c781b2b9a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayConfigFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.player.filmstripoverlay.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint -object FilmStripOverlayConfigFingerprint : LiteralValueFingerprint( +internal object FilmStripOverlayConfigFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), literalSupplier = { 45381958 } diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayInteractionFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayInteractionFingerprint.kt index 7b4531a4f..883d0f280 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayInteractionFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayInteractionFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object FilmStripOverlayInteractionFingerprint : MethodFingerprint( +internal object FilmStripOverlayInteractionFingerprint : MethodFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L") diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayParentFingerprint.kt index e1d605208..2f2a3abd5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayParentFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Scrub import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object FilmStripOverlayParentFingerprint : LiteralValueFingerprint( +internal object FilmStripOverlayParentFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, literalSupplier = { Scrubbing } diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayPreviewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayPreviewFingerprint.kt index 306a4ca95..acece8896 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayPreviewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FilmStripOverlayPreviewFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.player.filmstripoverlay.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object FilmStripOverlayPreviewFingerprint : MethodFingerprint( +internal object FilmStripOverlayPreviewFingerprint : MethodFingerprint( returnType = "Z", parameters = listOf("F"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FineScrubbingOverlayFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FineScrubbingOverlayFingerprint.kt index 06fe6b050..1891ec8ce 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FineScrubbingOverlayFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/filmstripoverlay/fingerprints/FineScrubbingOverlayFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object FineScrubbingOverlayFingerprint : LiteralValueFingerprint( +internal object FineScrubbingOverlayFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/HapticFeedBackPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/HapticFeedBackPatch.kt index bcf38edbe..1034a5616 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/HapticFeedBackPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/HapticFeedBackPatch.kt @@ -4,59 +4,28 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.fingerprint.MethodFingerprint -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.player.hapticfeedback.fingerprints.MarkerHapticsFingerprint import app.revanced.patches.youtube.player.hapticfeedback.fingerprints.ScrubbingHapticsFingerprint import app.revanced.patches.youtube.player.hapticfeedback.fingerprints.SeekHapticsFingerprint import app.revanced.patches.youtube.player.hapticfeedback.fingerprints.SeekUndoHapticsFingerprint import app.revanced.patches.youtube.player.hapticfeedback.fingerprints.ZoomHapticsFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.getTargetIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object HapticFeedBackPatch : BaseBytecodePatch( name = "Disable haptic feedback", description = "Adds an option to disable haptic feedback when swiping the video player.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HapticFeedBackPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( MarkerHapticsFingerprint, SeekHapticsFingerprint, SeekUndoHapticsFingerprint, @@ -72,7 +41,9 @@ object HapticFeedBackPatch : BytecodePatch( ScrubbingHapticsFingerprint to "disableScrubbingVibrate", MarkerHapticsFingerprint to "disableChapterVibrate", ZoomHapticsFingerprint to "disableZoomVibrate" - ).map { (fingerprint, name) -> fingerprint.injectHook(name) } + ).map { (fingerprint, methodName) -> + fingerprint.injectHook(methodName) + } /** * Add settings @@ -94,31 +65,21 @@ object HapticFeedBackPatch : BytecodePatch( var index = 0 var register = 0 - if (this.name == "run") { - index = implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.SGET - } + if (name == "run") { + index = getTargetIndex(Opcode.SGET) register = getInstruction(index).registerA } - injectHook(index, register, methodName) + addInstructionsWithLabels( + index, """ + invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->$methodName()Z + move-result v$register + if-eqz v$register, :vibrate + return-void + """, ExternalLabel("vibrate", getInstruction(index)) + ) } } ?: throw exception } - - private fun MutableMethod.injectHook( - index: Int, - register: Int, - name: String - ) { - addInstructionsWithLabels( - index, """ - invoke-static {}, $PLAYER->$name()Z - move-result v$register - if-eqz v$register, :vibrate - return-void - """, ExternalLabel("vibrate", getInstruction(index)) - ) - } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/MarkerHapticsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/MarkerHapticsFingerprint.kt index bb907f5fb..b60b11e45 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/MarkerHapticsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/MarkerHapticsFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.player.hapticfeedback.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object MarkerHapticsFingerprint : MethodFingerprint( +internal object MarkerHapticsFingerprint : MethodFingerprint( returnType = "V", strings = listOf("Failed to execute markers haptics vibrate.") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/ScrubbingHapticsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/ScrubbingHapticsFingerprint.kt index 914cdb54b..bc4d5740e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/ScrubbingHapticsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/ScrubbingHapticsFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.player.hapticfeedback.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object ScrubbingHapticsFingerprint : MethodFingerprint( +internal object ScrubbingHapticsFingerprint : MethodFingerprint( returnType = "V", strings = listOf("Failed to haptics vibrate for fine scrubbing.") ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/SeekHapticsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/SeekHapticsFingerprint.kt index 4a33d9457..bd0582639 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/SeekHapticsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/SeekHapticsFingerprint.kt @@ -3,13 +3,9 @@ package app.revanced.patches.youtube.player.hapticfeedback.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object SeekHapticsFingerprint : MethodFingerprint( +internal object SeekHapticsFingerprint : MethodFingerprint( returnType = "V", - opcodes = listOf( - Opcode.SGET, - Opcode.CONST_16, - Opcode.IF_LE - ), + opcodes = listOf(Opcode.SGET), strings = listOf("Failed to easy seek haptics vibrate."), customFingerprint = { methodDef, _ -> methodDef.name == "run" } ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/SeekUndoHapticsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/SeekUndoHapticsFingerprint.kt index da7534e63..74ec3bad8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/SeekUndoHapticsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/SeekUndoHapticsFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.player.hapticfeedback.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object SeekUndoHapticsFingerprint : MethodFingerprint( +internal object SeekUndoHapticsFingerprint : MethodFingerprint( returnType = "V", strings = listOf("Failed to execute seek undo haptics vibrate.") ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/ZoomHapticsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/ZoomHapticsFingerprint.kt index 8370dd79e..7e5b26187 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/ZoomHapticsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/hapticfeedback/fingerprints/ZoomHapticsFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.player.hapticfeedback.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object ZoomHapticsFingerprint : MethodFingerprint( +internal object ZoomHapticsFingerprint : MethodFingerprint( returnType = "V", strings = listOf("Failed to haptics vibrate for video zoom") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/infocards/HideInfoCardsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/infocards/InfoCardsPatch.kt similarity index 62% rename from src/main/kotlin/app/revanced/patches/youtube/player/infocards/HideInfoCardsPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/player/infocards/InfoCardsPatch.kt index 9e570eb02..fc0a46dea 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/infocards/HideInfoCardsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/infocards/InfoCardsPatch.kt @@ -3,58 +3,30 @@ package app.revanced.patches.youtube.player.infocards import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.player.infocards.fingerprints.InfoCardsIncognitoFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object InfoCardsPatch : BaseBytecodePatch( name = "Hide info cards", description = "Adds an option to hide info-cards in the video player.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideInfoCardsPatch : BytecodePatch( - setOf(InfoCardsIncognitoFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(InfoCardsIncognitoFingerprint) ) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/InfoCardsFilter;" + override fun execute(context: BytecodeContext) { InfoCardsIncognitoFingerprint.result?.let { it.mutableMethod.apply { @@ -64,14 +36,14 @@ object HideInfoCardsPatch : BytecodePatch( addInstructions( targetIndex + 1, """ - invoke-static {v$targetRegister}, $PLAYER->hideInfoCard(Z)Z + invoke-static {v$targetRegister}, $PLAYER_CLASS_DESCRIPTOR->hideInfoCard(Z)Z move-result v$targetRegister """ ) } } ?: throw InfoCardsIncognitoFingerprint.exception - LithoFilterPatch.addFilter("$COMPONENTS_PATH/InfoCardsFilter;") + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/infocards/fingerprints/InfoCardsIncognitoFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/infocards/fingerprints/InfoCardsIncognitoFingerprint.kt index f811bf2db..b1d35a8e4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/infocards/fingerprints/InfoCardsIncognitoFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/infocards/fingerprints/InfoCardsIncognitoFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object InfoCardsIncognitoFingerprint : MethodFingerprint( +internal object InfoCardsIncognitoFingerprint : MethodFingerprint( returnType = "Ljava/lang/Boolean;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "J"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/HideMusicButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/MusicButtonPatch.kt similarity index 63% rename from src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/HideMusicButtonPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/MusicButtonPatch.kt index 198f0fa73..16045fe8b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/HideMusicButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/MusicButtonPatch.kt @@ -3,57 +3,26 @@ package app.revanced.patches.youtube.player.musicbutton import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.player.musicbutton.fingerprints.MusicAppDeeplinkButtonFingerprint import app.revanced.patches.youtube.player.musicbutton.fingerprints.MusicAppDeeplinkButtonParentFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object MusicButtonPatch : BaseBytecodePatch( name = "Hide music button", description = "Adds an option to hide the YouTube Music button in the video player.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, - SharedResourceIdPatch::class, - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideMusicButtonPatch : BytecodePatch( - setOf(MusicAppDeeplinkButtonParentFingerprint) + SharedResourceIdPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(MusicAppDeeplinkButtonParentFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -66,7 +35,7 @@ object HideMusicButtonPatch : BytecodePatch( addInstructionsWithLabels( 0, """ - invoke-static {}, $PLAYER->hideMusicButton()Z + invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->hideMusicButton()Z move-result v0 if-nez v0, :hidden """, diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/fingerprints/MusicAppDeeplinkButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/fingerprints/MusicAppDeeplinkButtonFingerprint.kt index a1c7dafdf..661d98654 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/fingerprints/MusicAppDeeplinkButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/fingerprints/MusicAppDeeplinkButtonFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object MusicAppDeeplinkButtonFingerprint : MethodFingerprint( +internal object MusicAppDeeplinkButtonFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Z", "Z") diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/fingerprints/MusicAppDeeplinkButtonParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/fingerprints/MusicAppDeeplinkButtonParentFingerprint.kt index fac5453e7..ced9a4d3f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/fingerprints/MusicAppDeeplinkButtonParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/musicbutton/fingerprints/MusicAppDeeplinkButtonParentFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.player.musicbutton.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.MusicAppDeeplinkButtonView import app.revanced.util.fingerprint.LiteralValueFingerprint -object MusicAppDeeplinkButtonParentFingerprint : LiteralValueFingerprint( +internal object MusicAppDeeplinkButtonParentFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { MusicAppDeeplinkButtonView } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/playerbuttonbg/HidePlayerButtonBackgroundPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/playerbuttonbg/HidePlayerButtonBackgroundPatch.kt deleted file mode 100644 index b9c995990..000000000 --- a/src/main/kotlin/app/revanced/patches/youtube/player/playerbuttonbg/HidePlayerButtonBackgroundPatch.kt +++ /dev/null @@ -1,65 +0,0 @@ -package app.revanced.patches.youtube.player.playerbuttonbg - -import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.doRecursively -import org.w3c.dom.Element - -@Patch( - name = "Hide player button background", - description = "Hides the dark background surrounding the video player controls.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], - use = false -) -@Suppress("unused") -object HidePlayerButtonBackgroundPatch : ResourcePatch() { - override fun execute(context: ResourceContext) { - - context.xmlEditor["res/drawable/player_button_circle_background.xml"].use { editor -> - editor.file.doRecursively { node -> - arrayOf("color").forEach replacement@{ replacement -> - if (node !is Element) return@replacement - - node.getAttributeNode("android:$replacement")?.let { attribute -> - attribute.textContent = "@android:color/transparent" - } - } - } - } - - SettingsPatch.updatePatchStatus("Hide player button background") - - } -} diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/playerbuttonbg/PlayerButtonBackgroundPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/playerbuttonbg/PlayerButtonBackgroundPatch.kt new file mode 100644 index 000000000..6eb3f5d14 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/player/playerbuttonbg/PlayerButtonBackgroundPatch.kt @@ -0,0 +1,35 @@ +package app.revanced.patches.youtube.player.playerbuttonbg + +import app.revanced.patcher.data.ResourceContext +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.doRecursively +import app.revanced.util.patch.BaseResourcePatch +import org.w3c.dom.Element + +@Suppress("DEPRECATION", "unused") +object PlayerButtonBackgroundPatch : BaseResourcePatch( + name = "Hide player button background", + description = "Hides the dark background surrounding the video player controls.", + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + use = false +) { + override fun execute(context: ResourceContext) { + + context.xmlEditor["res/drawable/player_button_circle_background.xml"].use { editor -> + editor.file.doRecursively { node -> + arrayOf("color").forEach replacement@{ replacement -> + if (node !is Element) return@replacement + + node.getAttributeNode("android:$replacement")?.let { attribute -> + attribute.textContent = "@android:color/transparent" + } + } + } + } + + SettingsPatch.updatePatchStatus("Hide player button background") + + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/playeroverlay/CustomPlayerOverlayOpacityPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/playeroverlay/CustomPlayerOverlayOpacityPatch.kt index 13b0c7d04..34ea66d9e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/playeroverlay/CustomPlayerOverlayOpacityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/playeroverlay/CustomPlayerOverlayOpacityPatch.kt @@ -3,60 +3,29 @@ package app.revanced.patches.youtube.player.playeroverlay import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.utils.fingerprints.YouTubeControlsOverlayFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ScrimOverlay import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction -@Patch( +@Suppress("unused") +object CustomPlayerOverlayOpacityPatch : BaseBytecodePatch( name = "Custom player overlay opacity", description = "Adds an option to change the opacity of the video player background when player controls are visible.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object CustomPlayerOverlayOpacityPatch : BytecodePatch( - setOf(YouTubeControlsOverlayFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(YouTubeControlsOverlayFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -71,7 +40,7 @@ object CustomPlayerOverlayOpacityPatch : BytecodePatch( addInstruction( targetIndex + 1, - "invoke-static {v$targetRegister}, $PLAYER->changePlayerOpacity(Landroid/widget/ImageView;)V" + "invoke-static {v$targetRegister}, $PLAYER_CLASS_DESCRIPTOR->changePlayerOpacity(Landroid/widget/ImageView;)V" ) } } ?: throw YouTubeControlsOverlayFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/HidePreviousNextButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/PreviousNextButtonPatch.kt similarity index 66% rename from src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/HidePreviousNextButtonPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/PreviousNextButtonPatch.kt index fb4a2b3c5..579b44589 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/HidePreviousNextButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/previousnextbutton/PreviousNextButtonPatch.kt @@ -3,58 +3,27 @@ package app.revanced.patches.youtube.player.previousnextbutton import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.utils.fingerprints.PlayerControlsVisibilityModelFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction3rc -@Patch( +@Suppress("unused") +object PreviousNextButtonPatch : BaseBytecodePatch( name = "Hide previous next button", description = "Adds an option to hide the previous and next buttons in the video player.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HidePreviousNextButtonPatch : BytecodePatch( - setOf(PlayerControlsVisibilityModelFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(PlayerControlsVisibilityModelFingerprint) ) { private const val HAS_NEXT = 5 private const val HAS_PREVIOUS = 6 private const val INTEGRATIONS_METHOD_REFERENCE = - "$PLAYER->hidePreviousNextButton(Z)Z" + "$PLAYER_CLASS_DESCRIPTOR->hidePreviousNextButton(Z)Z" override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/seekmessage/SeekMessagePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/seekmessage/SeekMessagePatch.kt index 805258b0a..dd1918ef3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/seekmessage/SeekMessagePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/seekmessage/SeekMessagePatch.kt @@ -3,67 +3,34 @@ package app.revanced.patches.youtube.player.seekmessage import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.player.seekmessage.fingerprints.SeekEduContainerFingerprint import app.revanced.patches.youtube.player.seekmessage.fingerprints.SeekEduUndoOverlayFingerprint -import app.revanced.patches.youtube.utils.controlsoverlay.DisableControlsOverlayConfigPatch -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.controlsoverlay.ControlsOverlayConfigPatch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.SeekUndoEduOverlayStub import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.util.getTargetIndexWithMethodReferenceName +import app.revanced.util.patch.BaseBytecodePatch 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.instruction.WideLiteralInstruction -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -@Patch( +@Suppress("unused") +object SeekMessagePatch : BaseBytecodePatch( name = "Hide seek message", description = "Adds an option to hide the 'Slide left or right to seek' or 'Release to cancel' message container in the video player.", - dependencies = [ - DisableControlsOverlayConfigPatch::class, + dependencies = setOf( + ControlsOverlayConfigPatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object SeekMessagePatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( SeekEduContainerFingerprint, SeekEduUndoOverlayFingerprint ) @@ -74,7 +41,7 @@ object SeekMessagePatch : BytecodePatch( it.mutableMethod.apply { addInstructionsWithLabels( 0, """ - invoke-static {}, $PLAYER->hideSeekMessage()Z + invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->hideSeekMessage()Z move-result v0 if-eqz v0, :default return-void @@ -95,20 +62,15 @@ object SeekMessagePatch : BytecodePatch( val insertIndex = seekUndoCalls.elementAt(seekUndoCalls.size - 1).index val insertRegister = getInstruction(insertIndex).registerA - val jumpIndex = implementation!!.instructions.let { - insertIndex + it.subList(insertIndex, it.size - 1).indexOfFirst { instruction -> - instruction.opcode == Opcode.INVOKE_VIRTUAL - && ((instruction as? ReferenceInstruction)?.reference as? MethodReference)?.name == "setOnClickListener" - } - } - val constComponent = getConstComponent(insertIndex, jumpIndex - 1) + val onClickListenerIndex = getTargetIndexWithMethodReferenceName(insertIndex, "setOnClickListener") + val constComponent = getConstComponent(insertIndex, onClickListenerIndex - 1) addInstructionsWithLabels( insertIndex, constComponent + """ - invoke-static {}, $PLAYER->hideSeekUndoMessage()Z + invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->hideSeekUndoMessage()Z move-result v$insertRegister if-nez v$insertRegister, :default - """, ExternalLabel("default", getInstruction(jumpIndex + 1)) + """, ExternalLabel("default", getInstruction(onClickListenerIndex + 1)) ) } } ?: throw SeekEduUndoOverlayFingerprint.exception @@ -135,13 +97,14 @@ object SeekMessagePatch : BytecodePatch( getInstruction(endIndex).registerE for (index in endIndex downTo startIndex) { - if (getInstruction(index).opcode != Opcode.CONST_16) + val instruction = getInstruction(index) + if (instruction !is WideLiteralInstruction) continue - if (getInstruction(index).registerA != constRegister) + if ((instruction as OneRegisterInstruction).registerA != constRegister) continue - val constValue = getInstruction(index).wideLiteral.toInt() + val constValue = (instruction as WideLiteralInstruction).wideLiteral.toInt() return "const/16 v$constRegister, $constValue" } diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/seekmessage/fingerprints/SeekEduContainerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/seekmessage/fingerprints/SeekEduContainerFingerprint.kt index 8de3c0851..c6cabd70c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/seekmessage/fingerprints/SeekEduContainerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/seekmessage/fingerprints/SeekEduContainerFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.player.seekmessage.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.EasySeekEduContainer import app.revanced.util.fingerprint.LiteralValueFingerprint -object SeekEduContainerFingerprint : LiteralValueFingerprint( +internal object SeekEduContainerFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { EasySeekEduContainer } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/seekmessage/fingerprints/SeekEduUndoOverlayFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/seekmessage/fingerprints/SeekEduUndoOverlayFingerprint.kt index 0dd0631ab..d17c71b92 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/seekmessage/fingerprints/SeekEduUndoOverlayFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/seekmessage/fingerprints/SeekEduUndoOverlayFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.player.seekmessage.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.SeekUndoEduOverlayStub import app.revanced.util.fingerprint.LiteralValueFingerprint -object SeekEduUndoOverlayFingerprint : LiteralValueFingerprint( +internal object SeekEduUndoOverlayFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { SeekUndoEduOverlayStub } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/SpeedOverlayPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/SpeedOverlayPatch.kt index 5c767be83..af0287638 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/SpeedOverlayPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/SpeedOverlayPatch.kt @@ -1,79 +1,35 @@ package app.revanced.patches.youtube.player.speedoverlay import app.revanced.patcher.data.BytecodeContext -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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.player.speedoverlay.fingerprints.RestoreSlideToSeekBehaviorFingerprint import app.revanced.patches.youtube.player.speedoverlay.fingerprints.SpeedOverlayFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.exception -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import app.revanced.util.literalInstructionBooleanHook +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object SpeedOverlayPatch : BaseBytecodePatch( name = "Disable speed overlay", description = "Adds an option to disable 'Play at 2x speed' when pressing and holding in the video player.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object SpeedOverlayPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( RestoreSlideToSeekBehaviorFingerprint, SpeedOverlayFingerprint ) ) { override fun execute(context: BytecodeContext) { - arrayOf( - RestoreSlideToSeekBehaviorFingerprint, - SpeedOverlayFingerprint - ).forEach { fingerprint -> - fingerprint.result?.let { - it.mutableMethod.apply { - val insertIndex = it.scanResult.patternScanResult!!.endIndex + 1 - val insertRegister = - getInstruction(insertIndex).registerA - - addInstructions( - insertIndex, """ - invoke-static {v$insertRegister}, $PLAYER->disableSpeedOverlay(Z)Z - move-result v$insertRegister - """ - ) - } - } ?: throw fingerprint.exception + mapOf( + RestoreSlideToSeekBehaviorFingerprint to 45411329, + SpeedOverlayFingerprint to 45411330 + ).forEach { (fingerprint, literal) -> + fingerprint.literalInstructionBooleanHook( + literal, + "$PLAYER_CLASS_DESCRIPTOR->disableSpeedOverlay(Z)Z" + ) } /** diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/RestoreSlideToSeekBehaviorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/RestoreSlideToSeekBehaviorFingerprint.kt index 24ef19702..e27dac2f0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/RestoreSlideToSeekBehaviorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/RestoreSlideToSeekBehaviorFingerprint.kt @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * This value restores the 'Slide to seek' behavior. */ -object RestoreSlideToSeekBehaviorFingerprint : LiteralValueFingerprint( +internal object RestoreSlideToSeekBehaviorFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), opcodes = listOf(Opcode.MOVE_RESULT), diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/SpeedOverlayFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/SpeedOverlayFingerprint.kt index ec95d0bf2..dd1fc9e7e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/SpeedOverlayFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/speedoverlay/fingerprints/SpeedOverlayFingerprint.kt @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * This value disables 'Playing at 2x speed' while holding down. */ -object SpeedOverlayFingerprint : LiteralValueFingerprint( +internal object SpeedOverlayFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), opcodes = listOf(Opcode.MOVE_RESULT), diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/suggestactions/SuggestedActionsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/suggestactions/SuggestedActionsPatch.kt index 39c5914ed..481163706 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/suggestactions/SuggestedActionsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/suggestactions/SuggestedActionsPatch.kt @@ -3,61 +3,33 @@ package app.revanced.patches.youtube.player.suggestactions import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch import app.revanced.patches.youtube.player.suggestactions.fingerprints.SuggestedActionsFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object SuggestedActionsPatch : BaseBytecodePatch( name = "Hide suggested actions", description = "Adds an option to hide the suggested actions bar inside the player.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, PlayerTypeHookPatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object SuggestedActionsPatch : BytecodePatch( - setOf(SuggestedActionsFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(SuggestedActionsFingerprint) ) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/SuggestedActionFilter;" + override fun execute(context: BytecodeContext) { SuggestedActionsFingerprint.result?.let { it.mutableMethod.apply { @@ -87,7 +59,4 @@ object SuggestedActionsPatch : BytecodePatch( SettingsPatch.updatePatchStatus("Hide suggested actions") } - - private const val FILTER_CLASS_DESCRIPTOR = - "$COMPONENTS_PATH/SuggestedActionFilter;" } diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/suggestactions/fingerprints/SuggestedActionsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/suggestactions/fingerprints/SuggestedActionsFingerprint.kt index a6024872e..740783a4f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/suggestactions/fingerprints/SuggestedActionsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/suggestactions/fingerprints/SuggestedActionsFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Sugge import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object SuggestedActionsFingerprint : LiteralValueFingerprint( +internal object SuggestedActionsFingerprint : LiteralValueFingerprint( returnType = "V", opcodes = listOf( Opcode.CONST, diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/SuggestedVideoOverlayPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/SuggestedVideoOverlayPatch.kt index 85502736d..c0f9cdd23 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/SuggestedVideoOverlayPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/SuggestedVideoOverlayPatch.kt @@ -4,64 +4,30 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 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.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.player.suggestedvideooverlay.fingerprints.CoreContainerBuilderFingerprint import app.revanced.patches.youtube.player.suggestedvideooverlay.fingerprints.MiniPlayerPlayButtonFingerprint import app.revanced.patches.youtube.player.suggestedvideooverlay.fingerprints.TouchAreaOnClickListenerFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception -import com.android.tools.smali.dexlib2.Opcode +import app.revanced.util.getTargetIndexWithMethodReferenceName +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c -import com.android.tools.smali.dexlib2.iface.reference.MethodReference -@Patch( +@Suppress("unused") +object SuggestedVideoOverlayPatch : BaseBytecodePatch( name = "Hide suggested video overlay", description = "Adds an option to hide the suggested video overlay at the end of videos.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object SuggestedVideoOverlayPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( CoreContainerBuilderFingerprint, TouchAreaOnClickListenerFingerprint ) @@ -75,7 +41,7 @@ object SuggestedVideoOverlayPatch : BytecodePatch( addInstruction( addOnClickEventListenerIndex + 1, - "invoke-static {v$viewRegister}, $PLAYER->hideSuggestedVideoOverlay(Landroid/widget/ImageView;)V" + "invoke-static {v$viewRegister}, $PLAYER_CLASS_DESCRIPTOR->hideSuggestedVideoOverlay(Landroid/widget/ImageView;)V" ) } @@ -86,7 +52,7 @@ object SuggestedVideoOverlayPatch : BytecodePatch( it.mutableMethod.apply { addInstructionsWithLabels( 0, """ - invoke-static {}, $PLAYER->hideSuggestedVideoOverlay()Z + invoke-static {}, $PLAYER_CLASS_DESCRIPTOR->hideSuggestedVideoOverlay()Z move-result v0 if-eqz v0, :show return-void @@ -101,12 +67,12 @@ object SuggestedVideoOverlayPatch : BytecodePatch( val insertMethod = it.mutableClass.methods.find { method -> method.parameters == listOf("Landroid/view/View${'$'}OnClickListener;") } insertMethod?.apply { - val setOnClickListenerIndex = getOnClickListenerIndex() + val setOnClickListenerIndex = getTargetIndexWithMethodReferenceName("setOnClickListener") val setOnClickListenerRegister = getInstruction(setOnClickListenerIndex).registerC addInstruction( setOnClickListenerIndex + 1, - "invoke-static {v$setOnClickListenerRegister}, $PLAYER->hideSuggestedVideoOverlayAutoPlay(Landroid/view/View;)V" + "invoke-static {v$setOnClickListenerRegister}, $PLAYER_CLASS_DESCRIPTOR->hideSuggestedVideoOverlayAutoPlay(Landroid/view/View;)V" ) } ?: throw PatchException("Failed to find setOnClickListener method") } @@ -126,12 +92,4 @@ object SuggestedVideoOverlayPatch : BytecodePatch( SettingsPatch.updatePatchStatus("Hide suggested video overlay") } - - private fun MutableMethod.getOnClickListenerIndex(): Int { - return implementation!!.instructions.indexOfFirst { instruction -> - if (instruction.opcode != Opcode.INVOKE_VIRTUAL) return@indexOfFirst false - - return@indexOfFirst ((instruction as Instruction35c).reference as MethodReference).name == "setOnClickListener" - } - } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/fingerprints/CoreContainerBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/fingerprints/CoreContainerBuilderFingerprint.kt index 63bd7fd95..afacc7d81 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/fingerprints/CoreContainerBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/fingerprints/CoreContainerBuilderFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object CoreContainerBuilderFingerprint : LiteralValueFingerprint( +internal object CoreContainerBuilderFingerprint : LiteralValueFingerprint( returnType = "Landroid/view/View;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/content/Context;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/fingerprints/MiniPlayerPlayButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/fingerprints/MiniPlayerPlayButtonFingerprint.kt index 649d231d5..0cb484445 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/fingerprints/MiniPlayerPlayButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/fingerprints/MiniPlayerPlayButtonFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object MiniPlayerPlayButtonFingerprint : MethodFingerprint( +internal object MiniPlayerPlayButtonFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/content/Context;", "Landroid/view/View;") diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/fingerprints/TouchAreaOnClickListenerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/fingerprints/TouchAreaOnClickListenerFingerprint.kt index 162b1b2f3..2e383bbc5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/fingerprints/TouchAreaOnClickListenerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/suggestedvideooverlay/fingerprints/TouchAreaOnClickListenerFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Touch import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object TouchAreaOnClickListenerFingerprint : LiteralValueFingerprint( +internal object TouchAreaOnClickListenerFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, literalSupplier = { TouchArea } diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/watermark/HideChannelWatermarkPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/player/watermark/ChannelWatermarkPatch.kt similarity index 52% rename from src/main/kotlin/app/revanced/patches/youtube/player/watermark/HideChannelWatermarkPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/player/watermark/ChannelWatermarkPatch.kt index 3b367f803..08b11b91b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/watermark/HideChannelWatermarkPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/watermark/ChannelWatermarkPatch.kt @@ -3,64 +3,35 @@ package app.revanced.patches.youtube.player.watermark import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch -import app.revanced.patches.youtube.player.watermark.fingerprints.HideWatermarkFingerprint -import app.revanced.patches.youtube.player.watermark.fingerprints.HideWatermarkParentFingerprint +import app.revanced.patches.youtube.player.watermark.fingerprints.WatermarkFingerprint +import app.revanced.patches.youtube.player.watermark.fingerprints.WatermarkParentFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH -import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER +import app.revanced.patches.youtube.utils.integrations.Constants.PLAYER_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object ChannelWatermarkPatch : BaseBytecodePatch( name = "Hide channel watermark", description = "Adds an option to hide creator's watermarks in the video player.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideChannelWatermarkBytecodePatch : BytecodePatch( - setOf(HideWatermarkParentFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(WatermarkParentFingerprint) ) { + private const val FILTER_CLASS_DESCRIPTOR = + "$COMPONENTS_PATH/WaterMarkFilter;" + override fun execute(context: BytecodeContext) { - HideWatermarkParentFingerprint.result?.let { parentResult -> - HideWatermarkFingerprint.also { + WatermarkParentFingerprint.result?.let { parentResult -> + WatermarkFingerprint.also { it.resolve( context, parentResult.classDef @@ -70,18 +41,17 @@ object HideChannelWatermarkBytecodePatch : BytecodePatch( val insertIndex = it.scanResult.patternScanResult!!.endIndex val register = getInstruction(insertIndex).registerA - removeInstruction(insertIndex) addInstructions( - insertIndex, """ - invoke-static {}, $PLAYER->hideChannelWatermark()Z + insertIndex + 1, """ + invoke-static {v$register}, $PLAYER_CLASS_DESCRIPTOR->hideChannelWatermark(Z)Z move-result v$register """ ) } - } ?: throw HideWatermarkFingerprint.exception - } ?: throw HideWatermarkParentFingerprint.exception + } ?: throw WatermarkFingerprint.exception + } ?: throw WatermarkParentFingerprint.exception - LithoFilterPatch.addFilter("$COMPONENTS_PATH/WaterMarkFilter;") + LithoFilterPatch.addFilter(FILTER_CLASS_DESCRIPTOR) /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/HideWatermarkFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/WatermarkFingerprint.kt similarity index 89% rename from src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/HideWatermarkFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/WatermarkFingerprint.kt index 2a4763712..dc1df33ec 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/HideWatermarkFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/WatermarkFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object HideWatermarkFingerprint : MethodFingerprint( +internal object WatermarkFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/HideWatermarkParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/WatermarkParentFingerprint.kt similarity index 85% rename from src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/HideWatermarkParentFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/WatermarkParentFingerprint.kt index 240c70467..b95c11786 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/HideWatermarkParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/player/watermark/fingerprints/WatermarkParentFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object HideWatermarkParentFingerprint : MethodFingerprint( +internal object WatermarkParentFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, strings = listOf("player_overlay_in_video_programming") diff --git a/src/main/kotlin/app/revanced/patches/youtube/seekbar/append/AppendTimeStampInformationPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/seekbar/append/AppendTimeStampInformationPatch.kt index 4e812126b..5f2421aff 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/seekbar/append/AppendTimeStampInformationPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/seekbar/append/AppendTimeStampInformationPatch.kt @@ -3,62 +3,31 @@ package app.revanced.patches.youtube.seekbar.append import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.utils.fingerprints.TotalTimeFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.overridequality.OverrideQualityHookPatch import app.revanced.patches.youtube.utils.overridespeed.OverrideSpeedHookPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getTargetIndexWithMethodReferenceName +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object AppendTimeStampInformationPatch : BaseBytecodePatch( name = "Append time stamps information", description = "Adds an option to add the current video quality or playback speed in brackets next to the current time.", - dependencies = [ + dependencies = setOf( OverrideQualityHookPatch::class, OverrideSpeedHookPatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object AppendTimeStampInformationPatch : BytecodePatch( - setOf(TotalTimeFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(TotalTimeFingerprint) ) { override fun execute(context: BytecodeContext) { TotalTimeFingerprint.result?.let { @@ -71,8 +40,8 @@ object AppendTimeStampInformationPatch : BytecodePatch( addInstructions( textViewIndex, """ - invoke-static {v$textViewRegister}, $SEEKBAR->setContainerClickListener(Landroid/view/View;)V - invoke-static {v$charSequenceRegister}, $SEEKBAR->appendTimeStampInformation(Ljava/lang/String;)Ljava/lang/String; + invoke-static {v$textViewRegister}, $SEEKBAR_CLASS_DESCRIPTOR->setContainerClickListener(Landroid/view/View;)V + invoke-static {v$charSequenceRegister}, $SEEKBAR_CLASS_DESCRIPTOR->appendTimeStampInformation(Ljava/lang/String;)Ljava/lang/String; move-result-object v$charSequenceRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/seekbar/color/SeekbarColorPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/seekbar/color/SeekbarColorPatch.kt index 4902186bd..3a4f372ee 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/seekbar/color/SeekbarColorPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/seekbar/color/SeekbarColorPatch.kt @@ -3,16 +3,14 @@ package app.revanced.patches.youtube.seekbar.color import app.revanced.patcher.data.BytecodeContext 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.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.shared.drawable.DrawableColorPatch import app.revanced.patches.youtube.seekbar.color.fingerprints.ControlsOverlayStyleFingerprint import app.revanced.patches.youtube.seekbar.color.fingerprints.ShortsSeekbarColorFingerprint import app.revanced.patches.youtube.utils.fingerprints.PlayerSeekbarColorFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.InlineTimeBarColorizedBarPlayedColorDark import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.InlineTimeBarPlayedNotHighlightedColor @@ -21,51 +19,22 @@ import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch.contexts import app.revanced.util.exception import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction import org.w3c.dom.Element -@Patch( +@Suppress("DEPRECATION", "SpellCheckingInspection", "unused") +object SeekbarColorPatch : BaseBytecodePatch( name = "Custom seekbar color", description = "Adds an option to customize seekbar colors in video players and video thumbnails.", - dependencies = [ + dependencies = setOf( DrawableColorPatch::class, SettingsPatch::class, - SharedResourceIdPatch::class, - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object SeekbarColorPatch : BytecodePatch( - setOf( + SharedResourceIdPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( ControlsOverlayStyleFingerprint, PlayerSeekbarColorFingerprint, ShortsSeekbarColorFingerprint @@ -92,14 +61,14 @@ object SeekbarColorPatch : BytecodePatch( addInstructions( 0, """ - invoke-static {v$colorRegister}, $SEEKBAR->getSeekbarClickedColorValue(I)I + invoke-static {v$colorRegister}, $SEEKBAR_CLASS_DESCRIPTOR->getSeekbarClickedColorValue(I)I move-result v$colorRegister """ ) } } ?: throw ControlsOverlayStyleFingerprint.exception - DrawableColorPatch.injectCall("$SEEKBAR->getColor(I)I") + DrawableColorPatch.injectCall("$SEEKBAR_CLASS_DESCRIPTOR->getColor(I)I") contexts.xmlEditor["res/drawable/resume_playback_progressbar_drawable.xml"].use { val layerList = it.file.getElementsByTagName("layer-list").item(0) as Element @@ -134,7 +103,7 @@ object SeekbarColorPatch : BytecodePatch( addInstructions( insertIndex + 1, """ - invoke-static {v$insertRegister}, $SEEKBAR->overrideSeekbarColor(I)I + invoke-static {v$insertRegister}, $SEEKBAR_CLASS_DESCRIPTOR->overrideSeekbarColor(I)I move-result v$insertRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/seekbar/color/fingerprints/ControlsOverlayStyleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/seekbar/color/fingerprints/ControlsOverlayStyleFingerprint.kt index a58b9c746..33a720e33 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/seekbar/color/fingerprints/ControlsOverlayStyleFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/seekbar/color/fingerprints/ControlsOverlayStyleFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.seekbar.color.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object ControlsOverlayStyleFingerprint : MethodFingerprint( +internal object ControlsOverlayStyleFingerprint : MethodFingerprint( opcodes = listOf(Opcode.CONST_HIGH16), strings = listOf("YOUTUBE", "PREROLL", "POSTROLL"), customFingerprint = { methodDef, _ -> diff --git a/src/main/kotlin/app/revanced/patches/youtube/seekbar/color/fingerprints/ShortsSeekbarColorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/seekbar/color/fingerprints/ShortsSeekbarColorFingerprint.kt index 83b0c7754..d8c5e520f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/seekbar/color/fingerprints/ShortsSeekbarColorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/seekbar/color/fingerprints/ShortsSeekbarColorFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ReelT import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object ShortsSeekbarColorFingerprint : LiteralValueFingerprint( +internal object ShortsSeekbarColorFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, literalSupplier = { ReelTimeBarPlayedColor } diff --git a/src/main/kotlin/app/revanced/patches/youtube/seekbar/hide/HideSeekbarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/seekbar/hide/SeekbarPatch.kt similarity index 58% rename from src/main/kotlin/app/revanced/patches/youtube/seekbar/hide/HideSeekbarPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/seekbar/hide/SeekbarPatch.kt index eab9d216c..2c23d004e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/seekbar/hide/HideSeekbarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/seekbar/hide/SeekbarPatch.kt @@ -3,57 +3,26 @@ package app.revanced.patches.youtube.seekbar.hide import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.seekbar.color.SeekbarColorPatch import app.revanced.patches.youtube.utils.fingerprints.SeekbarFingerprint import app.revanced.patches.youtube.utils.fingerprints.SeekbarOnDrawFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object SeekbarPatch : BaseBytecodePatch( name = "Hide seekbar", description = "Adds an option to hide the seekbar in video player and video thumbnails.", - dependencies = [ + dependencies = setOf( SeekbarColorPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideSeekbarPatch : BytecodePatch( - setOf(SeekbarFingerprint) + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(SeekbarFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -62,11 +31,11 @@ object HideSeekbarPatch : BytecodePatch( it.mutableMethod.apply { addInstructionsWithLabels( 0, """ - invoke-static {}, $SEEKBAR->hideSeekbar()Z + invoke-static {}, $SEEKBAR_CLASS_DESCRIPTOR->hideSeekbar()Z move-result v0 - if-eqz v0, :show_seekbar + if-eqz v0, :show return-void - """, ExternalLabel("show_seekbar", getInstruction(0)) + """, ExternalLabel("show", getInstruction(0)) ) } } ?: throw SeekbarOnDrawFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/seekbar/tapping/SeekbarTappingPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/seekbar/tapping/SeekbarTappingPatch.kt index ccdb01b21..ad1653aeb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/seekbar/tapping/SeekbarTappingPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/seekbar/tapping/SeekbarTappingPatch.kt @@ -3,58 +3,27 @@ package app.revanced.patches.youtube.seekbar.tapping import app.revanced.patcher.data.BytecodeContext 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.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.seekbar.tapping.fingerprints.SeekbarTappingFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction35c import com.android.tools.smali.dexlib2.dexbacked.reference.DexBackedMethodReference import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction11n -@Patch( +@Suppress("unused") +object SeekbarTappingPatch : BaseBytecodePatch( name = "Enable seekbar tapping", description = "Adds an option to enable tap-to-seek on the seekbar of the video player.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object SeekbarTappingPatch : BytecodePatch( - setOf(SeekbarTappingFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(SeekbarTappingFingerprint) ) { override fun execute(context: BytecodeContext) { SeekbarTappingFingerprint.result?.let { @@ -100,7 +69,7 @@ object SeekbarTappingPatch : BytecodePatch( addInstructionsWithLabels( insertIndex, """ - invoke-static {}, $SEEKBAR->enableSeekbarTapping()Z + invoke-static {}, $SEEKBAR_CLASS_DESCRIPTOR->enableSeekbarTapping()Z move-result v0 if-eqz v0, :disabled invoke-virtual { p0, v2 }, ${oMethod.definingClass}->${oMethod.name}(I)V diff --git a/src/main/kotlin/app/revanced/patches/youtube/seekbar/tapping/fingerprints/SeekbarTappingFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/seekbar/tapping/fingerprints/SeekbarTappingFingerprint.kt index 90ae87344..c85af5700 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/seekbar/tapping/fingerprints/SeekbarTappingFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/seekbar/tapping/fingerprints/SeekbarTappingFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SeekbarTappingFingerprint : MethodFingerprint( +internal object SeekbarTappingFingerprint : MethodFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/seekbar/thumbnailpreview/NewThumbnailPreviewPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/seekbar/thumbnailpreview/NewThumbnailPreviewPatch.kt index e4258206f..f1396f9d7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/seekbar/thumbnailpreview/NewThumbnailPreviewPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/seekbar/thumbnailpreview/NewThumbnailPreviewPatch.kt @@ -1,70 +1,27 @@ package app.revanced.patches.youtube.seekbar.thumbnailpreview import app.revanced.patcher.data.BytecodeContext -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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.utils.fingerprints.ThumbnailPreviewConfigFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.util.exception -import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction +import app.revanced.util.literalInstructionBooleanHook +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object NewThumbnailPreviewPatch : BaseBytecodePatch( name = "Enable new thumbnail preview", description = "Adds an option to enables the new seekbar thumbnails preview.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object NewThumbnailPreviewPatch : BytecodePatch( - setOf(ThumbnailPreviewConfigFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(ThumbnailPreviewConfigFingerprint) ) { override fun execute(context: BytecodeContext) { - ThumbnailPreviewConfigFingerprint.result?.let { - it.mutableMethod.apply { - val insertIndex = implementation!!.instructions.size - 1 - val targetRegister = getInstruction(insertIndex).registerA - - addInstructions( - insertIndex, """ - invoke-static {}, $SEEKBAR->enableNewThumbnailPreview()Z - move-result v$targetRegister - """ - ) - } - } ?: throw ThumbnailPreviewConfigFingerprint.exception + ThumbnailPreviewConfigFingerprint.literalInstructionBooleanHook( + 45398577, + "$SEEKBAR_CLASS_DESCRIPTOR->enableNewThumbnailPreview()Z" + ) /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/seekbar/timestamps/HideTimeStampPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/seekbar/timestamps/TimeStampPatch.kt similarity index 58% rename from src/main/kotlin/app/revanced/patches/youtube/seekbar/timestamps/HideTimeStampPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/seekbar/timestamps/TimeStampPatch.kt index 3a5f1c972..a9eb70b59 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/seekbar/timestamps/HideTimeStampPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/seekbar/timestamps/TimeStampPatch.kt @@ -3,57 +3,26 @@ package app.revanced.patches.youtube.seekbar.timestamps import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.seekbar.timestamps.fingerprints.TimeCounterFingerprint import app.revanced.patches.youtube.utils.fingerprints.PlayerSeekbarColorFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.SEEKBAR_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object TimeStampPatch : BaseBytecodePatch( name = "Hide time stamp", description = "Adds an option to hide the timestamp in the bottom left of the video player.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, - SharedResourceIdPatch::class, - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object HideTimeStampPatch : BytecodePatch( - setOf(PlayerSeekbarColorFingerprint) + SharedResourceIdPatch::class + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(PlayerSeekbarColorFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -62,11 +31,11 @@ object HideTimeStampPatch : BytecodePatch( it.mutableMethod.apply { addInstructionsWithLabels( 0, """ - invoke-static {}, $SEEKBAR->hideTimeStamp()Z + invoke-static {}, $SEEKBAR_CLASS_DESCRIPTOR->hideTimeStamp()Z move-result v0 - if-eqz v0, :show_time_stamp + if-eqz v0, :show return-void - """, ExternalLabel("show_time_stamp", getInstruction(0)) + """, ExternalLabel("show", getInstruction(0)) ) } } ?: throw TimeCounterFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/seekbar/timestamps/fingerprints/TimeCounterFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/seekbar/timestamps/fingerprints/TimeCounterFingerprint.kt index c9d1b5c95..dd9b6813d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/seekbar/timestamps/fingerprints/TimeCounterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/seekbar/timestamps/fingerprints/TimeCounterFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object TimeCounterFingerprint : MethodFingerprint( +internal object TimeCounterFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), returnType = "V", diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsComponentPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsComponentPatch.kt index 4dea5d89b..9cc108be4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsComponentPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsComponentPatch.kt @@ -6,9 +6,6 @@ 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.fingerprint.MethodFingerprint -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.shared.litho.LithoFilterPatch @@ -18,8 +15,9 @@ import app.revanced.patches.youtube.shorts.components.fingerprints.ShortsPaidPro import app.revanced.patches.youtube.shorts.components.fingerprints.ShortsPivotFingerprint import app.revanced.patches.youtube.shorts.components.fingerprints.ShortsPivotLegacyFingerprint import app.revanced.patches.youtube.utils.browseid.BrowseIdHookPatch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH -import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS +import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ReelDynRemix @@ -37,13 +35,15 @@ import app.revanced.util.exception import app.revanced.util.getTargetIndex import app.revanced.util.getTargetIndexReversed import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object ShortsComponentPatch : BaseBytecodePatch( name = "Hide shorts components", description = "Adds options to hide components related to YouTube Shorts.", - dependencies = [ + dependencies = setOf( BrowseIdHookPatch::class, LithoFilterPatch::class, PlayerTypeHookPatch::class, @@ -52,40 +52,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction ShortsNavigationBarPatch::class, ShortsSubscriptionsButtonPatch::class, ShortsToolBarPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ShortsComponentPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( ShortsButtonFingerprint, ShortsInfoPanelFingerprint, ShortsPaidPromotionFingerprint, @@ -112,7 +81,7 @@ object ShortsComponentPatch : BytecodePatch( addInstructionsWithLabels( constIndex + 1, """ - invoke-static {}, $SHORTS->hideShortsPlayerDislikeButton()Z + invoke-static {}, $SHORTS_CLASS_DESCRIPTOR->hideShortsPlayerDislikeButton()Z move-result v$constRegister if-nez v$constRegister, :hide const v$constRegister, $ReelRightDislikeIcon @@ -137,7 +106,7 @@ object ShortsComponentPatch : BytecodePatch( addInstructionsWithLabels( insertIndex + 1, """ - invoke-static {}, $SHORTS->hideShortsPlayerLikeButton()Z + invoke-static {}, $SHORTS_CLASS_DESCRIPTOR->hideShortsPlayerLikeButton()Z move-result v$insertRegister if-nez v$insertRegister, :hide const v$insertRegister, $ReelRightLikeIcon @@ -165,7 +134,7 @@ object ShortsComponentPatch : BytecodePatch( addInstructionsWithLabels( insertIndex, """ - invoke-static {}, $SHORTS->hideShortsPlayerPivotButton()Z + invoke-static {}, $SHORTS_CLASS_DESCRIPTOR->hideShortsPlayerPivotButton()Z move-result v$targetRegister if-nez v$targetRegister, :hide """, ExternalLabel("hide", getInstruction(jumpIndex)) @@ -225,7 +194,7 @@ object ShortsComponentPatch : BytecodePatch( addInstruction( insertIndex, - "invoke-static {v$insertRegister}, $SHORTS->$descriptor(Landroid/view/View;)V" + "invoke-static {v$insertRegister}, $SHORTS_CLASS_DESCRIPTOR->$descriptor(Landroid/view/View;)V" ) } } ?: throw exception @@ -253,7 +222,7 @@ object ShortsComponentPatch : BytecodePatch( addInstructions( insertIndex + 1, """ - invoke-static {v$insertRegister}, $SHORTS->$descriptor + invoke-static {v$insertRegister}, $SHORTS_CLASS_DESCRIPTOR->$descriptor move-result-object v$insertRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsNavigationBarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsNavigationBarPatch.kt index edf1ea0e5..c329dfc8f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsNavigationBarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsNavigationBarPatch.kt @@ -10,7 +10,7 @@ import app.revanced.patches.youtube.shorts.components.fingerprints.BottomNavigat import app.revanced.patches.youtube.shorts.components.fingerprints.RenderBottomNavigationBarFingerprint import app.revanced.patches.youtube.shorts.components.fingerprints.SetPivotBarFingerprint import app.revanced.patches.youtube.utils.fingerprints.PivotBarCreateButtonViewFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS +import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS_CLASS_DESCRIPTOR import app.revanced.util.exception import app.revanced.util.getTargetIndexWithMethodReferenceName import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -32,7 +32,7 @@ object ShortsNavigationBarPatch : BytecodePatch( addInstruction( startIndex + 1, - "sput-object v$register, $SHORTS->pivotBar:Ljava/lang/Object;" + "sput-object v$register, $SHORTS_CLASS_DESCRIPTOR->pivotBar:Ljava/lang/Object;" ) } } ?: throw SetPivotBarFingerprint.exception @@ -46,7 +46,7 @@ object ShortsNavigationBarPatch : BytecodePatch( targetMethod.addInstruction( 0, - "invoke-static {}, $SHORTS->hideShortsPlayerNavigationBar()V" + "invoke-static {}, $SHORTS_CLASS_DESCRIPTOR->hideShortsPlayerNavigationBar()V" ) } ?: throw RenderBottomNavigationBarFingerprint.exception @@ -57,7 +57,7 @@ object ShortsNavigationBarPatch : BytecodePatch( addInstructions( targetIndex + 1, """ - invoke-static {v$insertRegister}, $SHORTS->hideShortsPlayerNavigationBar(Landroid/view/View;)Landroid/view/View; + invoke-static {v$insertRegister}, $SHORTS_CLASS_DESCRIPTOR->hideShortsPlayerNavigationBar(Landroid/view/View;)Landroid/view/View; move-result-object v$insertRegister """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsSubscriptionsButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsSubscriptionsButtonPatch.kt index 07f9679c2..0602532ab 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsSubscriptionsButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsSubscriptionsButtonPatch.kt @@ -9,7 +9,7 @@ import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.shorts.components.fingerprints.ShortsSubscriptionsFingerprint import app.revanced.patches.youtube.shorts.components.fingerprints.ShortsSubscriptionsTabletFingerprint import app.revanced.patches.youtube.shorts.components.fingerprints.ShortsSubscriptionsTabletParentFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS +import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ReelPlayerFooter import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ReelPlayerPausedStateButton import app.revanced.patches.youtube.utils.settings.SettingsPatch @@ -36,7 +36,7 @@ object ShortsSubscriptionsButtonPatch : BytecodePatch( addInstruction( insertIndex + 1, - "invoke-static {v$insertRegister}, $SHORTS->hideShortsPlayerSubscriptionsButton(Landroid/view/View;)V" + "invoke-static {v$insertRegister}, $SHORTS_CLASS_DESCRIPTOR->hideShortsPlayerSubscriptionsButton(Landroid/view/View;)V" ) } } ?: throw ShortsSubscriptionsFingerprint.exception @@ -71,7 +71,7 @@ object ShortsSubscriptionsButtonPatch : BytecodePatch( it.addInstructions( insertIndex, """ - invoke-static {v$register}, $SHORTS->hideShortsPlayerSubscriptionsButton(I)I + invoke-static {v$register}, $SHORTS_CLASS_DESCRIPTOR->hideShortsPlayerSubscriptionsButton(I)I move-result v$register """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsToolBarPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsToolBarPatch.kt index b44e12e32..db2f0554d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsToolBarPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/ShortsToolBarPatch.kt @@ -8,7 +8,7 @@ import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.shorts.components.fingerprints.ToolBarBannerFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS +import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.toolbar.ToolBarHookPatch import app.revanced.util.exception @@ -27,7 +27,7 @@ object ShortsToolBarPatch : BytecodePatch( addInstructionsWithLabels( 0, """ - invoke-static {}, $SHORTS->hideShortsToolBarBanner()Z + invoke-static {}, $SHORTS_CLASS_DESCRIPTOR->hideShortsToolBarBanner()Z move-result v0 if-nez v0, :hide """, @@ -36,6 +36,6 @@ object ShortsToolBarPatch : BytecodePatch( } } ?: throw ToolBarBannerFingerprint.exception - ToolBarHookPatch.injectCall("$SHORTS->hideShortsToolBarButton") + ToolBarHookPatch.injectCall("$SHORTS_CLASS_DESCRIPTOR->hideShortsToolBarButton") } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/BottomNavigationBarFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/BottomNavigationBarFingerprint.kt index cc8004235..c126985dc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/BottomNavigationBarFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/BottomNavigationBarFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object BottomNavigationBarFingerprint : MethodFingerprint( +internal object BottomNavigationBarFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/View;", "Landroid/os/Bundle;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/RenderBottomNavigationBarFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/RenderBottomNavigationBarFingerprint.kt index e263d7043..c71e0d0eb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/RenderBottomNavigationBarFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/RenderBottomNavigationBarFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.shorts.components.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object RenderBottomNavigationBarFingerprint : MethodFingerprint( +internal object RenderBottomNavigationBarFingerprint : MethodFingerprint( returnType = "V", opcodes = listOf( Opcode.CONST_STRING, diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/SetPivotBarFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/SetPivotBarFingerprint.kt index 9377a1548..ac218b155 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/SetPivotBarFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/SetPivotBarFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SetPivotBarFingerprint : MethodFingerprint( +internal object SetPivotBarFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = listOf("Z"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsButtonFingerprint.kt index c7cace601..6f7d94c0a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsButtonFingerprint.kt @@ -8,7 +8,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ReelR import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.RightComment import app.revanced.util.containsWideLiteralInstructionIndex -object ShortsButtonFingerprint : MethodFingerprint( +internal object ShortsButtonFingerprint : MethodFingerprint( returnType = "V", customFingerprint = { methodDef, _ -> methodDef.containsWideLiteralInstructionIndex(ReelDynRemix) diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsInfoPanelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsInfoPanelFingerprint.kt index 0e9e7fb6f..03a2bc7ba 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsInfoPanelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsInfoPanelFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ReelP import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object ShortsInfoPanelFingerprint : LiteralValueFingerprint( +internal object ShortsInfoPanelFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, literalSupplier = { ReelPlayerInfoPanel } diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPaidPromotionFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPaidPromotionFingerprint.kt index 86b9e7e3c..9a7f329f6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPaidPromotionFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPaidPromotionFingerprint.kt @@ -7,7 +7,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ReelP import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags -object ShortsPaidPromotionFingerprint : MethodFingerprint( +internal object ShortsPaidPromotionFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, customFingerprint = { methodDef, _ -> diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPivotFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPivotFingerprint.kt index 51d51c52e..ce20636ec 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPivotFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPivotFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.shorts.components.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ReelPivotButton import app.revanced.util.fingerprint.LiteralValueFingerprint -object ShortsPivotFingerprint : LiteralValueFingerprint( +internal object ShortsPivotFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { ReelPivotButton } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPivotLegacyFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPivotLegacyFingerprint.kt index 0502e069c..ed5ccc71b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPivotLegacyFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsPivotLegacyFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ReelF import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object ShortsPivotLegacyFingerprint : LiteralValueFingerprint( +internal object ShortsPivotLegacyFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = listOf("Z", "Z", "L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsFingerprint.kt index 85c5a1cd5..4cba80e0f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ReelP import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object ShortsSubscriptionsFingerprint : LiteralValueFingerprint( +internal object ShortsSubscriptionsFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsTabletFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsTabletFingerprint.kt index 652cd52b9..27bd511e0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsTabletFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsTabletFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ShortsSubscriptionsTabletFingerprint : MethodFingerprint( +internal object ShortsSubscriptionsTabletFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = listOf("L", "L", "Z"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsTabletParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsTabletParentFingerprint.kt index 4cfdbc062..c6d156b45 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsTabletParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ShortsSubscriptionsTabletParentFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.ReelP import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object ShortsSubscriptionsTabletParentFingerprint : LiteralValueFingerprint( +internal object ShortsSubscriptionsTabletParentFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, literalSupplier = { ReelPlayerFooter } diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ToolBarBannerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ToolBarBannerFingerprint.kt index 434285135..e5020ca96 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ToolBarBannerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/components/fingerprints/ToolBarBannerFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.shorts.components.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object ToolBarBannerFingerprint : MethodFingerprint( +internal object ToolBarBannerFingerprint : MethodFingerprint( returnType = "Landroid/view/View;", opcodes = listOf( Opcode.IF_NEZ, diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/outlinebutton/ShortsOutlineButtonPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/outlinebutton/ShortsOutlineButtonPatch.kt index 74a66ebb2..4ef4baf25 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/outlinebutton/ShortsOutlineButtonPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/outlinebutton/ShortsOutlineButtonPatch.kt @@ -1,50 +1,20 @@ package app.revanced.patches.youtube.shorts.outlinebutton import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object ShortsOutlineButtonPatch : BaseResourcePatch( name = "Shorts outline button", description = "Apply the outline icon to the action button of the Shorts player.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, use = false -) -@Suppress("unused") -object ShortsOutlineButtonPatch : ResourcePatch() { +) { override fun execute(context: ResourceContext) { arrayOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/repeat/ShortsRepeatPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/repeat/ShortsRepeatPatch.kt index 1e757e5c4..07422c47c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/repeat/ShortsRepeatPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/repeat/ShortsRepeatPatch.kt @@ -4,13 +4,11 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.shorts.repeat.fingerprints.ReelEnumConstructorFingerprint import app.revanced.patches.youtube.shorts.repeat.fingerprints.ReelEnumStaticFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch.contexts import app.revanced.util.containsReferenceInstructionIndex @@ -19,47 +17,18 @@ import app.revanced.util.exception import app.revanced.util.findMutableMethodOf import app.revanced.util.getStringInstructionIndex import app.revanced.util.getTargetIndex +import app.revanced.util.patch.BaseBytecodePatch 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 -@Patch( +@Suppress("unused") +object ShortsRepeatPatch : BaseBytecodePatch( name = "Change shorts repeat state", description = "Adds an options for whether shorts should repeat, autoplay, or stop.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ShortsRepeatPatch : BytecodePatch( - setOf(ReelEnumConstructorFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(ReelEnumConstructorFingerprint) ) { override fun execute(context: BytecodeContext) { @@ -117,7 +86,7 @@ object ShortsRepeatPatch : BytecodePatch( addInstruction( insertIndex + 1, - "sput-object v$insertRegister, $SHORTS->$fieldName:Ljava/lang/Enum;" + "sput-object v$insertRegister, $SHORTS_CLASS_DESCRIPTOR->$fieldName:Ljava/lang/Enum;" ) } @@ -146,7 +115,7 @@ object ShortsRepeatPatch : BytecodePatch( addInstructions( index + 2, """ - invoke-static {v$register}, $SHORTS->changeShortsRepeatState(Ljava/lang/Enum;)Ljava/lang/Enum; + invoke-static {v$register}, $SHORTS_CLASS_DESCRIPTOR->changeShortsRepeatState(Ljava/lang/Enum;)Ljava/lang/Enum; move-result-object v$register """ ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/repeat/fingerprints/ReelEnumConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/repeat/fingerprints/ReelEnumConstructorFingerprint.kt index 8d4c79a68..86e5acfa8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/repeat/fingerprints/ReelEnumConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/repeat/fingerprints/ReelEnumConstructorFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.shorts.repeat.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object ReelEnumConstructorFingerprint : MethodFingerprint( +internal object ReelEnumConstructorFingerprint : MethodFingerprint( returnType = "V", strings = listOf( "REEL_LOOP_BEHAVIOR_SINGLE_PLAY", diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/repeat/fingerprints/ReelEnumStaticFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/repeat/fingerprints/ReelEnumStaticFingerprint.kt index b3f344f0a..fc9851abe 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/repeat/fingerprints/ReelEnumStaticFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/repeat/fingerprints/ReelEnumStaticFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object ReelEnumStaticFingerprint : MethodFingerprint( +internal object ReelEnumStaticFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("I"), returnType = "L" diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/DisableResumingShortsOnStartupPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/ResumingShortsOnStartupPatch.kt similarity index 73% rename from src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/DisableResumingShortsOnStartupPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/ResumingShortsOnStartupPatch.kt index 05b8b1b6c..32871582e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/DisableResumingShortsOnStartupPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/ResumingShortsOnStartupPatch.kt @@ -4,61 +4,30 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWithLabels import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction -import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.shorts.startupshortsreset.fingerprints.UserWasInShortsABConfigFingerprint import app.revanced.patches.youtube.shorts.startupshortsreset.fingerprints.UserWasInShortsFingerprint -import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE +import app.revanced.patches.youtube.utils.integrations.Constants.SHORTS_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception import app.revanced.util.getStringInstructionIndex import app.revanced.util.getTargetIndex import app.revanced.util.getTargetIndexReversed +import app.revanced.util.getWalkerMethod +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object ResumingShortsOnStartupPatch : BaseBytecodePatch( name = "Disable resuming shorts on startup", description = "Adds an option to disable the Shorts player from resuming on app startup when Shorts were last being watched.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object DisableResumingShortsOnStartupPatch : BytecodePatch( - setOf( + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( UserWasInShortsABConfigFingerprint, UserWasInShortsFingerprint ) @@ -66,19 +35,17 @@ object DisableResumingShortsOnStartupPatch : BytecodePatch( override fun execute(context: BytecodeContext) { UserWasInShortsABConfigFingerprint.result?.let { - val insertMethod = context.toMethodWalker(it.method) - .nextMethod(it.scanResult.patternScanResult!!.startIndex, true) - .getMethod() as MutableMethod + val walkerMethod = it.getWalkerMethod(context, it.scanResult.patternScanResult!!.startIndex) // This method will only be called for the user being A/B tested. // Presumably a method that processes the ProtoDataStore value (boolean) for the 'user_was_in_shorts' key. - insertMethod.apply { + walkerMethod.apply { val insertIndex = getTargetIndex(Opcode.IGET_OBJECT) val insertRegister = getInstruction(insertIndex).registerA addInstructionsWithLabels( insertIndex, """ - invoke-static {}, $SHORTS->disableResumingStartupShortsPlayer()Z + invoke-static {}, $SHORTS_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z move-result v$insertRegister if-eqz v$insertRegister, :show const/4 v$insertRegister, 0x0 @@ -102,7 +69,7 @@ object DisableResumingShortsOnStartupPatch : BytecodePatch( addInstructionsWithLabels( targetIndex + 1, """ - invoke-static {}, $SHORTS->disableResumingStartupShortsPlayer()Z + invoke-static {}, $SHORTS_CLASS_DESCRIPTOR->disableResumingStartupShortsPlayer()Z move-result v${replaceInstruction.registerA} if-eqz v${replaceInstruction.registerA}, :show return-void diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/fingerprints/UserWasInShortsABConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/fingerprints/UserWasInShortsABConfigFingerprint.kt index 7354a9dfe..4d822f615 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/fingerprints/UserWasInShortsABConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/fingerprints/UserWasInShortsABConfigFingerprint.kt @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * This fingerprint is compatible with all YouTube versions after v18.15.40. */ -object UserWasInShortsABConfigFingerprint : MethodFingerprint( +internal object UserWasInShortsABConfigFingerprint : MethodFingerprint( returnType = "V", opcodes = listOf( Opcode.INVOKE_VIRTUAL, diff --git a/src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/fingerprints/UserWasInShortsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/fingerprints/UserWasInShortsFingerprint.kt index 97bda4213..2bcb625f9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/fingerprints/UserWasInShortsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/shorts/startupshortsreset/fingerprints/UserWasInShortsFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object UserWasInShortsFingerprint : MethodFingerprint( +internal object UserWasInShortsFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Ljava/lang/Object;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/SwipeControlsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/SwipeControlsPatch.kt index 72352d37b..5eb8a21b1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/SwipeControlsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/SwipeControlsPatch.kt @@ -4,14 +4,12 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod.Companion.toMutable import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.swipe.controls.fingerprints.FullScreenEngagementOverlayFingerprint import app.revanced.patches.youtube.swipe.controls.fingerprints.HDRBrightnessFingerprint import app.revanced.patches.youtube.swipe.controls.fingerprints.SwipeControlsHostActivityFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.SWIPE_PATH import app.revanced.patches.youtube.utils.lockmodestate.LockModeStateHookPatch import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch @@ -25,55 +23,26 @@ import app.revanced.util.ResourceGroup import app.revanced.util.copyResources import app.revanced.util.exception import app.revanced.util.getWideLiteralInstructionIndex +import app.revanced.util.patch.BaseBytecodePatch import app.revanced.util.transformMethods import app.revanced.util.traverseClassHierarchy import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.immutable.ImmutableMethod -@Patch( +@Suppress("unused") +object SwipeControlsPatch : BaseBytecodePatch( name = "Swipe controls", description = "Adds options to enable and configure volume and brightness swipe controls.", - dependencies = [ + dependencies = setOf( LockModeStateHookPatch::class, MainActivityResolvePatch::class, PlayerTypeHookPatch::class, SettingsPatch::class, SharedResourceIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object SwipeControlsPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( FullScreenEngagementOverlayFingerprint, HDRBrightnessFingerprint, SwipeControlsHostActivityFingerprint @@ -140,7 +109,7 @@ object SwipeControlsPatch : BytecodePatch( "SETTINGS: DISABLE_HDR_BRIGHTNESS" ) ) - } + } // no exceptions are raised for compatibility with all versions. /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/FullScreenEngagementOverlayFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/FullScreenEngagementOverlayFingerprint.kt index bfab25f8d..6794f4af9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/FullScreenEngagementOverlayFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/FullScreenEngagementOverlayFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.swipe.controls.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.FullScreenEngagementOverlay import app.revanced.util.fingerprint.LiteralValueFingerprint -object FullScreenEngagementOverlayFingerprint : LiteralValueFingerprint( +internal object FullScreenEngagementOverlayFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { FullScreenEngagementOverlay } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/HDRBrightnessFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/HDRBrightnessFingerprint.kt index 5328fdb9e..84ef212eb 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/HDRBrightnessFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/HDRBrightnessFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.swipe.controls.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object HDRBrightnessFingerprint : MethodFingerprint( +internal object HDRBrightnessFingerprint : MethodFingerprint( returnType = "V", strings = listOf("mediaViewambientBrightnessSensor") ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/SwipeControlsHostActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/SwipeControlsHostActivityFingerprint.kt index 281694937..543596afa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/SwipeControlsHostActivityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/swipe/controls/fingerprints/SwipeControlsHostActivityFingerprint.kt @@ -2,12 +2,13 @@ package app.revanced.patches.youtube.swipe.controls.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.INTEGRATIONS_PATH import com.android.tools.smali.dexlib2.AccessFlags -object SwipeControlsHostActivityFingerprint : MethodFingerprint( +internal object SwipeControlsHostActivityFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, parameters = emptyList(), customFingerprint = { methodDef, _ -> - methodDef.definingClass == "Lapp/revanced/integrations/youtube/swipecontrols/SwipeControlsHostActivity;" + methodDef.definingClass == "$INTEGRATIONS_PATH/swipecontrols/SwipeControlsHostActivity;" } ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/browseid/fingerprints/BrowseIdClassFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/browseid/fingerprints/BrowseIdClassFingerprint.kt index d9bba4002..711410ba4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/browseid/fingerprints/BrowseIdClassFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/browseid/fingerprints/BrowseIdClassFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object BrowseIdClassFingerprint : MethodFingerprint( +internal object BrowseIdClassFingerprint : MethodFingerprint( returnType = "Ljava/lang/Object;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL or AccessFlags.SYNTHETIC, parameters = listOf("Ljava/lang/Object;", "L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/DisableControlsOverlayConfigPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/ControlsOverlayConfigPatch.kt similarity index 95% rename from src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/DisableControlsOverlayConfigPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/ControlsOverlayConfigPatch.kt index 3d04c8064..fdc4281a3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/DisableControlsOverlayConfigPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/ControlsOverlayConfigPatch.kt @@ -7,7 +7,7 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patches.youtube.utils.controlsoverlay.fingerprints.ControlsOverlayConfigFingerprint import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -object DisableControlsOverlayConfigPatch : BytecodePatch( +object ControlsOverlayConfigPatch : BytecodePatch( setOf(ControlsOverlayConfigFingerprint) ) { override fun execute(context: BytecodeContext) { diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/fingerprints/ControlsOverlayConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/fingerprints/ControlsOverlayConfigFingerprint.kt index 008b4149b..ffead17cc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/fingerprints/ControlsOverlayConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/controlsoverlay/fingerprints/ControlsOverlayConfigFingerprint.kt @@ -8,7 +8,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint * When this value is TRUE, new control overlay is used. * In this case, the associated patches no longer work, so set this value to FALSE. */ -object ControlsOverlayConfigFingerprint : LiteralValueFingerprint( +internal object ControlsOverlayConfigFingerprint : LiteralValueFingerprint( returnType = "Z", literalSupplier = { 45427491 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/LayoutConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/LayoutConstructorFingerprint.kt index bd8d8e128..da7a073f5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/LayoutConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/LayoutConstructorFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object LayoutConstructorFingerprint : MethodFingerprint( +internal object LayoutConstructorFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/LayoutSwitchFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/LayoutSwitchFingerprint.kt index 235568e9e..6cf923175 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/LayoutSwitchFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/LayoutSwitchFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object LayoutSwitchFingerprint : MethodFingerprint( +internal object LayoutSwitchFingerprint : MethodFingerprint( returnType = "I", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/NewVideoQualityChangedFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/NewVideoQualityChangedFingerprint.kt index c9bf5fc33..28d8cb7ff 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/NewVideoQualityChangedFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/NewVideoQualityChangedFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object NewVideoQualityChangedFingerprint : MethodFingerprint( +internal object NewVideoQualityChangedFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/OrganicPlaybackContextModelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/OrganicPlaybackContextModelFingerprint.kt index eef769a5a..22e7a7c82 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/OrganicPlaybackContextModelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/OrganicPlaybackContextModelFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.utils.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object OrganicPlaybackContextModelFingerprint : MethodFingerprint( +internal object OrganicPlaybackContextModelFingerprint : MethodFingerprint( returnType = "V", strings = listOf("Null contentCpn") ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PivotBarCreateButtonViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PivotBarCreateButtonViewFingerprint.kt index 1a4acc547..04e406e4b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PivotBarCreateButtonViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PivotBarCreateButtonViewFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Image import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object PivotBarCreateButtonViewFingerprint : LiteralValueFingerprint( +internal object PivotBarCreateButtonViewFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, literalSupplier = { ImageOnlyTab } diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerControlsVisibilityModelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerControlsVisibilityModelFingerprint.kt index 984961afd..25a7fce73 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerControlsVisibilityModelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerControlsVisibilityModelFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.utils.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object PlayerControlsVisibilityModelFingerprint : MethodFingerprint( +internal object PlayerControlsVisibilityModelFingerprint : MethodFingerprint( opcodes = listOf(Opcode.INVOKE_DIRECT_RANGE), strings = listOf("Missing required properties:", "hasNext", "hasPrevious") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerSeekbarColorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerSeekbarColorFingerprint.kt index 74ffca3a8..e14a7ad92 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerSeekbarColorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerSeekbarColorFingerprint.kt @@ -7,7 +7,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Inlin import app.revanced.util.containsWideLiteralInstructionIndex import com.android.tools.smali.dexlib2.AccessFlags -object PlayerSeekbarColorFingerprint : MethodFingerprint( +internal object PlayerSeekbarColorFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, customFingerprint = { methodDef, _ -> diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/QualityMenuViewInflateFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/QualityMenuViewInflateFingerprint.kt index 5bd9e0b15..b303827a5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/QualityMenuViewInflateFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/QualityMenuViewInflateFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object QualityMenuViewInflateFingerprint : LiteralValueFingerprint( +internal object QualityMenuViewInflateFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "L", "L"), returnType = "L", diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/SeekbarFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/SeekbarFingerprint.kt index 1b0399594..466773e6a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/SeekbarFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/SeekbarFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.utils.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object SeekbarFingerprint : MethodFingerprint( +internal object SeekbarFingerprint : MethodFingerprint( returnType = "V", strings = listOf("timed_markers_width") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/SeekbarOnDrawFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/SeekbarOnDrawFingerprint.kt index 4d8abd387..b7e4367b6 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/SeekbarOnDrawFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/SeekbarOnDrawFingerprint.kt @@ -2,6 +2,6 @@ package app.revanced.patches.youtube.utils.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object SeekbarOnDrawFingerprint : MethodFingerprint( +internal object SeekbarOnDrawFingerprint : MethodFingerprint( customFingerprint = { methodDef, _ -> methodDef.name == "onDraw" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/ThumbnailPreviewConfigFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/ThumbnailPreviewConfigFingerprint.kt index 1d9f3e56d..60c0b8d95 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/ThumbnailPreviewConfigFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/ThumbnailPreviewConfigFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.utils.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint -object ThumbnailPreviewConfigFingerprint : LiteralValueFingerprint( +internal object ThumbnailPreviewConfigFingerprint : LiteralValueFingerprint( returnType = "Z", parameters = emptyList(), literalSupplier = { 45398577 } diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/TotalTimeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/TotalTimeFingerprint.kt index db1477120..bc5601669 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/TotalTimeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/TotalTimeFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.utils.fingerprints import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.TotalTime import app.revanced.util.fingerprint.LiteralValueFingerprint -object TotalTimeFingerprint : LiteralValueFingerprint( +internal object TotalTimeFingerprint : LiteralValueFingerprint( returnType = "V", literalSupplier = { TotalTime } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/VideoEndFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/VideoEndFingerprint.kt index 5c96f66ea..fea4ffb05 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/VideoEndFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/VideoEndFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.utils.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object VideoEndFingerprint : MethodFingerprint( +internal object VideoEndFingerprint : MethodFingerprint( opcodes = listOf( Opcode.INVOKE_VIRTUAL, Opcode.INVOKE_VIRTUAL_RANGE, diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/VideoQualitySetterFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/VideoQualitySetterFingerprint.kt index 9ee8ccdab..605f5f78f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/VideoQualitySetterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/VideoQualitySetterFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object VideoQualitySetterFingerprint : MethodFingerprint( +internal object VideoQualitySetterFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/YouTubeControlsOverlayFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/YouTubeControlsOverlayFingerprint.kt index 9c9aaf635..801a7e2bd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/YouTubeControlsOverlayFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/YouTubeControlsOverlayFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object YouTubeControlsOverlayFingerprint : LiteralValueFingerprint( +internal object YouTubeControlsOverlayFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/DoubleBackToClosePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/DoubleBackToClosePatch.kt index 35f2d8181..6e4a989c8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/DoubleBackToClosePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/DoubleBackToClosePatch.kt @@ -11,6 +11,7 @@ import app.revanced.patches.youtube.utils.fix.doublebacktoclose.fingerprint.Scro import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch import app.revanced.util.exception +import app.revanced.util.getWalkerMethod @Patch(dependencies = [MainActivityResolvePatch::class]) object DoubleBackToClosePatch : BytecodePatch( @@ -34,13 +35,10 @@ object DoubleBackToClosePatch : BytecodePatch( * Inject the methods which start of ScrollView */ ScrollPositionFingerprint.result?.let { - val insertMethod = context.toMethodWalker(it.method) - .nextMethod(it.scanResult.patternScanResult!!.startIndex + 1, true) - .getMethod() as MutableMethod + val walkerMethod = it.getWalkerMethod(context, it.scanResult.patternScanResult!!.startIndex + 1) + val insertIndex = walkerMethod.implementation!!.instructions.size - 1 - 1 - val insertIndex = insertMethod.implementation!!.instructions.size - 1 - 1 - - insertMethod.injectScrollView(insertIndex, "onStartScrollView") + walkerMethod.injectScrollView(insertIndex, "onStartScrollView") } ?: throw ScrollPositionFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/ScrollPositionFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/ScrollPositionFingerprint.kt index 9388e8fa2..943ec7ba3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/ScrollPositionFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/ScrollPositionFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ScrollPositionFingerprint : MethodFingerprint( +internal object ScrollPositionFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/ScrollTopFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/ScrollTopFingerprint.kt index 288431dff..5dbe47183 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/ScrollTopFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/ScrollTopFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ScrollTopFingerprint : MethodFingerprint( +internal object ScrollTopFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/ScrollTopParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/ScrollTopParentFingerprint.kt index c2f7c82e1..e80b99545 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/ScrollTopParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/doublebacktoclose/fingerprint/ScrollTopParentFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ScrollTopParentFingerprint : MethodFingerprint( +internal object ScrollTopParentFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/fullscreen/FullscreenButtonViewStubPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/fullscreen/FullscreenButtonViewStubPatch.kt new file mode 100644 index 000000000..3a6b42c9e --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/fullscreen/FullscreenButtonViewStubPatch.kt @@ -0,0 +1,39 @@ +package app.revanced.patches.youtube.utils.fix.fullscreen + +import app.revanced.patcher.data.BytecodeContext +import app.revanced.patcher.extensions.InstructionExtensions.addInstruction +import app.revanced.patcher.extensions.InstructionExtensions.getInstruction +import app.revanced.patcher.patch.BytecodePatch +import app.revanced.patcher.patch.annotation.Patch +import app.revanced.patches.youtube.utils.fix.fullscreen.fingerprints.FullscreenButtonViewStubFingerprint +import app.revanced.util.getTargetIndex +import app.revanced.util.getWideLiteralInstructionIndex +import com.android.tools.smali.dexlib2.Opcode +import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction + +@Patch( + description = "Fixes an issue where overlay button patches were broken by the new layout." +) +object FullscreenButtonViewStubPatch : BytecodePatch( + setOf(FullscreenButtonViewStubFingerprint) +) { + override fun execute(context: BytecodeContext) { + + /** + * This issue only affects some versions of YouTube. + * Therefore, this patch only applies to versions that can resolve this fingerprint. + */ + FullscreenButtonViewStubFingerprint.result?.let { + it.mutableMethod.apply { + val targetIndex = getTargetIndex(getWideLiteralInstructionIndex(45617294), Opcode.MOVE_RESULT) + val targetRegister = getInstruction(targetIndex).registerA + + addInstruction( + targetIndex + 1, + "const/4 v$targetRegister, 0x0" + ) + } + } + + } +} diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/fullscreen/fingerprints/FullscreenButtonViewStubFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/fullscreen/fingerprints/FullscreenButtonViewStubFingerprint.kt new file mode 100644 index 000000000..3822ad752 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/fullscreen/fingerprints/FullscreenButtonViewStubFingerprint.kt @@ -0,0 +1,8 @@ +package app.revanced.patches.youtube.utils.fix.fullscreen.fingerprints + +import app.revanced.util.fingerprint.LiteralValueFingerprint + +internal object FullscreenButtonViewStubFingerprint : LiteralValueFingerprint( + returnType = "Z", + literalSupplier = { 45617294 } +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/parameter/SpoofPlayerParameterPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/parameter/SpoofPlayerParameterPatch.kt index 249474460..6b95feb31 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/parameter/SpoofPlayerParameterPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/parameter/SpoofPlayerParameterPatch.kt @@ -6,9 +6,6 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstructionsWith import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.extensions.InstructionExtensions.removeInstruction import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel import app.revanced.patches.youtube.utils.fix.parameter.fingerprints.ParamsMapPutFingerprint import app.revanced.patches.youtube.utils.fix.parameter.fingerprints.PlayerResponseModelGeneralStoryboardRendererFingerprint @@ -20,58 +17,29 @@ import app.revanced.patches.youtube.utils.fix.parameter.fingerprints.StoryboardR import app.revanced.patches.youtube.utils.fix.parameter.fingerprints.StoryboardRendererSpecFingerprint import app.revanced.patches.youtube.utils.fix.parameter.fingerprints.StoryboardThumbnailFingerprint import app.revanced.patches.youtube.utils.fix.parameter.fingerprints.StoryboardThumbnailParentFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.MISC_PATH import app.revanced.patches.youtube.utils.playerresponse.PlayerResponsePatch import app.revanced.patches.youtube.utils.playertype.PlayerTypeHookPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.videoid.general.VideoIdPatch import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object SpoofPlayerParameterPatch : BaseBytecodePatch( name = "Spoof player parameters", description = "Adds options to spoof player parameters to prevent playback issues.", - dependencies = [ + dependencies = setOf( PlayerTypeHookPatch::class, PlayerResponsePatch::class, VideoIdPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], - use = false -) -@Suppress("unused") -object SpoofPlayerParameterPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( ParamsMapPutFingerprint, PlayerResponseModelGeneralStoryboardRendererFingerprint, PlayerResponseModelLiveStreamStoryboardRendererFingerprint, @@ -81,7 +49,8 @@ object SpoofPlayerParameterPatch : BytecodePatch( StoryboardRendererDecoderSpecFingerprint, StoryboardRendererSpecFingerprint, StoryboardThumbnailParentFingerprint - ) + ), + use = false ) { private const val INTEGRATIONS_CLASS_DESCRIPTOR = "$MISC_PATH/SpoofPlayerParameterPatch;" diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/shortsplayback/fingerprints/ShortsPlaybackFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/shortsplayback/fingerprints/ShortsPlaybackFingerprint.kt index c3446ed30..8b72a0269 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/shortsplayback/fingerprints/ShortsPlaybackFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/shortsplayback/fingerprints/ShortsPlaybackFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object ShortsPlaybackFingerprint : LiteralValueFingerprint( +internal object ShortsPlaybackFingerprint : LiteralValueFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, literalSupplier = { 45387052 } diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/swiperefresh/fingerprint/SwipeRefreshLayoutFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/swiperefresh/fingerprint/SwipeRefreshLayoutFingerprint.kt index 31ee4e9f7..20f687022 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fix/swiperefresh/fingerprint/SwipeRefreshLayoutFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/fix/swiperefresh/fingerprint/SwipeRefreshLayoutFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SwipeRefreshLayoutFingerprint : MethodFingerprint( +internal object SwipeRefreshLayoutFingerprint : MethodFingerprint( returnType = "Z", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/gms/GmsCoreSupportPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/gms/GmsCoreSupportPatch.kt index 5c4ab3526..e4559d588 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/gms/GmsCoreSupportPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/gms/GmsCoreSupportPatch.kt @@ -4,6 +4,7 @@ import app.revanced.patches.shared.gms.BaseGmsCoreSupportPatch import app.revanced.patches.shared.packagename.PackageNamePatch import app.revanced.patches.shared.packagename.PackageNamePatch.ORIGINAL_PACKAGE_NAME_YOUTUBE import app.revanced.patches.youtube.utils.fix.clientspoof.ClientSpoofPatch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.IntegrationsPatch import app.revanced.patches.youtube.utils.mainactivity.fingerprints.MainActivityFingerprint import app.revanced.patches.youtube.utils.settings.SettingsPatch @@ -15,33 +16,5 @@ object GmsCoreSupportPatch : BaseGmsCoreSupportPatch( integrationsPatchDependency = IntegrationsPatch::class, dependencies = setOf(ClientSpoofPatch::class, PackageNamePatch::class, SettingsPatch::class), gmsCoreSupportResourcePatch = GmsCoreSupportResourcePatch, - compatiblePackages = setOf( - CompatiblePackage( - "com.google.android.youtube", - setOf( - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ), - ), - ) + compatiblePackages = COMPATIBLE_PACKAGE ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/Constants.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/Constants.kt index ec4a61f0b..fd9e651d7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/Constants.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/Constants.kt @@ -1,5 +1,7 @@ package app.revanced.patches.youtube.utils.integrations +import app.revanced.patcher.patch.Patch + @Suppress("MemberVisibilityCanBePrivate") object Constants { const val INTEGRATIONS_PATH = "Lapp/revanced/integrations/youtube" @@ -22,15 +24,45 @@ object Constants { const val UTILS_PATH = "$PATCHES_PATH/utils" const val VIDEO_PATH = "$PATCHES_PATH/video" - const val ALTERNATIVE_THUMBNAILS = "$ALTERNATIVE_THUMBNAILS_PATH/AlternativeThumbnailsPatch;" - const val BOTTOM_PLAYER = "$BOTTOM_PLAYER_PATH/BottomPlayerPatch;" - const val FLYOUT_PANEL = "$FLYOUT_PANEL_PATH/FlyoutPanelPatch;" - const val FULLSCREEN = "$FULLSCREEN_PATH/FullscreenPatch;" - const val GENERAL = "$GENERAL_PATH/GeneralPatch;" - const val NAVIGATION = "$NAVIGATION_PATH/NavigationPatch;" - const val PLAYER = "$PLAYER_PATH/PlayerPatch;" - const val SEEKBAR = "$SEEKBAR_PATH/SeekBarPatch;" - const val SHORTS = "$SHORTS_PATH/ShortsPatch;" + const val ALTERNATIVE_THUMBNAILS_CLASS_DESCRIPTOR = "$ALTERNATIVE_THUMBNAILS_PATH/AlternativeThumbnailsPatch;" + const val BOTTOM_PLAYER_CLASS_DESCRIPTOR = "$BOTTOM_PLAYER_PATH/BottomPlayerPatch;" + const val FLYOUT_PANEL_CLASS_DESCRIPTOR = "$FLYOUT_PANEL_PATH/FlyoutPanelPatch;" + const val FULLSCREEN_CLASS_DESCRIPTOR = "$FULLSCREEN_PATH/FullscreenPatch;" + const val GENERAL_CLASS_DESCRIPTOR = "$GENERAL_PATH/GeneralPatch;" + const val NAVIGATION_CLASS_DESCRIPTOR = "$NAVIGATION_PATH/NavigationPatch;" + const val PLAYER_CLASS_DESCRIPTOR = "$PLAYER_PATH/PlayerPatch;" + const val SEEKBAR_CLASS_DESCRIPTOR = "$SEEKBAR_PATH/SeekBarPatch;" + const val SHORTS_CLASS_DESCRIPTOR = "$SHORTS_PATH/ShortsPatch;" + + val COMPATIBLE_PACKAGE = setOf( + Patch.CompatiblePackage( + "com.google.android.youtube", + setOf( + "18.29.38", + "18.30.37", + "18.31.40", + "18.32.39", + "18.33.40", + "18.34.38", + "18.35.36", + "18.36.39", + "18.37.36", + "18.38.44", + "18.39.41", + "18.40.34", + "18.41.39", + "18.42.41", + "18.43.45", + "18.44.41", + "18.45.43", + "18.46.45", + "18.48.39", + "18.49.37", + "19.01.34", + "19.02.39" + ) + ) + ) val LANGUAGE_LIST = arrayOf( "values", diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/APIPlayerServiceFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/APIPlayerServiceFingerprint.kt index e395e37b1..5d93f43ac 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/APIPlayerServiceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/APIPlayerServiceFingerprint.kt @@ -10,7 +10,7 @@ import com.android.tools.smali.dexlib2.AccessFlags * [EmbeddedPlayerControlsOverlayFingerprint] */ @Suppress("DEPRECATION") -object APIPlayerServiceFingerprint : IntegrationsFingerprint( +internal object APIPlayerServiceFingerprint : IntegrationsFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, customFingerprint = { methodDef, _ -> methodDef.definingClass == "Lcom/google/android/apps/youtube/embeddedplayer/service/service/jar/ApiPlayerService;" }, // Integrations context is the first method parameter. diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/ApplicationInitFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/ApplicationInitFingerprint.kt index 5e0fbd36c..37615f378 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/ApplicationInitFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/ApplicationInitFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.patches.shared.integrations.BaseIntegrationsPatch.Integratio * Hooks the context when the app is launched as a regular application (and is not an embedded video playback). */ @Suppress("DEPRECATION") -object ApplicationInitFingerprint : IntegrationsFingerprint( +internal object ApplicationInitFingerprint : IntegrationsFingerprint( strings = listOf("Application creation", "Application.onCreate"), // Integrations context is the Activity itself. ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt index 65a5988b4..b123eed73 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerControlsOverlayFingerprint.kt @@ -11,7 +11,7 @@ import com.android.tools.smali.dexlib2.AccessFlags * [RemoteEmbedFragmentFingerprint] may be set before this hook is called. */ @Suppress("DEPRECATION") -object EmbeddedPlayerControlsOverlayFingerprint : IntegrationsFingerprint( +internal object EmbeddedPlayerControlsOverlayFingerprint : IntegrationsFingerprint( accessFlags = AccessFlags.PRIVATE or AccessFlags.CONSTRUCTOR, returnType = "V", parameters = listOf("Landroid/content/Context;", "L", "L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerFingerprint.kt index b95c8157d..2a3d73e70 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/EmbeddedPlayerFingerprint.kt @@ -11,7 +11,7 @@ import com.android.tools.smali.dexlib2.AccessFlags * [RemoteEmbedFragmentFingerprint] might be set before this is called. */ @Suppress("DEPRECATION") -object EmbeddedPlayerFingerprint : IntegrationsFingerprint( +internal object EmbeddedPlayerFingerprint : IntegrationsFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, returnType = "L", parameters = listOf("L", "L", "Landroid/content/Context;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt index 102474393..387c11687 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbedFragmentFingerprint.kt @@ -8,7 +8,7 @@ import com.android.tools.smali.dexlib2.AccessFlags * For embedded playback. Likely covers Google Play store and other Google products. */ @Suppress("DEPRECATION") -object RemoteEmbedFragmentFingerprint : IntegrationsFingerprint( +internal object RemoteEmbedFragmentFingerprint : IntegrationsFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, returnType = "V", parameters = listOf("Landroid/content/Context;", "L", "L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt index 20f7d7de8..d695f8f44 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/RemoteEmbeddedPlayerFingerprint.kt @@ -8,7 +8,7 @@ import com.android.tools.smali.dexlib2.AccessFlags * For embedded playback inside 3rd party android app (such as 3rd party Reddit apps). */ @Suppress("DEPRECATION") -object RemoteEmbeddedPlayerFingerprint : IntegrationsFingerprint( +internal object RemoteEmbeddedPlayerFingerprint : IntegrationsFingerprint( accessFlags = AccessFlags.PRIVATE or AccessFlags.CONSTRUCTOR, returnType = "V", parameters = listOf("Landroid/content/Context;", "L", "L", "Z"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/StandalonePlayerActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/StandalonePlayerActivityFingerprint.kt index af5bb17d7..6ceb70643 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/StandalonePlayerActivityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/integrations/fingerprints/StandalonePlayerActivityFingerprint.kt @@ -10,7 +10,7 @@ import app.revanced.patches.shared.integrations.BaseIntegrationsPatch.Integratio * https://developers.google.com/youtube/android/player */ @Suppress("DEPRECATION") -object StandalonePlayerActivityFingerprint : IntegrationsFingerprint( +internal object StandalonePlayerActivityFingerprint : IntegrationsFingerprint( customFingerprint = { methodDef, _ -> methodDef.definingClass == "Lcom/google/android/youtube/api/StandalonePlayerActivity;" && methodDef.name == "onCreate" diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/lockmodestate/fingerprint/LockModeStateFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/lockmodestate/fingerprint/LockModeStateFingerprint.kt index d9f5aa4a9..f8b270332 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/lockmodestate/fingerprint/LockModeStateFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/lockmodestate/fingerprint/LockModeStateFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object LockModeStateFingerprint : MethodFingerprint( +internal object LockModeStateFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC.value, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/mainactivity/fingerprints/MainActivityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/mainactivity/fingerprints/MainActivityFingerprint.kt index f5e0706cf..643f357f8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/mainactivity/fingerprints/MainActivityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/mainactivity/fingerprints/MainActivityFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint * 'WatchWhileActivity' has been renamed to 'MainActivity' in YouTube v18.48.xx+ * This fingerprint was added to prepare for YouTube v18.48.xx+ */ -object MainActivityFingerprint : MethodFingerprint( +internal object MainActivityFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("Landroid/os/Bundle;"), strings = listOf("PostCreateCalledKey"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/navbarindex/fingerprints/MobileTopBarButtonOnClickFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/navbarindex/fingerprints/MobileTopBarButtonOnClickFingerprint.kt index 2879358d1..c9b5a4a64 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/navbarindex/fingerprints/MobileTopBarButtonOnClickFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/navbarindex/fingerprints/MobileTopBarButtonOnClickFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.utils.navbarindex.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint -object MobileTopBarButtonOnClickFingerprint : MethodFingerprint( +internal object MobileTopBarButtonOnClickFingerprint : MethodFingerprint( strings = listOf("MenuButtonRendererKey"), customFingerprint = { methodDef, _ -> methodDef.name == "onClick" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/navbarindex/fingerprints/PivotBarIndexFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/navbarindex/fingerprints/PivotBarIndexFingerprint.kt index 75e4a0326..73c4beaf4 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/navbarindex/fingerprints/PivotBarIndexFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/navbarindex/fingerprints/PivotBarIndexFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object PivotBarIndexFingerprint : MethodFingerprint( +internal object PivotBarIndexFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("I", "Z"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/navbarindex/fingerprints/SettingsActivityOnBackPressedFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/navbarindex/fingerprints/SettingsActivityOnBackPressedFingerprint.kt index 82bbbac33..5a455eb02 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/navbarindex/fingerprints/SettingsActivityOnBackPressedFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/navbarindex/fingerprints/SettingsActivityOnBackPressedFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object SettingsActivityOnBackPressedFingerprint : MethodFingerprint( +internal object SettingsActivityOnBackPressedFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "V", customFingerprint = { methodDef, _ -> diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/OverrideQualityHookPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/OverrideQualityHookPatch.kt index b5c034dfc..1f7ea5a6d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/OverrideQualityHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/OverrideQualityHookPatch.kt @@ -33,6 +33,15 @@ object OverrideQualityHookPatch : BytecodePatch( VideoQualityTextFingerprint ) ) { + private const val INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR = + "$VIDEO_PATH/VideoQualityPatch;" + + private const val INTEGRATIONS_VIDEO_UTILS_CLASS_DESCRIPTOR = + "$INTEGRATIONS_PATH/utils/VideoUtils;" + + private lateinit var objectClass: String + private lateinit var objectMethod: String + override fun execute(context: BytecodeContext) { VideoQualityListFingerprint.result?.let { @@ -41,14 +50,14 @@ object OverrideQualityHookPatch : BytecodePatch( val overrideMethod = it.mutableClass.methods.find { method -> method.parameterTypes.first() == "I" } - QUALITY_CLASS = it.method.definingClass - QUALITY_METHOD = overrideMethod?.name + objectClass = it.method.definingClass + objectMethod = overrideMethod?.name ?: throw PatchException("Failed to find hook method") constructorMethod.apply { addInstruction( 2, - "sput-object p0, $INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR->qualityClass:$QUALITY_CLASS" + "sput-object p0, $INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR->qualityClass:$objectClass" ) } @@ -78,7 +87,7 @@ object OverrideQualityHookPatch : BytecodePatch( ImmutableField( definingClass, "qualityClass", - QUALITY_CLASS, + objectClass, AccessFlags.PUBLIC or AccessFlags.STATIC, null, annotations, @@ -88,8 +97,8 @@ object OverrideQualityHookPatch : BytecodePatch( addInstructions( 0, """ - sget-object v0, $INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR->qualityClass:$QUALITY_CLASS - invoke-virtual {v0, p0}, $QUALITY_CLASS->$QUALITY_METHOD(I)V + sget-object v0, $INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR->qualityClass:$objectClass + invoke-virtual {v0, p0}, $objectClass->$objectMethod(I)V """ ) } @@ -107,13 +116,4 @@ object OverrideQualityHookPatch : BytecodePatch( } } ?: throw VideoQualityTextFingerprint.exception } - - private const val INTEGRATIONS_VIDEO_QUALITY_CLASS_DESCRIPTOR = - "$VIDEO_PATH/VideoQualityPatch;" - - private const val INTEGRATIONS_VIDEO_UTILS_CLASS_DESCRIPTOR = - "$INTEGRATIONS_PATH/utils/VideoUtils;" - - private lateinit var QUALITY_CLASS: String - private lateinit var QUALITY_METHOD: String } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/fingerprints/VideoQualityListFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/fingerprints/VideoQualityListFingerprint.kt index 279501311..e3ab393f7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/fingerprints/VideoQualityListFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/fingerprints/VideoQualityListFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Quali import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object VideoQualityListFingerprint : LiteralValueFingerprint( +internal object VideoQualityListFingerprint : LiteralValueFingerprint( returnType = "V", parameters = listOf("L"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/fingerprints/VideoQualityPatchFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/fingerprints/VideoQualityPatchFingerprint.kt index 6d34cf11e..e89182b35 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/fingerprints/VideoQualityPatchFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/fingerprints/VideoQualityPatchFingerprint.kt @@ -2,14 +2,15 @@ package app.revanced.patches.youtube.utils.overridequality.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.VIDEO_PATH import com.android.tools.smali.dexlib2.AccessFlags -object VideoQualityPatchFingerprint : MethodFingerprint( +internal object VideoQualityPatchFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("I"), customFingerprint = { methodDef, _ -> - methodDef.definingClass == "Lapp/revanced/integrations/youtube/patches/video/VideoQualityPatch;" + methodDef.definingClass == "$VIDEO_PATH/VideoQualityPatch;" && methodDef.name == "overrideQuality" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/fingerprints/VideoQualityTextFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/fingerprints/VideoQualityTextFingerprint.kt index 637505c44..6e78fd0da 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/fingerprints/VideoQualityTextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/overridequality/fingerprints/VideoQualityTextFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object VideoQualityTextFingerprint : MethodFingerprint( +internal object VideoQualityTextFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("[L", "I", "Z"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/OverrideSpeedHookPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/OverrideSpeedHookPatch.kt index 363e19784..286e96c10 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/OverrideSpeedHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/OverrideSpeedHookPatch.kt @@ -35,6 +35,15 @@ object OverrideSpeedHookPatch : BytecodePatch( SpeedClassFingerprint ) ) { + private const val INTEGRATIONS_PLAYBACK_SPEED_CLASS_DESCRIPTOR = + "$VIDEO_PATH/PlaybackSpeedPatch;" + + private const val INTEGRATIONS_VIDEO_UTILS_CLASS_DESCRIPTOR = + "$INTEGRATIONS_PATH/utils/VideoUtils;" + + lateinit var playbackSpeedChangedResult: MethodFingerprintResult + + private lateinit var objectClass: String override fun execute(context: BytecodeContext) { PlaybackSpeedParentFingerprint.result?.let { parentResult -> @@ -104,10 +113,10 @@ object OverrideSpeedHookPatch : BytecodePatch( it.mutableMethod.apply { val index = it.scanResult.patternScanResult!!.endIndex val register = getInstruction(index).registerA - SPEED_CLASS = this.returnType + objectClass = this.returnType replaceInstruction( index, - "sput-object v$register, $INTEGRATIONS_PLAYBACK_SPEED_CLASS_DESCRIPTOR->speedClass:$SPEED_CLASS" + "sput-object v$register, $INTEGRATIONS_PLAYBACK_SPEED_CLASS_DESCRIPTOR->speedClass:$objectClass" ) addInstruction( index + 1, @@ -123,7 +132,7 @@ object OverrideSpeedHookPatch : BytecodePatch( ImmutableField( definingClass, "speedClass", - SPEED_CLASS, + objectClass, AccessFlags.PUBLIC or AccessFlags.STATIC, null, annotations, @@ -133,8 +142,8 @@ object OverrideSpeedHookPatch : BytecodePatch( addInstructions( 0, """ - sget-object v0, $INTEGRATIONS_PLAYBACK_SPEED_CLASS_DESCRIPTOR->speedClass:$SPEED_CLASS - invoke-virtual {v0, p0}, $SPEED_CLASS->overrideSpeed(F)V + sget-object v0, $INTEGRATIONS_PLAYBACK_SPEED_CLASS_DESCRIPTOR->speedClass:$objectClass + invoke-virtual {v0, p0}, $objectClass->overrideSpeed(F)V """ ) } @@ -142,14 +151,4 @@ object OverrideSpeedHookPatch : BytecodePatch( } ?: throw PlaybackSpeedPatchFingerprint.exception } - - private const val INTEGRATIONS_PLAYBACK_SPEED_CLASS_DESCRIPTOR = - "$VIDEO_PATH/PlaybackSpeedPatch;" - - private const val INTEGRATIONS_VIDEO_UTILS_CLASS_DESCRIPTOR = - "$INTEGRATIONS_PATH/utils/VideoUtils;" - - lateinit var playbackSpeedChangedResult: MethodFingerprintResult - - private lateinit var SPEED_CLASS: String } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/PlaybackSpeedChangedFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/PlaybackSpeedChangedFingerprint.kt index b6e5b47f3..abbdf2055 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/PlaybackSpeedChangedFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/PlaybackSpeedChangedFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.utils.overridespeed.fingerprints import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object PlaybackSpeedChangedFingerprint : MethodFingerprint( +internal object PlaybackSpeedChangedFingerprint : MethodFingerprint( opcodes = listOf( Opcode.IGET_OBJECT, Opcode.IF_EQZ, diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/PlaybackSpeedParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/PlaybackSpeedParentFingerprint.kt index 650957e20..2f76e0755 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/PlaybackSpeedParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/PlaybackSpeedParentFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object PlaybackSpeedParentFingerprint : MethodFingerprint( +internal object PlaybackSpeedParentFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L", "L", "[L", "I"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/PlaybackSpeedPatchFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/PlaybackSpeedPatchFingerprint.kt index ffca2d873..232dbcd59 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/PlaybackSpeedPatchFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/PlaybackSpeedPatchFingerprint.kt @@ -2,14 +2,15 @@ package app.revanced.patches.youtube.utils.overridespeed.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.VIDEO_PATH import com.android.tools.smali.dexlib2.AccessFlags -object PlaybackSpeedPatchFingerprint : MethodFingerprint( +internal object PlaybackSpeedPatchFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("F"), customFingerprint = { methodDef, _ -> - methodDef.definingClass == "Lapp/revanced/integrations/youtube/patches/video/PlaybackSpeedPatch;" + methodDef.definingClass == "$VIDEO_PATH/PlaybackSpeedPatch;" && methodDef.name == "overrideSpeed" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/SpeedClassFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/SpeedClassFingerprint.kt index 7c684a3d8..a096857a1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/SpeedClassFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/overridespeed/fingerprints/SpeedClassFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SpeedClassFingerprint : MethodFingerprint( +internal object SpeedClassFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/PlayerControlsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/PlayerControlsPatch.kt index 9f9fcef9f..c9c6665f7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/PlayerControlsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/PlayerControlsPatch.kt @@ -14,7 +14,7 @@ import app.revanced.patches.youtube.utils.fingerprints.YouTubeControlsOverlayFin import app.revanced.patches.youtube.utils.playercontrols.fingerprints.BottomControlsInflateFingerprint import app.revanced.patches.youtube.utils.playercontrols.fingerprints.ControlsLayoutInflateFingerprint import app.revanced.patches.youtube.utils.playercontrols.fingerprints.FullscreenEngagementSpeedEduVisibleFingerprint -import app.revanced.patches.youtube.utils.playercontrols.fingerprints.FullscreenEngagementSpeedEduVisibleParentFingerprint +import app.revanced.patches.youtube.utils.playercontrols.fingerprints.FullscreenEngagementSpeedEduVisibleToStringFingerprint import app.revanced.patches.youtube.utils.playercontrols.fingerprints.PlayerControlsVisibilityFingerprint import app.revanced.patches.youtube.utils.playercontrols.fingerprints.QuickSeekVisibleFingerprint import app.revanced.patches.youtube.utils.playercontrols.fingerprints.SeekEDUVisibleFingerprint @@ -22,11 +22,12 @@ import app.revanced.patches.youtube.utils.playercontrols.fingerprints.UserScrubb import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.util.exception import app.revanced.util.getStringInstructionIndex +import app.revanced.util.getTargetIndexWithReference 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.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -import com.android.tools.smali.dexlib2.iface.instruction.formats.Instruction35c import com.android.tools.smali.dexlib2.iface.reference.Reference @Patch(dependencies = [SharedResourceIdPatch::class]) @@ -34,7 +35,7 @@ object PlayerControlsPatch : BytecodePatch( setOf( BottomControlsInflateFingerprint, ControlsLayoutInflateFingerprint, - FullscreenEngagementSpeedEduVisibleParentFingerprint, + FullscreenEngagementSpeedEduVisibleToStringFingerprint, PlayerControlsVisibilityModelFingerprint, ThumbnailPreviewConfigFingerprint, YouTubeControlsOverlayFingerprint @@ -42,63 +43,31 @@ object PlayerControlsPatch : BytecodePatch( ) { override fun execute(context: BytecodeContext) { - fun MutableMethod.findReference(targetString: String): Reference { - val targetIndex = getStringInstructionIndex(targetString) + 2 - val targetOpcode = getInstruction(targetIndex).opcode + val playerControlsVisibilityModelClass = + PlayerControlsVisibilityModelFingerprint.result?.mutableClass + ?: throw PlayerControlsVisibilityModelFingerprint.exception - if (targetOpcode == Opcode.INVOKE_VIRTUAL) { - val targetRegister = getInstruction(targetIndex).registerD + val youTubeControlsOverlayClass = + YouTubeControlsOverlayFingerprint.result?.mutableClass + ?: throw YouTubeControlsOverlayFingerprint.exception - val instructions = implementation!!.instructions - for ((index, instruction) in instructions.withIndex()) { - if (instruction.opcode != Opcode.IGET_BOOLEAN) continue + QuickSeekVisibleFingerprint.resolve(context, playerControlsVisibilityModelClass) + SeekEDUVisibleFingerprint.resolve(context, playerControlsVisibilityModelClass) + UserScrubbingFingerprint.resolve(context, playerControlsVisibilityModelClass) - if (getInstruction(index).registerA == targetRegister) - return getInstruction(index).reference - } - } else if (targetOpcode == Opcode.IGET_BOOLEAN) { - return getInstruction(targetIndex).reference - } + PlayerControlsVisibilityFingerprint.resolve(context, youTubeControlsOverlayClass) - throw PatchException("Reference not found: $targetString") - } + quickSeekVisibleMutableMethod = QuickSeekVisibleFingerprint.result?.mutableMethod + ?: throw QuickSeekVisibleFingerprint.exception - PlayerControlsVisibilityModelFingerprint.result?.classDef?.let { classDef -> - quickSeekVisibleMutableMethod = - QuickSeekVisibleFingerprint.also { - it.resolve( - context, - classDef - ) - }.result?.mutableMethod ?: throw QuickSeekVisibleFingerprint.exception + seekEDUVisibleMutableMethod = SeekEDUVisibleFingerprint.result?.mutableMethod + ?: throw SeekEDUVisibleFingerprint.exception - seekEDUVisibleMutableMethod = - SeekEDUVisibleFingerprint.also { - it.resolve( - context, - classDef - ) - }.result?.mutableMethod ?: throw SeekEDUVisibleFingerprint.exception + userScrubbingMutableMethod = UserScrubbingFingerprint.result?.mutableMethod + ?: throw UserScrubbingFingerprint.exception - userScrubbingMutableMethod = - UserScrubbingFingerprint.also { - it.resolve( - context, - classDef - ) - }.result?.mutableMethod ?: throw UserScrubbingFingerprint.exception - } ?: throw PlayerControlsVisibilityModelFingerprint.exception - - YouTubeControlsOverlayFingerprint.result?.classDef?.let { classDef -> - playerControlsVisibilityMutableMethod = - PlayerControlsVisibilityFingerprint.also { - it.resolve( - context, - classDef - ) - }.result?.mutableMethod - ?: throw PlayerControlsVisibilityFingerprint.exception - } ?: throw YouTubeControlsOverlayFingerprint.exception + playerControlsVisibilityMutableMethod = PlayerControlsVisibilityFingerprint.result?.mutableMethod + ?: throw PlayerControlsVisibilityFingerprint.exception controlsLayoutInflateResult = ControlsLayoutInflateFingerprint.result @@ -108,22 +77,17 @@ object PlayerControlsPatch : BytecodePatch( BottomControlsInflateFingerprint.result ?: throw BottomControlsInflateFingerprint.exception - FullscreenEngagementSpeedEduVisibleParentFingerprint.result?.let { parentResult -> - parentResult.mutableMethod.apply { + FullscreenEngagementSpeedEduVisibleToStringFingerprint.result?.let { + FullscreenEngagementSpeedEduVisibleFingerprint.resolve(context, it.classDef) + fullscreenEngagementSpeedEduVisibleMutableMethod = FullscreenEngagementSpeedEduVisibleFingerprint.result?.mutableMethod + ?: throw FullscreenEngagementSpeedEduVisibleFingerprint.exception + + it.mutableMethod.apply { fullscreenEngagementViewVisibleReference = findReference(", isFullscreenEngagementViewVisible=") speedEDUVisibleReference = findReference(", isSpeedmasterEDUVisible=") } - - fullscreenEngagementSpeedEduVisibleMutableMethod = - FullscreenEngagementSpeedEduVisibleFingerprint.also { - it.resolve( - context, - parentResult.classDef - ) - }.result?.mutableMethod - ?: throw FullscreenEngagementSpeedEduVisibleFingerprint.exception - } ?: throw FullscreenEngagementSpeedEduVisibleParentFingerprint.exception + } ?: throw FullscreenEngagementSpeedEduVisibleToStringFingerprint.exception ThumbnailPreviewConfigFingerprint.result?.let { it.mutableMethod.apply { @@ -150,13 +114,38 @@ object PlayerControlsPatch : BytecodePatch( private lateinit var fullscreenEngagementViewVisibleReference: Reference private lateinit var speedEDUVisibleReference: Reference - private fun injectBigBoardsVisibilityCall(descriptor: String) { - bigBoardsVisibilityMutableMethod.apply { - addInstruction( - 1, - "invoke-static {v0}, $descriptor->changeVisibilityNegatedImmediate(Z)V" + private fun MutableMethod.findReference(targetString: String): Reference { + val stringIndex = getStringInstructionIndex(targetString) + if (stringIndex > 0) { + val appendIndex = getTargetIndexWithReference( + stringIndex, + "Ljava/lang/StringBuilder;->append(Z)Ljava/lang/StringBuilder;" ) + if (appendIndex > 0) { + val booleanRegister = getInstruction(appendIndex).registerD + + for (index in appendIndex downTo 0) { + val opcode = getInstruction(index).opcode + if (opcode != Opcode.IGET_BOOLEAN) + continue + + val register = getInstruction(index).registerA + if (register != booleanRegister) + continue + + return getInstruction(index).reference + } + } } + + throw PatchException("Reference not found: $targetString") + } + + private fun injectBigBoardsVisibilityCall(descriptor: String) { + bigBoardsVisibilityMutableMethod.addInstruction( + 1, + "invoke-static {v0}, $descriptor->changeVisibilityNegatedImmediate(Z)V" + ) } private fun injectFullscreenEngagementSpeedEduViewVisibilityCall( @@ -164,18 +153,13 @@ object PlayerControlsPatch : BytecodePatch( descriptor: String ) { fullscreenEngagementSpeedEduVisibleMutableMethod.apply { - for ((index, instruction) in implementation!!.instructions.withIndex()) { - if (instruction.opcode != Opcode.IPUT_BOOLEAN) continue - if (getInstruction(index).reference != reference) continue + val index = getTargetIndexWithReference(reference.toString()) + val register = getInstruction(index).registerA - val register = getInstruction(index).registerA - - addInstruction( - index, - "invoke-static {v$register}, $descriptor->changeVisibilityNegatedImmediate(Z)V" - ) - break - } + addInstruction( + index, + "invoke-static {v$register}, $descriptor->changeVisibilityNegatedImmediate(Z)V" + ) } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/BottomControlsInflateFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/BottomControlsInflateFingerprint.kt index 29fc39bcc..a9cc717db 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/BottomControlsInflateFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/BottomControlsInflateFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object BottomControlsInflateFingerprint : LiteralValueFingerprint( +internal object BottomControlsInflateFingerprint : LiteralValueFingerprint( returnType = "Ljava/lang/Object;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL or AccessFlags.SYNTHETIC, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/ControlsLayoutInflateFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/ControlsLayoutInflateFingerprint.kt index cb7fc6807..c837ad9aa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/ControlsLayoutInflateFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/ControlsLayoutInflateFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ControlsLayoutInflateFingerprint : LiteralValueFingerprint( +internal object ControlsLayoutInflateFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleFingerprint.kt index 2dffc9719..91cfb508b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object FullscreenEngagementSpeedEduVisibleFingerprint : MethodFingerprint( +internal object FullscreenEngagementSpeedEduVisibleFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, opcodes = listOf(Opcode.IPUT_BOOLEAN) diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleToStringFingerprint.kt similarity index 82% rename from src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleParentFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleToStringFingerprint.kt index e3f78127d..fe476c10b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/FullscreenEngagementSpeedEduVisibleToStringFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object FullscreenEngagementSpeedEduVisibleParentFingerprint : MethodFingerprint( +internal object FullscreenEngagementSpeedEduVisibleToStringFingerprint : MethodFingerprint( returnType = "Ljava/lang/String;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, strings = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/PlayerControlsVisibilityFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/PlayerControlsVisibilityFingerprint.kt index 40041ab68..792cd2a98 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/PlayerControlsVisibilityFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/PlayerControlsVisibilityFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object PlayerControlsVisibilityFingerprint : MethodFingerprint( +internal object PlayerControlsVisibilityFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.FINAL, parameters = listOf("Z", "Z") diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/QuickSeekVisibleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/QuickSeekVisibleFingerprint.kt index af499667e..ee206a0f1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/QuickSeekVisibleFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/QuickSeekVisibleFingerprint.kt @@ -1,16 +1,11 @@ package app.revanced.patches.youtube.utils.playercontrols.fingerprints -import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction -object QuickSeekVisibleFingerprint : MethodFingerprint( +internal object QuickSeekVisibleFingerprint : LiteralValueFingerprint( returnType = "V", parameters = listOf("Z"), opcodes = listOf(Opcode.OR_INT_LIT16), - customFingerprint = { methodDef, _ -> - methodDef.implementation!!.instructions.any { - ((it as? NarrowLiteralInstruction)?.narrowLiteral == 128) - } - } + literalSupplier = { 128 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SeekEDUVisibleFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SeekEDUVisibleFingerprint.kt index 140233ca9..39e8dc89d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SeekEDUVisibleFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/SeekEDUVisibleFingerprint.kt @@ -1,16 +1,11 @@ package app.revanced.patches.youtube.utils.playercontrols.fingerprints -import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction -object SeekEDUVisibleFingerprint : MethodFingerprint( +internal object SeekEDUVisibleFingerprint : LiteralValueFingerprint( returnType = "V", parameters = listOf("Z"), opcodes = listOf(Opcode.OR_INT_LIT8), - customFingerprint = { methodDef, _ -> - methodDef.implementation!!.instructions.any { - ((it as? NarrowLiteralInstruction)?.narrowLiteral == 32) - } - } + literalSupplier = { 32 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/UserScrubbingFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/UserScrubbingFingerprint.kt index 2d3093822..0371c68a9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/UserScrubbingFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playercontrols/fingerprints/UserScrubbingFingerprint.kt @@ -1,16 +1,11 @@ package app.revanced.patches.youtube.utils.playercontrols.fingerprints -import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -import com.android.tools.smali.dexlib2.iface.instruction.NarrowLiteralInstruction -object UserScrubbingFingerprint : MethodFingerprint( +internal object UserScrubbingFingerprint : LiteralValueFingerprint( returnType = "V", parameters = listOf("Z"), opcodes = listOf(Opcode.OR_INT_LIT8), - customFingerprint = { methodDef, _ -> - methodDef.implementation!!.instructions.any { - ((it as? NarrowLiteralInstruction)?.narrowLiteral == 64) - } - } + literalSupplier = { 64 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playerresponse/PlayerResponsePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playerresponse/PlayerResponsePatch.kt index 2fa7405ae..00d34246e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playerresponse/PlayerResponsePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playerresponse/PlayerResponsePatch.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.youtube.utils.fingerprints.PlayerParameterBuilderFingerprint +import app.revanced.patches.youtube.utils.playerresponse.fingerprints.PlayerParameterBuilderFingerprint import app.revanced.util.exception import java.io.Closeable diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerParameterBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playerresponse/fingerprints/PlayerParameterBuilderFingerprint.kt similarity index 82% rename from src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerParameterBuilderFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/utils/playerresponse/fingerprints/PlayerParameterBuilderFingerprint.kt index 4d4ac0ecc..eb7e3c18f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/PlayerParameterBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playerresponse/fingerprints/PlayerParameterBuilderFingerprint.kt @@ -1,10 +1,10 @@ -package app.revanced.patches.youtube.utils.fingerprints +package app.revanced.patches.youtube.utils.playerresponse.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object PlayerParameterBuilderFingerprint : MethodFingerprint( +internal object PlayerParameterBuilderFingerprint : MethodFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, returnType = "L", parameters = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/PlayerTypeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/PlayerTypeFingerprint.kt index 296e0294d..739b732aa 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/PlayerTypeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/PlayerTypeFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object PlayerTypeFingerprint : MethodFingerprint( +internal object PlayerTypeFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/VideoStateFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/VideoStateFingerprint.kt index 7ea8f138a..331a79f96 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/VideoStateFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/playertype/fingerprint/VideoStateFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object VideoStateFingerprint : MethodFingerprint( +internal object VideoStateFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/quickactions/QuickActionsHookPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/quickactions/QuickActionsHookPatch.kt index 4b1775a6e..09d59d2ec 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/quickactions/QuickActionsHookPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/quickactions/QuickActionsHookPatch.kt @@ -6,12 +6,11 @@ import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod -import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN +import app.revanced.patches.youtube.utils.integrations.Constants.FULLSCREEN_CLASS_DESCRIPTOR import app.revanced.patches.youtube.utils.quickactions.fingerprints.QuickActionsElementFingerprint import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.QuickActionsElementContainer import app.revanced.util.exception -import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.WideLiteralInstruction @@ -27,21 +26,19 @@ object QuickActionsHookPatch : BytecodePatch( QuickActionsElementFingerprint.result?.let { it.mutableMethod.apply { insertMethod = this - for (index in implementation!!.instructions.size - 1 downTo 0) { - if (getInstruction(index).opcode == Opcode.CONST && (getInstruction(index) as WideLiteralInstruction).wideLiteral == QuickActionsElementContainer) { - insertIndex = index + 3 - insertRegister = - getInstruction(index + 2).registerA - - addInstruction( - insertIndex, - "invoke-static {v$insertRegister}, $FULLSCREEN->hideQuickActions(Landroid/view/View;)V" - ) - insertIndex += 2 - - break + val containerCalls = implementation!!.instructions.withIndex() + .filter { instruction -> + (instruction.value as? WideLiteralInstruction)?.wideLiteral == QuickActionsElementContainer } - } + val constIndex = containerCalls.elementAt(containerCalls.size - 1).index + insertRegister = + getInstruction(constIndex + 2).registerA + + addInstruction( + constIndex + 3, + "invoke-static {v$insertRegister}, $FULLSCREEN_CLASS_DESCRIPTOR->hideQuickActions(Landroid/view/View;)V" + ) + insertIndex = constIndex + 5 } } ?: throw QuickActionsElementFingerprint.exception } @@ -50,7 +47,7 @@ object QuickActionsHookPatch : BytecodePatch( insertMethod.apply { addInstruction( insertIndex, - "invoke-static {v$insertRegister}, $FULLSCREEN->setQuickActionMargin(Landroid/widget/FrameLayout;)V" + "invoke-static {v$insertRegister}, $FULLSCREEN_CLASS_DESCRIPTOR->setQuickActionMargin(Landroid/widget/FrameLayout;)V" ) } } diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/quickactions/fingerprints/QuickActionsElementFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/quickactions/fingerprints/QuickActionsElementFingerprint.kt index 11110fec4..14025580f 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/quickactions/fingerprints/QuickActionsElementFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/quickactions/fingerprints/QuickActionsElementFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Quick import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object QuickActionsElementFingerprint : LiteralValueFingerprint( +internal object QuickActionsElementFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/View;"), returnType = "V", diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/recyclerview/fingerprints/BottomSheetRecyclerViewBuilderFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/recyclerview/fingerprints/BottomSheetRecyclerViewBuilderFingerprint.kt index 9624e022e..00eb8c26d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/recyclerview/fingerprints/BottomSheetRecyclerViewBuilderFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/recyclerview/fingerprints/BottomSheetRecyclerViewBuilderFingerprint.kt @@ -2,6 +2,6 @@ package app.revanced.patches.youtube.utils.recyclerview.fingerprints import app.revanced.util.fingerprint.LiteralValueFingerprint -object BottomSheetRecyclerViewBuilderFingerprint : LiteralValueFingerprint( +internal object BottomSheetRecyclerViewBuilderFingerprint : LiteralValueFingerprint( literalSupplier = { 45382015 } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/recyclerview/fingerprints/RecyclerViewTreeObserverFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/recyclerview/fingerprints/RecyclerViewTreeObserverFingerprint.kt index b03f0a105..58007cf84 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/recyclerview/fingerprints/RecyclerViewTreeObserverFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/recyclerview/fingerprints/RecyclerViewTreeObserverFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object RecyclerViewTreeObserverFingerprint : MethodFingerprint( +internal object RecyclerViewTreeObserverFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt index 4fbef6ca9..b95e9eb02 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/resourceid/SharedResourceIdPatch.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.data.ResourceContext import app.revanced.patcher.patch.ResourcePatch import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.mapping.ResourceMappingPatch -import app.revanced.patches.shared.mapping.ResourceType +import app.revanced.patches.shared.mapping.ResourceMappingPatch.getId import app.revanced.patches.shared.mapping.ResourceType.COLOR import app.revanced.patches.shared.mapping.ResourceType.DIMEN import app.revanced.patches.shared.mapping.ResourceType.DRAWABLE @@ -16,172 +16,159 @@ import app.revanced.patches.shared.mapping.ResourceType.STYLE @Patch(dependencies = [ResourceMappingPatch::class]) object SharedResourceIdPatch : ResourcePatch() { - var AccountSwitcherAccessibility: Long = -1 - var ActionBarRingo: Long = -1 - var AdAttribution: Long = -1 - var Appearance: Long = -1 - var AppRelatedEndScreenResults: Long = -1 - var AutoNavPreviewStub: Long = -1 - var AutoNavToggle: Long = -1 - var BackgroundCategory: Long = -1 - var Bar: Long = -1 - var BarContainerHeight: Long = -1 - var BottomSheetFooterText: Long = -1 - var BottomUiContainerStub: Long = -1 - var ChannelListSubMenu: Long = -1 - var CompactLink: Long = -1 - var CompactListItem: Long = -1 - var ControlsLayoutStub: Long = -1 - var CoreContainer: Long = -1 - var DarkSplashAnimation: Long = -1 - var DonationCompanion: Long = -1 - var EasySeekEduContainer: Long = -1 - var EditSettingsAction: Long = -1 - var EndScreenElementLayoutCircle: Long = -1 - var EndScreenElementLayoutIcon: Long = -1 - var EndScreenElementLayoutVideo: Long = -1 - var EmojiPickerIcon: Long = -1 - var ExpandButtonDown: Long = -1 - var Fab: Long = -1 - var FadeDurationFast: Long = -1 - var FilterBarHeight: Long = -1 - var FloatyBarTopMargin: Long = -1 - var FullScreenButton: Long = -1 - var FullScreenEngagementOverlay: Long = -1 - var FullScreenEngagementPanel: Long = -1 - var HorizontalCardList: Long = -1 - var ImageOnlyTab: Long = -1 - var InlineTimeBarColorizedBarPlayedColorDark: Long = -1 - var InlineTimeBarPlayedNotHighlightedColor: Long = -1 - var InsetOverlayViewLayout: Long = -1 - var InterstitialsContainer: Long = -1 - var LiveChatButton: Long = -1 - var MenuItemView: Long = -1 - var MusicAppDeeplinkButtonView: Long = -1 - var PosterArtWidthDefault: Long = -1 - var QualityAuto: Long = -1 - var QuickActionsElementContainer: Long = -1 - var ReelDynRemix: Long = -1 - var ReelDynShare: Long = -1 - var ReelForcedMuteButton: Long = -1 - var ReelPivotButton: Long = -1 - var ReelPlayerBadge: Long = -1 - var ReelPlayerBadge2: Long = -1 - var ReelPlayerFooter: Long = -1 - var ReelPlayerInfoPanel: Long = -1 - var ReelPlayerPausedStateButton: Long = -1 - var ReelRightDislikeIcon: Long = -1 - var ReelRightLikeIcon: Long = -1 - var ReelTimeBarPlayedColor: Long = -1 - var RelatedChipCloudMargin: Long = -1 - var RightComment: Long = -1 - var ScrimOverlay: Long = -1 - var Scrubbing: Long = -1 - var SeekUndoEduOverlayStub: Long = -1 - var SettingsBooleanTimeRangeDialog: Long = -1 - var SlidingDialogAnimation: Long = -1 - var SubtitleMenuSettingsFooterInfo: Long = -1 - var SuggestedAction: Long = -1 - var TabsBarTextTabView: Long = -1 - var ToolTipContentView: Long = -1 - var TotalTime: Long = -1 - var TouchArea: Long = -1 - var VideoQualityBottomSheet: Long = -1 - var VideoZoomIndicatorLayout: Long = -1 - var YoutubeControlsOverlay: Long = -1 - var YoutubeControlsOverlaySubtitleButton: Long = -1 - var YtOutlineArrowTimeBlack: Long = -1 - var YtOutlineFireBlack: Long = -1 - var YtOutlineNewSearchBlack: Long = -1 - var YtOutlineSearchBlack: Long = -1 + var AccountSwitcherAccessibility = -1L + var ActionBarRingo = -1L + var AdAttribution = -1L + var Appearance = -1L + var AppRelatedEndScreenResults = -1L + var AutoNavPreviewStub = -1L + var AutoNavToggle = -1L + var BackgroundCategory = -1L + var Bar = -1L + var BarContainerHeight = -1L + var BottomSheetFooterText = -1L + var BottomUiContainerStub = -1L + var ChannelListSubMenu = -1L + var CompactLink = -1L + var CompactListItem = -1L + var ControlsLayoutStub = -1L + var CoreContainer = -1L + var DarkSplashAnimation = -1L + var DonationCompanion = -1L + var EasySeekEduContainer = -1L + var EditSettingsAction = -1L + var EndScreenElementLayoutCircle = -1L + var EndScreenElementLayoutIcon = -1L + var EndScreenElementLayoutVideo = -1L + var EmojiPickerIcon = -1L + var ExpandButtonDown = -1L + var Fab = -1L + var FadeDurationFast = -1L + var FilterBarHeight = -1L + var FloatyBarTopMargin = -1L + var FullScreenButton = -1L + var FullScreenEngagementOverlay = -1L + var FullScreenEngagementPanel = -1L + var HorizontalCardList = -1L + var ImageOnlyTab = -1L + var InlineTimeBarColorizedBarPlayedColorDark = -1L + var InlineTimeBarPlayedNotHighlightedColor = -1L + var InsetOverlayViewLayout = -1L + var InterstitialsContainer = -1L + var LiveChatButton = -1L + var MenuItemView = -1L + var MusicAppDeeplinkButtonView = -1L + var PosterArtWidthDefault = -1L + var QualityAuto = -1L + var QuickActionsElementContainer = -1L + var ReelDynRemix = -1L + var ReelDynShare = -1L + var ReelForcedMuteButton = -1L + var ReelPivotButton = -1L + var ReelPlayerBadge = -1L + var ReelPlayerBadge2 = -1L + var ReelPlayerFooter = -1L + var ReelPlayerInfoPanel = -1L + var ReelPlayerPausedStateButton = -1L + var ReelRightDislikeIcon = -1L + var ReelRightLikeIcon = -1L + var ReelTimeBarPlayedColor = -1L + var RelatedChipCloudMargin = -1L + var RightComment = -1L + var ScrimOverlay = -1L + var Scrubbing = -1L + var SeekUndoEduOverlayStub = -1L + var SettingsBooleanTimeRangeDialog = -1L + var SlidingDialogAnimation = -1L + var SubtitleMenuSettingsFooterInfo = -1L + var SuggestedAction = -1L + var TabsBarTextTabView = -1L + var ToolTipContentView = -1L + var TotalTime = -1L + var TouchArea = -1L + var VideoQualityBottomSheet = -1L + var VideoZoomIndicatorLayout = -1L + var YoutubeControlsOverlay = -1L + var YoutubeControlsOverlaySubtitleButton = -1L override fun execute(context: ResourceContext) { - fun find(resourceType: ResourceType, resourceName: String) = ResourceMappingPatch - .resourceMappings - .find { it.type == resourceType.value && it.name == resourceName }?.id - ?: -1 - - AccountSwitcherAccessibility = find(STRING, "account_switcher_accessibility_label") - ActionBarRingo = find(LAYOUT, "action_bar_ringo") - AdAttribution = find(ID, "ad_attribution") - Appearance = find(STRING, "app_theme_appearance_dark") - AppRelatedEndScreenResults = find(LAYOUT, "app_related_endscreen_results") - AutoNavPreviewStub = find(ID, "autonav_preview_stub") - AutoNavToggle = find(ID, "autonav_toggle") - BackgroundCategory = find(STRING, "pref_background_and_offline_category") - Bar = find(LAYOUT, "bar") - BarContainerHeight = find(DIMEN, "bar_container_height") - BottomSheetFooterText = find(ID, "bottom_sheet_footer_text") - BottomUiContainerStub = find(ID, "bottom_ui_container_stub") - ChannelListSubMenu = find(LAYOUT, "channel_list_sub_menu") - CompactLink = find(LAYOUT, "compact_link") - CompactListItem = find(LAYOUT, "compact_list_item") - ControlsLayoutStub = find(ID, "controls_layout_stub") - CoreContainer = find(ID, "core_container") - DarkSplashAnimation = find(ID, "dark_splash_animation") - DonationCompanion = find(LAYOUT, "donation_companion") - EasySeekEduContainer = find(ID, "easy_seek_edu_container") - EditSettingsAction = find(STRING, "edit_settings_action") - EndScreenElementLayoutCircle = find(LAYOUT, "endscreen_element_layout_circle") - EndScreenElementLayoutIcon = find(LAYOUT, "endscreen_element_layout_icon") - EndScreenElementLayoutVideo = find(LAYOUT, "endscreen_element_layout_video") - EmojiPickerIcon = find(ID, "emoji_picker_icon") - ExpandButtonDown = find(LAYOUT, "expand_button_down") - Fab = find(ID, "fab") - FadeDurationFast = find(INTEGER, "fade_duration_fast") - FilterBarHeight = find(DIMEN, "filter_bar_height") - FloatyBarTopMargin = find(DIMEN, "floaty_bar_button_top_margin") - FullScreenButton = find(ID, "fullscreen_button") - FullScreenEngagementOverlay = find(LAYOUT, "fullscreen_engagement_overlay") - FullScreenEngagementPanel = find(ID, "fullscreen_engagement_panel_holder") - HorizontalCardList = find(LAYOUT, "horizontal_card_list") - ImageOnlyTab = find(LAYOUT, "image_only_tab") + AccountSwitcherAccessibility = getId(STRING, "account_switcher_accessibility_label") + ActionBarRingo = getId(LAYOUT, "action_bar_ringo") + AdAttribution = getId(ID, "ad_attribution") + Appearance = getId(STRING, "app_theme_appearance_dark") + AppRelatedEndScreenResults = getId(LAYOUT, "app_related_endscreen_results") + AutoNavPreviewStub = getId(ID, "autonav_preview_stub") + AutoNavToggle = getId(ID, "autonav_toggle") + BackgroundCategory = getId(STRING, "pref_background_and_offline_category") + Bar = getId(LAYOUT, "bar") + BarContainerHeight = getId(DIMEN, "bar_container_height") + BottomSheetFooterText = getId(ID, "bottom_sheet_footer_text") + BottomUiContainerStub = getId(ID, "bottom_ui_container_stub") + ChannelListSubMenu = getId(LAYOUT, "channel_list_sub_menu") + CompactLink = getId(LAYOUT, "compact_link") + CompactListItem = getId(LAYOUT, "compact_list_item") + ControlsLayoutStub = getId(ID, "controls_layout_stub") + CoreContainer = getId(ID, "core_container") + DarkSplashAnimation = getId(ID, "dark_splash_animation") + DonationCompanion = getId(LAYOUT, "donation_companion") + EasySeekEduContainer = getId(ID, "easy_seek_edu_container") + EditSettingsAction = getId(STRING, "edit_settings_action") + EndScreenElementLayoutCircle = getId(LAYOUT, "endscreen_element_layout_circle") + EndScreenElementLayoutIcon = getId(LAYOUT, "endscreen_element_layout_icon") + EndScreenElementLayoutVideo = getId(LAYOUT, "endscreen_element_layout_video") + EmojiPickerIcon = getId(ID, "emoji_picker_icon") + ExpandButtonDown = getId(LAYOUT, "expand_button_down") + Fab = getId(ID, "fab") + FadeDurationFast = getId(INTEGER, "fade_duration_fast") + FilterBarHeight = getId(DIMEN, "filter_bar_height") + FloatyBarTopMargin = getId(DIMEN, "floaty_bar_button_top_margin") + FullScreenButton = getId(ID, "fullscreen_button") + FullScreenEngagementOverlay = getId(LAYOUT, "fullscreen_engagement_overlay") + FullScreenEngagementPanel = getId(ID, "fullscreen_engagement_panel_holder") + HorizontalCardList = getId(LAYOUT, "horizontal_card_list") + ImageOnlyTab = getId(LAYOUT, "image_only_tab") InlineTimeBarColorizedBarPlayedColorDark = - find(COLOR, "inline_time_bar_colorized_bar_played_color_dark") + getId(COLOR, "inline_time_bar_colorized_bar_played_color_dark") InlineTimeBarPlayedNotHighlightedColor = - find(COLOR, "inline_time_bar_played_not_highlighted_color") - InsetOverlayViewLayout = find(ID, "inset_overlay_view_layout") - InterstitialsContainer = find(ID, "interstitials_container") - LiveChatButton = find(ID, "live_chat_overlay_button") - MenuItemView = find(ID, "menu_item_view") - MusicAppDeeplinkButtonView = find(ID, "music_app_deeplink_button_view") - PosterArtWidthDefault = find(DIMEN, "poster_art_width_default") - QualityAuto = find(STRING, "quality_auto") - QuickActionsElementContainer = find(ID, "quick_actions_element_container") - ReelDynRemix = find(ID, "reel_dyn_remix") - ReelDynShare = find(ID, "reel_dyn_share") - ReelForcedMuteButton = find(ID, "reel_player_forced_mute_button") - ReelPivotButton = find(ID, "reel_pivot_button") - ReelPlayerBadge = find(ID, "reel_player_badge") - ReelPlayerBadge2 = find(ID, "reel_player_badge2") - ReelPlayerFooter = find(LAYOUT, "reel_player_dyn_footer_vert_stories3") - ReelPlayerInfoPanel = find(ID, "reel_player_info_panel") - ReelPlayerPausedStateButton = find(ID, "reel_player_paused_state_buttons") - ReelRightDislikeIcon = find(DRAWABLE, "reel_right_dislike_icon") - ReelRightLikeIcon = find(DRAWABLE, "reel_right_like_icon") - ReelTimeBarPlayedColor = find(COLOR, "reel_time_bar_played_color") - RelatedChipCloudMargin = find(LAYOUT, "related_chip_cloud_reduced_margins") - RightComment = find(DRAWABLE, "ic_right_comment_32c") - ScrimOverlay = find(ID, "scrim_overlay") - Scrubbing = find(DIMEN, "vertical_touch_offset_to_enter_fine_scrubbing") - SeekUndoEduOverlayStub = find(ID, "seek_undo_edu_overlay_stub") - SettingsBooleanTimeRangeDialog = find(LAYOUT, "setting_boolean_time_range_dialog") - SlidingDialogAnimation = find(STYLE, "SlidingDialogAnimation") - SubtitleMenuSettingsFooterInfo = find(STRING, "subtitle_menu_settings_footer_info") - SuggestedAction = find(LAYOUT, "suggested_action") - TabsBarTextTabView = find(ID, "tabs_bar_text_tab_view") - ToolTipContentView = find(LAYOUT, "tooltip_content_view") - TotalTime = find(STRING, "total_time") - TouchArea = find(ID, "touch_area") - VideoQualityBottomSheet = find(LAYOUT, "video_quality_bottom_sheet_list_fragment_title") - VideoZoomIndicatorLayout = find(ID, "video_zoom_indicator_layout") - YoutubeControlsOverlay = find(ID, "youtube_controls_overlay") - YoutubeControlsOverlaySubtitleButton = find(LAYOUT, "youtube_controls_overlay_subtitle_button") - YtOutlineArrowTimeBlack = find(DRAWABLE, "yt_outline_arrow_time_black_24") - YtOutlineFireBlack = find(DRAWABLE, "yt_outline_fire_black_24") - YtOutlineNewSearchBlack = find(DRAWABLE, "yt_outline_new_search_black_24") - YtOutlineSearchBlack = find(DRAWABLE, "yt_outline_search_black_24") + getId(COLOR, "inline_time_bar_played_not_highlighted_color") + InsetOverlayViewLayout = getId(ID, "inset_overlay_view_layout") + InterstitialsContainer = getId(ID, "interstitials_container") + LiveChatButton = getId(ID, "live_chat_overlay_button") + MenuItemView = getId(ID, "menu_item_view") + MusicAppDeeplinkButtonView = getId(ID, "music_app_deeplink_button_view") + PosterArtWidthDefault = getId(DIMEN, "poster_art_width_default") + QualityAuto = getId(STRING, "quality_auto") + QuickActionsElementContainer = getId(ID, "quick_actions_element_container") + ReelDynRemix = getId(ID, "reel_dyn_remix") + ReelDynShare = getId(ID, "reel_dyn_share") + ReelForcedMuteButton = getId(ID, "reel_player_forced_mute_button") + ReelPivotButton = getId(ID, "reel_pivot_button") + ReelPlayerBadge = getId(ID, "reel_player_badge") + ReelPlayerBadge2 = getId(ID, "reel_player_badge2") + ReelPlayerFooter = getId(LAYOUT, "reel_player_dyn_footer_vert_stories3") + ReelPlayerInfoPanel = getId(ID, "reel_player_info_panel") + ReelPlayerPausedStateButton = getId(ID, "reel_player_paused_state_buttons") + ReelRightDislikeIcon = getId(DRAWABLE, "reel_right_dislike_icon") + ReelRightLikeIcon = getId(DRAWABLE, "reel_right_like_icon") + ReelTimeBarPlayedColor = getId(COLOR, "reel_time_bar_played_color") + RelatedChipCloudMargin = getId(LAYOUT, "related_chip_cloud_reduced_margins") + RightComment = getId(DRAWABLE, "ic_right_comment_32c") + ScrimOverlay = getId(ID, "scrim_overlay") + Scrubbing = getId(DIMEN, "vertical_touch_offset_to_enter_fine_scrubbing") + SeekUndoEduOverlayStub = getId(ID, "seek_undo_edu_overlay_stub") + SettingsBooleanTimeRangeDialog = getId(LAYOUT, "setting_boolean_time_range_dialog") + SlidingDialogAnimation = getId(STYLE, "SlidingDialogAnimation") + SubtitleMenuSettingsFooterInfo = getId(STRING, "subtitle_menu_settings_footer_info") + SuggestedAction = getId(LAYOUT, "suggested_action") + TabsBarTextTabView = getId(ID, "tabs_bar_text_tab_view") + ToolTipContentView = getId(LAYOUT, "tooltip_content_view") + TotalTime = getId(STRING, "total_time") + TouchArea = getId(ID, "touch_area") + VideoQualityBottomSheet = getId(LAYOUT, "video_quality_bottom_sheet_list_fragment_title") + VideoZoomIndicatorLayout = getId(ID, "video_zoom_indicator_layout") + YoutubeControlsOverlay = getId(ID, "youtube_controls_overlay") + YoutubeControlsOverlaySubtitleButton = getId(LAYOUT, "youtube_controls_overlay_subtitle_button") } } \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/ReturnYouTubeDislikePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/ReturnYouTubeDislikePatch.kt index b68f85e27..21bb527ad 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/ReturnYouTubeDislikePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/ReturnYouTubeDislikePatch.kt @@ -4,10 +4,8 @@ import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstructions import app.revanced.patcher.extensions.InstructionExtensions.getInstruction import app.revanced.patcher.fingerprint.MethodFingerprint -import app.revanced.patcher.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.litho.LithoFilterPatch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.COMPONENTS_PATH import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH import app.revanced.patches.youtube.utils.playerresponse.PlayerResponsePatch @@ -22,53 +20,24 @@ import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.patches.youtube.utils.videoid.general.VideoIdPatch import app.revanced.util.exception import app.revanced.util.getTargetIndexWithFieldReferenceType +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.ReferenceInstruction import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object ReturnYouTubeDislikePatch : BaseBytecodePatch( name = "Return YouTube Dislike", description = "Shows the dislike count of videos using the Return YouTube Dislike API.", - dependencies = [ + dependencies = setOf( LithoFilterPatch::class, PlayerResponsePatch::class, ReturnYouTubeDislikeRollingNumberPatch::class, ReturnYouTubeDislikeShortsPatch::class, SettingsPatch::class, VideoIdPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object ReturnYouTubeDislikePatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( DislikeFingerprint, LikeFingerprint, RemoveLikeFingerprint, diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/DislikeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/DislikeFingerprint.kt index 039188223..b2a94a2cd 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/DislikeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/DislikeFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.utils.returnyoutubedislike.general.fingerpr import app.revanced.patcher.fingerprint.MethodFingerprint -object DislikeFingerprint : MethodFingerprint( +internal object DislikeFingerprint : MethodFingerprint( returnType = "V", strings = listOf("like/dislike") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/LikeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/LikeFingerprint.kt index a89cad143..a3ea43072 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/LikeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/LikeFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.utils.returnyoutubedislike.general.fingerpr import app.revanced.patcher.fingerprint.MethodFingerprint -object LikeFingerprint : MethodFingerprint( +internal object LikeFingerprint : MethodFingerprint( returnType = "V", strings = listOf("like/like") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/RemoveLikeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/RemoveLikeFingerprint.kt index 95d8b58a7..b7e6318b9 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/RemoveLikeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/RemoveLikeFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.utils.returnyoutubedislike.general.fingerpr import app.revanced.patcher.fingerprint.MethodFingerprint -object RemoveLikeFingerprint : MethodFingerprint( +internal object RemoveLikeFingerprint : MethodFingerprint( returnType = "V", strings = listOf("like/removelike") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentConstructorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentConstructorFingerprint.kt index 9ca52990b..fea97280e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentConstructorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentConstructorFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object TextComponentConstructorFingerprint : MethodFingerprint( +internal object TextComponentConstructorFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PRIVATE or AccessFlags.CONSTRUCTOR, strings = listOf("TextComponent") diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentContextFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentContextFingerprint.kt index a1fd89d03..85798107a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentContextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/general/fingerprints/TextComponentContextFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object TextComponentContextFingerprint : MethodFingerprint( +internal object TextComponentContextFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PROTECTED or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/ReturnYouTubeDislikeRollingNumberPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/ReturnYouTubeDislikeRollingNumberPatch.kt index e2d0c5b52..684410774 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/ReturnYouTubeDislikeRollingNumberPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/ReturnYouTubeDislikeRollingNumberPatch.kt @@ -9,15 +9,16 @@ import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel -import app.revanced.patches.youtube.utils.fingerprints.RollingNumberTextViewAnimationUpdateFingerprint import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH import app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber.fingerprints.RollingNumberMeasureAnimatedTextFingerprint import app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber.fingerprints.RollingNumberMeasureStaticLabelFingerprint import app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber.fingerprints.RollingNumberMeasureTextParentFingerprint import app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber.fingerprints.RollingNumberSetterFingerprint +import app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber.fingerprints.RollingNumberTextViewAnimationUpdateFingerprint import app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber.fingerprints.RollingNumberTextViewFingerprint import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.exception +import app.revanced.util.getTargetIndex import app.revanced.util.getTargetIndexWithMethodReferenceName import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c @@ -61,10 +62,7 @@ object ReturnYouTubeDislikeRollingNumberPatch : BytecodePatch( rollingNumberClass.methods.find { method -> method.name == "" } ?.apply { - val rollingNumberFieldIndex = - implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.IPUT_OBJECT - } + val rollingNumberFieldIndex = getTargetIndex(Opcode.IPUT_OBJECT) charSequenceFieldReference = getInstruction(rollingNumberFieldIndex).reference } ?: throw PatchException("RollingNumberClass not found!") @@ -107,9 +105,7 @@ object ReturnYouTubeDislikeRollingNumberPatch : BytecodePatch( """ ) - val ifGeIndex = implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.IF_GE - } + val ifGeIndex = getTargetIndex(Opcode.IF_GE) val ifGeInstruction = getInstruction(ifGeIndex) removeInstruction(ifGeIndex) diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberMeasureAnimatedTextFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberMeasureAnimatedTextFingerprint.kt index 6b431193e..12511e972 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberMeasureAnimatedTextFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberMeasureAnimatedTextFingerprint.kt @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * Compatible with YouTube v18.30.xx to v18.49.xx */ -object RollingNumberMeasureAnimatedTextFingerprint : ReferenceFingerprint( +internal object RollingNumberMeasureAnimatedTextFingerprint : ReferenceFingerprint( opcodes = listOf( Opcode.INVOKE_VIRTUAL, Opcode.MOVE_RESULT, diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberMeasureStaticLabelFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberMeasureStaticLabelFingerprint.kt index d1a8af72b..42962381b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberMeasureStaticLabelFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberMeasureStaticLabelFingerprint.kt @@ -8,7 +8,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * Resolves to class found in [RollingNumberMeasureTextParentFingerprint]. */ -object RollingNumberMeasureStaticLabelFingerprint : MethodFingerprint( +internal object RollingNumberMeasureStaticLabelFingerprint : MethodFingerprint( returnType = "F", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Ljava/lang/String;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberMeasureTextParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberMeasureTextParentFingerprint.kt index 18c2652c6..543094858 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberMeasureTextParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberMeasureTextParentFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object RollingNumberMeasureTextParentFingerprint : MethodFingerprint( +internal object RollingNumberMeasureTextParentFingerprint : MethodFingerprint( returnType = "Ljava/lang/String;", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberSetterFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberSetterFingerprint.kt index 560eee0b6..e3f8daff0 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberSetterFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberSetterFingerprint.kt @@ -6,7 +6,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * This fingerprint is compatible with YouTube v18.29.38+ */ -object RollingNumberSetterFingerprint : MethodFingerprint( +internal object RollingNumberSetterFingerprint : MethodFingerprint( opcodes = listOf( Opcode.CHECK_CAST, Opcode.IGET, diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/RollingNumberTextViewAnimationUpdateFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTextViewAnimationUpdateFingerprint.kt similarity index 84% rename from src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/RollingNumberTextViewAnimationUpdateFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTextViewAnimationUpdateFingerprint.kt index 0f619f53f..4d5123040 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/fingerprints/RollingNumberTextViewAnimationUpdateFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTextViewAnimationUpdateFingerprint.kt @@ -1,11 +1,11 @@ -package app.revanced.patches.youtube.utils.fingerprints +package app.revanced.patches.youtube.utils.returnyoutubedislike.rollingnumber.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object RollingNumberTextViewAnimationUpdateFingerprint : MethodFingerprint( +internal object RollingNumberTextViewAnimationUpdateFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/graphics/Bitmap;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTextViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTextViewFingerprint.kt index ba8a76f27..ea0e4bb3b 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTextViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/rollingnumber/fingerprints/RollingNumberTextViewFingerprint.kt @@ -8,7 +8,7 @@ import com.android.tools.smali.dexlib2.Opcode /** * This fingerprint is compatible with YouTube v18.32.39+ */ -object RollingNumberTextViewFingerprint : MethodFingerprint( +internal object RollingNumberTextViewFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L", "F", "F"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/fingerprints/IncognitoFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/fingerprints/IncognitoFingerprint.kt index 8f54bd0bd..260137e95 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/fingerprints/IncognitoFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/fingerprints/IncognitoFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags -object IncognitoFingerprint : MethodFingerprint( +internal object IncognitoFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.CONSTRUCTOR, customFingerprint = { methodDef, _ -> methodDef.definingClass.endsWith("${'$'}AutoValue_AccountIdentity;") } diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/fingerprints/ShortsTextViewFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/fingerprints/ShortsTextViewFingerprint.kt index 08095a23f..ea0693a71 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/fingerprints/ShortsTextViewFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/fingerprints/ShortsTextViewFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.utils.returnyoutubedislike.shorts.fingerpri import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object ShortsTextViewFingerprint : MethodFingerprint( +internal object ShortsTextViewFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("L", "L"), opcodes = listOf( diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/fingerprints/TextComponentSpecFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/fingerprints/TextComponentSpecFingerprint.kt index 05b84d019..bf67e515e 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/fingerprints/TextComponentSpecFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/returnyoutubedislike/shorts/fingerprints/TextComponentSpecFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.utils.returnyoutubedislike.shorts.fingerpri import app.revanced.patcher.fingerprint.MethodFingerprint -object TextComponentSpecFingerprint : MethodFingerprint( +internal object TextComponentSpecFingerprint : MethodFingerprint( returnType = "Ljava/lang/CharSequence;", strings = listOf("Failed to set PB Style Run Extension in TextComponentSpec. Extension id: %s") ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsBytecodePatch.kt index abbf669b8..1a8a6a658 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsBytecodePatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsBytecodePatch.kt @@ -10,7 +10,6 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.shared.mapping.ResourceMappingPatch import app.revanced.patches.youtube.utils.integrations.Constants.INTEGRATIONS_PATH import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH -import app.revanced.patches.youtube.utils.integrations.IntegrationsPatch import app.revanced.patches.youtube.utils.mainactivity.MainActivityResolvePatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.fingerprints.ThemeSetterSystemFingerprint @@ -19,7 +18,6 @@ import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @Patch( dependencies = [ - IntegrationsPatch::class, MainActivityResolvePatch::class, ResourceMappingPatch::class, SharedResourceIdPatch::class diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsPatch.kt index 276b145c0..19a89ffb1 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/SettingsPatch.kt @@ -1,10 +1,8 @@ package app.revanced.patches.youtube.utils.settings import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.shared.mapping.ResourceMappingPatch -import app.revanced.patches.shared.settings.AbstractSettingsResourcePatch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.IntegrationsPatch import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch import app.revanced.patches.youtube.utils.settings.ResourceUtils.addPreference @@ -14,69 +12,40 @@ import app.revanced.patches.youtube.utils.settings.ResourceUtils.updatePatchStat import app.revanced.util.ResourceGroup import app.revanced.util.classLoader import app.revanced.util.copyResources +import app.revanced.util.copyXmlNode +import app.revanced.util.patch.BaseResourcePatch import org.w3c.dom.Element import java.io.Closeable import java.util.concurrent.Executors import java.util.concurrent.TimeUnit import java.util.jar.Manifest -@Patch( +@Suppress("DEPRECATION", "SpellCheckingInspection", "unused") +object SettingsPatch : BaseResourcePatch( name = "Settings", description = "Applies mandatory patches to implement ReVanced Extended settings into the application.", - dependencies = [ + dependencies = setOf( IntegrationsPatch::class, ResourceMappingPatch::class, SharedResourceIdPatch::class, SettingsBytecodePatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ], + ), + compatiblePackages = COMPATIBLE_PACKAGE, requiresIntegrations = true -) -@Suppress("DEPRECATION", "unused") -object SettingsPatch : AbstractSettingsResourcePatch( - "youtube/settings" ), Closeable { private val THREAD_COUNT = Runtime.getRuntime().availableProcessors() private val threadPoolExecutor = Executors.newFixedThreadPool(THREAD_COUNT) internal lateinit var contexts: ResourceContext - internal var upward1831: Boolean = false - internal var upward1834: Boolean = false - internal var upward1839: Boolean = false - internal var upward1849: Boolean = false - internal var upward1902: Boolean = false + internal var upward1831 = false + internal var upward1834 = false + internal var upward1839 = false + internal var upward1849 = false + internal var upward1902 = false + internal var upward1909 = false override fun execute(context: ResourceContext) { - super.execute(context) contexts = context val resourceXmlFile = context["res/values/integers.xml"].readBytes() @@ -107,6 +76,7 @@ object SettingsPatch : AbstractSettingsResourcePatch( upward1839 = 234000000 <= playServicesVersion upward1849 = 235000000 <= playServicesVersion upward1902 = 240204000 < playServicesVersion + upward1909 = 241002000 <= playServicesVersion break } @@ -118,6 +88,15 @@ object SettingsPatch : AbstractSettingsResourcePatch( .also { it.shutdown() } .awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS) + /** + * copy strings and preference + */ + context.copyXmlNode("youtube/settings/host", "values/strings.xml", "resources") + context.copyResources( + "youtube/settings", + ResourceGroup("xml", "revanced_prefs.xml") + ) + /** * create directory for the untranslated language resources */ diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/fingerprints/ThemeSetterSystemFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/fingerprints/ThemeSetterSystemFingerprint.kt index e8eda98cc..0debf02b7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/settings/fingerprints/ThemeSetterSystemFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/settings/fingerprints/ThemeSetterSystemFingerprint.kt @@ -4,7 +4,7 @@ import app.revanced.patches.youtube.utils.resourceid.SharedResourceIdPatch.Appea import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.Opcode -object ThemeSetterSystemFingerprint : LiteralValueFingerprint( +internal object ThemeSetterSystemFingerprint : LiteralValueFingerprint( returnType = "L", opcodes = listOf(Opcode.RETURN_OBJECT), literalSupplier = { Appearance } diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/SponsorBlockPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/SponsorBlockPatch.kt index 915efeb03..6dcd19f3a 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/SponsorBlockPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/SponsorBlockPatch.kt @@ -1,54 +1,24 @@ package app.revanced.patches.youtube.utils.sponsorblock import app.revanced.patcher.data.ResourceContext -import app.revanced.patcher.patch.ResourcePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.booleanPatchOption +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.settings.SettingsPatch import app.revanced.util.ResourceGroup import app.revanced.util.copyResources import app.revanced.util.copyXmlNode +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("DEPRECATION", "unused") +object SponsorBlockPatch : BaseResourcePatch( name = "SponsorBlock", description = "Integrates SponsorBlock which allows skipping video segments such as sponsored content.", - dependencies = [ + dependencies = setOf( SettingsPatch::class, SponsorBlockBytecodePatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("DEPRECATION", "unused") -object SponsorBlockPatch : ResourcePatch() { + ), + compatiblePackages = COMPATIBLE_PACKAGE +) { private val OutlineIcon by booleanPatchOption( key = "OutlineIcon", default = false, diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/fingerprints/RectangleFieldInvalidatorFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/fingerprints/RectangleFieldInvalidatorFingerprint.kt index d06bb6b64..598513e7c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/fingerprints/RectangleFieldInvalidatorFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/fingerprints/RectangleFieldInvalidatorFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.utils.sponsorblock.fingerprints import app.revanced.util.fingerprint.MethodReferenceNameFingerprint -object RectangleFieldInvalidatorFingerprint : MethodReferenceNameFingerprint( +internal object RectangleFieldInvalidatorFingerprint : MethodReferenceNameFingerprint( returnType = "V", parameters = emptyList(), reference = { "invalidate" } diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/fingerprints/SegmentPlaybackControllerFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/fingerprints/SegmentPlaybackControllerFingerprint.kt index 1e6830259..fde182634 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/fingerprints/SegmentPlaybackControllerFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/sponsorblock/fingerprints/SegmentPlaybackControllerFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.patches.youtube.utils.integrations.Constants.INTEGRATIONS_PA import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object SegmentPlaybackControllerFingerprint : MethodFingerprint( +internal object SegmentPlaybackControllerFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.STATIC, parameters = listOf("Ljava/lang/Object;"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/toolbar/fingerprints/ToolBarButtonFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/toolbar/fingerprints/ToolBarButtonFingerprint.kt index ed6b2e3ee..5f2c43afc 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/toolbar/fingerprints/ToolBarButtonFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/toolbar/fingerprints/ToolBarButtonFingerprint.kt @@ -6,7 +6,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object ToolBarButtonFingerprint : LiteralValueFingerprint( +internal object ToolBarButtonFingerprint : LiteralValueFingerprint( accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("Landroid/view/MenuItem;"), returnType = "V", diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/toolbar/fingerprints/ToolBarPatchFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/toolbar/fingerprints/ToolBarPatchFingerprint.kt index 5514eb72d..9d0fa8d04 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/toolbar/fingerprints/ToolBarPatchFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/toolbar/fingerprints/ToolBarPatchFingerprint.kt @@ -2,12 +2,13 @@ package app.revanced.patches.youtube.utils.toolbar.fingerprints import app.revanced.patcher.extensions.or import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH import com.android.tools.smali.dexlib2.AccessFlags -object ToolBarPatchFingerprint : MethodFingerprint( +internal object ToolBarPatchFingerprint : MethodFingerprint( accessFlags = AccessFlags.PRIVATE or AccessFlags.STATIC, customFingerprint = { methodDef, _ -> - methodDef.definingClass == "Lapp/revanced/integrations/youtube/patches/utils/ToolBarPatch;" + methodDef.definingClass == "$UTILS_PATH/ToolBarPatch;" && methodDef.name == "hookToolBar" } ) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/VideoIdPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/VideoIdPatch.kt index 49a36841f..1a8e7925c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/VideoIdPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/VideoIdPatch.kt @@ -21,6 +21,7 @@ import app.revanced.patches.youtube.utils.videoid.general.fingerprint.VideoIdFin import app.revanced.patches.youtube.utils.videoid.general.fingerprint.VideoIdParentFingerprint import app.revanced.patches.youtube.utils.videoid.general.fingerprint.VideoLengthFingerprint import app.revanced.util.exception +import app.revanced.util.getWalkerMethod import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.builder.MutableMethodImplementation import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -75,9 +76,7 @@ object VideoIdPatch : BytecodePatch( ) it.mutableClass.methods.add(seekHelperMethod) - val videoEndMethod = context.toMethodWalker(it.method) - .nextMethod(it.scanResult.patternScanResult!!.startIndex + 1, true) - .getMethod() as MutableMethod + val videoEndMethod = getWalkerMethod(context, it.scanResult.patternScanResult!!.startIndex + 1) videoEndMethod.apply { addInstructionsWithLabels( @@ -96,9 +95,7 @@ object VideoIdPatch : BytecodePatch( * Set current video time */ PlayerControllerSetTimeReferenceFingerprint.result?.let { - timeMethod = context.toMethodWalker(it.method) - .nextMethod(it.scanResult.patternScanResult!!.startIndex, true) - .getMethod() as MutableMethod + timeMethod = it.getWalkerMethod(context, it.scanResult.patternScanResult!!.startIndex) } ?: throw PlayerControllerSetTimeReferenceFingerprint.exception /** diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/PlayerControllerSetTimeReferenceFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/PlayerControllerSetTimeReferenceFingerprint.kt index 3276385dd..67e1ff37c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/PlayerControllerSetTimeReferenceFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/PlayerControllerSetTimeReferenceFingerprint.kt @@ -3,7 +3,7 @@ package app.revanced.patches.youtube.utils.videoid.general.fingerprint import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.Opcode -object PlayerControllerSetTimeReferenceFingerprint : MethodFingerprint( +internal object PlayerControllerSetTimeReferenceFingerprint : MethodFingerprint( opcodes = listOf( Opcode.INVOKE_DIRECT_RANGE, Opcode.IGET_OBJECT diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/VideoIdFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/VideoIdFingerprint.kt index 7d048aab7..89bbefaf5 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/VideoIdFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/VideoIdFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object VideoIdFingerprint : MethodFingerprint( +internal object VideoIdFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/VideoIdParentFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/VideoIdParentFingerprint.kt index 1abf24533..e0f814255 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/VideoIdParentFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/VideoIdParentFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.utils.videoid.general.fingerprint import app.revanced.patcher.fingerprint.MethodFingerprint -object VideoIdParentFingerprint : MethodFingerprint( +internal object VideoIdParentFingerprint : MethodFingerprint( returnType = "V", parameters = listOf("Ljava/lang/Object;", "Ljava/lang/Exception;"), strings = listOf("error retrieving subtitle"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/VideoLengthFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/VideoLengthFingerprint.kt index fa7dc376c..a01fe71d7 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/VideoLengthFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/general/fingerprint/VideoLengthFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.util.fingerprint.LiteralValueFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object VideoLengthFingerprint : LiteralValueFingerprint( +internal object VideoLengthFingerprint : LiteralValueFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = emptyList(), diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/withoutshorts/VideoIdWithoutShortsPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/withoutshorts/VideoIdWithoutShortsPatch.kt index 2accd95bd..a22acfe0d 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/withoutshorts/VideoIdWithoutShortsPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/withoutshorts/VideoIdWithoutShortsPatch.kt @@ -8,6 +8,7 @@ import app.revanced.patcher.util.proxy.mutableTypes.MutableMethod import app.revanced.patches.youtube.utils.integrations.Constants.VIDEO_PATH import app.revanced.patches.youtube.utils.videoid.withoutshorts.fingerprint.VideoIdWithoutShortsFingerprint import app.revanced.util.exception +import app.revanced.util.getTargetIndex import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction @@ -19,9 +20,7 @@ object VideoIdWithoutShortsPatch : BytecodePatch( VideoIdWithoutShortsFingerprint.result?.let { it.mutableMethod.apply { insertMethod = this - insertIndex = implementation!!.instructions.indexOfFirst { instruction -> - instruction.opcode == Opcode.INVOKE_INTERFACE - } + insertIndex = getTargetIndex(Opcode.INVOKE_INTERFACE) insertRegister = getInstruction(insertIndex + 1).registerA } } ?: throw VideoIdWithoutShortsFingerprint.exception diff --git a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/withoutshorts/fingerprint/VideoIdWithoutShortsFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/withoutshorts/fingerprint/VideoIdWithoutShortsFingerprint.kt index 7a18f1325..4430a0a9c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/withoutshorts/fingerprint/VideoIdWithoutShortsFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/utils/videoid/withoutshorts/fingerprint/VideoIdWithoutShortsFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object VideoIdWithoutShortsFingerprint : MethodFingerprint( +internal object VideoIdWithoutShortsFingerprint : MethodFingerprint( returnType = "V", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL or AccessFlags.DECLARED_SYNCHRONIZED, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/customspeed/CustomPlaybackSpeedBytecodePatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/customspeed/CustomPlaybackSpeedBytecodePatch.kt new file mode 100644 index 000000000..99622b9e4 --- /dev/null +++ b/src/main/kotlin/app/revanced/patches/youtube/video/customspeed/CustomPlaybackSpeedBytecodePatch.kt @@ -0,0 +1,9 @@ +package app.revanced.patches.youtube.video.customspeed + +import app.revanced.patches.shared.customspeed.BaseCustomPlaybackSpeedPatch +import app.revanced.patches.youtube.utils.integrations.Constants.VIDEO_PATH + +object CustomPlaybackSpeedBytecodePatch : BaseCustomPlaybackSpeedPatch( + "$VIDEO_PATH/CustomPlaybackSpeedPatch;", + 8.0f +) diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/customspeed/CustomPlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/customspeed/CustomPlaybackSpeedPatch.kt index e44e11c50..2fac2a7f8 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/customspeed/CustomPlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/customspeed/CustomPlaybackSpeedPatch.kt @@ -1,59 +1,25 @@ package app.revanced.patches.youtube.video.customspeed -import app.revanced.patcher.data.BytecodeContext -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch -import app.revanced.patches.shared.customspeed.AbstractCustomPlaybackSpeedPatch +import app.revanced.patcher.data.ResourceContext import app.revanced.patches.youtube.flyoutpanel.oldspeedlayout.OldSpeedLayoutPatch -import app.revanced.patches.youtube.utils.integrations.Constants.VIDEO_PATH +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.overridespeed.OverrideSpeedHookPatch import app.revanced.patches.youtube.utils.settings.SettingsPatch +import app.revanced.util.patch.BaseResourcePatch -@Patch( +@Suppress("unused") +object CustomPlaybackSpeedPatch : BaseResourcePatch( name = "Custom playback speed", - description = "Adds options to customize available playback speeds.", - dependencies = [ + description = "Adds an option to customize available playback speeds.", + dependencies = setOf( + CustomPlaybackSpeedBytecodePatch::class, OldSpeedLayoutPatch::class, OverrideSpeedHookPatch::class, SettingsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object CustomPlaybackSpeedPatch : AbstractCustomPlaybackSpeedPatch( - "$VIDEO_PATH/CustomPlaybackSpeedPatch;", - 8.0f + ), + compatiblePackages = COMPATIBLE_PACKAGE ) { - override fun execute(context: BytecodeContext) { - super.execute(context) + override fun execute(context: ResourceContext) { /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrVideoPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/hdr/HDRVideoPatch.kt similarity index 50% rename from src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrVideoPatch.kt rename to src/main/kotlin/app/revanced/patches/youtube/video/hdr/HDRVideoPatch.kt index 418181000..b00b49d17 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/hdr/DisableHdrVideoPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/hdr/HDRVideoPatch.kt @@ -3,56 +3,25 @@ package app.revanced.patches.youtube.video.hdr import app.revanced.patcher.data.BytecodeContext 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.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patcher.util.smali.ExternalLabel +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.VIDEO_PATH import app.revanced.patches.youtube.utils.settings.SettingsPatch -import app.revanced.patches.youtube.video.hdr.fingerprints.HdrCapabilitiesFingerprint +import app.revanced.patches.youtube.video.hdr.fingerprints.HDRCapabilityFingerprint import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch -@Patch( +@Suppress("unused") +object HDRVideoPatch : BaseBytecodePatch( name = "Disable HDR video", description = "Adds options to disable HDR video.", - dependencies = [SettingsPatch::class], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object DisableHdrVideoPatch : BytecodePatch( - setOf(HdrCapabilitiesFingerprint) + dependencies = setOf(SettingsPatch::class), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf(HDRCapabilityFingerprint) ) { override fun execute(context: BytecodeContext) { - HdrCapabilitiesFingerprint.result?.mutableMethod?.apply { + HDRCapabilityFingerprint.result?.mutableMethod?.apply { addInstructionsWithLabels( 0, """ invoke-static {}, $VIDEO_PATH/HDRVideoPatch;->disableHDRVideo()Z @@ -61,7 +30,7 @@ object DisableHdrVideoPatch : BytecodePatch( return v0 """, ExternalLabel("default", getInstruction(0)) ) - } ?: throw HdrCapabilitiesFingerprint.exception + } ?: throw HDRCapabilityFingerprint.exception /** * Add settings diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/hdr/fingerprints/HdrCapabilitiesFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/hdr/fingerprints/HDRCapabilityFingerprint.kt similarity index 77% rename from src/main/kotlin/app/revanced/patches/youtube/video/hdr/fingerprints/HdrCapabilitiesFingerprint.kt rename to src/main/kotlin/app/revanced/patches/youtube/video/hdr/fingerprints/HDRCapabilityFingerprint.kt index 4d2f96e7b..6e9b1b758 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/hdr/fingerprints/HdrCapabilitiesFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/hdr/fingerprints/HDRCapabilityFingerprint.kt @@ -2,7 +2,7 @@ package app.revanced.patches.youtube.video.hdr.fingerprints import app.revanced.util.fingerprint.MethodReferenceNameFingerprint -object HdrCapabilitiesFingerprint : MethodReferenceNameFingerprint( +internal object HDRCapabilityFingerprint : MethodReferenceNameFingerprint( returnType = "Z", parameters = listOf("I", "Landroid/view/Display;"), reference = { "getSupportedHdrTypes" } diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt index 54204c09c..a73872ead 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/quality/VideoQualityPatch.kt @@ -3,13 +3,11 @@ package app.revanced.patches.youtube.video.quality import app.revanced.patcher.data.BytecodeContext import app.revanced.patcher.extensions.InstructionExtensions.addInstruction import app.revanced.patcher.extensions.InstructionExtensions.getInstruction -import app.revanced.patcher.patch.BytecodePatch import app.revanced.patcher.patch.PatchException -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.utils.fingerprints.NewVideoQualityChangedFingerprint import app.revanced.patches.youtube.utils.fingerprints.VideoQualitySetterFingerprint import app.revanced.patches.youtube.utils.fix.shortsplayback.ShortsPlaybackPatch +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.VIDEO_PATH import app.revanced.patches.youtube.utils.overridequality.OverrideQualityHookPatch import app.revanced.patches.youtube.utils.overridespeed.OverrideSpeedHookPatch @@ -20,12 +18,14 @@ import app.revanced.patches.youtube.utils.videoid.general.VideoIdPatch import app.revanced.patches.youtube.utils.videoid.withoutshorts.VideoIdWithoutShortsPatch import app.revanced.util.copyXmlNode import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction -@Patch( +@Suppress("unused") +object VideoQualityPatch : BaseBytecodePatch( name = "Default video quality", description = "Adds an option to set the default video quality.", - dependencies = [ + dependencies = setOf( OverrideQualityHookPatch::class, OverrideSpeedHookPatch::class, PlayerTypeHookPatch::class, @@ -33,40 +33,9 @@ import com.android.tools.smali.dexlib2.iface.instruction.TwoRegisterInstruction ShortsPlaybackPatch::class, VideoIdPatch::class, VideoIdWithoutShortsPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object VideoQualityPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( NewVideoQualityChangedFingerprint, VideoQualitySetterFingerprint ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt index d90b6473c..20261eff3 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/PlaybackSpeedPatch.kt @@ -4,11 +4,9 @@ import app.revanced.patcher.data.BytecodeContext 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.patch.BytecodePatch -import app.revanced.patcher.patch.annotation.CompatiblePackage -import app.revanced.patcher.patch.annotation.Patch import app.revanced.patches.youtube.utils.fingerprints.NewVideoQualityChangedFingerprint import app.revanced.patches.youtube.utils.fingerprints.VideoEndFingerprint +import app.revanced.patches.youtube.utils.integrations.Constants.COMPATIBLE_PACKAGE import app.revanced.patches.youtube.utils.integrations.Constants.UTILS_PATH import app.revanced.patches.youtube.utils.integrations.Constants.VIDEO_PATH import app.revanced.patches.youtube.utils.overridespeed.OverrideSpeedHookPatch @@ -17,51 +15,22 @@ import app.revanced.patches.youtube.utils.videocpn.VideoCpnPatch import app.revanced.patches.youtube.video.speed.fingerprints.NewPlaybackSpeedChangedFingerprint import app.revanced.patches.youtube.video.speed.fingerprints.PlaybackSpeedInitializeFingerprint import app.revanced.util.exception +import app.revanced.util.patch.BaseBytecodePatch import app.revanced.util.updatePatchStatus import com.android.tools.smali.dexlib2.iface.instruction.FiveRegisterInstruction import com.android.tools.smali.dexlib2.iface.instruction.OneRegisterInstruction -@Patch( +@Suppress("unused") +object PlaybackSpeedPatch : BaseBytecodePatch( name = "Default playback speed", description = "Adds an option to set the default playback speed.", - dependencies = [ + dependencies = setOf( OverrideSpeedHookPatch::class, SettingsPatch::class, VideoCpnPatch::class - ], - compatiblePackages = [ - CompatiblePackage( - "com.google.android.youtube", - [ - "18.29.38", - "18.30.37", - "18.31.40", - "18.32.39", - "18.33.40", - "18.34.38", - "18.35.36", - "18.36.39", - "18.37.36", - "18.38.44", - "18.39.41", - "18.40.34", - "18.41.39", - "18.42.41", - "18.43.45", - "18.44.41", - "18.45.43", - "18.46.45", - "18.48.39", - "18.49.37", - "19.01.34", - "19.02.39" - ] - ) - ] -) -@Suppress("unused") -object PlaybackSpeedPatch : BytecodePatch( - setOf( + ), + compatiblePackages = COMPATIBLE_PACKAGE, + fingerprints = setOf( NewVideoQualityChangedFingerprint, VideoEndFingerprint ) diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/fingerprints/NewPlaybackSpeedChangedFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/fingerprints/NewPlaybackSpeedChangedFingerprint.kt index caf9262f1..ff630556c 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/fingerprints/NewPlaybackSpeedChangedFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/fingerprints/NewPlaybackSpeedChangedFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object NewPlaybackSpeedChangedFingerprint : MethodFingerprint( +internal object NewPlaybackSpeedChangedFingerprint : MethodFingerprint( returnType = "L", accessFlags = AccessFlags.PUBLIC or AccessFlags.FINAL, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/patches/youtube/video/speed/fingerprints/PlaybackSpeedInitializeFingerprint.kt b/src/main/kotlin/app/revanced/patches/youtube/video/speed/fingerprints/PlaybackSpeedInitializeFingerprint.kt index 09f5fff50..ef929dfed 100644 --- a/src/main/kotlin/app/revanced/patches/youtube/video/speed/fingerprints/PlaybackSpeedInitializeFingerprint.kt +++ b/src/main/kotlin/app/revanced/patches/youtube/video/speed/fingerprints/PlaybackSpeedInitializeFingerprint.kt @@ -5,7 +5,7 @@ import app.revanced.patcher.fingerprint.MethodFingerprint import com.android.tools.smali.dexlib2.AccessFlags import com.android.tools.smali.dexlib2.Opcode -object PlaybackSpeedInitializeFingerprint : MethodFingerprint( +internal object PlaybackSpeedInitializeFingerprint : MethodFingerprint( returnType = "F", accessFlags = AccessFlags.PRIVATE or AccessFlags.STATIC, parameters = listOf("L"), diff --git a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt index d8069f744..d480cf951 100644 --- a/src/main/kotlin/app/revanced/util/BytecodeUtils.kt +++ b/src/main/kotlin/app/revanced/util/BytecodeUtils.kt @@ -17,6 +17,7 @@ import com.android.tools.smali.dexlib2.Opcode import com.android.tools.smali.dexlib2.builder.instruction.BuilderInstruction21c import com.android.tools.smali.dexlib2.iface.Method 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.instruction.WideLiteralInstruction import com.android.tools.smali.dexlib2.iface.reference.FieldReference @@ -82,6 +83,68 @@ fun MutableMethod.injectHideViewCall( "invoke-static { v$viewRegister }, $classDescriptor->$targetMethod(Landroid/view/View;)V" ) +fun MethodFingerprint.literalInstructionBooleanHook( + literal: Int, + descriptor: String +) = literalInstructionBooleanHook(literal.toLong(), descriptor) + +fun MethodFingerprint.literalInstructionBooleanHook( + literal: Int, + descriptor: String, + message: String +) = literalInstructionBooleanHook(literal.toLong(), descriptor, message) + +fun MethodFingerprint.literalInstructionBooleanHook( + literal: Long, + descriptor: String +) = literalInstructionBooleanHook(literal, descriptor, "") + +fun MethodFingerprint.literalInstructionBooleanHook( + literal: Long, + descriptor: String, + message: String +) { + val method = result?.mutableMethod + ?: if (message.isEmpty()) + throw exception + else + throw PatchException("This version is not supported. $message") + + method.apply { + val literalIndex = getWideLiteralInstructionIndex(literal) + val targetIndex = getTargetIndex(literalIndex, Opcode.MOVE_RESULT) + val targetRegister = getInstruction(targetIndex).registerA + + val smaliInstruction = if (descriptor.endsWith("(Z)Z")) + "invoke-static {v$targetRegister}, $descriptor" + else + "invoke-static {}, $descriptor" + + addInstructions( + targetIndex + 1, """ + $smaliInstruction + move-result v$targetRegister + """ + ) + } +} + +fun MethodFingerprint.literalInstructionViewHook( + literal: Long, + descriptor: String +) { + result?.mutableMethod?.apply { + val literalIndex = getWideLiteralInstructionIndex(literal) + val targetIndex = getTargetIndex(literalIndex, Opcode.MOVE_RESULT_OBJECT) + val targetRegister = getInstruction(targetIndex).registerA + + addInstruction( + targetIndex + 1, + "invoke-static {v$targetRegister}, $descriptor" + ) + } ?: throw exception +} + /** * Find the index of the first wide literal instruction with the given value. * @@ -155,7 +218,7 @@ fun Method.indexOfFirstInstruction(predicate: Instruction.() -> Boolean) = fun MutableMethod.getTargetIndex(opcode: Opcode) = getTargetIndex(0, opcode) fun MutableMethod.getTargetIndexReversed(opcode: Opcode) = - getTargetIndex(implementation!!.instructions.size - 1, opcode) + getTargetIndexReversed(implementation!!.instructions.size - 1, opcode) fun MutableMethod.getTargetIndex(startIndex: Int, opcode: Opcode) = implementation!!.instructions.let { diff --git a/src/main/kotlin/app/revanced/util/ResourceUtils.kt b/src/main/kotlin/app/revanced/util/ResourceUtils.kt index f0aaad58f..727589d20 100644 --- a/src/main/kotlin/app/revanced/util/ResourceUtils.kt +++ b/src/main/kotlin/app/revanced/util/ResourceUtils.kt @@ -1,3 +1,5 @@ +@file:Suppress("DEPRECATION", "MemberVisibilityCanBePrivate", "SpellCheckingInspection") + package app.revanced.util import app.revanced.patcher.data.ResourceContext diff --git a/src/main/kotlin/app/revanced/util/patch/BaseBytecodePatch.kt b/src/main/kotlin/app/revanced/util/patch/BaseBytecodePatch.kt new file mode 100644 index 000000000..4a15c9de7 --- /dev/null +++ b/src/main/kotlin/app/revanced/util/patch/BaseBytecodePatch.kt @@ -0,0 +1,23 @@ +package app.revanced.util.patch + +import app.revanced.patcher.PatchClass +import app.revanced.patcher.fingerprint.MethodFingerprint +import app.revanced.patcher.patch.BytecodePatch + +abstract class BaseBytecodePatch( + name: String? = null, + description: String? = null, + dependencies: Set? = null, + compatiblePackages: Set? = null, + fingerprints: Set = emptySet(), + requiresIntegrations: Boolean = false, + use: Boolean = true, +) : BytecodePatch( + name = name, + description = description, + dependencies = dependencies, + compatiblePackages = compatiblePackages, + fingerprints = fingerprints, + requiresIntegrations = requiresIntegrations, + use = use +) \ No newline at end of file diff --git a/src/main/kotlin/app/revanced/util/patch/BaseResourcePatch.kt b/src/main/kotlin/app/revanced/util/patch/BaseResourcePatch.kt new file mode 100644 index 000000000..2f61b3777 --- /dev/null +++ b/src/main/kotlin/app/revanced/util/patch/BaseResourcePatch.kt @@ -0,0 +1,20 @@ +package app.revanced.util.patch + +import app.revanced.patcher.PatchClass +import app.revanced.patcher.patch.ResourcePatch + +abstract class BaseResourcePatch( + name: String? = null, + description: String? = null, + dependencies: Set? = null, + compatiblePackages: Set? = null, + requiresIntegrations: Boolean = false, + use: Boolean = true +) : ResourcePatch( + name = name, + description = description, + dependencies = dependencies, + compatiblePackages = compatiblePackages, + requiresIntegrations = requiresIntegrations, + use = use +) \ No newline at end of file diff --git a/src/main/resources/youtube/settings/xml/revanced_prefs.xml b/src/main/resources/youtube/settings/xml/revanced_prefs.xml index 0b91803e5..950e560e0 100644 --- a/src/main/resources/youtube/settings/xml/revanced_prefs.xml +++ b/src/main/resources/youtube/settings/xml/revanced_prefs.xml @@ -415,13 +415,12 @@ - - +