Changelog
Flutter SDK
Unreleased
These capabilities are available on the agreed SDK revision supplied during partner handoff. They are not part of the older v0.2 Git tag.
Country-aware LoRa radio configuration
Device configuration
- Added typed per-country radio configuration models and
LoraRegionCodediagnostics. - Added detection-only
checkDeviceCountryConfig(...), status getter/stream, and explicit user-confirmedapplyPendingDeviceCountryConfig(...). - SDK lifecycle checks detect mismatches after command-capable connection and on throttled resume paths without silently writing or rebooting.
- Apply rechecks device identity, current region, SOS/PRE-SOS/DMP/Protection safety gates, and active OTA state before writing, rebooting, reconnecting, and verifying.
- Added
DeviceCountryConfigModalHostineixam_connect_uifor localized confirmation, progress, success, failure, and safe retry UX. - Added the LoRa Radio Region integration guide.
Firmware updates
Device lifecycle
- Added public firmware update APIs for connected-device firmware info, update availability checks, user-confirmed update start, progress streaming, and cancellation.
- Added controlled release listing and policy support for explicit targets/downgrades while keeping safe production defaults.
- Firmware update checks expose SDK eligibility blockers such as low device battery, active SOS/PRE-SOS, DMP/protection runtime activity, backgrounded app state, incompatible releases, and missing artifacts.
- Firmware update progress includes download, verification, transfer, reconnect, installed-version verification, completion, failure, cancellation, and recovery-required states.
- Added first-upload and transfer-stall watchdogs plus explicit recovery routing when DFU may have left a device in its bootloader.
- Host apps should never auto-start updates or mark completion from UI alone; completion depends on the SDK update session reaching
completedafter installed-version verification. - Added the Firmware Updates / OTA guide for platform support, prerequisites, cancellation, failure/recovery handling, and host-app UI obligations.
Authoritative SOS capability and lifecycle
SOS
- Added typed SOS capability get/watch/retry APIs so host apps can gate activation without reconstructing transport readiness.
- Added authoritative activation/cancellation results and a persisted
SosLifecycleSnapshotstream for generation-safe app/device/backend reconciliation. - Added current incident progress get/stream APIs backed by realtime state with a public fallback for custom runtimes.
- Added typed terminal reasons and explicit local-actionability/display-surface fields for external or relay-origin incidents.
Permission UX and account operations
Host integration
- Added permission disclosure preflight/accept/decline APIs with configurable localized disclosure copy.
- Added remote SDK user-data erasure with guaranteed SDK-local cleanup for coordinated account deletion.
- Added authenticated in-app feedback submission using the current Eixam user JWT.
Location authority
Location and telemetry
- Added a single Location Authority model for SOS, PRE-SOS/DMP, telemetry publishing, Android foreground/Protection Mode handoff, and UI preview.
- Fresh, valid connected-device GPS is preferred over phone GPS; phone location is the fallback when no valid connected-device GPS is available.
- Remote/relay LoRa SOS keeps the remote payload location authoritative only for that remote event.
- Cached fallback and backend incident snapshot locations are documented as display-only, not backend-authoritative for new SOS or telemetry publishing.
- Backend telemetry publishing now uses the SDK resolver, and raw telemetry guardrails document which sources must not be republished manually.
Android
- Documented foreground/Protection Mode handoff guardrails: TTL, finite in-range coordinates,
0,0rejection, backend-authoritative sources only, connected-device or phone source only, and stale/incompatible decoder rejection.
BLE
- Documented the BLE TEL/SOS
geoMeta_v2decoder correction at integration level.
OS-level SOS widget support
SOS
- Added an optional OS-level SOS widget integration model for Android and iOS host apps.
- Added
handleOsSosWidgetActivation(...)for validated widget activations that enter the existing SDK-owned SOS/PRE-SOS lifecycle. - Added public OS widget activation/result model concepts, including platform, confirmation mode, action id, nonce, timestamp, and activation outcomes.
- Widget-originated activations use the
os_widgettrigger source when they become SDK SOS payloads. - Widgets are documented as guarded app entry points, not independent backend, BLE/device, cancellation, resolution, or emergency-service runtimes.
v0.2.0 — Protection notifications and SOS runtime refinement
Bootstrap
EixamBootstrapConfig.notificationTextsis now required. Every value must be non-empty.- Native foreground services and Protection Mode notifications use host-provided localized copy instead of SDK hardcoded English text.
enableBackgroundTelemetry(...)falls back toprotectionActiveTitleandprotectionActiveBodywhen no explicit notification copy is passed.
Protection Mode
- Android Protection Mode persists notification copy in the native runtime store so foreground-service and SOS lifecycle notifications remain available while Flutter is backgrounded.
EixamNotificationPolicy.hostAppManagedcontinues to let the host app own SOS lifecycle notifications; foreground-service copy is still supplied throughEixamNotificationTexts.- Protection diagnostics include richer native runtime, queue, backend handoff, reconnect, and command state for support tooling.
Device SOS / relay runtime
- BLE SOS notifications are processed asynchronously with guarded error reporting.
- Unknown-origin SOS packets can refresh runtime identity and be reclassified before backend handoff.
- Device-originated active SOS packets can be held in pre-SOS until the countdown completes, avoiding premature promotion during pre-SOS overlap.
v0.1.0 — Initial Partner Release
Bootstrap & Session
EixamConnectSdk.bootstrap(...)— creates SDK, resolves environment, applies signed sessionEixamSession.signed(...)— HMAC-SHA256 signed session; identity reused across HTTP and MQTTsetSession(...)/refreshCanonicalIdentity()— explicit session updates on login/logout;refreshCanonicalIdentity()rehydrates identity fromGET /v1/sdk/me
SDK profile (HTTP)
fetchSdkUserProfile()— load profile viaGET /v1/sdk/meupdateSdkUserProfile(SdkUserProfileUpdate)— partial update viaPUT /v1/sdk/meProfileHttpException— typed HTTP failures with optional API error envelope andfieldHintsfor form mapping
Device Lifecycle
connectDevice(pairingCode:)— pairs or reconnects a device via BLEgetDeviceStatus()/deviceStatusStream— runtime device state and lifecycle changesgetDeviceSosStatus()— device-side SOS state tracked by the SDK runtimedisconnectDevice()/preferredDevice/refreshDeviceStatus()— explicit runtime state management- Device control APIs — typed BLE commands for notification/SOS volume, reboot, shutdown, INET state, position confirmation, runtime status, and relay ACK
SOS
triggerSos(...)— app-originated SOS with optional position snapshot and device contextgetCurrentSosIncident()/getSosState()— active incident and lifecycle state after rehydrationstartPreSos(...)/confirmPreSos(...)/cancelPreSos()— public pre-SOS countdown flowcancelSos()/resolveSos()/acknowledgeSosSummary()— public SOS terminal-state operationscurrentSosStateStream/lastSosEventStream— public SOS state/event streamslistSosHistory(...)— paginated SOS history
Emergency Contacts
listEmergencyContacts()/watchEmergencyContacts()— backend-synced contact listcreateEmergencyContact(...)/updateEmergencyContact(...)/deleteEmergencyContact(...)— CRUD with optionallanguage(ISO 639-1) on createreorderEmergencyContacts(List<String> orderedContactIds)—PUT /v1/sdk/contacts/reorder; ids must be exhaustive and uniqueContactsHttpException— typed HTTP failures for contact routes (400/401/404mapping)
Permissions
requestLocationPermission()/requestNotificationPermission()/requestBluetoothPermission()getPermissionState()— aggregated permission snapshot for host UI gating
Protection Mode (Android)
getProtectionStatus()/getProtectionDiagnostics()— native foreground service BLE ownership and diagnosticsevaluateProtectionReadiness()/enterProtectionMode()/exitProtectionMode()— explicit arming lifecyclewatchProtectionStatus()/watchProtectionDiagnostics()/rehydrateProtectionState()/flushProtectionQueues()— runtime continuity and queue visibility
Diagnostics
getOperationalDiagnostics()/watchOperationalDiagnostics()— full runtime snapshot: session, MQTT, bridge, SOS rehydration- Background telemetry diagnostics and controls:
enableBackgroundTelemetry()/disableBackgroundTelemetry()
Backend Device Registry
listRegisteredDevices()/upsertRegisteredDevice(...)/deleteRegisteredDevice(...)— backend records associated with the signed user- Automatic sync on pairing when canonical hardware ID is available
Additional runtime surfaces
- Notifications —
initializeNotifications(),showLocalNotification(...), pending notification intents, and BLE notification navigation requests - Tracking and telemetry — tracking lifecycle, position streams, and
publishTelemetry(...) - Death Man Protocol — schedule, check-in, cancel, and plan stream APIs
- Realtime events — connection state, last event, and raw realtime event streams
Environments
EixamEnvironment.sandbox/EixamEnvironment.production/EixamEnvironment.customEixamCustomEndpoints(apiBaseUrl:, mqttUrl:)for custom deployments