- Add AntelopAwareMessagingService so the Antelop SDK gets first dibs on every
FCM push before delegating to firebase_messaging. Unblocks SCA wallet
activation on Android, which was waiting forever for pushes that the
FlutterFirebaseMessagingService was swallowing ever since Firebase was
integrated. Remove the stock Antelop and firebase_messaging services via
manifest-merge so only the wrapper handles MESSAGING_EVENT.
- Add Copy AntelopRelease Build Phase in Xcode to copy
Runner/AntelopRelease-{flavor}.plist over the fixed AntelopRelease.plist
inside the .app bundle based on CONFIGURATION. Without this the iOS SDK
silently used the production plist on every flavor.
- Revert the six applicationId values (3 AndroidManifest + 3 AntelopRelease
plist) to the sample id 4713640103500149457, which is the only one
provisioned in Antelop's backend today. The four env+platform ids they
provided all fail with 9999 / cryptography: Error while decrypting data.
To be updated once Treezor confirms the real ids.
- Add packages/flutter_treezor_entrust_sdk_bridge/example as a pub workspace
member and bump its Dart SDK and flutter_lints constraints so
'melos bootstrap' stops failing with 'dependencies for
flutter_treezor_entrust_sdk_bridge_example missing'.
Adds a production-grade in-app version check that prompts users to update when a new build is available. Soft updates are dismissable. Force updates block the app entirely. Configured via FirebaseRemote Config so rollouts can be triggered without redeploying.
- Sealed result types (NoUpdate / SoftUpdate / ForceUpdate) for type-safe pattern matching
- AppVersionCheckService
- AppUpdateGate widget encapsulates listener, route guard and dialog wireup, isolated from save_family_app
- Serialized notifier operations prevent race between dismiss and refresh, mounted checks blindar disposal edge cases - Build-aware dismiss persistence via SharedPreferences
- Lazy-init sfTracking to avoid touching Firebase at import time
- DRY SfTrackingRepository with a single _broadcast helper
- Drop empty DashboardTracking, fix double step_completed in device_setup
- Move yearsBetween to packages/utils
- Add 5 unit tests for SfTrackingRepository
- Strip noisy comments from mixins and view models
Introduces packages/sf_tracking — a multi-client, GDPR-first analytics layer with feature mixins, a GoRouter listener for automatic screen views, and a user properties helper that runs on login.
Wires the package into the legacy module 61 events
Phase 2 of multi-environment setup. Adds Firebase core, Crashlytics,
Analytics, Remote Config, Performance, Messaging and flutter_local_notifications,
plus full APNs configuration for iOS push.
- Wire setupFirebase(env) and setupNotifications() in initApp
- Add firebase_options for dev and staging via flutterfire (sf-platform-pre)
- Register google-services / firebase-perf / crashlytics gradle plugins
- Add per-flavor GoogleService-Info.plist with Build Phase script that
copies the right plist into the .app bundle based on \$CONFIGURATION
- Bump iOS deployment target 13.0 -> 15.0 (required by firebase_analytics)
- Pin flutter_local_notifications to ^19.4.2 (v20+ needs Dart SDK >=3.10)
- Add aps-environment to staging (development) and production entitlements;
development flavor intentionally excluded (no App Store Connect entry)
- Fix AppDelegate.swift to call super.application after forwarding to
AntelopAppDelegate, otherwise Firebase Messaging swizzling breaks and
the APNs token is never captured
- Crashlytics reports in all builds (debug + release) for early detection
- Tag analytics events with env user property per flavor
- App Check intentionally not included (debug-token friction with large
QA team); can be re-added release-only later
The repo had no root-level .gitignore, so .dart_tool/, ephemeral plugin
symlinks and build artifacts were being tracked across the workspace.
Every flutter pub get regenerated them and they polluted PRs as recurring
noise.
- Add root .gitignore covering .dart_tool/, ephemeral plugin symlinks,
build/, coverage/, IDE files
- Untrack ~39 existing cache files across root, modules and packages
- Upgrade Melos to 7.5.1 using Dart pub workspaces (Melos 7 paradigm).
- Replace per-package pubspec_overrides.yaml with workspace-native resolution. Add dependencies.yaml as a centralized catalog for all external deps with sync_deps.dart tool to propagate and validate versions across the monorepo.
- Add DeviceSettingsSync extension on Ref to centralize device provider
updates after settings changes (sound, volume, language, timezone,
battery, disable functions, alerts, pedometer, heart rate freq,
location freq, background image)
- Add photo capture countdown with Lottie animation in remote camera
- Replace Image.network with Image.memory for photo display
- Fix commands datasource to handle text/html responses (post<dynamic>)
- Add typed error/success events to RemoteConnectionViewModel
- Add background image active indicator and backgroundImageId to device settings
- Change photos endpoint from /devices/identificator/:id/photos/files to /photos/files
- Remove dead deviceId param from getBackgroundImage chain
- Relax PictureEntity required fields to @Default for API compatibility
- Fix LocationViewModel rebuild crash (ref.watch → ref.read)
- Use .select() in RemoteCameraScreen for optimized rebuilds
- Increase health measure countdown to 60s
- Rename sms_alert feature to alerts with toggle list from device capabilities
- Implement disable functions (keyboard, GPS) with device settings update
- Implement battery night mode with dedicated view model
- Add keyboard, gps, nightMode fields to DeviceSettingsEntity/Model
- Fix photos endpoint to use /photos/files for file content
- Fix upload flow: capture photo ID from POST /photos response
- Fix endpoint: use /devices/identificator/{id}/photos/files for listing
- Fix setBackgroundImage: use device.id (UUID) instead of identificator
- Redesign screen as photo gallery with grid view
- Add image compression on pick (maxWidth: 800, quality: 80%)
- Fix multipart upload: remove content-type header for FormData auto-detection
- Replace hardcoded Spanish text with i18n in 6 languages
- Add typed error/success enums (BackgroundImageErrorEvent, BackgroundImageSuccessEvent)
- Revert initialLocation to splash
- Add missing translations for contacts and background-image features
- Type device.settings and device.capabilities from untyped maps to Freezed models
- Centralize all device settings updates through shared DeviceSettingsUpdateDatasource
- Add frequency selectors for location and heart rate, pedometer toggle, and health measurement countdown with Lottie animation
- Replace raw backend error messages with typed i18n error events across location, health, and activity meter
- Fix silent error swallowing in commands datasource and stuck dialog in locate device
- Add set PIN / change PIN multi-step flow (4-digit card PIN + 6-digit SCA PIN) with Treezor PCI DSS SCA proof generation
- Add unblock PIN for blocked cards after failed attempts
- Add renew card with SCA proof (same as wallet creation)
- Show menu options conditionally based on hasCardPin and isPinBlocked flags
- Make ScaPinView configurable with pinLength parameter (default 6)
- Add hasCardPin to ChildProfileEntity and isPinBlocked to WalletCardEntity
- Add EN/ES localizations for all new screens and messages
- Add call history screen with list of incoming/outgoing calls
- Implement GET /devices/identificator/{id}/call-histories endpoint
- Add CallHistoryResponseModel with freezed
- Add Riverpod provider for CallHistoryDatasource
- Add route, builder, and menu button in device management
- Add volume control screen with sliders for media, ringtone, and alarm
- Update device settings via PUT /devices with CSV (same as language)
- Extract DeviceCsvBuilder to legacy_shared (shared between language and volume)
- Create Riverpod provider for DeviceUpdateDatasource
- Extract VolumeThumbShape to separate widget file
- Merge sound mode feature (SET_SOUND_MODE command, pending backend whitelist)
- Fix sound screen overflow with SingleChildScrollView
- Change language update from POST /commands to PUT /devices with CSV
- Add CSV escape for JSON fields (doubled quotes)
- Move device payload construction to datasource layer
- Add loading indicator on save button
- Fix 401 redirect to legacy login
- Remove debug print from commands datasource
- Fix position address model nullability (province field missing from API)
- Fix health query order to sortDirection to match backend API
- Add pagination to health chart queries to prevent backend timeout
- Align GetDevicesResponseModel with full backend schema
- Add route history with gradient polyline, direction arrows, and clustering
- Add animated map movements
- Add follow mode with auto-refresh
- Add share location via Google Maps link
- Add fit bounds on history load
- Add expandable action buttons panel
- Add location list bottom sheet with type filters
- Add whitelist sync alongside secondary contacts
- Add loading state to linked devices screen
- Refactor location_map.dart: extract RouteHistoryLayer, MapActionsPanel
- Migrate setState to LocationMapViewModel
- Position history with polyline trail and date range picker
- Map style selector (standard, voyager, light, dark, satellite) persisted via SharedPreferences
- Geofence and frequent place CRUD with info cards
- Device banner with swipeable carousel
- Refresh position button
- Widget extraction: map controls, info cards, device banner, modal overlay