Commit Graph

5 Commits

Author SHA1 Message Date
RomanNum3ral aaaa034d95
Add Photos gallery (grid browse + full-screen viewer); tidy Agenda top bar
New Photos section reachable from Agenda's overflow menu: reuses
FilesRepository's WebDAV browsing (folders + image-filtered files) in
a grid, with a swipeable full-screen viewer (HorizontalPager) on tap.
Thumbnails/full images load via Coil with a custom OkHttpClient that
injects the same Basic Auth used everywhere else - no new network
client needed, just two small synchronous accessors added to
FilesRepository (rawFileUrl/basicAuthHeader) since Coil needs a plain
URL + header rather than a suspend call.

Also moved Talk/Files/Photos/Calendars into an overflow menu on
Agenda's top bar - it had grown to 7 icons across this session and
the title had started wrapping to two lines.

Real bug found and fixed live: the photo viewer's close button was
completely untappable (visually present, but taps never registered).
Root cause was the same class of issue as an earlier Snackbar gotcha
this session - MainActivity calls enableEdgeToEdge(), so content
without explicit inset padding draws (and the close button's touch
target sat) underneath the real system status bar, which intercepted
the taps before the app ever saw them. Fixed with statusBarsPadding()
and by moving the button into its own row above the pager instead of
overlaid on top of it.
2026-07-18 16:16:48 -04:00
RomanNum3ral 33d6469bbe
Add Authentik/SSO login via Nextcloud Login Flow v2; fix Tasks widget minHeight
Login Flow v2 opens Nextcloud's own browser login page in a Custom Tab
(androidx.browser), so any SSO backend configured server-side (Authentik
via user_oidc) and WebAuthn hardware-key prompts work without NCal
implementing OIDC/OAuth2 itself - the flow ends with a normal app
password, stored the same way as manual login.

The Tasks widget's minHeight was pinned exactly to its 4-row default
size (Android's 70*cells-30 formula), leaving no slack to ever resize
shorter. Lowered to 110dp (2 rows) so it can actually be resized to a
2x3 layout, which was verified to render cleanly.
2026-07-18 13:01:46 -04:00
RomanNum3ral 3d0f6589a9
Add offline resilience, undo-delete, search, week view, BYDAY recurrence, import/export, and single-occurrence recurring edits
Closes out the full post-launch feature backlog:
- Offline write resilience for save/delete, with automatic flush on reconnect
- Undo-after-delete via a snackbar, with a fresh-UID recreate (Nextcloud's
  trashbin rejects reusing a just-deleted item's UID)
- Custom (non-preset) reminder offsets
- Search across events and tasks
- Week view alongside the existing Agenda/Month views
- BYDAY support in the Repeats picker ("every Mon/Wed/Fri"), including a
  proper RRULE evaluator extension for it
- Import/export .ics via the system share sheet and file picker
- Single-occurrence recurring-event editing/deleting ("this event only" vs
  "all events") via RFC 5545 RECURRENCE-ID overrides and EXDATE

A repository-wide write mutex now serializes sync against save/delete/undo,
fixing a real race where a background sync could clobber a just-written item.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-17 18:53:39 -04:00
RomanNum3ral 14ee70d71d
Fix remaining known limitations: recurrence editing, subtask tree parity, conflict resolution
- Recurrence picker (Daily/Weekly/Monthly/Yearly, interval, end condition) for
  both events and tasks, backed by a real RRULE. Fixes a latent bug from the
  prior RRULE-preservation change: editing a recurring item was writing the
  resolved *next occurrence* back as the master DTSTART, silently shifting the
  whole series forward on every edit - start/end/due are now correctly
  read-only for recurring items instead.
- Periodic background sync (WorkManager, ~30 min, network-gated) so widgets
  stay fresh without opening the app; auto-refresh on app open too.
- Tasks widget now renders the same parent/child tree as the in-app Tasks
  screen (util/TaskTree.kt shared by both) instead of a flat due-date list.
- Conflict resolution: a stale save (HTTP 412) shows both versions and lets
  you keep your edit or take theirs, instead of just an error banner.
- First test suite for the project (IcsMapperTest, TaskTreeTest).
2026-07-16 21:02:48 -04:00
RomanNum3ral 75f5e6024b Initial commit: NCal, a native Nextcloud CalDAV client for Android
One app for both events and tasks, talking directly to Nextcloud's CalDAV
endpoint - no DAVx5, no Google Play Services, no third-party services.
Encrypted at rest (SQLCipher DB, EncryptedSharedPreferences, Keystore-backed
widget state), HTTPS-only networking, home screen widgets, reminders,
subtasks, and full VTODO field support (status/priority/%complete/location/url).
2026-07-16 18:19:03 -04:00