First stable release. Merging this bumps versionName to 1.0.0 and triggers the release pipeline (F-Droid, Codeberg, Play). **App** - CalDAV sync built in, with Agendula's own task store; OpenTasks / tasks.org stay available and can be copied over in Settings → Storage - repeating tasks, several reminders per task, lists managed in the app, iCalendar import/export, widget and Quick Settings tile - a list can be kept out of the smart lists (#18) and gets its own notification channel (#17) - duplicate a task with its subtasks (#16) - HTML descriptions shown as plain text (#15) - relative day words in reminder notifications (#14) - asks for exact-alarm access instead of claiming USE_EXACT_ALARM, and re-arms reminders when that access changes **Release plumbing** - floret-kit bumped to v0.4.0; the old pin was never pushed, so a clean clone couldn't check out the submodule. 0.4.0 drops CrashConfig.issueTitle (crash issues are always filed in English) - prebuilt .so files ship unstripped, so the build no longer depends on whether an NDK is installed; now checked by check_reproducible_release.sh - official F-Droid recipe in docs/fdroid-official/, to submit to fdroiddata once v1.0.0 is tagged - Google Play: fastlane uploads the AAB and every locale's What's New after the F-Droid release; a separate listing lane pushes text and graphics from the fastlane tree, which CI now checks against Play's limits - store listing: title "Agendula: Tasks" in every locale, icon, feature graphic, screenshots and 1.0.0 changelogs in en-US, en-GB, de-DE and pt-BR crash_report_issue_title is now unused but stays until Weblate removes the translated copies. Closes #14, closes #15, closes #16, closes #17, closes #18 Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de> Reviewed-on: https://codeberg.org/jlmakiola/agendula/pulls/20
76 lines
2.8 KiB
Ruby
76 lines
2.8 KiB
Ruby
# Google Play: release upload and listing sync.
|
|
#
|
|
# fastlane/metadata/android is the single source for both stores: the official
|
|
# F-Droid repo harvests it from the tagged tree, the self-hosted repo gets it
|
|
# through scripts/fastlane_to_fdroid_localized.sh, and this pushes it to Play.
|
|
# Building and signing stay with Gradle so the release build remains
|
|
# F-Droid-reproducible.
|
|
|
|
require "fileutils"
|
|
require "tmpdir"
|
|
|
|
default_platform(:android)
|
|
|
|
ROOT = File.expand_path("..", __dir__)
|
|
METADATA = File.join(ROOT, "fastlane/metadata/android")
|
|
|
|
# Graphics are committed once, under en-US (F-Droid's fallback). Play falls back
|
|
# to its *default language*, en-US for this app; if that ever differs
|
|
# (PLAY_DEFAULT_LOCALE), the listing lane copies the graphics across.
|
|
IMAGE_LOCALE = "en-US"
|
|
|
|
platform :android do
|
|
desc "Upload an already-built, already-signed AAB to Play"
|
|
lane :deploy do |options|
|
|
aab = File.expand_path(options[:aab] || "app/build/outputs/bundle/release/app-release.aab", ROOT)
|
|
UI.user_error!("AAB not found at #{aab}") unless File.exist?(aab)
|
|
|
|
supply(
|
|
aab: aab,
|
|
metadata_path: METADATA,
|
|
track: options[:track] || "production",
|
|
release_status: options[:release_status] || "completed",
|
|
# The APK belongs to F-Droid and the Codeberg download.
|
|
skip_upload_apk: true,
|
|
# The listing goes through the `listing` lane, deliberately; overwriting
|
|
# a live listing by accident triggers a Play review.
|
|
skip_upload_metadata: true,
|
|
skip_upload_images: true,
|
|
skip_upload_screenshots: true,
|
|
# "What's New" tracks every release, from every locale's
|
|
# changelogs/<versionCode>.txt — the same files F-Droid shows.
|
|
skip_upload_changelogs: false,
|
|
validate_only: options[:dry_run].to_s == "true",
|
|
)
|
|
end
|
|
|
|
desc "Push listing text and graphics from the repo to Play"
|
|
desc " dry_run:true validate against the API and discard the edit"
|
|
lane :listing do |options|
|
|
sh("python3", File.join(ROOT, "scripts/check_store_listing.py"), "--complete")
|
|
|
|
default_locale = ENV["PLAY_DEFAULT_LOCALE"] || IMAGE_LOCALE
|
|
|
|
Dir.mktmpdir("play-listing") do |staged|
|
|
FileUtils.cp_r("#{METADATA}/.", staged)
|
|
src = File.join(staged, IMAGE_LOCALE, "images")
|
|
dst = File.join(staged, default_locale, "images")
|
|
FileUtils.cp_r(src, dst) if default_locale != IMAGE_LOCALE && !File.exist?(dst)
|
|
|
|
supply(
|
|
metadata_path: staged,
|
|
skip_upload_aab: true,
|
|
skip_upload_apk: true,
|
|
skip_upload_metadata: false,
|
|
# "What's New" belongs to a release on a track, not to the listing.
|
|
skip_upload_changelogs: true,
|
|
skip_upload_images: false,
|
|
skip_upload_screenshots: false,
|
|
# Only re-upload graphics whose content changed.
|
|
sync_image_upload: true,
|
|
validate_only: options[:dry_run].to_s == "true",
|
|
)
|
|
end
|
|
end
|
|
end
|