# TT-010 — Settings & Export Feature **Type:** Story **Priority:** Medium **Labels:** ui, feature, settings, export **Depends on:** TT-005 **Blocks:** — --- ## Summary Implement the Settings screen covering language selection, theme override, and the full data export flow (CSV + PDF + JSON) via the system share sheet. ## UI Specification ### SettingsScreen sections ``` ┌──────────────────────────────┐ │ AppBar: "Settings" │ ├──────────────────────────────┤ │ ▶ APPEARANCE │ │ Theme [System ▼] │ │ Language [English ▼] │ │ │ │ ▶ DATA │ │ Export data → │ │ Import / Restore → │ │ │ │ ▶ ABOUT │ │ Version 0.1.0 │ │ Licenses │ └──────────────────────────────┘ ``` ### Export Flow (ExportSheet) Triggered from Settings → "Export data" or Reports → AppBar export button. ``` 1. Select format: [CSV] [PDF] [JSON] 2. Select range: [Today] [This week] [This month] [Custom] 3. Filter project: [All projects ▼] 4. → Share button → share_plus share sheet ``` ## Export Implementation ### CSV - Columns: `id, project, start_time, end_time, duration_seconds, note, tags` - Tags: pipe-separated - Encoding: UTF-8 with BOM - File name: `timetrack_export_2026-07-12.csv` ### PDF - Header: App name, export date, period - Summary table: Project | Total hours | % - Entries table: Date | Project | Duration | Note - File name: `timetrack_report_2026-07-12.pdf` ### JSON - Full backup schema — see `.ai/features/export.md` - File name: `timetrack_backup_2026-07-12.json` ## Settings Persistence Store user preferences in `shared_preferences`: | Key | Type | Default | |-----|------|---------| | `theme_mode` | String | `system` | | `locale` | String | device locale | Expose as Riverpod `@riverpod` providers: - `themeModeProvider` — reads / writes `ThemeMode` - `localeProvider` — reads / writes `Locale` Wire into `app.dart` `MaterialApp.router`. ## Acceptance Criteria - [ ] Theme dropdown: System / Light / Dark — changes app theme immediately - [ ] Language dropdown: English / Deutsch — changes app locale immediately - [ ] Export sheet: all 3 formats functional, share sheet opens - [ ] Export produces non-empty files for each format - [ ] CSV UTF-8 BOM present (verify with hex check in test) - [ ] PDF renders without exception for non-empty date range - [ ] JSON is valid and matches backup schema - [ ] Preferences persist across app restart (shared_preferences) - [ ] Widget test: theme selection updates `themeModeProvider` ## Files to create / modify - `lib/features/settings/presentation/settings_screen.dart` (replace stub) - `lib/features/settings/presentation/widgets/export_sheet.dart` - `lib/features/settings/domain/settings_provider.dart` - `lib/features/settings/data/export_service.dart` - `test/features/settings/export_service_test.dart` ## Dependencies to add ```yaml shared_preferences: ^2.3.3 ``` Add to `pubspec.yaml`.