Complete the MyIceK rename by updating the Kotlin package from ch.parano.myice to ch.parano.myicek across all source sets (androidMain, commonMain, desktopMain, iosMain, commonTest), the build.gradle.kts (namespace, applicationId, mainClass, desktop packageName) and the iOS Info.plist bundle URL name. The myice:// OAuth scheme is kept unchanged as it depends on the backend.
Also add pull-to-refresh to ScheduleScreen using Material 3 PullToRefreshBox, replacing the manual loading overlay.
Update the app display name in all user-visible locations:
Android manifest label, desktop window title, login screen,
and schedule screen top bar.
Refs #2
Replace per-staff cards with a single card listing all staff. Each
line shows the name on the left and role in muted color on the right,
matching the players section style.
Replace per-player cards with a single card listing all players. Each
player shows on one line: number, name, position, and birth year in
muted color. Add Makefile with android and desktop targets.
Add PlatformBackHandler (expect/actual) to intercept the back gesture
on Android via BackHandler, and enable OnBackInvokedCallback in the
manifest so the swipe-back gesture triggers onBack instead of exiting
the app.
Fixes the back gesture exiting to home from the event detail screen.
The EventCard had a fixed 120dp height that clipped the date line.
Remove the height constraint so the card grows to fit all content,
and format ISO datetime strings into readable dd.MM.yyyy HH:mm format.
- Add full LICENSE file (GPL-3.0)
- Add SPDX headers to all 44 Kotlin source files
- Add SPDX headers to 3 iOS Swift/Info.plist files
- Update README.md and AGENTS.md with license info
java.util.prefs.Preferences (desktop Settings backend) has an 8KB
per-value limit. Schedule JSON exceeds this. Now splits into 8000-char
chunks stored as cached_events_chunk_<account>_<i>, with a count key.
Maintains backward compat with old single-value format.
The schedule screen was never loading data because no LaunchedEffect
called loadAccounts() when the user became authenticated. Now:
- App.kt: calls scheduleViewModel.loadAccounts() when authState becomes Authenticated
- ScheduleScreen.kt: calls loadCachedSchedule() when selectedAccount is set
- Add App.kt root composable with state-based routing
(Login -> Schedule -> EventDetail) driven by AuthViewModel.state
- Update MainActivity (Android), MainViewController (iOS), and
Main.kt (Desktop) to host App() with their platform OAuthClient
- Add iOS Xcode source files (MyIceApp.swift, ContentView.swift)
and Info.plist with myice:// URL scheme
- Delete Placeholder.kt
- Add kotlinx-coroutines-swing to desktopMain to provide
Dispatchers.Main for viewModelScope (app crashed on desktop
without it)
Add ApiConfig, AuthTokenHolder singleton, expect/actual HttpClient
engine factories (CIO for Android/Desktop, Darwin for iOS), and
ApiService with four GET endpoints. Bearer token from AuthTokenHolder
is injected as Authorization header on each request.
Adjusted for Ktor 3.5.1: HttpClientEngineFactory lives in
io.ktor.client.engine; the timeout plugin is HttpTimeout (package
io.ktor.client.plugins), not HttpTimeoutPlugin. Tests wrap suspend
calls in runTest and assert request URLs without a trailing '?'.