Release 1.0.0 (#20)
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
This commit is contained in:
+103
-16
@@ -1,32 +1,73 @@
|
||||
[versions]
|
||||
agp = "9.2.1"
|
||||
kotlin = "2.3.21"
|
||||
ksp = "2.3.9"
|
||||
hilt = "2.59.2"
|
||||
ksp = "2.3.11"
|
||||
hilt = "2.60.1"
|
||||
coreKtx = "1.19.0"
|
||||
appcompat = "1.7.1"
|
||||
lifecycleRuntime = "2.10.0"
|
||||
lifecycleRuntime = "2.11.0"
|
||||
activityCompose = "1.13.0"
|
||||
composeBom = "2026.05.01"
|
||||
# Material 3 Expressive APIs currently live only in the 1.5 alpha line.
|
||||
# Pin explicitly to override the BOM (which ships stable 1.4.0).
|
||||
# Re-evaluate when 1.5.0 stable lands.
|
||||
material3 = "1.5.0-alpha21"
|
||||
material3 = "1.5.0-alpha26"
|
||||
datastore = "1.2.1"
|
||||
junit = "6.1.0"
|
||||
junitPlatform = "6.1.0"
|
||||
# Glance: kept on the same version as Calendula's widgets.
|
||||
glance = "1.2.0"
|
||||
# Room — Agendula's own task store.
|
||||
room = "2.8.4"
|
||||
kotlinxSerialization = "1.8.1"
|
||||
# SAF directory writing for export/backup (DocumentFile).
|
||||
documentfile = "1.1.0"
|
||||
junit = "6.1.3"
|
||||
junitPlatform = "6.1.3"
|
||||
truth = "1.4.5"
|
||||
androidxJunit = "1.3.0"
|
||||
espressoCore = "3.7.0"
|
||||
kotlinxDatetime = "0.7.0"
|
||||
kotlinxCoroutines = "1.10.2"
|
||||
turbine = "1.2.0"
|
||||
hiltNavigationCompose = "1.3.0"
|
||||
# androidx.hilt — one version for the whole group. hilt-work and
|
||||
# hilt-navigation-compose splitting versions inside a group is the kind of thing
|
||||
# that resolves fine and then fails at runtime.
|
||||
androidxHilt = "1.4.0"
|
||||
# WorkManager: sync runs here, triggered *through* the sync-adapter framework.
|
||||
work = "2.11.2"
|
||||
# Custom Tabs, for Nextcloud Login Flow v2.
|
||||
browser = "1.10.0"
|
||||
navigationCompose = "2.9.0"
|
||||
lifecycleCompose = "2.10.0"
|
||||
lifecycleCompose = "2.11.0"
|
||||
androidxTestRules = "1.7.0"
|
||||
# Glance: 1.1.1 is the latest stable (1.2.0 is still rc, 1.3.0 alpha).
|
||||
glance = "1.1.1"
|
||||
|
||||
# --- :dav (vendored dav4jvm) -------------------------------------------------
|
||||
# dav4jvm 2.2.1 is the last OkHttp release; 3.0.0 deleted the OkHttp package for
|
||||
# Ktor and 4.x additionally requires Java 21 bytecode, which we do not target.
|
||||
# See dav/PROVENANCE.md. OkHttp 4.12.0 is what the vendored tree was written
|
||||
# against and what DAVx5 ships.
|
||||
okhttp = "4.12.0"
|
||||
# org.xmlpull.v1 ships in the Android framework, so xpp3 is compileOnly +
|
||||
# testImplementation and never reaches the APK.
|
||||
xpp3 = "1.1.6"
|
||||
|
||||
# --- :caldav (our CalDAV protocol layer) -------------------------------------
|
||||
# SRV/TXT lookups for RFC 6764 discovery. Android's resolver exposes no SRV API
|
||||
# below API 29's DnsResolver (which is callback-only and cannot do TXT paths),
|
||||
# and JNDI's DNS provider does not exist on Android at all. dnsjava is what DAVx5
|
||||
# uses. BSD-3 — it goes on the attribution screen with the rest.
|
||||
dnsjava = "3.6.3"
|
||||
# WebDAV-Push delivery. The connector only: DAVx5 also ships the embedded FCM
|
||||
# distributor, which pulls in Play Services and would get us flagged on F-Droid.
|
||||
unifiedpush = "3.3.5"
|
||||
# The vendored dav4jvm tests and :caldav's are JUnit 4, unlike the app's JUnit 5.
|
||||
junit4 = "4.13.2"
|
||||
|
||||
# RFC 5545 recurrence expansion. The last of the dmfs dependencies: the vendored
|
||||
# `:provider` module that needed the rest was deleted,
|
||||
# and lib-recur stayed because our own store expands a series in process.
|
||||
# Pinned at 0.12.2 — 0.16.0 removed RecurrenceSet. rfc5545-datetime arrives with
|
||||
# it as part of its API surface, so it is not declared separately.
|
||||
dmfsLibRecur = "0.12.2"
|
||||
|
||||
[libraries]
|
||||
# AndroidX core
|
||||
@@ -53,9 +94,23 @@ androidx-compose-material-icons-extended = { group = "androidx.compose.material"
|
||||
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
|
||||
hilt-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt" }
|
||||
|
||||
# Room — the own-store database
|
||||
androidx-room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
|
||||
androidx-room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" }
|
||||
androidx-room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
|
||||
androidx-room-testing = { group = "androidx.room", name = "room-testing", version.ref = "room" }
|
||||
kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerialization" }
|
||||
|
||||
# Glance — the home-screen task widget
|
||||
androidx-glance-appwidget = { group = "androidx.glance", name = "glance-appwidget", version.ref = "glance" }
|
||||
androidx-glance-material3 = { group = "androidx.glance", name = "glance-material3", version.ref = "glance" }
|
||||
|
||||
# DataStore
|
||||
androidx-datastore-preferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "datastore" }
|
||||
|
||||
# SAF — writing the export into a user-chosen folder
|
||||
androidx-documentfile = { group = "androidx.documentfile", name = "documentfile", version.ref = "documentfile" }
|
||||
|
||||
# Unit tests
|
||||
junit-jupiter-api = { group = "org.junit.jupiter", name = "junit-jupiter-api", version.ref = "junit" }
|
||||
junit-jupiter-engine = { group = "org.junit.jupiter", name = "junit-jupiter-engine", version.ref = "junit" }
|
||||
@@ -76,24 +131,56 @@ kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-cor
|
||||
# Test - Flow assertions
|
||||
turbine = { group = "app.cash.turbine", name = "turbine", version.ref = "turbine" }
|
||||
|
||||
# Hilt navigation-compose (for hiltViewModel() in Composables)
|
||||
androidx-hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hiltNavigationCompose" }
|
||||
# Hilt navigation-compose (hiltViewModel() moved out of it in 1.4.0, into
|
||||
# hilt-lifecycle-viewmodel-compose — which it still brings in transitively, but
|
||||
# we call that API directly, so it is declared here rather than inherited)
|
||||
androidx-hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "androidxHilt" }
|
||||
androidx-hilt-lifecycle-viewmodel-compose = { group = "androidx.hilt", name = "hilt-lifecycle-viewmodel-compose", version.ref = "androidxHilt" }
|
||||
androidx-hilt-work = { group = "androidx.hilt", name = "hilt-work", version.ref = "androidxHilt" }
|
||||
androidx-hilt-compiler = { group = "androidx.hilt", name = "hilt-compiler", version.ref = "androidxHilt" }
|
||||
androidx-work-runtime-ktx = { group = "androidx.work", name = "work-runtime-ktx", version.ref = "work" }
|
||||
androidx-browser = { group = "androidx.browser", name = "browser", version.ref = "browser" }
|
||||
|
||||
# Navigation-compose (the NavHost / back stack)
|
||||
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }
|
||||
|
||||
# Lifecycle compose (for collectAsStateWithLifecycle)
|
||||
androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycleCompose" }
|
||||
|
||||
# Glance — Jetpack home-screen widgets (Compose-like RemoteViews)
|
||||
androidx-glance-appwidget = { group = "androidx.glance", name = "glance-appwidget", version.ref = "glance" }
|
||||
androidx-glance-material3 = { group = "androidx.glance", name = "glance-material3", version.ref = "glance" }
|
||||
# ProcessLifecycleOwner — the WAL checkpoint hangs off ON_STOP.
|
||||
androidx-lifecycle-process = { group = "androidx.lifecycle", name = "lifecycle-process", version.ref = "lifecycleRuntime" }
|
||||
|
||||
# Android tests - GrantPermissionRule
|
||||
androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidxTestRules" }
|
||||
|
||||
unifiedpush-connector = { group = "org.unifiedpush.android", name = "connector", version.ref = "unifiedpush" }
|
||||
|
||||
# :dav — vendored dav4jvm (see dav/PROVENANCE.md)
|
||||
okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" }
|
||||
okhttp-mockwebserver = { group = "com.squareup.okhttp3", name = "mockwebserver", version.ref = "okhttp" }
|
||||
# Test-only: MockWebServer over TLS, so an HTTPS-only code path can be exercised.
|
||||
okhttp-tls = { group = "com.squareup.okhttp3", name = "okhttp-tls", version.ref = "okhttp" }
|
||||
xpp3 = { group = "org.ogce", name = "xpp3", version.ref = "xpp3" }
|
||||
|
||||
# :caldav — RFC 6764 service discovery
|
||||
dnsjava = { group = "dnsjava", name = "dnsjava", version.ref = "dnsjava" }
|
||||
junit4 = { group = "junit", name = "junit", version.ref = "junit4" }
|
||||
|
||||
# Recurrence expansion for our own store
|
||||
dmfs-lib-recur = { group = "org.dmfs", name = "lib-recur", version.ref = "dmfsLibRecur" }
|
||||
|
||||
# floret-kit — the shared house library, an included build (see settings.gradle.kts).
|
||||
# Deliberately version-less: the composite build substitutes these coordinates
|
||||
# with the submodule's own projects, so a version here would be fiction.
|
||||
floret-core-time = { group = "de.jeanlucmakiola.floret", name = "core-time" }
|
||||
floret-core-reminders = { group = "de.jeanlucmakiola.floret", name = "core-reminders" }
|
||||
floret-core-locale = { group = "de.jeanlucmakiola.floret", name = "core-locale" }
|
||||
floret-core-crash = { group = "de.jeanlucmakiola.floret", name = "core-crash" }
|
||||
floret-identity = { group = "de.jeanlucmakiola.floret", name = "identity" }
|
||||
floret-components = { group = "de.jeanlucmakiola.floret", name = "components" }
|
||||
|
||||
[plugins]
|
||||
android-application = { id = "com.android.application", version.ref = "agp" }
|
||||
android-library = { id = "com.android.library", version.ref = "agp" }
|
||||
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
|
||||
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
|
||||
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
|
||||
|
||||
Reference in New Issue
Block a user