Skip to main content

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 completed after 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,0 rejection, backend-authoritative sources only, connected-device or phone source only, and stale/incompatible decoder rejection.

BLE

  • Documented the BLE TEL/SOS geoMeta_v2 decoder 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_widget trigger 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.notificationTexts is 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 to protectionActiveTitle and protectionActiveBody when 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.hostAppManaged continues to let the host app own SOS lifecycle notifications; foreground-service copy is still supplied through EixamNotificationTexts.
  • 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 session
  • EixamSession.signed(...) — HMAC-SHA256 signed session; identity reused across HTTP and MQTT
  • setSession(...) / refreshCanonicalIdentity() — explicit session updates on login/logout; refreshCanonicalIdentity() rehydrates identity from GET /v1/sdk/me

SDK profile (HTTP)

  • fetchSdkUserProfile() — load profile via GET /v1/sdk/me
  • updateSdkUserProfile(SdkUserProfileUpdate) — partial update via PUT /v1/sdk/me
  • ProfileHttpException — typed HTTP failures with optional API error envelope and fieldHints for form mapping

Device Lifecycle

  • connectDevice(pairingCode:) — pairs or reconnects a device via BLE
  • getDeviceStatus() / deviceStatusStream — runtime device state and lifecycle changes
  • getDeviceSosStatus() — device-side SOS state tracked by the SDK runtime
  • disconnectDevice() / 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 context
  • getCurrentSosIncident() / getSosState() — active incident and lifecycle state after rehydration
  • startPreSos(...) / confirmPreSos(...) / cancelPreSos() — public pre-SOS countdown flow
  • cancelSos() / resolveSos() / acknowledgeSosSummary() — public SOS terminal-state operations
  • currentSosStateStream / lastSosEventStream — public SOS state/event streams
  • listSosHistory(...) — paginated SOS history

Emergency Contacts

  • listEmergencyContacts() / watchEmergencyContacts() — backend-synced contact list
  • createEmergencyContact(...) / updateEmergencyContact(...) / deleteEmergencyContact(...) — CRUD with optional language (ISO 639-1) on create
  • reorderEmergencyContacts(List<String> orderedContactIds)PUT /v1/sdk/contacts/reorder; ids must be exhaustive and unique
  • ContactsHttpException — typed HTTP failures for contact routes (400 / 401 / 404 mapping)

Permissions

  • requestLocationPermission() / requestNotificationPermission() / requestBluetoothPermission()
  • getPermissionState() — aggregated permission snapshot for host UI gating

Protection Mode (Android)

  • getProtectionStatus() / getProtectionDiagnostics() — native foreground service BLE ownership and diagnostics
  • evaluateProtectionReadiness() / enterProtectionMode() / exitProtectionMode() — explicit arming lifecycle
  • watchProtectionStatus() / 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.custom
  • EixamCustomEndpoints(apiBaseUrl:, mqttUrl:) for custom deployments