feat: offline flavor without sync or network access (#39)

This commit is contained in:
2026-10-06 18:34:33 +02:00
parent 7fde7ae290
commit 84bb1116ec
107 changed files with 779 additions and 433 deletions
+14 -3
View File
@@ -11,6 +11,12 @@ carries no APK assets.
Codeberg is the canonical forge; Gitea is build infrastructure. See
[Two forges, one repo](#two-forges-one-repo) for how the two are wired.
The app has two product flavors. **`full`** is Agendula as described everywhere
in this document. **`offline`** (`de.jeanlucmakiola.agendula.offline`, issue
#39) has no CalDAV sync, no push and no network permission; every release and
beta builds and signs it too, but it goes **only to Codeberg**, as an extra
`agendula-offline_v<version>.apk` asset. It is not on F-Droid or Play.
Before a stable release you can ship **betas** (`X.Y.Z-beta.N`) from the
release branch. They go to **Codeberg only**, flagged as pre-releases; F-Droid
and Play never see them. See [Cutting a beta](#cutting-a-beta).
@@ -77,7 +83,8 @@ retries).
committed `en-US` changelog.
4. **Verify the release build on a real device** — the mandatory gate:
```sh
scripts/verify-release.sh
scripts/verify-release.sh # full
scripts/verify-release.sh offline # when the release touches the offline flavor
```
It builds the `releaseTest` variant (same R8 config as `release`, debug-signed
with a `.releasetest` suffix so it installs alongside the real app) and resets
@@ -193,7 +200,11 @@ Releases aren't git objects and don't sync with the push mirror in either
direction, so the pipeline pushes the `vX.Y.Z` tag straight to Codeberg, creates
the release over the Codeberg API, and attaches `agendula_v<version>.apk` + its
`.sha256`. It's the same APK the F-Droid repo serves (same **app key**), so it
adds no trust surface. The logic lives in `scripts/publish_codeberg_release.sh`,
adds no trust surface. The offline flavor rides along as
`agendula-offline_v<version>.apk` + `.sha256`; the full APK keeps its old name
because Obtainium filters point at it.
Obtainium users who see both offered can pin one with *Filter APKs by regular
expression* (`^agendula_v` or `^agendula-offline_v`). The logic lives in `scripts/publish_codeberg_release.sh`,
which `beta.yaml` uses too (with the pre-release flag set). It skips cleanly if `CODEBERG_RELEASE_TOKEN` is unset,
but it is **not** `continue-on-error`: through 0.2.1–0.3.2 this step reported
green while never once publishing, which is how a crash-fix release reached
@@ -202,7 +213,7 @@ fails the release loudly.
### Google Play channel
**Artifact.** Play gets an **App Bundle** (`bundleRelease`), never the APK. It is
**Artifact.** Play gets an **App Bundle** (`bundleFullRelease`), never the APK. It is
built from the same source and signing config at the very end of the `release`
job, `continue-on-error`, and handed to the `play` job as a workflow artifact
(via a commit-pinned fork of `upload-artifact`/`download-artifact`; the official
+6
View File
@@ -48,5 +48,11 @@ off the official repo; keep that pattern if the recipe ever changes. Only a chan
recipe itself (a new submodule, a build flag) needs an MR, pinned to a full
commit hash, never a tag.
⚠️ **Product flavors (from 1.1.0).** The app now has `full` and `offline`
flavors, and `gradle: - yes` would build both. The first build entry for a
flavored version must say `gradle: - full`, and `AutoUpdateMode` copies the
last entry forward, so it is a one-time recipe MR before that tag lands. The
offline flavor is not submitted to F-Droid.
The recipe says `License: MIT`; `:dav` is vendored MPL-2.0 (`dav/PROVENANCE.md`).
If the reviewer asks, change it to `MIT AND MPL-2.0`.