-
Initial release of the Countly HarmonyOS SDK (ArkTS).
-
Added multi-instance entrypoints on "Countly":
- "Countly.initShared(config)" / "Countly.sharedInstance()", initShared is smart: returns the cached instance when healthy, auto-replaces it (via "stop()") when the existing one is stopped, halted, or UCM-locked. Single in-process re-init API.
- "Countly.createInstance(name, config)" / "Countly.getInstance(name)" / "Countly.listInstances()"
- "Countly.stopAll()", stops every active instance, preserves storage.
- "Countly.haltAll()", halts every active instance and wipes storage.
- Each instance owns its own storage, device ID, queues, and HarmonyOS lifecycle subscription.
-
Added the "stop" / "halt" lifecycle distinction on "CountlyInstance":
- "instance.stop()", halts in-memory (drains modules, halts the queue, deregisters lifecycle, cancels timers); persisted storage is preserved.
- "instance.halt()", does "stop()" then wipes every persisted SDK key. For "user data deletion" flows.
- Both are idempotent and per-instance isolated, halting one does not affect siblings.
-
Added the events API on "countly.events":
- "recordEvent(key, segmentation, count, sum, duration)"
- "recordPastEvent(key, segmentation, count, sum, duration, timestamp)"
- "startEvent(key)" / "endEvent(key, segmentation, count, sum)" / "cancelEvent(key)"
-
Added the views API on "countly.views":
- "startAutoStoppedView(name, segmentation)" / "startView(name, segmentation)"
- "stopViewWithName(name, segmentation)" / "stopViewWithID(id, segmentation)" / "stopAllViews(segmentation)"
- "pauseViewWithID(id)" / "resumeViewWithID(id)"
- "addSegmentationToViewWithID(id, segmentation)" / "addSegmentationToViewWithName(name, segmentation)"
- "setGlobalViewSegmentation(segmentation)" / "updateGlobalViewSegmentation(segmentation)"
- "updateOrientation(mode)"
-
Added the sessions API on "countly.sessions":
- "beginSession()" / "updateSession()" / "endSession()"
- Manual session control and manual hybrid mode via "CountlyConfig.sessions"
-
Added the crashes API on "countly.crashes":
- "addCrashBreadcrumb(record)"
- "recordHandledException(err, segmentation)" / "recordUnhandledException(err, segmentation)"
- "setThreadStackProvider(provider)"
- Global crash filter callback and custom crash segmentation via "CountlyConfig.crashes"
-
Added the user profile API on "countly.userProfile":
- "setProperty(key, value)" / "setProperties(data)"
- "increment(key)" / "incrementBy(key, value)" / "multiply(key, value)"
- "saveMax(key, value)" / "saveMin(key, value)" / "setOnce(key, value)"
- "push(key, value)" / "pushUnique(key, value)" / "pull(key, value)"
- "save()" / "clear()"
- Predefined properties: name, username, email, organization, phone, picture, gender, byear
-
Added the consent API on "countly.consent":
- "giveConsentAll()" / "removeConsentAll()"
- "checkAllConsent()"
- Init-time configuration via "CountlyConfig.consent.setRequiresConsent(true)" and "giveAll()"
-
Added Unknown Consent Mode via "CountlyConfig.consent.enableUnknownConsentMode()". Collects telemetry locally with the queue paused and the network transport silenced; nothing ships until the integrator resolves. The instance keeps running through both paths.
- "giveConsentAll()", unsilences and resumes; buffered data ships. SDK continues with full consent.
- "removeConsentAll()", clears the buffered queue, ships a single all-false revocation snapshot, locks runtime consent ("consent is set per init"). Re-init with a new "CountlyConfig" to unlock.
- Implies "setRequiresConsent(true)".
-
Added the device ID API on "countly.deviceId":
- "setID(deviceId)"
- "changeWithMerge(deviceId)" / "changeWithoutMerge(deviceId)"
- "getID()" / "getType()"
- "isTemporaryIdMode()" / "enableTemporaryIdMode()"
-
Added the location API on "countly.location":
- "setLocation(country, city, gps, ip)" / "disableLocation()"
-
Added the remote config API on "countly.remoteConfig":
- "downloadAllKeys(callback)" / "downloadSpecificKeys(keys, callback)" / "downloadOmittingKeys(keys, callback)"
- "getValue(key)" / "getValues()"
- "getValueAndEnroll(key)" / "getAllValuesAndEnroll()"
- "enrollIntoABTestsForKeys(keys)" / "exitABTestsForKeys(keys)"
- "registerDownloadCallback(cb)" / "removeDownloadCallback(cb)"
- "clearAllRemoteConfig()"
- Automatic triggers, AB enroll-on-download, and value caching via "CountlyConfig.remoteConfig"
-
Added the request queue API on "countly.requestQueue":
- "enableOfflineMode()" / "disableOfflineMode(deviceId)"
- "flushQueues()"
- "replaceAllAppKeysInQueueWithCurrentAppKey()" / "removeDifferentAppKeysFromQueue()"
- "addDirectRequest(parameters)"
- "recordMetrics(metricOverride)"
-
Added automatic lifecycle tracking. Each instance subscribes to HarmonyOS "applicationStateChange" on "init()" and unsubscribes on "stop()" / "halt()". Manual control available via "Countly.lifecycleForegroundAll()" / "lifecycleBackgroundAll()".
-
Added automatic view tracking via "CountlyConfig.views.enableAutomaticViewTracking()", with optional short names ("enableAutomaticViewShortNames") and ability exclusions ("setAutomaticViewTrackingExclusions").
-
Added automatic orientation tracking (on by default), toggleable via "CountlyConfig.views.setTrackOrientationChanges(enabled)".
-
Added SDK Behavior Settings (server-side configuration):
- Automatic fetch and cache
- Event and request queue size limits
- Key and value length limits
- Tracking control (global, events, views)
- Automatic view, session, and crash tracking toggles
- Event and user-property allow/block lists
- Segmentation allow/block lists, including per-event segmentation filtering
-
Added networking configuration on "CountlyConfig.network":
- "addCustomNetworkRequestHeaders(headers)"
- "setMaxRequestQueueSize(size)" / "setRequestDropAgeHours(hours)" / "setRequestTimeoutDuration(seconds)"
- "setHttpPostForced(isForced)"
- "setParameterTamperingProtectionSalt(salt)"
- "disableBackoffMechanism()"
- "enableOfflineMode()" to start the SDK in offline mode
- "disableHealthCheck()" to opt out of the one-shot health-check report
- Optional storage and network overrides on "Countly.initShared(config, storageOverride, networkOverride)" and "Countly.createInstance(name, config, storageOverride, networkOverride)"
-
Added a configurable logging system:
- Log levels: error, warning, info, debug, verbose
- Custom listener via "CountlyConfig.logging.setListener(listener)"
-
Added a built-in device metric provider that auto-collects HarmonyOS device metrics, with override support via "CountlyConfig.setMetricOverride(metricOverride)" and an explicit app version via "CountlyConfig.setAppVersion(version)".