├── version.txt
├── .github
├── CODEOWNERS
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── 3-doc.md
│ ├── 2-feature.md
│ └── 1-bug.md
├── PULL_REQUEST_TEMPLATE.md
└── workflows
│ ├── stale.yml
│ └── cid.yml
├── play
├── plugin
│ ├── src
│ │ ├── test
│ │ │ ├── fixtures
│ │ │ │ ├── app
│ │ │ │ │ ├── creds.json
│ │ │ │ │ └── gradle.properties
│ │ │ │ ├── GenerateResourcesIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ ├── hiddenFile
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ ├── .keep
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ ├── .keep
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── title.txt
│ │ │ │ │ │ ├── main
│ │ │ │ │ │ ├── play
│ │ │ │ │ │ │ ├── products
│ │ │ │ │ │ │ │ └── sku.json
│ │ │ │ │ │ │ ├── default-language.txt
│ │ │ │ │ │ │ ├── listings
│ │ │ │ │ │ │ │ ├── en-US
│ │ │ │ │ │ │ │ │ ├── title.txt
│ │ │ │ │ │ │ │ │ ├── full-description.txt
│ │ │ │ │ │ │ │ │ ├── short-description.txt
│ │ │ │ │ │ │ │ │ └── graphics
│ │ │ │ │ │ │ │ │ │ ├── phone-screenshots
│ │ │ │ │ │ │ │ │ │ └── foo.jpg
│ │ │ │ │ │ │ │ │ │ └── tablet-screenshots
│ │ │ │ │ │ │ │ │ │ └── baz.jpg
│ │ │ │ │ │ │ │ ├── fr-FR
│ │ │ │ │ │ │ │ │ ├── title.txt
│ │ │ │ │ │ │ │ │ ├── full-description.txt
│ │ │ │ │ │ │ │ │ ├── short-description.txt
│ │ │ │ │ │ │ │ │ └── graphics
│ │ │ │ │ │ │ │ │ │ └── phone-screenshots
│ │ │ │ │ │ │ │ │ │ └── bar.jpg
│ │ │ │ │ │ │ │ └── de-DE
│ │ │ │ │ │ │ │ │ └── full-description.txt
│ │ │ │ │ │ │ ├── release-notes
│ │ │ │ │ │ │ │ ├── en-US
│ │ │ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ │ │ └── fr-FR
│ │ │ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ │ └── subscriptions
│ │ │ │ │ │ │ │ ├── subscription.json
│ │ │ │ │ │ │ │ └── subscription.metadata.json
│ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ │ │ ├── illegalPlayFile
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── play
│ │ │ │ │ │ ├── unknownFile
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── invalid
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── wrong.txt
│ │ │ │ │ │ ├── free
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ ├── release-notes
│ │ │ │ │ │ │ ├── en-US
│ │ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ │ └── de-DE
│ │ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ ├── de-DE
│ │ │ │ │ │ │ ├── title.txt
│ │ │ │ │ │ │ ├── short-description.txt
│ │ │ │ │ │ │ └── full-description.txt
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── short-description.txt
│ │ │ │ │ │ ├── prod
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── release-notes
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ ├── validPlayFile
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── play.txt
│ │ │ │ │ │ ├── paid
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ ├── listings
│ │ │ │ │ │ │ ├── de-DE
│ │ │ │ │ │ │ │ ├── title.txt
│ │ │ │ │ │ │ │ ├── short-description.txt
│ │ │ │ │ │ │ │ └── full-description.txt
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ │ ├── title.txt
│ │ │ │ │ │ │ │ ├── short-description.txt
│ │ │ │ │ │ │ │ └── full-description.txt
│ │ │ │ │ │ │ └── release-notes
│ │ │ │ │ │ │ ├── de-DE
│ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ ├── invalidLocale
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── title.txt
│ │ │ │ │ │ ├── play
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── release-notes
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ ├── staging
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ ├── en-US
│ │ │ │ │ │ │ └── short-description.txt
│ │ │ │ │ │ │ └── ja-JA
│ │ │ │ │ │ │ └── parent-child-test.txt
│ │ │ │ │ │ ├── topLevelGraphics
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── graphics
│ │ │ │ │ │ │ ├── icon.png
│ │ │ │ │ │ │ ├── phone-screenshots.png
│ │ │ │ │ │ │ └── phone-screenshots
│ │ │ │ │ │ │ └── b.jpeg
│ │ │ │ │ │ ├── dogfood
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── release-notes
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ ├── freeStaging
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── release-notes
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ ├── illegalPlayDir
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ ├── freeDogfood
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── release-notes
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ ├── freeStagingDogfood
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ ├── release-notes
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── full-description.txt
│ │ │ │ │ │ ├── freeStagingRelease
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── full-description.txt
│ │ │ │ │ │ └── topLevelGraphicsConflict
│ │ │ │ │ │ └── play
│ │ │ │ │ │ └── listings
│ │ │ │ │ │ └── en-US
│ │ │ │ │ │ └── graphics
│ │ │ │ │ │ ├── phone-screenshots.png
│ │ │ │ │ │ └── phone-screenshots
│ │ │ │ │ │ └── phone-screenshots.png
│ │ │ │ ├── PublishListingsIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ ├── hidden
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── .keep
│ │ │ │ │ │ ├── invalid
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── foo.txt
│ │ │ │ │ │ ├── details
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ ├── contact-email.txt
│ │ │ │ │ │ │ ├── contact-phone.txt
│ │ │ │ │ │ │ ├── default-language.txt
│ │ │ │ │ │ │ └── contact-website.txt
│ │ │ │ │ │ ├── everything
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ ├── default-language.txt
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ ├── en-US
│ │ │ │ │ │ │ ├── graphics
│ │ │ │ │ │ │ │ └── icon
│ │ │ │ │ │ │ │ │ └── 1.png
│ │ │ │ │ │ │ └── title.txt
│ │ │ │ │ │ │ └── fr-FR
│ │ │ │ │ │ │ ├── full-description.txt
│ │ │ │ │ │ │ └── graphics
│ │ │ │ │ │ │ └── phone-screenshots
│ │ │ │ │ │ │ └── a.png
│ │ │ │ │ │ ├── multiGraphics
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── graphics
│ │ │ │ │ │ │ ├── icon
│ │ │ │ │ │ │ └── 1.png
│ │ │ │ │ │ │ └── phone-screenshots
│ │ │ │ │ │ │ ├── a.png
│ │ │ │ │ │ │ ├── b.jpeg
│ │ │ │ │ │ │ └── c.png
│ │ │ │ │ │ ├── singleListing
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ ├── title.txt
│ │ │ │ │ │ │ ├── video-url.txt
│ │ │ │ │ │ │ ├── full-description.txt
│ │ │ │ │ │ │ └── short-description.txt
│ │ │ │ │ │ ├── mixedLevelGraphics
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── graphics
│ │ │ │ │ │ │ ├── icon.png
│ │ │ │ │ │ │ ├── phone-screenshots.png
│ │ │ │ │ │ │ └── phone-screenshots
│ │ │ │ │ │ │ └── b.jpeg
│ │ │ │ │ │ ├── multiLangGraphics
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ ├── en-US
│ │ │ │ │ │ │ └── graphics
│ │ │ │ │ │ │ │ └── icon
│ │ │ │ │ │ │ │ └── 1.png
│ │ │ │ │ │ │ └── fr-FR
│ │ │ │ │ │ │ └── graphics
│ │ │ │ │ │ │ └── phone-screenshots
│ │ │ │ │ │ │ └── a.png
│ │ │ │ │ │ ├── multiLangListing
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ ├── de-DE
│ │ │ │ │ │ │ └── title.txt
│ │ │ │ │ │ │ ├── en-US
│ │ │ │ │ │ │ └── title.txt
│ │ │ │ │ │ │ └── fr-FR
│ │ │ │ │ │ │ └── title.txt
│ │ │ │ │ │ ├── singleGraphics
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── listings
│ │ │ │ │ │ │ └── en-US
│ │ │ │ │ │ │ └── graphics
│ │ │ │ │ │ │ └── icon
│ │ │ │ │ │ │ └── 1.png
│ │ │ │ │ │ └── topLevelGraphics
│ │ │ │ │ │ └── play
│ │ │ │ │ │ └── listings
│ │ │ │ │ │ └── en-US
│ │ │ │ │ │ └── graphics
│ │ │ │ │ │ └── icon.png
│ │ │ │ ├── PublishProductsIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ ├── hidden
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── products
│ │ │ │ │ │ │ └── .keep
│ │ │ │ │ │ ├── invalid
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── products
│ │ │ │ │ │ │ └── sku.txt
│ │ │ │ │ │ ├── multipleProducts
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── products
│ │ │ │ │ │ │ ├── 1.json
│ │ │ │ │ │ │ └── 2.json
│ │ │ │ │ │ └── simple
│ │ │ │ │ │ └── play
│ │ │ │ │ │ └── products
│ │ │ │ │ │ └── product.json
│ │ │ │ ├── PublishSubscriptionsIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ ├── hidden
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── products
│ │ │ │ │ │ │ └── .keep
│ │ │ │ │ │ ├── invalid
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── products
│ │ │ │ │ │ │ └── sku.txt
│ │ │ │ │ │ ├── simple
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── subscriptions
│ │ │ │ │ │ │ ├── subscription.metadata.json
│ │ │ │ │ │ │ └── subscription.json
│ │ │ │ │ │ └── multipleSubscriptions
│ │ │ │ │ │ └── play
│ │ │ │ │ │ └── subscriptions
│ │ │ │ │ │ ├── subscription1.metadata.json
│ │ │ │ │ │ ├── subscription2.metadata.json
│ │ │ │ │ │ ├── subscription1.json
│ │ │ │ │ │ └── subscription2.json
│ │ │ │ ├── PublishApkIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ ├── consoleNames
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── release-names
│ │ │ │ │ │ │ ├── default.txt
│ │ │ │ │ │ │ └── custom-track.txt
│ │ │ │ │ │ ├── releaseNotes
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── release-notes
│ │ │ │ │ │ │ ├── en-US
│ │ │ │ │ │ │ ├── default.txt
│ │ │ │ │ │ │ └── custom-track.txt
│ │ │ │ │ │ │ └── fr-FR
│ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ └── main
│ │ │ │ │ │ ├── java
│ │ │ │ │ │ └── com
│ │ │ │ │ │ │ └── example
│ │ │ │ │ │ │ └── publisher
│ │ │ │ │ │ │ └── MainActivity.java
│ │ │ │ │ │ ├── AndroidManifest.xml
│ │ │ │ │ │ └── cpp
│ │ │ │ │ │ ├── native-lib.cpp
│ │ │ │ │ │ └── CMakeLists.txt
│ │ │ │ ├── PromoteReleaseIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ ├── consoleNames
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── release-names
│ │ │ │ │ │ │ ├── default.txt
│ │ │ │ │ │ │ ├── custom-track.txt
│ │ │ │ │ │ │ └── promote-track.txt
│ │ │ │ │ │ └── releaseNotes
│ │ │ │ │ │ └── play
│ │ │ │ │ │ └── release-notes
│ │ │ │ │ │ ├── en-US
│ │ │ │ │ │ ├── default.txt
│ │ │ │ │ │ ├── auto-track.txt
│ │ │ │ │ │ └── custom-track.txt
│ │ │ │ │ │ └── fr-FR
│ │ │ │ │ │ └── default.txt
│ │ │ │ ├── PublishBundleIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ ├── consoleNames
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── release-names
│ │ │ │ │ │ │ ├── custom-track.txt
│ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ ├── releaseNotes
│ │ │ │ │ │ └── play
│ │ │ │ │ │ │ └── release-notes
│ │ │ │ │ │ │ ├── en-US
│ │ │ │ │ │ │ ├── default.txt
│ │ │ │ │ │ │ └── custom-track.txt
│ │ │ │ │ │ │ └── fr-FR
│ │ │ │ │ │ │ └── default.txt
│ │ │ │ │ │ └── main
│ │ │ │ │ │ ├── java
│ │ │ │ │ │ └── com
│ │ │ │ │ │ │ └── example
│ │ │ │ │ │ │ └── publisher
│ │ │ │ │ │ │ └── MainActivity.java
│ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ ├── CommitEditIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ └── main
│ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ ├── GenerateEditIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ └── main
│ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ ├── PlayPublisherPluginIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ └── main
│ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ ├── ProcessArtifactVersionCodesIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ └── main
│ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ ├── PublishInternalSharingApkIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ └── main
│ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ ├── PublishInternalSharingBundleIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ │ └── main
│ │ │ │ │ │ └── AndroidManifest.xml
│ │ │ │ └── InstallInternalSharingArtifactIntegrationTest
│ │ │ │ │ └── src
│ │ │ │ │ └── main
│ │ │ │ │ ├── java
│ │ │ │ │ └── com
│ │ │ │ │ │ └── example
│ │ │ │ │ │ └── publisher
│ │ │ │ │ │ └── MainActivity.java
│ │ │ │ │ └── AndroidManifest.xml
│ │ │ └── kotlin
│ │ │ │ └── com
│ │ │ │ └── github
│ │ │ │ └── triplet
│ │ │ │ └── gradle
│ │ │ │ └── play
│ │ │ │ ├── helpers
│ │ │ │ ├── SharedIntegrationTest.kt
│ │ │ │ └── IntegrationTest.kt
│ │ │ │ └── tasks
│ │ │ │ ├── shared
│ │ │ │ ├── PublishInternalSharingArtifactIntegrationTests.kt
│ │ │ │ ├── LifecycleIntegrationTests.kt
│ │ │ │ └── PublishOrPromoteArtifactIntegrationTests.kt
│ │ │ │ ├── internal
│ │ │ │ └── CliOptionsTest.kt
│ │ │ │ ├── PublishInternalSharingApkIntegrationTest.kt
│ │ │ │ ├── PublishInternalSharingBundleIntegrationTest.kt
│ │ │ │ ├── CommitEditIntegrationTest.kt
│ │ │ │ ├── InstallInternalSharingArtifactIntegrationTest.kt
│ │ │ │ ├── GenerateEditIntegrationTest.kt
│ │ │ │ ├── PublishProductsIntegrationTest.kt
│ │ │ │ └── PublishSubscriptionsIntegrationTest.kt
│ │ └── main
│ │ │ └── kotlin
│ │ │ └── com
│ │ │ └── github
│ │ │ └── triplet
│ │ │ └── gradle
│ │ │ └── play
│ │ │ ├── internal
│ │ │ ├── SubscriptionModels.kt
│ │ │ ├── Validation.kt
│ │ │ ├── Constants.kt
│ │ │ ├── ListingModels.kt
│ │ │ └── Plugins.kt
│ │ │ └── tasks
│ │ │ ├── internal
│ │ │ ├── PlayTaskBase.kt
│ │ │ ├── workers
│ │ │ │ ├── EditWorkerBase.kt
│ │ │ │ ├── PlayWorkerBase.kt
│ │ │ │ ├── Params.kt
│ │ │ │ └── PublishArtifactWorkerBase.kt
│ │ │ ├── PublishTaskBase.kt
│ │ │ ├── PublishArtifactTaskBase.kt
│ │ │ └── LifecycleTasks.kt
│ │ │ ├── CommitEdit.kt
│ │ │ ├── PromoteRelease.kt
│ │ │ ├── PublishProducts.kt
│ │ │ ├── ProcessArtifactVersionCodes.kt
│ │ │ ├── PublishInternalSharingApk.kt
│ │ │ ├── PublishInternalSharingBundle.kt
│ │ │ ├── PublishSubscriptions.kt
│ │ │ └── PublishBundle.kt
│ └── build.gradle.kts
└── android-publisher
│ ├── src
│ ├── testFixtures
│ │ ├── resources
│ │ │ └── META-INF
│ │ │ │ └── services
│ │ │ │ ├── com.github.triplet.gradle.androidpublisher.EditManager$Factory
│ │ │ │ └── com.github.triplet.gradle.androidpublisher.PlayPublisher$Factory
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── github
│ │ │ └── triplet
│ │ │ └── gradle
│ │ │ └── androidpublisher
│ │ │ ├── Responses.kt
│ │ │ ├── FakePlayPublisher.kt
│ │ │ └── FakeEditManager.kt
│ └── main
│ │ ├── resources
│ │ └── META-INF
│ │ │ └── services
│ │ │ ├── com.github.triplet.gradle.androidpublisher.EditManager$Factory
│ │ │ └── com.github.triplet.gradle.androidpublisher.PlayPublisher$Factory
│ │ └── kotlin
│ │ └── com
│ │ └── github
│ │ └── triplet
│ │ └── gradle
│ │ └── androidpublisher
│ │ ├── PublisherModels.kt
│ │ ├── internal
│ │ ├── InternalPlayPublisher.kt
│ │ └── AndroidPublisher.kt
│ │ ├── EditManager.kt
│ │ ├── Responses.kt
│ │ └── PlayPublisher.kt
│ └── build.gradle.kts
├── testapp
├── src
│ └── main
│ │ ├── play
│ │ ├── default-language.txt
│ │ ├── listings
│ │ │ └── en-US
│ │ │ │ ├── title.txt
│ │ │ │ ├── short-description.txt
│ │ │ │ ├── full-description.txt
│ │ │ │ └── graphics
│ │ │ │ ├── icon.png
│ │ │ │ ├── feature-graphic.png
│ │ │ │ ├── phone-screenshots
│ │ │ │ ├── 1.jpg
│ │ │ │ ├── 2.jpg
│ │ │ │ ├── 3.jpg
│ │ │ │ └── 4.jpg
│ │ │ │ └── tablet-screenshots
│ │ │ │ ├── 1.png
│ │ │ │ └── 2.png
│ │ ├── contact-website.txt
│ │ ├── contact-email.txt
│ │ └── release-notes
│ │ │ └── en-US
│ │ │ └── default.txt
│ │ ├── res
│ │ ├── values
│ │ │ ├── strings.xml
│ │ │ ├── colors.xml
│ │ │ └── styles.xml
│ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ └── layout
│ │ │ └── activity_main.xml
│ │ ├── java
│ │ └── com
│ │ │ └── supercilex
│ │ │ └── test
│ │ │ └── MainActivity.kt
│ │ └── AndroidManifest.xml
├── settings.gradle.kts
├── keystore.jks
├── keystore.properties
├── gradle
│ └── wrapper
│ │ ├── gradle-wrapper.jar
│ │ └── gradle-wrapper.properties
├── gradle.properties
├── google-play-auto-publisher.json
├── gradlew.bat
└── build.gradle.kts
├── assets
├── min-perms.png
├── logo-license.html
└── logo.svg
├── .gitignore
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── common
├── utils
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── kotlin
│ │ └── com
│ │ └── github
│ │ └── triplet
│ │ └── gradle
│ │ └── common
│ │ └── utils
│ │ ├── Constants.kt
│ │ └── Io.kt
└── validation
│ ├── src
│ ├── main
│ │ └── kotlin
│ │ │ └── com
│ │ │ └── github
│ │ │ └── triplet
│ │ │ └── gradle
│ │ │ └── common
│ │ │ └── validation
│ │ │ ├── MinDeps.kt
│ │ │ ├── RuntimeValidator.kt
│ │ │ └── Validation.kt
│ └── test
│ │ └── kotlin
│ │ └── com
│ │ └── github
│ │ └── triplet
│ │ └── gradle
│ │ └── common
│ │ └── validation
│ │ └── RuntimeValidatorTest.kt
│ └── build.gradle.kts
├── CONTRIBUTING.md
├── LICENSE
├── gradlew.bat
├── settings.gradle.kts
└── CODE_OF_CONDUCT.md
/version.txt:
--------------------------------------------------------------------------------
1 | 3.13.0
2 |
--------------------------------------------------------------------------------
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | * @SUPERCILEX
2 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | github: SUPERCILEX
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/app/creds.json:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/testapp/src/main/play/default-language.txt:
--------------------------------------------------------------------------------
1 | en-US
2 |
--------------------------------------------------------------------------------
/testapp/src/main/play/listings/en-US/title.txt:
--------------------------------------------------------------------------------
1 | Test app
2 |
--------------------------------------------------------------------------------
/testapp/src/main/play/contact-website.txt:
--------------------------------------------------------------------------------
1 | https://alexsaveau.dev
2 |
--------------------------------------------------------------------------------
/testapp/src/main/play/contact-email.txt:
--------------------------------------------------------------------------------
1 | saveau.alexandre@gmail.com
2 |
--------------------------------------------------------------------------------
/testapp/src/main/play/listings/en-US/short-description.txt:
--------------------------------------------------------------------------------
1 | Foobar
2 |
--------------------------------------------------------------------------------
/testapp/src/main/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | Dummy release notes
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/hiddenFile/play/.keep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/hidden/play/listings/.keep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishProductsIntegrationTest/src/hidden/play/products/.keep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/hiddenFile/play/listings/.keep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishProductsIntegrationTest/src/invalid/play/products/sku.txt:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishSubscriptionsIntegrationTest/src/hidden/play/products/.keep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/products/sku.json:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/invalid/play/listings/en-US/foo.txt:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishSubscriptionsIntegrationTest/src/invalid/play/products/sku.txt:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/app/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1g -Dfile.encoding=UTF-8
2 |
--------------------------------------------------------------------------------
/testapp/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | `gradle-enterprise`
3 | }
4 |
5 | includeBuild("..")
6 |
--------------------------------------------------------------------------------
/assets/min-perms.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/assets/min-perms.png
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/illegalPlayFile/play/listings/en-US/play:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/default-language.txt:
--------------------------------------------------------------------------------
1 | en-US
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/listings/en-US/title.txt:
--------------------------------------------------------------------------------
1 | main
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/listings/fr-FR/title.txt:
--------------------------------------------------------------------------------
1 | main
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/unknownFile/play/invalid/en-US/wrong.txt:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/details/play/contact-email.txt:
--------------------------------------------------------------------------------
1 | email
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/details/play/contact-phone.txt:
--------------------------------------------------------------------------------
1 | phone
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/details/play/default-language.txt:
--------------------------------------------------------------------------------
1 | en-US
2 |
--------------------------------------------------------------------------------
/testapp/keystore.jks:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/keystore.jks
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/free/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | free
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | main
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/release-notes/fr-FR/default.txt:
--------------------------------------------------------------------------------
1 | main
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/prod/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | prod
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/validPlayFile/play/listings/en-US/play.txt:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/everything/play/default-language.txt:
--------------------------------------------------------------------------------
1 | en-US
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/free/play/listings/de-DE/title.txt:
--------------------------------------------------------------------------------
1 | title free de
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/free/play/listings/en-US/short-description.txt:
--------------------------------------------------------------------------------
1 | free
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/hiddenFile/play/listings/en-US/title.txt:
--------------------------------------------------------------------------------
1 | Hidden
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/listings/de-DE/full-description.txt:
--------------------------------------------------------------------------------
1 | de-DE
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/listings/en-US/full-description.txt:
--------------------------------------------------------------------------------
1 | main
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/listings/en-US/short-description.txt:
--------------------------------------------------------------------------------
1 | main
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/listings/fr-FR/full-description.txt:
--------------------------------------------------------------------------------
1 | main
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/listings/fr-FR/short-description.txt:
--------------------------------------------------------------------------------
1 | main
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/subscriptions/subscription.json:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/paid/play/listings/de-DE/title.txt:
--------------------------------------------------------------------------------
1 | title paid de
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/paid/play/listings/en-US/title.txt:
--------------------------------------------------------------------------------
1 | title paid us
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/everything/play/listings/en-US/graphics/icon/1.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/everything/play/listings/en-US/title.txt:
--------------------------------------------------------------------------------
1 | Title
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/multiGraphics/play/listings/en-US/graphics/icon/1.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/singleListing/play/listings/en-US/title.txt:
--------------------------------------------------------------------------------
1 | title
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | *.iml
3 | .gradle
4 | build
5 | !**/src/main/**/build
6 | local.properties
7 | out
8 | userHome
9 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/free/play/release-notes/de-DE/default.txt:
--------------------------------------------------------------------------------
1 | free german
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/invalidLocale/play/listings/title.txt:
--------------------------------------------------------------------------------
1 | Invalid locale
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/paid/play/release-notes/de-DE/default.txt:
--------------------------------------------------------------------------------
1 | paid german
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/paid/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | paid english
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/play/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | play english
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/staging/play/listings/en-US/short-description.txt:
--------------------------------------------------------------------------------
1 | staging
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/topLevelGraphics/play/listings/en-US/graphics/icon.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishApkIntegrationTest/src/consoleNames/play/release-names/default.txt:
--------------------------------------------------------------------------------
1 | myDefaultName
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/mixedLevelGraphics/play/listings/en-US/graphics/icon.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/multiLangGraphics/play/listings/en-US/graphics/icon/1.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/multiLangListing/play/listings/de-DE/title.txt:
--------------------------------------------------------------------------------
1 | Lang C
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/multiLangListing/play/listings/en-US/title.txt:
--------------------------------------------------------------------------------
1 | Lang A
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/multiLangListing/play/listings/fr-FR/title.txt:
--------------------------------------------------------------------------------
1 | Lang B
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/singleGraphics/play/listings/en-US/graphics/icon/1.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/singleListing/play/listings/en-US/video-url.txt:
--------------------------------------------------------------------------------
1 | url
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/topLevelGraphics/play/listings/en-US/graphics/icon.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx2g -Dfile.encoding=UTF-8
2 | org.gradle.parallel=true
3 | org.gradle.caching=true
4 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/dogfood/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | dogfood english
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/freeStaging/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | freeStaging
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/listings/en-US/graphics/phone-screenshots/foo.jpg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/listings/en-US/graphics/tablet-screenshots/baz.jpg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/listings/fr-FR/graphics/phone-screenshots/bar.jpg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/staging/play/listings/ja-JA/parent-child-test.txt:
--------------------------------------------------------------------------------
1 | staging-pct
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PromoteReleaseIntegrationTest/src/consoleNames/play/release-names/default.txt:
--------------------------------------------------------------------------------
1 | myDefaultName
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishApkIntegrationTest/src/consoleNames/play/release-names/custom-track.txt:
--------------------------------------------------------------------------------
1 | myCustomName
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishBundleIntegrationTest/src/consoleNames/play/release-names/custom-track.txt:
--------------------------------------------------------------------------------
1 | myCustomName
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishBundleIntegrationTest/src/consoleNames/play/release-names/default.txt:
--------------------------------------------------------------------------------
1 | myDefaultName
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/details/play/contact-website.txt:
--------------------------------------------------------------------------------
1 | https://alexsaveau.dev
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/everything/play/listings/fr-FR/full-description.txt:
--------------------------------------------------------------------------------
1 | Full
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/everything/play/listings/fr-FR/graphics/phone-screenshots/a.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/singleListing/play/listings/en-US/full-description.txt:
--------------------------------------------------------------------------------
1 | full
2 |
--------------------------------------------------------------------------------
/testapp/keystore.properties:
--------------------------------------------------------------------------------
1 | keyAlias=keystore
2 | keyPassword=000000
3 | storeFile=keystore.jks
4 | storePassword=000000
5 |
--------------------------------------------------------------------------------
/testapp/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | Playground
3 |
4 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/illegalPlayDir/play/listings/en-US/play/default.txt:
--------------------------------------------------------------------------------
1 | play english
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PromoteReleaseIntegrationTest/src/consoleNames/play/release-names/custom-track.txt:
--------------------------------------------------------------------------------
1 | myCustomName
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PromoteReleaseIntegrationTest/src/consoleNames/play/release-names/promote-track.txt:
--------------------------------------------------------------------------------
1 | myPromoteName
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/multiGraphics/play/listings/en-US/graphics/phone-screenshots/a.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/multiGraphics/play/listings/en-US/graphics/phone-screenshots/b.jpeg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/multiGraphics/play/listings/en-US/graphics/phone-screenshots/c.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/singleListing/play/listings/en-US/short-description.txt:
--------------------------------------------------------------------------------
1 | short
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/freeDogfood/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | free dogfood english
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/topLevelGraphics/play/listings/en-US/graphics/phone-screenshots.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/topLevelGraphics/play/listings/en-US/graphics/phone-screenshots/b.jpeg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishApkIntegrationTest/src/releaseNotes/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | My default release notes
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishApkIntegrationTest/src/releaseNotes/play/release-notes/fr-FR/default.txt:
--------------------------------------------------------------------------------
1 | Mes notes de mise à jour
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/mixedLevelGraphics/play/listings/en-US/graphics/phone-screenshots.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/mixedLevelGraphics/play/listings/en-US/graphics/phone-screenshots/b.jpeg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishListingsIntegrationTest/src/multiLangGraphics/play/listings/fr-FR/graphics/phone-screenshots/a.png:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishProductsIntegrationTest/src/multipleProducts/play/products/1.json:
--------------------------------------------------------------------------------
1 | {
2 | "sku": "sku1"
3 | }
4 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishProductsIntegrationTest/src/multipleProducts/play/products/2.json:
--------------------------------------------------------------------------------
1 | {
2 | "sku": "sku2"
3 | }
4 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishProductsIntegrationTest/src/simple/play/products/product.json:
--------------------------------------------------------------------------------
1 | {
2 | "sku": "my-sku"
3 | }
4 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/free/play/listings/de-DE/short-description.txt:
--------------------------------------------------------------------------------
1 | shortdescription for free de
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/freeStagingDogfood/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | freeStagingDogfood
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/play/subscriptions/subscription.metadata.json:
--------------------------------------------------------------------------------
1 | {"regionsVersion":""}
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/paid/play/listings/de-DE/short-description.txt:
--------------------------------------------------------------------------------
1 | shortdescription for paid de
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/paid/play/listings/en-US/short-description.txt:
--------------------------------------------------------------------------------
1 | shortdescription for paid us
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PromoteReleaseIntegrationTest/src/releaseNotes/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | My default release notes
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PromoteReleaseIntegrationTest/src/releaseNotes/play/release-notes/fr-FR/default.txt:
--------------------------------------------------------------------------------
1 | Mes notes de mise à jour
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishBundleIntegrationTest/src/releaseNotes/play/release-notes/en-US/default.txt:
--------------------------------------------------------------------------------
1 | My default release notes
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishBundleIntegrationTest/src/releaseNotes/play/release-notes/fr-FR/default.txt:
--------------------------------------------------------------------------------
1 | Mes notes de mise à jour
2 |
--------------------------------------------------------------------------------
/testapp/src/main/play/listings/en-US/full-description.txt:
--------------------------------------------------------------------------------
1 | Access to this app can be found here: https://github.com/SUPERCILEX/issue-mcve
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/CommitEditIntegrationTest/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateEditIntegrationTest/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/free/play/listings/de-DE/full-description.txt:
--------------------------------------------------------------------------------
1 | fulldescription for free de flavor
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/freeStagingDogfood/play/listings/en-US/full-description.txt:
--------------------------------------------------------------------------------
1 | freeStagingDogfood
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/freeStagingRelease/play/listings/en-US/full-description.txt:
--------------------------------------------------------------------------------
1 | freeStagingRelease
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/paid/play/listings/de-DE/full-description.txt:
--------------------------------------------------------------------------------
1 | fulldescription for paid de flavor
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/paid/play/listings/en-US/full-description.txt:
--------------------------------------------------------------------------------
1 | fulldescription for paid us flavor
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/topLevelGraphicsConflict/play/listings/en-US/graphics/phone-screenshots.png:
--------------------------------------------------------------------------------
1 | top
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PromoteReleaseIntegrationTest/src/releaseNotes/play/release-notes/en-US/auto-track.txt:
--------------------------------------------------------------------------------
1 | Auto track release notes
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishApkIntegrationTest/src/releaseNotes/play/release-notes/en-US/custom-track.txt:
--------------------------------------------------------------------------------
1 | Custom track release notes
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishBundleIntegrationTest/src/releaseNotes/play/release-notes/en-US/custom-track.txt:
--------------------------------------------------------------------------------
1 | Custom track release notes
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishSubscriptionsIntegrationTest/src/simple/play/subscriptions/subscription.metadata.json:
--------------------------------------------------------------------------------
1 | {"regionsVersion":""}
2 |
--------------------------------------------------------------------------------
/testapp/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PlayPublisherPluginIntegrationTest/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PromoteReleaseIntegrationTest/src/releaseNotes/play/release-notes/en-US/custom-track.txt:
--------------------------------------------------------------------------------
1 | Custom track release notes
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/ProcessArtifactVersionCodesIntegrationTest/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishInternalSharingApkIntegrationTest/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishInternalSharingBundleIntegrationTest/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/testapp/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx2g -Dfile.encoding=UTF-8
2 | org.gradle.parallel=true
3 | org.gradle.caching=true
4 | android.useAndroidX=true
5 |
--------------------------------------------------------------------------------
/testapp/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/testapp/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/GenerateResourcesIntegrationTest/src/topLevelGraphicsConflict/play/listings/en-US/graphics/phone-screenshots/phone-screenshots.png:
--------------------------------------------------------------------------------
1 | filed
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishSubscriptionsIntegrationTest/src/multipleSubscriptions/play/subscriptions/subscription1.metadata.json:
--------------------------------------------------------------------------------
1 | {"regionsVersion":""}
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishSubscriptionsIntegrationTest/src/multipleSubscriptions/play/subscriptions/subscription2.metadata.json:
--------------------------------------------------------------------------------
1 | {"regionsVersion":""}
2 |
--------------------------------------------------------------------------------
/testapp/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/testapp/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/testapp/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/testapp/src/main/play/listings/en-US/graphics/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/play/listings/en-US/graphics/icon.png
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishSubscriptionsIntegrationTest/src/simple/play/subscriptions/subscription.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "my-package",
3 | "productId": "subscription"
4 | }
5 |
--------------------------------------------------------------------------------
/testapp/src/main/play/listings/en-US/graphics/feature-graphic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/play/listings/en-US/graphics/feature-graphic.png
--------------------------------------------------------------------------------
/play/android-publisher/src/testFixtures/resources/META-INF/services/com.github.triplet.gradle.androidpublisher.EditManager$Factory:
--------------------------------------------------------------------------------
1 | com.github.triplet.gradle.androidpublisher.FakeEditManager$Factory
2 |
--------------------------------------------------------------------------------
/play/android-publisher/src/main/resources/META-INF/services/com.github.triplet.gradle.androidpublisher.EditManager$Factory:
--------------------------------------------------------------------------------
1 | com.github.triplet.gradle.androidpublisher.internal.DefaultEditManager$Factory
2 |
--------------------------------------------------------------------------------
/play/android-publisher/src/testFixtures/resources/META-INF/services/com.github.triplet.gradle.androidpublisher.PlayPublisher$Factory:
--------------------------------------------------------------------------------
1 | com.github.triplet.gradle.androidpublisher.FakePlayPublisher$Factory
2 |
--------------------------------------------------------------------------------
/testapp/src/main/play/listings/en-US/graphics/phone-screenshots/1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/play/listings/en-US/graphics/phone-screenshots/1.jpg
--------------------------------------------------------------------------------
/testapp/src/main/play/listings/en-US/graphics/phone-screenshots/2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/play/listings/en-US/graphics/phone-screenshots/2.jpg
--------------------------------------------------------------------------------
/testapp/src/main/play/listings/en-US/graphics/phone-screenshots/3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/play/listings/en-US/graphics/phone-screenshots/3.jpg
--------------------------------------------------------------------------------
/testapp/src/main/play/listings/en-US/graphics/phone-screenshots/4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/play/listings/en-US/graphics/phone-screenshots/4.jpg
--------------------------------------------------------------------------------
/testapp/src/main/play/listings/en-US/graphics/tablet-screenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/play/listings/en-US/graphics/tablet-screenshots/1.png
--------------------------------------------------------------------------------
/testapp/src/main/play/listings/en-US/graphics/tablet-screenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Triple-T/gradle-play-publisher/HEAD/testapp/src/main/play/listings/en-US/graphics/tablet-screenshots/2.png
--------------------------------------------------------------------------------
/play/android-publisher/src/main/resources/META-INF/services/com.github.triplet.gradle.androidpublisher.PlayPublisher$Factory:
--------------------------------------------------------------------------------
1 | com.github.triplet.gradle.androidpublisher.internal.DefaultPlayPublisher$Factory
2 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishSubscriptionsIntegrationTest/src/multipleSubscriptions/play/subscriptions/subscription1.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "my-package",
3 | "productId": "subscription1"
4 | }
5 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishSubscriptionsIntegrationTest/src/multipleSubscriptions/play/subscriptions/subscription2.json:
--------------------------------------------------------------------------------
1 | {
2 | "packageName": "my-package",
3 | "productId": "subscription2"
4 | }
5 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/3-doc.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: 📚 Documentation request
3 | about: Point out what's confusing or missing
4 | labels: docs
5 |
6 | ---
7 |
8 | What are you having trouble with and how can we help you?
9 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishApkIntegrationTest/src/main/java/com/example/publisher/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.publisher;
2 |
3 | import android.app.Activity;
4 |
5 | public final class MainActivity extends Activity {}
6 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishBundleIntegrationTest/src/main/java/com/example/publisher/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.publisher;
2 |
3 | import android.app.Activity;
4 |
5 | public final class MainActivity extends Activity {}
6 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/InstallInternalSharingArtifactIntegrationTest/src/main/java/com/example/publisher/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.publisher;
2 |
3 | import android.app.Activity;
4 |
5 | public final class MainActivity extends Activity {}
6 |
--------------------------------------------------------------------------------
/testapp/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #3F51B5
4 | #303F9F
5 | #FF4081
6 |
7 |
--------------------------------------------------------------------------------
/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/internal/SubscriptionModels.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.internal
2 |
3 | data class SubscriptionMetadata(
4 | /** The subscription regions version */
5 | val regionsVersion: String,
6 | )
7 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/2-feature.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: 🙏 Feature request
3 | about: Suggest an idea for this project
4 | labels: enhancement
5 |
6 | ---
7 |
8 | ### Problem description
9 |
10 |
11 |
12 | ### Potential solutions/workarounds
13 |
14 |
15 |
16 | ### Additional context
17 |
18 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
4 | networkTimeout=10000
5 | validateDistributionUrl=true
6 | zipStoreBase=GRADLE_USER_HOME
7 | zipStorePath=wrapper/dists
8 |
--------------------------------------------------------------------------------
/testapp/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | distributionBase=GRADLE_USER_HOME
2 | distributionPath=wrapper/dists
3 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
4 | networkTimeout=10000
5 | validateDistributionUrl=true
6 | zipStoreBase=GRADLE_USER_HOME
7 | zipStorePath=wrapper/dists
8 |
--------------------------------------------------------------------------------
/common/utils/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | `kotlin-dsl`
3 | `maven-publish`
4 | signing
5 | }
6 |
7 | afterEvaluate {
8 | publishing.publications.named("pluginMaven") {
9 | artifactId = "common-utils"
10 | configurePom()
11 | signing.sign(this)
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/common/utils/src/main/kotlin/com/github/triplet/gradle/common/utils/Constants.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.common.utils
2 |
3 | /** The plugin's non user-facing name. */
4 | const val PLUGIN_NAME: String = "gradle-play-publisher"
5 |
6 | /** The plugin's Gradle task group. */
7 | const val PLUGIN_GROUP: String = "Publishing"
8 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishApkIntegrationTest/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishBundleIntegrationTest/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/MinDeps.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.common.validation
2 |
3 | import com.android.build.api.AndroidPluginVersion
4 | import org.gradle.util.GradleVersion
5 |
6 | internal val MIN_GRADLE_VERSION = GradleVersion.version("7.0.2")
7 | internal val MIN_AGP_VERSION = AndroidPluginVersion(7, 0)
8 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/InstallInternalSharingArtifactIntegrationTest/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/testapp/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishApkIntegrationTest/src/main/cpp/native-lib.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 | extern "C"
5 | JNIEXPORT jstring JNICALL
6 | Java_com_example_publisher_MainActivity_stringFromJNI(
7 | JNIEnv *env,
8 | jobject /* this */) {
9 | std::string hello = "Hello from C++";
10 | return env->NewStringUTF(hello.c_str());
11 | }
12 |
--------------------------------------------------------------------------------
/testapp/src/main/java/com/supercilex/test/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.supercilex.test
2 |
3 | import android.os.Bundle
4 | import androidx.appcompat.app.AppCompatActivity
5 |
6 | class MainActivity : AppCompatActivity() {
7 | override fun onCreate(savedInstanceState: Bundle?) {
8 | super.onCreate(savedInstanceState)
9 | setContentView(R.layout.activity_main)
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | Hey there! So you want to contribute to Gradle Play Publisher?
2 | Before you file this pull request, follow these steps:
3 |
4 | - Read [the contribution guidelines](https://github.com/Triple-T/gradle-play-publisher/blob/master/CONTRIBUTING.md).
5 | - If this has been discussed in an issue, make sure to mention the issue number here.
6 | If not, go file an issue about this to make sure it is a desirable change.
7 |
--------------------------------------------------------------------------------
/assets/logo-license.html:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 | This work is licensed under a
8 |
9 | Creative Commons Attribution 4.0 International License
10 | .
11 |
--------------------------------------------------------------------------------
/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/PlayTaskBase.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.tasks.internal
2 |
3 | import com.github.triplet.gradle.play.PlayPublisherExtension
4 | import org.gradle.api.DefaultTask
5 | import org.gradle.api.tasks.Nested
6 | import org.gradle.work.DisableCachingByDefault
7 |
8 | @DisableCachingByDefault
9 | internal abstract class PlayTaskBase(
10 | @get:Nested val extension: PlayPublisherExtension,
11 | ) : DefaultTask()
12 |
--------------------------------------------------------------------------------
/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/internal/Validation.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.internal
2 |
3 | import com.android.build.api.variant.ApplicationVariant
4 | import com.github.triplet.gradle.common.validation.validateDebuggability
5 | import com.github.triplet.gradle.play.PlayPublisherPlugin
6 | import org.gradle.api.logging.Logging
7 |
8 | internal fun ApplicationVariant.validateDebuggability() =
9 | validateDebuggability(this, Logging.getLogger(PlayPublisherPlugin::class.java))
10 |
--------------------------------------------------------------------------------
/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/EditWorkerBase.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.tasks.internal.workers
2 |
3 | internal abstract class EditWorkerBase :
4 | PlayWorkerBase() {
5 | protected fun commit() {
6 | if (config.commit) {
7 | apiService.scheduleCommit()
8 | } else {
9 | apiService.skipCommit()
10 | }
11 | }
12 |
13 | internal interface EditPublishingParams : PlayPublishingParams
14 | }
15 |
--------------------------------------------------------------------------------
/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/PublishTaskBase.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.tasks.internal
2 |
3 | import com.github.triplet.gradle.play.PlayPublisherExtension
4 | import org.gradle.api.provider.Property
5 | import org.gradle.api.tasks.Internal
6 | import org.gradle.work.DisableCachingByDefault
7 |
8 | @DisableCachingByDefault
9 | internal abstract class PublishTaskBase(
10 | extension: PlayPublisherExtension,
11 | ) : PlayTaskBase(extension) {
12 | @get:Internal
13 | abstract val apiService: Property
14 | }
15 |
--------------------------------------------------------------------------------
/common/validation/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | `kotlin-dsl`
3 | `maven-publish`
4 | signing
5 | }
6 |
7 | dependencies {
8 | compileOnly(libs.agp)
9 | compileOnly(libs.agp.common)
10 |
11 | testImplementation(testLibs.junit)
12 | testImplementation(testLibs.junit.engine)
13 | testImplementation(testLibs.truth)
14 | testImplementation(libs.agp)
15 | }
16 |
17 | afterEvaluate {
18 | publishing.publications.named("pluginMaven") {
19 | artifactId = "common-validation"
20 | configurePom()
21 | signing.sign(this)
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/helpers/SharedIntegrationTest.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.helpers
2 |
3 | import com.google.common.truth.Truth.assertThat
4 | import org.gradle.testkit.runner.BuildResult
5 | import org.gradle.testkit.runner.TaskOutcome
6 |
7 | interface SharedIntegrationTest : IntegrationTest {
8 | fun taskName(taskVariant: String = DEFAULT_TASK_VARIANT): String
9 |
10 | fun BuildResult.requireTask(task: String = taskName(), outcome: TaskOutcome) {
11 | assertThat(task(task)).isNotNull()
12 | assertThat(task(task)!!.outcome).isEqualTo(outcome)
13 | }
14 |
15 | companion object {
16 | const val DEFAULT_TASK_VARIANT = "Release"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/internal/Constants.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.internal
2 |
3 | internal const val PLAY_PATH = "play"
4 | internal const val PLAY_CONFIGS_PATH = "playConfigs"
5 | internal const val LISTINGS_PATH = "listings"
6 | internal const val GRAPHICS_PATH = "graphics"
7 | internal const val RELEASE_NOTES_PATH = "release-notes"
8 | internal const val RELEASE_NAMES_PATH = "release-names"
9 | internal const val PRODUCTS_PATH = "products"
10 | internal const val SUBSCRIPTIONS_PATH = "subscriptions"
11 | internal const val OUTPUT_PATH = "gpp"
12 | internal const val RESOURCES_OUTPUT_PATH = "generated/$OUTPUT_PATH"
13 | internal const val INTERMEDIATES_OUTPUT_PATH = "intermediates/$OUTPUT_PATH"
14 |
--------------------------------------------------------------------------------
/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/PlayWorkerBase.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.tasks.internal.workers
2 |
3 | import com.github.triplet.gradle.play.internal.PlayExtensionConfig
4 | import com.github.triplet.gradle.play.tasks.internal.PlayApiService
5 | import org.gradle.api.provider.Property
6 | import org.gradle.workers.WorkAction
7 | import org.gradle.workers.WorkParameters
8 |
9 | internal abstract class PlayWorkerBase : WorkAction {
10 | protected val config = parameters.config.get()
11 | protected val apiService = parameters.apiService.get()
12 |
13 | internal interface PlayPublishingParams : WorkParameters {
14 | val config: Property
15 | val apiService: Property
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/PublishArtifactTaskBase.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.tasks.internal
2 |
3 | import com.github.triplet.gradle.play.PlayPublisherExtension
4 | import org.gradle.api.file.DirectoryProperty
5 | import org.gradle.api.tasks.InputDirectory
6 | import org.gradle.api.tasks.PathSensitive
7 | import org.gradle.api.tasks.PathSensitivity
8 | import org.gradle.work.DisableCachingByDefault
9 |
10 | @DisableCachingByDefault
11 | internal abstract class PublishArtifactTaskBase(
12 | extension: PlayPublisherExtension,
13 | ) : PublishTaskBase(extension) {
14 | @get:PathSensitive(PathSensitivity.RELATIVE)
15 | @get:InputDirectory
16 | internal abstract val releaseNotesDir: DirectoryProperty
17 |
18 | @get:PathSensitive(PathSensitivity.RELATIVE)
19 | @get:InputDirectory
20 | internal abstract val consoleNamesDir: DirectoryProperty
21 | }
22 |
--------------------------------------------------------------------------------
/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/helpers/IntegrationTest.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.helpers
2 |
3 | import org.gradle.testkit.runner.BuildResult
4 | import org.gradle.testkit.runner.GradleRunner
5 | import java.io.File
6 |
7 | interface IntegrationTest {
8 | val appDir: File
9 | val playgroundDir: File
10 |
11 | val factoryInstallerStatement: String
12 |
13 | val withConfigurationCache: Boolean
14 |
15 | fun File.escaped(): String
16 |
17 | fun execute(config: String, vararg tasks: String): BuildResult
18 |
19 | fun executeExpectingFailure(config: String, vararg tasks: String): BuildResult
20 |
21 | fun executeGradle(
22 | expectFailure: Boolean,
23 | block: GradleRunner.() -> Unit,
24 | ): BuildResult
25 |
26 | fun String.withAndroidBlock() = """
27 | android {
28 | $this
29 | }
30 | """.trimIndent()
31 | }
32 |
--------------------------------------------------------------------------------
/.github/workflows/stale.yml:
--------------------------------------------------------------------------------
1 | name: 'Close stale issues and PRs'
2 | on:
3 | schedule:
4 | - cron: '0 0 * * *'
5 |
6 | jobs:
7 | stale:
8 | runs-on: ubuntu-latest
9 | steps:
10 | - uses: actions/stale@v9
11 | with:
12 | days-before-stale: 7
13 | stale-issue-label: waiting-for-reply
14 | stale-pr-label: waiting-for-reply
15 | exempt-issue-labels: feature:apk,feature:bundle,feature:listing,feature:other,dontclose
16 | exempt-pr-labels: dontclose
17 | stale-issue-message: |
18 | This issue has been automatically marked as stale because it has not had recent
19 | activity. It will be closed if no further activity occurs. Thank you for your
20 | contributions.
21 | stale-pr-message: |
22 | This PR has been automatically marked as stale because it has not had recent activity.
23 | It will be closed if no further activity occurs. Thank you for your contributions.
24 |
--------------------------------------------------------------------------------
/testapp/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | ## Want to contribute? Awesome!
2 |
3 | ### Building the plugin
4 |
5 | 1. Run `./gradlew publishToMavenLocal`
6 | 1. Make your changes
7 | 1. Run the tests with `./gradlew test`
8 | 1. Ensure your changes work in a live environment:
9 | ```shell
10 | $ cd testapp
11 | $ ./gradlew taskName # For example: ./gradlew publishBundle
12 | ```
13 |
14 | ### Adding new features
15 |
16 | Before you start working on a larger contribution, you should get in touch with us first through the
17 | issue tracker with your idea so that we can help out and possibly guide you. Coordinating up front
18 | makes it much easier to avoid frustration later on.
19 |
20 | If this has been discussed in an issue, make sure to mention the issue number. If not, go file an
21 | issue about this to make sure this is a desirable change.
22 |
23 | ### Code reviews
24 |
25 | All submissions, including submissions by project members, require review. We adhere to the
26 | [Kotlin coding conventions](https://kotlinlang.org/docs/reference/coding-conventions.html).
27 |
--------------------------------------------------------------------------------
/testapp/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
6 |
7 |
8 |
9 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/assets/logo.svg:
--------------------------------------------------------------------------------
1 |
2 |
21 |
--------------------------------------------------------------------------------
/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/tasks/shared/PublishInternalSharingArtifactIntegrationTests.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.tasks.shared
2 |
3 | import com.github.triplet.gradle.play.helpers.SharedIntegrationTest
4 | import com.google.common.truth.Truth.assertThat
5 | import org.junit.jupiter.api.Test
6 | import java.io.File
7 |
8 | interface PublishInternalSharingArtifactIntegrationTests : SharedIntegrationTest {
9 | fun outputFile(): String
10 |
11 | @Test
12 | fun `Task outputs file with API response`() {
13 | val outputDir = File(appDir, outputFile())
14 |
15 | execute("", taskName())
16 |
17 | assertThat(outputDir.listFiles()).isNotNull()
18 | assertThat(outputDir.listFiles()!!.size).isEqualTo(1)
19 | assertThat(outputDir.listFiles()!!.single().name).endsWith(".json")
20 | assertThat(outputDir.listFiles()!!.single().readText()).isEqualTo("json-payload")
21 | }
22 |
23 | @Test
24 | fun `Task logs download url to console`() {
25 | val result = execute("", taskName())
26 |
27 | assertThat(result.output).contains("Upload successful: http")
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2014 Christian Becker
4 | Copyright (c) 2014 Björn Hurling
5 | Copyright (c) 2018 Alexandre Saveau
6 |
7 | Permission is hereby granted, free of charge, to any person obtaining a copy
8 | of this software and associated documentation files (the "Software"), to deal
9 | in the Software without restriction, including without limitation the rights
10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | copies of the Software, and to permit persons to whom the Software is
12 | furnished to do so, subject to the following conditions:
13 |
14 | The above copyright notice and this permission notice shall be included in all
15 | copies or substantial portions of the Software.
16 |
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | SOFTWARE.
24 |
--------------------------------------------------------------------------------
/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/tasks/internal/CliOptionsTest.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.tasks.internal
2 |
3 | import com.google.common.truth.Truth.assertThat
4 | import org.junit.jupiter.api.Test
5 |
6 | class CliOptionsTest {
7 | @Test
8 | fun `Bootstrap holder defaults to true values`() {
9 | val holder = BootstrapOptions.Holder()
10 |
11 | assertThat(holder.downloadAppDetails).isTrue()
12 | assertThat(holder.downloadListings).isTrue()
13 | assertThat(holder.downloadReleaseNotes).isTrue()
14 | assertThat(holder.downloadProducts).isTrue()
15 | assertThat(holder.downloadSubscriptions).isTrue()
16 | }
17 |
18 | @Test
19 | fun `Bootstrap holder sets other flags to false once one is manually updated`() {
20 | val holder = BootstrapOptions.Holder()
21 |
22 | holder.downloadAppDetails = true
23 |
24 | assertThat(holder.downloadAppDetails).isTrue()
25 | assertThat(holder.downloadListings).isFalse()
26 | assertThat(holder.downloadReleaseNotes).isFalse()
27 | assertThat(holder.downloadProducts).isFalse()
28 | assertThat(holder.downloadSubscriptions).isFalse()
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/play/android-publisher/build.gradle.kts:
--------------------------------------------------------------------------------
1 | import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
2 |
3 | plugins {
4 | `kotlin-dsl`
5 | `java-test-fixtures`
6 | `maven-publish`
7 | signing
8 | }
9 |
10 | dependencies {
11 | implementation(project(":common:utils"))
12 | implementation(libs.androidpublisher)
13 | implementation(libs.client.api)
14 | implementation(libs.client.auth)
15 | implementation(libs.client.http)
16 |
17 | testImplementation(testLibs.junit)
18 | testImplementation(testLibs.junit.engine)
19 | testImplementation(testLibs.truth)
20 | testImplementation(testLibs.mockito)
21 | }
22 |
23 | // Mockito needs to be able to pass in null params
24 | tasks.named("compileTestKotlin") {
25 | kotlinOptions {
26 | freeCompilerArgs += "-Xno-call-assertions"
27 | }
28 | }
29 |
30 | // Give testFixtures access to internal symbols
31 | // TODO(asaveau): remove when https://youtrack.jetbrains.com/issue/KT-34901 gets fixed
32 | kotlin.target.compilations {
33 | named("testFixtures") {
34 | associateWith(named("main").get())
35 | }
36 | }
37 |
38 | afterEvaluate {
39 | publishing.publications.named("pluginMaven") {
40 | artifactId = "android-publisher"
41 | configurePom()
42 | signing.sign(this)
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/1-bug.md:
--------------------------------------------------------------------------------
1 | ---
2 | name: 🐛 Bug report
3 | about: Crashes or incorrect behavior
4 | labels: bug
5 |
6 | ---
7 |
8 | ### Describe the bug
9 |
10 | A clear and concise description of what the bug is.
11 |
12 | ### How To Reproduce
13 |
14 | #### Versions
15 |
16 |
32 |
33 | - Gradle Play Publisher:
34 | - Gradle Wrapper:
35 | - Android Gradle Plugin:
36 |
37 | #### Tasks executed
38 |
39 | What tasks did you run? For example, `publishBundle`.
40 |
41 | ### Expected behavior
42 |
43 | A clear and concise description of what you expected to happen.
44 |
45 | ### Additional context (if a crash, provide stack trace)
46 |
47 | Add any other context about the problem here. If this bug is a crash, run the task with
48 | `--stacktrace` to get the full context.
49 |
--------------------------------------------------------------------------------
/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/tasks/internal/workers/Params.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.tasks.internal.workers
2 |
3 | import com.github.triplet.gradle.play.internal.toConfig
4 | import com.github.triplet.gradle.play.tasks.internal.PublishArtifactTaskBase
5 | import com.github.triplet.gradle.play.tasks.internal.PublishTaskBase
6 |
7 | internal fun PublishTaskBase.paramsForBase(params: PlayWorkerBase.PlayPublishingParams) {
8 | params.config.set(extension.toConfig())
9 | params.apiService.set(apiService)
10 |
11 | if (params is PublishArtifactWorkerBase.ArtifactPublishingParams) {
12 | this as PublishArtifactTaskBase
13 |
14 | params.releaseNotesDir.set(releaseNotesDir)
15 | params.consoleNamesDir.set(consoleNamesDir)
16 | }
17 | }
18 |
19 | internal fun PlayWorkerBase.PlayPublishingParams.copy(into: PlayWorkerBase.PlayPublishingParams) {
20 | into.config.set(config)
21 | into.apiService.set(apiService)
22 | }
23 |
24 | internal fun EditWorkerBase.EditPublishingParams.copy(into: EditWorkerBase.EditPublishingParams) {
25 | (this as PlayWorkerBase.PlayPublishingParams).copy(into)
26 | }
27 |
28 | internal fun PublishArtifactWorkerBase.ArtifactPublishingParams.copy(
29 | into: PublishArtifactWorkerBase.ArtifactPublishingParams,
30 | ) {
31 | (this as EditWorkerBase.EditPublishingParams).copy(into)
32 |
33 | into.releaseNotesDir.set(releaseNotesDir)
34 | into.consoleNamesDir.set(consoleNamesDir)
35 | }
36 |
--------------------------------------------------------------------------------
/play/plugin/src/main/kotlin/com/github/triplet/gradle/play/internal/ListingModels.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.internal
2 |
3 | internal const val RELEASE_NOTES_DEFAULT_NAME = "default.txt"
4 | internal const val RELEASE_NAMES_DEFAULT_NAME = "default.txt"
5 |
6 | internal interface Detail {
7 | val fileName: String
8 | }
9 |
10 | internal enum class ListingDetail(override val fileName: String) : Detail {
11 | TITLE("title.txt"),
12 | SHORT_DESCRIPTION("short-description.txt"),
13 | FULL_DESCRIPTION("full-description.txt"),
14 | VIDEO("video-url.txt")
15 | }
16 |
17 | internal enum class AppDetail(override val fileName: String) : Detail {
18 | CONTACT_EMAIL("contact-email.txt"),
19 | CONTACT_PHONE("contact-phone.txt"),
20 | CONTACT_WEBSITE("contact-website.txt"),
21 | DEFAULT_LANGUAGE("default-language.txt")
22 | }
23 |
24 | internal enum class ImageType(
25 | val publishedName: String,
26 | val dirName: String,
27 | val maxNum: Int = 8,
28 | ) {
29 | ICON("icon", "icon", 1),
30 | FEATURE_GRAPHIC("featureGraphic", "feature-graphic", 1),
31 |
32 | PHONE_SCREENSHOTS("phoneScreenshots", "phone-screenshots"),
33 | SEVEN_INCH_SCREENSHOTS("sevenInchScreenshots", "tablet-screenshots"),
34 | TEN_INCH_SCREENSHOTS("tenInchScreenshots", "large-tablet-screenshots"),
35 | TV_BANNER("tvBanner", "tv-banner", 1),
36 | TV_SCREENSHOTS("tvScreenshots", "tv-screenshots"),
37 | WEAR_SCREENSHOTS("wearScreenshots", "wear-screenshots")
38 | }
39 |
--------------------------------------------------------------------------------
/play/plugin/src/test/kotlin/com/github/triplet/gradle/play/tasks/shared/LifecycleIntegrationTests.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.play.tasks.shared
2 |
3 | import com.github.triplet.gradle.play.helpers.SharedIntegrationTest
4 | import com.google.common.truth.Truth.assertThat
5 | import org.junit.jupiter.params.ParameterizedTest
6 | import org.junit.jupiter.params.provider.ValueSource
7 |
8 | interface LifecycleIntegrationTests : SharedIntegrationTest {
9 | @ParameterizedTest
10 | @ValueSource(strings = [
11 | "",
12 | "release",
13 | "paid",
14 | "free",
15 | "other",
16 | "paidOther",
17 | "freeOther",
18 | ])
19 | fun `Semi-global lifecycle tasks are supported`(qualifier: String) {
20 | // language=gradle
21 | val config = """
22 | flavorDimensions 'pricing', 'magic'
23 | productFlavors {
24 | free { dimension 'pricing' }
25 | paid { dimension 'pricing' }
26 | other { dimension 'magic' }
27 | }
28 | """.withAndroidBlock()
29 |
30 | val result = execute(config, taskName(qualifier.capitalize()))
31 |
32 | if (!qualifier.contains("paid", ignoreCase = true)) {
33 | assertThat(result.task(taskName("FreeOtherRelease"))).isNotNull()
34 | }
35 | if (!qualifier.contains("free", ignoreCase = true)) {
36 | assertThat(result.task(taskName("PaidOtherRelease"))).isNotNull()
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/PublisherModels.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.androidpublisher
2 |
3 | /**
4 | * Models the possible release statuses for the track API.
5 | *
6 | * More docs are available
7 | * [here](https://developers.google.com/android-publisher/api-ref/edits/tracks).
8 | */
9 | enum class ReleaseStatus(
10 | /** The API name of the status. */
11 | val publishedName: String,
12 | ) {
13 | /** The release is live. */
14 | COMPLETED("completed"),
15 |
16 | /** The release is in draft mode. */
17 | DRAFT("draft"),
18 |
19 | /** The release was aborted. */
20 | HALTED("halted"),
21 |
22 | /** The release is still being rolled out. */
23 | IN_PROGRESS("inProgress")
24 | }
25 |
26 | /**
27 | * Models the possible resolution strategies for handling artifact upload conflicts.
28 | *
29 | * More docs are available
30 | * [here](https://github.com/Triple-T/gradle-play-publisher#handling-version-conflicts).
31 | */
32 | enum class ResolutionStrategy(
33 | /** The API name of the strategy. */
34 | val publishedName: String,
35 | ) {
36 | /** Conflicts should be automagically resolved. */
37 | AUTO("auto"),
38 |
39 | /**
40 | * Unlike [AUTO] which diffs your Play Store version code with the local one, [AUTO_OFFSET] is
41 | * much simpler and just adds the local version code to the Play Store one when
42 | * `local <= play_store`.
43 | */
44 | AUTO_OFFSET("auto_offset"),
45 |
46 | /** Fail the build at the first sign of conflict. */
47 | FAIL("fail"),
48 |
49 | /** Keep going and pretend like nothing happened. */
50 | IGNORE("ignore")
51 | }
52 |
--------------------------------------------------------------------------------
/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/RuntimeValidator.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.common.validation
2 |
3 | import com.android.build.api.AndroidPluginVersion
4 | import org.gradle.util.GradleVersion
5 |
6 | internal class GradleRuntimeValidator(
7 | private val currentGradleVersion: GradleVersion,
8 | private val minGradleVersion: GradleVersion,
9 | ) {
10 | fun validate() {
11 | check(currentGradleVersion >= minGradleVersion) {
12 | """
13 | |Gradle Play Publisher's minimum Gradle version is at least $minGradleVersion and yours
14 | |is $currentGradleVersion. Find the latest version at
15 | |https://github.com/gradle/gradle/releases/latest, then run
16 | |$ ./gradlew wrapper --gradle-version=${"$"}LATEST --distribution-type=ALL
17 | """.trimMargin()
18 | }
19 | }
20 | }
21 |
22 | internal class AgpRuntimeValidator(
23 | private val currentAgpVersion: AndroidPluginVersion?,
24 | private val minAgpVersion: AndroidPluginVersion,
25 | ) {
26 | fun validate() {
27 | check(null != currentAgpVersion && currentAgpVersion >= minAgpVersion) {
28 | """
29 | |Gradle Play Publisher's minimum Android Gradle Plugin version is at least
30 | |$minAgpVersion and yours is ${currentAgpVersion ?: "unknown"}. Make sure you've applied
31 | |the AGP alongside this plugin. Find the latest AGP version and upgrade
32 | |instructions at https://developer.android.com/studio/releases/gradle-plugin.
33 | |For GPP installation docs, see here:
34 | |https://github.com/Triple-T/gradle-play-publisher#installation
35 | """.trimMargin()
36 | }
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/play/android-publisher/src/testFixtures/kotlin/com/github/triplet/gradle/androidpublisher/Responses.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.androidpublisher
2 |
3 | import com.google.api.client.googleapis.testing.json.GoogleJsonResponseExceptionFactoryTesting
4 | import com.google.api.client.json.gson.GsonFactory
5 |
6 | fun newGppAppDetails(
7 | defaultLocale: String?,
8 | contactEmail: String?,
9 | contactPhone: String?,
10 | contactWebsite: String?,
11 | ) = GppAppDetails(defaultLocale, contactEmail, contactPhone, contactWebsite)
12 |
13 | fun newGppListing(
14 | locale: String,
15 | fullDescription: String?,
16 | shortDescription: String?,
17 | title: String?,
18 | video: String?,
19 | ) = GppListing(locale, fullDescription, shortDescription, title, video)
20 |
21 | fun newImage(url: String, sha256: String) = GppImage(url, sha256)
22 |
23 | fun newReleaseNote(
24 | track: String,
25 | locale: String,
26 | contents: String,
27 | ) = ReleaseNote(track, locale, contents)
28 |
29 | fun newSuccessEditResponse(id: String) = EditResponse.Success(id)
30 |
31 | fun newFailureEditResponse(reason: String) = EditResponse.Failure(
32 | GoogleJsonResponseExceptionFactoryTesting.newMock(
33 | GsonFactory.getDefaultInstance(), 400, reason))
34 |
35 | fun newSuccessCommitResponse() = CommitResponse.Success
36 |
37 | fun newUploadInternalSharingArtifactResponse(json: String, downloadUrl: String) =
38 | UploadInternalSharingArtifactResponse(json, downloadUrl)
39 |
40 | fun newGppProduct(sku: String, json: String) = GppProduct(sku, json)
41 |
42 | fun newUpdateProductResponse(needsCreating: Boolean) = UpdateProductResponse(needsCreating)
43 |
44 | fun newGppSubscription(productId: String, json: String) = GppSubscription(productId, json)
45 |
46 | fun newUpdateSubscriptionResponse(needsCreating: Boolean) = UpdateSubscriptionResponse(needsCreating)
47 |
--------------------------------------------------------------------------------
/play/plugin/src/test/fixtures/PublishApkIntegrationTest/src/main/cpp/CMakeLists.txt:
--------------------------------------------------------------------------------
1 | # For more information about using CMake with Android Studio, read the
2 | # documentation: https://d.android.com/studio/projects/add-native-code.html
3 |
4 | # Sets the minimum version of CMake required to build the native library.
5 |
6 | cmake_minimum_required(VERSION 3.10.2)
7 |
8 | # Declares and names the project.
9 |
10 | project("test")
11 |
12 | # Creates and names a library, sets it as either STATIC
13 | # or SHARED, and provides the relative paths to its source code.
14 | # You can define multiple libraries, and CMake builds them for you.
15 | # Gradle automatically packages shared libraries with your APK.
16 |
17 | add_library( # Sets the name of the library.
18 | native-lib
19 |
20 | # Sets the library as a shared library.
21 | SHARED
22 |
23 | # Provides a relative path to your source file(s).
24 | native-lib.cpp )
25 |
26 | # Searches for a specified prebuilt library and stores the path as a
27 | # variable. Because CMake includes system libraries in the search path by
28 | # default, you only need to specify the name of the public NDK library
29 | # you want to add. CMake verifies that the library exists before
30 | # completing its build.
31 |
32 | find_library( # Sets the name of the path variable.
33 | log-lib
34 |
35 | # Specifies the name of the NDK library that
36 | # you want CMake to locate.
37 | log )
38 |
39 | # Specifies libraries CMake should link to your target library. You
40 | # can link multiple libraries, such as libraries you define in this
41 | # build script, prebuilt third-party libraries, or system libraries.
42 |
43 | target_link_libraries( # Specifies the target library.
44 | native-lib
45 |
46 | # Links the target library to the log library
47 | # included in the NDK.
48 | ${log-lib} )
49 |
--------------------------------------------------------------------------------
/common/validation/src/main/kotlin/com/github/triplet/gradle/common/validation/Validation.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.common.validation
2 |
3 | import com.android.build.api.component.analytics.AnalyticsEnabledApplicationVariant
4 | import com.android.build.api.variant.ApplicationAndroidComponentsExtension
5 | import com.android.build.api.variant.ApplicationVariant
6 | import com.android.build.gradle.AppPlugin
7 | import com.android.build.gradle.internal.component.ComponentCreationConfig
8 | import org.gradle.api.Project
9 | import org.gradle.api.logging.Logger
10 | import org.gradle.kotlin.dsl.apply
11 | import org.gradle.kotlin.dsl.findByType
12 | import org.gradle.kotlin.dsl.withType
13 | import org.gradle.util.GradleVersion
14 |
15 | /**
16 | * Validates required dependencies. If GPP can't run in the current context, an error will be
17 | * thrown.
18 | */
19 | fun Project.validateRuntime() {
20 | GradleRuntimeValidator(GradleVersion.current(), MIN_GRADLE_VERSION).validate()
21 | plugins.withType {
22 | val agpPluginVersion = extensions.findByType()?.pluginVersion
23 | AgpRuntimeValidator(agpPluginVersion, MIN_AGP_VERSION).validate()
24 | }
25 | }
26 |
27 | /** @return true if the variant is *not* debuggable and can therefore be published. */
28 | fun validateDebuggability(variant: ApplicationVariant, logger: Logger): Boolean {
29 | val hackToGetDebuggable =
30 | ((variant as? AnalyticsEnabledApplicationVariant)?.delegate ?: variant)
31 | as ComponentCreationConfig
32 | val isValid = !hackToGetDebuggable.debuggable
33 |
34 | if (!isValid) {
35 | val typeName = variant.buildType
36 | if (typeName.equals("release", true)) {
37 | logger.error("GPP cannot configure variant '${variant.name}' because it is debuggable")
38 | } else {
39 | logger.info("Skipping debuggable build with type '$typeName'")
40 | }
41 | }
42 |
43 | return isValid
44 | }
45 |
--------------------------------------------------------------------------------
/play/android-publisher/src/main/kotlin/com/github/triplet/gradle/androidpublisher/internal/InternalPlayPublisher.kt:
--------------------------------------------------------------------------------
1 | package com.github.triplet.gradle.androidpublisher.internal
2 |
3 | import com.github.triplet.gradle.androidpublisher.PlayPublisher
4 | import com.google.api.services.androidpublisher.model.Apk
5 | import com.google.api.services.androidpublisher.model.AppDetails
6 | import com.google.api.services.androidpublisher.model.Bundle
7 | import com.google.api.services.androidpublisher.model.DeobfuscationFilesUploadResponse
8 | import com.google.api.services.androidpublisher.model.Image
9 | import com.google.api.services.androidpublisher.model.Listing
10 | import com.google.api.services.androidpublisher.model.Track
11 | import java.io.File
12 | import java.io.IOException
13 |
14 | internal interface InternalPlayPublisher : PlayPublisher {
15 | val appId: String
16 |
17 | fun getAppDetails(editId: String): AppDetails
18 |
19 | fun getListings(editId: String): List
20 |
21 | fun getImages(editId: String, locale: String, type: String): List
22 |
23 | fun updateDetails(editId: String, details: AppDetails)
24 |
25 | fun updateListing(editId: String, locale: String, listing: Listing)
26 |
27 | fun deleteImages(editId: String, locale: String, type: String)
28 |
29 | fun uploadImage(editId: String, locale: String, type: String, image: File)
30 |
31 | fun getTrack(editId: String, track: String): Track
32 |
33 | fun listTracks(editId: String): List