react-native-acoustic-connect 19.0.11 → 19.0.28

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 (376) hide show
  1. package/CHANGELOG.md +81 -0
  2. package/README.md +390 -1
  3. package/android/build.gradle +86 -3
  4. package/android/config.gradle +123 -13
  5. package/android/src/main/java/com/acousticconnectrn/HybridAcousticConnectRN.kt +407 -34
  6. package/app.plugin.js +2 -2
  7. package/ios/AcousticConnectRNConfig.json +2 -2
  8. package/ios/ConnectRNParsing.swift +229 -0
  9. package/ios/HybridAcousticConnectRN.swift +290 -30
  10. package/lib/commonjs/TLTRN.js +116 -3
  11. package/lib/commonjs/TLTRN.js.map +1 -1
  12. package/lib/commonjs/components/Connect.js +145 -27
  13. package/lib/commonjs/components/Connect.js.map +1 -1
  14. package/lib/commonjs/index.js +3 -0
  15. package/lib/commonjs/index.js.map +1 -1
  16. package/lib/module/TLTRN.js +116 -3
  17. package/lib/module/TLTRN.js.map +1 -1
  18. package/lib/module/components/Connect.js +146 -28
  19. package/lib/module/components/Connect.js.map +1 -1
  20. package/lib/module/index.js +5 -0
  21. package/lib/module/index.js.map +1 -1
  22. package/lib/typescript/src/TLTRN.d.ts +85 -1
  23. package/lib/typescript/src/TLTRN.d.ts.map +1 -1
  24. package/lib/typescript/src/components/Connect.d.ts.map +1 -1
  25. package/lib/typescript/src/index.d.ts +1 -0
  26. package/lib/typescript/src/index.d.ts.map +1 -1
  27. package/lib/typescript/src/specs/react-native-acoustic-connect.nitro.d.ts +178 -10
  28. package/lib/typescript/src/specs/react-native-acoustic-connect.nitro.d.ts.map +1 -1
  29. package/nitrogen/generated/android/c++/JHybridAcousticConnectRNSpec.cpp +5 -9
  30. package/nitrogen/generated/android/c++/JHybridAcousticConnectRNSpec.hpp +1 -1
  31. package/nitrogen/generated/android/kotlin/com/margelo/nitro/acousticconnectrn/HybridAcousticConnectRNSpec.kt +2 -1
  32. package/nitrogen/generated/ios/AcousticConnectRN-Swift-Cxx-Umbrella.hpp +1 -0
  33. package/nitrogen/generated/ios/c++/HybridAcousticConnectRNSpecSwift.hpp +2 -1
  34. package/nitrogen/generated/ios/swift/HybridAcousticConnectRNSpec.swift +1 -1
  35. package/nitrogen/generated/ios/swift/HybridAcousticConnectRNSpec_cxx.swift +2 -25
  36. package/nitrogen/generated/shared/c++/HybridAcousticConnectRNSpec.hpp +2 -1
  37. package/package.json +4 -7
  38. package/plugin/build/withConnectAndroidConfig.d.ts +2 -2
  39. package/plugin/build/withConnectAndroidConfig.js +2 -2
  40. package/plugin/build/withConnectIosSigning.d.ts +1 -1
  41. package/plugin/build/withConnectIosSigning.js +1 -1
  42. package/plugin/src/withConnectAndroidConfig.ts +2 -2
  43. package/plugin/src/withConnectIosSigning.ts +1 -1
  44. package/scripts/gradleParser.js +1 -1
  45. package/src/TLTRN.ts +125 -4
  46. package/src/components/Connect.tsx +150 -27
  47. package/src/index.ts +5 -0
  48. package/src/specs/react-native-acoustic-connect.nitro.ts +180 -10
  49. package/Examples/SampleUI/.bundle/config +0 -2
  50. package/Examples/SampleUI/.detoxrc.js +0 -83
  51. package/Examples/SampleUI/.eslintrc.js +0 -4
  52. package/Examples/SampleUI/.prettierrc.js +0 -7
  53. package/Examples/SampleUI/.watchmanconfig +0 -1
  54. package/Examples/SampleUI/App.js +0 -1
  55. package/Examples/SampleUI/Gemfile +0 -10
  56. package/Examples/SampleUI/Gemfile.lock +0 -121
  57. package/Examples/SampleUI/README.md +0 -79
  58. package/Examples/SampleUI/__tests__/App.test.tsx +0 -17
  59. package/Examples/SampleUI/android/app/build.gradle +0 -129
  60. package/Examples/SampleUI/android/app/debug.keystore +0 -0
  61. package/Examples/SampleUI/android/app/proguard-rules.pro +0 -10
  62. package/Examples/SampleUI/android/app/src/debug/AndroidManifest.xml +0 -9
  63. package/Examples/SampleUI/android/app/src/main/AndroidManifest.xml +0 -31
  64. package/Examples/SampleUI/android/app/src/main/java/com/sampleui/MainActivity.kt +0 -30
  65. package/Examples/SampleUI/android/app/src/main/java/com/sampleui/MainApplication.kt +0 -53
  66. package/Examples/SampleUI/android/app/src/main/res/drawable/rn_edit_text_material.xml +0 -37
  67. package/Examples/SampleUI/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  68. package/Examples/SampleUI/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  69. package/Examples/SampleUI/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  70. package/Examples/SampleUI/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  71. package/Examples/SampleUI/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  72. package/Examples/SampleUI/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  73. package/Examples/SampleUI/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  74. package/Examples/SampleUI/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  75. package/Examples/SampleUI/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  76. package/Examples/SampleUI/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  77. package/Examples/SampleUI/android/app/src/main/res/values/strings.xml +0 -3
  78. package/Examples/SampleUI/android/app/src/main/res/values/styles.xml +0 -9
  79. package/Examples/SampleUI/android/build.gradle +0 -21
  80. package/Examples/SampleUI/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  81. package/Examples/SampleUI/android/gradle/wrapper/gradle-wrapper.properties +0 -7
  82. package/Examples/SampleUI/android/gradle.properties +0 -39
  83. package/Examples/SampleUI/android/gradlew +0 -252
  84. package/Examples/SampleUI/android/gradlew.bat +0 -94
  85. package/Examples/SampleUI/android/settings.gradle +0 -21
  86. package/Examples/SampleUI/app.json +0 -51
  87. package/Examples/SampleUI/assets/fonts/Abel-Regular.ttf +0 -0
  88. package/Examples/SampleUI/assets/fonts/NotoSans-Regular.ttf +0 -0
  89. package/Examples/SampleUI/assets/images/android-icon.png +0 -0
  90. package/Examples/SampleUI/assets/images/artist-1.jpg +0 -0
  91. package/Examples/SampleUI/assets/images/artist-2.jpg +0 -0
  92. package/Examples/SampleUI/assets/images/avatar.png +0 -0
  93. package/Examples/SampleUI/assets/images/beach.jpg +0 -0
  94. package/Examples/SampleUI/assets/images/bridge.jpg +0 -0
  95. package/Examples/SampleUI/assets/images/chameleon.jpg +0 -0
  96. package/Examples/SampleUI/assets/images/city.jpg +0 -0
  97. package/Examples/SampleUI/assets/images/email-icon.png +0 -0
  98. package/Examples/SampleUI/assets/images/favorite.png +0 -0
  99. package/Examples/SampleUI/assets/images/forest.jpg +0 -0
  100. package/Examples/SampleUI/assets/images/paper-icon.png +0 -0
  101. package/Examples/SampleUI/assets/images/players-2.jpg +0 -0
  102. package/Examples/SampleUI/assets/images/players.jpg +0 -0
  103. package/Examples/SampleUI/assets/images/restaurant-1.jpg +0 -0
  104. package/Examples/SampleUI/assets/images/restaurant-2.jpg +0 -0
  105. package/Examples/SampleUI/assets/images/song-1.jpg +0 -0
  106. package/Examples/SampleUI/assets/images/song-2.jpg +0 -0
  107. package/Examples/SampleUI/assets/images/splash.png +0 -0
  108. package/Examples/SampleUI/assets/images/strawberries.jpg +0 -0
  109. package/Examples/SampleUI/assets/images/wrecked-ship.jpg +0 -0
  110. package/Examples/SampleUI/assets/styles/fonts.css +0 -47
  111. package/Examples/SampleUI/babel.config.js +0 -22
  112. package/Examples/SampleUI/index.js +0 -9
  113. package/Examples/SampleUI/ios/.xcode.env +0 -11
  114. package/Examples/SampleUI/ios/Podfile +0 -71
  115. package/Examples/SampleUI/ios/Podfile.lock +0 -2276
  116. package/Examples/SampleUI/ios/SampleUI/AppDelegate.h +0 -7
  117. package/Examples/SampleUI/ios/SampleUI/AppDelegate.mm +0 -31
  118. package/Examples/SampleUI/ios/SampleUI/Images.xcassets/AppIcon.appiconset/Contents.json +0 -53
  119. package/Examples/SampleUI/ios/SampleUI/Images.xcassets/Contents.json +0 -6
  120. package/Examples/SampleUI/ios/SampleUI/Info.plist +0 -52
  121. package/Examples/SampleUI/ios/SampleUI/LaunchScreen.storyboard +0 -47
  122. package/Examples/SampleUI/ios/SampleUI/PrivacyInfo.xcprivacy +0 -48
  123. package/Examples/SampleUI/ios/SampleUI/main.m +0 -10
  124. package/Examples/SampleUI/ios/SampleUI.xcodeproj/project.pbxproj +0 -785
  125. package/Examples/SampleUI/ios/SampleUI.xcodeproj/xcshareddata/xcschemes/SampleUI.xcscheme +0 -105
  126. package/Examples/SampleUI/ios/SampleUI.xcworkspace/contents.xcworkspacedata +0 -10
  127. package/Examples/SampleUI/ios/SampleUITests/Info.plist +0 -24
  128. package/Examples/SampleUI/ios/SampleUITests/SampleUITests.m +0 -66
  129. package/Examples/SampleUI/jest.config.js +0 -3
  130. package/Examples/SampleUI/metro.config.js +0 -54
  131. package/Examples/SampleUI/package.json +0 -65
  132. package/Examples/SampleUI/scripts/integration-test-android.sh +0 -292
  133. package/Examples/SampleUI/src/DrawerItems.tsx +0 -322
  134. package/Examples/SampleUI/src/ExampleList.tsx +0 -175
  135. package/Examples/SampleUI/src/Examples/ActivityIndicatorExample.tsx +0 -73
  136. package/Examples/SampleUI/src/Examples/AnimatedFABExample/AnimatedFABExample.tsx +0 -220
  137. package/Examples/SampleUI/src/Examples/AnimatedFABExample/CustomFAB.tsx +0 -70
  138. package/Examples/SampleUI/src/Examples/AnimatedFABExample/CustomFABControls.tsx +0 -146
  139. package/Examples/SampleUI/src/Examples/AnimatedFABExample/index.ts +0 -1
  140. package/Examples/SampleUI/src/Examples/AppbarExample.tsx +0 -263
  141. package/Examples/SampleUI/src/Examples/AvatarExample.tsx +0 -76
  142. package/Examples/SampleUI/src/Examples/BadgeExample.tsx +0 -97
  143. package/Examples/SampleUI/src/Examples/BannerExample.tsx +0 -152
  144. package/Examples/SampleUI/src/Examples/BottomNavigationBarExample.tsx +0 -94
  145. package/Examples/SampleUI/src/Examples/BottomNavigationExample.tsx +0 -205
  146. package/Examples/SampleUI/src/Examples/ButtonExample.tsx +0 -405
  147. package/Examples/SampleUI/src/Examples/CardExample.tsx +0 -245
  148. package/Examples/SampleUI/src/Examples/CheckboxExample.tsx +0 -87
  149. package/Examples/SampleUI/src/Examples/CheckboxItemExample.tsx +0 -72
  150. package/Examples/SampleUI/src/Examples/ChipExample.tsx +0 -432
  151. package/Examples/SampleUI/src/Examples/DataTableExample.tsx +0 -128
  152. package/Examples/SampleUI/src/Examples/DialogExample.tsx +0 -217
  153. package/Examples/SampleUI/src/Examples/Dialogs/DialogTextComponent.tsx +0 -31
  154. package/Examples/SampleUI/src/Examples/Dialogs/DialogTrackingTest.tsx +0 -307
  155. package/Examples/SampleUI/src/Examples/Dialogs/DialogWithCustomColors.tsx +0 -57
  156. package/Examples/SampleUI/src/Examples/Dialogs/DialogWithDismissableBackButton.tsx +0 -38
  157. package/Examples/SampleUI/src/Examples/Dialogs/DialogWithIcon.tsx +0 -42
  158. package/Examples/SampleUI/src/Examples/Dialogs/DialogWithLoadingIndicator.tsx +0 -48
  159. package/Examples/SampleUI/src/Examples/Dialogs/DialogWithLongText.tsx +0 -81
  160. package/Examples/SampleUI/src/Examples/Dialogs/DialogWithRadioBtns.tsx +0 -111
  161. package/Examples/SampleUI/src/Examples/Dialogs/UndismissableDialog.tsx +0 -30
  162. package/Examples/SampleUI/src/Examples/Dialogs/index.tsx +0 -44
  163. package/Examples/SampleUI/src/Examples/DividerExample.tsx +0 -30
  164. package/Examples/SampleUI/src/Examples/FABExample.tsx +0 -226
  165. package/Examples/SampleUI/src/Examples/IconButtonExample.tsx +0 -230
  166. package/Examples/SampleUI/src/Examples/IconExample.tsx +0 -50
  167. package/Examples/SampleUI/src/Examples/ListAccordionExample.tsx +0 -65
  168. package/Examples/SampleUI/src/Examples/ListAccordionGroupExample.tsx +0 -80
  169. package/Examples/SampleUI/src/Examples/ListItemExample.tsx +0 -310
  170. package/Examples/SampleUI/src/Examples/ListSectionExample.tsx +0 -159
  171. package/Examples/SampleUI/src/Examples/MaterialBottomTabNavigatorExample.tsx +0 -87
  172. package/Examples/SampleUI/src/Examples/MenuExample.tsx +0 -211
  173. package/Examples/SampleUI/src/Examples/ProgressBarExample.tsx +0 -142
  174. package/Examples/SampleUI/src/Examples/RadioButtonExample.tsx +0 -104
  175. package/Examples/SampleUI/src/Examples/RadioButtonGroupExample.tsx +0 -67
  176. package/Examples/SampleUI/src/Examples/RadioButtonItemExample.tsx +0 -77
  177. package/Examples/SampleUI/src/Examples/SearchbarExample.tsx +0 -249
  178. package/Examples/SampleUI/src/Examples/SegmentedButtons/SegmentedButtonCustomColorCheck.tsx +0 -93
  179. package/Examples/SampleUI/src/Examples/SegmentedButtons/SegmentedButtonDefault.tsx +0 -49
  180. package/Examples/SampleUI/src/Examples/SegmentedButtons/SegmentedButtonDisabled.tsx +0 -47
  181. package/Examples/SampleUI/src/Examples/SegmentedButtons/SegmentedButtonMultiselect.tsx +0 -50
  182. package/Examples/SampleUI/src/Examples/SegmentedButtons/SegmentedButtonMultiselectIcons.tsx +0 -49
  183. package/Examples/SampleUI/src/Examples/SegmentedButtons/SegmentedButtonMultiselectRealCase.tsx +0 -114
  184. package/Examples/SampleUI/src/Examples/SegmentedButtons/SegmentedButtonOnlyIcons.tsx +0 -40
  185. package/Examples/SampleUI/src/Examples/SegmentedButtons/SegmentedButtonOnlyIconsWithCheck.tsx +0 -43
  186. package/Examples/SampleUI/src/Examples/SegmentedButtons/SegmentedButtonRealCase.tsx +0 -97
  187. package/Examples/SampleUI/src/Examples/SegmentedButtons/SegmentedButtonWithDensity.tsx +0 -47
  188. package/Examples/SampleUI/src/Examples/SegmentedButtons/SegmentedButtonWithSelectedCheck.tsx +0 -52
  189. package/Examples/SampleUI/src/Examples/SegmentedButtons/index.ts +0 -9
  190. package/Examples/SampleUI/src/Examples/SegmentedButtonsExample.tsx +0 -57
  191. package/Examples/SampleUI/src/Examples/SnackbarExample.tsx +0 -141
  192. package/Examples/SampleUI/src/Examples/SurfaceExample.tsx +0 -130
  193. package/Examples/SampleUI/src/Examples/SwitchExample.tsx +0 -105
  194. package/Examples/SampleUI/src/Examples/TeamDetails.tsx +0 -291
  195. package/Examples/SampleUI/src/Examples/TeamsList.tsx +0 -57
  196. package/Examples/SampleUI/src/Examples/TextExample.tsx +0 -132
  197. package/Examples/SampleUI/src/Examples/TextInputExample.tsx +0 -914
  198. package/Examples/SampleUI/src/Examples/ThemeExample.tsx +0 -41
  199. package/Examples/SampleUI/src/Examples/ThemingWithReactNavigation.tsx +0 -75
  200. package/Examples/SampleUI/src/Examples/ToggleButtonExample.tsx +0 -128
  201. package/Examples/SampleUI/src/Examples/TooltipExample.tsx +0 -191
  202. package/Examples/SampleUI/src/Examples/TouchableRippleExample.tsx +0 -37
  203. package/Examples/SampleUI/src/RootNavigator.tsx +0 -95
  204. package/Examples/SampleUI/src/ScreenWrapper.tsx +0 -67
  205. package/Examples/SampleUI/src/components/ActivityIndicator.tsx +0 -254
  206. package/Examples/SampleUI/src/components/Appbar/Appbar.tsx +0 -364
  207. package/Examples/SampleUI/src/components/Appbar/AppbarAction.tsx +0 -132
  208. package/Examples/SampleUI/src/components/Appbar/AppbarBackAction.tsx +0 -77
  209. package/Examples/SampleUI/src/components/Appbar/AppbarBackIcon.tsx +0 -52
  210. package/Examples/SampleUI/src/components/Appbar/AppbarContent.tsx +0 -249
  211. package/Examples/SampleUI/src/components/Appbar/AppbarHeader.tsx +0 -174
  212. package/Examples/SampleUI/src/components/Appbar/index.ts +0 -22
  213. package/Examples/SampleUI/src/components/Appbar/utils.ts +0 -188
  214. package/Examples/SampleUI/src/components/Avatar/Avatar.tsx +0 -8
  215. package/Examples/SampleUI/src/components/Avatar/AvatarIcon.tsx +0 -87
  216. package/Examples/SampleUI/src/components/Avatar/AvatarImage.tsx +0 -128
  217. package/Examples/SampleUI/src/components/Avatar/AvatarText.tsx +0 -127
  218. package/Examples/SampleUI/src/components/Badge.tsx +0 -138
  219. package/Examples/SampleUI/src/components/Banner.tsx +0 -302
  220. package/Examples/SampleUI/src/components/BottomNavigation/BottomNavigation.tsx +0 -643
  221. package/Examples/SampleUI/src/components/BottomNavigation/BottomNavigationBar.tsx +0 -1039
  222. package/Examples/SampleUI/src/components/BottomNavigation/BottomNavigationRouteScreen.tsx +0 -31
  223. package/Examples/SampleUI/src/components/BottomNavigation/utils.ts +0 -70
  224. package/Examples/SampleUI/src/components/Button/Button.tsx +0 -503
  225. package/Examples/SampleUI/src/components/Button/utils.tsx +0 -272
  226. package/Examples/SampleUI/src/components/Card/Card.tsx +0 -373
  227. package/Examples/SampleUI/src/components/Card/CardActions.tsx +0 -74
  228. package/Examples/SampleUI/src/components/Card/CardContent.tsx +0 -99
  229. package/Examples/SampleUI/src/components/Card/CardCover.tsx +0 -96
  230. package/Examples/SampleUI/src/components/Card/CardTitle.tsx +0 -236
  231. package/Examples/SampleUI/src/components/Card/utils.tsx +0 -110
  232. package/Examples/SampleUI/src/components/Checkbox/Checkbox.tsx +0 -78
  233. package/Examples/SampleUI/src/components/Checkbox/CheckboxAndroid.tsx +0 -180
  234. package/Examples/SampleUI/src/components/Checkbox/CheckboxIOS.tsx +0 -104
  235. package/Examples/SampleUI/src/components/Checkbox/CheckboxItem.tsx +0 -236
  236. package/Examples/SampleUI/src/components/Checkbox/index.ts +0 -19
  237. package/Examples/SampleUI/src/components/Checkbox/utils.ts +0 -183
  238. package/Examples/SampleUI/src/components/Chip/Chip.tsx +0 -513
  239. package/Examples/SampleUI/src/components/Chip/helpers.tsx +0 -322
  240. package/Examples/SampleUI/src/components/CrossFadeIcon.tsx +0 -140
  241. package/Examples/SampleUI/src/components/DataTable/DataTable.tsx +0 -138
  242. package/Examples/SampleUI/src/components/DataTable/DataTableCell.tsx +0 -132
  243. package/Examples/SampleUI/src/components/DataTable/DataTableHeader.tsx +0 -82
  244. package/Examples/SampleUI/src/components/DataTable/DataTablePagination.tsx +0 -407
  245. package/Examples/SampleUI/src/components/DataTable/DataTableRow.tsx +0 -107
  246. package/Examples/SampleUI/src/components/DataTable/DataTableTitle.tsx +0 -208
  247. package/Examples/SampleUI/src/components/Dialog/Dialog.tsx +0 -191
  248. package/Examples/SampleUI/src/components/Dialog/DialogActions.tsx +0 -94
  249. package/Examples/SampleUI/src/components/Dialog/DialogContent.tsx +0 -54
  250. package/Examples/SampleUI/src/components/Dialog/DialogIcon.tsx +0 -100
  251. package/Examples/SampleUI/src/components/Dialog/DialogScrollArea.tsx +0 -88
  252. package/Examples/SampleUI/src/components/Dialog/DialogTitle.tsx +0 -94
  253. package/Examples/SampleUI/src/components/Divider.tsx +0 -102
  254. package/Examples/SampleUI/src/components/Drawer/Drawer.tsx +0 -8
  255. package/Examples/SampleUI/src/components/Drawer/DrawerCollapsedItem.tsx +0 -282
  256. package/Examples/SampleUI/src/components/Drawer/DrawerItem.tsx +0 -209
  257. package/Examples/SampleUI/src/components/Drawer/DrawerSection.tsx +0 -138
  258. package/Examples/SampleUI/src/components/FAB/AnimatedFAB.tsx +0 -619
  259. package/Examples/SampleUI/src/components/FAB/FAB.tsx +0 -371
  260. package/Examples/SampleUI/src/components/FAB/FABGroup.tsx +0 -532
  261. package/Examples/SampleUI/src/components/FAB/index.ts +0 -13
  262. package/Examples/SampleUI/src/components/FAB/utils.ts +0 -474
  263. package/Examples/SampleUI/src/components/HelperText/HelperText.tsx +0 -168
  264. package/Examples/SampleUI/src/components/HelperText/utils.ts +0 -30
  265. package/Examples/SampleUI/src/components/Icon.tsx +0 -170
  266. package/Examples/SampleUI/src/components/IconButton/IconButton.tsx +0 -234
  267. package/Examples/SampleUI/src/components/IconButton/utils.ts +0 -190
  268. package/Examples/SampleUI/src/components/List/List.tsx +0 -20
  269. package/Examples/SampleUI/src/components/List/ListAccordion.tsx +0 -391
  270. package/Examples/SampleUI/src/components/List/ListAccordionGroup.tsx +0 -88
  271. package/Examples/SampleUI/src/components/List/ListIcon.tsx +0 -79
  272. package/Examples/SampleUI/src/components/List/ListImage.tsx +0 -89
  273. package/Examples/SampleUI/src/components/List/ListItem.tsx +0 -313
  274. package/Examples/SampleUI/src/components/List/ListSection.tsx +0 -87
  275. package/Examples/SampleUI/src/components/List/ListSubheader.tsx +0 -79
  276. package/Examples/SampleUI/src/components/List/utils.ts +0 -113
  277. package/Examples/SampleUI/src/components/MaterialCommunityIcon.tsx +0 -121
  278. package/Examples/SampleUI/src/components/Menu/Menu.tsx +0 -711
  279. package/Examples/SampleUI/src/components/Menu/MenuItem.tsx +0 -257
  280. package/Examples/SampleUI/src/components/Menu/utils.ts +0 -110
  281. package/Examples/SampleUI/src/components/Modal.tsx +0 -245
  282. package/Examples/SampleUI/src/components/Portal/Portal.tsx +0 -69
  283. package/Examples/SampleUI/src/components/Portal/PortalConsumer.tsx +0 -44
  284. package/Examples/SampleUI/src/components/Portal/PortalHost.tsx +0 -143
  285. package/Examples/SampleUI/src/components/Portal/PortalManager.tsx +0 -54
  286. package/Examples/SampleUI/src/components/ProgressBar.tsx +0 -292
  287. package/Examples/SampleUI/src/components/RadioButton/RadioButton.tsx +0 -86
  288. package/Examples/SampleUI/src/components/RadioButton/RadioButtonAndroid.tsx +0 -202
  289. package/Examples/SampleUI/src/components/RadioButton/RadioButtonGroup.tsx +0 -67
  290. package/Examples/SampleUI/src/components/RadioButton/RadioButtonIOS.tsx +0 -130
  291. package/Examples/SampleUI/src/components/RadioButton/RadioButtonItem.tsx +0 -268
  292. package/Examples/SampleUI/src/components/RadioButton/index.ts +0 -22
  293. package/Examples/SampleUI/src/components/RadioButton/utils.ts +0 -37
  294. package/Examples/SampleUI/src/components/Searchbar.tsx +0 -459
  295. package/Examples/SampleUI/src/components/SegmentedButtons/SegmentedButtonItem.tsx +0 -271
  296. package/Examples/SampleUI/src/components/SegmentedButtons/SegmentedButtons.tsx +0 -197
  297. package/Examples/SampleUI/src/components/SegmentedButtons/utils.ts +0 -179
  298. package/Examples/SampleUI/src/components/Snackbar.tsx +0 -430
  299. package/Examples/SampleUI/src/components/Surface.tsx +0 -376
  300. package/Examples/SampleUI/src/components/Switch/Switch.tsx +0 -108
  301. package/Examples/SampleUI/src/components/Switch/utils.ts +0 -113
  302. package/Examples/SampleUI/src/components/TextInput/Addons/Outline.tsx +0 -64
  303. package/Examples/SampleUI/src/components/TextInput/Addons/Underline.tsx +0 -78
  304. package/Examples/SampleUI/src/components/TextInput/Adornment/TextInputAdornment.tsx +0 -208
  305. package/Examples/SampleUI/src/components/TextInput/Adornment/TextInputAffix.tsx +0 -212
  306. package/Examples/SampleUI/src/components/TextInput/Adornment/TextInputIcon.tsx +0 -195
  307. package/Examples/SampleUI/src/components/TextInput/Adornment/enums.tsx +0 -12
  308. package/Examples/SampleUI/src/components/TextInput/Adornment/types.tsx +0 -11
  309. package/Examples/SampleUI/src/components/TextInput/Adornment/utils.ts +0 -48
  310. package/Examples/SampleUI/src/components/TextInput/Label/InputLabel.tsx +0 -217
  311. package/Examples/SampleUI/src/components/TextInput/Label/LabelBackground.tsx +0 -100
  312. package/Examples/SampleUI/src/components/TextInput/TextInput.tsx +0 -572
  313. package/Examples/SampleUI/src/components/TextInput/TextInputFlat.tsx +0 -475
  314. package/Examples/SampleUI/src/components/TextInput/TextInputOutlined.tsx +0 -450
  315. package/Examples/SampleUI/src/components/TextInput/constants.tsx +0 -48
  316. package/Examples/SampleUI/src/components/TextInput/helpers.tsx +0 -612
  317. package/Examples/SampleUI/src/components/TextInput/types.tsx +0 -155
  318. package/Examples/SampleUI/src/components/ToggleButton/ToggleButton.tsx +0 -187
  319. package/Examples/SampleUI/src/components/ToggleButton/ToggleButtonGroup.tsx +0 -72
  320. package/Examples/SampleUI/src/components/ToggleButton/ToggleButtonRow.tsx +0 -107
  321. package/Examples/SampleUI/src/components/ToggleButton/index.ts +0 -16
  322. package/Examples/SampleUI/src/components/ToggleButton/utils.ts +0 -26
  323. package/Examples/SampleUI/src/components/Tooltip/Tooltip.tsx +0 -249
  324. package/Examples/SampleUI/src/components/Tooltip/utils.ts +0 -129
  325. package/Examples/SampleUI/src/components/TouchableRipple/Pressable.tsx +0 -41
  326. package/Examples/SampleUI/src/components/TouchableRipple/TouchableRipple.native.tsx +0 -145
  327. package/Examples/SampleUI/src/components/TouchableRipple/TouchableRipple.tsx +0 -317
  328. package/Examples/SampleUI/src/components/TouchableRipple/utils.ts +0 -66
  329. package/Examples/SampleUI/src/components/Typography/AnimatedText.tsx +0 -107
  330. package/Examples/SampleUI/src/components/Typography/Text.tsx +0 -184
  331. package/Examples/SampleUI/src/components/Typography/types.tsx +0 -5
  332. package/Examples/SampleUI/src/components/Typography/v2/Caption.tsx +0 -50
  333. package/Examples/SampleUI/src/components/Typography/v2/Headline.tsx +0 -52
  334. package/Examples/SampleUI/src/components/Typography/v2/Paragraph.tsx +0 -49
  335. package/Examples/SampleUI/src/components/Typography/v2/StyledText.tsx +0 -56
  336. package/Examples/SampleUI/src/components/Typography/v2/Subheading.tsx +0 -50
  337. package/Examples/SampleUI/src/components/Typography/v2/Text.tsx +0 -62
  338. package/Examples/SampleUI/src/components/Typography/v2/Title.tsx +0 -49
  339. package/Examples/SampleUI/src/components/Typography/v2/index.ts +0 -5
  340. package/Examples/SampleUI/src/core/PaperProvider.tsx +0 -122
  341. package/Examples/SampleUI/src/core/SafeAreaProviderCompat.tsx +0 -65
  342. package/Examples/SampleUI/src/core/settings.tsx +0 -23
  343. package/Examples/SampleUI/src/core/theming.tsx +0 -170
  344. package/Examples/SampleUI/src/index.native.tsx +0 -285
  345. package/Examples/SampleUI/src/index.tsx +0 -226
  346. package/Examples/SampleUI/src/react-navigation/index.tsx +0 -19
  347. package/Examples/SampleUI/src/react-navigation/navigators/createMaterialBottomTabNavigator.tsx +0 -72
  348. package/Examples/SampleUI/src/react-navigation/types.tsx +0 -126
  349. package/Examples/SampleUI/src/react-navigation/views/MaterialBottomTabView.tsx +0 -140
  350. package/Examples/SampleUI/src/styles/__tests__/fonts.test.js +0 -290
  351. package/Examples/SampleUI/src/styles/fonts.tsx +0 -143
  352. package/Examples/SampleUI/src/styles/overlay.tsx +0 -70
  353. package/Examples/SampleUI/src/styles/shadow.tsx +0 -109
  354. package/Examples/SampleUI/src/styles/themes/index.ts +0 -4
  355. package/Examples/SampleUI/src/styles/themes/v2/DarkTheme.tsx +0 -30
  356. package/Examples/SampleUI/src/styles/themes/v2/LightTheme.tsx +0 -30
  357. package/Examples/SampleUI/src/styles/themes/v2/colors.tsx +0 -277
  358. package/Examples/SampleUI/src/styles/themes/v3/DarkTheme.tsx +0 -66
  359. package/Examples/SampleUI/src/styles/themes/v3/LightTheme.tsx +0 -69
  360. package/Examples/SampleUI/src/styles/themes/v3/tokens.tsx +0 -230
  361. package/Examples/SampleUI/src/utils/BackHandler/BackHandler.native.tsx +0 -3
  362. package/Examples/SampleUI/src/utils/BackHandler/BackHandler.tsx +0 -11
  363. package/Examples/SampleUI/src/utils/addEventListener.tsx +0 -56
  364. package/Examples/SampleUI/src/utils/forwardRef.tsx +0 -23
  365. package/Examples/SampleUI/src/utils/getContrastingColor.tsx +0 -15
  366. package/Examples/SampleUI/src/utils/hasTouchHandler.tsx +0 -23
  367. package/Examples/SampleUI/src/utils/roundLayoutSize.ts +0 -2
  368. package/Examples/SampleUI/src/utils/splitStyles.ts +0 -60
  369. package/Examples/SampleUI/src/utils/useAnimatedValue.tsx +0 -9
  370. package/Examples/SampleUI/src/utils/useAnimatedValueArray.tsx +0 -13
  371. package/Examples/SampleUI/src/utils/useIsKeyboardShown.tsx +0 -55
  372. package/Examples/SampleUI/src/utils/useLayout.tsx +0 -29
  373. package/Examples/SampleUI/src/utils/useLazyRef.tsx +0 -11
  374. package/Examples/SampleUI/tsconfig.json +0 -3
  375. package/Examples/SampleUI/utils/index.ts +0 -1426
  376. package/cli/__tests__/doctor.test.mjs +0 -88
package/CHANGELOG.md CHANGED
@@ -1,3 +1,84 @@
1
+ ## 19.0.28 (2026-09-14)
2
+
3
+ ### Reverts
4
+
5
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
6
+ ## 19.0.27 (2026-09-14)
7
+
8
+ ### Reverts
9
+
10
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
11
+ ## 19.0.26 (2026-09-11)
12
+
13
+ ### Reverts
14
+
15
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
16
+ ## 19.0.25 (2026-09-11)
17
+
18
+ ### Reverts
19
+
20
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
21
+ ## 19.0.24 (2026-09-11)
22
+
23
+ ### Reverts
24
+
25
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
26
+ ## 19.0.23 (2026-09-10)
27
+
28
+ ### Reverts
29
+
30
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
31
+ ## 19.0.22 (2026-09-10)
32
+
33
+ ### Reverts
34
+
35
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
36
+ ## 19.0.21 (2026-09-09)
37
+
38
+ ### Reverts
39
+
40
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
41
+ ## 19.0.20 (2026-09-09)
42
+
43
+ ### Reverts
44
+
45
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
46
+ ## 19.0.19 (2026-09-08)
47
+
48
+ ### Reverts
49
+
50
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
51
+ ## 19.0.18 (2026-09-07)
52
+
53
+ ### Reverts
54
+
55
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
56
+ ## 19.0.17 (2026-09-02)
57
+
58
+ ### Reverts
59
+
60
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
61
+ ## 19.0.16 (2026-08-31)
62
+
63
+ ### Reverts
64
+
65
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
66
+ ## [19.0.15](https://github.com/go-acoustic/react-native-acoustic-connect/compare/19.0.14...19.0.15) (2026-08-24)
67
+ ## 19.0.14 (2026-07-31)
68
+
69
+ ### Reverts
70
+
71
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
72
+ ## 19.0.13 (2026-07-30)
73
+
74
+ ### Reverts
75
+
76
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
77
+ ## 19.0.12 (2026-07-09)
78
+
79
+ ### Reverts
80
+
81
+ * Revert "Beta ReactNativeConnect build: 18.0.36" ([609ad7d](https://github.com/go-acoustic/react-native-acoustic-connect/commit/609ad7d3244ec06f27dced5864d40585c5b3c9cf))
1
82
  ## 19.0.11 (2026-07-07)
2
83
 
3
84
  ### Reverts
package/README.md CHANGED
@@ -13,6 +13,8 @@ For the full product overview see the
13
13
  - React 19.1.1 or newer (or whatever your RN version pins)
14
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
15
  - Node 20 or newer
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.
16
18
  - iOS deployment target ≥ 15.1, AcousticConnect / AcousticConnectDebug pod ≥ 2.0.5
17
19
  - Android `minSdk` ≥ 26, `compileSdk` ≥ 35, `io.github.go-acoustic:connect` in `[11.0.11, 12.0.0)`
18
20
  - **Expo SDK 55+ is supported** via the bundled Expo Config Plugin —
@@ -363,9 +365,18 @@ screen / touch / keyboard tracking) can skip it entirely.
363
365
  ```ts
364
366
  import AcousticConnectRN from 'react-native-acoustic-connect'
365
367
 
366
- // Custom application event
368
+ // Custom application event (flat key/value pairs)
367
369
  AcousticConnectRN.logCustomEvent('checkout_started', { cartId: 'abc' }, 1)
368
370
 
371
+ // Signal — accepts arbitrary JSON, including nested objects and arrays
372
+ AcousticConnectRN.logSignal(
373
+ {
374
+ signalContent: { signalType: 'pageview', pageCategory: 'checkout' },
375
+ audience: [{ name: 'Account ID', value: '4815162342' }],
376
+ },
377
+ 1
378
+ )
379
+
369
380
  // Force a logical screen name (e.g. for non-NavigationContainer screens)
370
381
  AcousticConnectRN.setCurrentScreenName('CheckoutScreen')
371
382
 
@@ -385,6 +396,26 @@ for details.
385
396
 
386
397
  ## API reference
387
398
 
399
+ > **What the logging methods' `boolean` means.** Every `log*` method returns
400
+ > whether the native SDK **accepted the event for delivery** — never whether
401
+ > the collector received it, and never whether the collector kept it. Events
402
+ > are queued on device and posted in batches later, so no return value from
403
+ > these calls can attest to delivery, and a server-side rejection (a signal
404
+ > that fails schema validation, say) happens long after you have already been
405
+ > told `true`. Treat the value as "the SDK took this", and use the collector or
406
+ > the platform log as the source of truth for what shipped.
407
+ >
408
+ > A `false` means the SDK rejected the call outright and nothing was queued.
409
+ > The bridge also writes that to `logcat` (tag `AcousticConnectRN`) and
410
+ > `os_log` (subsystem `com.acoustic.AcousticConnectRN`, category `bridge`), so
411
+ > a rejection is visible without inspecting return values you would otherwise
412
+ > never read.
413
+ >
414
+ > `logScreenLayout` is weaker still: with the configured delay — the normal
415
+ > case — a `true` means only that the capture was **scheduled**. What the
416
+ > capture found when it eventually ran, and whether it produced a layout
417
+ > message at all, is reported in the platform log only.
418
+
388
419
  ### `AcousticConnectRN.enable(): boolean`
389
420
 
390
421
  Re-enables the SDK after a prior `disable()`. Reads all configuration from
@@ -401,6 +432,86 @@ already running.
401
432
 
402
433
  Stops data capture, flushes pending messages, releases push state. Idempotent.
403
434
 
435
+ ### `AcousticConnectRN.logSignal(values, level): boolean`
436
+
437
+ Logs a signal. `values` accepts **arbitrary JSON** — nested objects and arrays,
438
+ not just scalars — and the payload is carried through without flattening or
439
+ reshaping:
440
+
441
+ ```ts
442
+ AcousticConnectRN.logSignal(
443
+ {
444
+ signalContent: {
445
+ signalType: 'pageview',
446
+ url: 'https://app.example.com/dashboard',
447
+ pageCategory: 'dashboard',
448
+ },
449
+ audience: [
450
+ { name: 'Account Name', value: 'Acme Corp' },
451
+ { name: 'Account ID', value: '4815162342' },
452
+ ],
453
+ },
454
+ 1
455
+ )
456
+ ```
457
+
458
+ Flat scalar payloads keep working unchanged — the type is a superset of
459
+ `Record<string, string | number | boolean>`.
460
+
461
+ An object literal needs no type import. If you want to *name* a payload — a
462
+ shared constant, a helper parameter — the package exports `SignalValues` for it:
463
+
464
+ ```ts
465
+ import AcousticConnectRN, {
466
+ type SignalValues,
467
+ } from 'react-native-acoustic-connect'
468
+
469
+ const pageView: SignalValues = {
470
+ signalContent: { signalType: 'pageview', pageCategory: 'checkout' },
471
+ }
472
+
473
+ AcousticConnectRN.logSignal(pageView, 1)
474
+ ```
475
+
476
+ > **Android: top-level numbers need Connect Android 11.0.24-beta or newer.**
477
+ > Android's signal serializer gained a number branch in Connect Android
478
+ > **11.0.24-beta**; from that version a top-level numeric value is carried, the
479
+ > same as on iOS. Earlier versions carried strings, booleans, objects and arrays
480
+ > at the top level but dropped a top-level number. Numbers nested inside an
481
+ > object or array were never affected on either platform.
482
+ >
483
+ > Both versions sit inside the `[11.0.11, 12.0.0)` range this package accepts,
484
+ > and the Android dependency floats to the newest published build unless you pin
485
+ > it, so most integrations get the new behaviour. Nest the number if you pin an
486
+ > older one:
487
+ >
488
+ > ```ts
489
+ > AcousticConnectRN.logSignal({ cart: { items: 3 } }, 1) // any supported version
490
+ > AcousticConnectRN.logSignal({ items: 3 }, 1) // iOS, + Android 11.0.24-beta and newer
491
+ > ```
492
+
493
+ ### `AcousticConnectRN.logCustomEvent(eventName, values, level): boolean`
494
+
495
+ Logs a named custom event. Unlike `logSignal`, `values` is **flat** — strings,
496
+ numbers and booleans only. The Android SDK's custom-event path is typed for
497
+ string values end to end, so there is no native route for nested JSON; widening
498
+ it would preserve the nesting on iOS and silently drop it on Android. Use
499
+ `logSignal` when the payload needs structure.
500
+
501
+ TypeScript will reject a nested value, but types are erased at runtime — a
502
+ payload built from an API response or widened through `any` still reaches the
503
+ bridge nested, gets reshaped by the native SDK, and returns `true`. The wrapper
504
+ logs a `console.warn` naming the offending keys when that happens (once per
505
+ call site, in dev and in production; the payload itself is passed through
506
+ unchanged). If you see it, move the payload to `logSignal`.
507
+
508
+ Numbers are rendered the same way on both platforms — a JS `2` arrives as `2`,
509
+ not `2.0`. Note the remaining difference in *type*: because the Android path is
510
+ string-typed, an Android custom-event number lands on the wire as a JSON string
511
+ (`"2"`) where iOS sends a JSON number (`2`). `logSignal` carries native types on
512
+ both platforms; reach for it when a dashboard or Composer rule compares the
513
+ value numerically.
514
+
404
515
  ### Push configuration (`ConnectConfig.json`)
405
516
 
406
517
  | Field | Type | Default | Semantics |
@@ -436,6 +547,284 @@ The Android push-forwarding API itself is wired under follow-up work — until
436
547
  that lands, `PushEnabled: true` on Android only changes which artifact is on
437
548
  the classpath; the host-side token forwarding API is not yet exposed.
438
549
 
550
+ ### Screen-capture configuration (`ConnectConfig.json`)
551
+
552
+ Screen layout and screenshot capture are configured per platform, because the
553
+ two native SDKs read their defaults from different places.
554
+
555
+ | Field | Type | Default | Semantics |
556
+ | --- | --- | --- | --- |
557
+ | `layoutConfig` | object \| absent | absent | Shared baseline for both platforms. Supports `AutoLayout` (screen capture rules) and `AppendMapIds`. |
558
+ | `layoutConfigIos` | object \| absent | absent | iOS-specific overrides, deep-merged over `layoutConfig`. |
559
+ | `layoutConfigAndroid` | object \| absent | absent | Android-specific overrides, deep-merged over `layoutConfig`. |
560
+ | `GetImageDataOnScreenLayout` | boolean | SDK default | Cross-platform. When `false`, layout messages carry no screenshot image data. |
561
+
562
+ `AutoLayout` holds a `GlobalScreenSettings` object plus optional per-screen
563
+ overrides keyed by screen name, where a per-screen value wins over the global
564
+ one. To turn screenshot capture off on both platforms:
565
+
566
+ ```json
567
+ {
568
+ "Connect": {
569
+ "layoutConfig": {
570
+ "AutoLayout": {
571
+ "GlobalScreenSettings": { "ScreenShot": false }
572
+ }
573
+ }
574
+ }
575
+ }
576
+ ```
577
+
578
+ `ScreenShot` is the cross-platform switch — set it in `layoutConfig` (or per
579
+ platform) and both native SDKs honour it. `CaptureScreenshotOn` is a related
580
+ but **iOS-only** key: iOS's native auto-instrumentation reads it, but on
581
+ Android the equivalent reader has no callers, so `CaptureScreenshotOn` is
582
+ accepted wherever you put it and does nothing there. Set it only under
583
+ `layoutConfigIos` if you want it; leaving it out of `layoutConfigAndroid` (or
584
+ the shared `layoutConfig`) costs nothing on Android and avoids implying it
585
+ does something it doesn't.
586
+
587
+ Put anything common in `layoutConfig` and use `layoutConfigIos` /
588
+ `layoutConfigAndroid` only for what differs. The platform block is **deep-merged**
589
+ over the shared one, so it refines the baseline rather than replacing it: an
590
+ iOS block setting just `ScreenShot` keeps the shared `Masking`, per-screen
591
+ rules, and every other shared value. Arrays are replaced outright rather than
592
+ concatenated, so a platform block can shorten or clear a shared list such as
593
+ `MaskIdList`.
594
+
595
+ #### Masking is selection, then redaction — an unmatched pattern leaves data unmasked
596
+
597
+ A screen rule's `Masking` block works in two independent steps: a control is
598
+ first **selected** by a matching `MaskIdList` (control id), `MaskValueList`
599
+ (control value), `MaskAccessibilityIdList` (accessibility id), or
600
+ `MaskAccessibilityLabelList` (accessibility label) pattern, and only a
601
+ *selected* control is redacted — its value, and (Connect iOS 2.1.22+ / Android
602
+ 11.0.23-beta+ only — older SDKs serialised the accessibility object verbatim
603
+ regardless of masking) its accessibility label and hint. A control whose value
604
+ never matches any pattern in any of the four lists is not masked in any field.
605
+ That's by design, not a bug — but it means a client whose patterns don't
606
+ happen to match a given value can believe that value is masked when it never
607
+ was.
608
+
609
+ Email addresses are an easy miss: they rarely match a card-number or
610
+ `SECRET-`-style pattern, and free-text fields (bios, support messages,
611
+ usernames) routinely contain one. For any screen that collects email
612
+ addresses, add a pattern to `MaskValueList`:
613
+
614
+ ```json
615
+ { "MaskValueList": ["[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"] }
616
+ ```
617
+
618
+ (The `bare-workflow` and `expo` sample `ConnectConfig.example.json` already
619
+ ship this pattern on `GlobalScreenSettings`.)
620
+
621
+ When no block applies, each native SDK keeps the defaults from its own bundled
622
+ layout config:
623
+
624
+ - **iOS** — the defaults ship inside the Connect pod's `ConnectResources.bundle`
625
+ and are copied into your `.app`, so `pod install` replaces them on every run.
626
+ There is no app-level override file, which is why `ConnectConfig.json` is the
627
+ only supported route — do not edit anything under `Pods/`.
628
+ - **Android** — the plugin writes your merged block to its own
629
+ `ConnectLayoutConfig.json` asset. If your app ships
630
+ `android/app/src/main/assets/ConnectLayoutConfig.json`, Android asset merging
631
+ gives **your** copy priority and the `ConnectConfig.json` block is ignored;
632
+ the build prints a warning when both exist. Keep one or the other.
633
+
634
+ > Turning screenshots off does not disable behavioural capture: screen views,
635
+ > clicks, and custom events still flow. It only drops the image data, which is
636
+ > what a subscription without session replay has no consumer for.
637
+
638
+ #### `NumberOfWebViews` turns off iOS layout capture — leave it at `0`
639
+
640
+ `AutoLayout` rules accept a `NumberOfWebViews` key. On iOS, any value greater
641
+ than zero marks the screens that rule covers as web-view screens, and the SDK's
642
+ automatic layout capture is skipped for a web-view screen. Its effect is not
643
+ limited to screens that actually host a `WebView`: the value is read as a
644
+ declaration about the rule, not a count that gets verified.
645
+
646
+ The trap is where it is usually set. `GlobalScreenSettings` is the rule that
647
+ applies to **every** screen with no more specific rule of its own, and React
648
+ Native screens are all in that position — they are hosted by the same generic
649
+ container class, so no per-screen native rule matches them. So a single
650
+ `"NumberOfWebViews": 1` under `GlobalScreenSettings` switches off
651
+ auto-instrumented layout capture for the entire app on iOS, including screens
652
+ with no web content at all:
653
+
654
+ ```json
655
+ {
656
+ "Connect": {
657
+ "layoutConfigIos": {
658
+ "AutoLayout": {
659
+ "GlobalScreenSettings": { "NumberOfWebViews": 0 }
660
+ }
661
+ }
662
+ }
663
+ }
664
+ ```
665
+
666
+ Screen views, clicks, and custom events are unaffected — the symptom is layout
667
+ messages going missing while everything else keeps arriving, which reads like a
668
+ capture failure rather than a setting. Keep `NumberOfWebViews` at `0`, the value
669
+ every shipped template uses. To stand layout capture down deliberately, set
670
+ `CaptureLayoutOn: 0` on the rule instead — it is the key that means that, and it
671
+ leaves `NumberOfWebViews` free to describe the screen.
672
+
673
+ #### WebView capture on Android: prerequisites and two open limitations
674
+
675
+ A screen that hosts a `react-native-webview` `WebView` has capture behaviour
676
+ beyond the config above:
677
+
678
+ - **The WebView must be scrolled on screen.** A capture only records what is
679
+ currently visible — the native tree-walk skips subtrees outside the
680
+ viewport by design. A `WebView` sitting below the fold at the default
681
+ scroll position yields a layout with no WebView nodes at all, which looks
682
+ exactly like WebView capture never engaged. Scroll it fully into view
683
+ before triggering (or waiting on) a capture.
684
+ - **`GoogleWebViewEnabled`** is a top-level `Connect` key (Android only,
685
+ default `true`) that gates whether the SDK instruments WebViews at all:
686
+
687
+ ```json
688
+ { "Connect": { "GoogleWebViewEnabled": false } }
689
+ ```
690
+
691
+ Set to `false`, the SDK does not discover or walk into any `WebView` on the
692
+ screen — the rest of that screen still captures normally. It does not gate
693
+ anything else on this list: screen views, clicks, and non-WebView layout
694
+ content are unaffected either way.
695
+ - **A discovered WebView currently drops that screen's whole layout
696
+ message.** Once the SDK finds a `WebView`, it waits for a DOM-capture
697
+ correlation id from the page before it can finish and post the layout — and
698
+ a React Native-hosted `WebView` never supplies one, so the wait never
699
+ resolves and the *entire* screen's layout message is dropped, not just the
700
+ WebView's portion. Confirmed present in Android Connect **11.0.23-beta**, the
701
+ newest published artifact at the time of writing, and in every earlier version
702
+ in the supported range — measured on an emulator, where a capture on a screen
703
+ with a visible `WebView` posted **no messages at all** for that session, since
704
+ the layout's queue placeholder blocks the batch it sits in. There is no
705
+ client-side fix; `GoogleWebViewEnabled: false` (below) avoids it by not
706
+ instrumenting the `WebView` in the first place. A fix exists in the native SDK
707
+ but is not in any published artifact yet — check the Android Connect release
708
+ notes for a version above 11.0.23-beta before assuming this still applies.
709
+ - **Enabling WebView capture replaces the app's `WebViewClient`.** The native
710
+ SDK installs its own `WebViewClient` on that `WebView` to instrument it, in
711
+ place of the one `react-native-webview` had set — so callbacks such as
712
+ `onHttpError` and `onNavigationStateChange` on that `WebView` stop firing
713
+ while capture is active. Same status as the item above: present through Android
714
+ Connect **11.0.23-beta**, fixed in the native SDK but not yet published, and
715
+ the rest of the screen is unaffected either way.
716
+
717
+ Both of the limitations above only occur once the SDK is instrumenting a
718
+ `WebView`, so `GoogleWebViewEnabled: false` avoids both — at the cost of
719
+ getting no WebView capture on that screen at all.
720
+
721
+ #### Capture timing (`CaptureLayoutDelay`)
722
+
723
+ `AutoLayout.GlobalScreenSettings.CaptureLayoutDelay` is how long, in
724
+ milliseconds, the SDK waits before capturing the layout. It matters more in
725
+ React Native than in a native app: the wrapper triggers capture from React
726
+ Navigation's state change, which fires at the *start* of a screen transition,
727
+ whereas a native app captures from the view-controller lifecycle, after it. Too
728
+ short a delay and the capture catches a half-drawn screen.
729
+
730
+ The templates ship `500`, which clears a typical transition animation on both
731
+ platforms. Tune it globally, or per screen for one that is slower than the
732
+ rest:
733
+
734
+ ```json
735
+ {
736
+ "Connect": {
737
+ "layoutConfig": {
738
+ "AutoLayout": {
739
+ "GlobalScreenSettings": { "CaptureLayoutDelay": 500 },
740
+ "Checkout": { "CaptureLayoutDelay": 900 }
741
+ }
742
+ }
743
+ }
744
+ }
745
+ ```
746
+
747
+ `TLTRN.logScreenLayout(name)` uses the configured value. Pass a second argument
748
+ to override it for one call — `TLTRN.logScreenLayout(name, 0)` captures
749
+ immediately, `TLTRN.logScreenLayout(name, 900)` waits 900 ms.
750
+
751
+ A fixed delay cannot cover a screen whose content arrives asynchronously: if
752
+ data lands after the delay elapses, the capture shows the screen without it.
753
+ Raising the global delay to cover the slowest fetch delays every other screen
754
+ too. Call `TLTRN.logScreenLayout(name)` again when the content is on screen
755
+ instead — each call captures the layout as it stands at that moment.
756
+
757
+ Leaving the block out entirely gives you 500 ms as well. That is the wrapper's
758
+ default, chosen so both platforms behave the same; the native SDKs' own bundled
759
+ defaults differ from each other and are tuned for the lifecycle trigger rather
760
+ than the React Navigation one. Internally, omitting the second argument to
761
+ `TLTRN.logScreenLayout` sends a sentinel (`-1`) that both bridges resolve to
762
+ this configured value; any value the caller passes explicitly (`>= 0`) is used
763
+ as-is instead, bypassing the config lookup for that one call.
764
+
765
+ A near-zero value is not a request for faster captures. On iOS the
766
+ auto-instrumentation capture is triggered off the view-controller lifecycle,
767
+ and a delay close to `0` lets that trigger re-fire against the same screen far
768
+ faster than the app can settle — hundreds of captures within a couple of
769
+ hundred milliseconds while the app just sits idle, rather than one per actual
770
+ transition. The visible symptom is a runaway capture loop: a "Refreshing…"
771
+ indicator that stays up continuously instead of the brief one after a normal
772
+ transition. The SDK enforces no floor on this value, so `1` (millisecond) is
773
+ accepted and is exactly what produces the loop. Keep `CaptureLayoutDelay` at
774
+ `500` or raise it per screen — never lower it toward `0`.
775
+
776
+ #### Where screen-view and layout messages come from, and how to reduce duplicates
777
+
778
+ The two message kinds have different sources, and they differ per platform:
779
+
780
+ **Screen views (one source per platform).** On Android, the `<Connect>` wrapper
781
+ is the *only* source — it emits on React Navigation's `state` event. On iOS,
782
+ the native SDK's auto-instrumentation is the *only* source — it emits when a
783
+ screen's view controller reports its appearance. The wrapper never emits a
784
+ screen view on iOS; its role there is to hand the current *route name* to the
785
+ native SDK (which is what makes messages read `Checkout` rather than a native
786
+ container class) and to drive referrer chaining across transitions.
787
+
788
+ Duplicate screen views observed on iOS are therefore not two sources
789
+ overlapping — they are the single native source firing more than once when the
790
+ same screen's view controller reports several appearances for one transition.
791
+ They inflate event volumes and skew per-screen counts; they do not lose data.
792
+ There is no configuration key that collapses them today; a native-side dedupe
793
+ is under investigation. Do not try to solve it by removing the wrapper: on iOS
794
+ that costs route-based names and referrer chaining, and on Android it removes
795
+ screen views entirely. A same-name filter in the wrapper would not help either
796
+ — the wrapper is not the emitter on iOS, and such a filter would swallow
797
+ legitimate repeats like a stack pushing the same screen name twice.
798
+
799
+ **Layouts (two sources on iOS).** With automatic layout capture enabled in
800
+ config, an iOS transition can produce two layout messages: one from the
801
+ wrapper's `logScreenLayout` call and one from the native auto-instrumentation.
802
+ Control it from config, on the native side that has the duplicate:
803
+
804
+ ```json
805
+ {
806
+ "Connect": {
807
+ "layoutConfigIos": {
808
+ "AutoLayout": {
809
+ "GlobalScreenSettings": { "CaptureLayoutOn": 0 }
810
+ }
811
+ }
812
+ }
813
+ }
814
+ ```
815
+
816
+ `CaptureLayoutOn: 0` stands the **native** automatic layout capture down and
817
+ leaves the wrapper's route-named captures as the single source. Set it per
818
+ screen rather than globally if only some screens are noisy. Screen views,
819
+ clicks, and custom events are unaffected by this key.
820
+
821
+ If you would rather keep the native captures and have the wrapper stay out of
822
+ the way, omit `navigationRef` and do not rely on `<Connect>` for screen naming
823
+ — but expect native container class names in place of your route names.
824
+
825
+ Measure before changing either default: the volume depends on your navigator
826
+ structure, and both defaults are what every shipped sample uses.
827
+
439
828
  ### `<Connect>` props
440
829
 
441
830
  | Prop | Type | Required | Description |
@@ -129,9 +129,28 @@ android {
129
129
  }
130
130
  }
131
131
 
132
+ // Java 17 — matched to React Native 0.82's own baseline (its Gradle plugin
133
+ // targets JavaVersion.VERSION_17), so this imposes no requirement a consumer
134
+ // does not already meet building an RN app. This file is compiled inside the
135
+ // consumer's Gradle build, so anything raised here becomes their floor: 21
136
+ // would put us above RN's baseline for no benefit, since the bridge uses no
137
+ // Java 21 language features. Bytecode level only — deliberately NOT a
138
+ // toolchain, so a consumer on JDK 21+ is free to build with it.
139
+ //
140
+ // Note this is independent of the Connect Android SDK shipping Java 21
141
+ // bytecode: D8 dexes major-65 classes happily, and a JDK 17 assembleDebug
142
+ // against that AAR succeeds. Only JVM unit tests that load those classes need
143
+ // a 21 runtime, which is configured in the (unpublished) example build.
132
144
  compileOptions {
133
- sourceCompatibility JavaVersion.VERSION_1_8
134
- targetCompatibility JavaVersion.VERSION_1_8
145
+ sourceCompatibility JavaVersion.VERSION_17
146
+ targetCompatibility JavaVersion.VERSION_17
147
+ }
148
+
149
+ // Kept in lockstep with compileOptions above — AGP fails the build with
150
+ // "Inconsistent JVM-target compatibility" if the Java and Kotlin targets
151
+ // diverge.
152
+ kotlinOptions {
153
+ jvmTarget = '17'
135
154
  }
136
155
 
137
156
  sourceSets {
@@ -179,6 +198,34 @@ def acousticPushEnabled = (acousticConfig.Connect?.PushEnabled ?: false).toStrin
179
198
  def acousticVersionPin = (acousticConfig.Connect?.AndroidVersion ?: '').trim()
180
199
  def acousticVersion = acousticVersionPin.isEmpty() ? '+' : acousticVersionPin
181
200
  def acousticArtifact = acousticPushEnabled ? 'connect-push-fcm' : 'connect'
201
+
202
+ // Connect co-versions `eocore` + `tealeaf` with itself only from 11.0.18-beta
203
+ // onward — and from that release their POM scope is `runtime`, which drops them
204
+ // off the compile classpath (see the companion declarations below).
205
+ //
206
+ // Earlier releases in the supported range ship `tealeaf` on its own 10.4.x line
207
+ // (with eocore arriving transitively through it) at COMPILE scope, so there the
208
+ // companions are both unnecessary AND unresolvable: eocore/tealeaf 11.0.16-beta
209
+ // simply do not exist on Maven Central. Guard on the explicit pin so a consumer
210
+ // who pinned an older Connect keeps building. An empty pin means `+`, which
211
+ // always resolves to the newest (co-versioned) release.
212
+ def acousticCompanionsRequired = true
213
+ if (!acousticVersionPin.isEmpty()) {
214
+ // Compare only the numeric core, ignoring any -beta/+build qualifier: a
215
+ // 11.0.18-beta pin must count as >= the 11.0.18 floor. Encoded as one integer
216
+ // because Groovy's <=> does not compare two ArrayLists.
217
+ def core = acousticVersionPin.replaceAll(/[-+].*$/, '').tokenize('.')
218
+ def nums = (0..2).collect { i -> (i < core.size() && core[i].isInteger()) ? core[i].toInteger() : 0 }
219
+ // Upper bound as well as lower, so that a pin outside the supported range
220
+ // fails on the `strictly '[11.0.11, 12.0.0)'` constraint in the
221
+ // `constraints { }` block at the bottom of `dependencies` — which names both
222
+ // the range and the reason — rather than on an unresolvable companion
223
+ // coordinate. Verified: without this bound a 12.0.0 pin reported
224
+ // "Could not find io.github.go-acoustic:eocore:12.0.0", burying the real cause.
225
+ def pinCode = nums[0] * 1000000 + nums[1] * 1000 + nums[2]
226
+ acousticCompanionsRequired = pinCode >= 11_000_018 && pinCode < 12_000_000
227
+ }
228
+ println "AcousticConnectRN: companionCompileDeps=$acousticCompanionsRequired (pin='$acousticVersionPin')"
182
229
  println "AcousticConnectRN: PushEnabled=$acousticPushEnabled, artifact=io.github.go-acoustic:$acousticArtifact:$acousticVersion"
183
230
 
184
231
  dependencies {
@@ -200,6 +247,42 @@ dependencies {
200
247
  //noinspection GradleDynamicVersion
201
248
  implementation "io.github.go-acoustic:$acousticArtifact:$acousticVersion"
202
249
 
250
+ // Restore the compile classpath for Connect's internal modules. This bridge
251
+ // calls into both directly — `com.ibm.eo.EOCore`,
252
+ // `com.ibm.eo.model.EOMonitoringLevel`, `com.tl.uic.Tealeaf`,
253
+ // `com.tl.uic.model.ScreenviewType`,
254
+ // `com.tl.uic.util.{DialogUtil,LayoutUtil,keyboardview.KeyboardView}` — so
255
+ // with them at `runtime` scope `compileDebugKotlin` fails with ~34
256
+ // "Unresolved reference 'ibm' / 'tl' / 'EOCore'" errors.
257
+ //
258
+ // compileOnly, not implementation: the artifacts still reach the runtime graph
259
+ // through Connect's own transitive, so declaring them there too would risk a
260
+ // second, independently-resolved copy.
261
+ //
262
+ // Both scopes are required — compileOnly does NOT propagate to the unit-test
263
+ // compile classpath, and android/src/test imports com.ibm.eo.* as well, so
264
+ // compileDebugUnitTestKotlin fails without the testCompileOnly pair.
265
+ //
266
+ // Correct for BOTH artifact variants. `connect-push-fcm` does not declare
267
+ // eocore/tealeaf itself — its POM depends on `connect` at compile scope, and
268
+ // eocore/tealeaf reach the graph through that at `runtime` scope, so the
269
+ // compile classpath is short of them exactly as in the analytics-only case.
270
+ // The variants are co-versioned (connect-push-fcm 11.0.18-beta -> connect
271
+ // 11.0.18-beta -> eocore/tealeaf 11.0.18-beta), so `$acousticVersion` is the
272
+ // right coordinate either way. Confirmed on debugCompileClasspath with
273
+ // PushEnabled=true; gating these on `!acousticPushEnabled` would break the
274
+ // push variant rather than protect it.
275
+ if (acousticCompanionsRequired) {
276
+ //noinspection GradleDynamicVersion
277
+ compileOnly "io.github.go-acoustic:eocore:$acousticVersion"
278
+ //noinspection GradleDynamicVersion
279
+ compileOnly "io.github.go-acoustic:tealeaf:$acousticVersion"
280
+ //noinspection GradleDynamicVersion
281
+ testCompileOnly "io.github.go-acoustic:eocore:$acousticVersion"
282
+ //noinspection GradleDynamicVersion
283
+ testCompileOnly "io.github.go-acoustic:tealeaf:$acousticVersion"
284
+ }
285
+
203
286
  // Firebase Cloud Messaging — required by the push variant. The
204
287
  // `connect-push-fcm` AAR calls `com.google.firebase.messaging.*`
205
288
  // (its `FCMPushService` extends `FirebaseMessagingService`) but its
@@ -211,7 +294,7 @@ dependencies {
211
294
  // builds pull zero Firebase. The host app still supplies its own
212
295
  // `google-services.json` and applies the `com.google.gms.google-services`
213
296
  // plugin (the bare-workflow demo does this conditionally). The BoM aligns
214
- // messaging + its installations/datatransport transitives. See CA-144314.
297
+ // messaging + its installations/datatransport transitives.
215
298
  if (acousticPushEnabled) {
216
299
  implementation platform('com.google.firebase:firebase-bom:33.7.0')
217
300
  implementation 'com.google.firebase:firebase-messaging'