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.
- package/CHANGELOG.md +10 -0
- package/README.md +42 -12
- package/android/build.gradle +15 -61
- package/android/src/main/assets/ConnectBasicConfig.properties +4 -4
- package/android/src/main/java/com/acousticconnectrn/HybridAcousticConnectRN.kt +47 -47
- package/ios/AcousticConnectRNConfig.json +9 -16
- package/ios/HybridAcousticConnectRN.swift +5 -5
- package/nitrogen/generated/android/AcousticConnectRN+autolinking.cmake +1 -1
- package/nitrogen/generated/android/c++/JHybridAcousticConnectRNSpec.cpp +7 -7
- package/nitrogen/generated/android/c++/JHybridAcousticConnectRNSpec.hpp +2 -2
- package/nitrogen/generated/android/c++/JPushErrorInfo.hpp +1 -1
- package/nitrogen/generated/android/c++/JPushPermissionResult.hpp +1 -1
- package/nitrogen/generated/android/c++/JVariant_Boolean_NullType.cpp +26 -0
- package/nitrogen/generated/android/c++/{JVariant_NullType_Boolean.hpp → JVariant_Boolean_NullType.hpp} +22 -22
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/acousticconnectrn/HybridAcousticConnectRNSpec.kt +4 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/acousticconnectrn/{Variant_NullType_Boolean.kt → Variant_Boolean_NullType.kt} +10 -10
- package/nitrogen/generated/ios/AcousticConnectRN-Swift-Cxx-Bridge.cpp +4 -4
- package/nitrogen/generated/ios/AcousticConnectRN-Swift-Cxx-Bridge.hpp +43 -43
- package/nitrogen/generated/ios/c++/HybridAcousticConnectRNSpecSwift.hpp +2 -2
- package/nitrogen/generated/ios/swift/{Func_void_std__variant_nitro__NullType__bool_.swift → Func_void_std__variant_bool__nitro__NullType_.swift} +13 -13
- package/nitrogen/generated/ios/swift/HybridAcousticConnectRNSpec.swift +2 -2
- package/nitrogen/generated/ios/swift/HybridAcousticConnectRNSpec_cxx.swift +17 -17
- package/nitrogen/generated/ios/swift/{Variant_NullType_Bool.swift → Variant_Bool_NullType.swift} +6 -6
- package/nitrogen/generated/shared/c++/HybridAcousticConnectRNSpec.hpp +2 -2
- package/package.json +11 -10
- package/scripts/gradleParser.js +7 -0
- 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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
-
|
|
17
|
-
|
|
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
|
|
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
|
|
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
|
-
(
|
|
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
|
|
215
|
+
## Using with Expo SDK 56+
|
|
188
216
|
|
|
189
|
-
Expo SDK
|
|
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
|
|
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
|
package/android/build.gradle
CHANGED
|
@@ -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
|
-
//
|
|
284
|
-
// calls
|
|
285
|
-
//
|
|
286
|
-
//
|
|
287
|
-
//
|
|
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
|
-
//
|
|
296
|
-
//
|
|
297
|
-
//
|
|
298
|
-
//
|
|
299
|
-
//
|
|
300
|
-
//
|
|
301
|
-
//
|
|
302
|
-
//
|
|
303
|
-
//
|
|
304
|
-
|
|
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
|
-
#
|
|
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=
|
|
6
|
+
PostMessageUrl=https\://lib-us-2.brilliantcollector.com/collector/collectorPost
|
|
7
7
|
SessionTimeout=30
|
|
8
8
|
PercentToCompressImage=80
|
|
9
9
|
CookieExpires=false
|
|
10
|
-
AppKey=
|
|
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=
|
|
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.
|
|
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:
|
|
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<
|
|
464
|
-
val promise = Promise<
|
|
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(
|
|
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 ->
|
|
478
|
-
PushPermissionState.DENIED ->
|
|
479
|
-
PushPermissionState.NOT_DETERMINED ->
|
|
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 ->
|
|
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(
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(
|
|
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(),
|
|
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(),
|
|
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,
|
|
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 &&
|
|
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
|
-
* - [
|
|
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
|
-
|
|
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
|
-
* [
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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(
|
|
1652
|
+
logEvent(keyboardEventTarget, TLF_UI_KEYBOARD_DID_SHOW_NOTIFICATION)
|
|
1652
1653
|
logEvent(v, TLF_ON_FOCUS_CHANGE_IN)
|
|
1653
1654
|
} else {
|
|
1654
|
-
logEvent(
|
|
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
|
-
|
|
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(
|
|
1667
|
+
logEvent(keyboardEventTarget, TLF_UI_KEYBOARD_DID_HIDE_NOTIFICATION)
|
|
1666
1668
|
} else {
|
|
1667
|
-
logEvent(
|
|
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
|
-
|
|
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:
|
|
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<
|
|
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 .
|
|
471
|
+
return .first(granted)
|
|
472
472
|
}
|
|
473
|
-
return .
|
|
473
|
+
return .second(.null)
|
|
474
474
|
} catch {
|
|
475
475
|
bridgeLog.error("pushGetPermissionState failed: \(error.localizedDescription, privacy: .public)")
|
|
476
|
-
return .
|
|
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++/
|
|
40
|
+
../nitrogen/generated/android/c++/JVariant_Boolean_NullType.cpp
|
|
41
41
|
../nitrogen/generated/android/c++/JVariant_Boolean_String_Double.cpp
|
|
42
42
|
)
|
|
43
43
|
|