react-native-acoustic-connect-beta 19.0.36 → 19.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md +42 -12
  3. package/android/build.gradle +15 -61
  4. package/android/src/main/assets/ConnectBasicConfig.properties +4 -4
  5. package/android/src/main/java/com/acousticconnectrn/HybridAcousticConnectRN.kt +47 -47
  6. package/ios/AcousticConnectRNConfig.json +9 -16
  7. package/ios/HybridAcousticConnectRN.swift +5 -5
  8. package/nitrogen/generated/android/AcousticConnectRN+autolinking.cmake +1 -1
  9. package/nitrogen/generated/android/c++/JHybridAcousticConnectRNSpec.cpp +7 -7
  10. package/nitrogen/generated/android/c++/JHybridAcousticConnectRNSpec.hpp +2 -2
  11. package/nitrogen/generated/android/c++/JPushErrorInfo.hpp +1 -1
  12. package/nitrogen/generated/android/c++/JPushPermissionResult.hpp +1 -1
  13. package/nitrogen/generated/android/c++/JVariant_Boolean_NullType.cpp +26 -0
  14. package/nitrogen/generated/android/c++/{JVariant_NullType_Boolean.hpp → JVariant_Boolean_NullType.hpp} +22 -22
  15. package/nitrogen/generated/android/kotlin/com/margelo/nitro/acousticconnectrn/HybridAcousticConnectRNSpec.kt +4 -2
  16. package/nitrogen/generated/android/kotlin/com/margelo/nitro/acousticconnectrn/{Variant_NullType_Boolean.kt → Variant_Boolean_NullType.kt} +10 -10
  17. package/nitrogen/generated/ios/AcousticConnectRN-Swift-Cxx-Bridge.cpp +4 -4
  18. package/nitrogen/generated/ios/AcousticConnectRN-Swift-Cxx-Bridge.hpp +43 -43
  19. package/nitrogen/generated/ios/c++/HybridAcousticConnectRNSpecSwift.hpp +2 -2
  20. package/nitrogen/generated/ios/swift/{Func_void_std__variant_nitro__NullType__bool_.swift → Func_void_std__variant_bool__nitro__NullType_.swift} +13 -13
  21. package/nitrogen/generated/ios/swift/HybridAcousticConnectRNSpec.swift +2 -2
  22. package/nitrogen/generated/ios/swift/HybridAcousticConnectRNSpec_cxx.swift +17 -17
  23. package/nitrogen/generated/ios/swift/{Variant_NullType_Bool.swift → Variant_Bool_NullType.swift} +6 -6
  24. package/nitrogen/generated/shared/c++/HybridAcousticConnectRNSpec.hpp +2 -2
  25. package/package.json +11 -10
  26. package/scripts/gradleParser.js +7 -0
  27. package/nitrogen/generated/android/c++/JVariant_NullType_Boolean.cpp +0 -26
package/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 19.1.2 (2026-09-29)
2
+
3
+ ### Reverts
4
+
5
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/aipoweredmarketer/react-native-acoustic-connect-beta/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
6
+ ## 19.1.1 (2026-09-29)
7
+
8
+ ### Reverts
9
+
10
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/aipoweredmarketer/react-native-acoustic-connect-beta/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
1
11
  ## 19.0.36 (2026-09-28)
2
12
 
3
13
  ### Reverts
package/README.md CHANGED
@@ -9,22 +9,50 @@ For the full product overview see the
9
9
 
10
10
  ## Requirements
11
11
 
12
- - React Native 0.82.x – 0.86.x with the new architecture
13
- - React 19.1.1 or newer — but match the floor your React Native version pins, which is higher on newer releases: RN 0.82 needs `^19.1.1`, RN 0.83 needs `^19.2.0`, and RN 0.84 / 0.85 / 0.86 need `^19.2.3`
14
- - `react-native-nitro-modules` at the **exact** version this package pins in `peerDependencies` (currently **`0.35.9`**) — your app must resolve exactly this version; see [Nitro version pin](#nitro-version-pin)
15
- - Node 20.19.4 or newer — every supported React Native version declares this floor, so plain 20.x is not enough
16
- - JDK 17 or newer for Android builds — the same JDK React Native 0.82 itself
17
- requires. The Android module compiles at Java 17; newer JDKs work.
12
+ These requirements apply to SDK **19.1** and later. If your app is on React Native
13
+ 0.82 or 0.83, or on Expo SDK 55, use SDK **19.0.x** instead — see
14
+ [Which SDK version do I need?](#which-sdk-version-do-i-need).
15
+
16
+ - React Native 0.84.x – 0.87.x with the new architecture. **0.82.x and 0.83.x are not supported from 19.1** — the Nitro version 19.1 pins (`0.37.1`) fails to build on RN 0.83's iOS target.
17
+ - React 19.2.3 or newer — every React Native version in the supported range (0.84 through 0.87) pins `^19.2.3`
18
+ - `react-native-nitro-modules` at the **exact** version this package pins in `peerDependencies` (**`0.37.1`** for 19.1; 19.0.x pins `0.35.9`) — your app must resolve exactly this version; see [Nitro version pin](#nitro-version-pin)
19
+ - Node 20.19.4 or newer for RN 0.84–0.86. **RN 0.87 requires Node 22.13 or newer** (`^22.13.0 || ^24.3.0 || >= 26`) and will not install on Node 20 at all
20
+ - JDK 17 or newer for Android builds — the same JDK React Native itself requires.
21
+ The Android module compiles at Java 17; newer JDKs work.
18
22
  - iOS deployment target ≥ 15.1, AcousticConnect / AcousticConnectDebug pod ≥ 2.0.5
19
23
  - Android `minSdk` ≥ 26, `compileSdk` ≥ 35, `io.github.go-acoustic:connect` in `[11.0.11, 12.0.0)`
20
- - **Expo SDK 55+ is supported** via the bundled Expo Config Plugin —
24
+ - **Expo SDK 56+ is supported** from 19.1 (Expo SDK 55 → use 19.0.x) via the bundled Expo Config Plugin —
21
25
  development builds only (Expo Go is not supported); see
22
- [Using with Expo SDK 55+](#using-with-expo-sdk-55).
26
+ [Using with Expo SDK 56+](#using-with-expo-sdk-56).
27
+
28
+ ### Which SDK version do I need?
29
+
30
+ | Your app | SDK line | `react-native-nitro-modules` |
31
+ | --- | --- | --- |
32
+ | React Native 0.84 – 0.87, or Expo SDK 56 / 57 | **19.1.x** | exactly `0.37.1` |
33
+ | React Native 0.82 – 0.83, or Expo SDK 55 | **19.0.x** (latest `19.0.36`) | exactly `0.35.9` |
34
+
35
+ React Native 0.84 – 0.86 work with either line; 0.87 needs 19.1.
36
+
37
+ ### Upgrading from 19.0.x to 19.1
38
+
39
+ No JavaScript API changed — your app code stays as it is. The upgrade is about
40
+ versions only:
41
+
42
+ 1. Move to React Native **0.84 or newer** and React **19.2.3 or newer** (on Expo,
43
+ SDK **56 or newer**). React Native 0.87 also needs Node **22.13 or newer**.
44
+ 2. Upgrade the SDK and Nitro **together** — the Nitro version must match exactly:
45
+
46
+ ```bash
47
+ npm install react-native-acoustic-connect-beta@^19.1.1 react-native-nitro-modules@0.37.1
48
+ ```
49
+
50
+ 3. iOS: `cd ios && pod install`. Expo: re-run `npx expo prebuild`.
23
51
 
24
52
  ### Nitro version pin
25
53
 
26
54
  This package pins `react-native-nitro-modules` to an **exact version**
27
- (currently **`0.35.9`**) in its `peerDependencies` — deliberately *not* a range.
55
+ (**`0.37.1`** as of 19.1; `0.35.9` on 19.0.x) in its `peerDependencies` — deliberately *not* a range.
28
56
  **Your app must resolve exactly that version.**
29
57
 
30
58
  **Why (important): Nitro patch releases can contain breaking changes.** The SDK
@@ -184,9 +212,11 @@ CocoaPods, so most Mac dev setups already have it).
184
212
  Requires macOS and `Connect.iOSAppGroupIdentifier` already set in
185
213
  `ConnectConfig.json` — run `doctor` first if it's missing.
186
214
 
187
- ## Using with Expo SDK 55+
215
+ ## Using with Expo SDK 56+
188
216
 
189
- Expo SDK 55 and newer is supported via the bundled Expo Config Plugin.
217
+ Expo SDK 56 and newer is supported via the bundled Expo Config Plugin.
218
+ SDK 55 is **not** supported by this release line: it ships React Native 0.83.10,
219
+ below this SDK's 0.84 floor. SDK 56 ships 0.85.3 and SDK 57 ships 0.86.3.
190
220
  **Development builds only** — Expo Go is not supported: Nitro Modules and
191
221
  native push registration require native code that Expo Go cannot load. There
192
222
  is no runtime Expo Go detection or fallback; use
@@ -196,7 +226,7 @@ or EAS Build.
196
226
  ### Install
197
227
 
198
228
  ```bash
199
- npx create-expo-app@latest my-app # Expo SDK 55+, new architecture enabled
229
+ npx create-expo-app@latest my-app # Expo SDK 56+, new architecture enabled
200
230
  cd my-app
201
231
  npx expo install expo-dev-client expo-build-properties
202
232
  npm install react-native-acoustic-connect-beta react-native-nitro-modules
@@ -232,33 +232,6 @@ def acousticVersionPin = (acousticConfig.Connect?.AndroidVersion ?: '').trim()
232
232
  def acousticVersion = acousticVersionPin.isEmpty() ? '+' : acousticVersionPin
233
233
  def acousticArtifact = acousticPushEnabled ? 'connect-push-fcm' : 'connect'
234
234
 
235
- // Connect co-versions `eocore` + `tealeaf` with itself only from 11.0.18-beta
236
- // onward — and from that release their POM scope is `runtime`, which drops them
237
- // off the compile classpath (see the companion declarations below).
238
- //
239
- // Earlier releases in the supported range ship `tealeaf` on its own 10.4.x line
240
- // (with eocore arriving transitively through it) at COMPILE scope, so there the
241
- // companions are both unnecessary AND unresolvable: eocore/tealeaf 11.0.16-beta
242
- // simply do not exist on Maven Central. Guard on the explicit pin so a consumer
243
- // who pinned an older Connect keeps building. An empty pin means `+`, which
244
- // always resolves to the newest (co-versioned) release.
245
- def acousticCompanionsRequired = true
246
- if (!acousticVersionPin.isEmpty()) {
247
- // Compare only the numeric core, ignoring any -beta/+build qualifier: a
248
- // 11.0.18-beta pin must count as >= the 11.0.18 floor. Encoded as one integer
249
- // because Groovy's <=> does not compare two ArrayLists.
250
- def core = acousticVersionPin.replaceAll(/[-+].*$/, '').tokenize('.')
251
- def nums = (0..2).collect { i -> (i < core.size() && core[i].isInteger()) ? core[i].toInteger() : 0 }
252
- // Upper bound as well as lower, so that a pin outside the supported range
253
- // fails on the `strictly '[11.0.11, 12.0.0)'` constraint in the
254
- // `constraints { }` block at the bottom of `dependencies` — which names both
255
- // the range and the reason — rather than on an unresolvable companion
256
- // coordinate. Verified: without this bound a 12.0.0 pin reported
257
- // "Could not find io.github.go-acoustic:eocore:12.0.0", burying the real cause.
258
- def pinCode = nums[0] * 1000000 + nums[1] * 1000 + nums[2]
259
- acousticCompanionsRequired = pinCode >= 11_000_018 && pinCode < 12_000_000
260
- }
261
- println "AcousticConnectRN: companionCompileDeps=$acousticCompanionsRequired (pin='$acousticVersionPin')"
262
235
  println "AcousticConnectRN: PushEnabled=$acousticPushEnabled, artifact=io.github.go-acoustic:$acousticArtifact:$acousticVersion"
263
236
 
264
237
  dependencies {
@@ -280,41 +253,22 @@ dependencies {
280
253
  //noinspection GradleDynamicVersion
281
254
  implementation "io.github.go-acoustic:$acousticArtifact:$acousticVersion"
282
255
 
283
- // Restore the compile classpath for Connect's internal modules. This bridge
284
- // calls into both directly — `com.ibm.eo.EOCore`,
285
- // `com.ibm.eo.model.EOMonitoringLevel`, `com.tl.uic.Tealeaf`,
286
- // `com.tl.uic.model.ScreenviewType`,
287
- // `com.tl.uic.util.{DialogUtil,LayoutUtil,keyboardview.KeyboardView}` — so
288
- // with them at `runtime` scope `compileDebugKotlin` fails with ~34
289
- // "Unresolved reference 'ibm' / 'tl' / 'EOCore'" errors.
290
- //
291
- // compileOnly, not implementation: the artifacts still reach the runtime graph
292
- // through Connect's own transitive, so declaring them there too would risk a
293
- // second, independently-resolved copy.
256
+ // No direct eocore/tealeaf compile dependency for the main sources: the
257
+ // bridge only calls Connect's own public API (Connect.updateConfig/
258
+ // getConfigItem*, ConnectMonitoringLevel, ConnectScreenviewType,
259
+ // Connect.logDialogLayout, Connect.canCaptureUserEvents,
260
+ // Connect.canTakeScreenShot, Connect.getLayoutInfo, Connect.onDestroy, ...).
294
261
  //
295
- // Both scopes are required — compileOnly does NOT propagate to the unit-test
296
- // compile classpath, and android/src/test imports com.ibm.eo.* as well, so
297
- // compileDebugUnitTestKotlin fails without the testCompileOnly pair.
298
- //
299
- // Correct for BOTH artifact variants. `connect-push-fcm` does not declare
300
- // eocore/tealeaf itself — its POM depends on `connect` at compile scope, and
301
- // eocore/tealeaf reach the graph through that at `runtime` scope, so the
302
- // compile classpath is short of them exactly as in the analytics-only case.
303
- // The variants are co-versioned (connect-push-fcm 11.0.18-beta -> connect
304
- // 11.0.18-beta -> eocore/tealeaf 11.0.18-beta), so `$acousticVersion` is the
305
- // right coordinate either way. Confirmed on debugCompileClasspath with
306
- // PushEnabled=true; gating these on `!acousticPushEnabled` would break the
307
- // push variant rather than protect it.
308
- if (acousticCompanionsRequired) {
309
- //noinspection GradleDynamicVersion
310
- compileOnly "io.github.go-acoustic:eocore:$acousticVersion"
311
- //noinspection GradleDynamicVersion
312
- compileOnly "io.github.go-acoustic:tealeaf:$acousticVersion"
313
- //noinspection GradleDynamicVersion
314
- testCompileOnly "io.github.go-acoustic:eocore:$acousticVersion"
315
- //noinspection GradleDynamicVersion
316
- testCompileOnly "io.github.go-acoustic:tealeaf:$acousticVersion"
317
- }
262
+ // android/src/test still needs `com.ibm.eo.util.JsonUtil` directly — it
263
+ // deliberately drives serialization through EOCore's real JsonUtil rather
264
+ // than stopping at the bridge boundary (see HybridAcousticConnectRNTest's
265
+ // "SDK signal serialization" region). That's a fixed historical pin, not
266
+ // `$acousticVersion`: eocore is no longer guaranteed to be published
267
+ // standalone for future Connect releases, and JsonUtil's hash-value
268
+ // behavior isn't expected to change, so there's nothing to gain by
269
+ // tracking the active Connect version here.
270
+ //noinspection GradleDynamicVersion
271
+ testCompileOnly "io.github.go-acoustic:eocore:11.0.36"
318
272
 
319
273
  // Firebase Cloud Messaging — required by the push variant. The
320
274
  // `connect-push-fcm` AAR calls `com.google.firebase.messaging.*`
@@ -1,13 +1,13 @@
1
- #Mon Sep 28 09:50:19 GMT 2026
1
+ #Tue Sep 29 15:34:17 GMT 2026
2
2
  UseWhiteList=true
3
3
  PrintScreen=3
4
4
  UseRandomSample=false
5
5
  CookieDomain=.straussandplesser.com
6
- PostMessageUrl=YOUR_POST_MESSAGE_URL_HERE
6
+ PostMessageUrl=https\://lib-us-2.brilliantcollector.com/collector/collectorPost
7
7
  SessionTimeout=30
8
8
  PercentToCompressImage=80
9
9
  CookieExpires=false
10
- AppKey=YOUR_CONNECT_APP_KEY_HERE
10
+ AppKey=b6c3709b7a4c479bb4b5a9fb8fec324c
11
11
  KillSwitchEnabled=false
12
12
  ScreenShotPixelDensity=1.5
13
13
  CookieExpiresFormat=ASCTIME
@@ -21,7 +21,7 @@ CookieUrl=http\://m.straussandplesser.com
21
21
  ScreenshotFormat=JPG
22
22
  Connection=3
23
23
  CookiePath=/
24
- KillSwitchUrl=YOUR_KILL_SWITCH_URL_HERE
24
+ KillSwitchUrl=https\://lib-us-2.brilliantcollector.com/collector/switch/b6c3709b7a4c479bb4b5a9fb8fec324c
25
25
  LogLocationEnabled=true
26
26
  LogLocationTimeout=30
27
27
  KillSwitchTimeInterval=5
@@ -48,29 +48,24 @@ import com.acoustic.connect.android.connectmod.Connect.logScreenview
48
48
  import com.acoustic.connect.android.connectmod.Connect.onResume
49
49
  import com.acoustic.connect.android.connectmod.Connect.registerFormField
50
50
  import com.acoustic.connect.android.connectmod.Connect.resumeConnect
51
+ import com.acoustic.connect.android.connectmod.model.ConnectMonitoringLevel
52
+ import com.acoustic.connect.android.connectmod.model.ConnectScreenviewType
51
53
  import com.acoustic.connect.android.connectmod.push.PushPermissionState
52
54
  import com.acoustic.connect.android.connectmod.push.core.MobileServiceType
53
55
  import com.facebook.react.bridge.LifecycleEventListener
54
56
  import com.facebook.react.bridge.ReactApplicationContext
55
57
  import com.facebook.react.uimanager.UIManagerHelper
56
- import com.ibm.eo.EOCore
57
- import com.ibm.eo.model.EOMonitoringLevel
58
58
  import com.margelo.nitro.NitroModules.Companion.applicationContext
59
59
  import com.margelo.nitro.acousticconnectrn.HybridAcousticConnectRNSpec
60
60
  import com.margelo.nitro.acousticconnectrn.PushErrorInfo
61
61
  import com.margelo.nitro.acousticconnectrn.PushPermissionResult
62
62
  import com.margelo.nitro.acousticconnectrn.Variant_Boolean_String_Double
63
- import com.margelo.nitro.acousticconnectrn.Variant_NullType_Boolean
63
+ import com.margelo.nitro.acousticconnectrn.Variant_Boolean_NullType
64
64
  import com.margelo.nitro.acousticconnectrn.Variant_NullType_String
65
65
  import com.margelo.nitro.core.AnyMap
66
66
  import com.margelo.nitro.core.ArrayBuffer
67
67
  import com.margelo.nitro.core.NullType
68
68
  import com.margelo.nitro.core.Promise
69
- import com.tl.uic.Tealeaf
70
- import com.tl.uic.model.ScreenviewType
71
- import com.tl.uic.util.DialogUtil
72
- import com.tl.uic.util.LayoutUtil
73
- import com.tl.uic.util.keyboardview.KeyboardView
74
69
  import org.json.JSONArray
75
70
  import org.json.JSONException
76
71
  import org.json.JSONObject
@@ -371,7 +366,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
371
366
  * authorization result needs no forwarding. Kept for API symmetry with iOS
372
367
  * (where it forwards to the native SDK). Never rejects.
373
368
  */
374
- override fun pushDidReceiveAuthorization(granted: Variant_NullType_Boolean?, error: PushErrorInfo?): Promise<Boolean> {
369
+ override fun pushDidReceiveAuthorization(granted: Variant_Boolean_NullType?, error: PushErrorInfo?): Promise<Boolean> {
375
370
  Log.d(TAG, "[bridge] pushDidReceiveAuthorization: no-op on Android (state self-heals via lifecycle)")
376
371
  return Promise.resolved(true)
377
372
  }
@@ -460,12 +455,12 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
460
455
  * `connect` artifact (always on the classpath) and never touches the FCM
461
456
  * transport classes, so there is no missing-artifact / stub-object risk.
462
457
  */
463
- override fun pushGetPermissionState(): Promise<Variant_NullType_Boolean> {
464
- val promise = Promise<Variant_NullType_Boolean>()
458
+ override fun pushGetPermissionState(): Promise<Variant_Boolean_NullType> {
459
+ val promise = Promise<Variant_Boolean_NullType>()
465
460
  runOnMain {
466
461
  val context = applicationContext?.applicationContext
467
462
  if (context == null) {
468
- promise.resolve(Variant_NullType_Boolean.create(NullType.NULL))
463
+ promise.resolve(Variant_Boolean_NullType.create(NullType.NULL))
469
464
  return@runOnMain
470
465
  }
471
466
  try {
@@ -474,9 +469,9 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
474
469
  // `else` branch below), so silence the redundancy warning.
475
470
  @Suppress("REDUNDANT_ELSE_IN_WHEN")
476
471
  val triState = when (Connect.push.getPushPermissionState(context)) {
477
- PushPermissionState.GRANTED -> Variant_NullType_Boolean.create(true)
478
- PushPermissionState.DENIED -> Variant_NullType_Boolean.create(false)
479
- PushPermissionState.NOT_DETERMINED -> Variant_NullType_Boolean.create(NullType.NULL)
472
+ PushPermissionState.GRANTED -> Variant_Boolean_NullType.create(true)
473
+ PushPermissionState.DENIED -> Variant_Boolean_NullType.create(false)
474
+ PushPermissionState.NOT_DETERMINED -> Variant_Boolean_NullType.create(NullType.NULL)
480
475
  // PushPermissionState is a Connect-SDK enum that may gain
481
476
  // values in a future release. An explicit `else` keeps this
482
477
  // forward-compatible: it avoids a compile break if the bridge
@@ -485,12 +480,12 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
485
480
  // bridge built against the old enum, run against a newer one)
486
481
  // with a deliberate fallback. Any unknown/new state maps to the
487
482
  // tri-state `null` ("not determined") — the safest default.
488
- else -> Variant_NullType_Boolean.create(NullType.NULL)
483
+ else -> Variant_Boolean_NullType.create(NullType.NULL)
489
484
  }
490
485
  promise.resolve(triState)
491
486
  } catch (e: Exception) {
492
487
  Log.w(TAG, "[bridge] pushGetPermissionState: query failed — ${e.message}")
493
- promise.resolve(Variant_NullType_Boolean.create(NullType.NULL))
488
+ promise.resolve(Variant_Boolean_NullType.create(NullType.NULL))
494
489
  }
495
490
  }
496
491
  return promise
@@ -545,7 +540,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
545
540
  moduleName: String
546
541
  ): Boolean {
547
542
  val result: Boolean =
548
- EOCore.updateConfig(key, value.toString(), EOCore.getLifecycleObject(moduleName))
543
+ Connect.updateConfig(key, value.toString(), moduleName)
549
544
  return result
550
545
  }
551
546
 
@@ -562,7 +557,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
562
557
  value: String,
563
558
  moduleName: String
564
559
  ): Boolean {
565
- val result = EOCore.updateConfig(key, value, EOCore.getLifecycleObject(moduleName))
560
+ val result = Connect.updateConfig(key, value, moduleName)
566
561
  return result
567
562
  }
568
563
 
@@ -584,7 +579,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
584
579
  // token as the "0" the JSON config files carry, so a consumer setting
585
580
  // a whole-number item at runtime wrote a value that no longer matched
586
581
  // what the same key looks like on iOS (a native number) or on disk.
587
- val result = EOCore.updateConfig(key, formatJsNumber(value), EOCore.getLifecycleObject(moduleName))
582
+ val result = Connect.updateConfig(key, formatJsNumber(value), moduleName)
588
583
  return result
589
584
  }
590
585
 
@@ -602,7 +597,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
602
597
  moduleName: String
603
598
  ): Boolean {
604
599
  val result =
605
- EOCore.updateConfig(key, variantToString(value), EOCore.getLifecycleObject(moduleName))
600
+ Connect.updateConfig(key, variantToString(value), moduleName)
606
601
  return result
607
602
  }
608
603
 
@@ -619,7 +614,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
619
614
  key: String,
620
615
  moduleName: String
621
616
  ): Boolean {
622
- val result = EOCore.getConfigItemBoolean(key, EOCore.getLifecycleObject(moduleName))
617
+ val result = Connect.getConfigItemBoolean(key, moduleName)
623
618
  if (result == false) {
624
619
  return theDefault
625
620
  }
@@ -635,7 +630,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
635
630
  * @return String value if the operation was successful, null otherwise.
636
631
  */
637
632
  override fun getStringItemForKey(theDefault: String, key: String, moduleName: String): Variant_NullType_String? {
638
- var result = EOCore.getConfigItemString(key, EOCore.getLifecycleObject(moduleName))
633
+ var result = Connect.getConfigItemString(key, moduleName)
639
634
  if (TextUtils.isEmpty(result)) {
640
635
  result = theDefault
641
636
  }
@@ -651,7 +646,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
651
646
  * @return Double value if the operation was successful, 0.0 otherwise.
652
647
  */
653
648
  override fun getNumberItemForKey(theDefault: Double, key: String, moduleName: String): Double {
654
- var result = EOCore.getConfigItemDouble(key, EOCore.getLifecycleObject(moduleName))
649
+ var result = Connect.getConfigItemDouble(key, moduleName)
655
650
  if (result == -1.0) {
656
651
  result = theDefault
657
652
  }
@@ -800,7 +795,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
800
795
  * @return True if the operation was successful, false otherwise.
801
796
  */
802
797
  override fun logLocation(): Boolean {
803
- val result = logGeolocation(EOMonitoringLevel.kEOMonitoringLevelInfo.value)
798
+ val result = logGeolocation(ConnectMonitoringLevel.INFO.value)
804
799
  return result
805
800
  }
806
801
 
@@ -1001,7 +996,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1001
996
  // into a crash; the sample now calls this method directly, so the path is
1002
997
  // easy to reach from JS.
1003
998
  val activity = getCurrentActivity() ?: return false
1004
- return logScreenview(activity, logicalPageName?.asSecondOrNull().toString(), ScreenviewType.LOAD, referrer?.asSecondOrNull())
999
+ return logScreenview(activity, logicalPageName?.asSecondOrNull().toString(), ConnectScreenviewType.LOAD, referrer?.asSecondOrNull())
1005
1000
  }
1006
1001
 
1007
1002
  /**
@@ -1019,7 +1014,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1019
1014
  // into a crash; the sample now calls this method directly, so the path is
1020
1015
  // easy to reach from JS.
1021
1016
  val activity = getCurrentActivity() ?: return false
1022
- return logScreenview(activity, logicalPageName?.asSecondOrNull().toString(), ScreenviewType.UNLOAD, referrer?.asSecondOrNull())
1017
+ return logScreenview(activity, logicalPageName?.asSecondOrNull().toString(), ConnectScreenviewType.UNLOAD, referrer?.asSecondOrNull())
1023
1018
  }
1024
1019
 
1025
1020
  /**
@@ -1048,7 +1043,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1048
1043
  resumeConnect(getCurrentActivity(), name, false)
1049
1044
  // The 3-arg overload takes a nullable Activity, so this one is safe to pass
1050
1045
  // through — unlike the 4-arg overload the context methods use.
1051
- logScreenview(getCurrentActivity(), name, ScreenviewType.LOAD)
1046
+ logScreenview(getCurrentActivity(), name, ConnectScreenviewType.LOAD)
1052
1047
  var result = false
1053
1048
  // The layout capture below needs a real activity: it used to go through
1054
1049
  // Objects.requireNonNull, which threw when the activity had gone away
@@ -1056,7 +1051,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1056
1051
  // false — this runs on every Android navigation, so a throw here is a
1057
1052
  // crash on an ordinary screen change.
1058
1053
  val activity = getCurrentActivity()
1059
- if (activity != null && LayoutUtil.canCaptureUserEvents(null, name)) {
1054
+ if (activity != null && Connect.canCaptureUserEvents(null, name)) {
1060
1055
  result = logAutomaticScreenLayout(
1061
1056
  activity,
1062
1057
  name,
@@ -1083,7 +1078,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1083
1078
  * honoured from config and a full-page image shipped in every layout
1084
1079
  * message regardless. Hence the five-argument overload, with
1085
1080
  * `manualLog = false`.
1086
- * - [LayoutUtil.canTakeScreenShot] resolves the same merged layout rule the
1081
+ * - [Connect.canTakeScreenShot] resolves the same merged layout rule the
1087
1082
  * native automatic path uses (global settings as a baseline, any
1088
1083
  * per-screen rule applied over them). It is preferred over reading
1089
1084
  * `ScreenShot` directly because it is `has()`-guarded: a per-screen rule
@@ -1108,7 +1103,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1108
1103
  name,
1109
1104
  delayMs,
1110
1105
  false,
1111
- LayoutUtil.canTakeScreenShot(null, name)
1106
+ Connect.canTakeScreenShot(name)
1112
1107
  )
1113
1108
  }
1114
1109
 
@@ -1122,7 +1117,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1122
1117
  * fired at the start of the screen transition and the configured value
1123
1118
  * was inert.
1124
1119
  *
1125
- * [LayoutUtil.getLayoutInfo] returns the merged rule for the screen: the
1120
+ * [Connect.getLayoutInfo] returns the merged rule for the screen: the
1126
1121
  * global settings as a baseline with any per-screen rule applied over
1127
1122
  * them, so this picks up either without re-implementing the precedence.
1128
1123
  * It reads the config off disk, so a malformed or absent block falls back
@@ -1134,7 +1129,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1134
1129
  return delay.toInt()
1135
1130
  }
1136
1131
  return try {
1137
- LayoutUtil.getLayoutInfo(name)
1132
+ Connect.getLayoutInfo(name)
1138
1133
  ?.optInt(CAPTURE_LAYOUT_DELAY_KEY, DEFAULT_CAPTURE_LAYOUT_DELAY_MS)
1139
1134
  ?.coerceAtLeast(0)
1140
1135
  ?: DEFAULT_CAPTURE_LAYOUT_DELAY_MS
@@ -1173,7 +1168,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1173
1168
  if (dialog != null) {
1174
1169
  val activity = getCurrentActivity()
1175
1170
  if (activity != null) {
1176
- DialogUtil.logDialog(getCurrentActivity(), dialog)
1171
+ Connect.logDialogLayout(activity, dialog)
1177
1172
  // Tealeaf.logScreenLayoutSetOnShowListener(activity, dialog, dialogId, true)
1178
1173
  Log.v(TAG, "Delayed screenshot capture successful for dialog: $dialogId")
1179
1174
  }
@@ -1197,7 +1192,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1197
1192
  if (dialog != null) {
1198
1193
  val activity = getCurrentActivity()
1199
1194
  if (activity != null) {
1200
- DialogUtil.logDialog(getCurrentActivity(), dialog)
1195
+ Connect.logDialogLayout(activity, dialog)
1201
1196
  return true
1202
1197
  } else {
1203
1198
  result = false
@@ -1337,7 +1332,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1337
1332
  values["timestamp"] = System.currentTimeMillis().toString()
1338
1333
 
1339
1334
  result =
1340
- Connect.logCustomEvent("DialogDismissEvent", values, EOMonitoringLevel.kEOMonitoringLevelInfo.value)
1335
+ Connect.logCustomEvent("DialogDismissEvent", values, ConnectMonitoringLevel.INFO.value)
1341
1336
  } catch (e: Exception) {
1342
1337
  Log.v(TAG, "Error logging dialog dismiss event: ${e.message}")
1343
1338
  result = false
@@ -1364,7 +1359,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1364
1359
  values["eventType"] = "dialog_button_click"
1365
1360
  values["timestamp"] = System.currentTimeMillis().toString()
1366
1361
 
1367
- result = Connect.logCustomEvent("DialogButtonClickEvent", values, EOMonitoringLevel.kEOMonitoringLevelInfo.value)
1362
+ result = Connect.logCustomEvent("DialogButtonClickEvent", values, ConnectMonitoringLevel.INFO.value)
1368
1363
 
1369
1364
  // TODO: JS pass button id
1370
1365
  // Simple approach: find the most recently shown dialog
@@ -1422,7 +1417,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1422
1417
  }
1423
1418
 
1424
1419
  result =
1425
- Connect.logCustomEvent("DialogCustomEvent", eventValues, EOMonitoringLevel.kEOMonitoringLevelInfo.value)
1420
+ Connect.logCustomEvent("DialogCustomEvent", eventValues, ConnectMonitoringLevel.INFO.value)
1426
1421
  } catch (e: Exception) {
1427
1422
  Log.v(TAG, "Error logging dialog custom event: ${e.message}")
1428
1423
  result = false
@@ -1645,13 +1640,19 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1645
1640
  if (hasFocus) {
1646
1641
  val imm = v.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
1647
1642
  imm.showSoftInput(v, InputMethodManager.SHOW_FORCED)
1648
- val keyboardView = KeyboardView(v.context.applicationContext, null)
1643
+ // The soft keyboard has no real View in the hierarchy to report, and
1644
+ // Tealeaf's own com.tl.uic.util.keyboardview.KeyboardView is an internal
1645
+ // type this bridge can no longer import. A plain View is a placeholder
1646
+ // standing in for "the keyboard" as the logEvent target — the same
1647
+ // substitution Tealeaf's own native TLHelper.CustomOnFocusListener makes
1648
+ // for this identical notification.
1649
+ val keyboardEventTarget = View(v.context.applicationContext)
1649
1650
 
1650
1651
  if (TextUtils.isEmpty(accessibilityID)) {
1651
- logEvent(keyboardView, TLF_UI_KEYBOARD_DID_SHOW_NOTIFICATION)
1652
+ logEvent(keyboardEventTarget, TLF_UI_KEYBOARD_DID_SHOW_NOTIFICATION)
1652
1653
  logEvent(v, TLF_ON_FOCUS_CHANGE_IN)
1653
1654
  } else {
1654
- logEvent(keyboardView, TLF_UI_KEYBOARD_DID_SHOW_NOTIFICATION, accessibilityID!!)
1655
+ logEvent(keyboardEventTarget, TLF_UI_KEYBOARD_DID_SHOW_NOTIFICATION, accessibilityID!!)
1655
1656
  logEvent(v, TLF_ON_FOCUS_CHANGE_IN, accessibilityID!!)
1656
1657
  }
1657
1658
  } else {
@@ -1659,12 +1660,13 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1659
1660
  val imm = v.context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
1660
1661
  imm.hideSoftInputFromWindow(v.windowToken, 0)
1661
1662
 
1662
- val keyboardView = KeyboardView(v.context.applicationContext, null)
1663
+ // Same placeholder-View substitution as the show-notification branch above.
1664
+ val keyboardEventTarget = View(v.context.applicationContext)
1663
1665
 
1664
1666
  if (TextUtils.isEmpty(accessibilityID)) {
1665
- logEvent(keyboardView, TLF_UI_KEYBOARD_DID_HIDE_NOTIFICATION)
1667
+ logEvent(keyboardEventTarget, TLF_UI_KEYBOARD_DID_HIDE_NOTIFICATION)
1666
1668
  } else {
1667
- logEvent(keyboardView, TLF_UI_KEYBOARD_DID_HIDE_NOTIFICATION, accessibilityID!!)
1669
+ logEvent(keyboardEventTarget, TLF_UI_KEYBOARD_DID_HIDE_NOTIFICATION, accessibilityID!!)
1668
1670
  }
1669
1671
  }
1670
1672
  }
@@ -1762,9 +1764,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1762
1764
  return
1763
1765
  }
1764
1766
 
1765
- Tealeaf.onDestroy(activity, null)
1766
- // Uncomment if Connect.onDestroy is needed
1767
- // Connect.onDestroy(activity, null)
1767
+ Connect.onDestroy(activity, null)
1768
1768
  }
1769
1769
 
1770
1770
  companion object {
@@ -1,15 +1,14 @@
1
1
  {
2
2
  "Connect": {
3
+ "AppKey": "b6c3709b7a4c479bb4b5a9fb8fec324c",
4
+ "KillSwitchUrl": "https://lib-us-2.brilliantcollector.com/collector/switch/b6c3709b7a4c479bb4b5a9fb8fec324c",
5
+ "PostMessageUrl": "https://lib-us-2.brilliantcollector.com/collector/collectorPost",
3
6
  "AndroidVersion": "",
4
- "AppKey": "YOUR_CONNECT_APP_KEY_HERE",
5
- "KillSwitchUrl": "YOUR_KILL_SWITCH_URL_HERE",
6
- "PostMessageUrl": "YOUR_POST_MESSAGE_URL_HERE",
7
- "PushEnabled": true,
8
- "iOSPushMode": "automatic",
9
- "iOSAppGroupIdentifier": "group.co.acoustic.mobile.connect.rn.expodemo",
10
- "iOSDevelopmentTeam": "YOUR_TEAM_ID",
11
- "AndroidNotificationIconResName": "ic_notification",
12
7
  "iOSVersion": "",
8
+ "PushEnabled": false,
9
+ "iOSPushMode": "automatic",
10
+ "iOSAppGroupIdentifier": null,
11
+ "AndroidNotificationIconResName": null,
13
12
  "layoutConfigAndroid": {
14
13
  "AppendMapIds": {
15
14
  "[w,9290],[v,0]": {
@@ -69,10 +68,7 @@
69
68
  "MaskAccessibilityIdList": [],
70
69
  "MaskAccessibilityLabelList": [],
71
70
  "MaskIdList": [],
72
- "MaskValueList": [
73
- "^SECRET-.*$",
74
- "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
75
- ],
71
+ "MaskValueList": [],
76
72
  "Sensitive": {
77
73
  "capitalCaseAlphabet": "X",
78
74
  "number": "9",
@@ -145,10 +141,7 @@
145
141
  "MaskAccessibilityIdList": [],
146
142
  "MaskAccessibilityLabelList": [],
147
143
  "MaskIdList": [],
148
- "MaskValueList": [
149
- "^SECRET-.*$",
150
- "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
151
- ],
144
+ "MaskValueList": [],
152
145
  "Sensitive": {
153
146
  "capitalCaseAlphabet": "X",
154
147
  "number": "9",
@@ -423,7 +423,7 @@ class HybridAcousticConnectRN: HybridAcousticConnectRNSpec {
423
423
  /// Forwards externally-obtained permission state to the SDK. Tri-state
424
424
  /// `granted`: `true`/`false` forward; `nil` (notDetermined) is recorded by
425
425
  /// the OS, not forwarded — the SDK has no notion of an "unknown" state.
426
- func pushDidReceiveAuthorization(granted: Variant_NullType_Bool?, error: PushErrorInfo?) throws -> Promise<Bool> {
426
+ func pushDidReceiveAuthorization(granted: Variant_Bool_NullType?, error: PushErrorInfo?) throws -> Promise<Bool> {
427
427
  // `nil` (notDetermined) is intentionally not forwarded — the SDK has no
428
428
  // notion of an "unknown" authorization. This resolves `true` ("handled —
429
429
  // accepted, not forwarded"), not a failure.
@@ -464,16 +464,16 @@ class HybridAcousticConnectRN: HybridAcousticConnectRNSpec {
464
464
  /// Reads the current notification permission state without prompting, mapped
465
465
  /// to a tri-state: `true` granted, `false` denied, `null` not determined.
466
466
  /// Never rejects — push-not-enabled resolves as `null`.
467
- func pushGetPermissionState() throws -> Promise<Variant_NullType_Bool> {
467
+ func pushGetPermissionState() throws -> Promise<Variant_Bool_NullType> {
468
468
  return Promise.async { @MainActor in
469
469
  do {
470
470
  if let granted = try await ConnectSDK.shared.push.getCurrentAuthorization() {
471
- return .second(granted)
471
+ return .first(granted)
472
472
  }
473
- return .first(.null)
473
+ return .second(.null)
474
474
  } catch {
475
475
  bridgeLog.error("pushGetPermissionState failed: \(error.localizedDescription, privacy: .public)")
476
- return .first(.null)
476
+ return .second(.null)
477
477
  }
478
478
  }
479
479
  }
@@ -37,7 +37,7 @@ target_sources(
37
37
  # Android-specific Nitrogen C++ sources
38
38
  ../nitrogen/generated/android/c++/JHybridAcousticConnectRNSpec.cpp
39
39
  ../nitrogen/generated/android/c++/JVariant_NullType_String.cpp
40
- ../nitrogen/generated/android/c++/JVariant_NullType_Boolean.cpp
40
+ ../nitrogen/generated/android/c++/JVariant_Boolean_NullType.cpp
41
41
  ../nitrogen/generated/android/c++/JVariant_Boolean_String_Double.cpp
42
42
  )
43
43