Compare commits
3 Commits
v0.6.0
...
0013c9f3b1
| Author | SHA1 | Date | |
|---|---|---|---|
| 0013c9f3b1 | |||
| bd6ad4ae5f | |||
| 3697a58e5b |
@@ -6,7 +6,11 @@ on:
|
|||||||
- '**'
|
- '**'
|
||||||
tags-ignore:
|
tags-ignore:
|
||||||
- '**'
|
- '**'
|
||||||
pull_request:
|
|
||||||
|
# Cancel superseded runs on the same branch.
|
||||||
|
concurrency:
|
||||||
|
group: ci-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
ci:
|
ci:
|
||||||
@@ -26,30 +30,25 @@ jobs:
|
|||||||
|
|
||||||
- name: Setup Android SDK
|
- name: Setup Android SDK
|
||||||
uses: android-actions/setup-android@v3
|
uses: android-actions/setup-android@v3
|
||||||
|
with:
|
||||||
|
# Default ("tools platform-tools") drags in the Android Emulator
|
||||||
|
# (~300 MB) which the build never uses.
|
||||||
|
packages: ''
|
||||||
|
|
||||||
|
- name: Setup Android SDK cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: /opt/android-sdk
|
||||||
|
key: ${{ runner.os }}-android-sdk-37-36.0.0
|
||||||
|
|
||||||
- name: Install Android SDK packages
|
- name: Install Android SDK packages
|
||||||
run: |
|
run: |
|
||||||
yes | sdkmanager --licenses >/dev/null || true
|
yes | sdkmanager --licenses >/dev/null || true
|
||||||
sdkmanager \
|
sdkmanager \
|
||||||
"platform-tools" \
|
"platform-tools" \
|
||||||
"platforms;android-36" \
|
|
||||||
"platforms;android-37.0" \
|
"platforms;android-37.0" \
|
||||||
"build-tools;36.0.0"
|
"build-tools;36.0.0"
|
||||||
|
|
||||||
- name: Install jq
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
SUDO=""
|
|
||||||
if command -v sudo >/dev/null 2>&1; then
|
|
||||||
SUDO="sudo"
|
|
||||||
fi
|
|
||||||
if command -v apt-get >/dev/null 2>&1; then
|
|
||||||
$SUDO apt-get update
|
|
||||||
$SUDO apt-get install -y jq
|
|
||||||
elif command -v apk >/dev/null 2>&1; then
|
|
||||||
$SUDO apk add --no-cache jq
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Setup Gradle cache
|
- name: Setup Gradle cache
|
||||||
uses: actions/cache@v4
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
@@ -63,16 +62,19 @@ jobs:
|
|||||||
- name: Grant execute permission for gradlew
|
- name: Grant execute permission for gradlew
|
||||||
run: chmod +x ./gradlew
|
run: chmod +x ./gradlew
|
||||||
|
|
||||||
|
# No --no-daemon: the daemon lives only as long as this job container
|
||||||
|
# and lets the following steps skip JVM startup + reconfiguration.
|
||||||
- name: Lint (debug variant only)
|
- name: Lint (debug variant only)
|
||||||
run: ./gradlew lintDebug --no-daemon
|
run: ./gradlew lintDebug
|
||||||
|
|
||||||
- name: Unit tests
|
- name: Unit tests
|
||||||
run: ./gradlew testDebugUnitTest --no-daemon
|
run: ./gradlew testDebugUnitTest
|
||||||
|
|
||||||
- name: Assemble debug APK
|
- name: Assemble debug APK
|
||||||
run: ./gradlew assembleDebug --no-daemon
|
run: ./gradlew assembleDebug
|
||||||
|
|
||||||
- name: Trivy filesystem scan
|
- name: Trivy filesystem scan
|
||||||
|
if: github.ref == 'refs/heads/main'
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
SUDO=""
|
SUDO=""
|
||||||
|
|||||||
@@ -24,16 +24,33 @@ jobs:
|
|||||||
|
|
||||||
- name: Setup Android SDK
|
- name: Setup Android SDK
|
||||||
uses: android-actions/setup-android@v3
|
uses: android-actions/setup-android@v3
|
||||||
|
with:
|
||||||
|
packages: ''
|
||||||
|
|
||||||
|
- name: Setup Android SDK cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: /opt/android-sdk
|
||||||
|
key: ${{ runner.os }}-android-sdk-37-36.0.0
|
||||||
|
|
||||||
- name: Install Android SDK packages
|
- name: Install Android SDK packages
|
||||||
run: |
|
run: |
|
||||||
yes | sdkmanager --licenses >/dev/null || true
|
yes | sdkmanager --licenses >/dev/null || true
|
||||||
sdkmanager \
|
sdkmanager \
|
||||||
"platform-tools" \
|
"platform-tools" \
|
||||||
"platforms;android-36" \
|
|
||||||
"platforms;android-37.0" \
|
"platforms;android-37.0" \
|
||||||
"build-tools;36.0.0"
|
"build-tools;36.0.0"
|
||||||
|
|
||||||
|
- name: Setup Gradle cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.gradle/caches
|
||||||
|
~/.gradle/wrapper
|
||||||
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', 'gradle/libs.versions.toml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gradle-
|
||||||
|
|
||||||
- name: Grant execute permission for gradlew
|
- name: Grant execute permission for gradlew
|
||||||
run: chmod +x ./gradlew
|
run: chmod +x ./gradlew
|
||||||
|
|
||||||
@@ -42,10 +59,10 @@ jobs:
|
|||||||
# any tag-resolved drift (e.g. version code substitution issues).
|
# any tag-resolved drift (e.g. version code substitution issues).
|
||||||
|
|
||||||
- name: Unit tests
|
- name: Unit tests
|
||||||
run: ./gradlew testDebugUnitTest --no-daemon
|
run: ./gradlew testDebugUnitTest
|
||||||
|
|
||||||
- name: Assemble debug APK (sanity)
|
- name: Assemble debug APK (sanity)
|
||||||
run: ./gradlew assembleDebug --no-daemon
|
run: ./gradlew assembleDebug
|
||||||
|
|
||||||
build-and-deploy:
|
build-and-deploy:
|
||||||
needs: ci
|
needs: ci
|
||||||
@@ -65,16 +82,33 @@ jobs:
|
|||||||
|
|
||||||
- name: Setup Android SDK
|
- name: Setup Android SDK
|
||||||
uses: android-actions/setup-android@v3
|
uses: android-actions/setup-android@v3
|
||||||
|
with:
|
||||||
|
packages: ''
|
||||||
|
|
||||||
|
- name: Setup Android SDK cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: /opt/android-sdk
|
||||||
|
key: ${{ runner.os }}-android-sdk-37-36.0.0
|
||||||
|
|
||||||
- name: Install Android SDK packages
|
- name: Install Android SDK packages
|
||||||
run: |
|
run: |
|
||||||
yes | sdkmanager --licenses >/dev/null || true
|
yes | sdkmanager --licenses >/dev/null || true
|
||||||
sdkmanager \
|
sdkmanager \
|
||||||
"platform-tools" \
|
"platform-tools" \
|
||||||
"platforms;android-36" \
|
|
||||||
"platforms;android-37.0" \
|
"platforms;android-37.0" \
|
||||||
"build-tools;36.0.0"
|
"build-tools;36.0.0"
|
||||||
|
|
||||||
|
- name: Setup Gradle cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.gradle/caches
|
||||||
|
~/.gradle/wrapper
|
||||||
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', 'gradle/libs.versions.toml') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gradle-
|
||||||
|
|
||||||
- name: Install jq
|
- name: Install jq
|
||||||
run: |
|
run: |
|
||||||
set -e
|
set -e
|
||||||
@@ -121,7 +155,7 @@ jobs:
|
|||||||
run: chmod +x ./gradlew
|
run: chmod +x ./gradlew
|
||||||
|
|
||||||
- name: Build release APK
|
- name: Build release APK
|
||||||
run: ./gradlew assembleRelease --no-daemon
|
run: ./gradlew assembleRelease
|
||||||
|
|
||||||
- name: Setup F-Droid Server Tools
|
- name: Setup F-Droid Server Tools
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
| v0.4 | Event Detail (S4) + humanized recurrence | complete |
|
| v0.4 | Event Detail (S4) + humanized recurrence | complete |
|
||||||
| v0.5 | Calendar filter (M3) + Settings (M4) | complete |
|
| v0.5 | Calendar filter (M3) + Settings (M4) | complete |
|
||||||
| v0.6 | Full event read — surface every readable field | complete |
|
| v0.6 | Full event read — surface every readable field | complete |
|
||||||
| v1.0 | Polish pass, F-Droid release | pending |
|
| v1.0 | First public release — polish pass, F-Droid | complete |
|
||||||
|
|
||||||
Delivery ran ahead of the original table: Day view (S3) shipped in v0.3 and
|
Delivery ran ahead of the original table: Day view (S3) shipped in v0.3 and
|
||||||
Event Detail (S4) in v0.4, so the Filter/Settings milestone became v0.5.
|
Event Detail (S4) in v0.4, so the Filter/Settings milestone became v0.5.
|
||||||
@@ -44,14 +44,14 @@ Deliberately out of v0.6:
|
|||||||
- `CATEGORIES`, `ATTACH` — not reliably exposed by `CalendarContract`
|
- `CATEGORIES`, `ATTACH` — not reliably exposed by `CalendarContract`
|
||||||
(provider limitation, not our choice)
|
(provider limitation, not our choice)
|
||||||
|
|
||||||
## v1.0 — First Public Release
|
## v1.0 — First Public Release — shipped 2026-06-11
|
||||||
|
|
||||||
All V1 features shipped, polished, on F-Droid. Read-only calendar.
|
All V1 features shipped, polished, on F-Droid. Read-only calendar. Cut directly
|
||||||
Remaining before v1.0: a UI polish/QA pass.
|
after v0.6 (full event read) plus the onboarding-screen polish pass.
|
||||||
|
|
||||||
### Polish backlog (pre-1.0)
|
### Polish backlog (pre-1.0)
|
||||||
- ~~Redesign the initial grant-access (permission) screen~~ — **done**
|
- ~~Redesign the initial grant-access (permission) screen~~ — **done**
|
||||||
(Material 3 Expressive onboarding, shipped on the v0.6.0 branch)
|
(Material 3 Expressive onboarding, shipped in v0.6.0 / v1.0.0)
|
||||||
|
|
||||||
## v2.0 — Write Support
|
## v2.0 — Write Support
|
||||||
|
|
||||||
|
|||||||
@@ -4,10 +4,10 @@
|
|||||||
|
|
||||||
## Status
|
## Status
|
||||||
|
|
||||||
**Milestone:** v0.6 — Full event read (complete)
|
**Milestone:** v1.0.0 — First public release (shipped 2026-06-11)
|
||||||
**Phase:** All V1 screens done and the read model is now complete — the detail
|
**Phase:** V1 is complete and released. All screens done, the read model
|
||||||
view surfaces every readable `CalendarContract` field. Next up is a UI
|
surfaces every readable `CalendarContract` field, and the onboarding screen
|
||||||
polish/QA pass before v1.0
|
got its Material 3 Expressive polish pass. Next horizon is v2.0 (write support)
|
||||||
|
|
||||||
## Progress
|
## Progress
|
||||||
|
|
||||||
@@ -30,5 +30,5 @@ polish/QA pass before v1.0
|
|||||||
|
|
||||||
## Next
|
## Next
|
||||||
|
|
||||||
1. UI polish / QA pass across all views before v1.0
|
1. v1.0.0 released — monitor the F-Droid build/publish
|
||||||
2. F-Droid release of v1.0
|
2. Plan v2.0 (write support: create / edit / delete, quick-add, conflict UX)
|
||||||
|
|||||||
22
CHANGELOG.md
22
CHANGELOG.md
@@ -7,6 +7,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [1.0.0] — 2026-06-11
|
||||||
|
|
||||||
|
First public release. Calendula is a read-only, Material 3 Expressive calendar
|
||||||
|
that lives entirely on top of Android's `CalendarContract` — every calendar
|
||||||
|
synced to the device (CalDAV via DAVx5, Google, local, WebCal, …) shows up
|
||||||
|
automatically, with zero telemetry and no internet permission.
|
||||||
|
|
||||||
|
### Highlights (accumulated across v0.1 → v0.6)
|
||||||
|
- Month, week, and day views with a view switcher, swipe navigation, and
|
||||||
|
Loading / Failure / Success states on every screen
|
||||||
|
- Full-screen event detail surfacing every readable `CalendarContract` field —
|
||||||
|
times, recurrence (humanised), location, description (with tappable links),
|
||||||
|
attendees + roles + your own response, reminders, status, availability,
|
||||||
|
access level, and foreign time zones
|
||||||
|
- Per-calendar visibility filter (grouped by account, persisted) and a Settings
|
||||||
|
screen (theme, Material You dynamic colour, week start, app language)
|
||||||
|
- Material 3 Expressive first-run onboarding for calendar access
|
||||||
|
- German + English localization throughout
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- `versionName`/`versionCode` bumped to 1.0.0 / 7
|
||||||
|
|
||||||
## [0.6.0] — 2026-06-11
|
## [0.6.0] — 2026-06-11
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ android {
|
|||||||
applicationId = "de.jeanlucmakiola.calendula"
|
applicationId = "de.jeanlucmakiola.calendula"
|
||||||
minSdk = 29
|
minSdk = 29
|
||||||
targetSdk = 36
|
targetSdk = 36
|
||||||
versionCode = 6
|
versionCode = 7
|
||||||
versionName = "0.6.0"
|
versionName = "1.0.0"
|
||||||
|
|
||||||
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user