├── .editorconfig ├── .gitattributes ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.yml │ ├── config.yml │ └── feature_request.yml ├── config.yml ├── dependabot.yml └── workflows │ ├── build_pull_request.yml │ ├── open_pull_request.yml │ ├── pull_strings.yml │ ├── push_strings.yml │ ├── release.yml │ └── update-gradle-wrapper.yml ├── .gitignore ├── .idea ├── .gitignore ├── discord.xml ├── git_toolbox_prj.xml ├── misc.xml └── vcs.xml ├── .releaserc ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── assets ├── revanced-headline │ ├── revanced-headline-vertical-dark.svg │ └── revanced-headline-vertical-light.svg └── revanced-logo │ └── revanced-logo.svg ├── crowdin.yml ├── extensions ├── all │ └── misc │ │ ├── adb │ │ └── hide-adb │ │ │ ├── build.gradle.kts │ │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── all │ │ │ └── misc │ │ │ └── hide │ │ │ └── adb │ │ │ └── HideAdbPatch.java │ │ ├── connectivity │ │ └── wifi │ │ │ └── spoof │ │ │ └── spoof-wifi │ │ │ ├── build.gradle.kts │ │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── all │ │ │ └── misc │ │ │ └── connectivity │ │ │ └── wifi │ │ │ └── spoof │ │ │ └── SpoofWifiPatch.java │ │ ├── directory │ │ └── documentsprovider │ │ │ └── export-internal-data-documents-provider │ │ │ ├── build.gradle.kts │ │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── all │ │ │ └── misc │ │ │ └── directory │ │ │ └── documentsprovider │ │ │ └── InternalDataDocumentsProvider.java │ │ ├── screencapture │ │ └── remove-screen-capture-restriction │ │ │ ├── build.gradle.kts │ │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── all │ │ │ └── misc │ │ │ └── screencapture │ │ │ └── removerestriction │ │ │ └── RemoveScreenCaptureRestrictionPatch.java │ │ └── screenshot │ │ └── remove-screenshot-restriction │ │ ├── build.gradle.kts │ │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── app │ │ └── revanced │ │ └── extension │ │ └── all │ │ └── misc │ │ └── screenshot │ │ └── removerestriction │ │ └── RemoveScreenshotRestrictionPatch.java ├── boostforreddit │ ├── build.gradle.kts │ ├── src │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── boostforreddit │ │ │ └── FixSLinksPatch.java │ └── stub │ │ ├── build.gradle.kts │ │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── rubenmayayo │ │ └── reddit │ │ └── ui │ │ └── activities │ │ └── WebViewActivity.java ├── messenger │ ├── build.gradle.kts │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── app │ │ └── revanced │ │ └── extension │ │ └── messenger │ │ └── metaai │ │ └── RemoveMetaAIPatch.java ├── music │ ├── build.gradle.kts │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── app │ │ └── revanced │ │ └── extension │ │ └── music │ │ └── spoof │ │ └── SpoofClientPatch.java ├── nunl │ ├── build.gradle.kts │ ├── src │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── nunl │ │ │ └── ads │ │ │ └── HideAdsPatch.java │ └── stub │ │ ├── build.gradle.kts │ │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── nl │ │ └── nu │ │ └── performance │ │ └── api │ │ └── client │ │ ├── interfaces │ │ └── Block.java │ │ ├── objects │ │ ├── DividerBlock.java │ │ ├── DpgBannerBlock.java │ │ ├── HeaderBlock.java │ │ ├── Link.java │ │ ├── LinkBlock.java │ │ └── StyledText.java │ │ └── unions │ │ ├── LinkFlavor.java │ │ └── SmallArticleLinkFlavor.java ├── primevideo │ ├── build.gradle.kts │ ├── src │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── primevideo │ │ │ └── ads │ │ │ └── SkipAdsPatch.java │ └── stub │ │ ├── build.gradle.kts │ │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── amazon │ │ └── avod │ │ ├── fsm │ │ ├── SimpleTrigger.java │ │ ├── StateBase.java │ │ └── Trigger.java │ │ └── media │ │ ├── TimeSpan.java │ │ ├── ads │ │ ├── AdBreak.java │ │ └── internal │ │ │ └── state │ │ │ ├── AdBreakState.java │ │ │ ├── AdBreakTrigger.java │ │ │ ├── AdEnabledPlaybackState.java │ │ │ ├── AdEnabledPlayerTriggerType.java │ │ │ └── ServerInsertedAdBreakState.java │ │ └── playback │ │ ├── VideoPlayer.java │ │ └── state │ │ ├── PlayerStateType.java │ │ └── trigger │ │ └── PlayerTriggerType.java ├── proguard-rules.pro ├── reddit │ ├── build.gradle.kts │ ├── src │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── reddit │ │ │ └── patches │ │ │ └── FilterPromotedLinksPatch.java │ └── stub │ │ ├── build.gradle.kts │ │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── reddit │ │ └── domain │ │ └── model │ │ └── ILink.java ├── shared │ ├── build.gradle.kts │ ├── library │ │ ├── build.gradle.kts │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── shared │ │ │ ├── GmsCoreSupport.java │ │ │ ├── Logger.java │ │ │ ├── StringRef.java │ │ │ ├── Utils.java │ │ │ ├── checks │ │ │ ├── Check.java │ │ │ ├── CheckEnvironmentPatch.java │ │ │ └── PatchInfo.java │ │ │ ├── fixes │ │ │ └── slink │ │ │ │ ├── BaseFixSLinksPatch.java │ │ │ │ └── ResolveResult.java │ │ │ ├── requests │ │ │ ├── Requester.java │ │ │ └── Route.java │ │ │ ├── settings │ │ │ ├── AppLanguage.java │ │ │ ├── BaseSettings.java │ │ │ ├── BooleanSetting.java │ │ │ ├── EnumSetting.java │ │ │ ├── FloatSetting.java │ │ │ ├── IntegerSetting.java │ │ │ ├── LongSetting.java │ │ │ ├── Setting.java │ │ │ ├── StringSetting.java │ │ │ └── preference │ │ │ │ ├── AbstractPreferenceFragment.java │ │ │ │ ├── ColorPickerPreference.java │ │ │ │ ├── ColorPickerView.java │ │ │ │ ├── ImportExportPreference.java │ │ │ │ ├── LogBufferManager.java │ │ │ │ ├── NoTitlePreferenceCategory.java │ │ │ │ ├── ReVancedAboutPreference.java │ │ │ │ ├── ResettableEditTextPreference.java │ │ │ │ ├── SharedPrefCategory.java │ │ │ │ └── SortedListPreference.java │ │ │ └── spoof │ │ │ ├── ClientType.java │ │ │ ├── SpoofVideoStreamsPatch.java │ │ │ └── requests │ │ │ ├── PlayerRoutes.java │ │ │ └── StreamingDataRequest.java │ └── src │ │ └── main │ │ └── AndroidManifest.xml ├── spotify │ ├── build.gradle.kts │ ├── src │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── spotify │ │ │ ├── layout │ │ │ └── theme │ │ │ │ └── CustomThemePatch.java │ │ │ └── misc │ │ │ ├── UnlockPremiumPatch.java │ │ │ └── privacy │ │ │ └── SanitizeSharingLinksPatch.java │ └── stub │ │ ├── build.gradle.kts │ │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── spotify │ │ ├── home │ │ └── evopage │ │ │ └── homeapi │ │ │ └── proto │ │ │ └── Section.java │ │ ├── remoteconfig │ │ └── internal │ │ │ └── AccountAttribute.java │ │ └── useraccount │ │ └── v1 │ │ └── AccountAttribute.java ├── syncforreddit │ ├── build.gradle.kts │ ├── src │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── syncforreddit │ │ │ ├── FixRedditVideoDownloadPatch.java │ │ │ └── FixSLinksPatch.java │ └── stub │ │ ├── build.gradle.kts │ │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── laurencedawson │ │ └── reddit_sync │ │ └── ui │ │ └── activities │ │ └── WebViewActivity.java ├── tiktok │ ├── build.gradle.kts │ ├── src │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── tiktok │ │ │ ├── Utils.java │ │ │ ├── cleardisplay │ │ │ └── RememberClearDisplayPatch.java │ │ │ ├── download │ │ │ └── DownloadsPatch.java │ │ │ ├── feedfilter │ │ │ ├── AdsFilter.java │ │ │ ├── FeedItemsFilter.java │ │ │ ├── IFilter.java │ │ │ ├── ImageVideoFilter.java │ │ │ ├── LikeCountFilter.java │ │ │ ├── LiveFilter.java │ │ │ ├── ShopFilter.java │ │ │ ├── StoryFilter.java │ │ │ └── ViewCountFilter.java │ │ │ ├── settings │ │ │ ├── AdPersonalizationActivityHook.java │ │ │ ├── Settings.java │ │ │ ├── SettingsStatus.java │ │ │ └── preference │ │ │ │ ├── DownloadPathPreference.java │ │ │ │ ├── InputTextPreference.java │ │ │ │ ├── RangeValuePreference.java │ │ │ │ ├── ReVancedPreferenceFragment.java │ │ │ │ ├── ReVancedTikTokAboutPreference.java │ │ │ │ ├── TogglePreference.java │ │ │ │ └── categories │ │ │ │ ├── ConditionalPreferenceCategory.java │ │ │ │ ├── DownloadsPreferenceCategory.java │ │ │ │ ├── ExtensionPreferenceCategory.java │ │ │ │ ├── FeedFilterPreferenceCategory.java │ │ │ │ └── SimSpoofPreferenceCategory.java │ │ │ ├── speed │ │ │ └── PlaybackSpeedPatch.java │ │ │ └── spoof │ │ │ └── sim │ │ │ └── SpoofSimPatch.java │ └── stub │ │ ├── build.gradle.kts │ │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ ├── bytedance │ │ └── ies │ │ │ └── ugc │ │ │ └── aweme │ │ │ └── commercialize │ │ │ └── compliance │ │ │ └── personalization │ │ │ └── AdPersonalizationActivity.java │ │ └── ss │ │ └── android │ │ └── ugc │ │ └── aweme │ │ ├── feed │ │ └── model │ │ │ ├── Aweme.java │ │ │ ├── AwemeStatistics.java │ │ │ └── FeedItemList.java │ │ └── follow │ │ └── presenter │ │ ├── FollowFeed.java │ │ └── FollowFeedList.java ├── tudortmund │ ├── build.gradle.kts │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── app │ │ └── revanced │ │ └── extension │ │ └── tudortmund │ │ └── lockscreen │ │ └── ShowOnLockscreenPatch.java ├── tumblr │ ├── build.gradle.kts │ ├── src │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── tumblr │ │ │ └── patches │ │ │ └── TimelineFilterPatch.java │ └── stub │ │ ├── build.gradle.kts │ │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── com │ │ └── tumblr │ │ └── rumblr │ │ └── model │ │ ├── TimelineObject.java │ │ ├── TimelineObjectType.java │ │ └── Timelineable.java ├── twitch │ ├── build.gradle.kts │ ├── src │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ └── app │ │ │ └── revanced │ │ │ └── extension │ │ │ └── twitch │ │ │ ├── Utils.java │ │ │ ├── adblock │ │ │ ├── IAdblockService.java │ │ │ ├── LuminousService.java │ │ │ └── PurpleAdblockService.java │ │ │ ├── api │ │ │ ├── PurpleAdblockApi.java │ │ │ ├── RequestInterceptor.java │ │ │ └── RetrofitClient.java │ │ │ ├── patches │ │ │ ├── AudioAdsPatch.java │ │ │ ├── AutoClaimChannelPointsPatch.java │ │ │ ├── DebugModePatch.java │ │ │ ├── EmbeddedAdsPatch.java │ │ │ ├── ShowDeletedMessagesPatch.java │ │ │ └── VideoAdsPatch.java │ │ │ └── settings │ │ │ ├── AppCompatActivityHook.java │ │ │ ├── Settings.java │ │ │ └── preference │ │ │ ├── CustomPreferenceCategory.java │ │ │ └── ReVancedPreferenceFragment.java │ └── stub │ │ ├── build.gradle.kts │ │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── tv │ │ └── twitch │ │ └── android │ │ ├── feature │ │ └── settings │ │ │ └── menu │ │ │ └── SettingsMenuGroup.java │ │ ├── settings │ │ └── SettingsActivity.java │ │ └── shared │ │ └── chat │ │ └── util │ │ └── ClickableUsernameSpan.java ├── twitter │ ├── build.gradle.kts │ └── src │ │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── app │ │ └── revanced │ │ └── twitter │ │ ├── patches │ │ ├── hook │ │ │ ├── json │ │ │ │ ├── BaseJsonHook.kt │ │ │ │ ├── JsonHook.kt │ │ │ │ └── JsonHookPatch.kt │ │ │ ├── patch │ │ │ │ ├── Hook.kt │ │ │ │ ├── ads │ │ │ │ │ └── HideAdsHook.kt │ │ │ │ ├── dummy │ │ │ │ │ └── DummyHook.kt │ │ │ │ └── recommendation │ │ │ │ │ └── RecommendedUsersHook.kt │ │ │ └── twifucker │ │ │ │ ├── TwiFucker.kt │ │ │ │ └── TwiFuckerUtils.kt │ │ └── links │ │ │ ├── ChangeLinkSharingDomainPatch.java │ │ │ └── OpenLinksWithAppChooserPatch.java │ │ └── utils │ │ ├── json │ │ └── JsonUtils.kt │ │ └── stream │ │ └── StreamUtils.kt └── youtube │ ├── build.gradle.kts │ ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── java │ │ └── app │ │ └── revanced │ │ └── extension │ │ └── youtube │ │ ├── ByteTrieSearch.java │ │ ├── Event.kt │ │ ├── StringTrieSearch.java │ │ ├── ThemeHelper.java │ │ ├── TrieSearch.java │ │ ├── patches │ │ ├── AccountCredentialsInvalidTextPatch.java │ │ ├── AlternativeThumbnailsPatch.java │ │ ├── AutoRepeatPatch.java │ │ ├── BackgroundPlaybackPatch.java │ │ ├── BypassImageRegionRestrictionsPatch.java │ │ ├── BypassURLRedirectsPatch.java │ │ ├── ChangeFormFactorPatch.java │ │ ├── ChangeStartPagePatch.java │ │ ├── CheckWatchHistoryDomainNameResolutionPatch.java │ │ ├── CopyVideoUrlPatch.java │ │ ├── CustomPlayerOverlayOpacityPatch.java │ │ ├── DisableAutoCaptionsPatch.java │ │ ├── DisableFullscreenAmbientModePatch.java │ │ ├── DisableHapticFeedbackPatch.java │ │ ├── DisableHdrPatch.java │ │ ├── DisablePlayerPopupPanelsPatch.java │ │ ├── DisablePreciseSeekingGesturePatch.java │ │ ├── DisableResumingStartupShortsPlayerPatch.java │ │ ├── DisableRollingNumberAnimationsPatch.java │ │ ├── DownloadsPatch.java │ │ ├── EnableDebuggingPatch.java │ │ ├── ExitFullscreenPatch.java │ │ ├── FixBackToExitGesturePatch.java │ │ ├── FixPlaybackSpeedWhilePlayingPatch.java │ │ ├── ForceOriginalAudioPatch.java │ │ ├── HideEndScreenSuggestedVideoPatch.java │ │ ├── HideEndscreenCardsPatch.java │ │ ├── HideGetPremiumPatch.java │ │ ├── HideInfoCardsPatch.java │ │ ├── HidePlayerOverlayButtonsPatch.java │ │ ├── HideRelatedVideoOverlayPatch.java │ │ ├── HideSeekbarPatch.java │ │ ├── HideTimestampPatch.java │ │ ├── MiniplayerPatch.java │ │ ├── NavigationButtonsPatch.java │ │ ├── OpenLinksExternallyPatch.java │ │ ├── OpenShortsInRegularPlayerPatch.java │ │ ├── OpenVideosFullscreenHookPatch.java │ │ ├── PlayerControlsPatch.java │ │ ├── PlayerOverlaysHookPatch.java │ │ ├── PlayerTypeHookPatch.java │ │ ├── RemoveTrackingQueryParameterPatch.java │ │ ├── RemoveViewerDiscretionDialogPatch.java │ │ ├── ReturnYouTubeDislikePatch.java │ │ ├── SeekbarTappingPatch.java │ │ ├── SeekbarThumbnailsPatch.java │ │ ├── ShortsAutoplayPatch.java │ │ ├── SlideToSeekPatch.java │ │ ├── VersionCheckPatch.java │ │ ├── VideoAdsPatch.java │ │ ├── VideoInformation.java │ │ ├── WideSearchbarPatch.java │ │ ├── announcements │ │ │ ├── AnnouncementsPatch.java │ │ │ └── requests │ │ │ │ └── AnnouncementsRoutes.java │ │ ├── components │ │ │ ├── AdsFilter.java │ │ │ ├── AdvancedVideoQualityMenuFilter.java │ │ │ ├── ButtonsFilter.java │ │ │ ├── CommentsFilter.java │ │ │ ├── CustomFilter.java │ │ │ ├── DescriptionComponentsFilter.java │ │ │ ├── Filter.java │ │ │ ├── FilterGroup.java │ │ │ ├── FilterGroupList.java │ │ │ ├── HideInfoCardsFilterPatch.java │ │ │ ├── KeywordContentFilter.java │ │ │ ├── LayoutComponentsFilter.java │ │ │ ├── LithoFilterPatch.java │ │ │ ├── PlaybackSpeedMenuFilterPatch.java │ │ │ ├── PlayerFlyoutMenuItemsFilter.java │ │ │ ├── ReturnYouTubeDislikeFilterPatch.java │ │ │ └── ShortsFilter.java │ │ ├── playback │ │ │ ├── quality │ │ │ │ ├── AdvancedVideoQualityMenuPatch.java │ │ │ │ └── RememberVideoQualityPatch.java │ │ │ └── speed │ │ │ │ ├── CustomPlaybackSpeedPatch.java │ │ │ │ └── RememberPlaybackSpeedPatch.java │ │ ├── spoof │ │ │ ├── SpoofAppVersionPatch.java │ │ │ └── SpoofDeviceDimensionsPatch.java │ │ └── theme │ │ │ ├── ProgressBarDrawable.java │ │ │ ├── SeekbarColorPatch.java │ │ │ └── ThemePatch.java │ │ ├── returnyoutubedislike │ │ ├── ReturnYouTubeDislike.java │ │ ├── requests │ │ │ ├── RYDVoteData.java │ │ │ ├── ReturnYouTubeDislikeApi.java │ │ │ └── ReturnYouTubeDislikeRoutes.java │ │ └── ui │ │ │ ├── ReturnYouTubeDislikeAboutPreference.java │ │ │ └── ReturnYouTubeDislikeDebugStatsPreferenceCategory.java │ │ ├── settings │ │ ├── LicenseActivityHook.java │ │ ├── SearchViewController.java │ │ ├── Settings.java │ │ └── preference │ │ │ ├── AlternativeThumbnailsAboutDeArrowPreference.java │ │ │ ├── ClearLogBufferPreference.java │ │ │ ├── CustomVideoSpeedListPreference.java │ │ │ ├── ExportLogToClipboardPreference.java │ │ │ ├── ForceOriginalAudioSwitchPreference.java │ │ │ ├── HideAudioFlyoutMenuPreference.java │ │ │ ├── HtmlPreference.java │ │ │ ├── ReVancedPreferenceFragment.java │ │ │ ├── ReVancedYouTubeAboutPreference.java │ │ │ ├── SpoofStreamingDataSideEffectsPreference.java │ │ │ └── UrlLinkPreference.java │ │ ├── shared │ │ ├── NavigationBar.java │ │ ├── PlayerControlsVisibilityObserver.kt │ │ ├── PlayerOverlays.kt │ │ ├── PlayerType.kt │ │ ├── ShortsPlayerState.kt │ │ └── VideoState.kt │ │ ├── sponsorblock │ │ ├── SegmentPlaybackController.java │ │ ├── SponsorBlockSettings.java │ │ ├── SponsorBlockUtils.java │ │ ├── objects │ │ │ ├── CategoryBehaviour.java │ │ │ ├── SegmentCategory.java │ │ │ ├── SegmentCategoryListPreference.java │ │ │ ├── SponsorSegment.java │ │ │ └── UserStats.java │ │ ├── requests │ │ │ ├── SBRequester.java │ │ │ └── SBRoutes.java │ │ └── ui │ │ │ ├── CreateSegmentButton.java │ │ │ ├── NewSegmentLayout.java │ │ │ ├── SkipSponsorButton.java │ │ │ ├── SponsorBlockAboutPreference.java │ │ │ ├── SponsorBlockPreferenceGroup.java │ │ │ ├── SponsorBlockStatsPreferenceCategory.java │ │ │ ├── SponsorBlockViewController.java │ │ │ └── VotingButton.java │ │ ├── swipecontrols │ │ ├── SwipeControlsConfigurationProvider.kt │ │ ├── SwipeControlsHostActivity.kt │ │ ├── controller │ │ │ ├── AudioVolumeController.kt │ │ │ ├── ScreenBrightnessController.kt │ │ │ ├── SwipeZonesController.kt │ │ │ ├── VolumeKeysController.kt │ │ │ └── gesture │ │ │ │ ├── ClassicSwipeController.kt │ │ │ │ ├── PressToSwipeController.kt │ │ │ │ └── core │ │ │ │ ├── BaseGestureController.kt │ │ │ │ ├── GestureController.kt │ │ │ │ ├── SwipeDetector.kt │ │ │ │ └── VolumeAndBrightnessScroller.kt │ │ ├── misc │ │ │ ├── Point.kt │ │ │ ├── Rectangle.kt │ │ │ ├── ScrollDistanceHelper.kt │ │ │ ├── SwipeControlsOverlay.kt │ │ │ └── SwipeControlsUtils.kt │ │ └── views │ │ │ └── SwipeControlsOverlayLayout.kt │ │ └── videoplayer │ │ ├── CopyVideoUrlButton.java │ │ ├── CopyVideoUrlTimestampButton.java │ │ ├── ExternalDownloadButton.java │ │ ├── PlaybackSpeedDialogButton.java │ │ └── PlayerControlButton.java │ └── stub │ ├── build.gradle.kts │ └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ ├── android │ └── support │ │ └── v7 │ │ └── widget │ │ └── RecyclerView.java │ ├── com │ ├── airbnb │ │ └── lottie │ │ │ └── LottieAnimationView.java │ └── google │ │ └── android │ │ ├── android │ │ └── support │ │ │ └── constraint │ │ │ └── ConstraintLayout.java │ │ ├── apps │ │ └── youtube │ │ │ └── app │ │ │ └── ui │ │ │ └── SlimMetadataScrollableButtonContainerLayout.java │ │ └── libraries │ │ └── youtube │ │ └── rendering │ │ └── ui │ │ └── pivotbar │ │ └── PivotBar.java │ └── org │ └── chromium │ └── net │ ├── UrlRequest.java │ ├── UrlResponseInfo.java │ └── impl │ └── CronetUrlRequest.java ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── package-lock.json ├── package.json ├── patches ├── api │ └── patches.api ├── build.gradle.kts ├── src │ └── main │ │ ├── kotlin │ │ └── app │ │ │ └── revanced │ │ │ ├── patches │ │ │ ├── all │ │ │ │ └── misc │ │ │ │ │ ├── activity │ │ │ │ │ └── exportall │ │ │ │ │ │ └── ExportAllActivitiesPatch.kt │ │ │ │ │ ├── adb │ │ │ │ │ └── HideAdbPatch.kt │ │ │ │ │ ├── build │ │ │ │ │ ├── BaseSpoofBuildInfoPatch.kt │ │ │ │ │ └── SpoofBuildInfoPatch.kt │ │ │ │ │ ├── connectivity │ │ │ │ │ ├── location │ │ │ │ │ │ └── hide │ │ │ │ │ │ │ └── HideMockLocationPatch.kt │ │ │ │ │ ├── telephony │ │ │ │ │ │ └── sim │ │ │ │ │ │ │ └── spoof │ │ │ │ │ │ │ └── SpoofSimCountryPatch.kt │ │ │ │ │ └── wifi │ │ │ │ │ │ └── spoof │ │ │ │ │ │ └── SpoofWifiPatch.kt │ │ │ │ │ ├── debugging │ │ │ │ │ └── EnableAndroidDebuggingPatch.kt │ │ │ │ │ ├── directory │ │ │ │ │ ├── ChangeDataDirectoryLocationPatch.kt │ │ │ │ │ └── documentsprovider │ │ │ │ │ │ └── ExportInternalDataDocumentsProviderPatch.kt │ │ │ │ │ ├── hex │ │ │ │ │ └── HexPatch.kt │ │ │ │ │ ├── interaction │ │ │ │ │ └── gestures │ │ │ │ │ │ └── PredictiveBackGesturePatch.kt │ │ │ │ │ ├── network │ │ │ │ │ └── OverrideCertificatePinningPatch.kt │ │ │ │ │ ├── packagename │ │ │ │ │ └── ChangePackageNamePatch.kt │ │ │ │ │ ├── resources │ │ │ │ │ └── AddResourcesPatch.kt │ │ │ │ │ ├── screencapture │ │ │ │ │ └── RemoveScreenCaptureRestrictionPatch.kt │ │ │ │ │ ├── screenshot │ │ │ │ │ └── RemoveScreenshotRestrictionPatch.kt │ │ │ │ │ ├── shortcut │ │ │ │ │ └── sharetargets │ │ │ │ │ │ └── RemoveShareTargetsPatch.kt │ │ │ │ │ ├── targetSdk │ │ │ │ │ └── SetTargetSdkVersion34.kt │ │ │ │ │ ├── transformation │ │ │ │ │ ├── MethodCall.kt │ │ │ │ │ └── TransformInstructionsPatch.kt │ │ │ │ │ └── versioncode │ │ │ │ │ └── ChangeVersionCodePatch.kt │ │ │ ├── amazon │ │ │ │ ├── DeepLinkingPatch.kt │ │ │ │ └── Fingerprints.kt │ │ │ ├── angulus │ │ │ │ └── ads │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── RemoveAdsPatch.kt │ │ │ ├── backdrops │ │ │ │ └── misc │ │ │ │ │ └── pro │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── ProUnlockPatch.kt │ │ │ ├── bandcamp │ │ │ │ └── limitations │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── RemovePlayLimitsPatch.kt │ │ │ ├── cieid │ │ │ │ └── restrictions │ │ │ │ │ └── root │ │ │ │ │ ├── BypassRootChecksPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ ├── duolingo │ │ │ │ ├── ad │ │ │ │ │ ├── DisableAdsPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ └── debug │ │ │ │ │ ├── EnableDebugMenuPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ ├── facebook │ │ │ │ └── ads │ │ │ │ │ ├── mainfeed │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── HideSponsoredStoriesPatch.kt │ │ │ │ │ └── story │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── HideStoryAdsPatch.kt │ │ │ ├── finanzonline │ │ │ │ └── detection │ │ │ │ │ ├── bootloader │ │ │ │ │ ├── BootloaderDetectionPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ └── root │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── RootDetectionPatch.kt │ │ │ ├── googlenews │ │ │ │ ├── customtabs │ │ │ │ │ ├── EnableCustomTabsPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ └── misc │ │ │ │ │ ├── extension │ │ │ │ │ ├── ExtensionPatch.kt │ │ │ │ │ └── hooks │ │ │ │ │ │ └── StartActivityInitHook.kt │ │ │ │ │ └── gms │ │ │ │ │ ├── Constants.kt │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── GmsCoreSupportPatch.kt │ │ │ ├── googlephotos │ │ │ │ └── misc │ │ │ │ │ ├── extension │ │ │ │ │ ├── ExtensionPatch.kt │ │ │ │ │ └── Hooks.kt │ │ │ │ │ ├── features │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ ├── SpoofBuildInfoPatch.kt │ │ │ │ │ └── SpoofFeaturesPatch.kt │ │ │ │ │ ├── gms │ │ │ │ │ ├── Constants.kt │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── GmsCoreSupportPatch.kt │ │ │ │ │ └── preferences │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── RestoreHiddenBackUpWhileChargingTogglePatch.kt │ │ │ ├── googlerecorder │ │ │ │ └── restrictions │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── RemoveDeviceRestrictions.kt │ │ │ ├── hexeditor │ │ │ │ └── ad │ │ │ │ │ ├── DisableAdsPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ ├── iconpackstudio │ │ │ │ └── misc │ │ │ │ │ └── pro │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── UnlockProPatch.kt │ │ │ ├── idaustria │ │ │ │ └── detection │ │ │ │ │ ├── root │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── RootDetectionPatch.kt │ │ │ │ │ └── signature │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── SpoofSignaturePatch.kt │ │ │ ├── inshorts │ │ │ │ └── ad │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── InshortsAdsPatch.kt │ │ │ ├── instagram │ │ │ │ ├── ads │ │ │ │ │ └── HideAdsPatch.kt │ │ │ │ └── misc │ │ │ │ │ └── signature │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── SignatureCheckPatch.kt │ │ │ ├── irplus │ │ │ │ └── ad │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── RemoveAdsPatch.kt │ │ │ ├── lightroom │ │ │ │ └── misc │ │ │ │ │ ├── login │ │ │ │ │ ├── DisableMandatoryLoginPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ └── premium │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── UnlockPremiumPatch.kt │ │ │ ├── memegenerator │ │ │ │ ├── detection │ │ │ │ │ ├── license │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── LicenseValidationPatch.kt │ │ │ │ │ └── signature │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── SignatureVerificationPatch.kt │ │ │ │ └── misc │ │ │ │ │ └── pro │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── UnlockProVersionPatch.kt │ │ │ ├── messenger │ │ │ │ ├── inbox │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ ├── HideInboxAdsPatch.kt │ │ │ │ │ └── HideInboxSubtabsPatch.kt │ │ │ │ ├── inputfield │ │ │ │ │ ├── DisableSwitchingEmojiToStickerPatch.kt │ │ │ │ │ ├── DisableTypingIndicatorPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ ├── metaai │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── RemoveMetaAIPatch.kt │ │ │ │ ├── misc │ │ │ │ │ └── extension │ │ │ │ │ │ ├── ExtensionPatch.kt │ │ │ │ │ │ └── Hooks.kt │ │ │ │ └── navbar │ │ │ │ │ └── RemoveMetaAITabPatch.kt │ │ │ ├── meta │ │ │ │ └── ads │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── HideAdsPatch.kt │ │ │ ├── mifitness │ │ │ │ └── misc │ │ │ │ │ ├── locale │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── ForceEnglishLocalePatch.kt │ │ │ │ │ └── login │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── FixLoginPatch.kt │ │ │ ├── music │ │ │ │ ├── ad │ │ │ │ │ └── video │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── HideVideoAds.kt │ │ │ │ ├── audio │ │ │ │ │ └── exclusiveaudio │ │ │ │ │ │ ├── EnableExclusiveAudioPlayback.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ ├── interaction │ │ │ │ │ ├── permanentrepeat │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── PermanentRepeatPatch.kt │ │ │ │ │ └── permanentshuffle │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── PermanentShufflePatch.kt │ │ │ │ ├── layout │ │ │ │ │ ├── compactheader │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── HideCategoryBar.kt │ │ │ │ │ ├── premium │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── HideGetPremiumPatch.kt │ │ │ │ │ └── upgradebutton │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── RemoveUpgradeButtonPatch.kt │ │ │ │ └── misc │ │ │ │ │ ├── androidauto │ │ │ │ │ ├── BypassCertificateChecksPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── backgroundplayback │ │ │ │ │ ├── BackgroundPlaybackPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── extension │ │ │ │ │ ├── SharedExtensionPatch.kt │ │ │ │ │ └── hooks │ │ │ │ │ │ └── ApplicationInitHook.kt │ │ │ │ │ ├── gms │ │ │ │ │ ├── Constants.kt │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── GmsCoreSupportPatch.kt │ │ │ │ │ └── spoof │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ ├── SpoofClientPatch.kt │ │ │ │ │ └── UserAgentClientSpoofPatch.kt │ │ │ ├── myexpenses │ │ │ │ └── misc │ │ │ │ │ └── pro │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── UnlockProPatch.kt │ │ │ ├── myfitnesspal │ │ │ │ └── ads │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── HideAdsPatch.kt │ │ │ ├── netguard │ │ │ │ └── broadcasts │ │ │ │ │ └── removerestriction │ │ │ │ │ └── RemoveBroadcastsRestrictionPatch.kt │ │ │ ├── nfctoolsse │ │ │ │ └── misc │ │ │ │ │ └── pro │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── UnlockProPatch.kt │ │ │ ├── nunl │ │ │ │ ├── ads │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ ├── HideAdsPatch.kt │ │ │ │ │ └── Hooks.kt │ │ │ │ └── firebase │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── SpoofCertificatePatch.kt │ │ │ ├── nyx │ │ │ │ └── misc │ │ │ │ │ └── pro │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── UnlockProPatch.kt │ │ │ ├── openinghours │ │ │ │ └── misc │ │ │ │ │ └── fix │ │ │ │ │ └── crash │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── FixCrashPatch.kt │ │ │ ├── pandora │ │ │ │ ├── ads │ │ │ │ │ └── DisableAudioAdsPatch.kt │ │ │ │ ├── misc │ │ │ │ │ └── EnableUnlimitedSkipsPatch.kt │ │ │ │ └── shared │ │ │ │ │ └── Fingerprints.kt │ │ │ ├── photomath │ │ │ │ ├── detection │ │ │ │ │ ├── deviceid │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── SpoofDeviceIdPatch.kt │ │ │ │ │ └── signature │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── SignatureDetectionPatch.kt │ │ │ │ └── misc │ │ │ │ │ ├── annoyances │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── HideUpdatePopupPatch.kt │ │ │ │ │ └── unlock │ │ │ │ │ ├── bookpoint │ │ │ │ │ ├── EnableBookpointPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ └── plus │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── UnlockPlusPatch.kt │ │ │ ├── piccomafr │ │ │ │ ├── misc │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── SpoofAndroidDeviceIdPatch.kt │ │ │ │ └── tracking │ │ │ │ │ ├── DisableTrackingPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ ├── pixiv │ │ │ │ └── ads │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── HideAdsPatch.kt │ │ │ ├── primevideo │ │ │ │ ├── ads │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── SkipAdsPatch.kt │ │ │ │ └── misc │ │ │ │ │ ├── extension │ │ │ │ │ ├── ExtensionPatch.kt │ │ │ │ │ └── Hooks.kt │ │ │ │ │ └── permissions │ │ │ │ │ └── RenamePermissionsPatch.kt │ │ │ ├── protonmail │ │ │ │ └── signature │ │ │ │ │ └── RemoveSentFromSignaturePatch.kt │ │ │ ├── rar │ │ │ │ └── misc │ │ │ │ │ └── annoyances │ │ │ │ │ └── purchasereminder │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── HidePurchaseReminderPatch.kt │ │ │ ├── reddit │ │ │ │ ├── ad │ │ │ │ │ ├── banner │ │ │ │ │ │ └── HideBannerPatch.kt │ │ │ │ │ ├── comments │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── HideCommentAdsPatch.kt │ │ │ │ │ └── general │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── HideAdsPatch.kt │ │ │ │ ├── customclients │ │ │ │ │ ├── FixSLinksPatch.kt │ │ │ │ │ ├── SpoofClientPatch.kt │ │ │ │ │ ├── baconreader │ │ │ │ │ │ └── api │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── SpoofClientPatch.kt │ │ │ │ │ ├── boostforreddit │ │ │ │ │ │ ├── ads │ │ │ │ │ │ │ ├── DisableAdsPatch.kt │ │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── SpoofClientPatch.kt │ │ │ │ │ │ ├── fix │ │ │ │ │ │ │ ├── downloads │ │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ │ └── FixAudioMissingInDownloadsPatch.kt │ │ │ │ │ │ │ └── slink │ │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ │ └── FixSLinksPatch.kt │ │ │ │ │ │ └── misc │ │ │ │ │ │ │ └── extension │ │ │ │ │ │ │ ├── SharedExtensionPatch.kt │ │ │ │ │ │ │ └── hooks │ │ │ │ │ │ │ └── InitHook.kt │ │ │ │ │ ├── infinityforreddit │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── SpoofClientPatch.kt │ │ │ │ │ │ └── subscription │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── UnlockSubscriptionPatch.kt │ │ │ │ │ ├── joeyforreddit │ │ │ │ │ │ ├── ads │ │ │ │ │ │ │ ├── DisableAdsPatch.kt │ │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── SpoofClientPatch.kt │ │ │ │ │ │ └── detection │ │ │ │ │ │ │ └── piracy │ │ │ │ │ │ │ ├── DisablePiracyDetectionPatch.kt │ │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── redditisfun │ │ │ │ │ │ └── api │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── SpoofClientPatch.kt │ │ │ │ │ ├── relayforreddit │ │ │ │ │ │ └── api │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── SpoofClientPatch.kt │ │ │ │ │ ├── slide │ │ │ │ │ │ └── api │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── SpoofClientPatch.kt │ │ │ │ │ ├── sync │ │ │ │ │ │ ├── ads │ │ │ │ │ │ │ ├── DisableAdsPatch.kt │ │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ │ ├── detection │ │ │ │ │ │ │ └── piracy │ │ │ │ │ │ │ │ ├── DisablePiracyDetectionPatch.kt │ │ │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ │ ├── syncforlemmy │ │ │ │ │ │ │ └── ads │ │ │ │ │ │ │ │ └── DisableAdsPatch.kt │ │ │ │ │ │ └── syncforreddit │ │ │ │ │ │ │ ├── ads │ │ │ │ │ │ │ └── DisableAdsPatch.kt │ │ │ │ │ │ │ ├── annoyances │ │ │ │ │ │ │ └── startup │ │ │ │ │ │ │ │ ├── DisableSyncForLemmyBottomSheetPatch.kt │ │ │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ │ │ ├── api │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── SpoofClientPatch.kt │ │ │ │ │ │ │ ├── extension │ │ │ │ │ │ │ ├── SharedExtensionPatch.kt │ │ │ │ │ │ │ └── hooks │ │ │ │ │ │ │ │ └── InitHook.kt │ │ │ │ │ │ │ └── fix │ │ │ │ │ │ │ ├── slink │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── FixSLinksPatch.kt │ │ │ │ │ │ │ ├── user │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── UseUserEndpointPatch.kt │ │ │ │ │ │ │ └── video │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── FixVideoDownloadsPatch.kt │ │ │ │ │ └── syncforreddit │ │ │ │ │ │ └── fix │ │ │ │ │ │ └── video │ │ │ │ │ │ └── FixVideoDownloadsPatch.kt │ │ │ │ ├── layout │ │ │ │ │ ├── disablescreenshotpopup │ │ │ │ │ │ ├── DisableScreenshotPopupPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ └── premiumicon │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── UnlockPremiumIconPatch.kt │ │ │ │ └── misc │ │ │ │ │ ├── extension │ │ │ │ │ └── ExtensionPatch.kt │ │ │ │ │ └── tracking │ │ │ │ │ └── url │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── SanitizeUrlQueryPatch.kt │ │ │ ├── serviceportalbund │ │ │ │ └── detection │ │ │ │ │ └── root │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── RootDetectionPatch.kt │ │ │ ├── shared │ │ │ │ ├── Fingerprints.kt │ │ │ │ └── misc │ │ │ │ │ ├── checks │ │ │ │ │ ├── BaseCheckEnvironmentPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── extension │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── SharedExtensionPatch.kt │ │ │ │ │ ├── fix │ │ │ │ │ └── verticalscroll │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── VerticalScrollPatch.kt │ │ │ │ │ ├── gms │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── GmsCoreSupportPatch.kt │ │ │ │ │ ├── hex │ │ │ │ │ └── HexPatch.kt │ │ │ │ │ ├── mapping │ │ │ │ │ └── ResourceMappingPatch.kt │ │ │ │ │ ├── pairip │ │ │ │ │ └── license │ │ │ │ │ │ ├── DisableLicenseCheckPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── settings │ │ │ │ │ ├── SettingsPatch.kt │ │ │ │ │ └── preference │ │ │ │ │ │ ├── BasePreference.kt │ │ │ │ │ │ ├── BasePreferenceScreen.kt │ │ │ │ │ │ ├── InputType.kt │ │ │ │ │ │ ├── IntentPreference.kt │ │ │ │ │ │ ├── ListPreference.kt │ │ │ │ │ │ ├── NonInteractivePreference.kt │ │ │ │ │ │ ├── PreferenceCategory.kt │ │ │ │ │ │ ├── PreferenceScreenPreference.kt │ │ │ │ │ │ ├── SummaryType.kt │ │ │ │ │ │ ├── SwitchPreference.kt │ │ │ │ │ │ └── TextPreference.kt │ │ │ │ │ └── spoof │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ ├── SpoofVideoStreamsPatch.kt │ │ │ │ │ └── UserAgentClientSpoofPatch.kt │ │ │ ├── solidexplorer2 │ │ │ │ └── functionality │ │ │ │ │ └── filesize │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── RemoveFileSizeLimitPatch.kt │ │ │ ├── songpal │ │ │ │ └── badge │ │ │ │ │ ├── BadgeTabPatch.kt │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── RemoveNotificationBadgePatch.kt │ │ │ ├── soundcloud │ │ │ │ ├── ad │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── HideAdsPatch.kt │ │ │ │ ├── analytics │ │ │ │ │ ├── DisableTelemetryPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ ├── offlinesync │ │ │ │ │ ├── EnableOfflineSyncPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ └── shared │ │ │ │ │ └── Fingerprints.kt │ │ │ ├── spotify │ │ │ │ ├── layout │ │ │ │ │ └── theme │ │ │ │ │ │ ├── CustomThemePatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ ├── lite │ │ │ │ │ └── ondemand │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── OnDemandPatch.kt │ │ │ │ ├── misc │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ ├── UnlockPremiumPatch.kt │ │ │ │ │ ├── check │ │ │ │ │ │ └── CheckEnvironmentPatch.kt │ │ │ │ │ ├── extension │ │ │ │ │ │ ├── ExtensionPatch.kt │ │ │ │ │ │ └── Hooks.kt │ │ │ │ │ ├── fix │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ ├── SpoofPackageInfoPatch.kt │ │ │ │ │ │ ├── SpoofSignaturePatch.kt │ │ │ │ │ │ └── login │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── FixFacebookLoginPatch.kt │ │ │ │ │ ├── privacy │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── SanitizeSharingLinksPatch.kt │ │ │ │ │ └── widgets │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── FixThirdPartyLaunchersWidgets.kt │ │ │ │ ├── navbar │ │ │ │ │ └── PremiumNavbarTabPatch.kt │ │ │ │ └── shared │ │ │ │ │ └── Fingerprints.kt │ │ │ ├── stocard │ │ │ │ └── layout │ │ │ │ │ ├── HideOffersTabPatch.kt │ │ │ │ │ └── HideStoryBubblesPatch.kt │ │ │ ├── strava │ │ │ │ ├── subscription │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── UnlockSubscriptionPatch.kt │ │ │ │ └── upselling │ │ │ │ │ ├── DisableSubscriptionSuggestionsPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ ├── swissid │ │ │ │ └── integritycheck │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── RemoveGooglePlayIntegrityCheckPatch.kt │ │ │ ├── ticktick │ │ │ │ └── misc │ │ │ │ │ └── themeunlock │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── UnlockThemePatch.kt │ │ │ ├── tiktok │ │ │ │ ├── feedfilter │ │ │ │ │ ├── FeedFilterPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ ├── interaction │ │ │ │ │ ├── cleardisplay │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── RememberClearDisplayPatch.kt │ │ │ │ │ ├── downloads │ │ │ │ │ │ ├── DownloadsPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── seekbar │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── ShowSeekbarPatch.kt │ │ │ │ │ └── speed │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── PlaybackSpeedPatch.kt │ │ │ │ ├── misc │ │ │ │ │ ├── extension │ │ │ │ │ │ ├── ExtensionPatch.kt │ │ │ │ │ │ └── Hooks.kt │ │ │ │ │ ├── login │ │ │ │ │ │ ├── disablerequirement │ │ │ │ │ │ │ ├── DisableLoginRequirementPatch.kt │ │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ │ └── fixgoogle │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── FixGoogleLoginPatch.kt │ │ │ │ │ ├── settings │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── SettingsPatch.kt │ │ │ │ │ └── spoof │ │ │ │ │ │ └── sim │ │ │ │ │ │ └── SpoofSimPatch.kt │ │ │ │ └── shared │ │ │ │ │ └── Fingerprints.kt │ │ │ ├── trakt │ │ │ │ ├── Fingerprints.kt │ │ │ │ └── UnlockProPatch.kt │ │ │ ├── tudortmund │ │ │ │ ├── lockscreen │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── ShowOnLockscreenPatch.kt │ │ │ │ └── misc │ │ │ │ │ └── extension │ │ │ │ │ └── ExtensionPatch.kt │ │ │ ├── tumblr │ │ │ │ ├── ads │ │ │ │ │ └── DisableDashboardAds.kt │ │ │ │ ├── annoyances │ │ │ │ │ ├── adfree │ │ │ │ │ │ └── DisableAdFreeBannerPatch.kt │ │ │ │ │ ├── inappupdate │ │ │ │ │ │ └── DisableInAppUpdatePatch.kt │ │ │ │ │ ├── notifications │ │ │ │ │ │ ├── DisableBlogNotificationReminderPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ └── popups │ │ │ │ │ │ ├── DisableGiftMessagePopupPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ ├── featureflags │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── OverrideFeatureFlagsPatch.kt │ │ │ │ ├── fixes │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── FixOldVersionsPatch.kt │ │ │ │ ├── misc │ │ │ │ │ └── extension │ │ │ │ │ │ └── ExtensionPatch.kt │ │ │ │ └── timelinefilter │ │ │ │ │ ├── FilterTimelineObjectsPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ ├── twitch │ │ │ │ ├── ad │ │ │ │ │ ├── audio │ │ │ │ │ │ ├── AudioAdsPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── embedded │ │ │ │ │ │ ├── EmbeddedAdsPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── shared │ │ │ │ │ │ └── util │ │ │ │ │ │ │ └── AdPatch.kt │ │ │ │ │ └── video │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── VideoAdsPatch.kt │ │ │ │ ├── chat │ │ │ │ │ ├── antidelete │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── ShowDeletedMessagesPatch.kt │ │ │ │ │ └── autoclaim │ │ │ │ │ │ ├── AutoClaimChannelPointsPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ ├── debug │ │ │ │ │ ├── DebugModePatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ └── misc │ │ │ │ │ ├── extension │ │ │ │ │ ├── Hooks.kt │ │ │ │ │ └── SharedExtensionPatch.kt │ │ │ │ │ └── settings │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── SettingsPatch.kt │ │ │ ├── twitter │ │ │ │ ├── interaction │ │ │ │ │ └── downloads │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── UnlockDownloadsPatch.kt │ │ │ │ ├── layout │ │ │ │ │ └── viewcount │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── HideViewCountPatch.kt │ │ │ │ └── misc │ │ │ │ │ ├── dynamiccolor │ │ │ │ │ └── DynamicColorPatch.kt │ │ │ │ │ ├── extension │ │ │ │ │ └── ExtensionPatch.kt │ │ │ │ │ ├── hook │ │ │ │ │ ├── HideAdsHookPatch.kt │ │ │ │ │ ├── HideRecommendedUsersPatch.kt │ │ │ │ │ ├── HookPatch.kt │ │ │ │ │ └── json │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── JsonHookPatch.kt │ │ │ │ │ └── links │ │ │ │ │ ├── ChangeLinkSharingDomainPatch.kt │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ ├── OpenLinksWithAppChooserPatch.kt │ │ │ │ │ └── SanitizeSharingLinksPatch.kt │ │ │ ├── vsco │ │ │ │ └── misc │ │ │ │ │ └── pro │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── UnlockProPatch.kt │ │ │ ├── warnwetter │ │ │ │ └── misc │ │ │ │ │ ├── firebasegetcert │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── FirebaseGetCertPatch.kt │ │ │ │ │ └── promocode │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── PromoCodeUnlockPatch.kt │ │ │ ├── willhaben │ │ │ │ └── ads │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── HideAdsPatch.kt │ │ │ ├── windyapp │ │ │ │ └── misc │ │ │ │ │ └── unlockpro │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── UnlockProPatch.kt │ │ │ ├── youtube │ │ │ │ ├── ad │ │ │ │ │ ├── general │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── HideAdsPatch.kt │ │ │ │ │ ├── getpremium │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── HideGetPremiumPatch.kt │ │ │ │ │ └── video │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── VideoAdsPatch.kt │ │ │ │ ├── interaction │ │ │ │ │ ├── copyvideourl │ │ │ │ │ │ └── CopyVideoUrlPatch.kt │ │ │ │ │ ├── dialog │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── RemoveViewerDiscretionDialogPatch.kt │ │ │ │ │ ├── downloads │ │ │ │ │ │ ├── DownloadsPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── seekbar │ │ │ │ │ │ ├── DisablePreciseSeekingGesturePatch.kt │ │ │ │ │ │ ├── EnableSeekbarTappingPatch.kt │ │ │ │ │ │ ├── EnableSlideToSeekPatch.kt │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ ├── HideSeekbarPatch.kt │ │ │ │ │ │ ├── SeekbarPatch.kt │ │ │ │ │ │ └── SeekbarThumbnailsPatch.kt │ │ │ │ │ └── swipecontrols │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── SwipeControlsPatch.kt │ │ │ │ ├── layout │ │ │ │ │ ├── autocaptions │ │ │ │ │ │ ├── AutoCaptionsPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── branding │ │ │ │ │ │ ├── CustomBrandingPatch.kt │ │ │ │ │ │ └── header │ │ │ │ │ │ │ └── ChangeHeaderPatch.kt │ │ │ │ │ ├── buttons │ │ │ │ │ │ ├── action │ │ │ │ │ │ │ └── HideButtonsPatch.kt │ │ │ │ │ │ ├── navigation │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── NavigationButtonsPatch.kt │ │ │ │ │ │ └── overlay │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── HidePlayerOverlayButtonsPatch.kt │ │ │ │ │ ├── formfactor │ │ │ │ │ │ ├── ChangeFormFactorPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── hide │ │ │ │ │ │ ├── endscreencards │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── HideEndscreenCardsPatch.kt │ │ │ │ │ │ ├── endscreensuggestion │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── HideEndScreenSuggestedVideoPatch.kt │ │ │ │ │ │ ├── fullscreenambientmode │ │ │ │ │ │ │ ├── DisableFullscreenAmbientModePatch.kt │ │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ │ ├── general │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── HideLayoutComponentsPatch.kt │ │ │ │ │ │ ├── infocards │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── HideInfoCardsPatch.kt │ │ │ │ │ │ ├── player │ │ │ │ │ │ │ └── flyoutmenupanel │ │ │ │ │ │ │ │ └── HidePlayerFlyoutMenuPatch.kt │ │ │ │ │ │ ├── relatedvideooverlay │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── HideRelatedVideoOverlayPatch.kt │ │ │ │ │ │ ├── rollingnumber │ │ │ │ │ │ │ └── DisableRollingNumberAnimationPatch.kt │ │ │ │ │ │ ├── seekbar │ │ │ │ │ │ │ └── HideSeekbarPatch.kt │ │ │ │ │ │ ├── shorts │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── HideShortsComponentsPatch.kt │ │ │ │ │ │ ├── suggestedvideoendscreen │ │ │ │ │ │ │ └── DisableSuggestedVideoEndScreenPatch.kt │ │ │ │ │ │ └── time │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── HideTimestampPatch.kt │ │ │ │ │ ├── miniplayer │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── MiniplayerPatch.kt │ │ │ │ │ ├── panels │ │ │ │ │ │ └── popup │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── PlayerPopupPanelsPatch.kt │ │ │ │ │ ├── player │ │ │ │ │ │ ├── background │ │ │ │ │ │ │ └── PlayerControlsBackgroundPatch.kt │ │ │ │ │ │ ├── fullscreen │ │ │ │ │ │ │ ├── ExitFullscreenPatch.kt │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ ├── OpenVideosFullscreen.kt │ │ │ │ │ │ │ ├── OpenVideosFullscreenHookPatch.kt │ │ │ │ │ │ │ └── OpenVideosFullscreenPatch.kt │ │ │ │ │ │ └── overlay │ │ │ │ │ │ │ ├── CustomPlayerOverlayOpacityPatch.kt │ │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── returnyoutubedislike │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── ReturnYouTubeDislikePatch.kt │ │ │ │ │ ├── searchbar │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── WideSearchbarPatch.kt │ │ │ │ │ ├── seekbar │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ ├── RestoreOldSeekbarThumbnailsPatch.kt │ │ │ │ │ │ └── SeekbarColorPatch.kt │ │ │ │ │ ├── shortsautoplay │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── ShortsAutoplayPatch.kt │ │ │ │ │ ├── shortsplayer │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── OpenShortsInRegularPlayerPatch.kt │ │ │ │ │ ├── sponsorblock │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── SponsorBlockPatch.kt │ │ │ │ │ ├── spoofappversion │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── SpoofAppVersionPatch.kt │ │ │ │ │ ├── startpage │ │ │ │ │ │ ├── ChangeStartPagePatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── startupshortsreset │ │ │ │ │ │ ├── DisableResumingShortsOnStartupPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── tablet │ │ │ │ │ │ └── EnableTabletLayoutPatch.kt │ │ │ │ │ ├── theme │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ ├── LithoColorHookPatch.kt │ │ │ │ │ │ └── ThemePatch.kt │ │ │ │ │ └── thumbnails │ │ │ │ │ │ ├── AlternativeThumbnailsPatch.kt │ │ │ │ │ │ └── BypassImageRegionRestrictionsPatch.kt │ │ │ │ ├── misc │ │ │ │ │ ├── announcements │ │ │ │ │ │ └── AnnouncementsPatch.kt │ │ │ │ │ ├── autorepeat │ │ │ │ │ │ └── AutoRepeatPatch.kt │ │ │ │ │ ├── backgroundplayback │ │ │ │ │ │ ├── BackgroundPlaybackPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── check │ │ │ │ │ │ └── CheckEnvironmentPatch.kt │ │ │ │ │ ├── debugging │ │ │ │ │ │ ├── EnableDebuggingPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── dimensions │ │ │ │ │ │ └── spoof │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── SpoofDeviceDimensionsPatch.kt │ │ │ │ │ ├── dns │ │ │ │ │ │ └── CheckWatchHistoryDomainNameResolutionPatch.kt │ │ │ │ │ ├── extension │ │ │ │ │ │ ├── SharedExtensionPatch.kt │ │ │ │ │ │ └── hooks │ │ │ │ │ │ │ └── ApplicationInitHook.kt │ │ │ │ │ ├── fix │ │ │ │ │ │ ├── backtoexitgesture │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── FixBackToExitGesturePatch.kt │ │ │ │ │ │ ├── playback │ │ │ │ │ │ │ ├── SpoofVideoStreamsPatch.kt │ │ │ │ │ │ │ └── UserAgentClientSpoofPatch.kt │ │ │ │ │ │ └── playbackspeed │ │ │ │ │ │ │ ├── FIxPlaybackSpeedWhilePlayingPatch.kt │ │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── gms │ │ │ │ │ │ ├── AccountCredentialsInvalidTextPatch.kt │ │ │ │ │ │ ├── Constants.kt │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── GmsCoreSupportPatch.kt │ │ │ │ │ ├── hapticfeedback │ │ │ │ │ │ ├── DisableHapticFeedbackPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── imageurlhook │ │ │ │ │ │ ├── CronetImageUrlHook.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── links │ │ │ │ │ │ ├── BypassURLRedirectsPatch.kt │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── OpenLinksExternallyPatch.kt │ │ │ │ │ ├── litho │ │ │ │ │ │ └── filter │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── LithoFilterPatch.kt │ │ │ │ │ ├── navigation │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── NavigationBarHookPatch.kt │ │ │ │ │ ├── playercontrols │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── PlayerControlsPatch.kt │ │ │ │ │ ├── playertype │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── PlayerTypeHookPatch.kt │ │ │ │ │ ├── playservice │ │ │ │ │ │ └── VersionCheckPatch.kt │ │ │ │ │ ├── privacy │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── RemoveTrackingQueryParameterPatch.kt │ │ │ │ │ ├── recyclerviewtree │ │ │ │ │ │ └── hook │ │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ │ └── RecyclerViewTreeHookPatch.kt │ │ │ │ │ ├── settings │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── SettingsPatch.kt │ │ │ │ │ ├── spoof │ │ │ │ │ │ ├── SpoofVideoStreamsPatch.kt │ │ │ │ │ │ └── UserAgentClientSpoofPatch.kt │ │ │ │ │ └── zoomhaptics │ │ │ │ │ │ └── ZoomHapticsPatch.kt │ │ │ │ ├── shared │ │ │ │ │ └── Fingerprints.kt │ │ │ │ └── video │ │ │ │ │ ├── audio │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── ForceOriginalAudioPatch.kt │ │ │ │ │ ├── hdr │ │ │ │ │ ├── DisableHdrPatch.kt │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ ├── information │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── VideoInformationPatch.kt │ │ │ │ │ ├── playerresponse │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── PlayerResponseMethodHookPatch.kt │ │ │ │ │ ├── quality │ │ │ │ │ ├── AdvancedVideoQualityMenuPatch.kt │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ ├── RememberVideoQualityPatch.kt │ │ │ │ │ └── VideoQualityPatch.kt │ │ │ │ │ ├── speed │ │ │ │ │ ├── PlaybackSpeedPatch.kt │ │ │ │ │ ├── button │ │ │ │ │ │ └── PlaybackSpeedButtonPatch.kt │ │ │ │ │ ├── custom │ │ │ │ │ │ ├── CustomPlaybackSpeedPatch.kt │ │ │ │ │ │ └── Fingerprints.kt │ │ │ │ │ └── remember │ │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ │ └── RememberPlaybackSpeedPatch.kt │ │ │ │ │ ├── videoid │ │ │ │ │ ├── Fingerprints.kt │ │ │ │ │ └── VideoIdPatch.kt │ │ │ │ │ └── videoqualitymenu │ │ │ │ │ └── RestoreOldVideoQualityMenuPatch.kt │ │ │ └── yuka │ │ │ │ └── misc │ │ │ │ └── unlockpremium │ │ │ │ ├── Fingerprints.kt │ │ │ │ └── UnlockPremiumPatch.kt │ │ │ └── util │ │ │ ├── BytecodeUtils.kt │ │ │ ├── CrowdinPreprocessor.kt │ │ │ ├── ResourceUtils.kt │ │ │ ├── Utils.kt │ │ │ └── resource │ │ │ ├── ArrayResource.kt │ │ │ ├── BaseResource.kt │ │ │ └── StringResource.kt │ │ └── resources │ │ ├── addresources │ │ ├── values-af-rZA │ │ │ └── strings.xml │ │ ├── values-am-rET │ │ │ └── strings.xml │ │ ├── values-ar-rSA │ │ │ └── strings.xml │ │ ├── values-as-rIN │ │ │ └── strings.xml │ │ ├── values-az-rAZ │ │ │ └── strings.xml │ │ ├── values-be-rBY │ │ │ └── strings.xml │ │ ├── values-bg-rBG │ │ │ └── strings.xml │ │ ├── values-bn-rBD │ │ │ └── strings.xml │ │ ├── values-bs-rBA │ │ │ └── strings.xml │ │ ├── values-ca-rES │ │ │ └── strings.xml │ │ ├── values-cs-rCZ │ │ │ └── strings.xml │ │ ├── values-da-rDK │ │ │ └── strings.xml │ │ ├── values-de-rDE │ │ │ └── strings.xml │ │ ├── values-el-rGR │ │ │ └── strings.xml │ │ ├── values-es-rES │ │ │ └── strings.xml │ │ ├── values-et-rEE │ │ │ └── strings.xml │ │ ├── values-eu-rES │ │ │ └── strings.xml │ │ ├── values-fa-rIR │ │ │ └── strings.xml │ │ ├── values-fi-rFI │ │ │ └── strings.xml │ │ ├── values-fil-rPH │ │ │ └── strings.xml │ │ ├── values-fr-rFR │ │ │ └── strings.xml │ │ ├── values-ga-rIE │ │ │ └── strings.xml │ │ ├── values-gl-rES │ │ │ └── strings.xml │ │ ├── values-gu-rIN │ │ │ └── strings.xml │ │ ├── values-hi-rIN │ │ │ └── strings.xml │ │ ├── values-hr-rHR │ │ │ └── strings.xml │ │ ├── values-hu-rHU │ │ │ └── strings.xml │ │ ├── values-hy-rAM │ │ │ └── strings.xml │ │ ├── values-in-rID │ │ │ └── strings.xml │ │ ├── values-is-rIS │ │ │ └── strings.xml │ │ ├── values-it-rIT │ │ │ └── strings.xml │ │ ├── values-iw-rIL │ │ │ └── strings.xml │ │ ├── values-ja-rJP │ │ │ └── strings.xml │ │ ├── values-ka-rGE │ │ │ └── strings.xml │ │ ├── values-kk-rKZ │ │ │ └── strings.xml │ │ ├── values-km-rKH │ │ │ └── strings.xml │ │ ├── values-kn-rIN │ │ │ └── strings.xml │ │ ├── values-ko-rKR │ │ │ └── strings.xml │ │ ├── values-ky-rKG │ │ │ └── strings.xml │ │ ├── values-lo-rLA │ │ │ └── strings.xml │ │ ├── values-lt-rLT │ │ │ └── strings.xml │ │ ├── values-lv-rLV │ │ │ └── strings.xml │ │ ├── values-mk-rMK │ │ │ └── strings.xml │ │ ├── values-ml-rIN │ │ │ └── strings.xml │ │ ├── values-mn-rMN │ │ │ └── strings.xml │ │ ├── values-mr-rIN │ │ │ └── strings.xml │ │ ├── values-ms-rMY │ │ │ └── strings.xml │ │ ├── values-my-rMM │ │ │ └── strings.xml │ │ ├── values-nb-rNO │ │ │ └── strings.xml │ │ ├── values-ne-rIN │ │ │ └── strings.xml │ │ ├── values-nl-rNL │ │ │ └── strings.xml │ │ ├── values-or-rIN │ │ │ └── strings.xml │ │ ├── values-pa-rIN │ │ │ └── strings.xml │ │ ├── values-pl-rPL │ │ │ └── strings.xml │ │ ├── values-pt-rBR │ │ │ └── strings.xml │ │ ├── values-pt-rPT │ │ │ └── strings.xml │ │ ├── values-ro-rRO │ │ │ └── strings.xml │ │ ├── values-ru-rRU │ │ │ └── strings.xml │ │ ├── values-si-rLK │ │ │ └── strings.xml │ │ ├── values-sk-rSK │ │ │ └── strings.xml │ │ ├── values-sl-rSI │ │ │ └── strings.xml │ │ ├── values-sq-rAL │ │ │ └── strings.xml │ │ ├── values-sr-rCS │ │ │ └── strings.xml │ │ ├── values-sr-rSP │ │ │ └── strings.xml │ │ ├── values-sv-rSE │ │ │ └── strings.xml │ │ ├── values-sw-rKE │ │ │ └── strings.xml │ │ ├── values-ta-rIN │ │ │ └── strings.xml │ │ ├── values-te-rIN │ │ │ └── strings.xml │ │ ├── values-th-rTH │ │ │ └── strings.xml │ │ ├── values-tr-rTR │ │ │ └── strings.xml │ │ ├── values-uk-rUA │ │ │ └── strings.xml │ │ ├── values-ur-rIN │ │ │ └── strings.xml │ │ ├── values-uz-rUZ │ │ │ └── strings.xml │ │ ├── values-vi-rVN │ │ │ └── strings.xml │ │ ├── values-zh-rCN │ │ │ └── strings.xml │ │ ├── values-zh-rTW │ │ │ └── strings.xml │ │ ├── values-zu-rZA │ │ │ └── strings.xml │ │ └── values │ │ │ ├── arrays.xml │ │ │ └── strings.xml │ │ ├── change-header │ │ ├── revanced-borderless │ │ │ ├── drawable-hdpi │ │ │ │ ├── yt_wordmark_header_dark.png │ │ │ │ └── yt_wordmark_header_light.png │ │ │ ├── drawable-mdpi │ │ │ │ ├── yt_wordmark_header_dark.png │ │ │ │ └── yt_wordmark_header_light.png │ │ │ ├── drawable-xhdpi │ │ │ │ ├── yt_wordmark_header_dark.png │ │ │ │ └── yt_wordmark_header_light.png │ │ │ ├── drawable-xxhdpi │ │ │ │ ├── yt_wordmark_header_dark.png │ │ │ │ └── yt_wordmark_header_light.png │ │ │ └── drawable-xxxhdpi │ │ │ │ ├── yt_wordmark_header_dark.png │ │ │ │ └── yt_wordmark_header_light.png │ │ └── revanced │ │ │ ├── drawable-hdpi │ │ │ ├── yt_wordmark_header_dark.png │ │ │ └── yt_wordmark_header_light.png │ │ │ ├── drawable-mdpi │ │ │ ├── yt_wordmark_header_dark.png │ │ │ └── yt_wordmark_header_light.png │ │ │ ├── drawable-xhdpi │ │ │ ├── yt_wordmark_header_dark.png │ │ │ └── yt_wordmark_header_light.png │ │ │ ├── drawable-xxhdpi │ │ │ ├── yt_wordmark_header_dark.png │ │ │ └── yt_wordmark_header_light.png │ │ │ └── drawable-xxxhdpi │ │ │ ├── yt_wordmark_header_dark.png │ │ │ └── yt_wordmark_header_light.png │ │ ├── copyvideourl │ │ ├── drawable │ │ │ ├── revanced_yt_copy.xml │ │ │ └── revanced_yt_copy_timestamp.xml │ │ └── host │ │ │ └── layout │ │ │ └── youtube_controls_bottom_ui_container.xml │ │ ├── custom-branding │ │ ├── mipmap-hdpi │ │ │ ├── adaptiveproduct_youtube_background_color_108.png │ │ │ ├── adaptiveproduct_youtube_foreground_color_108.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ │ ├── adaptiveproduct_youtube_background_color_108.png │ │ │ ├── adaptiveproduct_youtube_foreground_color_108.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ │ ├── adaptiveproduct_youtube_background_color_108.png │ │ │ ├── adaptiveproduct_youtube_foreground_color_108.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ │ ├── adaptiveproduct_youtube_background_color_108.png │ │ │ ├── adaptiveproduct_youtube_foreground_color_108.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ └── mipmap-xxxhdpi │ │ │ ├── adaptiveproduct_youtube_background_color_108.png │ │ │ ├── adaptiveproduct_youtube_foreground_color_108.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ ├── downloads │ │ ├── drawable │ │ │ └── revanced_yt_download_button.xml │ │ └── host │ │ │ └── layout │ │ │ └── youtube_controls_bottom_ui_container.xml │ │ ├── seekbar │ │ └── values │ │ │ └── attrs.xml │ │ ├── settings │ │ ├── drawable │ │ │ ├── revanced_settings_circle_background.xml │ │ │ ├── revanced_settings_cursor.xml │ │ │ ├── revanced_settings_icon.xml │ │ │ ├── revanced_settings_screen_00_about.xml │ │ │ ├── revanced_settings_screen_01_ads.xml │ │ │ ├── revanced_settings_screen_02_alt_thumbnails.xml │ │ │ ├── revanced_settings_screen_03_feed.xml │ │ │ ├── revanced_settings_screen_04_general.xml │ │ │ ├── revanced_settings_screen_05_player.xml │ │ │ ├── revanced_settings_screen_06_shorts.xml │ │ │ ├── revanced_settings_screen_07_seekbar.xml │ │ │ ├── revanced_settings_screen_08_swipe_controls.xml │ │ │ ├── revanced_settings_screen_09_return_youtube_dislike.xml │ │ │ ├── revanced_settings_screen_10_sponsorblock.xml │ │ │ ├── revanced_settings_screen_11_misc.xml │ │ │ └── revanced_settings_screen_12_video.xml │ │ ├── host │ │ │ └── values │ │ │ │ └── styles.xml │ │ ├── layout │ │ │ ├── revanced_color_dot_widget.xml │ │ │ ├── revanced_color_picker.xml │ │ │ ├── revanced_preference_with_icon_no_search_result.xml │ │ │ ├── revanced_search_suggestion_item.xml │ │ │ └── revanced_settings_with_toolbar.xml │ │ ├── menu │ │ │ └── revanced_search_menu.xml │ │ └── xml │ │ │ ├── revanced_prefs.xml │ │ │ └── revanced_prefs_icons.xml │ │ ├── speedbutton │ │ ├── drawable │ │ │ └── revanced_playback_speed_dialog_button.xml │ │ └── host │ │ │ └── layout │ │ │ └── youtube_controls_bottom_ui_container.xml │ │ ├── sponsorblock │ │ ├── drawable │ │ │ ├── revanced_sb_adjust.xml │ │ │ ├── revanced_sb_backward.xml │ │ │ ├── revanced_sb_compare.xml │ │ │ ├── revanced_sb_edit.xml │ │ │ ├── revanced_sb_forward.xml │ │ │ ├── revanced_sb_logo.xml │ │ │ ├── revanced_sb_publish.xml │ │ │ └── revanced_sb_voting.xml │ │ ├── host │ │ │ └── layout │ │ │ │ └── youtube_controls_layout.xml │ │ └── layout │ │ │ ├── revanced_sb_inline_sponsor_overlay.xml │ │ │ ├── revanced_sb_new_segment.xml │ │ │ └── revanced_sb_skip_sponsor_button.xml │ │ └── swipecontrols │ │ └── drawable │ │ ├── revanced_ic_sc_brightness_auto.xml │ │ ├── revanced_ic_sc_brightness_full.xml │ │ ├── revanced_ic_sc_brightness_high.xml │ │ ├── revanced_ic_sc_brightness_low.xml │ │ ├── revanced_ic_sc_brightness_medium.xml │ │ ├── revanced_ic_sc_volume_high.xml │ │ ├── revanced_ic_sc_volume_low.xml │ │ ├── revanced_ic_sc_volume_mute.xml │ │ └── revanced_ic_sc_volume_normal.xml └── stub │ ├── build.gradle.kts │ └── src │ └── main │ └── java │ └── android │ └── os │ └── Build.java └── settings.gradle.kts /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{kt,kts}] 2 | ktlint_code_style = intellij_idea 3 | ktlint_standard_no-wildcard-imports = disabled -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # 2 | # https://help.github.com/articles/dealing-with-line-endings/ 3 | # 4 | # Linux start script should use lf 5 | /gradlew text eol=lf 6 | 7 | # These are Windows script files and should use crlf 8 | *.bat text eol=crlf 9 | 10 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: 🗨 Discussions 4 | url: https://github.com/revanced/revanced-suggestions/discussions 5 | about: Have something unspecific to ReVanced Patches in mind? Search for or start a new discussion! -------------------------------------------------------------------------------- /.github/config.yml: -------------------------------------------------------------------------------- 1 | firstPRMergeComment: > 2 | Thank you for contributing to ReVanced. Join us on [Discord](https://revanced.app/discord) to receive a role for your contribution. 3 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: github-actions 4 | labels: [] 5 | directory: / 6 | target-branch: dev 7 | schedule: 8 | interval: monthly 9 | 10 | - package-ecosystem: npm 11 | labels: [] 12 | directory: / 13 | target-branch: dev 14 | schedule: 15 | interval: monthly 16 | 17 | - package-ecosystem: gradle 18 | labels: [] 19 | directory: / 20 | target-branch: dev 21 | schedule: 22 | interval: monthly 23 | -------------------------------------------------------------------------------- /.github/workflows/update-gradle-wrapper.yml: -------------------------------------------------------------------------------- 1 | name: Update Gradle wrapper 2 | 3 | on: 4 | schedule: 5 | - cron: "0 0 1 * *" 6 | workflow_dispatch: 7 | 8 | jobs: 9 | update: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v4 14 | 15 | - name: Update Gradle Wrapper 16 | uses: gradle-update/update-gradle-wrapper-action@v1 17 | with: 18 | target-branch: dev 19 | -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | /kotlinc.xml 10 | -------------------------------------------------------------------------------- /.idea/discord.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | -------------------------------------------------------------------------------- /.idea/git_toolbox_prj.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 9 | 14 | 15 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | project_id_env: "CROWDIN_PROJECT_ID" 2 | api_token_env: "CROWDIN_PERSONAL_TOKEN" 3 | 4 | preserve_hierarchy: false 5 | files: 6 | - source: patches/src/main/resources/addresources/values/strings.xml 7 | translation: patches/src/main/resources/addresources/values-%android_code%/strings.xml 8 | skip_untranslated_strings: true 9 | -------------------------------------------------------------------------------- /extensions/all/misc/adb/hide-adb/build.gradle.kts: -------------------------------------------------------------------------------- 1 | android { 2 | namespace = "app.revanced.extension" 3 | 4 | defaultConfig { 5 | minSdk = 21 6 | } 7 | 8 | compileOptions { 9 | sourceCompatibility = JavaVersion.VERSION_11 10 | targetCompatibility = JavaVersion.VERSION_11 11 | } 12 | } 13 | 14 | dependencies { 15 | compileOnly(libs.annotation) 16 | } 17 | -------------------------------------------------------------------------------- /extensions/all/misc/adb/hide-adb/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/all/misc/connectivity/wifi/spoof/spoof-wifi/build.gradle.kts: -------------------------------------------------------------------------------- 1 | android { 2 | namespace = "app.revanced.extension" 3 | 4 | compileOptions { 5 | sourceCompatibility = JavaVersion.VERSION_11 6 | targetCompatibility = JavaVersion.VERSION_11 7 | } 8 | } 9 | 10 | dependencies { 11 | compileOnly(libs.annotation) 12 | } 13 | -------------------------------------------------------------------------------- /extensions/all/misc/connectivity/wifi/spoof/spoof-wifi/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /extensions/all/misc/directory/documentsprovider/export-internal-data-documents-provider/build.gradle.kts: -------------------------------------------------------------------------------- 1 | android { 2 | namespace = "app.revanced.extension" 3 | 4 | defaultConfig { 5 | minSdk = 21 6 | } 7 | 8 | compileOptions { 9 | sourceCompatibility = JavaVersion.VERSION_11 10 | targetCompatibility = JavaVersion.VERSION_11 11 | } 12 | } 13 | 14 | dependencies { 15 | compileOnly(libs.annotation) 16 | } 17 | -------------------------------------------------------------------------------- /extensions/all/misc/directory/documentsprovider/export-internal-data-documents-provider/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/all/misc/screencapture/remove-screen-capture-restriction/build.gradle.kts: -------------------------------------------------------------------------------- 1 | android { 2 | namespace = "app.revanced.extension" 3 | 4 | defaultConfig { 5 | minSdk = 21 6 | } 7 | 8 | compileOptions { 9 | sourceCompatibility = JavaVersion.VERSION_11 10 | targetCompatibility = JavaVersion.VERSION_11 11 | } 12 | } 13 | 14 | dependencies { 15 | compileOnly(libs.annotation) 16 | } 17 | -------------------------------------------------------------------------------- /extensions/all/misc/screencapture/remove-screen-capture-restriction/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/all/misc/screenshot/remove-screenshot-restriction/build.gradle.kts: -------------------------------------------------------------------------------- 1 | android { 2 | namespace = "app.revanced.extension" 3 | 4 | defaultConfig { 5 | minSdk = 21 6 | } 7 | 8 | compileOptions { 9 | sourceCompatibility = JavaVersion.VERSION_11 10 | targetCompatibility = JavaVersion.VERSION_11 11 | } 12 | } 13 | 14 | dependencies { 15 | compileOnly(libs.annotation) 16 | } 17 | -------------------------------------------------------------------------------- /extensions/all/misc/screenshot/remove-screenshot-restriction/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/boostforreddit/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly(project(":extensions:shared:library")) 3 | compileOnly(project(":extensions:boostforreddit:stub")) 4 | } 5 | -------------------------------------------------------------------------------- /extensions/boostforreddit/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/boostforreddit/stub/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | } 4 | 5 | android { 6 | namespace = "app.revanced.extension" 7 | compileSdk = 34 8 | 9 | defaultConfig { 10 | minSdk = 24 11 | } 12 | 13 | compileOptions { 14 | sourceCompatibility = JavaVersion.VERSION_11 15 | targetCompatibility = JavaVersion.VERSION_11 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /extensions/boostforreddit/stub/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/boostforreddit/stub/src/main/java/com/rubenmayayo/reddit/ui/activities/WebViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.rubenmayayo.reddit.ui.activities; 2 | 3 | import android.app.Activity; 4 | 5 | public class WebViewActivity extends Activity { 6 | } 7 | -------------------------------------------------------------------------------- /extensions/messenger/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly(project(":extensions:shared:library")) 3 | } 4 | -------------------------------------------------------------------------------- /extensions/messenger/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/messenger/src/main/java/app/revanced/extension/messenger/metaai/RemoveMetaAIPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.messenger.metaai; 2 | 3 | @SuppressWarnings("unused") 4 | public class RemoveMetaAIPatch { 5 | public static boolean overrideConfigBool(long id, boolean value) { 6 | // It seems like all configs starting with 363219 are related to Meta AI. 7 | // A list of specific ones that need disabling would probably be better, 8 | // but these config numbers seem to change slightly with each update. 9 | // These first 6 digits don't though. 10 | if (Long.toString(id).startsWith("363219")) 11 | return false; 12 | 13 | return value; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /extensions/music/build.gradle.kts: -------------------------------------------------------------------------------- 1 | android { 2 | defaultConfig { 3 | minSdk = 26 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /extensions/music/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/nunl/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly(project(":extensions:shared:library")) 3 | compileOnly(project(":extensions:nunl:stub")) 4 | } 5 | -------------------------------------------------------------------------------- /extensions/nunl/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/nunl/stub/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | } 4 | 5 | android { 6 | namespace = "app.revanced.extension" 7 | compileSdk = 34 8 | 9 | defaultConfig { 10 | minSdk = 26 11 | } 12 | 13 | compileOptions { 14 | sourceCompatibility = JavaVersion.VERSION_17 15 | targetCompatibility = JavaVersion.VERSION_17 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /extensions/nunl/stub/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/interfaces/Block.java: -------------------------------------------------------------------------------- 1 | package nl.nu.performance.api.client.interfaces; 2 | 3 | public class Block { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/objects/DividerBlock.java: -------------------------------------------------------------------------------- 1 | package nl.nu.performance.api.client.objects; 2 | 3 | import nl.nu.performance.api.client.interfaces.Block; 4 | 5 | public class DividerBlock extends Block { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/objects/DpgBannerBlock.java: -------------------------------------------------------------------------------- 1 | package nl.nu.performance.api.client.objects; 2 | 3 | import nl.nu.performance.api.client.interfaces.Block; 4 | 5 | public class DpgBannerBlock extends Block { 6 | 7 | } 8 | -------------------------------------------------------------------------------- /extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/objects/HeaderBlock.java: -------------------------------------------------------------------------------- 1 | package nl.nu.performance.api.client.objects; 2 | 3 | import nl.nu.performance.api.client.interfaces.Block; 4 | 5 | public class HeaderBlock extends Block { 6 | public final StyledText getTitle() { 7 | throw new UnsupportedOperationException("Stub"); 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/objects/Link.java: -------------------------------------------------------------------------------- 1 | package nl.nu.performance.api.client.objects; 2 | 3 | import nl.nu.performance.api.client.unions.LinkFlavor; 4 | 5 | public class Link { 6 | public final StyledText getTitle() { 7 | throw new UnsupportedOperationException("Stub"); 8 | } 9 | 10 | public final LinkFlavor getLinkFlavor() { 11 | throw new UnsupportedOperationException("Stub"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/objects/LinkBlock.java: -------------------------------------------------------------------------------- 1 | package nl.nu.performance.api.client.objects; 2 | 3 | import android.os.Parcelable; 4 | import nl.nu.performance.api.client.interfaces.Block; 5 | 6 | public abstract class LinkBlock extends Block implements Parcelable { 7 | public final Link getLink() { 8 | throw new UnsupportedOperationException("Stub"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/objects/StyledText.java: -------------------------------------------------------------------------------- 1 | package nl.nu.performance.api.client.objects; 2 | 3 | public class StyledText { 4 | public final String getText() { 5 | throw new UnsupportedOperationException("Stub"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/unions/LinkFlavor.java: -------------------------------------------------------------------------------- 1 | package nl.nu.performance.api.client.unions; 2 | 3 | public interface LinkFlavor { 4 | } 5 | -------------------------------------------------------------------------------- /extensions/nunl/stub/src/main/java/nl/nu/performance/api/client/unions/SmallArticleLinkFlavor.java: -------------------------------------------------------------------------------- 1 | package nl.nu.performance.api.client.unions; 2 | 3 | public class SmallArticleLinkFlavor implements LinkFlavor { 4 | public final Boolean isPartner() { 5 | throw new UnsupportedOperationException("Stub"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /extensions/primevideo/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly(project(":extensions:shared:library")) 3 | compileOnly(project(":extensions:primevideo:stub")) 4 | } 5 | -------------------------------------------------------------------------------- /extensions/primevideo/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/primevideo/stub/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | } 4 | 5 | android { 6 | namespace = "app.revanced.extension" 7 | compileSdk = 34 8 | 9 | defaultConfig { 10 | minSdk = 21 11 | } 12 | 13 | compileOptions { 14 | sourceCompatibility = JavaVersion.VERSION_11 15 | targetCompatibility = JavaVersion.VERSION_11 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/fsm/SimpleTrigger.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.fsm; 2 | 3 | public final class SimpleTrigger implements Trigger { 4 | public SimpleTrigger(T triggerType) { 5 | } 6 | } -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/fsm/StateBase.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.fsm; 2 | 3 | public abstract class StateBase { 4 | // This method orginally has protected access (modified in patch code). 5 | public void doTrigger(Trigger trigger) { 6 | } 7 | } -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/fsm/Trigger.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.fsm; 2 | 3 | public interface Trigger { 4 | } -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/media/TimeSpan.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.media; 2 | 3 | public final class TimeSpan { 4 | public long getTotalMilliseconds() { 5 | throw new UnsupportedOperationException(); 6 | } 7 | } -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/media/ads/AdBreak.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.media.ads; 2 | 3 | import com.amazon.avod.media.TimeSpan; 4 | 5 | public interface AdBreak { 6 | TimeSpan getDurationExcludingAux(); 7 | } -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/media/ads/internal/state/AdBreakState.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.media.ads.internal.state; 2 | 3 | public abstract class AdBreakState extends AdEnabledPlaybackState { 4 | } -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/media/ads/internal/state/AdBreakTrigger.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.media.ads.internal.state; 2 | 3 | import com.amazon.avod.media.ads.AdBreak; 4 | import com.amazon.avod.media.TimeSpan; 5 | 6 | public class AdBreakTrigger { 7 | public AdBreak getBreak() { 8 | throw new UnsupportedOperationException(); 9 | } 10 | 11 | public TimeSpan getSeekTarget() { 12 | throw new UnsupportedOperationException(); 13 | } 14 | 15 | public TimeSpan getSeekStartPosition() { 16 | throw new UnsupportedOperationException(); 17 | } 18 | } -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/media/ads/internal/state/AdEnabledPlaybackState.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.media.ads.internal.state; 2 | 3 | import com.amazon.avod.fsm.StateBase; 4 | import com.amazon.avod.media.playback.state.PlayerStateType; 5 | import com.amazon.avod.media.playback.state.trigger.PlayerTriggerType; 6 | 7 | public class AdEnabledPlaybackState extends StateBase { 8 | } -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/media/ads/internal/state/AdEnabledPlayerTriggerType.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.media.ads.internal.state; 2 | 3 | public enum AdEnabledPlayerTriggerType { 4 | NO_MORE_ADS_SKIP_TRANSITION 5 | } -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/media/ads/internal/state/ServerInsertedAdBreakState.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.media.ads.internal.state; 2 | 3 | public class ServerInsertedAdBreakState extends AdBreakState { 4 | } -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/media/playback/VideoPlayer.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.media.playback; 2 | 3 | public interface VideoPlayer { 4 | long getCurrentPosition(); 5 | 6 | void seekTo(long positionMs); 7 | } -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/media/playback/state/PlayerStateType.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.media.playback.state; 2 | 3 | public interface PlayerStateType { 4 | } -------------------------------------------------------------------------------- /extensions/primevideo/stub/src/main/java/com/amazon/avod/media/playback/state/trigger/PlayerTriggerType.java: -------------------------------------------------------------------------------- 1 | package com.amazon.avod.media.playback.state.trigger; 2 | 3 | public interface PlayerTriggerType { 4 | } -------------------------------------------------------------------------------- /extensions/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | -dontobfuscate 2 | -dontoptimize 3 | -keepattributes * 4 | -keep class app.revanced.** { 5 | *; 6 | } 7 | -keep class com.google.** { 8 | *; 9 | } 10 | -------------------------------------------------------------------------------- /extensions/reddit/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly(project(":extensions:reddit:stub")) 3 | } 4 | -------------------------------------------------------------------------------- /extensions/reddit/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/reddit/stub/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | } 4 | 5 | android { 6 | namespace = "app.revanced.extension" 7 | compileSdk = 34 8 | 9 | defaultConfig { 10 | minSdk = 24 11 | } 12 | 13 | compileOptions { 14 | sourceCompatibility = JavaVersion.VERSION_11 15 | targetCompatibility = JavaVersion.VERSION_11 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /extensions/reddit/stub/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/reddit/stub/src/main/java/com/reddit/domain/model/ILink.java: -------------------------------------------------------------------------------- 1 | package com.reddit.domain.model; 2 | 3 | public class ILink { 4 | public boolean getPromoted() { 5 | throw new UnsupportedOperationException("Stub"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /extensions/shared/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation(project(":extensions:shared:library")) 3 | } 4 | -------------------------------------------------------------------------------- /extensions/shared/library/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("com.android.library") 3 | } 4 | 5 | android { 6 | namespace = "app.revanced.extension" 7 | compileSdk = 34 8 | 9 | defaultConfig { 10 | minSdk = 23 11 | } 12 | 13 | compileOptions { 14 | sourceCompatibility = JavaVersion.VERSION_17 15 | targetCompatibility = JavaVersion.VERSION_17 16 | } 17 | } 18 | 19 | dependencies { 20 | compileOnly(libs.annotation) 21 | } 22 | -------------------------------------------------------------------------------- /extensions/shared/library/src/main/java/app/revanced/extension/shared/fixes/slink/ResolveResult.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.shared.fixes.slink; 2 | 3 | public enum ResolveResult { 4 | // Let app handle rest of stuff 5 | CONTINUE, 6 | // Start app, to make it cache its access_token 7 | ACCESS_TOKEN_START, 8 | // Don't do anything - we started resolving 9 | DO_NOTHING 10 | } 11 | -------------------------------------------------------------------------------- /extensions/shared/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/spotify/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly(project(":extensions:shared:library")) 3 | compileOnly(project(":extensions:spotify:stub")) 4 | compileOnly(libs.annotation) 5 | } 6 | 7 | android { 8 | defaultConfig { 9 | minSdk = 24 10 | } 11 | 12 | compileOptions { 13 | sourceCompatibility = JavaVersion.VERSION_11 14 | targetCompatibility = JavaVersion.VERSION_11 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /extensions/spotify/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/spotify/stub/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | } 4 | 5 | android { 6 | namespace = "app.revanced.extension" 7 | compileSdk = 34 8 | 9 | defaultConfig { 10 | minSdk = 26 11 | } 12 | 13 | compileOptions { 14 | sourceCompatibility = JavaVersion.VERSION_17 15 | targetCompatibility = JavaVersion.VERSION_17 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /extensions/spotify/stub/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/spotify/stub/src/main/java/com/spotify/home/evopage/homeapi/proto/Section.java: -------------------------------------------------------------------------------- 1 | package com.spotify.home.evopage.homeapi.proto; 2 | 3 | public final class Section { 4 | public static final int VIDEO_BRAND_AD_FIELD_NUMBER = 20; 5 | public static final int IMAGE_BRAND_AD_FIELD_NUMBER = 21; 6 | public int featureTypeCase_; 7 | } 8 | -------------------------------------------------------------------------------- /extensions/spotify/stub/src/main/java/com/spotify/remoteconfig/internal/AccountAttribute.java: -------------------------------------------------------------------------------- 1 | package com.spotify.remoteconfig.internal; 2 | 3 | public final class AccountAttribute { 4 | public Object value_; 5 | } 6 | -------------------------------------------------------------------------------- /extensions/spotify/stub/src/main/java/com/spotify/useraccount/v1/AccountAttribute.java: -------------------------------------------------------------------------------- 1 | package com.spotify.useraccount.v1; 2 | 3 | /** 4 | * Used for target 8.6.98.900. Class is still present in newer app targets. 5 | */ 6 | public class AccountAttribute { 7 | public Object value_; 8 | } 9 | -------------------------------------------------------------------------------- /extensions/syncforreddit/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly(project(":extensions:shared:library")) 3 | compileOnly(project(":extensions:syncforreddit:stub")) 4 | compileOnly(libs.annotation) 5 | } 6 | -------------------------------------------------------------------------------- /extensions/syncforreddit/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/syncforreddit/stub/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | } 4 | 5 | android { 6 | namespace = "app.revanced.extension" 7 | compileSdk = 34 8 | 9 | defaultConfig { 10 | minSdk = 24 11 | } 12 | 13 | compileOptions { 14 | sourceCompatibility = JavaVersion.VERSION_11 15 | targetCompatibility = JavaVersion.VERSION_11 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /extensions/syncforreddit/stub/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/syncforreddit/stub/src/main/java/com/laurencedawson/reddit_sync/ui/activities/WebViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.laurencedawson.reddit_sync.ui.activities; 2 | 3 | import android.app.Activity; 4 | 5 | public class WebViewActivity extends Activity { 6 | } 7 | -------------------------------------------------------------------------------- /extensions/tiktok/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly(project(":extensions:shared:library")) 3 | compileOnly(project(":extensions:tiktok:stub")) 4 | compileOnly(libs.annotation) 5 | } 6 | 7 | android { 8 | defaultConfig { 9 | minSdk = 22 10 | } 11 | 12 | compileOptions { 13 | sourceCompatibility = JavaVersion.VERSION_11 14 | targetCompatibility = JavaVersion.VERSION_11 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /extensions/tiktok/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/tiktok/src/main/java/app/revanced/extension/tiktok/cleardisplay/RememberClearDisplayPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.tiktok.cleardisplay; 2 | 3 | import app.revanced.extension.tiktok.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class RememberClearDisplayPatch { 7 | public static boolean getClearDisplayState() { 8 | return Settings.CLEAR_DISPLAY.get(); 9 | } 10 | public static void rememberClearDisplayState(boolean newState) { 11 | Settings.CLEAR_DISPLAY.save(newState); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /extensions/tiktok/src/main/java/app/revanced/extension/tiktok/download/DownloadsPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.tiktok.download; 2 | 3 | import app.revanced.extension.tiktok.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class DownloadsPatch { 7 | public static String getDownloadPath() { 8 | return Settings.DOWNLOAD_PATH.get(); 9 | } 10 | 11 | public static boolean shouldRemoveWatermark() { 12 | return Settings.DOWNLOAD_WATERMARK.get(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /extensions/tiktok/src/main/java/app/revanced/extension/tiktok/feedfilter/AdsFilter.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.tiktok.feedfilter; 2 | 3 | import app.revanced.extension.tiktok.settings.Settings; 4 | import com.ss.android.ugc.aweme.feed.model.Aweme; 5 | 6 | public class AdsFilter implements IFilter { 7 | @Override 8 | public boolean getEnabled() { 9 | return Settings.REMOVE_ADS.get(); 10 | } 11 | 12 | @Override 13 | public boolean getFiltered(Aweme item) { 14 | return item.isAd() || item.isWithPromotionalMusic(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /extensions/tiktok/src/main/java/app/revanced/extension/tiktok/feedfilter/IFilter.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.tiktok.feedfilter; 2 | 3 | import com.ss.android.ugc.aweme.feed.model.Aweme; 4 | 5 | public interface IFilter { 6 | boolean getEnabled(); 7 | 8 | boolean getFiltered(Aweme item); 9 | } 10 | -------------------------------------------------------------------------------- /extensions/tiktok/src/main/java/app/revanced/extension/tiktok/feedfilter/ImageVideoFilter.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.tiktok.feedfilter; 2 | 3 | import app.revanced.extension.tiktok.settings.Settings; 4 | import com.ss.android.ugc.aweme.feed.model.Aweme; 5 | 6 | public class ImageVideoFilter implements IFilter { 7 | @Override 8 | public boolean getEnabled() { 9 | return Settings.HIDE_IMAGE.get(); 10 | } 11 | 12 | @Override 13 | public boolean getFiltered(Aweme item) { 14 | return item.isImage() || item.isPhotoMode(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /extensions/tiktok/src/main/java/app/revanced/extension/tiktok/feedfilter/LiveFilter.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.tiktok.feedfilter; 2 | 3 | import app.revanced.extension.tiktok.settings.Settings; 4 | import com.ss.android.ugc.aweme.feed.model.Aweme; 5 | 6 | public class LiveFilter implements IFilter { 7 | @Override 8 | public boolean getEnabled() { 9 | return Settings.HIDE_LIVE.get(); 10 | } 11 | 12 | @Override 13 | public boolean getFiltered(Aweme item) { 14 | return item.isLive() || item.isLiveReplay(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /extensions/tiktok/src/main/java/app/revanced/extension/tiktok/feedfilter/ShopFilter.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.tiktok.feedfilter; 2 | 3 | import app.revanced.extension.tiktok.settings.Settings; 4 | import com.ss.android.ugc.aweme.feed.model.Aweme; 5 | 6 | public class ShopFilter implements IFilter { 7 | private static final String SHOP_INFO = "placeholder_product_id"; 8 | @Override 9 | public boolean getEnabled() { 10 | return Settings.HIDE_SHOP.get(); 11 | } 12 | 13 | @Override 14 | public boolean getFiltered(Aweme item) { 15 | return item.getShareUrl().contains(SHOP_INFO); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /extensions/tiktok/src/main/java/app/revanced/extension/tiktok/feedfilter/StoryFilter.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.tiktok.feedfilter; 2 | 3 | import app.revanced.extension.tiktok.settings.Settings; 4 | import com.ss.android.ugc.aweme.feed.model.Aweme; 5 | 6 | public class StoryFilter implements IFilter { 7 | @Override 8 | public boolean getEnabled() { 9 | return Settings.HIDE_STORY.get(); 10 | } 11 | 12 | @Override 13 | public boolean getFiltered(Aweme item) { 14 | return item.getIsTikTokStory(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /extensions/tiktok/src/main/java/app/revanced/extension/tiktok/settings/SettingsStatus.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.tiktok.settings; 2 | 3 | public class SettingsStatus { 4 | public static boolean feedFilterEnabled = false; 5 | public static boolean downloadEnabled = false; 6 | public static boolean simSpoofEnabled = false; 7 | 8 | public static void enableFeedFilter() { 9 | feedFilterEnabled = true; 10 | } 11 | 12 | public static void enableDownload() { 13 | downloadEnabled = true; 14 | } 15 | 16 | public static void enableSimSpoof() { 17 | simSpoofEnabled = true; 18 | } 19 | 20 | public static void load() { 21 | 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /extensions/tiktok/src/main/java/app/revanced/extension/tiktok/speed/PlaybackSpeedPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.tiktok.speed; 2 | 3 | import app.revanced.extension.tiktok.settings.Settings; 4 | 5 | public class PlaybackSpeedPatch { 6 | public static void rememberPlaybackSpeed(float newSpeed) { 7 | Settings.REMEMBERED_SPEED.save(newSpeed); 8 | } 9 | 10 | public static float getPlaybackSpeed() { 11 | return Settings.REMEMBERED_SPEED.get(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /extensions/tiktok/stub/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | } 4 | 5 | android { 6 | namespace = "app.revanced.extension" 7 | compileSdk = 34 8 | 9 | defaultConfig { 10 | minSdk = 22 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /extensions/tiktok/stub/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/tiktok/stub/src/main/java/com/bytedance/ies/ugc/aweme/commercialize/compliance/personalization/AdPersonalizationActivity.java: -------------------------------------------------------------------------------- 1 | package com.bytedance.ies.ugc.aweme.commercialize.compliance.personalization; 2 | 3 | import android.app.Activity; 4 | 5 | //Dummy class 6 | public class AdPersonalizationActivity extends Activity { } 7 | -------------------------------------------------------------------------------- /extensions/tiktok/stub/src/main/java/com/ss/android/ugc/aweme/feed/model/AwemeStatistics.java: -------------------------------------------------------------------------------- 1 | package com.ss.android.ugc.aweme.feed.model; 2 | 3 | public class AwemeStatistics { 4 | public long getPlayCount() { 5 | throw new UnsupportedOperationException("Stub"); 6 | } 7 | public long getDiggCount() { 8 | throw new UnsupportedOperationException("Stub"); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /extensions/tiktok/stub/src/main/java/com/ss/android/ugc/aweme/feed/model/FeedItemList.java: -------------------------------------------------------------------------------- 1 | package com.ss.android.ugc.aweme.feed.model; 2 | 3 | import java.util.List; 4 | 5 | //Dummy class 6 | public class FeedItemList { 7 | public List items; 8 | } 9 | -------------------------------------------------------------------------------- /extensions/tiktok/stub/src/main/java/com/ss/android/ugc/aweme/follow/presenter/FollowFeed.java: -------------------------------------------------------------------------------- 1 | package com.ss.android.ugc.aweme.follow.presenter; 2 | 3 | import com.ss.android.ugc.aweme.feed.model.Aweme; 4 | 5 | //Dummy class 6 | public class FollowFeed { 7 | public Aweme aweme; 8 | } 9 | -------------------------------------------------------------------------------- /extensions/tiktok/stub/src/main/java/com/ss/android/ugc/aweme/follow/presenter/FollowFeedList.java: -------------------------------------------------------------------------------- 1 | package com.ss.android.ugc.aweme.follow.presenter; 2 | 3 | import java.util.List; 4 | 5 | //Dummy class 6 | public class FollowFeedList { 7 | public List mItems; 8 | } 9 | -------------------------------------------------------------------------------- /extensions/tudortmund/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly(libs.appcompat) 3 | } 4 | -------------------------------------------------------------------------------- /extensions/tudortmund/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/tumblr/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly(project(":extensions:tumblr:stub")) 3 | } 4 | 5 | android { 6 | defaultConfig { 7 | minSdk = 26 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /extensions/tumblr/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/tumblr/stub/build.gradle.kts: -------------------------------------------------------------------------------- 1 | android.namespace = "app.revanced.extension" 2 | 3 | plugins { 4 | id(libs.plugins.android.library.get().pluginId) 5 | } 6 | 7 | android { 8 | namespace = "app.revanced.extension" 9 | compileSdk = 34 10 | 11 | defaultConfig { 12 | minSdk = 26 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /extensions/tumblr/stub/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/tumblr/stub/src/main/java/com/tumblr/rumblr/model/TimelineObject.java: -------------------------------------------------------------------------------- 1 | package com.tumblr.rumblr.model; 2 | 3 | public class TimelineObject { 4 | public final T getData() { 5 | throw new UnsupportedOperationException("Stub"); 6 | } 7 | 8 | } 9 | -------------------------------------------------------------------------------- /extensions/tumblr/stub/src/main/java/com/tumblr/rumblr/model/TimelineObjectType.java: -------------------------------------------------------------------------------- 1 | package com.tumblr.rumblr.model; 2 | 3 | public enum TimelineObjectType { 4 | } 5 | -------------------------------------------------------------------------------- /extensions/tumblr/stub/src/main/java/com/tumblr/rumblr/model/Timelineable.java: -------------------------------------------------------------------------------- 1 | package com.tumblr.rumblr.model; 2 | 3 | public interface Timelineable { 4 | TimelineObjectType getTimelineObjectType(); 5 | } 6 | -------------------------------------------------------------------------------- /extensions/twitch/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly(project(":extensions:shared:library")) 3 | compileOnly(project(":extensions:twitch:stub")) 4 | compileOnly(libs.okhttp) 5 | compileOnly(libs.retrofit) 6 | compileOnly(libs.annotation) 7 | compileOnly(libs.appcompat) 8 | } 9 | 10 | android { 11 | defaultConfig { 12 | minSdk = 21 13 | } 14 | 15 | compileOptions { 16 | sourceCompatibility = JavaVersion.VERSION_11 17 | targetCompatibility = JavaVersion.VERSION_11 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /extensions/twitch/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/twitch/src/main/java/app/revanced/extension/twitch/Utils.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitch; 2 | 3 | public class Utils { 4 | 5 | /* Called from SettingsPatch smali */ 6 | public static int getStringId(String name) { 7 | return app.revanced.extension.shared.Utils.getResourceIdentifier(name, "string"); 8 | } 9 | 10 | /* Called from SettingsPatch smali */ 11 | public static int getDrawableId(String name) { 12 | return app.revanced.extension.shared.Utils.getResourceIdentifier(name, "drawable"); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /extensions/twitch/src/main/java/app/revanced/extension/twitch/api/PurpleAdblockApi.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitch.api; 2 | 3 | import okhttp3.ResponseBody; 4 | import retrofit2.Call; 5 | import retrofit2.http.GET; 6 | import retrofit2.http.Url; 7 | 8 | /* only used for service pings */ 9 | public interface PurpleAdblockApi { 10 | @GET /* root */ 11 | Call ping(@Url String baseUrl); 12 | } -------------------------------------------------------------------------------- /extensions/twitch/src/main/java/app/revanced/extension/twitch/patches/AudioAdsPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitch.patches; 2 | 3 | import app.revanced.extension.twitch.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class AudioAdsPatch { 7 | public static boolean shouldBlockAudioAds() { 8 | return Settings.BLOCK_AUDIO_ADS.get(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /extensions/twitch/src/main/java/app/revanced/extension/twitch/patches/AutoClaimChannelPointsPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitch.patches; 2 | 3 | import app.revanced.extension.twitch.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class AutoClaimChannelPointsPatch { 7 | public static boolean shouldAutoClaim() { 8 | return Settings.AUTO_CLAIM_CHANNEL_POINTS.get(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /extensions/twitch/src/main/java/app/revanced/extension/twitch/patches/DebugModePatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitch.patches; 2 | 3 | import app.revanced.extension.twitch.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class DebugModePatch { 7 | public static boolean isDebugModeEnabled() { 8 | return Settings.TWITCH_DEBUG_MODE.get(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /extensions/twitch/src/main/java/app/revanced/extension/twitch/patches/EmbeddedAdsPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitch.patches; 2 | 3 | import app.revanced.extension.twitch.api.RequestInterceptor; 4 | 5 | @SuppressWarnings("unused") 6 | public class EmbeddedAdsPatch { 7 | public static RequestInterceptor createRequestInterceptor() { 8 | return new RequestInterceptor(); 9 | } 10 | } -------------------------------------------------------------------------------- /extensions/twitch/src/main/java/app/revanced/extension/twitch/patches/VideoAdsPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitch.patches; 2 | 3 | import app.revanced.extension.twitch.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class VideoAdsPatch { 7 | public static boolean shouldBlockVideoAds() { 8 | return Settings.BLOCK_VIDEO_ADS.get(); 9 | } 10 | } -------------------------------------------------------------------------------- /extensions/twitch/stub/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | } 4 | 5 | android { 6 | namespace = "app.revanced.extension" 7 | compileSdk = 34 8 | 9 | defaultConfig { 10 | minSdk = 21 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /extensions/twitch/stub/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/twitch/stub/src/main/java/tv/twitch/android/feature/settings/menu/SettingsMenuGroup.java: -------------------------------------------------------------------------------- 1 | package tv.twitch.android.feature.settings.menu; 2 | 3 | import java.util.List; 4 | 5 | // Dummy 6 | public final class SettingsMenuGroup { 7 | public SettingsMenuGroup(List settingsMenuItems) { 8 | throw new UnsupportedOperationException("Stub"); 9 | } 10 | 11 | public List getSettingsMenuItems() { 12 | throw new UnsupportedOperationException("Stub"); 13 | } 14 | } -------------------------------------------------------------------------------- /extensions/twitch/stub/src/main/java/tv/twitch/android/settings/SettingsActivity.java: -------------------------------------------------------------------------------- 1 | package tv.twitch.android.settings; 2 | 3 | import android.app.Activity; 4 | 5 | public class SettingsActivity extends Activity {} 6 | -------------------------------------------------------------------------------- /extensions/twitch/stub/src/main/java/tv/twitch/android/shared/chat/util/ClickableUsernameSpan.java: -------------------------------------------------------------------------------- 1 | package tv.twitch.android.shared.chat.util; 2 | 3 | import android.text.style.ClickableSpan; 4 | import android.view.View; 5 | 6 | public final class ClickableUsernameSpan extends ClickableSpan { 7 | @Override 8 | public void onClick(View widget) {} 9 | } -------------------------------------------------------------------------------- /extensions/twitter/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // Do not remove. Necessary for the extension plugin to be applied to the project. 2 | -------------------------------------------------------------------------------- /extensions/twitter/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/twitter/src/main/java/app/revanced/twitter/patches/hook/json/BaseJsonHook.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitter.patches.hook.json 2 | 3 | import org.json.JSONObject 4 | 5 | abstract class BaseJsonHook : JsonHook { 6 | abstract fun apply(json: JSONObject) 7 | 8 | override fun transform(json: JSONObject) = json.apply { apply(json) } 9 | } 10 | -------------------------------------------------------------------------------- /extensions/twitter/src/main/java/app/revanced/twitter/patches/hook/json/JsonHook.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitter.patches.hook.json 2 | 3 | import app.revanced.extension.twitter.patches.hook.patch.Hook 4 | import org.json.JSONObject 5 | 6 | interface JsonHook : Hook { 7 | /** 8 | * Transform a JSONObject. 9 | * 10 | * @param json The JSONObject. 11 | */ 12 | fun transform(json: JSONObject): JSONObject 13 | 14 | override fun hook(type: JSONObject) = transform(type) 15 | } 16 | -------------------------------------------------------------------------------- /extensions/twitter/src/main/java/app/revanced/twitter/patches/hook/patch/Hook.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitter.patches.hook.patch 2 | 3 | interface Hook { 4 | /** 5 | * Hook the given type. 6 | * @param type The type to hook 7 | */ 8 | fun hook(type: T): T 9 | } 10 | -------------------------------------------------------------------------------- /extensions/twitter/src/main/java/app/revanced/twitter/patches/hook/patch/ads/HideAdsHook.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitter.patches.hook.patch.ads 2 | 3 | import app.revanced.extension.twitter.patches.hook.json.BaseJsonHook 4 | import app.revanced.extension.twitter.patches.hook.twifucker.TwiFucker 5 | import org.json.JSONObject 6 | 7 | @Suppress("unused") 8 | object HideAdsHook : BaseJsonHook() { 9 | /** 10 | * Strips JSONObject from promoted ads. 11 | * 12 | * @param json The JSONObject. 13 | */ 14 | override fun apply(json: JSONObject) = TwiFucker.hidePromotedAds(json) 15 | } 16 | -------------------------------------------------------------------------------- /extensions/twitter/src/main/java/app/revanced/twitter/patches/hook/patch/dummy/DummyHook.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitter.patches.hook.patch.dummy 2 | 3 | import app.revanced.extension.twitter.patches.hook.json.BaseJsonHook 4 | import app.revanced.extension.twitter.patches.hook.json.JsonHookPatch 5 | import org.json.JSONObject 6 | 7 | /** 8 | * Dummy hook to reserve a register in [JsonHookPatch.hooks] list. 9 | */ 10 | object DummyHook : BaseJsonHook() { 11 | override fun apply(json: JSONObject) { 12 | // Do nothing. 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /extensions/twitter/src/main/java/app/revanced/twitter/patches/hook/patch/recommendation/RecommendedUsersHook.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitter.patches.hook.patch.recommendation 2 | 3 | import app.revanced.extension.twitter.patches.hook.json.BaseJsonHook 4 | import app.revanced.extension.twitter.patches.hook.twifucker.TwiFucker 5 | import org.json.JSONObject 6 | 7 | object RecommendedUsersHook : BaseJsonHook() { 8 | /** 9 | * Strips JSONObject from recommended users. 10 | * 11 | * @param json The JSONObject. 12 | */ 13 | override fun apply(json: JSONObject) = TwiFucker.hideRecommendedUsers(json) 14 | } 15 | -------------------------------------------------------------------------------- /extensions/twitter/src/main/java/app/revanced/twitter/patches/links/OpenLinksWithAppChooserPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.twitter.patches.links; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | import android.util.Log; 6 | 7 | public final class OpenLinksWithAppChooserPatch { 8 | public static void openWithChooser(final Context context, final Intent intent) { 9 | Log.d("ReVanced", "Opening intent with chooser: " + intent); 10 | 11 | intent.setAction("android.intent.action.VIEW"); 12 | 13 | context.startActivity(Intent.createChooser(intent, null)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /extensions/twitter/src/main/java/app/revanced/twitter/utils/json/JsonUtils.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.twitter.utils.json 2 | 3 | import app.revanced.extension.twitter.utils.stream.StreamUtils 4 | import org.json.JSONException 5 | import org.json.JSONObject 6 | import java.io.IOException 7 | import java.io.InputStream 8 | 9 | object JsonUtils { 10 | @JvmStatic 11 | @Throws(IOException::class, JSONException::class) 12 | fun parseJson(jsonInputStream: InputStream) = JSONObject(StreamUtils.toString(jsonInputStream)) 13 | } 14 | -------------------------------------------------------------------------------- /extensions/youtube/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | compileOnly(project(":extensions:shared:library")) 3 | compileOnly(project(":extensions:youtube:stub")) 4 | compileOnly(libs.annotation) 5 | } 6 | 7 | android { 8 | defaultConfig { 9 | minSdk = 26 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/AutoRepeatPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class AutoRepeatPatch { 7 | //Used by app.revanced.patches.youtube.layout.autorepeat.patch.AutoRepeatPatch 8 | public static boolean shouldAutoRepeat() { 9 | return Settings.AUTO_REPEAT.get(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableAutoCaptionsPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class DisableAutoCaptionsPatch { 7 | 8 | private static volatile boolean captionsButtonStatus; 9 | 10 | /** 11 | * Injection point. 12 | */ 13 | public static boolean disableAutoCaptions() { 14 | return Settings.DISABLE_AUTO_CAPTIONS.get() && !captionsButtonStatus; 15 | } 16 | 17 | /** 18 | * Injection point. 19 | */ 20 | public static void setCaptionsButtonStatus(boolean status) { 21 | captionsButtonStatus = status; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableHdrPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class DisableHdrPatch { 7 | 8 | /** 9 | * Injection point. 10 | */ 11 | public static boolean disableHDRVideo() { 12 | return !Settings.DISABLE_HDR_VIDEO.get(); 13 | } 14 | } 15 | 16 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisablePlayerPopupPanelsPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class DisablePlayerPopupPanelsPatch { 7 | //Used by app.revanced.patches.youtube.layout.playerpopuppanels.patch.PlayerPopupPanelsPatch 8 | public static boolean disablePlayerPopupPanels() { 9 | return Settings.PLAYER_POPUP_PANELS.get(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisablePreciseSeekingGesturePatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public final class DisablePreciseSeekingGesturePatch { 7 | public static boolean isGestureDisabled() { 8 | return Settings.DISABLE_PRECISE_SEEKING_GESTURE.get(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/DisableRollingNumberAnimationsPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class DisableRollingNumberAnimationsPatch { 7 | /** 8 | * Injection point. 9 | */ 10 | public static boolean disableRollingNumberAnimations() { 11 | return Settings.DISABLE_ROLLING_NUMBER_ANIMATIONS.get(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndScreenSuggestedVideoPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public final class HideEndScreenSuggestedVideoPatch { 7 | /** 8 | * Injection point. 9 | */ 10 | public static boolean hideEndScreenSuggestedVideo() { 11 | return Settings.HIDE_END_SCREEN_SUGGESTED_VIDEO.get(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideEndscreenCardsPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import android.view.View; 4 | 5 | import app.revanced.extension.youtube.settings.Settings; 6 | 7 | @SuppressWarnings("unused") 8 | public class HideEndscreenCardsPatch { 9 | //Used by app.revanced.patches.youtube.layout.hideendscreencards.bytecode.patch.HideEndscreenCardsPatch 10 | public static void hideEndscreen(View view) { 11 | if (!Settings.HIDE_ENDSCREEN_CARDS.get()) return; 12 | view.setVisibility(View.GONE); 13 | } 14 | } -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideGetPremiumPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class HideGetPremiumPatch { 7 | /** 8 | * Injection point. 9 | */ 10 | public static boolean hideGetPremiumView() { 11 | return Settings.HIDE_GET_PREMIUM.get(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideInfoCardsPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import android.view.View; 4 | 5 | import app.revanced.extension.youtube.settings.Settings; 6 | 7 | @SuppressWarnings("unused") 8 | public class HideInfoCardsPatch { 9 | public static void hideInfoCardsIncognito(View view) { 10 | if (!Settings.HIDE_INFO_CARDS.get()) return; 11 | view.setVisibility(View.GONE); 12 | } 13 | 14 | public static boolean hideInfoCardsMethodCall() { 15 | return Settings.HIDE_INFO_CARDS.get(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideRelatedVideoOverlayPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public final class HideRelatedVideoOverlayPatch { 7 | /** 8 | * Injection point. 9 | */ 10 | public static boolean hideRelatedVideoOverlay() { 11 | return Settings.HIDE_RELATED_VIDEO_OVERLAY.get(); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideSeekbarPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class HideSeekbarPatch { 7 | public static boolean hideSeekbar() { 8 | return Settings.HIDE_SEEKBAR.get(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/HideTimestampPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class HideTimestampPatch { 7 | public static boolean hideTimestamp() { 8 | return Settings.HIDE_TIMESTAMP.get(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/PlayerOverlaysHookPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import android.view.ViewGroup; 4 | 5 | import app.revanced.extension.youtube.shared.PlayerOverlays; 6 | 7 | @SuppressWarnings("unused") 8 | public class PlayerOverlaysHookPatch { 9 | /** 10 | * Injection point. 11 | */ 12 | public static void playerOverlayInflated(ViewGroup group) { 13 | PlayerOverlays.attach(group); 14 | } 15 | } -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/SeekbarTappingPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public final class SeekbarTappingPatch { 7 | public static boolean seekbarTappingEnabled() { 8 | return Settings.SEEKBAR_TAPPING.get(); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/SlideToSeekPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public final class SlideToSeekPatch { 7 | private static final boolean SLIDE_TO_SEEK_DISABLED = !Settings.SLIDE_TO_SEEK.get(); 8 | 9 | public static boolean isSlideToSeekDisabled(boolean isDisabled) { 10 | if (!isDisabled) return false; 11 | 12 | return SLIDE_TO_SEEK_DISABLED; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/VideoAdsPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class VideoAdsPatch { 7 | 8 | private static final boolean SHOW_VIDEO_ADS = !Settings.HIDE_VIDEO_ADS.get(); 9 | 10 | /** 11 | * Injection point. 12 | */ 13 | public static boolean shouldShowAds() { 14 | return SHOW_VIDEO_ADS; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/components/HideInfoCardsFilterPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches.components; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public final class HideInfoCardsFilterPatch extends Filter { 7 | 8 | public HideInfoCardsFilterPatch() { 9 | addIdentifierCallbacks( 10 | new StringFilterGroup( 11 | Settings.HIDE_INFO_CARDS, 12 | "info_card_teaser_overlay.eml" 13 | ) 14 | ); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/patches/spoof/SpoofDeviceDimensionsPatch.java: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.patches.spoof; 2 | 3 | import app.revanced.extension.youtube.settings.Settings; 4 | 5 | @SuppressWarnings("unused") 6 | public class SpoofDeviceDimensionsPatch { 7 | private static final boolean SPOOF = Settings.SPOOF_DEVICE_DIMENSIONS.get(); 8 | 9 | 10 | public static int getMinHeightOrWidth(int minHeightOrWidth) { 11 | return SPOOF ? 64 : minHeightOrWidth; 12 | } 13 | 14 | public static int getMaxHeightOrWidth(int maxHeightOrWidth) { 15 | return SPOOF ? 4096 : maxHeightOrWidth; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/controller/gesture/core/GestureController.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.swipecontrols.controller.gesture.core 2 | 3 | import android.view.MotionEvent 4 | 5 | /** 6 | * describes a class that accepts motion events and detects gestures 7 | */ 8 | interface GestureController { 9 | /** 10 | * accept a touch event and try to detect the desired gestures using it 11 | * 12 | * @param motionEvent the motion event that was submitted 13 | * @return was a gesture detected? 14 | */ 15 | fun submitTouchEvent(motionEvent: MotionEvent): Boolean 16 | } 17 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/misc/Point.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.swipecontrols.misc 2 | 3 | import android.view.MotionEvent 4 | 5 | /** 6 | * a simple 2D point class 7 | */ 8 | data class Point( 9 | val x: Int, 10 | val y: Int, 11 | ) 12 | 13 | /** 14 | * convert the motion event coordinates to a point 15 | */ 16 | fun MotionEvent.toPoint(): Point = 17 | Point(x.toInt(), y.toInt()) 18 | -------------------------------------------------------------------------------- /extensions/youtube/src/main/java/app/revanced/extension/youtube/swipecontrols/misc/Rectangle.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.extension.youtube.swipecontrols.misc 2 | 3 | /** 4 | * a simple rectangle class 5 | */ 6 | data class Rectangle( 7 | val x: Int, 8 | val y: Int, 9 | val width: Int, 10 | val height: Int, 11 | ) { 12 | val left = x 13 | val right = x + width 14 | val top = y 15 | val bottom = y + height 16 | } 17 | 18 | /** 19 | * is the point within this rectangle? 20 | */ 21 | operator fun Rectangle.contains(p: Point): Boolean = 22 | p.x in left..right && p.y in top..bottom 23 | -------------------------------------------------------------------------------- /extensions/youtube/stub/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id(libs.plugins.android.library.get().pluginId) 3 | } 4 | 5 | android { 6 | namespace = "app.revanced.extension" 7 | compileSdk = 34 8 | 9 | defaultConfig { 10 | minSdk = 24 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /extensions/youtube/stub/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /extensions/youtube/stub/src/main/java/android/support/v7/widget/RecyclerView.java: -------------------------------------------------------------------------------- 1 | package android.support.v7.widget; 2 | 3 | import android.content.Context; 4 | import android.view.View; 5 | 6 | public class RecyclerView extends View { 7 | 8 | public RecyclerView(Context context) { 9 | super(context); 10 | throw new UnsupportedOperationException("Stub"); 11 | } 12 | 13 | public View getChildAt(@SuppressWarnings("unused") final int index) { 14 | return null; 15 | } 16 | 17 | public int getChildCount() { 18 | return 0; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /extensions/youtube/stub/src/main/java/com/airbnb/lottie/LottieAnimationView.java: -------------------------------------------------------------------------------- 1 | package com.airbnb.lottie; 2 | 3 | import java.io.InputStream; 4 | 5 | @SuppressWarnings("unused") 6 | public class LottieAnimationView { 7 | 8 | public void patch_setAnimation(InputStream stream, String cacheKey) { 9 | throw new RuntimeException("stub"); 10 | } 11 | 12 | public final void patch_setAnimation(int rawResInt) { 13 | throw new RuntimeException("stub"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /extensions/youtube/stub/src/main/java/com/google/android/libraries/youtube/rendering/ui/pivotbar/PivotBar.java: -------------------------------------------------------------------------------- 1 | package com.google.android.libraries.youtube.rendering.ui.pivotbar; 2 | 3 | import android.content.Context; 4 | import android.widget.HorizontalScrollView; 5 | 6 | public class PivotBar extends HorizontalScrollView { 7 | public PivotBar(Context context) { 8 | super(context); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /extensions/youtube/stub/src/main/java/org/chromium/net/UrlRequest.java: -------------------------------------------------------------------------------- 1 | package org.chromium.net; 2 | 3 | public abstract class UrlRequest { 4 | public abstract class Builder { 5 | public abstract Builder addHeader(String name, String value); 6 | public abstract UrlRequest build(); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /extensions/youtube/stub/src/main/java/org/chromium/net/UrlResponseInfo.java: -------------------------------------------------------------------------------- 1 | package org.chromium.net; 2 | 3 | //dummy class 4 | public abstract class UrlResponseInfo { 5 | 6 | public abstract String getUrl(); 7 | 8 | public abstract int getHttpStatusCode(); 9 | 10 | // Add additional existing methods, if needed. 11 | 12 | } 13 | -------------------------------------------------------------------------------- /extensions/youtube/stub/src/main/java/org/chromium/net/impl/CronetUrlRequest.java: -------------------------------------------------------------------------------- 1 | package org.chromium.net.impl; 2 | 3 | import org.chromium.net.UrlRequest; 4 | 5 | public abstract class CronetUrlRequest extends UrlRequest { 6 | 7 | /** 8 | * Method is added by patch. 9 | */ 10 | public abstract String getHookedUrl(); 11 | } 12 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.caching = true 2 | org.gradle.jvmargs = -Xms512M -Xmx2048M 3 | org.gradle.parallel = true 4 | android.useAndroidX = true 5 | kotlin.code.style = official 6 | version = 5.25.0 7 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip 5 | networkTimeout=10000 6 | validateDistributionUrl=true 7 | zipStoreBase=GRADLE_USER_HOME 8 | zipStorePath=wrapper/dists 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "devDependencies": { 3 | "@saithodev/semantic-release-backmerge": "^4.0.1", 4 | "@semantic-release/changelog": "^6.0.3", 5 | "@semantic-release/git": "^10.0.1", 6 | "gradle-semantic-release-plugin": "^1.10.1", 7 | "semantic-release": "^24.2.1" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/amazon/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.amazon 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | 6 | internal val deepLinkingFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PRIVATE) 8 | returns("Z") 9 | parameters("L") 10 | strings("https://www.", "android.intent.action.VIEW") 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/angulus/ads/RemoveAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.angulus.ads 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.patches.shared.misc.pairip.license.disableLicenseCheckPatch 5 | import app.revanced.util.returnEarly 6 | 7 | @Suppress("unused") 8 | val angulusPatch = bytecodePatch(name = "Hide ads") { 9 | compatibleWith("com.drinkplusplus.angulus") 10 | 11 | dependsOn(disableLicenseCheckPatch) 12 | 13 | execute { 14 | // Always return 0 as the daily measurement count. 15 | getDailyMeasurementCountFingerprint.method.returnEarly(0) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/backdrops/misc/pro/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.backdrops.misc.pro 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.Opcode 5 | 6 | internal val proUnlockFingerprint = fingerprint { 7 | opcodes( 8 | Opcode.INVOKE_VIRTUAL, 9 | Opcode.MOVE_RESULT_OBJECT, 10 | Opcode.INVOKE_INTERFACE, 11 | Opcode.MOVE_RESULT, 12 | Opcode.IF_EQZ, 13 | ) 14 | custom { method, _ -> 15 | method.name == "lambda\$existPurchase\$0" && 16 | method.definingClass == "Lcom/backdrops/wallpapers/data/local/DatabaseHandlerIAB;" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.bandcamp.limitations 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val handlePlaybackLimitsFingerprint = fingerprint { 6 | strings("play limits processing track", "found play_count") 7 | } 8 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/bandcamp/limitations/RemovePlayLimitsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.bandcamp.limitations 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val removePlayLimitsPatch = bytecodePatch( 8 | name = "Remove play limits", 9 | description = "Disables purchase nagging and playback limits of not purchased tracks.", 10 | ) { 11 | compatibleWith("com.bandcamp.android") 12 | 13 | execute { 14 | handlePlaybackLimitsFingerprint.method.addInstructions(0, "return-void") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/BypassRootChecksPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.cieid.restrictions.root 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val bypassRootChecksPatch = bytecodePatch( 8 | name = "Bypass root checks", 9 | description = "Removes the restriction to use the app with root permissions or on a custom ROM.", 10 | ) { 11 | compatibleWith("it.ipzs.cieid") 12 | 13 | execute { 14 | checkRootFingerprint.method.addInstruction(1, "return-void") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/cieid/restrictions/root/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.cieid.restrictions.root 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val checkRootFingerprint = fingerprint { 6 | custom { method, _ -> 7 | method.name == "onResume" && method.definingClass == "Lit/ipzs/cieid/BaseActivity;" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/googlenews/customtabs/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.googlenews.customtabs 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | import com.android.tools.smali.dexlib2.Opcode 6 | 7 | internal val launchCustomTabFingerprint = fingerprint { 8 | accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) 9 | opcodes( 10 | Opcode.IPUT_OBJECT, 11 | Opcode.CONST_4, 12 | Opcode.IPUT, 13 | Opcode.CONST_4, 14 | Opcode.IPUT_BOOLEAN, 15 | ) 16 | custom { _, classDef -> classDef.endsWith("CustomTabsArticleLauncher;") } 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/googlenews/misc/extension/ExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.googlenews.misc.extension 2 | 3 | import app.revanced.patches.googlenews.misc.extension.hooks.startActivityInitHook 4 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 5 | 6 | val extensionPatch = sharedExtensionPatch(startActivityInitHook) 7 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Constants.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.googlenews.misc.gms 2 | 3 | internal object Constants { 4 | const val MAGAZINES_PACKAGE_NAME = "com.google.android.apps.magazines" 5 | const val REVANCED_MAGAZINES_PACKAGE_NAME = "app.revanced.android.magazines" 6 | } 7 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/googlenews/misc/gms/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.googlenews.misc.gms 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val magazinesActivityOnCreateFingerprint = fingerprint { 6 | custom { methodDef, classDef -> 7 | methodDef.name == "onCreate" && classDef.endsWith("/StartActivity;") 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/extension/ExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.googlephotos.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 4 | 5 | val extensionPatch = sharedExtensionPatch(homeActivityInitHook) 6 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.googlephotos.misc.features 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val initializeFeaturesEnumFingerprint = fingerprint { 6 | strings("com.google.android.apps.photos.NEXUS_PRELOAD") 7 | } 8 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/features/SpoofBuildInfoPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.googlephotos.misc.features 2 | 3 | import app.revanced.patches.all.misc.build.BuildInfo 4 | import app.revanced.patches.all.misc.build.baseSpoofBuildInfoPatch 5 | 6 | // Spoof build info to Google Pixel XL. 7 | val spoofBuildInfoPatch = baseSpoofBuildInfoPatch { 8 | BuildInfo( 9 | brand = "google", 10 | manufacturer = "Google", 11 | device = "marlin", 12 | product = "marlin", 13 | model = "Pixel XL", 14 | fingerprint = "google/marlin/marlin:10/QP1A.191005.007.A3/5972272:user/release-keys", 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Constants.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.googlephotos.misc.gms 2 | 3 | internal object Constants { 4 | const val PHOTOS_PACKAGE_NAME = "com.google.android.apps.photos" 5 | const val REVANCED_PHOTOS_PACKAGE_NAME = "app.revanced.android.photos" 6 | } 7 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/gms/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.googlephotos.misc.gms 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val homeActivityOnCreateFingerprint = fingerprint { 6 | custom { methodDef, classDef -> 7 | methodDef.name == "onCreate" && classDef.endsWith("/HomeActivity;") 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/googlephotos/misc/preferences/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.googlephotos.misc.preferences 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val backupPreferencesFingerprint = fingerprint { 6 | returns("Lcom/google/android/apps/photos/backup/data/BackupPreferences;") 7 | strings("backup_prefs_had_backup_only_when_charging_enabled") 8 | } 9 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/googlerecorder/restrictions/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.googlerecorder.restrictions 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val onApplicationCreateFingerprint = fingerprint { 6 | strings("com.google.android.feature.PIXEL_2017_EXPERIENCE") 7 | custom { method, classDef -> 8 | if (method.name != "onCreate") return@custom false 9 | 10 | classDef.endsWith("RecorderApplication;") 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/DisableAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.hexeditor.ad 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val disableAdsPatch = bytecodePatch( 8 | name = "Disable ads", 9 | ) { 10 | compatibleWith("com.myprog.hexedit") 11 | 12 | execute { 13 | primaryAdsFingerprint.method.replaceInstructions( 14 | 0, 15 | """ 16 | const/4 v0, 0x1 17 | return v0 18 | """, 19 | ) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/hexeditor/ad/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.hexeditor.ad 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val primaryAdsFingerprint = fingerprint { 6 | custom { method, classDef -> 7 | classDef.endsWith("PreferencesHelper;") && method.name == "isAdsDisabled" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.iconpackstudio.misc.pro 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val checkProFingerprint = fingerprint { 6 | returns("Z") 7 | custom { _, classDef -> classDef.endsWith("IPSPurchaseRepository;") } 8 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/iconpackstudio/misc/pro/UnlockProPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.iconpackstudio.misc.pro 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val unlockProPatch = bytecodePatch( 8 | name = "Unlock pro", 9 | ) { 10 | compatibleWith("ginlemon.iconpackstudio"("2.2 build 016")) 11 | 12 | execute { 13 | checkProFingerprint.method.addInstructions( 14 | 0, 15 | """ 16 | const/4 v0, 0x1 17 | return v0 18 | """, 19 | ) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/idaustria/detection/root/RootDetectionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.idaustria.detection.root 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.util.returnEarly 5 | 6 | @Suppress("unused") 7 | val rootDetectionPatch = bytecodePatch( 8 | name = "Remove root detection", 9 | description = "Removes the check for root permissions and unlocked bootloader.", 10 | ) { 11 | compatibleWith("at.gv.oe.app") 12 | 13 | execute { 14 | setOf( 15 | attestationSupportedCheckFingerprint, 16 | bootloaderCheckFingerprint, 17 | rootCheckFingerprint, 18 | ).forEach { it.method.returnEarly(true) } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/idaustria/detection/signature/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.idaustria.detection.signature 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | 6 | internal val spoofSignatureFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PRIVATE) 8 | returns("L") 9 | parameters("L") 10 | custom { method, classDef -> 11 | classDef.endsWith("/SL2Step1Task;") && method.name == "getPubKey" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/inshorts/ad/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.inshorts.ad 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val inshortsAdsFingerprint = fingerprint { 6 | returns("V") 7 | strings("GoogleAdLoader", "exception in requestAd") 8 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/inshorts/ad/InshortsAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.inshorts.ad 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val hideAdsPatch = bytecodePatch( 8 | name = "Hide ads", 9 | ) { 10 | compatibleWith("com.nis.app") 11 | 12 | execute { 13 | inshortsAdsFingerprint.method.addInstruction( 14 | 0, 15 | """ 16 | return-void 17 | """, 18 | ) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/instagram/ads/HideAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.instagram.ads 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | 5 | @Deprecated("Patch was moved to different package: app.revanced.patches.meta.ads.hideAdsPatch") 6 | @Suppress("unused") 7 | val hideAdsPatch = bytecodePatch { 8 | dependsOn(app.revanced.patches.meta.ads.hideAdsPatch) 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/instagram/misc/signature/SignatureCheckPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.instagram.misc.signature 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.util.returnEarly 5 | 6 | @Suppress("unused") 7 | val signatureCheckPatch = bytecodePatch( 8 | name = "Disable signature check", 9 | description = "Disables the signature check that causes the app to crash on startup." 10 | ) { 11 | compatibleWith("com.instagram.android"("378.0.0.52.68")) 12 | 13 | execute { 14 | isValidSignatureMethodFingerprint 15 | .match(isValidSignatureClassFingerprint.classDef) 16 | .method 17 | .returnEarly(true) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/irplus/ad/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.irplus.ad 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val irplusAdsFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) 8 | returns("V") 9 | parameters("L", "Z") 10 | strings("TAGGED") 11 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/irplus/ad/RemoveAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.irplus.ad 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val removeAdsPatch = bytecodePatch( 8 | name = "Remove ads", 9 | ) { 10 | compatibleWith("net.binarymode.android.irplus") 11 | 12 | execute { 13 | // By overwriting the second parameter of the method, 14 | // the view which holds the advertisement is removed. 15 | irplusAdsFingerprint.method.addInstruction(0, "const/4 p2, 0x0") 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/DisableMandatoryLoginPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.lightroom.misc.login 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val disableMandatoryLoginPatch = bytecodePatch( 8 | name = "Disable mandatory login", 9 | ) { 10 | compatibleWith("com.adobe.lrmobile"("10.0.2")) 11 | 12 | execute { 13 | isLoggedInFingerprint.method.apply { 14 | val index = implementation!!.instructions.lastIndex - 1 15 | // Set isLoggedIn = true. 16 | replaceInstruction(index, "const/4 v0, 0x1") 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/lightroom/misc/login/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.lightroom.misc.login 2 | 3 | import com.android.tools.smali.dexlib2.Opcode 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | import app.revanced.patcher.fingerprint 6 | 7 | internal val isLoggedInFingerprint = fingerprint { 8 | accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC, AccessFlags.FINAL) 9 | returns("Z") 10 | opcodes( 11 | Opcode.INVOKE_STATIC, 12 | Opcode.MOVE_RESULT_OBJECT, 13 | Opcode.SGET_OBJECT, 14 | Opcode.IF_NE, 15 | Opcode.CONST_4, 16 | Opcode.GOTO 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.lightroom.misc.premium 2 | 3 | import com.android.tools.smali.dexlib2.Opcode 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | import app.revanced.patcher.fingerprint 6 | 7 | internal val hasPurchasedFingerprint = fingerprint { 8 | accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) 9 | returns("Z") 10 | opcodes( 11 | Opcode.SGET_OBJECT, 12 | Opcode.CONST_4, 13 | Opcode.CONST_4, 14 | Opcode.CONST_4, 15 | ) 16 | strings("isPurchaseDoneRecently = true, access platform profile present? = ") 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/lightroom/misc/premium/UnlockPremiumPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.lightroom.misc.premium 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val unlockPremiumPatch = bytecodePatch( 8 | name = "Unlock premium", 9 | ) { 10 | compatibleWith("com.adobe.lrmobile"("10.0.2")) 11 | 12 | execute { 13 | // Set hasPremium = true. 14 | hasPurchasedFingerprint.method.replaceInstruction(2, "const/4 v2, 0x1") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/license/LicenseValidationPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.memegenerator.detection.license 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | val licenseValidationPatch = bytecodePatch( 7 | description = "Disables Firebase license validation.", 8 | ) { 9 | 10 | execute { 11 | licenseValidationFingerprint.method.replaceInstructions( 12 | 0, 13 | """ 14 | const/4 p0, 0x1 15 | return p0 16 | """, 17 | ) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/memegenerator/detection/signature/SignatureVerificationPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.memegenerator.detection.signature 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | val signatureVerificationPatch = bytecodePatch( 7 | description = "Disables detection of incorrect signature.", 8 | ) { 9 | 10 | execute { 11 | verifySignatureFingerprint.method.replaceInstructions( 12 | 0, 13 | """ 14 | const/4 p0, 0x1 15 | return p0 16 | """, 17 | ) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.messenger.inbox 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val hideInboxAdsPatch = bytecodePatch( 8 | name = "Hide inbox ads", 9 | description = "Hides ads in inbox.", 10 | ) { 11 | compatibleWith("com.facebook.orca") 12 | 13 | execute { 14 | loadInboxAdsFingerprint.method.replaceInstruction(0, "return-void") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/messenger/inbox/HideInboxSubtabsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.messenger.inbox 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val hideInboxSubtabsPatch = bytecodePatch( 8 | name = "Hide inbox subtabs", 9 | description = "Hides Home and Channels tabs between active now tray and chats.", 10 | ) { 11 | compatibleWith("com.facebook.orca") 12 | 13 | execute { 14 | createInboxSubTabsFingerprint.method.replaceInstruction(2, "const/4 v0, 0x0") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/messenger/inputfield/DisableTypingIndicatorPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.messenger.inputfield 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.replaceInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val disableTypingIndicatorPatch = bytecodePatch( 8 | name = "Disable typing indicator", 9 | description = "Disables the indicator while typing a message.", 10 | ) { 11 | compatibleWith("com.facebook.orca") 12 | 13 | execute { 14 | sendTypingIndicatorFingerprint.method.replaceInstruction(0, "return-void") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/messenger/metaai/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.messenger.metaai 2 | 3 | import com.android.tools.smali.dexlib2.Opcode 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val getMobileConfigBoolFingerprint = fingerprint { 7 | parameters("J") 8 | returns("Z") 9 | opcodes(Opcode.RETURN) 10 | custom { method, classDef -> 11 | method.implementation ?: return@custom false // unsure if this is necessary 12 | classDef.interfaces.contains("Lcom/facebook/mobileconfig/factory/MobileConfigUnsafeContext;") 13 | } 14 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/ExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.messenger.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 4 | 5 | val sharedExtensionPatch = sharedExtensionPatch("messenger", mainActivityOnCreateHook) -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/messenger/misc/extension/Hooks.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.messenger.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.extensionHook 4 | 5 | internal val mainActivityOnCreateHook = extensionHook { 6 | strings("MainActivity_onCreate_begin") 7 | } 8 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/messenger/navbar/RemoveMetaAITabPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.messenger.navbar 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.patches.messenger.metaai.removeMetaAIPatch 5 | 6 | @Deprecated("Superseded by removeMetaAIPatch", ReplaceWith("removeMetaAIPatch")) 7 | @Suppress("unused") 8 | val removeMetaAITabPatch = bytecodePatch( 9 | description = "Removes the 'Meta AI' tab from the navbar.", 10 | ) { 11 | dependsOn(removeMetaAIPatch) 12 | } 13 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/meta/ads/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.meta.ads 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | 6 | internal val adInjectorFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PRIVATE) 8 | returns("Z") 9 | parameters("L", "L") 10 | strings( 11 | "SponsoredContentController.insertItem", 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/meta/ads/HideAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.meta.ads 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.util.returnEarly 5 | 6 | @Suppress("unused") 7 | val hideAdsPatch = bytecodePatch( 8 | name = "Hide ads", 9 | ) { 10 | /** 11 | * Patch is identical for both Instagram and Threads app. 12 | */ 13 | compatibleWith( 14 | "com.instagram.android", 15 | "com.instagram.barcelona", 16 | ) 17 | 18 | execute { 19 | adInjectorFingerprint.method.returnEarly(false) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/mifitness/misc/locale/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.mifitness.misc.locale 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.Opcode 5 | 6 | internal val syncBluetoothLanguageFingerprint = fingerprint { 7 | opcodes(Opcode.MOVE_RESULT_OBJECT) 8 | custom { method, _ -> 9 | method.name == "syncBluetoothLanguage" && 10 | method.definingClass == "Lcom/xiaomi/fitness/devicesettings/DeviceSettingsSyncer;" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.mifitness.misc.login 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | 6 | internal val xiaomiAccountManagerConstructorFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PRIVATE, AccessFlags.CONSTRUCTOR) 8 | parameters("Landroid/content/Context;", "Z") 9 | custom { method, _ -> 10 | method.definingClass == "Lcom/xiaomi/passport/accountmanager/XiaomiAccountManager;" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/mifitness/misc/login/FixLoginPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.mifitness.misc.login 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | val fixLoginPatch = bytecodePatch( 7 | name = "Fix login", 8 | description = "Fixes login for uncertified Mi Fitness app", 9 | ) { 10 | compatibleWith("com.xiaomi.wearable") 11 | 12 | execute { 13 | xiaomiAccountManagerConstructorFingerprint.method.addInstruction(0, "const/16 p2, 0x0") 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/music/ad/video/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.music.ad.video 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.Opcode 5 | 6 | internal val showVideoAdsParentFingerprint = fingerprint { 7 | opcodes( 8 | Opcode.MOVE_RESULT_OBJECT, 9 | Opcode.INVOKE_VIRTUAL, 10 | Opcode.IGET_OBJECT, 11 | ) 12 | strings("maybeRegenerateCpnAndStatsClient called unexpectedly, but no error.") 13 | } 14 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/music/audio/exclusiveaudio/EnableExclusiveAudioPlayback.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.music.audio.exclusiveaudio 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.util.returnEarly 5 | 6 | @Suppress("unused") 7 | val enableExclusiveAudioPlaybackPatch = bytecodePatch( 8 | name = "Enable exclusive audio playback", 9 | description = "Enables the option to play audio without video.", 10 | ) { 11 | compatibleWith( 12 | "com.google.android.apps.youtube.music"( 13 | "7.16.53", 14 | "8.05.51" 15 | ) 16 | ) 17 | 18 | execute { 19 | allowExclusiveAudioPlaybackFingerprint.method.returnEarly(true) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentrepeat/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.music.interaction.permanentrepeat 2 | 3 | import com.android.tools.smali.dexlib2.Opcode 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | import app.revanced.patcher.fingerprint 6 | 7 | internal val repeatTrackFingerprint = fingerprint { 8 | accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) 9 | returns("V") 10 | parameters("L", "L") 11 | opcodes( 12 | Opcode.IGET_OBJECT, 13 | Opcode.IGET_OBJECT, 14 | Opcode.SGET_OBJECT, 15 | Opcode.INVOKE_VIRTUAL, 16 | Opcode.MOVE_RESULT, 17 | Opcode.IF_NEZ 18 | ) 19 | strings("w_st") 20 | } 21 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/music/interaction/permanentshuffle/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.music.interaction.permanentshuffle 2 | 3 | import com.android.tools.smali.dexlib2.Opcode 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | import app.revanced.patcher.fingerprint 6 | 7 | internal val disableShuffleFingerprint = fingerprint { 8 | accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) 9 | returns("V") 10 | parameters() 11 | opcodes( 12 | Opcode.IGET_OBJECT, 13 | Opcode.INVOKE_VIRTUAL, 14 | Opcode.SGET_OBJECT, 15 | Opcode.IPUT_OBJECT, 16 | Opcode.IGET_OBJECT, 17 | Opcode.INVOKE_VIRTUAL 18 | ) 19 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/music/layout/upgradebutton/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.music.layout.upgradebutton 2 | 3 | import com.android.tools.smali.dexlib2.Opcode 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | import app.revanced.patcher.fingerprint 6 | 7 | internal val pivotBarConstructorFingerprint = fingerprint { 8 | accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) 9 | returns("V") 10 | parameters("L", "Z") 11 | opcodes( 12 | Opcode.CHECK_CAST, 13 | Opcode.INVOKE_INTERFACE, 14 | Opcode.GOTO, 15 | Opcode.IPUT_OBJECT, 16 | Opcode.RETURN_VOID 17 | ) 18 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/BypassCertificateChecksPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.music.misc.androidauto 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.util.returnEarly 5 | 6 | @Suppress("unused") 7 | val bypassCertificateChecksPatch = bytecodePatch( 8 | name = "Bypass certificate checks", 9 | description = "Bypasses certificate checks which prevent YouTube Music from working on Android Auto.", 10 | ) { 11 | compatibleWith( 12 | "com.google.android.apps.youtube.music"( 13 | "7.16.53", 14 | "8.05.51" 15 | ) 16 | ) 17 | 18 | execute { 19 | checkCertificateFingerprint.method.returnEarly(true) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/music/misc/androidauto/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.music.misc.androidauto 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val checkCertificateFingerprint = fingerprint { 7 | returns("Z") 8 | parameters("Ljava/lang/String;") 9 | strings( 10 | "X509", 11 | "Failed to get certificate" // Partial String match. 12 | ) 13 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/music/misc/extension/SharedExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.music.misc.extension 2 | 3 | import app.revanced.patches.music.misc.extension.hooks.applicationInitHook 4 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 5 | 6 | val sharedExtensionPatch = sharedExtensionPatch( 7 | "music", 8 | applicationInitHook, 9 | ) 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/music/misc/extension/hooks/ApplicationInitHook.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.music.misc.extension.hooks 2 | 3 | import app.revanced.patches.shared.misc.extension.extensionHook 4 | 5 | internal val applicationInitHook = extensionHook { 6 | returns("V") 7 | parameters() 8 | strings("activity") 9 | custom { method, _ -> method.name == "onCreate" } 10 | } 11 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Constants.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.music.misc.gms 2 | 3 | object Constants { 4 | internal const val REVANCED_MUSIC_PACKAGE_NAME = "app.revanced.android.apps.youtube.music" 5 | internal const val MUSIC_PACKAGE_NAME = "com.google.android.apps.youtube.music" 6 | } 7 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/music/misc/gms/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.music.misc.gms 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val musicActivityOnCreateFingerprint = fingerprint { 6 | returns("V") 7 | parameters("Landroid/os/Bundle;") 8 | custom { method, classDef -> 9 | method.name == "onCreate" && classDef.endsWith("/MusicActivity;") 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/music/misc/spoof/UserAgentClientSpoofPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.music.misc.spoof 2 | 3 | import app.revanced.patches.shared.misc.spoof.userAgentClientSpoofPatch 4 | 5 | val userAgentClientSpoofPatch = userAgentClientSpoofPatch("com.google.android.apps.youtube.music") 6 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.myexpenses.misc.pro 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val isEnabledFingerprint = fingerprint { 6 | returns("Z") 7 | strings("feature", "feature.licenceStatus") 8 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/myexpenses/misc/pro/UnlockProPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.myexpenses.misc.pro 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val unlockProPatch = bytecodePatch( 8 | name = "Unlock pro", 9 | ) { 10 | compatibleWith("org.totschnig.myexpenses"("3.4.9")) 11 | 12 | execute { 13 | isEnabledFingerprint.method.addInstructions( 14 | 0, 15 | """ 16 | const/4 v0, 0x1 17 | return v0 18 | """, 19 | ) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.nfctoolsse.misc.pro 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val isLicenseRegisteredFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC) 8 | returns("Z") 9 | strings("kLicenseCheck") 10 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/nfctoolsse/misc/pro/UnlockProPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.nfctoolsse.misc.pro 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val unlockProPatch = bytecodePatch( 8 | name = "Unlock pro", 9 | ) { 10 | compatibleWith("com.wakdev.apps.nfctools.se") 11 | 12 | execute { 13 | isLicenseRegisteredFingerprint.method.addInstructions( 14 | 0, 15 | """ 16 | const/4 v0, 0x1 17 | return v0 18 | """, 19 | ) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/nunl/ads/Hooks.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.nunl.ads 2 | 3 | import app.revanced.patches.shared.misc.extension.extensionHook 4 | 5 | internal val mainActivityOnCreateHook = extensionHook { 6 | custom { method, classDef -> 7 | classDef.type == "Lnl/sanomamedia/android/nu/main/NUMainActivity;" && method.name == "onCreate" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.nyx.misc.pro 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val checkProFingerprint = fingerprint { 6 | custom { method, classDef -> 7 | classDef.endsWith("BillingManager;") && method.name == "isProVersion" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/nyx/misc/pro/UnlockProPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.nyx.misc.pro 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Deprecated("This patch will be removed in the future.") 7 | @Suppress("unused") 8 | val unlockProPatch = bytecodePatch { 9 | compatibleWith("com.awedea.nyx") 10 | 11 | execute { 12 | checkProFingerprint.method.addInstructions( 13 | 0, 14 | """ 15 | const/4 v0, 0x1 16 | return v0 17 | """, 18 | ) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/openinghours/misc/fix/crash/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.openinghours.misc.fix.crash 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val setPlaceFingerprint = fingerprint { 6 | returns("V") 7 | parameters("Lde/simon/openinghours/models/Place;") 8 | custom { method, _ -> 9 | method.name == "setPlace" && 10 | method.definingClass == "Lde/simon/openinghours/views/custom/PlaceCard;" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/pandora/shared/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.pandora.shared 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val constructUserDataFingerprint = fingerprint { 6 | strings("hasAudioAds", "skipLimitBehavior") 7 | } 8 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/photomath/detection/deviceid/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.photomath.detection.deviceid 2 | 3 | import com.android.tools.smali.dexlib2.Opcode 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val getDeviceIdFingerprint = fingerprint { 7 | returns("Ljava/lang/String;") 8 | parameters() 9 | opcodes( 10 | Opcode.SGET_OBJECT, 11 | Opcode.IGET_OBJECT, 12 | Opcode.INVOKE_STATIC, 13 | Opcode.MOVE_RESULT_OBJECT, 14 | Opcode.IF_NEZ, 15 | Opcode.INVOKE_STATIC, 16 | Opcode.MOVE_RESULT_OBJECT, 17 | Opcode.INVOKE_VIRTUAL, 18 | Opcode.MOVE_RESULT_OBJECT, 19 | Opcode.INVOKE_VIRTUAL, 20 | ) 21 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/photomath/detection/signature/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.photomath.detection.signature 2 | 3 | import com.android.tools.smali.dexlib2.Opcode 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val checkSignatureFingerprint = fingerprint { 7 | opcodes( 8 | Opcode.CONST_STRING, 9 | Opcode.INVOKE_STATIC, 10 | Opcode.INVOKE_STATIC, 11 | Opcode.MOVE_RESULT_OBJECT, 12 | Opcode.INVOKE_VIRTUAL, 13 | Opcode.MOVE_RESULT_OBJECT, 14 | Opcode.INVOKE_STATIC, 15 | Opcode.MOVE_RESULT, 16 | ) 17 | strings("SHA") 18 | } 19 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/EnableBookpointPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.photomath.misc.unlock.bookpoint 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.replaceInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | val enableBookpointPatch = bytecodePatch( 7 | description = "Enables textbook access", 8 | ) { 9 | 10 | execute { 11 | isBookpointEnabledFingerprint.method.replaceInstructions( 12 | 0, 13 | """ 14 | const/4 v0, 0x1 15 | return v0 16 | """, 17 | ) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/bookpoint/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.photomath.misc.unlock.bookpoint 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val isBookpointEnabledFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) 8 | returns("Z") 9 | parameters() 10 | strings( 11 | "NoGeoData", 12 | "NoCountryInGeo", 13 | "RemoteConfig", 14 | "GeoRCMismatch" 15 | ) 16 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/photomath/misc/unlock/plus/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.photomath.misc.unlock.plus 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val isPlusUnlockedFingerprint = fingerprint{ 7 | accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) 8 | returns("Z") 9 | strings("genius") 10 | custom { _, classDef -> 11 | classDef.endsWith("/User;") 12 | } 13 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/piccomafr/misc/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.piccomafr.misc 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val getAndroidIdFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) 8 | returns("Ljava/lang/String;") 9 | parameters("Landroid/content/Context;") 10 | strings("context", "android_id") 11 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/pixiv/ads/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.pixiv.ads 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val shouldShowAdsFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) 8 | returns("Z") 9 | custom { methodDef, classDef -> 10 | classDef.type.endsWith("AdUtils;") && methodDef.name == "shouldShowAds" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/pixiv/ads/HideAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.pixiv.ads 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val hideAdsPatch = bytecodePatch( 8 | name = "Hide ads", 9 | ) { 10 | compatibleWith("jp.pxv.android") 11 | 12 | execute { 13 | shouldShowAdsFingerprint.method.addInstructions( 14 | 0, 15 | """ 16 | const/4 v0, 0x0 17 | return v0 18 | """, 19 | ) 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/primevideo/misc/extension/ExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.primevideo.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 4 | 5 | val sharedExtensionPatch = sharedExtensionPatch("primevideo", applicationInitHook) 6 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/primevideo/misc/extension/Hooks.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.primevideo.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.extensionHook 4 | 5 | internal val applicationInitHook = extensionHook { 6 | custom { method, classDef -> 7 | method.name == "onCreate" && classDef.endsWith("/SplashScreenActivity;") 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.rar.misc.annoyances.purchasereminder 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | 6 | internal val showReminderFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) 8 | returns("V") 9 | custom { method, _ -> 10 | method.definingClass.endsWith("AdsNotify;") && method.name == "show" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/rar/misc/annoyances/purchasereminder/HidePurchaseReminderPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.rar.misc.annoyances.purchasereminder 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val hidePurchaseReminderPatch = bytecodePatch( 8 | name = "Hide purchase reminder", 9 | description = "Hides the popup that reminds you to purchase the app.", 10 | 11 | ) { 12 | compatibleWith("com.rarlab.rar") 13 | 14 | execute { 15 | showReminderFingerprint.method.addInstruction(0, "return-void") 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.ad.comments 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val hideCommentAdsFingerprint = fingerprint { 6 | strings( 7 | "link", 8 | // CommentPageRepository is not returning a link object 9 | "is not returning a link object" 10 | ) 11 | custom { _, classDef -> 12 | classDef.sourceFile == "PostDetailPresenter.kt" 13 | } 14 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/ad/comments/HideCommentAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.ad.comments 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | val hideCommentAdsPatch = bytecodePatch( 7 | description = "Removes ads in the comments.", 8 | ) { 9 | 10 | execute { 11 | hideCommentAdsFingerprint.method.addInstructions( 12 | 0, 13 | """ 14 | new-instance v0, Ljava/lang/Object; 15 | invoke-direct {v0}, Ljava/lang/Object;->()V 16 | return-object v0 17 | """, 18 | ) 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/ad/general/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.ad.general 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.Opcode 5 | 6 | internal val adPostFingerprint = fingerprint { 7 | returns("V") 8 | // "children" are present throughout multiple versions 9 | strings("children") 10 | custom { _, classDef -> classDef.endsWith("Listing;") } 11 | } 12 | 13 | internal val newAdPostFingerprint = fingerprint { 14 | opcodes(Opcode.INVOKE_VIRTUAL) 15 | strings("chain", "feedElement") 16 | custom { _, classDef -> classDef.sourceFile == "AdElementConverter.kt" } 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/FixSLinksPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients 2 | 3 | import app.revanced.patcher.patch.BytecodePatchBuilder 4 | import app.revanced.patcher.patch.Patch 5 | import app.revanced.patcher.patch.bytecodePatch 6 | 7 | const val RESOLVE_S_LINK_METHOD = "patchResolveSLink(Ljava/lang/String;)Z" 8 | const val SET_ACCESS_TOKEN_METHOD = "patchSetAccessToken(Ljava/lang/String;)V" 9 | 10 | fun fixSLinksPatch( 11 | extensionPatch: Patch<*>, 12 | block: BytecodePatchBuilder.() -> Unit = {}, 13 | ) = bytecodePatch(name = "Fix /s/ links") { 14 | dependsOn(extensionPatch) 15 | 16 | block() 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/DisableAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.boostforreddit.ads 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val disableAdsPatch = bytecodePatch( 8 | name = "Disable ads", 9 | ) { 10 | compatibleWith("com.rubenmayayo.reddit") 11 | 12 | execute { 13 | arrayOf(maxMediationFingerprint, admobMediationFingerprint).forEach { fingerprint -> 14 | fingerprint.method.addInstructions(0, "return-void") 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/ads/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.boostforreddit.ads 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val maxMediationFingerprint = fingerprint { 6 | strings("MaxMediation: Attempting to initialize SDK") 7 | } 8 | 9 | internal val admobMediationFingerprint = fingerprint { 10 | strings("AdmobMediation: Attempting to initialize SDK") 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/api/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.boostforreddit.api 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val buildUserAgentFingerprint = fingerprint { 6 | strings("%s:%s:%s (by /u/%s)") 7 | } 8 | 9 | internal val getClientIdFingerprint = fingerprint { 10 | custom { method, classDef -> 11 | if (!classDef.endsWith("Credentials;")) return@custom false 12 | 13 | method.name == "getClientId" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/fix/downloads/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.boostforreddit.fix.downloads 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val downloadAudioFingerprint = fingerprint { 6 | strings("/DASH_audio.mp4", "/audio") 7 | } 8 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/misc/extension/SharedExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.boostforreddit.misc.extension 2 | 3 | import app.revanced.patches.reddit.customclients.boostforreddit.misc.extension.hooks.initHook 4 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 5 | 6 | val sharedExtensionPatch = sharedExtensionPatch("boostforreddit", initHook) 7 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/boostforreddit/misc/extension/hooks/InitHook.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.boostforreddit.misc.extension.hooks 2 | 3 | import app.revanced.patches.shared.misc.extension.extensionHook 4 | 5 | internal val initHook = extensionHook( 6 | insertIndexResolver = { 1 }, 7 | ) { 8 | custom { method, _ -> 9 | method.definingClass == "Lcom/rubenmayayo/reddit/MyApplication;" && method.name == "onCreate" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/api/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.infinityforreddit.api 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val apiUtilsFingerprint = fingerprint { 6 | strings("native-lib") 7 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/infinityforreddit/subscription/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.infinityforreddit.subscription 2 | 3 | import app.revanced.patcher.fingerprint 4 | import app.revanced.util.literal 5 | 6 | internal val billingClientOnServiceConnectedFingerprint = fingerprint { 7 | strings("Billing service connected") 8 | } 9 | 10 | internal val startSubscriptionActivityFingerprint = fingerprint { 11 | literal { 12 | // Intent start flag only used in the subscription activity 13 | 0x10008000 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/ads/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.joeyforreddit.ads 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val isAdFreeUserFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC) 8 | returns("Z") 9 | strings("AD_FREE_USER") 10 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/joeyforreddit/detection/piracy/DisablePiracyDetectionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.joeyforreddit.detection.piracy 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | val disablePiracyDetectionPatch = bytecodePatch { 7 | 8 | execute { 9 | piracyDetectionFingerprint.method.addInstruction(0, "return-void") 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/slide/api/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.slide.api 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val getClientIdFingerprint = fingerprint { 6 | custom { method, classDef -> 7 | if (!classDef.endsWith("Credentials;")) return@custom false 8 | 9 | method.name == "getClientId" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/DisableAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.sync.ads 2 | 3 | import app.revanced.patcher.patch.BytecodePatchBuilder 4 | import app.revanced.patcher.patch.bytecodePatch 5 | import app.revanced.util.returnEarly 6 | 7 | fun disableAdsPatch(block: BytecodePatchBuilder.() -> Unit = {}) = bytecodePatch( 8 | name = "Disable ads", 9 | ) { 10 | execute { 11 | isAdsEnabledFingerprint.method.returnEarly() 12 | } 13 | 14 | block() 15 | } 16 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/ads/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.sync.ads 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val isAdsEnabledFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) 8 | returns("Z") 9 | strings("SyncIapHelper") 10 | } 11 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/detection/piracy/DisablePiracyDetectionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.sync.detection.piracy 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | val disablePiracyDetectionPatch = bytecodePatch( 7 | description = "Disables detection of modified versions.", 8 | ) { 9 | 10 | execute { 11 | // Do not throw an error if the fingerprint is not resolved. 12 | // This is fine because new versions of the target app do not need this patch. 13 | piracyDetectionFingerprint.methodOrNull?.addInstruction(0, "return-void") 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforlemmy/ads/DisableAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.sync.syncforlemmy.ads 2 | 3 | import app.revanced.patches.reddit.customclients.sync.ads.disableAdsPatch 4 | import app.revanced.patches.reddit.customclients.sync.detection.piracy.disablePiracyDetectionPatch 5 | 6 | @Suppress("unused") 7 | val disableAdsPatch = disableAdsPatch { 8 | dependsOn(disablePiracyDetectionPatch) 9 | 10 | compatibleWith("com.laurencedawson.reddit_sync") 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/ads/DisableAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.sync.syncforreddit.ads 2 | 3 | import app.revanced.patches.reddit.customclients.sync.ads.disableAdsPatch 4 | 5 | @Suppress("unused") 6 | val disableAdsPatch = disableAdsPatch { 7 | compatibleWith("io.syncapps.lemmy_sync") 8 | } 9 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/annoyances/startup/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.sync.syncforreddit.annoyances.startup 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val mainActivityOnCreateFingerprint = fingerprint { 6 | custom { method, classDef -> 7 | classDef.endsWith("MainActivity;") && method.name == "onCreate" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/api/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.sync.syncforreddit.api 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val getAuthorizationStringFingerprint = fingerprint { 6 | strings("authorize.compact?client_id") 7 | } 8 | 9 | internal val getBearerTokenFingerprint = fingerprint { 10 | strings("Basic") 11 | } 12 | 13 | internal val getUserAgentFingerprint = fingerprint { 14 | strings("android:com.laurencedawson.reddit_sync") 15 | } 16 | 17 | internal val imgurImageAPIFingerprint = fingerprint { 18 | strings("https://imgur-apiv3.p.rapidapi.com/3/image") 19 | } 20 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/extension/SharedExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.sync.syncforreddit.extension 2 | 3 | import app.revanced.patches.reddit.customclients.sync.syncforreddit.extension.hooks.initHook 4 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 5 | 6 | val sharedExtensionPatch = sharedExtensionPatch("syncforreddit", initHook) 7 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/extension/hooks/InitHook.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.sync.syncforreddit.extension.hooks 2 | 3 | import app.revanced.patches.shared.misc.extension.extensionHook 4 | 5 | internal val initHook = extensionHook( 6 | insertIndexResolver = { 1 }, // Insert after call to super class. 7 | ) { 8 | custom { method, classDef -> 9 | method.name == "onCreate" && classDef.type == "Lcom/laurencedawson/reddit_sync/RedditApplication;" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/slink/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.slink 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val linkHelperOpenLinkFingerprint = fingerprint { 6 | strings("Link title: ") 7 | } 8 | 9 | internal val setAuthorizationHeaderFingerprint = fingerprint { 10 | returns("Ljava/util/HashMap;") 11 | strings("Authorization", "bearer ") 12 | custom { method, _ -> method.definingClass == "Lcom/laurencedawson/reddit_sync/singleton/a;" } 13 | } 14 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/customclients/sync/syncforreddit/fix/video/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.customclients.sync.syncforreddit.fix.video 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.Opcode 5 | 6 | internal val parseRedditVideoNetworkResponseFingerprint = fingerprint { 7 | opcodes( 8 | Opcode.NEW_INSTANCE, 9 | Opcode.IGET_OBJECT, 10 | Opcode.INVOKE_DIRECT, 11 | Opcode.CONST_WIDE_32, 12 | ) 13 | custom { methodDef, classDef -> 14 | classDef.sourceFile == "RedditVideoRequest.java" && methodDef.name == "parseNetworkResponse" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/DisableScreenshotPopupPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.layout.disablescreenshotpopup 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val disableScreenshotPopupPatch = bytecodePatch( 8 | name = "Disable screenshot popup", 9 | description = "Disables the popup that shows up when taking a screenshot.", 10 | ) { 11 | compatibleWith("com.reddit.frontpage") 12 | 13 | execute { 14 | disableScreenshotPopupFingerprint.method.addInstruction(0, "return-void") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/layout/disablescreenshotpopup/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.layout.disablescreenshotpopup 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val disableScreenshotPopupFingerprint = fingerprint { 6 | returns("V") 7 | parameters("Landroidx/compose/runtime/", "I") 8 | custom { method, classDef -> 9 | if (!classDef.endsWith("\$ScreenshotTakenBannerKt\$lambda-1\$1;")) { 10 | return@custom false 11 | } 12 | 13 | method.name == "invoke" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/layout/premiumicon/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.layout.premiumicon 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val hasPremiumIconAccessFingerprint = fingerprint { 6 | returns("Z") 7 | custom { method, classDef -> 8 | classDef.endsWith("MyAccount;") && method.name == "isPremiumSubscriber" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/misc/extension/ExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 4 | 5 | val sharedExtensionPatch = sharedExtensionPatch("reddit") 6 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.misc.tracking.url 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val shareLinkFormatterFingerprint = fingerprint { 6 | custom { _, classDef -> 7 | classDef.startsWith("Lcom/reddit/sharing/") && classDef.sourceFile == "UrlUtil.kt" 8 | } 9 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/reddit/misc/tracking/url/SanitizeUrlQueryPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.reddit.misc.tracking.url 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val sanitizeUrlQueryPatch = bytecodePatch( 8 | name = "Sanitize sharing links", 9 | description = "Removes (tracking) query parameters from the URLs when sharing links.", 10 | ) { 11 | compatibleWith("com.reddit.frontpage") 12 | 13 | execute { 14 | shareLinkFormatterFingerprint.method.addInstructions( 15 | 0, 16 | "return-object p0", 17 | ) 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.serviceportalbund.detection.root 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val rootDetectionFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC) 8 | returns("V") 9 | custom { _, classDef -> 10 | classDef.endsWith("/DeviceIntegrityCheck;") 11 | } 12 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/serviceportalbund/detection/root/RootDetectionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.serviceportalbund.detection.root 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val rootDetectionPatch = bytecodePatch( 8 | name = "Remove root detection", 9 | description = "Removes the check for root permissions and unlocked bootloader.", 10 | ) { 11 | compatibleWith("at.gv.bka.serviceportal") 12 | 13 | execute { 14 | rootDetectionFingerprint.method.addInstruction(0, "return-void") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/shared/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.shared 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val castContextFetchFingerprint = fingerprint { 6 | strings("Error fetching CastContext.") 7 | } 8 | 9 | internal val primeMethodFingerprint = fingerprint { 10 | strings("com.google.android.GoogleCamera", "com.android.vending") 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/shared/misc/checks/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.shared.misc.checks 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val patchInfoFingerprint = fingerprint { 6 | custom { _, classDef -> classDef.type == "Lapp/revanced/extension/shared/checks/PatchInfo;" } 7 | } 8 | 9 | internal val patchInfoBuildFingerprint = fingerprint { 10 | custom { _, classDef -> classDef.type == "Lapp/revanced/extension/shared/checks/PatchInfo\$Build;" } 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/shared/misc/extension/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.shared.misc.extension 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | 6 | internal val revancedUtilsPatchesVersionFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) 8 | returns("Ljava/lang/String;") 9 | parameters() 10 | custom { method, _ -> 11 | method.name == "getPatchesReleaseVersion" && method.definingClass == EXTENSION_CLASS_DESCRIPTOR 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/shared/misc/fix/verticalscroll/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.shared.misc.fix.verticalscroll 2 | 3 | import com.android.tools.smali.dexlib2.Opcode 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | import app.revanced.patcher.fingerprint 6 | 7 | internal val canScrollVerticallyFingerprint = fingerprint { 8 | accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) 9 | returns("Z") 10 | parameters() 11 | opcodes( 12 | Opcode.MOVE_RESULT, 13 | Opcode.RETURN, 14 | Opcode.INVOKE_VIRTUAL, 15 | Opcode.MOVE_RESULT 16 | ) 17 | custom { _, classDef -> classDef.endsWith("SwipeRefreshLayout;") } 18 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/shared/misc/pairip/license/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.shared.misc.pairip.license 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val processLicenseResponseFingerprint = fingerprint { 6 | custom { method, classDef -> 7 | classDef.type == "Lcom/pairip/licensecheck/LicenseClient;" && 8 | method.name == "processResponse" 9 | } 10 | } 11 | 12 | internal val validateLicenseResponseFingerprint = fingerprint { 13 | custom { method, classDef -> 14 | classDef.type == "Lcom/pairip/licensecheck/ResponseValidator;" && 15 | method.name == "validateResponse" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/InputType.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.shared.misc.settings.preference 2 | 3 | enum class InputType(val type: String) { 4 | TEXT("text"), 5 | TEXT_CAP_CHARACTERS("textCapCharacters"), 6 | TEXT_MULTI_LINE("textMultiLine"), 7 | NUMBER("number"), 8 | NUMBER_DECIMAL("numberDecimal"), 9 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/shared/misc/settings/preference/SummaryType.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.shared.misc.settings.preference 2 | 3 | enum class SummaryType(val type: String) { 4 | DEFAULT("summary"), ON("summaryOn"), OFF("summaryOff") 5 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/solidexplorer2/functionality/filesize/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.solidexplorer2.functionality.filesize 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.Opcode 5 | 6 | internal val onReadyFingerprint = fingerprint { 7 | opcodes( 8 | Opcode.CONST_WIDE_32, // Constant storing the 2MB limit 9 | Opcode.CMP_LONG, 10 | Opcode.IF_LEZ, 11 | ) 12 | custom { method, _ -> 13 | method.name == "onReady" && method.definingClass == "Lpl/solidexplorer/plugins/texteditor/TextEditor;" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/songpal/badge/RemoveNotificationBadgePatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.songpal.badge 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val removeNotificationBadgePatch = bytecodePatch( 8 | name = "Remove notification badge", 9 | description = "Removes the red notification badge from the activity tab.", 10 | ) { 11 | compatibleWith("com.sony.songpal.mdr"("10.1.0")) 12 | 13 | execute { 14 | showNotificationFingerprint.method.addInstructions(0, "return-void") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/DisableTelemetryPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.soundcloud.analytics 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val disableTelemetryPatch = bytecodePatch( 8 | name = "Disable telemetry", 9 | description = "Disables SoundCloud's telemetry system.", 10 | ) { 11 | compatibleWith("com.soundcloud.android") 12 | 13 | execute { 14 | // Empty the "backend" argument to abort the initializer. 15 | createTrackingApiFingerprint.method.addInstruction(0, "const-string p1, \"\"") 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/soundcloud/analytics/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.soundcloud.analytics 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | 6 | internal val createTrackingApiFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC) 8 | returns("L") 9 | custom { methodDef, _ -> 10 | methodDef.name == "create" 11 | } 12 | strings("backend", "boogaloo") 13 | } 14 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/soundcloud/shared/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.soundcloud.shared 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | import com.android.tools.smali.dexlib2.Opcode 6 | 7 | internal val featureConstructorFingerprint = fingerprint { 8 | returns("V") 9 | accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) 10 | parameters("Ljava/lang/String;", "Z", "Ljava/util/List;") 11 | opcodes( 12 | Opcode.SGET_OBJECT, 13 | Opcode.CHECK_CAST, 14 | Opcode.INVOKE_VIRTUAL 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/spotify/misc/check/CheckEnvironmentPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.spotify.misc.check 2 | 3 | import app.revanced.patches.shared.misc.checks.checkEnvironmentPatch 4 | import app.revanced.patches.spotify.shared.mainActivityOnCreateFingerprint 5 | import app.revanced.patches.spotify.misc.extension.sharedExtensionPatch 6 | 7 | internal val checkEnvironmentPatch = checkEnvironmentPatch( 8 | mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, 9 | extensionPatch = sharedExtensionPatch, 10 | "com.spotify.music", 11 | ) 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/spotify/misc/extension/Hooks.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.spotify.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.extensionHook 4 | import app.revanced.patches.spotify.shared.mainActivityOnCreateFingerprint 5 | 6 | internal val mainActivityOnCreateHook = extensionHook(fingerprint = mainActivityOnCreateFingerprint) 7 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.spotify.misc.fix 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val getPackageInfoFingerprint = fingerprint { 6 | strings( 7 | "Failed to get the application signatures" 8 | ) 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/SpoofSignaturePatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.spotify.misc.fix 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | 5 | @Deprecated("Superseded by spoofPackageInfoPatch", ReplaceWith("spoofPackageInfoPatch")) 6 | @Suppress("unused") 7 | val spoofSignaturePatch = bytecodePatch( 8 | description = "Spoofs the signature of the app fix various functions of the app.", 9 | ) { 10 | dependsOn(spoofPackageInfoPatch) 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/spotify/misc/fix/login/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.spotify.misc.fix.login 2 | 3 | import app.revanced.patcher.fingerprint 4 | import app.revanced.util.literal 5 | 6 | internal val katanaProxyLoginMethodHandlerClassFingerprint = fingerprint { 7 | strings("katana_proxy_auth") 8 | } 9 | 10 | internal val katanaProxyLoginMethodTryAuthorizeFingerprint = fingerprint { 11 | strings("e2e") 12 | literal { 0 } 13 | } 14 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/spotify/misc/widgets/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.spotify.misc.widgets 2 | 3 | import app.revanced.patcher.fingerprint 4 | import app.revanced.util.indexOfFirstInstruction 5 | import com.android.tools.smali.dexlib2.Opcode 6 | 7 | internal val canBindAppWidgetPermissionFingerprint = fingerprint { 8 | strings("android.permission.BIND_APPWIDGET") 9 | opcodes(Opcode.AND_INT_LIT8) 10 | } 11 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/spotify/navbar/PremiumNavbarTabPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.spotify.navbar 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.patches.spotify.misc.unlockPremiumPatch 5 | 6 | @Deprecated("Superseded by unlockPremiumPatch", ReplaceWith("unlockPremiumPatch")) 7 | @Suppress("unused") 8 | val premiumNavbarTabPatch = bytecodePatch( 9 | description = "Hides the premium tab from the navigation bar.", 10 | ) { 11 | dependsOn(unlockPremiumPatch) 12 | } 13 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/spotify/shared/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.spotify.shared 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | private const val SPOTIFY_MAIN_ACTIVITY = "Lcom/spotify/music/SpotifyMainActivity;" 6 | 7 | /** 8 | * Main activity of target 8.6.98.900. 9 | */ 10 | internal const val SPOTIFY_MAIN_ACTIVITY_LEGACY = "Lcom/spotify/music/MainActivity;" 11 | 12 | internal val mainActivityOnCreateFingerprint = fingerprint { 13 | custom { method, classDef -> 14 | method.name == "onCreate" && (classDef.type == SPOTIFY_MAIN_ACTIVITY 15 | || classDef.type == SPOTIFY_MAIN_ACTIVITY_LEGACY) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/strava/subscription/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.strava.subscription 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.Opcode 5 | 6 | internal val getSubscribedFingerprint = fingerprint { 7 | opcodes(Opcode.IGET_BOOLEAN) 8 | custom { method, classDef -> 9 | classDef.endsWith("/SubscriptionDetailResponse;") && method.name == "getSubscribed" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/strava/upselling/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.strava.upselling 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.Opcode 5 | 6 | internal val getModulesFingerprint = fingerprint { 7 | opcodes(Opcode.IGET_OBJECT) 8 | custom { method, classDef -> 9 | classDef.endsWith("/GenericLayoutEntry;") && method.name == "getModules" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/swissid/integritycheck/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.swissid.integritycheck 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val checkIntegrityFingerprint = fingerprint { 6 | returns("V") 7 | parameters("Lcom/swisssign/deviceintegrity/model/DeviceIntegrityResult;") 8 | strings("it", "result") 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/ticktick/misc/themeunlock/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.ticktick.misc.themeunlock 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val checkLockedThemesFingerprint = fingerprint { 6 | custom { method, classDef -> 7 | classDef.endsWith("Theme;") && method.name == "isLockedTheme" 8 | } 9 | } 10 | 11 | internal val setThemeFingerprint = fingerprint { 12 | custom { method, classDef -> 13 | classDef.endsWith("ThemePreviewActivity;") && method.name == "lambda\$updateUserBtn\$1" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/cleardisplay/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.tiktok.interaction.cleardisplay 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val onClearDisplayEventFingerprint = fingerprint { 6 | custom { method, classDef -> 7 | // Internally the feature is called "Clear mode". 8 | classDef.endsWith("/ClearModePanelComponent;") && method.name == "onClearModeEvent" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/seekbar/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.tiktok.interaction.seekbar 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val setSeekBarShowTypeFingerprint = fingerprint { 6 | strings("seekbar show type change, change to:") 7 | } 8 | 9 | internal val shouldShowSeekBarFingerprint = fingerprint { 10 | strings("can not show seekbar, state: 1, not in resume") 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/tiktok/interaction/speed/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.tiktok.interaction.speed 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | 6 | internal val getSpeedFingerprint = fingerprint { 7 | custom { method, classDef -> 8 | classDef.endsWith("/BaseListFragmentPanel;") && method.name == "onFeedSpeedSelectedEvent" 9 | } 10 | } 11 | 12 | internal val setSpeedFingerprint = fingerprint { 13 | accessFlags(AccessFlags.PUBLIC, AccessFlags.STATIC) 14 | returns("V") 15 | parameters("Ljava/lang/String;", "Lcom/ss/android/ugc/aweme/feed/model/Aweme;", "F") 16 | strings("enterFrom") 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/tiktok/misc/extension/ExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.tiktok.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 4 | 5 | val sharedExtensionPatch = sharedExtensionPatch("tiktok", initHook, jatoInitHook, storeRegionInitHook) 6 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/tiktok/misc/login/disablerequirement/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.tiktok.misc.login.disablerequirement 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val mandatoryLoginServiceFingerprint = fingerprint { 6 | custom { method, classDef -> 7 | classDef.endsWith("/MandatoryLoginService;") && 8 | method.name == "enableForcedLogin" 9 | } 10 | } 11 | 12 | internal val mandatoryLoginService2Fingerprint = fingerprint { 13 | custom { method, classDef -> 14 | classDef.endsWith("/MandatoryLoginService;") && 15 | method.name == "shouldShowForcedLogin" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/trakt/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.trakt 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val isVIPEPFingerprint = fingerprint { 6 | custom { method, classDef -> 7 | if (!classDef.endsWith("RemoteUser;")) return@custom false 8 | 9 | method.name == "isVIPEP" 10 | } 11 | } 12 | 13 | internal val isVIPFingerprint = fingerprint { 14 | custom { method, classDef -> 15 | if (!classDef.endsWith("RemoteUser;")) return@custom false 16 | 17 | method.name == "isVIP" 18 | } 19 | } 20 | 21 | internal val remoteUserFingerprint = fingerprint { 22 | custom { _, classDef -> 23 | classDef.endsWith("RemoteUser;") 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/tudortmund/lockscreen/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.tudortmund.lockscreen 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val brightnessFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC) 8 | returns("V") 9 | parameters() 10 | custom { method, classDef -> 11 | method.name == "run" && 12 | method.definingClass.contains("/ScreenPlugin\$") && 13 | classDef.fields.any { it.type == "Ljava/lang/Float;" } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/tudortmund/misc/extension/ExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.tudortmund.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 4 | 5 | val sharedExtensionPatch = sharedExtensionPatch("tudortmund") 6 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/notifications/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.tumblr.annoyances.notifications 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | // The BlogNotifyCtaDialog asks you if you want to enable notifications for a blog. 6 | // It shows whenever you visit a certain blog for the second time and disables itself 7 | // if it was shown a total of 3 times (stored in app storage). 8 | // This targets the BlogNotifyCtaDialog.isEnabled() method to let it always return false. 9 | internal val isBlogNotifyEnabledFingerprint = fingerprint { 10 | strings("isEnabled --> ", "blog_notify_enabled") 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/DisableGiftMessagePopupPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.tumblr.annoyances.popups 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstructions 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Suppress("unused") 7 | val disableGiftMessagePopupPatch = bytecodePatch( 8 | name = "Disable gift message popup", 9 | description = "Disables the popup suggesting to buy TumblrMart items for other people.", 10 | ) { 11 | compatibleWith("com.tumblr") 12 | 13 | execute { 14 | showGiftMessagePopupFingerprint.method.addInstructions(0, "return-void") 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/tumblr/annoyances/popups/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.tumblr.annoyances.popups 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | // This method is responsible for loading and displaying the visual Layout of the Gift Message Popup. 7 | internal val showGiftMessagePopupFingerprint = fingerprint { 8 | accessFlags(AccessFlags.FINAL, AccessFlags.PUBLIC) 9 | returns("V") 10 | strings("activity", "anchorView", "textMessage") 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/tumblr/misc/extension/ExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.tumblr.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 4 | 5 | val sharedExtensionPatch = sharedExtensionPatch("tumblr") 6 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/twitch/ad/audio/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.twitch.ad.audio 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val audioAdsPresenterPlayFingerprint = fingerprint { 6 | custom { method, classDef -> 7 | classDef.endsWith("AudioAdsPlayerPresenter;") && method.name == "playAd" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/twitch/ad/embedded/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.twitch.ad.embedded 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val createsUsherClientFingerprint = fingerprint { 6 | custom { method, _ -> 7 | method.name == "buildOkHttpClient" && method.definingClass.endsWith("Ltv/twitch/android/network/OkHttpClientFactory;") 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/twitch/chat/autoclaim/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.twitch.chat.autoclaim 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val communityPointsButtonViewDelegateFingerprint = fingerprint { 6 | custom { method, classDef -> 7 | classDef.endsWith("CommunityPointsButtonViewDelegate;") && 8 | method.name == "showClaimAvailable" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/twitch/misc/extension/Hooks.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.twitch.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.extensionHook 4 | 5 | internal val initHook = extensionHook { 6 | custom { method, classDef -> 7 | method.name == "onCreate" && classDef.endsWith("/TwitchApplication;") 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/twitch/misc/extension/SharedExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.twitch.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 4 | 5 | val sharedExtensionPatch = sharedExtensionPatch("twitch", initHook) 6 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/twitter/layout/viewcount/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.twitter.layout.viewcount 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val viewCountsEnabledFingerprint = fingerprint { 6 | returns("Z") 7 | strings("view_counts_public_visibility_enabled") 8 | } 9 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/twitter/misc/extension/ExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.twitter.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 4 | 5 | val sharedExtensionPatch = sharedExtensionPatch("twitter") 6 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HideAdsHookPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.twitter.misc.hook 2 | 3 | @Suppress("unused") 4 | val hideAdsHookPatch = hookPatch( 5 | name = "Hide ads", 6 | hookClassDescriptor = "Lapp/revanced/extension/twitter/patches/hook/patch/ads/HideAdsHook;", 7 | ) 8 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/twitter/misc/hook/HideRecommendedUsersPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.twitter.misc.hook 2 | 3 | @Suppress("unused") 4 | val hideRecommendedUsersPatch = hookPatch( 5 | name = "Hide recommended users", 6 | hookClassDescriptor = "Lapp/revanced/extension/twitter/patches/hook/patch/recommendation/RecommendedUsersHook;", 7 | ) 8 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.vsco.misc.pro 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val revCatSubscriptionFingerprint = fingerprint { 6 | returns("V") 7 | strings("use_debug_subscription_settings") 8 | custom { _, classDef -> 9 | classDef.endsWith("/RevCatSubscriptionSettingsRepository;") 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/vsco/misc/pro/UnlockProPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.vsco.misc.pro 2 | 3 | import app.revanced.patcher.extensions.InstructionExtensions.addInstruction 4 | import app.revanced.patcher.patch.bytecodePatch 5 | 6 | @Deprecated("This patch is deprecated because it does not work anymore and will be removed in the future.") 7 | @Suppress("unused") 8 | val unlockProPatch = bytecodePatch( 9 | description = "Unlocks pro features.", 10 | ) { 11 | compatibleWith("com.vsco.cam"("345")) 12 | 13 | execute { 14 | // Set isSubscribed to true. 15 | revCatSubscriptionFingerprint.method.addInstruction(0, "const p1, 0x1") 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/firebasegetcert/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.warnwetter.misc.firebasegetcert 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val getMessagingCertFingerprint = fingerprint { 6 | returns("Ljava/lang/String;") 7 | strings( 8 | "ContentValues", 9 | "Could not get fingerprint hash for package: ", 10 | "No such package: ", 11 | ) 12 | } 13 | 14 | internal val getRegistrationCertFingerprint = fingerprint { 15 | returns("Ljava/lang/String;") 16 | strings( 17 | "FirebaseRemoteConfig", 18 | "Could not get fingerprint hash for package: ", 19 | "No such package: ", 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/warnwetter/misc/promocode/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.warnwetter.misc.promocode 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val promoCodeUnlockFingerprint = fingerprint { 6 | custom { method, classDef -> 7 | classDef.endsWith("PromoTokenVerification;") && method.name == "isValid" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/willhaben/ads/HideAdsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.willhaben.ads 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.util.returnEarly 5 | 6 | @Suppress("unused") 7 | internal val hideAdsPatch = bytecodePatch( 8 | name = "Hide ads", 9 | description = "Hides all in-app ads.", 10 | ) { 11 | compatibleWith("at.willhaben") 12 | 13 | execute { 14 | adResolverFingerprint.method.returnEarly() 15 | whAdViewInjectorFingerprint.method.returnEarly() 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/windyapp/misc/unlockpro/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.windyapp.misc.unlockpro 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val checkProFingerprint = fingerprint { 6 | returns("I") 7 | custom { method, classDef -> 8 | classDef.endsWith("RawUserData;") && method.name == "isPro" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/ad/video/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.ad.video 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val loadVideoAdsFingerprint = fingerprint { 6 | strings( 7 | "TriggerBundle doesn't have the required metadata specified by the trigger ", 8 | "Tried to enter slot with no assigned slotAdapter", 9 | "Trying to enter a slot when a slot of same type and physical position is already active. Its status: ", 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/interaction/downloads/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.interaction.downloads 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val offlineVideoEndpointFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) 8 | returns("V") 9 | parameters( 10 | "Ljava/util/Map;", 11 | "L", 12 | "Ljava/lang/String", // VideoId 13 | "L", 14 | ) 15 | strings("Object is not an offlineable video: ") 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/fullscreenambientmode/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.layout.hide.fullscreenambientmode 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | 6 | internal val setFullScreenBackgroundColorFingerprint = fingerprint { 7 | returns("V") 8 | accessFlags(AccessFlags.PROTECTED, AccessFlags.FINAL) 9 | parameters("Z", "I", "I", "I", "I") 10 | custom { method, classDef -> 11 | classDef.type.endsWith("/YouTubePlayerViewNotForReflection;") 12 | && method.name == "onLayout" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/relatedvideooverlay/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.layout.hide.relatedvideooverlay 2 | 3 | import app.revanced.patcher.fingerprint 4 | import app.revanced.util.literal 5 | 6 | internal val relatedEndScreenResultsParentFingerprint = fingerprint { 7 | returns("V") 8 | literal{ appRelatedEndScreenResults } 9 | } 10 | 11 | internal val relatedEndScreenResultsFingerprint = fingerprint { 12 | returns("V") 13 | parameters( 14 | "I", 15 | "Z", 16 | "I", 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/seekbar/HideSeekbarPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.layout.hide.seekbar 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.patches.youtube.interaction.seekbar.hideSeekbarPatch 5 | 6 | @Deprecated("Patch was moved to app.revanced.patches.youtube.interaction.seekbar") 7 | val hideSeekbarPatch = bytecodePatch { 8 | dependsOn( 9 | hideSeekbarPatch 10 | ) 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/suggestedvideoendscreen/DisableSuggestedVideoEndScreenPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.layout.hide.suggestedvideoendscreen 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.patches.youtube.layout.hide.endscreensuggestion.hideEndScreenSuggestedVideoPatch 5 | 6 | @Deprecated("Use 'Hide suggested video end screen' instead.") 7 | val disableSuggestedVideoEndScreenPatch = bytecodePatch { 8 | dependsOn(hideEndScreenSuggestedVideoPatch) 9 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/layout/hide/time/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.layout.hide.time 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | import com.android.tools.smali.dexlib2.Opcode 6 | 7 | internal val timeCounterFingerprint = fingerprint { 8 | accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) 9 | returns("V") 10 | parameters() 11 | opcodes( 12 | Opcode.SUB_LONG_2ADDR, 13 | Opcode.IGET_WIDE, 14 | Opcode.SUB_LONG_2ADDR 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/layout/panels/popup/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.layout.panels.popup 2 | 3 | import com.android.tools.smali.dexlib2.AccessFlags 4 | import app.revanced.patcher.fingerprint 5 | 6 | internal val engagementPanelControllerFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) 8 | returns("L") 9 | strings( 10 | "EngagementPanelController: cannot show EngagementPanel before EngagementPanelController.init() has been called.", 11 | "[EngagementPanel] Cannot show EngagementPanel before EngagementPanelController.init() has been called.", 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/fullscreen/OpenVideosFullscreen.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.layout.player.fullscreen 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | 5 | @Suppress("unused") 6 | @Deprecated("Renamed to openVideosFullscreenPatch", ReplaceWith("openVideosFullscreenPatch")) 7 | val openVideosFullscreen = bytecodePatch{ 8 | dependsOn(openVideosFullscreenPatch) 9 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/layout/player/overlay/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.layout.player.overlay 2 | 3 | import app.revanced.patcher.fingerprint 4 | import app.revanced.util.literal 5 | import com.android.tools.smali.dexlib2.AccessFlags 6 | import com.android.tools.smali.dexlib2.Opcode 7 | 8 | internal val createPlayerOverviewFingerprint = fingerprint { 9 | accessFlags(AccessFlags.PRIVATE, AccessFlags.FINAL) 10 | returns("V") 11 | opcodes( 12 | Opcode.CONST, 13 | Opcode.INVOKE_VIRTUAL, 14 | Opcode.MOVE_RESULT_OBJECT, 15 | Opcode.CHECK_CAST, 16 | ) 17 | literal { scrimOverlayId } 18 | } 19 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/kotlin/app/revanced/patches/youtube/layout/seekbar/RestoreOldSeekbarThumbnailsPatch.kt -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/layout/startpage/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.layout.startpage 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.Opcode 5 | 6 | internal val intentActionFingerprint = fingerprint { 7 | parameters("Landroid/content/Intent;") 8 | strings("has_handled_intent") 9 | } 10 | 11 | internal val browseIdFingerprint = fingerprint { 12 | returns("Lcom/google/android/apps/youtube/app/common/ui/navigation/PaneDescriptor;") 13 | parameters() 14 | opcodes( 15 | Opcode.INVOKE_VIRTUAL, 16 | Opcode.MOVE_RESULT_OBJECT, 17 | Opcode.RETURN_OBJECT, 18 | ) 19 | strings("FEwhat_to_watch") 20 | } 21 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/layout/tablet/EnableTabletLayoutPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.layout.tablet 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.patches.youtube.layout.formfactor.changeFormFactorPatch 5 | 6 | @Deprecated("Use 'Change form factor' instead.") 7 | val enableTabletLayoutPatch = bytecodePatch { 8 | dependsOn(changeFormFactorPatch) 9 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/misc/check/CheckEnvironmentPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.misc.check 2 | 3 | import app.revanced.patches.shared.misc.checks.checkEnvironmentPatch 4 | import app.revanced.patches.youtube.misc.extension.sharedExtensionPatch 5 | import app.revanced.patches.youtube.shared.mainActivityOnCreateFingerprint 6 | 7 | internal val checkEnvironmentPatch = checkEnvironmentPatch( 8 | mainActivityOnCreateFingerprint = mainActivityOnCreateFingerprint, 9 | extensionPatch = sharedExtensionPatch, 10 | "com.google.android.youtube", 11 | ) 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/misc/dimensions/spoof/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.misc.dimensions.spoof 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val deviceDimensionsModelToStringFingerprint = fingerprint { 6 | returns("L") 7 | strings("minh.", ";maxh.") 8 | } 9 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/SharedExtensionPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.misc.extension 2 | 3 | import app.revanced.patches.shared.misc.extension.sharedExtensionPatch 4 | import app.revanced.patches.youtube.misc.extension.hooks.* 5 | 6 | val sharedExtensionPatch = sharedExtensionPatch("youtube", applicationInitHook) 7 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/misc/extension/hooks/ApplicationInitHook.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.misc.extension.hooks 2 | 3 | import app.revanced.patches.shared.misc.extension.extensionHook 4 | 5 | /** 6 | * Hooks the context when the app is launched as a regular application (and is not an embedded video playback). 7 | */ 8 | // Extension context is the Activity itself. 9 | internal val applicationInitHook = extensionHook { 10 | strings("Application creation", "Application.onCreate") 11 | } 12 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/SpoofVideoStreamsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.misc.fix.playback 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | 5 | @Deprecated("Use app.revanced.patches.youtube.misc.spoof.spoofVideoStreamsPatch instead.") 6 | @Suppress("unused") 7 | val spoofVideoStreamsPatch = bytecodePatch { 8 | dependsOn(app.revanced.patches.youtube.misc.spoof.spoofVideoStreamsPatch) 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/misc/fix/playback/UserAgentClientSpoofPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.misc.fix.playback 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | 5 | @Deprecated("Use app.revanced.patches.youtube.misc.spoof.userAgentClientSpoofPatch instead.") 6 | @Suppress("unused") 7 | val userAgentClientSpoofPatch = bytecodePatch { 8 | dependsOn(app.revanced.patches.youtube.misc.spoof.userAgentClientSpoofPatch) 9 | } 10 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/misc/gms/Constants.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.misc.gms 2 | 3 | internal object Constants { 4 | const val YOUTUBE_PACKAGE_NAME = "com.google.android.youtube" 5 | const val REVANCED_YOUTUBE_PACKAGE_NAME = "app.revanced.android.youtube" 6 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/misc/recyclerviewtree/hook/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.misc.recyclerviewtree.hook 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | import com.android.tools.smali.dexlib2.Opcode 6 | 7 | internal val recyclerViewTreeObserverFingerprint = fingerprint { 8 | accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) 9 | returns("V") 10 | opcodes( 11 | Opcode.CHECK_CAST, 12 | Opcode.NEW_INSTANCE, 13 | Opcode.INVOKE_DIRECT, 14 | Opcode.INVOKE_VIRTUAL, 15 | Opcode.NEW_INSTANCE, 16 | ) 17 | strings("LithoRVSLCBinder") 18 | } 19 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/misc/spoof/UserAgentClientSpoofPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.misc.spoof 2 | 3 | import app.revanced.patches.shared.misc.spoof.userAgentClientSpoofPatch 4 | 5 | val userAgentClientSpoofPatch = userAgentClientSpoofPatch("com.google.android.youtube") 6 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/misc/zoomhaptics/ZoomHapticsPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.misc.zoomhaptics 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.patches.youtube.misc.hapticfeedback.disableHapticFeedbackPatch 5 | 6 | @Deprecated("Superseded by disableHapticFeedbackPatch", ReplaceWith("disableHapticFeedbackPatch")) 7 | val zoomHapticsPatch = bytecodePatch( 8 | description = "Adds an option to disable haptics when zooming.", 9 | ) { 10 | dependsOn(disableHapticFeedbackPatch) 11 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/video/hdr/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.video.hdr 2 | 3 | import app.revanced.patcher.fingerprint 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | 6 | internal val hdrCapabilityFingerprint = fingerprint { 7 | accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) 8 | strings( 9 | "av1_profile_main_10_hdr_10_plus_supported", 10 | "video/av01" 11 | ) 12 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/video/speed/remember/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.video.speed.remember 2 | 3 | import app.revanced.patcher.fingerprint 4 | 5 | internal val initializePlaybackSpeedValuesFingerprint = fingerprint { 6 | parameters("[L", "I") 7 | strings("menu_item_playback_speed") 8 | } 9 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/youtube/video/videoqualitymenu/RestoreOldVideoQualityMenuPatch.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.youtube.video.videoqualitymenu 2 | 3 | import app.revanced.patcher.patch.bytecodePatch 4 | import app.revanced.patches.youtube.video.quality.videoQualityPatch 5 | 6 | @Suppress("unused") 7 | @Deprecated("Use 'Video Quality' instead.") 8 | val restoreOldVideoQualityMenuPatch = bytecodePatch { 9 | dependsOn(videoQualityPatch) 10 | } -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/patches/yuka/misc/unlockpremium/Fingerprints.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.patches.yuka.misc.unlockpremium 2 | 3 | import com.android.tools.smali.dexlib2.Opcode 4 | import com.android.tools.smali.dexlib2.AccessFlags 5 | import app.revanced.patcher.fingerprint 6 | 7 | internal val isPremiumFingerprint = fingerprint { 8 | accessFlags(AccessFlags.PUBLIC, AccessFlags.FINAL) 9 | returns("Z") 10 | opcodes( 11 | Opcode.IGET_BOOLEAN, 12 | Opcode.RETURN, 13 | ) 14 | } 15 | 16 | internal val yukaUserConstructorFingerprint = fingerprint { 17 | accessFlags(AccessFlags.PUBLIC, AccessFlags.CONSTRUCTOR) 18 | returns("V") 19 | strings("premiumProvider") 20 | } 21 | -------------------------------------------------------------------------------- /patches/src/main/kotlin/app/revanced/util/Utils.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.util 2 | 3 | internal object Utils { 4 | internal fun String.trimIndentMultiline() = 5 | this.split("\n") 6 | .joinToString("\n") { it.trimIndent() } // Remove the leading whitespace from each line. 7 | .trimIndent() // Remove the leading newline. 8 | } 9 | 10 | internal fun Boolean.toHexString(): String = if (this) "0x1" else "0x0" -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced-borderless/drawable-hdpi/yt_wordmark_header_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced-borderless/drawable-hdpi/yt_wordmark_header_dark.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced-borderless/drawable-hdpi/yt_wordmark_header_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced-borderless/drawable-hdpi/yt_wordmark_header_light.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced-borderless/drawable-mdpi/yt_wordmark_header_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced-borderless/drawable-mdpi/yt_wordmark_header_dark.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced-borderless/drawable-mdpi/yt_wordmark_header_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced-borderless/drawable-mdpi/yt_wordmark_header_light.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced-borderless/drawable-xhdpi/yt_wordmark_header_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced-borderless/drawable-xhdpi/yt_wordmark_header_dark.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced-borderless/drawable-xhdpi/yt_wordmark_header_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced-borderless/drawable-xhdpi/yt_wordmark_header_light.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced-borderless/drawable-xxhdpi/yt_wordmark_header_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced-borderless/drawable-xxhdpi/yt_wordmark_header_dark.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced-borderless/drawable-xxhdpi/yt_wordmark_header_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced-borderless/drawable-xxhdpi/yt_wordmark_header_light.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced-borderless/drawable-xxxhdpi/yt_wordmark_header_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced-borderless/drawable-xxxhdpi/yt_wordmark_header_dark.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced-borderless/drawable-xxxhdpi/yt_wordmark_header_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced-borderless/drawable-xxxhdpi/yt_wordmark_header_light.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced/drawable-hdpi/yt_wordmark_header_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced/drawable-hdpi/yt_wordmark_header_dark.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced/drawable-hdpi/yt_wordmark_header_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced/drawable-hdpi/yt_wordmark_header_light.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced/drawable-mdpi/yt_wordmark_header_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced/drawable-mdpi/yt_wordmark_header_dark.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced/drawable-mdpi/yt_wordmark_header_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced/drawable-mdpi/yt_wordmark_header_light.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced/drawable-xhdpi/yt_wordmark_header_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced/drawable-xhdpi/yt_wordmark_header_dark.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced/drawable-xhdpi/yt_wordmark_header_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced/drawable-xhdpi/yt_wordmark_header_light.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced/drawable-xxhdpi/yt_wordmark_header_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced/drawable-xxhdpi/yt_wordmark_header_dark.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced/drawable-xxhdpi/yt_wordmark_header_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced/drawable-xxhdpi/yt_wordmark_header_light.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced/drawable-xxxhdpi/yt_wordmark_header_dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced/drawable-xxxhdpi/yt_wordmark_header_dark.png -------------------------------------------------------------------------------- /patches/src/main/resources/change-header/revanced/drawable-xxxhdpi/yt_wordmark_header_light.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/change-header/revanced/drawable-xxxhdpi/yt_wordmark_header_light.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_background_color_108.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-hdpi/adaptiveproduct_youtube_foreground_color_108.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_background_color_108.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-mdpi/adaptiveproduct_youtube_foreground_color_108.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_background_color_108.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-xhdpi/adaptiveproduct_youtube_foreground_color_108.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_background_color_108.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-xxhdpi/adaptiveproduct_youtube_foreground_color_108.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_background_color_108.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/adaptiveproduct_youtube_foreground_color_108.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ReVanced/revanced-patches/8edc2d5de936e172326d27dd93c93c798c60c112/patches/src/main/resources/custom-branding/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /patches/src/main/resources/seekbar/values/attrs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /patches/src/main/resources/settings/drawable/revanced_settings_circle_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 8 | 9 | -------------------------------------------------------------------------------- /patches/src/main/resources/settings/drawable/revanced_settings_cursor.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /patches/src/main/resources/settings/layout/revanced_color_picker.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | 12 | -------------------------------------------------------------------------------- /patches/src/main/resources/settings/menu/revanced_search_menu.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /patches/src/main/resources/settings/xml/revanced_prefs.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /patches/src/main/resources/settings/xml/revanced_prefs_icons.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | -------------------------------------------------------------------------------- /patches/stub/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | `java-library` 3 | } 4 | 5 | description = "Provide Android API stubs for ReVanced Patches." 6 | 7 | java { 8 | sourceCompatibility = JavaVersion.VERSION_11 9 | targetCompatibility = JavaVersion.VERSION_11 10 | } 11 | --------------------------------------------------------------------------------