Commit Graph

28 Commits

Author SHA1 Message Date
herel de107a4295 docs: add README with project overview, build instructions, and architecture 2026-07-09 16:06:52 +02:00
herel 8c2de8b475 build: configure release signing for Android APK
Reads keystore credentials from keystore.properties (gitignored).
Keystore file (myice.keystore) is also gitignored.
2026-07-09 16:05:49 +02:00
herel 765fe51720 ui: make filter card collapsible with 2x2 grid layout
- Collapsed: compact row showing 'Filtres' + active filter count + expand arrow
- Expanded: 2x2 grid (Compte+Type, Age+Sous-groupe) halves vertical space
- Animated expand/collapse with AnimatedVisibility
- FilterDropdown now respects weight() modifier for row layout
2026-07-08 18:20:40 +02:00
herel c4bf05d728 feat: add app launcher icon from Flutter project 2026-07-08 18:16:33 +02:00
herel b291277d4f build: remove iosX64 target (unsupported by Compose MP 1.11.1) 2026-07-08 18:12:53 +02:00
herel cc4b0a1ecf fix: chunk large cached events to avoid Preferences 8KB limit on desktop
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.
2026-07-08 18:12:19 +02:00
herel d93cae0816 fix: trigger loadAccounts() on auth and loadCachedSchedule() on account selection
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
2026-07-08 18:07:21 +02:00
herel b676c768fe fix: add back navigation from EventDetailScreen to Schedule 2026-07-08 18:02:14 +02:00
herel 28de93263b feat: wire up app root, navigation, and platform entry points
- 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)
2026-07-08 18:00:57 +02:00
herel 88aa9de4ad fix: use French labels for refresh/logout buttons in ScheduleScreen 2026-07-08 17:56:01 +02:00
herel 38d420524a feat: add LoginScreen, ScheduleScreen, and EventDetailScreen
Add 3 Compose Multiplatform screens consuming Task 6 ViewModels and
Task 8 components:
- LoginScreen: MyIce title, login button, loading/error states
- ScheduleScreen: AppBar + filter card (4 dropdowns) + event list
  with loading/error/empty/refreshing states
- EventDetailScreen: AppBar + recap card + players/staff sections
  with amber empty-state card

Use TextButton for Refresh/Logout actions (material-icons-core not
available in this Compose Multiplatform setup). Guard setAccount call
against nullable onSelect callback.
2026-07-08 17:54:19 +02:00
herel 277517bf7e fix: make parseHexColor crash-safe, clean up imports in EventCard 2026-07-08 17:53:04 +02:00
herel af85605dd4 feat: add Material 3 theme and UI components (EventCard, FilterDropdown, LoadingIndicator) 2026-07-08 17:52:04 +02:00
herel 5aa264c2a7 fix: add Desktop OAuth timeout, restore iOS keyWindow filter 2026-07-08 17:51:27 +02:00
herel 00e7a7456f fix: address OAuth review findings (redirect_uri, binding, timeout, CRLF, DRY) 2026-07-08 17:46:40 +02:00
herel 5dc206ae72 feat: add platform OAuth implementations (Android, iOS, Desktop)
- AndroidOAuthClient: ACTION_VIEW + OAuthCallbackActivity (myice://callback)
- IosOAuthClient: ASWebAuthenticationSession with presentation context provider
- DesktopOAuthClient: local HTTP server + system browser
- AndroidManifest: register OAuthCallbackActivity intent filter
- Align Kotlin to 2.3.20 (required by Compose MP 1.11.1 klibs) and
  compileSdk to 36 (required by activity-compose 1.13.0); fix missing
  Text import and stray brace in placeholder iOS/Android entry points
2026-07-08 17:42:44 +02:00
herel 294aebd0b4 feat: add AuthViewModel, ScheduleViewModel, and EventDetailViewModel with StateFlow 2026-07-08 17:25:41 +02:00
herel bb13a12d00 feat: add event filtering logic, TypeFilter enum, AuthSettings, and OAuthClient interface 2026-07-08 17:16:01 +02:00
herel b61b6408f3 fix: bump kotlinx-datetime to 0.7.1, scope ExperimentalTime opt-in to saveEvents 2026-07-08 17:14:56 +02:00
herel 11c0a92421 feat: add ScheduleCache with multiplatform-settings for offline caching 2026-07-08 17:10:45 +02:00
herel b1661aaa4f feat: add Ktor networking layer with ApiService and auth token holder
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 '?'.
2026-07-08 17:07:20 +02:00
herel a24297f821 feat: add serializable data models with FlexibleStringSerializer for number coercion 2026-07-08 17:02:31 +02:00
herel c931ec7143 fix: add missing Text import in desktop Main.kt
Task 1 scaffold omitted the material3 Text import, blocking desktop
compilation. Required to run common tests via desktopTest.
2026-07-08 17:02:29 +02:00
herel c1b9a60317 docs: update plan with corrected tooling versions 2026-07-08 16:59:32 +02:00
herel 9ee5b1c415 fix: correct tooling versions (Gradle 9.5.1, AGP 8.13.2) and add Kotlin Compose plugin
- AGP 2.1.3 doesn't exist; use 8.13.2 (latest stable 8.x)
- Gradle 9.6.1 incompatible with AGP 8.x; use 9.5.1
- Add org.jetbrains.kotlin.plugin.compose (required since Compose MP 1.6.10)
- Fix source set access (by getting) and iOS Darwin dependency injection
- Remove instrumentedTestVariant (KotlinSourceSetTree unresolved)
2026-07-08 16:59:26 +02:00
herel 15ae8cd046 feat: scaffold KMP project with Compose Multiplatform (Android, iOS, Desktop) 2026-07-08 16:53:13 +02:00
herel 3b6fae1b95 docs: add MyIce KMP implementation plan
10-task TDD plan covering: project scaffolding, data models, networking
(Ktor), caching, filtering logic, viewmodels, platform OAuth, UI theme
and components, screens, and app root with entry points for Android,
iOS, and Desktop.
2026-07-08 16:48:09 +02:00
herel 0098abd15b docs: add MyIce KMP app design spec
Design for porting the MyIce Flutter app to Kotlin Multiplatform
(Android + iOS + Desktop) using Compose Multiplatform. Mirrors the
3-screen structure (Login, Schedule, Event Detail) and 4 GET endpoints
with Bearer auth via Infomaniak OIDC. Adds a type filter to surface
practices alongside games.
2026-07-08 16:42:03 +02:00