Mobile app
Flutter Android client. Entry point: lib/main.dart. Package: lv.ca. Versija pārvalda pubspec.yaml version:.
Direktoriju struktūra (lib/)
| Direktorija |
Saturs |
screens/ |
Top-level routes — map, settings, onboarding, news, skices, offline areas, properties |
services/ |
66 servisi, ko sadalu zemāk pa domēniem |
models/ |
Tīras data klases — ca_model, skice_model, heritage_model, forest_infra_model, geofence_settings, map_marker_model, custom_wms_layer |
widgets/ |
Atkārtoti izmantojami UI komponenti, ieskaitot widgets/object_sheets/ ar bottom-sheet variantiem identify flow'am |
theme/ |
Krāsu/spacing/tipogrāfijas tokeni. SoT: theme/app_colors.dart |
utils/ |
Tīras palīgfunkcijas — projections.dart (LKS-92 ↔ WGS84), geometry_*, formatters, identify_tolerance, display_expression, screen_size |
data/ |
Bundled administratīvie dati (latvia_admin.dart) |
assets/ |
Konfigurācijas, lokalizācijas, dati, palīdzība, ziņas, juridiskie dokumenti |
Boot secība — parallel startup
main.dart startē šādus 7 boot-time servisus paralēli caur Future.wait:
EasyLocalization — lokalizāciju ielāde (assets/translations/{lv,en,de,fi,ru}.json)
AppDataMigrator — SharedPreferences shēmas atjaunināšana
ServiceConfig — assets/config/services.json ielāde + server refresh
ThemeService — saglabātā light/dark izvēle
FieldModeService — sun-readable mode toggle stāvoklis
ConsentService — GDPR opt-in stāvokļi
TelemetryService — analytics opt-in
Boot laiks: ~50-150 ms (limited by slowest service, ne summa).
Pēc runApp, fire-and-forget startē:
DeeplinkService.init() — deeplink listener
NewsService.load() — pirmā ziņas ielāde
SentryConfig.init() — crash reporting (ja DSN compile-time iesetēts)
Servisu katalogs (66 servisi pa kategorijām)
Datu avoti (15)
| Serviss |
Mērķis |
vmd_service |
VMD public API → CA polygon (decision number → WKT) |
cadastre_service |
VZD kadastra meklēšana + WFS snap punkti |
lad_service |
LAD lauku bloki, deklarētie lauki |
lad_meta_service |
LAD termiņi un atskaišu periodi |
forest_info_service |
VMD MVR meža informācija (suga, vecums, augstums) |
forest_infra_service |
LVM ceļi, tilti, drenāža |
forest_classifiers |
Cirtes veidu klasifikators |
ozols_service |
DAP Ozols ArcGIS — mikroliegumi, ĪADT, biotopi, sugu atradnes |
heritage_service |
OSM kultūras pieminekļi |
environmental_data_service |
LVĢMC ūdens objekti, NKMP |
parish_forestry_service |
LV admin → virsmežniecība/mežniecība mapping |
weather_service |
LVĢMC laika apstākļi |
custom_wms_service |
Lietotāja pievienoti WMS slāņi |
lvm_layers |
LVM GEO WMS slāņu katalogs (ortofoto, kadastrs, MVR, infrastruktūra) |
multi_layer_identify_service |
"Tap on map" → pieprasījumi visiem aktīvajiem slāņiem |
GPS un atrašanās vieta (4)
| Serviss |
Mērķis |
background_gps_service |
Foreground service Android — turpina GPS stream'u kad ekrāns nodzisis |
geofence_service |
Point-in-polygon 2s tick; brīdina, kad lietotājs ārpus skices vai cirsmas |
kalman_smoother |
GPS noise filter — smooth pozīciju ar Kalman filter |
track_recording_service |
GPX track ieraksts + saglabāšana |
Tīkls un sinhronizācija (5)
| Serviss |
Mērķis |
connectivity_service |
Offline → online switching, auto-retry queued operations |
http_client |
Centralizēts HTTP klients ar timeout, retry, bad-cert tolerance |
server_service |
Device registration + heartbeat uz klm-vzd-service |
sync_queue_service |
Offline aktivitāšu rinda, dispatch pie connectivity |
package_service |
App version info + update checking |
Krātuve un cache (7)
| Serviss |
Mērķis |
storage_service |
SharedPreferences wrapper ar tipsafe API |
drawing_storage_service |
Lietotāja zīmējumi (poligoni, līnijas, punkti) |
skice_storage_service |
Skices + caurmēra mērījumu sesijas |
saved_properties_service |
Saglabāti īpašumi notifikāciju abonēšanai |
offline_cache_service |
CA modeļu cache + sinhronizācija ar serveri |
offline_maps_service |
LVM ortofoto tile cache izvēlētos apgabalos |
cached_tile_provider |
flutter_map TileProvider ar LRU cache (50 MB cap) |
Skices operācijas (7)
| Serviss |
Mērķis |
skice_kml_service |
Skices → KML eksports/imports |
skice_geojson_service |
Skices → GeoJSON eksports |
skice_shp_service |
Skices → Shapefile eksports |
skice_pdf_service |
Skices → PDF rendering ar krāsām, mērogu, kompasu |
polygon_clip_service |
Sutherland-Hodgman polygon clipping (snap pie kadastra) |
snap_boundary_service |
Kadastra robežu snap, virsotnes prioritāte pār malām |
measurement_service |
Polygon platība, perimetrs, virsotnes count |
Identify, search un navigācija (3)
| Serviss |
Mērķis |
identify_service |
WFS GetFeatureInfo viena slāņa identify |
search_service |
Adrešu + kadastra Nr meklēšana caur VAR + VZD |
navigation_service |
Google Maps / Waze launchers ar koordinātēm |
Komercija (3)
| Serviss |
Mērķis |
stripe_checkout_service |
Stripe checkout link ģenerēšana caur backend |
subscription_service |
Stripe subscription status no backend |
subscription_monitoring_service |
ntfy notifikāciju abonēšana īpašumiem (apgrūtinājumi) |
Telemetry un consent (4)
| Serviss |
Mērķis |
telemetry_service |
Custom event tracking (Q14 telemetry) ar opt-in |
gdpr_service |
GDPR data export + dzēšana |
consent_service |
Opt-in stāvokļi (telemetry, crash report, property notifications) |
sentry_config |
Sentry SDK init + breadcrumb size control + beforeSend opt-in gate |
Notifikācijas (2)
| Serviss |
Mērķis |
notification_subscriber |
ntfy SSE klients lokālajām Android notifikācijām |
news_service |
App news feed (assets/news/) |
UI un izvēles (5)
| Serviss |
Mērķis |
theme_service |
Light/dark/system tēmas izvēle ar persist |
field_mode_service |
Sun-readable režīms — palielināts kontrasts uz saules |
visibility_service |
Slēptie objekti ("Slēpt skici" funkcija) |
layer_favorites_service |
Lietotāja favorītu slāņi quick toggle |
onboarding_service |
First-run onboarding stāvoklis |
| Serviss |
Mērķis |
media_capture |
Foto/video uzņemšana cirsmas dokumentēšanai |
media_service |
Media failu saglabāšana, sasaiste ar skicēm |
Infrastruktūra (9)
| Serviss |
Mērķis |
app_data_migrator |
SharedPreferences shēmas versijas migrācija |
deeplink_service |
cageo:// shēma + share-link parsēšana |
error_messages |
Lokalizēti kļūdu ziņojumi |
geo_service |
GPS atļauju pārvalde |
kml_service |
Vispārējais KML parse/serialize |
service_config |
Server-side service URLs override no /api/services-config |
service_factory |
Servisu lazy-init factory |
service_metadata |
Servisu describing metadata UI rādīšanai |
ca_status_service |
CA statuss (active, expired, removed) |
Crash reporting (Sentry)
DSN tiek padots build-time: --dart-define=SENTRY_DSN=.... Bez DSN, init ir no-op.
Release builds caur scripts/build_release.sh:
SENTRY_DSN=https://...@sentry.io/... bash scripts/build_release.sh
Trīs vārti, lai event sasniegtu Sentry:
- DSN compile-time iesetēts (
String.fromEnvironment('SENTRY_DSN') nav tukšs)
SentryFlutter.init veiksmīgi izpildīts boot laikā
- Settings → "Atļaut anonīmus crash report" ir ON (GDPR opt-in)
Visi trīs jābūt true, citādi beforeSend callback drop'o event.
Build un install
# Setup (vienreiz)
flutter pub get
# Static analysis (CI strikta)
flutter analyze --no-fatal-infos --no-fatal-warnings
# Testi
flutter test test/services test/models --reporter expanded
# Debug build (ikdienai)
flutter build apk --debug
flutter install -d <DEVICE_ID> --debug
# Release ar Sentry
SENTRY_DSN="https://...@sentry.io/..." bash scripts/build_release.sh
flutter install -d <DEVICE_ID> --release
Pirms katra build: palielini pubspec.yaml version: (patch=bugfix, minor=feature, major=breaking).
Konfigurācijas pārvalde
- Bundled
assets/config/services.json — minimālā config šippots ar APK
- Server override —
/api/services-config atgriež jaunāku versiju, ja eksistē; cache uz SharedPreferences
- Tīkla mainīšana bez release — atjaunini
geo-backend/data/services.json, restart Flask
Atkarības
Atvērt pubspec.yaml pilnam sarakstam. Galvenās:
flutter_map + latlong2 — karte, ne Mapbox/Google
geolocator — GPS
proj4dart — koordinātu transformācija LKS-92 ↔ WGS84
device_info_plus + android_id — device telemetry + stabils notif token
sentry_flutter — crash reporting
pdf + printing — skices PDF rendering
audio_waveforms — balss piezīmes cirsmā
Plašāk: CLAUDE.md un REFACTORING_PLAN.md.