Files
agendula/CHANGELOG.md
T
7c943f4831
Beta — Codeberg pre-release / detect (push) Successful in 5s
Beta — Codeberg pre-release / beta (push) Skipped
Start-based reminders and timed all-day reminders (#72, #78) (#88)
Reminders can count from a task's start as well as its due date (#72), and each reminder on an all-day task can have its own time (#78).

## Changes
- A reminder counts from the start or the due date. Tasks with only a start date get reminders. Defaults in Settings can mix both, globally and per list.
- Each reminder on an all-day task can have its own time of day. Reminders without one ring at the all-day time set in Settings. 00:00 can't be stored, so it becomes 00:01.
- The editor shows the defaults a new task, or a newly added date, will get, and keeps them in step with dates, list and all-day until you change a reminder. What it shows is what gets saved. Removing the shown defaults now leaves the task without a reminder (Room store only; OpenTasks mode still falls back to the default).
- Switching between timed and all-day converts the reminders right away in the editor. Switching straight back restores them.
- Labels name the date when a task has both: "15 minutes before the start", "On the due date at 09:00". New reminders preselect the start.
- Defaults that have already passed don't ring when the task is saved.
- Sync: reminders rounded to whole days by builds before 1.2 pick up their real time of day on the next download.

## Deviations from the issues
- The start/due anchor lives in floret-kit (`ReminderLead`, floret-kit#19) rather than being packed into minute values. That PR is additive, so Calendula is unaffected.
- `error_reminder_without_due` was renamed to `error_reminder_without_date`, and the "(before start)/(before due)" strings were replaced by full sentences. The stale keys were deleted from the translation files so lint passes, and Weblate needs to offer the new strings to translators.
- The dead single-reminder API (`setAlarm`, `alarms()`, `editable()`, `reminderFor`) was removed.
- `AlarmLift` is back to its frozen 2→3 migration state.

## Release branch
`release/v1.2.0` is merged into this branch. Through it, this PR also brings main's commits the release branch was missing, including the reminder sync from #81 that this work builds on. I resolved conflicts in the data source interface, `TaskAlarmDao`, CHANGELOG, PRIVACY.md and the floret-kit pointer by keeping both sides.

Closes #72
Closes #78

Co-authored-by: Weblate <noreply-mt-weblate@weblate.org>
Co-authored-by: Sup99999 <alelmnour1o234@proton.me>
Co-authored-by: Robin Schanbacher <robin@schanbros.de>
Co-authored-by: Knee8811 <mk-weby@protonmail.com>
Co-authored-by: Sonja Kraus <klein.felix@pm.me>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: Jean-Luc Makiola <business@jeanlucmakiola.de>
Reviewed-on: https://codeberg.org/jlmakiola/agendula/pulls/88
2026-10-21 18:40:28 +02:00

11 KiB

Changelog

All notable changes to this project are documented here. The format follows Keep a Changelog; the versionName committed in app/build.gradle.kts is the source of truth for a release (see docs/RELEASING.md), and the vX.Y.Z tag is minted by the pipeline.

[Unreleased]

Added

  • A reminder can count from the task's start as well as from its due date, and tasks with only a start date get reminders too. Default reminders can mix both, e.g. a day before the start and an hour before the due date; each applies to tasks that have its date (#72).
  • An all-day task's reminders can each have their own time, so one task can remind you at 09:00 and again at 17:00 (#78).
  • Other apps can read the tasks kept in Agendula's own database through an OpenTasks-compatible provider, once you grant them permission. Apps that already support OpenTasks or tasks.org need only a small change to support Agendula too (#43).
  • With a second permission, other apps can also add, edit, complete and delete those tasks, including their reminders and tags. They can tick off a single occurrence of a recurring task. Task lists stay read-only for them (#63).

Changed

  • A new task no longer takes a default reminder whose time has already passed, so a start of "today" does not ring the moment the task is saved.
  • All-day default reminders are whole days; one set in hours rounds to the nearest day.
  • Switching a task between timed and all-day converts its reminders right away in the editor, so what you see is what gets saved.
  • The editor shows the default reminders a new task, or a newly added date, will get, before you save. Removing them leaves the task without a reminder instead of falling back to the default.
  • Reminders now sync. A reminder set on a task is uploaded as a standard alarm (VALARM), so it also notifies in macOS and iOS Reminders, Thunderbird, tasks.org and jtx Board, and alarms set in those apps now fire in Agendula instead of the default reminder. Removing a task's alarm in another app turns it off here too, rather than falling back to the default (#52).
  • A new task with a date, or one that gets a new date, takes the default reminder for that date as its own, so it travels with the task to the server. Changing the default later no longer changes those tasks; tasks that rely on the default today are left as they are.
  • On upgrade, reminders on open, synced tasks that so far stayed on this device are uploaded once.
  • Alarms imported from an .ics file become reminders on the task.
  • Screens now open and close the way they do in Calendula: they slide in, and a back swipe previews the screen behind before closing (#66).
  • Settings now use Calendula's names and layout. Reminders is now Notifications, Task form is now New task form, and export and import moved out of Storage into a new Backup & restore section (#66).

[1.1.0] - 2026-10-10

Added

  • Four new home-screen widgets: Today, Up next, Lists and Week.
  • A widget can show tasks from several lists at once, optionally grouped by list.
  • A setting under Settings → Task form pre-fills a new task's start with today.
  • An offline version of Agendula with no sync and no network access at all, published as a separate APK on Codeberg (#39).
  • Tags. Add them while editing a task, see them on the task and in lists, browse them from the home screen and filter any list by them. They are saved as CATEGORIES, so they sync with Nextcloud Tasks, tasks.org and DAVx⁵ (#35).
  • Filters. Save your own view of the open tasks by due date (overdue, today, upcoming, no date, in any combination), lists, tags and minimum priority. They live on the home screen and can be shown in the Tasks widget, so today and overdue tasks can now share one widget (#47).

Changed

  • The Tasks widget has agenda-style rows, an optional row colour and an "All caught up" state. Ticking a task in any widget shows it as done for a moment before it disappears.
  • The "At a glance" widget is gone; the Tasks and Today widgets cover what it showed.
  • Synced lists can be renamed and deleted, not only device-only ones. A read-only share shows the edit button greyed out and explains why on tap.
  • The sort button in task lists now opens "Sort and filter", which can also filter by tag.
  • While editing a task, its title moves into the top bar once you scroll past it.

Fixed

  • The list editor's Where and smart-lists rows no longer have double padding.
  • A field you tap now scrolls fully above the keyboard, and the "add subtask" row in task lists no longer ends up hidden behind it.
  • All-day tasks west of UTC no longer show up a day early in Overdue, Today and Upcoming.

[1.0.0] - 2026-09-21

Added

  • CalDAV sync built in: Nextcloud, Radicale, Baïkal and more.
  • Agendula keeps your tasks itself, no other app needed. Copy them over from OpenTasks or tasks.org in Settings → Storage.
  • Repeating tasks, several reminders per task, lists managed in the app, iCalendar import and export, a home-screen widget and a Quick Settings tile.

Changed

  • New settings for all-day reminders, snooze length, sync interval, time format and week start.

[0.4.0] - 2026-08-31

Added

  • Agendula now speaks German and Brazilian Portuguese, the first community translations. Pick one under Settings → App language, or in Android's own per-app language settings; leave it on System default and Agendula follows your phone. Anything not yet translated falls back to English.
  • Agendula can now be translated. Pick or request a language on Weblate and translate in the browser — the link sits at the top of the language picker in Settings → App language. Partial translations are fine; anything untranslated falls back to English.

Changed

  • Agendula's home is now Codeberg (jlmakiola/agendula) — that's where the source, issues, pull requests and releases live. The Source and License links in Settings, the issue-reporting link and the F-Droid metadata all point there now. The self-hosted Gitea instance stays as build infrastructure.

[0.3.2] - 2026-07-20

Fixed

  • Releases reach the Codeberg download channel again. 0.3.1 published to F-Droid but never appeared on Codeberg, so if you install from there — or through Obtainium — this is the release that finally carries 0.3.0's launch-crash fix. The app itself is unchanged from 0.3.1.

[0.3.1] - 2026-07-20

Fixed

  • Agendula no longer crashes on launch. Every 0.3.0 install was affected: the release build stripped a constructor that the background-work scheduler needs to open its database, and that happens before the app draws anything.

[0.3.0] - 2026-07-19

Added

  • Reminders: Agendula now delivers your due reminders itself. A one-time setup step explains this and asks for notification access, and a master switch in Settings turns the whole thing off again.
  • A Settings screen, from the gear on the overview: appearance and theme, which fields the task form shows, your default list, and reminder defaults.
  • The overview leads with Today — a progress ring showing how much of today you've finished — followed by a live preview of what's coming up next.
  • Search across every task, open or completed, from the top bar.
  • A proper app icon.

Changed

  • A tidier top bar: no app title, with search and settings pinned to the right.

[0.2.2] - 2026-07-19

Fixed

  • Release automation now reliably mirrors each release to the Codeberg mirror (signed APK + SHA-256 checksum). The 0.2.1 attempt failed when the release tag had already been synced to Codeberg.

[0.2.1] - 2026-07-19

Added

  • Releases are now also published to the Codeberg mirror as a direct download: each release carries the signed APK plus a SHA-256 checksum, for users who don't use F-Droid.

[0.2.0] - 2026-06-27

Added

  • M2 Material 3 Expressive UI — the app is fully navigable now: the provider/permission onboarding gate, the lists overview (smart lists + user lists grouped by account), and the task list (swipe-to-complete / -delete, inline add, smart-list section headers), detail, and create/edit screens, all wired to the M1 ViewModels.
  • M3 detail/edit polish: a "Progress" slider (percent-complete, 5% detents, written to Tasks.PERCENT_COMPLETE) and conflict-safe saves — updateTask re-checks the provider's last_modified against the value captured when the form loaded and surfaces an overwrite-or-cancel prompt instead of clobbering an external change (e.g. a DAVx5 sync).
  • M4 subtasks (UI): reparent — a full-width, searchable "Parent task" sheet on the edit form, with candidates grouped by due-date section, files a task under any active top-level task in its list (or "None" to promote it); switching list clears the now-invalid parent. Tapping a subtask in the detail screen opens its own detail, which shows a "Part of …" parent card. On the task list a parent has a dedicated expand button that reveals its children as a nested grouped run, ending with an inline "add a subtask" row (an opt-out toggle is planned for the M6 settings screen).
  • Priority is coloured by level (green / amber / red pastels) on the list, detail, and edit screens.

Fixed

  • Overview open-counts now count top-level tasks only, so subtasks — and especially open subtasks under a completed parent — no longer inflate a list's "N open" or the smart-list counts.
  • Swipe-to-delete now reveals its red background + icon as you drag (tracking the live direction, not just the settled target), and a floating "Deleted · Undo" chip defers the actual delete so it can be restored.

[0.1.0] - 2026-06-18

Added

  • M1 data layer + logic ("backoffice"): the full non-visual stack over the OpenTasks TaskContract provider (authority resolved at runtime — org.tasks.opentasks for tasks.org, org.dmfs.tasks for OpenTasks).
    • Vendored TaskContract subset, ProviderResolver, ColumnReader, mappers, AndroidTasksDataSource (Instances query + ContentObserver), and TasksRepository exposing live Flows of lists/tasks/detail.
    • Domain models, smart-list filtering (Today/Upcoming/Overdue/No-date/All/ Completed), sorting, form validation, sub-tasks via parent_id.
    • Self-scheduled due-reminder engine (AlarmManager + boot/provider-change re-sync), notifications, DataStore prefs.
    • Render-only ViewModels + UiState for every screen (lists, task list, detail, edit, settings, permission) so the UI is build-only.
    • 24 JVM unit tests (mappers, filtering, sorting, form, value mapping, day windows). RootScreen is a functional scaffold over the real data, to be replaced screen-by-screen with the Material 3 Expressive design.
  • M0 skeleton: project scaffolding copied from Calendula (Gradle, version catalog, Hilt, Material 3 Expressive theme, Gitea CI/release workflows), reseeded to a warm-mauve palette. Builds and shows a themed placeholder.