├── .gitattributes ├── .github ├── dependabot.yml └── workflows │ ├── pull_request.yml │ └── release.yml ├── .gitignore ├── .releaserc ├── CHANGELOG.md ├── LICENSE ├── README.md ├── build.gradle.kts ├── docs └── images │ ├── 1-ad-block.webp │ ├── 10-hide-fab.webp │ ├── 11-hide-comm-notes.webp │ ├── 12-recc-users.webp │ ├── 13-selectable-text.webp │ ├── 14-show-sen-media.webp │ ├── 15-mod-settings.webp │ ├── 16-hide-view-count.webp │ ├── 17-customize-icon-n-navbar.webp │ ├── 18-reader-mode.webp │ ├── 19-undo-mode.webp │ ├── 2-comm-to-join.webp │ ├── 20-download-media.webp │ ├── 21-hide-banner.webp │ ├── 22-hide-foryou.webp │ ├── 23-hide-live-threads.webp │ ├── 24-hide-fab-btns.webp │ ├── 3-creator-to-sub.webp │ ├── 4-discover-more.webp │ ├── 5-g-ads-block.webp │ ├── 6-pinned-by-followers.webp │ ├── 7-revisit-your-bmk.webp │ ├── 8-who-to-follow.webp │ ├── 9-promoted-trends.webp │ └── manager.png ├── dummy └── build.gradle.kts ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── package-lock.json ├── package.json ├── patches.json ├── settings.gradle.kts └── src └── main ├── kotlin ├── app │ ├── revanced │ │ ├── generator │ │ │ ├── JsonPatchesFileGenerator.kt │ │ │ ├── Main.kt │ │ │ └── PatchesFileGenerator.kt │ │ └── patches │ │ │ ├── shared │ │ │ └── misc │ │ │ │ ├── integrations │ │ │ │ ├── BaseIntegrationsPatch.kt │ │ │ │ └── fingerprint │ │ │ │ │ └── IntegrationsUtilsFingerprint.kt │ │ │ │ └── mapping │ │ │ │ └── ResourceMappingPatch.kt │ │ │ └── twitter │ │ │ └── misc │ │ │ └── dynamiccolor │ │ │ └── DynamicColorPatch.kt │ └── util │ │ ├── PikoUtils.kt │ │ ├── ResourceUtils.kt │ │ └── resource │ │ ├── ArrayResource.kt │ │ ├── BaseResource.kt │ │ └── StringResource.kt └── crimera │ └── patches │ ├── all │ ├── activity │ │ └── exportall │ │ │ └── ExportAllActivitiesPatch.kt │ └── appDowngrading │ │ └── AppDowngradingPatch.kt │ └── twitter │ ├── ads │ ├── timelineEntryHook │ │ ├── HideAds.kt │ │ ├── HideCTJ.kt │ │ ├── HideCTS.kt │ │ ├── HideDetailedPosts.kt │ │ ├── HideGoogleAds.kt │ │ ├── HideMainEvent.kt │ │ ├── HidePinnedByFollowers.kt │ │ ├── HidePremiumPrompt.kt │ │ ├── HideRevistBmk.kt │ │ ├── HideSuperHeroEvent.kt │ │ ├── HideTodaysNews.kt │ │ ├── HideTopPeopleSearch.kt │ │ ├── HideVideosForYou.kt │ │ ├── HideWTF.kt │ │ ├── TimelineEntryHookPatch.kt │ │ └── TimelineModuleItemHookPatch.kt │ └── trends │ │ ├── HidePromotedTrendPatch.kt │ │ └── fingerprints │ │ └── HidePromotedTrendFingerprint.kt │ ├── featureFlag │ ├── DisableChirpFontPatch.kt │ ├── FeatureFlagPatch.kt │ ├── FeatureFlagResourcePatch.kt │ ├── HideBookmarkInTimelinePatch.kt │ ├── HideFABMenuButtonsPatch.kt │ ├── HideImmersivePlayer.kt │ ├── RemoveViewCountPatch.kt │ └── fingerprints │ │ ├── CustomAdapterFingerprint.kt │ │ ├── FeatureFlagFingerprint.kt │ │ └── FeatureFlagLoadFingerprint.kt │ ├── interaction │ └── downloads │ │ ├── changedirectory │ │ └── ChangeDownloadDirPatch.kt │ │ └── copyMediaLink │ │ └── CopyMediaLink.kt │ ├── link │ ├── cleartrackingparams │ │ ├── ClearTrackingParamsPatch.kt │ │ └── fingerprints │ │ │ └── AddSessionTokenFingerprint.kt │ ├── customsharingdomain │ │ ├── CustomSharingDomainPatch.kt │ │ └── fingerprints │ │ │ └── CustomSharingDomainFingerprint.kt │ └── unshorten │ │ ├── NoShortenedUrlPatch.kt │ │ └── fingerprints │ │ └── JsonObjectMapperFingerprint.kt │ ├── misc │ ├── bringbacktwitter │ │ ├── BringBackTwitterResourcePatch.kt │ │ ├── custromstringsupdater │ │ │ ├── ja.kt │ │ │ └── pt_rBR.kt │ │ └── strings │ │ │ ├── StringsMap.kt │ │ │ ├── en_rGB.kt │ │ │ ├── hi.kt │ │ │ ├── ru.kt │ │ │ ├── tr.kt │ │ │ ├── zh_rCN.kt │ │ │ └── zh_rTW.kt │ ├── customize │ │ ├── exploretabs │ │ │ └── CustomiseExploreTabsPatch.kt │ │ ├── inlinebar │ │ │ └── CustomiseInlineBarPatch.kt │ │ ├── navbar │ │ │ └── CustomiseNavBarPatch.kt │ │ ├── postFontSize │ │ │ └── CustomizePostFontSize.kt │ │ ├── profiletabs │ │ │ └── CustomiseProfileTabsPatch.kt │ │ ├── replySorting │ │ │ └── DefaultReplySortingPatch.kt │ │ ├── searchtabs │ │ │ └── CustomiseSearchTabsPatch.kt │ │ ├── sidebar │ │ │ └── CustomiseSideBarPatch.kt │ │ ├── timelinetabs │ │ │ └── CustomiseTimelineTabsPatch.kt │ │ └── typeAheadResponse │ │ │ └── CustomiseTypeAheadResponsePatch.kt │ ├── fab │ │ ├── HideFABPatch.kt │ │ └── fingerprints │ │ │ └── HideFABFingerprint.kt │ ├── integrations │ │ ├── IntegrationsPatch.kt │ │ └── fingerprints │ │ │ ├── InitFingerprint.kt │ │ │ └── ReVancedUtilsPatchesVersionFingerprint.kt │ ├── recommendedusers │ │ ├── HideRecommendedUsersPatch.kt │ │ └── fingerprints │ │ │ └── HideRecommendedUsersFingerprint.kt │ ├── roundOffNumbers │ │ └── RoundOffNumbersPatch.kt │ ├── selectabletext │ │ └── SelectableTextPatch.kt │ ├── settings │ │ ├── SettingsPatch.kt │ │ ├── SettingsResourcePatch.kt │ │ └── fingerprints │ │ │ ├── AuthorizeAppActivity.kt │ │ │ ├── SettingsFingerprint.kt │ │ │ ├── SettingsStatusLoadFingerprint.kt │ │ │ └── UrlInterpreterActivity.kt │ └── shareMenu │ │ ├── debugMenu │ │ └── DebugMenu.kt │ │ ├── fingerprints │ │ ├── ActionEnumsFingerprint.kt │ │ └── ShareMenuButtonFuncCallFingerprint.kt │ │ ├── hooks │ │ ├── ShareMenuButtonAddHook.kt │ │ └── ShareMenuButtonInitHook.kt │ │ ├── nativeDownloader │ │ ├── NativeDownloaderHooksPatch.kt │ │ └── NativeDownloaderPatch.kt │ │ └── nativeTranslator │ │ ├── NativeTranslatorHooksPatch.kt │ │ └── NativeTranslatorPatch.kt │ ├── premium │ ├── customAppIcon │ │ ├── CustomAppIconPatch.kt │ │ └── RedirectBMTab.kt │ ├── enableForcePip │ │ └── EnableForcePipPatch.kt │ ├── readermode │ │ ├── EnableReaderModePatch.kt │ │ └── fingerprints │ │ │ ├── EnableReaderMode1Fingerprint.kt │ │ │ └── EnableReaderMode2Fingerprint.kt │ ├── undoposts │ │ ├── EnableUndoPostPatch.kt │ │ └── fingerprints │ │ │ ├── UndoPost1Fingerprint.kt │ │ │ ├── UndoPost2Fingerprint.kt │ │ │ └── UndoPost3Fingerprint.kt │ └── unlockdownloads │ │ ├── DownloadPatch.kt │ │ └── fingerprints │ │ ├── DownloadPatchFingerprint.kt │ │ ├── FIleDownloaderFingerprint.kt │ │ ├── ImmersiveBottomSheetPatchFingerprint.kt │ │ └── MediaEntityFingerprint.kt │ └── timeline │ ├── banner │ ├── HideBannerPatch.kt │ └── fingerprints │ │ └── HideBannerFingerprint.kt │ ├── deleteFromDatabase │ └── deleteFromDatabasePatch.kt │ ├── disableAutoScroll │ └── DisableAutoScrollPatch.kt │ ├── enableVidAutoAdvance │ └── EnableVidAutoAdvancePatch.kt │ ├── hideHiddenReplies │ └── HideHiddenRepliesPatch.kt │ ├── hideNudgeButtons │ └── HideNudgeButtonPatch.kt │ ├── hideSocialProof │ └── HideSoialProofPatch.kt │ ├── live │ ├── HideLiveThreadsPatch.kt │ └── fingerprints │ │ └── HideLiveThreadsFingerprint.kt │ ├── removePremiumUpsell │ └── RemovePremiumUpsellPatch.kt │ ├── sensitivemediasettings │ ├── ShowSensitiveMediaPatch.kt │ └── fingerprints │ │ └── ShowSensitiveMediaPatchFingerprint.kt │ ├── showpollresults │ ├── ShowPollResultsPatch.kt │ └── fingerprints │ │ └── JsonCardInstanceDataFingerprint.kt │ ├── tweetinfo │ ├── ForceTranslate.kt │ ├── HideCommunityNotes.kt │ ├── HidePromoteButton.kt │ └── TweetInfoHook.kt │ └── videoEntity │ ├── ForceHDPatch.kt │ └── VideoEntityPatch.kt └── resources └── twitter ├── bringbacktwitter ├── drawable-hdpi │ └── ic_stat_twitter.webp ├── drawable-mdpi │ └── ic_stat_twitter.webp ├── drawable-xhdpi │ └── ic_stat_twitter.webp ├── drawable-xxhdpi │ └── ic_stat_twitter.webp ├── drawable-xxxhdpi │ └── ic_stat_twitter.webp ├── drawable │ ├── ic_vector_home.xml │ ├── ic_vector_home_stroke.xml │ ├── ic_vector_twitter.xml │ ├── ic_vector_twitter_white.xml │ └── splash_screen_icon.xml ├── mipmap-hdpi │ ├── ic_launcher_twitter.webp │ ├── ic_launcher_twitter_foreground.webp │ └── ic_launcher_twitter_round.webp ├── mipmap-mdpi │ ├── ic_launcher_twitter.webp │ ├── ic_launcher_twitter_foreground.webp │ └── ic_launcher_twitter_round.webp ├── mipmap-xhdpi │ ├── ic_launcher_twitter.webp │ ├── ic_launcher_twitter_foreground.webp │ └── ic_launcher_twitter_round.webp ├── mipmap-xxhdpi │ ├── fg_launcher_twitter.webp │ ├── ic_launcher_twitter.webp │ ├── ic_launcher_twitter_foreground.webp │ └── ic_launcher_twitter_round.webp └── mipmap-xxxhdpi │ ├── ic_launcher_twitter.webp │ ├── ic_launcher_twitter_foreground.webp │ └── ic_launcher_twitter_round.webp └── settings ├── layout ├── feature_flags_view.xml ├── item_row.xml ├── search_dialog.xml └── search_item_row.xml ├── values-ar └── strings.xml ├── values-es └── strings.xml ├── values-fr └── strings.xml ├── values-hi └── strings.xml ├── values-in └── strings.xml ├── values-ja └── strings.xml ├── values-pl └── strings.xml ├── values-pt-rBR └── strings.xml ├── values-ru └── strings.xml ├── values-tr └── strings.xml ├── values-ua └── strings.xml ├── values-v21 ├── arrays.xml └── strings.xml ├── values-vi └── strings.xml ├── values-zh-rCN └── strings.xml ├── values-zh-rTW └── strings.xml └── values ├── arrays.xml └── strings.xml /.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/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/pull_request.yml: -------------------------------------------------------------------------------- 1 | name: Open a PR to main 2 | 3 | on: 4 | push: 5 | branches: 6 | - dev 7 | workflow_dispatch: 8 | 9 | permissions: 10 | pull-requests: write 11 | 12 | env: 13 | TITLE: 'chore: Merge branch `${{ github.head_ref || github.ref_name }}` to `main`' 14 | BODY: 'This pull request will `${{ github.head_ref || github.ref_name }}` to `main`.' 15 | 16 | jobs: 17 | pull-request: 18 | name: Open pull request 19 | runs-on: ubuntu-latest 20 | steps: 21 | - name: Checkout 22 | uses: actions/checkout@v4 23 | 24 | - name: Open pull request 25 | env: 26 | GH_TOKEN: ${{ github.token }} 27 | run: gh pr create -d -B main -H dev --title '${{ env.TITLE }}' --body '${{ env.BODY }}' || gh pr edit -B main --title '${{ env.TITLE }}' --body '${{ env.BODY }}' 28 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - main 8 | - dev 9 | pull_request: 10 | branches: 11 | - main 12 | - dev 13 | 14 | permissions: 15 | contents: write 16 | issues: write 17 | pull-requests: write 18 | 19 | jobs: 20 | release: 21 | name: Release 22 | runs-on: ubuntu-latest 23 | steps: 24 | - name: Checkout 25 | uses: actions/checkout@v4 26 | with: 27 | # Make sure the release step uses its own credentials: 28 | # https://github.com/cycjimmy/semantic-release-action#private-packages 29 | persist-credentials: false 30 | fetch-depth: 0 31 | 32 | - name: Cache Gradle 33 | uses: burrunan/gradle-cache-action@v1 34 | 35 | - name: Build with Gradle 36 | env: 37 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 38 | run: ./gradlew generatePatchesFiles clean 39 | 40 | # - name: Upload patches jar 41 | # uses: actions/upload-artifact@v4 42 | # with: 43 | # name: patches 44 | # path: build/libs/*.jar 45 | 46 | - name: Setup Node.js 47 | uses: actions/setup-node@v4 48 | with: 49 | node-version: "lts/*" 50 | cache: 'npm' 51 | 52 | - name: Install dependencies 53 | run: npm install 54 | 55 | - name: Release 56 | env: 57 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 58 | run: npm exec semantic-release 59 | 60 | - name: Run apk build 61 | run: | 62 | curl -X POST https://api.github.com/repos/crimera/piko-builds/dispatches \ 63 | -H 'Accept: application/vnd.github+json' \ 64 | -H "Authorization: Bearer ${{ secrets.ACCESS_TOKEN }}" \ 65 | -d '{"event_type": "build"}' 66 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ### Java template 2 | # Compiled class file 3 | *.class 4 | 5 | # Log file 6 | *.log 7 | 8 | # BlueJ files 9 | *.ctxt 10 | 11 | # Mobile Tools for Java (J2ME) 12 | .mtj.tmp/ 13 | 14 | # Package Files # 15 | *.jar 16 | *.war 17 | *.nar 18 | *.ear 19 | *.zip 20 | *.tar.gz 21 | *.rar 22 | 23 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 24 | hs_err_pid* 25 | 26 | ### JetBrains template 27 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 28 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 29 | 30 | # User-specific stuff 31 | .idea/**/workspace.xml 32 | .idea/**/tasks.xml 33 | .idea/**/usage.statistics.xml 34 | .idea/**/dictionaries 35 | .idea/**/shelf 36 | 37 | # Generated files 38 | .idea/**/contentModel.xml 39 | 40 | # Sensitive or high-churn files 41 | .idea/**/dataSources/ 42 | .idea/**/dataSources.ids 43 | .idea/**/dataSources.local.xml 44 | .idea/**/sqlDataSources.xml 45 | .idea/**/dynamic.xml 46 | .idea/**/uiDesigner.xml 47 | .idea/**/dbnavigator.xml 48 | 49 | # Gradle 50 | .idea/**/gradle.xml 51 | .idea/**/libraries 52 | 53 | # Gradle and Maven with auto-import 54 | # When using Gradle or Maven with auto-import, you should exclude module files, 55 | # since they will be recreated, and may cause churn. Uncomment if using 56 | # auto-import. 57 | .idea/artifacts 58 | .idea/compiler.xml 59 | .idea/jarRepositories.xml 60 | .idea/modules.xml 61 | .idea/*.iml 62 | .idea/modules 63 | *.iml 64 | *.ipr 65 | 66 | # CMake 67 | cmake-build-*/ 68 | 69 | # Mongo Explorer plugin 70 | .idea/**/mongoSettings.xml 71 | 72 | # File-based project format 73 | *.iws 74 | 75 | # IntelliJ 76 | out/ 77 | 78 | # mpeltonen/sbt-idea plugin 79 | .idea_modules/ 80 | 81 | # JIRA plugin 82 | atlassian-ide-plugin.xml 83 | 84 | # Cursive Clojure plugin 85 | .idea/replstate.xml 86 | 87 | # Crashlytics plugin (for Android Studio and IntelliJ) 88 | com_crashlytics_export_strings.xml 89 | crashlytics.properties 90 | crashlytics-build.properties 91 | fabric.properties 92 | 93 | # Editor-based Rest Client 94 | .idea/httpRequests 95 | 96 | # Android studio 3.1+ serialized cache file 97 | .idea/caches/build_file_checksums.ser 98 | 99 | ### Gradle template 100 | .gradle 101 | **/build/ 102 | !src/**/build/ 103 | 104 | # Ignore Gradle GUI config 105 | gradle-app.setting 106 | 107 | # Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) 108 | !gradle-wrapper.jar 109 | 110 | # Cache of project 111 | .gradletasknamecache 112 | 113 | # # Work around https://youtrack.jetbrains.com/issue/IDEA-116898 114 | # gradle/wrapper/gradle-wrapper.properties 115 | 116 | # Potentially copyrighted test APK 117 | *.apk 118 | 119 | # Ignore vscode config 120 | .vscode/ 121 | 122 | # Dependency directories 123 | node_modules/ 124 | 125 | # gradle properties, due to Github token 126 | ./gradle.properties 127 | 128 | # Ignore IDEA files 129 | .idea/ 130 | /src/main/kotlin/crimera/patches/twitter/test* -------------------------------------------------------------------------------- /.releaserc: -------------------------------------------------------------------------------- 1 | { 2 | "branches": [ 3 | "main", 4 | { 5 | "name": "dev", 6 | "prerelease": true 7 | } 8 | ], 9 | "plugins": [ 10 | ["@semantic-release/commit-analyzer", { 11 | "releaseRules": [ 12 | { "type": "fix", "release": "patch" }, 13 | { "type": "feat", "release": "minor" }, 14 | { "type": "update", "release": "patch" }, 15 | { "type": "refactor", "release": "patch" }, 16 | { "type": "perf", "release": "patch" }, 17 | { "type": "build", "scope": "Needs bump", "release": "patch" } 18 | ] 19 | } 20 | ], 21 | [ 22 | "@semantic-release/release-notes-generator", 23 | { 24 | "preset": "conventionalcommits", 25 | "presetConfig": { 26 | "types": [ 27 | { type: "fix", section: "Bug Fixes", hidden: false }, 28 | { type: "feat", section: "Features", hidden: false }, 29 | { type: "update", section: "Updates", hidden: false }, 30 | { type: "refactor", section: "Refactors", hidden: false }, 31 | { type: "perf", section: "Perfomance", hidden: false }, 32 | ] 33 | } 34 | } 35 | ], 36 | "@semantic-release/changelog", 37 | "gradle-semantic-release-plugin", 38 | [ 39 | "@semantic-release/git", 40 | { 41 | "assets": [ 42 | "README.md", 43 | "CHANGELOG.md", 44 | "gradle.properties", 45 | "patches.json" 46 | ] 47 | } 48 | ], 49 | [ 50 | "@semantic-release/github", 51 | { 52 | "assets": [ 53 | { 54 | "path": "build/libs/*.jar" 55 | }, 56 | { 57 | "path": "patches.json" 58 | } 59 | ], 60 | successComment: false 61 | } 62 | ], 63 | [ 64 | "@saithodev/semantic-release-backmerge", 65 | { 66 | backmergeBranches: [{"from": "main", "to": "dev"}], 67 | clearWorkspace: true 68 | } 69 | ] 70 | ] 71 | } 72 | -------------------------------------------------------------------------------- /docs/images/1-ad-block.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/1-ad-block.webp -------------------------------------------------------------------------------- /docs/images/10-hide-fab.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/10-hide-fab.webp -------------------------------------------------------------------------------- /docs/images/11-hide-comm-notes.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/11-hide-comm-notes.webp -------------------------------------------------------------------------------- /docs/images/12-recc-users.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/12-recc-users.webp -------------------------------------------------------------------------------- /docs/images/13-selectable-text.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/13-selectable-text.webp -------------------------------------------------------------------------------- /docs/images/14-show-sen-media.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/14-show-sen-media.webp -------------------------------------------------------------------------------- /docs/images/15-mod-settings.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/15-mod-settings.webp -------------------------------------------------------------------------------- /docs/images/16-hide-view-count.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/16-hide-view-count.webp -------------------------------------------------------------------------------- /docs/images/17-customize-icon-n-navbar.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/17-customize-icon-n-navbar.webp -------------------------------------------------------------------------------- /docs/images/18-reader-mode.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/18-reader-mode.webp -------------------------------------------------------------------------------- /docs/images/19-undo-mode.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/19-undo-mode.webp -------------------------------------------------------------------------------- /docs/images/2-comm-to-join.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/2-comm-to-join.webp -------------------------------------------------------------------------------- /docs/images/20-download-media.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/20-download-media.webp -------------------------------------------------------------------------------- /docs/images/21-hide-banner.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/21-hide-banner.webp -------------------------------------------------------------------------------- /docs/images/22-hide-foryou.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/22-hide-foryou.webp -------------------------------------------------------------------------------- /docs/images/23-hide-live-threads.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/23-hide-live-threads.webp -------------------------------------------------------------------------------- /docs/images/24-hide-fab-btns.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/24-hide-fab-btns.webp -------------------------------------------------------------------------------- /docs/images/3-creator-to-sub.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/3-creator-to-sub.webp -------------------------------------------------------------------------------- /docs/images/4-discover-more.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/4-discover-more.webp -------------------------------------------------------------------------------- /docs/images/5-g-ads-block.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/5-g-ads-block.webp -------------------------------------------------------------------------------- /docs/images/6-pinned-by-followers.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/6-pinned-by-followers.webp -------------------------------------------------------------------------------- /docs/images/7-revisit-your-bmk.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/7-revisit-your-bmk.webp -------------------------------------------------------------------------------- /docs/images/8-who-to-follow.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/8-who-to-follow.webp -------------------------------------------------------------------------------- /docs/images/9-promoted-trends.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/9-promoted-trends.webp -------------------------------------------------------------------------------- /docs/images/manager.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/docs/images/manager.png -------------------------------------------------------------------------------- /dummy/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | id("java") 3 | } 4 | 5 | java { 6 | toolchain { 7 | languageVersion.set(JavaLanguageVersion.of(11)) 8 | } 9 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.parallel = true 2 | org.gradle.caching = true 3 | kotlin.code.style = official 4 | version = 1.53.0 5 | -------------------------------------------------------------------------------- /gradle/libs.versions.toml: -------------------------------------------------------------------------------- 1 | [versions] 2 | revanced-patcher = "19.2.0" 3 | smali = "3.0.7" 4 | guava = "33.2.1-jre" 5 | gson = "2.11.0" 6 | 7 | [libraries] 8 | revanced-patcher = { module = "app.revanced:revanced-patcher", version.ref = "revanced-patcher" } 9 | smali = { module = "com.android.tools.smali:smali", version.ref = "smali" } 10 | guava = { module = "com.google.guava:guava", version.ref = "guava" } 11 | gson = { module = "com.google.code.gson:gson", version.ref = "gson" } 12 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crimera/piko/64f4df7b7f7cb33c98a880356eadef81029bc7da/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip 4 | distributionSha256Sum=3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae 5 | zipStoreBase=GRADLE_USER_HOME 6 | zipStorePath=wrapper/dist -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%"=="" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%"=="" set DIRNAME=. 29 | @rem This is normally unused 30 | set APP_BASE_NAME=%~n0 31 | set APP_HOME=%DIRNAME% 32 | 33 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 34 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 35 | 36 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 37 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 38 | 39 | @rem Find java.exe 40 | if defined JAVA_HOME goto findJavaFromJavaHome 41 | 42 | set JAVA_EXE=java.exe 43 | %JAVA_EXE% -version >NUL 2>&1 44 | if %ERRORLEVEL% equ 0 goto execute 45 | 46 | echo. 47 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 48 | echo. 49 | echo Please set the JAVA_HOME variable in your environment to match the 50 | echo location of your Java installation. 51 | 52 | goto fail 53 | 54 | :findJavaFromJavaHome 55 | set JAVA_HOME=%JAVA_HOME:"=% 56 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 57 | 58 | if exist "%JAVA_EXE%" goto execute 59 | 60 | echo. 61 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 62 | echo. 63 | echo Please set the JAVA_HOME variable in your environment to match the 64 | echo location of your Java installation. 65 | 66 | goto fail 67 | 68 | :execute 69 | @rem Setup the command line 70 | 71 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 72 | 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if %ERRORLEVEL% equ 0 goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | set EXIT_CODE=%ERRORLEVEL% 85 | if %EXIT_CODE% equ 0 set EXIT_CODE=1 86 | if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 87 | exit /b %EXIT_CODE% 88 | 89 | :mainEnd 90 | if "%OS%"=="Windows_NT" endlocal 91 | 92 | :omega 93 | -------------------------------------------------------------------------------- /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 | "conventional-changelog-conventionalcommits": "^8.0.0", 7 | "gradle-semantic-release-plugin": "^1.9.2", 8 | "semantic-release": "^24.0.0" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | include("dummy") 2 | 3 | rootProject.name = "piko-twitter-patches" 4 | 5 | buildCache { 6 | local { 7 | isEnabled = !System.getenv().containsKey("CI") 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /src/main/kotlin/app/revanced/generator/JsonPatchesFileGenerator.kt: -------------------------------------------------------------------------------- 1 | package app.revanced.generator 2 | 3 | import app.revanced.patcher.PatchSet 4 | import app.revanced.patcher.patch.Patch 5 | import com.google.gson.GsonBuilder 6 | import java.io.File 7 | 8 | internal class JsonPatchesFileGenerator : PatchesFileGenerator { 9 | override fun generate(patches: PatchSet) = patches.map { 10 | JsonPatch( 11 | it.name!!, 12 | it.description, 13 | it.compatiblePackages, 14 | it.use, 15 | it.requiresIntegrations, 16 | it.options.values.map { option -> 17 | JsonPatch.Option( 18 | option.key, 19 | option.default, 20 | option.values, 21 | option.title, 22 | option.description, 23 | option.required, 24 | ) 25 | }, 26 | ) 27 | }.let { 28 | File("patches.json").writeText(GsonBuilder().serializeNulls().create().toJson(it)) 29 | } 30 | 31 | @Suppress("unused") 32 | private class JsonPatch( 33 | val name: String? = null, 34 | val description: String? = null, 35 | val compatiblePackages: Set? = null, 36 | val use: Boolean = true, 37 | val requiresIntegrations: Boolean = false, 38 | val options: List