Compare commits
22
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a1590e028c | ||
|
|
08c297f30a | ||
|
|
1d6c2a0d59 | ||
|
|
2a1230c0ca | ||
|
|
cd3b33c959 | ||
|
|
8175d58dcd | ||
|
|
05696b2991 | ||
|
|
23f6156e71 | ||
|
|
c1b65c0c86 | ||
|
|
b5ac279b94 | ||
|
|
8fba3f01a4 | ||
|
|
3b73dd4c53 | ||
|
|
01850a7b74 | ||
|
|
28e646fb31 | ||
|
|
6e3cc4bdbd | ||
|
|
b6185ed53c | ||
|
|
9338c64dc7 | ||
|
|
9a72fb0880 | ||
|
|
24e978efc3 | ||
|
|
2740dd5562 | ||
|
|
8dbfd07d10 | ||
|
|
3e1a84ab7d |
@@ -195,6 +195,15 @@ jobs:
|
|||||||
if: steps.scope.outputs.code == 'true'
|
if: steps.scope.outputs.code == 'true'
|
||||||
run: ./gradlew assembleDebug
|
run: ./gradlew assembleDebug
|
||||||
|
|
||||||
|
# Debug builds aren't minified, so a keep rule that drops a reflectively
|
||||||
|
# created class's constructor only breaks release builds (#1, #75). The
|
||||||
|
# releaseTest twin is R8-shrunk with the release rules and debug-signed.
|
||||||
|
- name: R8 keeps reflective constructors
|
||||||
|
if: steps.scope.outputs.code == 'true'
|
||||||
|
run: |
|
||||||
|
./gradlew assembleFullReleaseTest
|
||||||
|
python3 scripts/check_r8_keeps.py
|
||||||
|
|
||||||
- name: Trivy filesystem scan
|
- name: Trivy filesystem scan
|
||||||
if: steps.scope.outputs.code == 'true'
|
if: steps.scope.outputs.code == 'true'
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ All notable changes to this project are documented here. The format follows
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [1.2.0] - 2026-10-26
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
- A reminder can count from the task's start as well as from its due date, and
|
- 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
|
tasks with only a start date get reminders too. Default reminders can mix
|
||||||
@@ -55,6 +57,8 @@ All notable changes to this project are documented here. The format follows
|
|||||||
whose dates put a word after the year (#70).
|
whose dates put a word after the year (#70).
|
||||||
- Widgets no longer turn into the Today widget or show "Can't load content"
|
- Widgets no longer turn into the Today widget or show "Can't load content"
|
||||||
after a task is ticked off (#92).
|
after a task is ticked off (#92).
|
||||||
|
- Ticking off a task in the Tasks and Up next widgets now works in release
|
||||||
|
builds; until now the tap did nothing (#75).
|
||||||
- The Tasks widget leaves the same gap under its header as its preview (#86).
|
- The Tasks widget leaves the same gap under its header as its preview (#86).
|
||||||
- The Starts and Due labels in the task form no longer get cut off at large
|
- The Starts and Due labels in the task form no longer get cut off at large
|
||||||
font sizes (#76).
|
font sizes (#76).
|
||||||
|
|||||||
@@ -33,8 +33,8 @@ android {
|
|||||||
// (1.0.x: 1.0.0 -> 10000; from 1.1.0: 1.1.0-beta.1 -> 1010001,
|
// (1.0.x: 1.0.0 -> 10000; from 1.1.0: 1.1.0-beta.1 -> 1010001,
|
||||||
// 1.1.0 -> 1010099), and CI fails if the committed one doesn't match.
|
// 1.1.0 -> 1010099), and CI fails if the committed one doesn't match.
|
||||||
// See docs/RELEASING.md.
|
// See docs/RELEASING.md.
|
||||||
versionCode = 1020002
|
versionCode = 1020099
|
||||||
versionName = "1.2.0-beta.2"
|
versionName = "1.2.0"
|
||||||
|
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
|
|
||||||
|
|||||||
Vendored
+2
-7
@@ -7,8 +7,8 @@
|
|||||||
# nothing calls it directly — Room then throws InstantiationException, reported
|
# nothing calls it directly — Room then throws InstantiationException, reported
|
||||||
# as "Failed to create an instance of ...". This first bit us through a
|
# as "Failed to create an instance of ...". This first bit us through a
|
||||||
# transitive Room (Glance -> WorkManager -> WorkDatabase, built at startup:
|
# transitive Room (Glance -> WorkManager -> WorkDatabase, built at startup:
|
||||||
# issue #1); Glance is gone and Room is now our own task store, so the rule
|
# issue #1); Room is now also our own task store, so the rule matters more,
|
||||||
# matters more, not less — TasksDatabase is built on the first store read.
|
# not less — TasksDatabase is built on the first store read.
|
||||||
-keep class * extends androidx.room.RoomDatabase { <init>(); }
|
-keep class * extends androidx.room.RoomDatabase { <init>(); }
|
||||||
|
|
||||||
# Compose Compiler may keep its own; defaults are fine
|
# Compose Compiler may keep its own; defaults are fine
|
||||||
@@ -20,8 +20,3 @@
|
|||||||
-dontwarn javax.naming.**
|
-dontwarn javax.naming.**
|
||||||
-dontwarn lombok.Generated
|
-dontwarn lombok.Generated
|
||||||
-dontwarn org.slf4j.impl.StaticLoggerBinder
|
-dontwarn org.slf4j.impl.StaticLoggerBinder
|
||||||
|
|
||||||
# Glance maps each widget to its receivers by the provider's class name. R8's
|
|
||||||
# class merging folded the GlanceAppWidget subclasses into one class, so they
|
|
||||||
# all shared a name and redrew each other's slots (#92).
|
|
||||||
-keep class * extends androidx.glance.appwidget.GlanceAppWidget { <init>(); }
|
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
### جديد
|
||||||
|
- يمكن أن يُحسب التذكير من بدء المهمة أو من موعد الاستحقاق.
|
||||||
|
- يمكن لمهام اليوم الكامل أن تحمل تذكيرات في أوقات محددة.
|
||||||
|
- يمكن للتطبيقات الأخرى قراءة مهامك المحلية وتعديلها عبر OpenTasks، بإذنك.
|
||||||
|
|
||||||
|
### تغييرات
|
||||||
|
- تُزامَن التذكيرات كـ VALARM، فترنّ أيضًا في تذكيرات Apple وThunderbird وtasks.org.
|
||||||
|
|
||||||
|
### إصلاحات
|
||||||
|
- تعمل الأدوات مجددًا بعد إنجاز المهام.
|
||||||
|
- عاد تسجيل الدخول بالبريد الإلكتروني يعمل لدى mailbox.org وPosteo.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Agendula تطبيق مهام حديث ومفتوح المصدر لنظام Android.
|
||||||
|
|
||||||
|
زامن مهامك عبر CalDAV: أضف حساب Nextcloud أو Radicale أو Baïkal أو أي حساب CalDAV آخر، واختر قوائم المهام التي تريد مزامنتها. أو احتفظ بكل شيء على الهاتف، فـ Agendula يخزّن مهامك بنفسه، دون حساب ودون تثبيت أي شيء آخر.
|
||||||
|
|
||||||
|
هل تستخدم OpenTasks أو tasks.org؟ اربط Agendula بذلك التطبيق لتظهر المهام التي يزامنها DAVx5 أو ما يشبهه كما هي، وانسخها إلى تخزين Agendula الخاص متى شئت من الإعدادات ← التخزين.
|
||||||
|
|
||||||
|
ما يقدمه: قوائم تديرها داخل التطبيق، تواريخ الاستحقاق والبدء، مهام اليوم الكامل، مهام فرعية، أولويات، نسبة الإنجاز، مهام متكررة يمكنك تعديل موعد واحد منها، عدة تذكيرات لكل مهمة مع الغفوة، استيراد iCalendar وتصديره، أداة للشاشة الرئيسية، اختصارات المشغّل، وبلاطة في الإعدادات السريعة.
|
||||||
|
|
||||||
|
التصميم Material 3 Expressive حقيقي في كل مكان، مع ألوان ديناميكية وحركة وأشكال معبّرة.
|
||||||
|
|
||||||
|
الخصوصية: لا قياس عن بُعد، ولا تحليلات، ولا إعلانات. لا يتصل Agendula بالإنترنت إلا للمزامنة مع حسابات CalDAV التي تضيفها. ودون حساب، لا تغادر مهامك الجهاز إلا إذا صدّرتها.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
تطبيق مهام بتصميم Material 3 Expressive مع مزامنة CalDAV.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Agendula: Tasks
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
### Nové
|
||||||
|
- Připomínky se mohou počítat od začátku úkolu i od termínu.
|
||||||
|
- Celodenní úkoly mohou mít připomínky v pevný čas.
|
||||||
|
- Jiné aplikace mohou s vaším svolením číst a upravovat místní úkoly přes OpenTasks.
|
||||||
|
|
||||||
|
### Změny
|
||||||
|
- Připomínky se synchronizují jako VALARM a zvoní i v Připomínkách Apple, Thunderbirdu a tasks.org.
|
||||||
|
|
||||||
|
### Opravy
|
||||||
|
- Widgety opět fungují po odškrtnutí úkolu.
|
||||||
|
- Přihlášení e-mailem u mailbox.org a Posteo opět funguje.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Agendula je moderní open-source aplikace na úkoly pro Android.
|
||||||
|
|
||||||
|
Synchronizujte úkoly přes CalDAV: přidejte účet Nextcloud, Radicale, Baïkal nebo jiný CalDAV účet a vyberte, které seznamy úkolů se mají synchronizovat. Nebo nechte vše v telefonu. Agendula si úkoly ukládá sama, bez účtu a bez instalace čehokoli dalšího.
|
||||||
|
|
||||||
|
Už používáte OpenTasks nebo tasks.org? Nasměrujte Agendulu na tuto aplikaci, aby se úkoly synchronizované přes DAVx5 a podobně zobrazily tak, jak jsou, a kdykoli si je zkopírujte do vlastního úložiště Agenduly v Nastavení → Úložiště.
|
||||||
|
|
||||||
|
Co umí: seznamy spravované přímo v aplikaci, termíny a data začátku, celodenní úkoly, podúkoly, priority, průběh, opakované úkoly s možností upravit jediný výskyt, více připomínek na úkol s odložením, import a export iCalendar, widget na plochu, zkratky spouštěče a dlaždici Rychlého nastavení.
|
||||||
|
|
||||||
|
Design je skrz naskrz Material 3 Expressive, s dynamickými barvami a expresivními animacemi a tvary.
|
||||||
|
|
||||||
|
Soukromí: žádná telemetrie, žádná analytika, žádné reklamy. Agendula se připojuje k internetu jen kvůli synchronizaci s CalDAV účty, které sami přidáte. Bez účtu vaše úkoly zařízení neopustí, pokud je sami neexportujete.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Úkolníček v Material 3 Expressive se synchronizací CalDAV.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Agendula: Tasks
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
### Neu
|
||||||
|
- Erinnerungen können ab dem Start oder ab der Fälligkeit zählen.
|
||||||
|
- Ganztägige Aufgaben können Erinnerungen zu festen Uhrzeiten haben.
|
||||||
|
- Andere Apps können lokale Aufgaben über OpenTasks lesen und bearbeiten, wenn du es erlaubst.
|
||||||
|
|
||||||
|
### Geändert
|
||||||
|
- Erinnerungen werden als VALARM synchronisiert und klingeln auch in Apple Erinnerungen, Thunderbird und tasks.org.
|
||||||
|
|
||||||
|
### Behoben
|
||||||
|
- Widgets funktionieren wieder nach dem Abhaken.
|
||||||
|
- Die Anmeldung per E-Mail klappt wieder bei mailbox.org und Posteo.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
### Added
|
||||||
|
- Reminders can count from a task's start as well as its due date.
|
||||||
|
- All-day tasks can have reminders at set times, e.g. 09:00 and 17:00.
|
||||||
|
- Other apps can read and edit your local tasks through an OpenTasks provider, with your permission.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Reminders sync as VALARMs, so they also ring in Apple Reminders, Thunderbird and tasks.org.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Widgets work again after ticking off tasks.
|
||||||
|
- Signing in by email works again for mailbox.org and Posteo.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
### Added
|
||||||
|
- Reminders can count from a task's start as well as its due date.
|
||||||
|
- All-day tasks can have reminders at set times, e.g. 09:00 and 17:00.
|
||||||
|
- Other apps can read and edit your local tasks through an OpenTasks provider, with your permission.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Reminders sync as VALARMs, so they also ring in Apple Reminders, Thunderbird and tasks.org.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
- Widgets work again after ticking off tasks.
|
||||||
|
- Signing in by email works again for mailbox.org and Posteo.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
### Nouveautés
|
||||||
|
- Un rappel peut partir du début ou de l'échéance d'une tâche.
|
||||||
|
- Rappels à heure fixe pour les tâches sur la journée.
|
||||||
|
- Avec votre accord, d'autres applis peuvent lire et modifier vos tâches locales via OpenTasks.
|
||||||
|
|
||||||
|
### Modifications
|
||||||
|
- Les rappels se synchronisent en VALARM et sonnent aussi dans Rappels d'Apple, Thunderbird et tasks.org.
|
||||||
|
|
||||||
|
### Corrections
|
||||||
|
- Les widgets marchent de nouveau après une tâche cochée.
|
||||||
|
- La connexion par e-mail marche de nouveau avec mailbox.org et Posteo.
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Agendula est une appli de tâches moderne et open source pour Android.
|
||||||
|
|
||||||
|
Synchronisez vos tâches via CalDAV : ajoutez un compte Nextcloud, Radicale, Baïkal ou tout autre compte CalDAV et choisissez les listes de tâches à synchroniser. Ou gardez tout sur le téléphone : Agendula stocke vos tâches lui-même, sans compte et sans rien d'autre à installer.
|
||||||
|
|
||||||
|
Vous utilisez déjà OpenTasks ou tasks.org ? Reliez Agendula à cette appli pour que les tâches synchronisées par DAVx5 ou similaire s'affichent telles quelles, et copiez-les quand vous voulez dans le stockage propre d'Agendula, sous Réglages → Stockage.
|
||||||
|
|
||||||
|
Ce qu'il fait : listes gérées dans l'appli, dates d'échéance et de début, tâches sur toute la journée, sous-tâches, priorités, avancement, tâches récurrentes dont vous pouvez modifier une seule occurrence, plusieurs rappels par tâche avec report, import et export iCalendar, un widget d'écran d'accueil, des raccourcis de lanceur et une tuile de Réglages rapides.
|
||||||
|
|
||||||
|
Le design est du vrai Material 3 Expressive de bout en bout, avec couleurs dynamiques, animations et formes expressives.
|
||||||
|
|
||||||
|
Confidentialité : pas de télémétrie, pas d'analytique, pas de publicité. Agendula ne se connecte que pour synchroniser les comptes CalDAV que vous ajoutez. Sans compte, vos tâches ne quittent l'appareil que si vous les exportez.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Une appli de tâches Material 3 Expressive avec synchro CalDAV.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
Agendula: Tasks
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
### Novidades
|
||||||
|
- Lembretes podem contar a partir do início da tarefa ou do prazo.
|
||||||
|
- Tarefas de dia inteiro podem ter lembretes em horários fixos.
|
||||||
|
- Outros apps podem ler e editar suas tarefas locais via OpenTasks, com sua permissão.
|
||||||
|
|
||||||
|
### Alterações
|
||||||
|
- Lembretes sincronizam como VALARM e tocam também no Lembretes da Apple, Thunderbird e tasks.org.
|
||||||
|
|
||||||
|
### Correções
|
||||||
|
- Widgets voltam a funcionar após marcar tarefas.
|
||||||
|
- O login por e-mail volta a funcionar no mailbox.org e Posteo.
|
||||||
+1
-1
Submodule floret-kit updated: e2b1430ffd...e8d33329c8
@@ -54,7 +54,7 @@ xpp3 = "1.1.6"
|
|||||||
# Parses the raw SRV/TXT answers for RFC 6764 discovery; the lookup itself goes
|
# Parses the raw SRV/TXT answers for RFC 6764 discovery; the lookup itself goes
|
||||||
# through Android's DnsResolver, so it follows the network and Private DNS.
|
# through Android's DnsResolver, so it follows the network and Private DNS.
|
||||||
# BSD-3 — it goes on the attribution screen with the rest.
|
# BSD-3 — it goes on the attribution screen with the rest.
|
||||||
dnsjava = "3.6.3"
|
dnsjava = "3.6.5"
|
||||||
# WebDAV-Push delivery. The connector only: DAVx5 also ships the embedded FCM
|
# 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.
|
# distributor, which pulls in Play Services and would get us flagged on F-Droid.
|
||||||
unifiedpush = "3.3.5"
|
unifiedpush = "3.3.5"
|
||||||
|
|||||||
Executable
+55
@@ -0,0 +1,55 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Fail when R8 keeps one of our classes by name but strips its no-arg constructor.
|
||||||
|
|
||||||
|
A keep rule that names a class but no members keeps the class and lets R8 drop
|
||||||
|
the constructor nothing calls directly. Anything that then instantiates it by
|
||||||
|
reflection (Room, Glance's ActionCallback, WorkManager) fails at runtime only,
|
||||||
|
in release builds only (#1, #75). R8 reports both halves: seeds.txt lists what
|
||||||
|
keep rules pinned, usage.txt what it removed.
|
||||||
|
|
||||||
|
scripts/check_r8_keeps.py [mapping dir] default: fullReleaseTest's
|
||||||
|
"""
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
ROOT = Path(__file__).resolve().parent.parent
|
||||||
|
DEFAULT_DIR = ROOT / "app/build/outputs/mapping/fullReleaseTest"
|
||||||
|
PACKAGES = ("de.jeanlucmakiola.",)
|
||||||
|
|
||||||
|
|
||||||
|
def kept_classes(seeds: Path) -> set[str]:
|
||||||
|
return {
|
||||||
|
line.strip()
|
||||||
|
for line in seeds.read_text().splitlines()
|
||||||
|
if line.startswith(PACKAGES) and ":" not in line
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def classes_without_default_ctor(usage: Path) -> set[str]:
|
||||||
|
stripped, current = set(), None
|
||||||
|
for line in usage.read_text().splitlines():
|
||||||
|
if not line.startswith(" "):
|
||||||
|
current = line.rstrip(":") if line.endswith(":") else None
|
||||||
|
elif current and line.strip().endswith(" <init>()"):
|
||||||
|
stripped.add(current)
|
||||||
|
return stripped
|
||||||
|
|
||||||
|
|
||||||
|
def main() -> int:
|
||||||
|
mapping = Path(sys.argv[1]) if len(sys.argv) > 1 else DEFAULT_DIR
|
||||||
|
seeds, usage = mapping / "seeds.txt", mapping / "usage.txt"
|
||||||
|
if not seeds.exists() or not usage.exists():
|
||||||
|
print(f"ERROR: no seeds.txt/usage.txt in {mapping}; build a minified variant first.", file=sys.stderr)
|
||||||
|
return 1
|
||||||
|
broken = sorted(kept_classes(seeds) & classes_without_default_ctor(usage))
|
||||||
|
for name in broken:
|
||||||
|
print(f"ERROR: {name} is kept by a rule but R8 removed its no-arg constructor.", file=sys.stderr)
|
||||||
|
if broken:
|
||||||
|
print("Keep the constructor too: -keep class ... { <init>(); }", file=sys.stderr)
|
||||||
|
return 1
|
||||||
|
print(f"OK: every kept class under {', '.join(PACKAGES)} still has its no-arg constructor.")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
sys.exit(main())
|
||||||
Reference in New Issue
Block a user