react-native-acoustic-connect-beta 19.1.16 → 19.1.17

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.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## 19.1.17 (2026-10-28)
2
+
3
+ ### Bug Fixes
4
+
5
+ * CA-159219 only count an active PodSpecs source line ([#134](https://github.com/aipoweredmarketer/react-native-acoustic-connect-beta/issues/134)) ([9f28890](https://github.com/aipoweredmarketer/react-native-acoustic-connect-beta/commit/9f2889027e318f01d08f56723ac0ff6d0049f00b)), closes [cordova-acoustic-connect#64](https://github.com/aipoweredmarketer/cordova-acoustic-connect/issues/64) [#123](https://github.com/aipoweredmarketer/react-native-acoustic-connect-beta/issues/123)
6
+
7
+ ### Reverts
8
+
9
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/aipoweredmarketer/react-native-acoustic-connect-beta/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
1
10
  ## 19.1.16 (2026-10-27)
2
11
 
3
12
  ### Bug Fixes
@@ -1,4 +1,4 @@
1
- #Tue Oct 27 19:25:05 GMT 2026
1
+ #Wed Oct 28 08:42:36 GMT 2026
2
2
  UseWhiteList=true
3
3
  PrintScreen=3
4
4
  UseRandomSample=false
@@ -1,4 +1,4 @@
1
- // Copyright (C) 2025 Acoustic, L.P. All rights reserved.
1
+ // Copyright (C) 2025, 2026 Acoustic, L.P. All rights reserved.
2
2
  //
3
3
  // NOTICE: This file contains material that is confidential and proprietary to
4
4
  // Acoustic, L.P. and/or other developers. No license is granted under any intellectual or
@@ -277,6 +277,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
277
277
  */
278
278
  override fun disable(): Boolean {
279
279
  Log.i(TAG, "[bridge] disable() called from JS")
280
+ forgetRoute()
280
281
  runOnMain {
281
282
  Connect.disable()
282
283
  Log.i(TAG, "[bridge] SDK disabled")
@@ -933,6 +934,11 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
933
934
  */
934
935
  private fun isCaptureAllowed(): Boolean = Connect.isEnabled()
935
936
 
937
+ // The route `<Connect>` last navigated to, so the bridge can post its
938
+ // UNLOAD when the next one is entered.
939
+ private val routeLock = Any()
940
+ private var currentRoute: String? = null
941
+
936
942
  /**
937
943
  * Requests that the framework save the current application page name.
938
944
  *
@@ -1004,7 +1010,10 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1004
1010
  // into a crash; the sample now calls this method directly, so the path is
1005
1011
  // easy to reach from JS.
1006
1012
  val activity = getCurrentActivity() ?: return false
1007
- return logScreenview(activity, logicalPageName?.asSecondOrNull().toString(), ConnectScreenviewType.LOAD, referrer?.asSecondOrNull())
1013
+ // A null name is refused, as on iOS. It used to be stringified, so a
1014
+ // screen named "null" reached analytics (CA-161120).
1015
+ val pageName = logicalPageName?.asSecondOrNull() ?: return false
1016
+ return logScreenview(activity, pageName, ConnectScreenviewType.LOAD, referrer?.asSecondOrNull())
1008
1017
  }
1009
1018
 
1010
1019
  /**
@@ -1022,7 +1031,10 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1022
1031
  // into a crash; the sample now calls this method directly, so the path is
1023
1032
  // easy to reach from JS.
1024
1033
  val activity = getCurrentActivity() ?: return false
1025
- return logScreenview(activity, logicalPageName?.asSecondOrNull().toString(), ConnectScreenviewType.UNLOAD, referrer?.asSecondOrNull())
1034
+ // A null name is refused, as on iOS. It used to be stringified, so a
1035
+ // screen named "null" reached analytics (CA-161120).
1036
+ val pageName = logicalPageName?.asSecondOrNull() ?: return false
1037
+ return logScreenview(activity, pageName, ConnectScreenviewType.UNLOAD, referrer?.asSecondOrNull())
1026
1038
  }
1027
1039
 
1028
1040
  /**
@@ -1048,10 +1060,7 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1048
1060
  // which is not a reason to skip the screenview and layout that follow — they
1049
1061
  // are what the caller asked for. Treating it as fatal would suppress capture
1050
1062
  // in cases that capture fine today.
1051
- resumeConnect(getCurrentActivity(), name, false)
1052
- // The 3-arg overload takes a nullable Activity, so this one is safe to pass
1053
- // through — unlike the 4-arg overload the context methods use.
1054
- logScreenview(getCurrentActivity(), name, ConnectScreenviewType.LOAD)
1063
+ logRouteScreenviews(getCurrentActivity(), name)
1055
1064
  var result = false
1056
1065
  // The layout capture below needs a real activity: it used to go through
1057
1066
  // Objects.requireNonNull, which threw when the activity had gone away
@@ -1069,6 +1078,46 @@ class HybridAcousticConnectRN : HybridAcousticConnectRNSpec(),
1069
1078
  return result
1070
1079
  }
1071
1080
 
1081
+ /**
1082
+ * Resumes capture for [name], first posting an UNLOAD of the route left
1083
+ * when [name] is a different route (CA-161120). Nothing else here is the
1084
+ * bridge's: the LOAD and its referrer stay the SDK's.
1085
+ *
1086
+ * The UNLOAD names the route left as its own referrer, as iOS does. That
1087
+ * also makes the SDK name it as the referrer of the LOAD `resumeConnect`
1088
+ * posts next: the SDK takes a missing referrer from the last referrer it
1089
+ * was given (`Logger.logScreenview`), and an UNLOAD sets that even when the
1090
+ * queue refuses it. Before, the last referrer was whatever the app last
1091
+ * passed to `logScreenViewContextLoad`, so every route carried it. Connect
1092
+ * Android SDKs with the native fix name the screen on display instead,
1093
+ * which is the same route.
1094
+ *
1095
+ * Only routes count: a direct screen view is the app's own call. With no
1096
+ * activity no UNLOAD can be posted (the four-argument overload needs one),
1097
+ * but the route is still recorded.
1098
+ */
1099
+ private fun logRouteScreenviews(activity: Activity?, name: String) {
1100
+ val left: String?
1101
+ synchronized(routeLock) {
1102
+ left = currentRoute.takeIf { it != name }
1103
+ currentRoute = name
1104
+ }
1105
+ if (activity != null && left != null) {
1106
+ logScreenview(activity, left, ConnectScreenviewType.UNLOAD, left)
1107
+ }
1108
+ resumeConnect(activity, name, false)
1109
+ // The 3-arg overload takes a nullable Activity, so this one is safe to pass
1110
+ // through — unlike the 4-arg overload the context methods use.
1111
+ logScreenview(activity, name, ConnectScreenviewType.LOAD)
1112
+ }
1113
+
1114
+ /** Forgets the route, so nothing navigated before a `disable()` is unloaded after it. */
1115
+ private fun forgetRoute() {
1116
+ synchronized(routeLock) {
1117
+ currentRoute = null
1118
+ }
1119
+ }
1120
+
1072
1121
  /**
1073
1122
  * Captures the layout of [activity] as an *automatic* capture — the kind
1074
1123
  * the wrapper triggers itself, on navigation or behind a dialog — rather
package/package.json CHANGED
@@ -228,7 +228,7 @@
228
228
  "source": "src/index",
229
229
  "summary": "react-native ios android tealeaf connect cxa wxca er enhanced-replay",
230
230
  "types": "./lib/typescript/src/index.d.ts",
231
- "version": "19.1.16",
231
+ "version": "19.1.17",
232
232
  "workspaces": [
233
233
  "example",
234
234
  "Examples/bare-workflow"