Changelog
Flutter SDK
Next - 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.
- 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.
- 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.
Next - 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.
Next - 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