Commit Graph

282 Commits

Author SHA1 Message Date
8cd01c6f3b feat(sf_tracking): consent-aware crashlytics wrapper 2026-04-26 21:52:54 +02:00
1c98c0842d feat(sf_shared): add FailureType + handleFailure + feedback dialogs 2026-04-26 21:52:54 +02:00
59cced7b17 chore(legacy): add test infrastructure + mocktail 2026-04-26 21:52:54 +02:00
039f2bb051 chore(i18n): add missing translation keys and device debug logging 2026-04-26 21:52:53 +02:00
ac986ac360 feat(capabilities): add volume limits (media, ringtone, alarm) 2026-04-26 21:52:52 +02:00
cf86570e4c feat(settings): add falldown, falldownLevel and rename gps to location 2026-04-26 21:52:52 +02:00
14720b66bf refactor(legacy): split legacy_shared into cohesive packages
legacy_shared was the junk drawer of the legacy app mode — 37 files
mixing device entities, command infrastructure, UI primitives, generic
formatters, and a duplicate of sf_infrastructure's dio_error_mapper.
Any module needing one piece pulled the whole bag into its graph.

Split it by responsibility, following Mandamiento 4 of Real-World Flutter:

- legacy_ui (new): 6 widget/layout primitives (PageLayout, MenuButton,
  SectionButton, PulsingLocationMarker, RefreshableErrorState,
  WeekDayChips) plus mapStyleProvider — shared UI state that was the
  only reason two modules needed a common package.
- legacy_device_state (expanded 9 → 30): absorbed device entities,
  commands infrastructure (datasource + repo + provider + guard),
  device settings update flow, and the CSV exporter. Now one package
  owns the device domain end-to-end.
- packages/utils: absorbed battery_utils and date_format_utils as pure
  formatters that never belonged in a legacy-scoped package.
- legacy_shared: deleted entirely.

The duplicate dio_error_mapper in legacy_shared is gone; callers now use
the sf_infrastructure version (which was always the superset — it adds
ApiException and the dart:io socket handling).

DeviceEntity note: legacy_device_state keeps its own DeviceEntity (with
int timestamps and typed paymentOptions) separate from sf_shared's
DeviceEntity (String timestamps, untyped paymentOptions). The legacy
one is intentionally not exported from the barrel to avoid the
ambiguous_import collision that legacy_shared quietly hid by never
exporting it in the first place. Unifying the two is a domain-model
refactor out of scope here.

0 cross-module imports remain among legacy feature modules.
2026-04-26 21:52:51 +02:00
d7308229a0 chore(sf_localizations): switch i18n source to es.json and add parity check
Spanish is the app default (SFLocalizations.testInit uses 'es',
localeResolutionCallback falls back to the first supported locale), so
make that explicit by pointing the code generator at es.json instead of
en.json. Regenerating picked up 12 activity-meter keys that were already
present in every locale file but had drifted out of I18n.

Add scripts/check_i18n_parity.dart: treats es.json as the template and
reports any missing or orphan keys in en/fr/de/it/pt. Exits non-zero so
it can gate CI or a pre-commit hook later.
2026-04-26 21:52:51 +02:00
f7d3dbfd27 refactor(legacy): migrate theming to Material 3 + SfColors extension
Replace the ThemePort/ThemeCode abstraction (GetIt-registered adapter)
with a Riverpod-driven Material 3 ColorScheme, an SfColors ThemeExtension
for brand tokens, and a user-facing appearance selector for light/dark/
system modes. Persisted via SharedPreferences, reacts to system
brightness changes. Payments mode keeps the existing ThemePort API.

Highlights
- New legacy_theme package: LegacyAppTheme (light/dark), LegacyColorSchemes,
  SfColors ThemeExtension, LegacyThemePreferences, LegacyThemeNotifier,
  LegacyThemeSelector. Timeframe-based variants scaffolded but disabled.
- New /legacy/dashboard/control_panel/settings/appearance route + screen.
- MaterialApp.router picks the legacy theme only when isLegacyMode.
- ~90 ThemeCode.* usages migrated to colorScheme.* / context.sfColors.*.
- 25 widgets dropped the 'ThemePort theme' constructor param.
- ~145 hardcoded colors migrated (exact hex 1:1, grey.shade tiers,
  destructive red -> colorScheme.error, background whites -> surface).
  Content-over-color whites, transparents, and brand semantic reds/
  oranges/greens intentionally preserved.
- sf_localizations updated with appearance / appearanceDescription keys
  in all six locales.
2026-04-26 21:52:50 +02:00
bd7c47351f chore: ignore flutter auto-generated files
These files are regenerated by flutter pub get and contain machine-
specific paths (FLUTTER_ROOT, FLUTTER_APPLICATION_PATH). They should
not be tracked — the file header itself states "do not check into
version control".

- Update .gitignore: prepend **/ to .flutter-plugins-dependencies so
  it matches in sub-packages, add Generated.xcconfig and
  flutter_export_environment.sh patterns.
- git rm --cached the 4 files that were already tracked (keeps them
  on disk for local builds but removes from repo).
2026-04-26 21:52:50 +02:00
ecfb4cc7d2 fix 2026-04-26 08:39:26 +02:00
6b1e571341 fix(tests): update feedback_dialogs test for queue implementation 2026-04-26 08:38:18 +02:00
f6ff53bcd7 test(device-entity): add queueCommands and isDisconnected tests (11 cases) 2026-04-26 08:29:17 +02:00
e130f4a037 chore(i18n): add GPS functions, history and delete confirmation keys 2026-04-26 08:25:55 +02:00
e0dde50eba fix(feedback-dialogs): add queue system to prevent dialog stacking 2026-04-26 08:25:24 +02:00
6ed36dba75 feat(location): redesign device banner to match reference UI 2026-04-26 05:52:27 +02:00
4deb263c7e fix(location): add refresh success feedback and fix queueCommands null crash 2026-04-26 05:41:21 +02:00
82786b3577 chore(i18n): improve positionUpdated message text 2026-04-26 05:29:38 +02:00
ff48b873e9 chore(i18n): add positionUpdated key in 6 locales 2026-04-26 05:27:29 +02:00
35948998f6 feat(device): add queueCommands to DeviceEntity and command guard 2026-04-26 05:27:23 +02:00
107a4ec593 chore(i18n): add localization keys for new features and fixes 2026-04-26 05:13:19 +02:00
03effaed13 fix(tracking): shorten event names to fit Firebase 40-char limit 2026-04-26 05:13:10 +02:00
6f5855e2fd feat(navigation): add routes for installed apps and app usage schedules 2026-04-26 05:13:01 +02:00
7251349e1d feat(location): add manual frequency option and optimize position loading 2026-04-26 05:12:10 +02:00
6de01b62ae fix(splash): distinguish network errors from auth errors in session check 2026-04-26 05:11:48 +02:00
80f95bae5a fix payments 2026-04-24 15:06:30 +02:00
63547b0f37 removede shadow and blurs 2026-04-23 15:02:25 +02:00
9ab78ac965 feat(legacy): replace CircularProgressIndicator with animated GIF loading
Add LegacyLoadingIndicator widget using a transparent GIF animation
for all full-page loading states across legacy modules. Also fix
HealthController crash by deferring provider mutation during build.
2026-04-23 14:54:38 +02:00
4fbdce3c8c warning icon 2026-04-23 02:13:36 +02:00
5ad0a7acc5 feat(ui): use pill style for offline and technical error dialogs 2026-04-23 02:06:43 +02:00
065433ff61 feat(ui): redesign feedback dialogs with pill style for legacy mode 2026-04-23 02:04:33 +02:00
04c26e83cf refactor(legacy_auth): migrate device_setup to Riverpod + polish QR scanner UX 2026-04-23 00:16:05 +02:00
0530f892f2 refactor(device_management): migrate scheduled_activities to Riverpod 2026-04-22 22:35:27 +02:00
94e2fcbf7d refactor(device_management): migrate contacts to Riverpod 2026-04-22 22:14:06 +02:00
5193e6ada2 refactor(device_management): migrate do_not_disturb to Riverpod + add delete button 2026-04-22 21:44:16 +02:00
df92c51344 fix(router): rename duplicate notifications route name 2026-04-22 20:21:35 +02:00
221d053d5f fix(websocket): parse wifi-current event type for wifi settings 2026-04-22 11:23:30 +02:00
71ffc52993 refactor(settings): migrate block_phone to Riverpod CRUD pattern 2026-04-22 02:19:33 +02:00
2247833203 feat(legacy-settings): DST-aware timezone with phone auto-detect 2026-04-22 01:10:10 +02:00
b8ac786146 refactor(sf_shared): add help center URL to BrandLinks 2026-04-21 23:33:12 +02:00
dd1617939b refactor(sf_shared): move brand links to Firebase Remote Config 2026-04-21 23:32:26 +02:00
e040944965 refactor(legacy-account): migrate delete_account to AsyncNotifier + fix A1 2026-04-21 22:12:51 +02:00
0418f16f87 fix(sf_shared): distinguish 401 vs 403 error UX 2026-04-21 21:34:32 +02:00
f36ad5e4a6 refactor(legacy-account): migrate personal_data to AsyncNotifier 2026-04-21 21:00:42 +02:00
0a50941c2b fix(legacy-account): show success dialog after password change 2026-04-21 20:49:13 +02:00
7746d08759 refactor(legacy-account): migrate change_password to AsyncNotifier 2026-04-21 20:35:18 +02:00
b21b234b9a feat(sf_tracking): consent-aware crashlytics wrapper 2026-04-21 19:33:54 +02:00
f89bca99b3 feat(sf_shared): add FailureType + handleFailure + feedback dialogs 2026-04-21 19:32:49 +02:00
1056895c31 chore(legacy): add test infrastructure + mocktail 2026-04-21 19:32:40 +02:00
21fd1e0197 chore(i18n): add missing translation keys and device debug logging 2026-04-21 17:59:50 +02:00