@convivainc/conviva-react-native-appanalytics 0.0.1 → 0.1.1

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 (29) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/README.md +2 -12
  3. package/RNConvivaAppAnalytics.podspec +24 -0
  4. package/android/build.gradle +55 -0
  5. package/android/gradle/wrapper/gradle-wrapper.properties +6 -0
  6. package/android/gradle.properties +2 -0
  7. package/android/gradlew +172 -0
  8. package/android/gradlew.bat +84 -0
  9. package/android/src/main/AndroidManifest.xml +1 -0
  10. package/android/src/main/java/com/conviva/react/apptracker/RNConvivaTrackerModule.java +804 -0
  11. package/android/src/main/java/com/conviva/react/apptracker/RNConvivaTrackerPackage.java +29 -0
  12. package/android/src/main/java/com/conviva/react/apptracker/util/ConfigUtil.java +346 -0
  13. package/android/src/main/java/com/conviva/react/apptracker/util/EventUtil.java +339 -0
  14. package/android/src/main/java/com/conviva/react/apptracker/util/TrackerVersion.java +9 -0
  15. package/{index.js → conviva-react-native-appanalytics.js} +3 -3
  16. package/ios/RNConvivaAppAnalytics.h +34 -0
  17. package/ios/RNConvivaAppAnalytics.m +1022 -0
  18. package/ios/RNConvivaAppAnalytics.xcodeproj/project.pbxproj +325 -0
  19. package/ios/RNConvivaAppAnalytics.xcodeproj/xcshareddata/xcschemes/RNSnowplowTracker.xcscheme +76 -0
  20. package/ios/Util/NSDictionary+RNCAT_TypeMethods.h +33 -0
  21. package/ios/Util/NSDictionary+RNCAT_TypeMethods.m +40 -0
  22. package/ios/Util/RNConfigUtils.h +44 -0
  23. package/ios/Util/RNConfigUtils.m +209 -0
  24. package/ios/Util/RNTrackerVersion.h +27 -0
  25. package/ios/Util/RNTrackerVersion.m +27 -0
  26. package/ios/Util/RNUtilities.h +32 -0
  27. package/ios/Util/RNUtilities.m +68 -0
  28. package/package.json +1 -1
  29. /package/{index.d.ts → conviva-react-native-appanalytics.d.ts} +0 -0
@@ -0,0 +1,804 @@
1
+ package com.conviva.react.apptracker;
2
+
3
+ import com.conviva.apptracker.ConvivaAppAnalytics;
4
+ import com.conviva.apptracker.configuration.Configuration;
5
+ import com.conviva.apptracker.configuration.EmitterConfiguration;
6
+ import com.conviva.apptracker.configuration.GdprConfiguration;
7
+ import com.conviva.apptracker.configuration.GlobalContextsConfiguration;
8
+ import com.conviva.apptracker.configuration.NetworkConfiguration;
9
+ import com.conviva.apptracker.configuration.RemoteConfiguration;
10
+ import com.conviva.apptracker.configuration.SessionConfiguration;
11
+ import com.conviva.apptracker.configuration.SubjectConfiguration;
12
+ import com.conviva.apptracker.configuration.TrackerConfiguration;
13
+ import com.conviva.apptracker.controller.TrackerController;
14
+ import com.conviva.apptracker.event.ConsentGranted;
15
+ import com.conviva.apptracker.event.ConsentWithdrawn;
16
+ import com.conviva.apptracker.event.DeepLinkReceived;
17
+ import com.conviva.apptracker.event.EcommerceTransaction;
18
+ import com.conviva.apptracker.event.MessageNotification;
19
+ import com.conviva.apptracker.event.PageView;
20
+ import com.conviva.apptracker.event.ScreenView;
21
+ import com.conviva.apptracker.event.SelfDescribing;
22
+ import com.conviva.apptracker.event.Structured;
23
+ import com.conviva.apptracker.event.Timing;
24
+ import com.conviva.apptracker.globalcontexts.GlobalContext;
25
+ import com.conviva.apptracker.internal.constants.TrackerConstants;
26
+ import com.conviva.apptracker.network.CollectorCookieJar;
27
+ import com.conviva.apptracker.network.HttpMethod;
28
+ import com.conviva.apptracker.payload.SelfDescribingJson;
29
+ import com.conviva.apptracker.util.Size;
30
+ import com.conviva.react.apptracker.util.ConfigUtil;
31
+ import com.conviva.react.apptracker.util.EventUtil;
32
+ import com.facebook.react.bridge.Promise;
33
+ import com.facebook.react.bridge.ReactApplicationContext;
34
+ import com.facebook.react.bridge.ReactContextBaseJavaModule;
35
+ import com.facebook.react.bridge.ReactMethod;
36
+ import com.facebook.react.bridge.ReadableArray;
37
+ import com.facebook.react.bridge.ReadableMap;
38
+ import com.facebook.react.bridge.ReadableMapKeySetIterator;
39
+
40
+ import org.json.simple.JSONValue;
41
+
42
+ import java.util.ArrayList;
43
+ import java.util.HashMap;
44
+ import java.util.HashSet;
45
+ import java.util.List;
46
+ import java.util.concurrent.TimeUnit;
47
+
48
+ import okhttp3.OkHttpClient;
49
+ import okhttp3.Request;
50
+
51
+ public class RNConvivaTrackerModule extends ReactContextBaseJavaModule {
52
+
53
+ private final ReactApplicationContext reactContext;
54
+
55
+ public RNConvivaTrackerModule(ReactApplicationContext reactContext) {
56
+ super(reactContext);
57
+ this.reactContext = reactContext;
58
+ }
59
+
60
+ @Override
61
+ public String getName() {
62
+ return "RNConvivaTracker";
63
+ }
64
+
65
+ @ReactMethod
66
+ public void createTracker(ReadableMap argmap, Promise promise) {
67
+ try {
68
+ String appName = argmap.getString("appName");
69
+ String customerKey = argmap.getString("customerKey");
70
+
71
+ // Configurations
72
+ List<Configuration> controllers = new ArrayList<Configuration>();
73
+
74
+ // NetworkConfiguration
75
+ NetworkConfiguration networkConfiguration;
76
+ if (argmap.hasKey("networkConfig")) {
77
+ ReadableMap networkConfig = argmap.getMap("networkConfig");
78
+ String endpoint = TrackerConstants.CONVIVA_PRODUCTION_ENDPOINT;
79
+ if (networkConfig.hasKey("endpoint") && !networkConfig.isNull("endpoint")) {
80
+ endpoint = networkConfig.getString("endpoint");
81
+ }
82
+ if (networkConfig.hasKey("method") && !networkConfig.isNull("method")) {
83
+ String method = networkConfig.getString("method");
84
+ networkConfiguration = new NetworkConfiguration(endpoint, ("get".equalsIgnoreCase(method) ? HttpMethod.GET : HttpMethod.POST));
85
+ } else {
86
+ networkConfiguration = new NetworkConfiguration(networkConfig.getString("endpoint"));
87
+ }
88
+ if (networkConfig.hasKey("customPostPath") && !networkConfig.isNull("customPostPath")) {
89
+ String customPostPath = networkConfig.getString("customPostPath");
90
+ networkConfiguration.customPostPath = customPostPath;
91
+ } else {
92
+ networkConfiguration.customPostPath = (customerKey + "/" + TrackerConstants.CONVIVA_PROTOCOL_VERSION);
93
+ }
94
+ if (networkConfig.hasKey("requestHeaders") && !networkConfig.isNull("requestHeaders")) {
95
+ ReadableMap requestHeaders = networkConfig.getMap("requestHeaders");
96
+ if (requestHeaders != null) {
97
+ OkHttpClient client = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).readTimeout(15, TimeUnit.SECONDS).cookieJar(new CollectorCookieJar(reactContext)).addInterceptor(chain -> {
98
+ Request.Builder requestBuilder = chain.request().newBuilder();
99
+ ReadableMapKeySetIterator it = requestHeaders.keySetIterator();
100
+ while (it.hasNextKey()) {
101
+ String key = it.nextKey();
102
+ String value = requestHeaders.getString(key);
103
+ if (value != null) {
104
+ requestBuilder.header(key, value);
105
+ }
106
+ }
107
+ return chain.proceed(requestBuilder.build());
108
+ }).build();
109
+ networkConfiguration.okHttpClient(client);
110
+ }
111
+ }
112
+ controllers.add(networkConfiguration);
113
+ }
114
+
115
+ // TrackerConfiguration
116
+ // Need to create the TrackerConfiguration to update the postfix for the tracker version
117
+ ReadableMap trackerConfig = null;
118
+ if (argmap.hasKey("trackerConfig")) {
119
+ trackerConfig = argmap.getMap("trackerConfig");
120
+ }
121
+ TrackerConfiguration trackerConfiguration = ConfigUtil.mkTrackerConfiguration(trackerConfig, appName, this.reactContext);
122
+ controllers.add(trackerConfiguration);
123
+
124
+ // SessionConfiguration
125
+ if (argmap.hasKey("sessionConfig")) {
126
+ ReadableMap sessionConfig = argmap.getMap("sessionConfig");
127
+ SessionConfiguration sessionConfiguration = ConfigUtil.mkSessionConfiguration(sessionConfig);
128
+ controllers.add(sessionConfiguration);
129
+ }
130
+
131
+ // EmitterConfiguration
132
+ if (argmap.hasKey("emitterConfig")) {
133
+ ReadableMap emitterConfig = argmap.getMap("emitterConfig");
134
+ EmitterConfiguration emitterConfiguration = ConfigUtil.mkEmitterConfiguration(emitterConfig);
135
+ controllers.add(emitterConfiguration);
136
+ }
137
+
138
+ // SubjectConfiguration
139
+ if (argmap.hasKey("subjectConfig")) {
140
+ ReadableMap subjectConfig = argmap.getMap("subjectConfig");
141
+ SubjectConfiguration subjectConfiguration = ConfigUtil.mkSubjectConfiguration(subjectConfig);
142
+ controllers.add(subjectConfiguration);
143
+ }
144
+
145
+ // GdprConfiguration
146
+ if (argmap.hasKey("gdprConfig")) {
147
+ ReadableMap gdprConfig = argmap.getMap("gdprConfig");
148
+ GdprConfiguration gdprConfiguration = ConfigUtil.mkGdprConfiguration(gdprConfig);
149
+ controllers.add(gdprConfiguration);
150
+ }
151
+
152
+ // GCConfiguration
153
+ if (argmap.hasKey("gcConfig")) {
154
+ ReadableArray gcConfig = argmap.getArray("gcConfig");
155
+ GlobalContextsConfiguration gcConfiguration = ConfigUtil.mkGCConfiguration(gcConfig);
156
+ controllers.add(gcConfiguration);
157
+ }
158
+
159
+ String remoteConfigUrl = RemoteConfiguration.DEFAULT_ENDPOINT;
160
+ if (argmap.hasKey("remoteConfiguration")) {
161
+ ReadableMap remoteConfig = argmap.getMap("remoteConfiguration");
162
+ if (remoteConfig.hasKey("endpoint")) {
163
+ remoteConfigUrl = remoteConfig.getString("endpoint");
164
+ }
165
+ }
166
+
167
+ // create the tracker
168
+ ConvivaAppAnalytics.createTracker(this.reactContext, customerKey, appName, controllers.toArray(new Configuration[controllers.size()]));
169
+
170
+ promise.resolve(true);
171
+
172
+ } catch (Throwable t) {
173
+ promise.reject("ERROR", t.getMessage());
174
+ }
175
+ }
176
+
177
+ @ReactMethod
178
+ public void removeTracker(ReadableMap details, Promise promise) {
179
+ try {
180
+ String namespace = details.getString("tracker");
181
+ TrackerController trackerController = getTracker(namespace);
182
+
183
+ promise.resolve(ConvivaAppAnalytics.removeTracker(trackerController));
184
+
185
+ } catch (Throwable t) {
186
+ promise.reject("ERROR", t.getMessage());
187
+ }
188
+ }
189
+
190
+ @ReactMethod
191
+ public void removeAllTrackers(Promise promise) {
192
+ try {
193
+ ConvivaAppAnalytics.removeAllTrackers();
194
+ promise.resolve(true);
195
+
196
+ } catch (Throwable t) {
197
+ promise.reject("ERROR", t.getMessage());
198
+ }
199
+ }
200
+
201
+ @ReactMethod
202
+ public void trackSelfDescribingEvent(ReadableMap details, Promise promise) {
203
+ try {
204
+ String namespace = details.getString("tracker");
205
+ ReadableMap argmap = details.getMap("eventData");
206
+ ReadableArray contexts = details.getArray("contexts");
207
+
208
+ TrackerController trackerController = getTracker(namespace);
209
+
210
+ SelfDescribingJson sdj = EventUtil.createSelfDescribingJson(argmap);
211
+ SelfDescribing event = new SelfDescribing(sdj);
212
+
213
+ List<SelfDescribingJson> evCtxts = EventUtil.createContexts(contexts);
214
+ event.customContexts.addAll(evCtxts);
215
+
216
+ trackerController.track(event);
217
+ promise.resolve(true);
218
+
219
+ } catch (Throwable t) {
220
+ promise.reject("ERROR", t.getMessage());
221
+ }
222
+ }
223
+
224
+ @ReactMethod
225
+ public void trackStructuredEvent(ReadableMap details, Promise promise) {
226
+ try {
227
+ String namespace = details.getString("tracker");
228
+ ReadableMap argmap = details.getMap("eventData");
229
+ ReadableArray contexts = details.getArray("contexts");
230
+
231
+ TrackerController trackerController = getTracker(namespace);
232
+
233
+ Structured event = EventUtil.createStructuredEvent(argmap);
234
+
235
+ List<SelfDescribingJson> evCtxts = EventUtil.createContexts(contexts);
236
+ event.customContexts.addAll(evCtxts);
237
+
238
+ trackerController.track(event);
239
+ promise.resolve(true);
240
+
241
+ } catch (Throwable t) {
242
+ promise.reject("ERROR", t.getMessage());
243
+ }
244
+ }
245
+
246
+ @ReactMethod
247
+ public void trackScreenViewEvent(ReadableMap details, Promise promise) {
248
+ try {
249
+ String namespace = details.getString("tracker");
250
+ ReadableMap argmap = details.getMap("eventData");
251
+ ReadableArray contexts = details.getArray("contexts");
252
+
253
+ TrackerController trackerController = getTracker(namespace);
254
+
255
+ ScreenView event = EventUtil.createScreenViewEvent(argmap);
256
+
257
+ List<SelfDescribingJson> evCtxts = EventUtil.createContexts(contexts);
258
+ event.customContexts.addAll(evCtxts);
259
+
260
+ trackerController.track(event);
261
+ promise.resolve(true);
262
+
263
+ } catch (Throwable t) {
264
+ promise.reject("ERROR", t.getMessage());
265
+ }
266
+ }
267
+
268
+ @ReactMethod
269
+ public void trackPageView(ReadableMap details, Promise promise) {
270
+ try {
271
+ String namespace = details.getString("tracker");
272
+ ReadableMap argmap = details.getMap("eventData");
273
+ ReadableArray contexts = details.getArray("contexts");
274
+
275
+ TrackerController trackerController = getTracker(namespace);
276
+
277
+ PageView event = EventUtil.createPageViewEvent(argmap);
278
+
279
+ List<SelfDescribingJson> evCtxts = EventUtil.createContexts(contexts);
280
+ event.customContexts.addAll(evCtxts);
281
+
282
+ trackerController.track(event);
283
+ promise.resolve(true);
284
+
285
+ } catch (Throwable t) {
286
+ promise.reject("ERROR", t.getMessage());
287
+ }
288
+ }
289
+
290
+ @ReactMethod
291
+ public void trackTimingEvent(ReadableMap details, Promise promise) {
292
+ try {
293
+ String namespace = details.getString("tracker");
294
+ ReadableMap argmap = details.getMap("eventData");
295
+ ReadableArray contexts = details.getArray("contexts");
296
+
297
+ TrackerController trackerController = getTracker(namespace);
298
+
299
+ Timing event = EventUtil.createTimingEvent(argmap);
300
+
301
+ List<SelfDescribingJson> evCtxts = EventUtil.createContexts(contexts);
302
+ event.customContexts.addAll(evCtxts);
303
+
304
+ trackerController.track(event);
305
+ promise.resolve(true);
306
+
307
+ } catch (Throwable t) {
308
+ promise.reject("ERROR", t.getMessage());
309
+ }
310
+ }
311
+
312
+ @ReactMethod
313
+ public void trackConsentGrantedEvent(ReadableMap details, Promise promise) {
314
+ try {
315
+ String namespace = details.getString("tracker");
316
+ ReadableMap argmap = details.getMap("eventData");
317
+ ReadableArray contexts = details.getArray("contexts");
318
+
319
+ TrackerController trackerController = getTracker(namespace);
320
+
321
+ ConsentGranted event = EventUtil.createConsentGrantedEvent(argmap);
322
+
323
+ List<SelfDescribingJson> evCtxts = EventUtil.createContexts(contexts);
324
+ event.customContexts.addAll(evCtxts);
325
+
326
+ trackerController.track(event);
327
+ promise.resolve(true);
328
+
329
+ } catch (Throwable t) {
330
+ promise.reject("ERROR", t.getMessage());
331
+ }
332
+ }
333
+
334
+ @ReactMethod
335
+ public void trackConsentWithdrawnEvent(ReadableMap details, Promise promise) {
336
+ try {
337
+ String namespace = details.getString("tracker");
338
+ ReadableMap argmap = details.getMap("eventData");
339
+ ReadableArray contexts = details.getArray("contexts");
340
+
341
+ TrackerController trackerController = getTracker(namespace);
342
+
343
+ ConsentWithdrawn event = EventUtil.createConsentWithdrawnEvent(argmap);
344
+
345
+ List<SelfDescribingJson> evCtxts = EventUtil.createContexts(contexts);
346
+ event.customContexts.addAll(evCtxts);
347
+
348
+ trackerController.track(event);
349
+ promise.resolve(true);
350
+
351
+ } catch (Throwable t) {
352
+ promise.reject("ERROR", t.getMessage());
353
+ }
354
+ }
355
+
356
+ @ReactMethod
357
+ public void trackEcommerceTransactionEvent(ReadableMap details, Promise promise) {
358
+ try {
359
+ String namespace = details.getString("tracker");
360
+ ReadableMap argmap = details.getMap("eventData");
361
+ ReadableArray contexts = details.getArray("contexts");
362
+
363
+ TrackerController trackerController = getTracker(namespace);
364
+
365
+ EcommerceTransaction event = EventUtil.createEcommerceTransactionEvent(argmap);
366
+
367
+ List<SelfDescribingJson> evCtxts = EventUtil.createContexts(contexts);
368
+ event.customContexts.addAll(evCtxts);
369
+
370
+ trackerController.track(event);
371
+ promise.resolve(true);
372
+
373
+ } catch (Throwable t) {
374
+ promise.reject("ERROR", t.getMessage());
375
+ }
376
+ }
377
+
378
+ @ReactMethod
379
+ public void trackDeepLinkReceivedEvent(ReadableMap details, Promise promise) {
380
+ try {
381
+ String namespace = details.getString("tracker");
382
+ ReadableMap argmap = details.getMap("eventData");
383
+ ReadableArray contexts = details.getArray("contexts");
384
+
385
+ TrackerController trackerController = getTracker(namespace);
386
+
387
+ DeepLinkReceived event = EventUtil.createDeepLinkReceivedEvent(argmap);
388
+
389
+ List<SelfDescribingJson> evCtxts = EventUtil.createContexts(contexts);
390
+ event.customContexts.addAll(evCtxts);
391
+
392
+ trackerController.track(event);
393
+ promise.resolve(true);
394
+
395
+ } catch (Throwable t) {
396
+ promise.reject("ERROR", t.getMessage());
397
+ }
398
+ }
399
+
400
+ @ReactMethod
401
+ public void trackMessageNotificationEvent(ReadableMap details, Promise promise) {
402
+ try {
403
+ String namespace = details.getString("tracker");
404
+ ReadableMap argmap = details.getMap("eventData");
405
+ ReadableArray contexts = details.getArray("contexts");
406
+
407
+ TrackerController trackerController = getTracker(namespace);
408
+
409
+ MessageNotification event = EventUtil.createMessageNotificationEvent(argmap);
410
+
411
+ List<SelfDescribingJson> evCtxts = EventUtil.createContexts(contexts);
412
+ event.customContexts.addAll(evCtxts);
413
+
414
+ trackerController.track(event);
415
+ promise.resolve(true);
416
+
417
+ } catch (Throwable t) {
418
+ promise.reject("ERROR", t.getMessage());
419
+ }
420
+ }
421
+
422
+ @ReactMethod
423
+ public void trackCustomEvent(ReadableMap details, Promise promise) {
424
+ try {
425
+ String namespace = details.getString("tracker");
426
+ String eventName = details.getString("eventName");
427
+ ReadableMap argmap = details.getMap("eventData");
428
+
429
+ TrackerController trackerController = getTracker(namespace);
430
+
431
+ HashMap<String, Object> eventData = argmap.toHashMap();
432
+
433
+ trackerController.trackCustomEvent(eventName, JSONValue.toJSONString(eventData));
434
+ promise.resolve(true);
435
+
436
+ } catch (Throwable t) {
437
+ promise.reject("ERROR", t.getMessage());
438
+ }
439
+ }
440
+
441
+ @ReactMethod
442
+ public void setCustomTags(ReadableMap details, Promise promise) {
443
+ try {
444
+ String namespace = details.getString("tracker");
445
+ ReadableMap argmap = details.getMap("tags");
446
+
447
+ TrackerController trackerController = getTracker(namespace);
448
+
449
+ HashMap<String, Object> tags = argmap.toHashMap();
450
+
451
+ trackerController.setCustomTags(tags);
452
+ promise.resolve(true);
453
+
454
+ } catch (Throwable t) {
455
+ promise.reject("ERROR", t.getMessage());
456
+ }
457
+ }
458
+
459
+ @ReactMethod
460
+ public void clearCustomTags(ReadableMap details, Promise promise) {
461
+ try {
462
+ String namespace = details.getString("tracker");
463
+ ReadableArray argArray = details.getArray("tagKeys");
464
+
465
+ TrackerController trackerController = getTracker(namespace);
466
+
467
+ List<String> tagKeys = EventUtil.createStrings(argArray);
468
+ trackerController.clearCustomTags(new HashSet<>(tagKeys));
469
+ promise.resolve(true);
470
+
471
+ } catch (Throwable t) {
472
+ promise.reject("ERROR", t.getMessage());
473
+ }
474
+ }
475
+
476
+ @ReactMethod
477
+ public void clearAllCustomTags(ReadableMap details, Promise promise) {
478
+ try {
479
+ String namespace = details.getString("tracker");
480
+ TrackerController trackerController = getTracker(namespace);
481
+
482
+ trackerController.clearAllCustomTags();
483
+ promise.resolve(true);
484
+
485
+ } catch (Throwable t) {
486
+ promise.reject("ERROR", t.getMessage());
487
+ }
488
+ }
489
+
490
+ @ReactMethod
491
+ public void removeGlobalContexts(ReadableMap details, Promise promise) {
492
+ try {
493
+ String namespace = details.getString("tracker");
494
+ String tag = details.getString("removeTag");
495
+
496
+ TrackerController trackerController = getTracker(namespace);
497
+
498
+ trackerController.getGlobalContexts().remove(tag);
499
+ promise.resolve(true);
500
+
501
+ } catch (Throwable t) {
502
+ promise.reject("ERROR", t.getMessage());
503
+ }
504
+ }
505
+
506
+ @ReactMethod
507
+ public void addGlobalContexts(ReadableMap details, Promise promise) {
508
+ try {
509
+ String namespace = details.getString("tracker");
510
+ ReadableMap gcArg = details.getMap("addGlobalContext");
511
+
512
+ String tag = gcArg.getString("tag");
513
+ ReadableArray globalContexts = gcArg.getArray("globalContexts");
514
+
515
+ List<SelfDescribingJson> staticContexts = new ArrayList<>();
516
+ for (int i = 0; i < globalContexts.size(); i++) {
517
+ SelfDescribingJson gContext = EventUtil.createSelfDescribingJson(globalContexts.getMap(i));
518
+ staticContexts.add(gContext);
519
+ }
520
+ GlobalContext gcStatic = new GlobalContext(staticContexts);
521
+
522
+ TrackerController trackerController = getTracker(namespace);
523
+
524
+ trackerController.getGlobalContexts().add(tag, gcStatic);
525
+ promise.resolve(true);
526
+
527
+ } catch (Throwable t) {
528
+ promise.reject("ERROR", t.getMessage());
529
+ }
530
+ }
531
+
532
+ @ReactMethod
533
+ public void setUserId(ReadableMap details, Promise promise) {
534
+ try {
535
+ String namespace = details.getString("tracker");
536
+ TrackerController trackerController = getTracker(namespace);
537
+
538
+ if (details.isNull("userId")) {
539
+ trackerController.getSubject().setUserId(null);
540
+ } else {
541
+ trackerController.getSubject().setUserId(details.getString("userId"));
542
+ }
543
+ promise.resolve(true);
544
+
545
+ } catch (Throwable t) {
546
+ promise.reject("ERROR", t.getMessage());
547
+ }
548
+ }
549
+
550
+ @ReactMethod
551
+ public void setNetworkUserId(ReadableMap details, Promise promise) {
552
+ try {
553
+ String namespace = details.getString("tracker");
554
+ TrackerController trackerController = getTracker(namespace);
555
+
556
+ if (details.isNull("networkUserId")) {
557
+ trackerController.getSubject().setNetworkUserId(null);
558
+ } else {
559
+ trackerController.getSubject().setNetworkUserId(details.getString("networkUserId"));
560
+ }
561
+ promise.resolve(true);
562
+
563
+ } catch (Throwable t) {
564
+ promise.reject("ERROR", t.getMessage());
565
+ }
566
+ }
567
+
568
+ @ReactMethod
569
+ public void setDomainUserId(ReadableMap details, Promise promise) {
570
+ try {
571
+ String namespace = details.getString("tracker");
572
+ TrackerController trackerController = getTracker(namespace);
573
+
574
+ if (details.isNull("domainUserId")) {
575
+ trackerController.getSubject().setDomainUserId(null);
576
+ } else {
577
+ trackerController.getSubject().setDomainUserId(details.getString("domainUserId"));
578
+ }
579
+ promise.resolve(true);
580
+
581
+ } catch (Throwable t) {
582
+ promise.reject("ERROR", t.getMessage());
583
+ }
584
+ }
585
+
586
+ @ReactMethod
587
+ public void setIpAddress(ReadableMap details, Promise promise) {
588
+ try {
589
+ String namespace = details.getString("tracker");
590
+ TrackerController trackerController = getTracker(namespace);
591
+
592
+ if (details.isNull("ipAddress")) {
593
+ trackerController.getSubject().setIpAddress(null);
594
+ } else {
595
+ trackerController.getSubject().setIpAddress(details.getString("ipAddress"));
596
+ }
597
+ promise.resolve(true);
598
+
599
+ } catch (Throwable t) {
600
+ promise.reject("ERROR", t.getMessage());
601
+ }
602
+ }
603
+
604
+ @ReactMethod
605
+ public void setUseragent(ReadableMap details, Promise promise) {
606
+ try {
607
+ String namespace = details.getString("tracker");
608
+ TrackerController trackerController = getTracker(namespace);
609
+
610
+ if (details.isNull("useragent")) {
611
+ trackerController.getSubject().setUseragent(null);
612
+ } else {
613
+ trackerController.getSubject().setUseragent(details.getString("useragent"));
614
+ }
615
+ promise.resolve(true);
616
+
617
+ } catch (Throwable t) {
618
+ promise.reject("ERROR", t.getMessage());
619
+ }
620
+ }
621
+
622
+ @ReactMethod
623
+ public void setTimezone(ReadableMap details, Promise promise) {
624
+ try {
625
+ String namespace = details.getString("tracker");
626
+ TrackerController trackerController = getTracker(namespace);
627
+
628
+ if (details.isNull("timezone")) {
629
+ trackerController.getSubject().setTimezone(null);
630
+ } else {
631
+ trackerController.getSubject().setTimezone(details.getString("timezone"));
632
+ }
633
+ promise.resolve(true);
634
+
635
+ } catch (Throwable t) {
636
+ promise.reject("ERROR", t.getMessage());
637
+ }
638
+ }
639
+
640
+ @ReactMethod
641
+ public void setLanguage(ReadableMap details, Promise promise) {
642
+ try {
643
+ String namespace = details.getString("tracker");
644
+ TrackerController trackerController = getTracker(namespace);
645
+
646
+ if (details.isNull("language")) {
647
+ trackerController.getSubject().setLanguage(null);
648
+ } else {
649
+ trackerController.getSubject().setLanguage(details.getString("language"));
650
+ }
651
+ promise.resolve(true);
652
+
653
+ } catch (Throwable t) {
654
+ promise.reject("ERROR", t.getMessage());
655
+ }
656
+ }
657
+
658
+ @ReactMethod
659
+ public void setScreenResolution(ReadableMap details, Promise promise) {
660
+ try {
661
+ String namespace = details.getString("tracker");
662
+ TrackerController trackerController = getTracker(namespace);
663
+
664
+ if (details.isNull("screenResolution")) {
665
+ trackerController.getSubject().setScreenResolution(null);
666
+ } else {
667
+ ReadableArray screenRes = details.getArray("screenResolution");
668
+ int width = screenRes.getInt(0);
669
+ int height = screenRes.getInt(1);
670
+ Size screenR = new Size(width, height);
671
+
672
+ trackerController.getSubject().setScreenResolution(screenR);
673
+ }
674
+ promise.resolve(true);
675
+
676
+ } catch (Throwable t) {
677
+ promise.reject("ERROR", t.getMessage());
678
+ }
679
+ }
680
+
681
+ @ReactMethod
682
+ public void setScreenViewport(ReadableMap details, Promise promise) {
683
+ try {
684
+ String namespace = details.getString("tracker");
685
+ TrackerController trackerController = getTracker(namespace);
686
+
687
+ if (details.isNull("screenViewport")) {
688
+ trackerController.getSubject().setScreenViewPort(null);
689
+ } else {
690
+ ReadableArray screenView = details.getArray("screenViewport");
691
+ int width = screenView.getInt(0);
692
+ int height = screenView.getInt(1);
693
+ Size screenVP = new Size(width, height);
694
+
695
+ trackerController.getSubject().setScreenViewPort(screenVP);
696
+ }
697
+ promise.resolve(true);
698
+
699
+ } catch (Throwable t) {
700
+ promise.reject("ERROR", t.getMessage());
701
+ }
702
+ }
703
+
704
+ @ReactMethod
705
+ public void setColorDepth(ReadableMap details, Promise promise) {
706
+ try {
707
+ String namespace = details.getString("tracker");
708
+ TrackerController trackerController = getTracker(namespace);
709
+
710
+ if (details.isNull("colorDepth")) {
711
+ trackerController.getSubject().setColorDepth(null);
712
+ } else {
713
+ trackerController.getSubject().setColorDepth(details.getInt("colorDepth"));
714
+ }
715
+ promise.resolve(true);
716
+
717
+ } catch (Throwable t) {
718
+ promise.reject("ERROR", t.getMessage());
719
+ }
720
+ }
721
+
722
+ @ReactMethod
723
+ public void getSessionUserId(ReadableMap details, Promise promise) {
724
+ try {
725
+ String namespace = details.getString("tracker");
726
+ TrackerController trackerController = getTracker(namespace);
727
+
728
+ String suid = trackerController.getSession().getUserId();
729
+ promise.resolve(suid);
730
+ } catch (Throwable t) {
731
+ promise.reject("ERROR", t.getMessage());
732
+ }
733
+ }
734
+
735
+ @ReactMethod
736
+ public void getSessionId(ReadableMap details, Promise promise) {
737
+ try {
738
+ String namespace = details.getString("tracker");
739
+ TrackerController trackerController = getTracker(namespace);
740
+
741
+ String sid = trackerController.getSession().getSessionId();
742
+ promise.resolve(sid);
743
+ } catch (Throwable t) {
744
+ promise.reject("ERROR", t.getMessage());
745
+ }
746
+ }
747
+
748
+ @ReactMethod
749
+ public void getSessionIndex(ReadableMap details, Promise promise) {
750
+ try {
751
+ String namespace = details.getString("tracker");
752
+ TrackerController trackerController = getTracker(namespace);
753
+
754
+ int sidx = trackerController.getSession().getSessionIndex();
755
+ promise.resolve(sidx);
756
+ } catch (Throwable t) {
757
+ promise.reject("ERROR", t.getMessage());
758
+ }
759
+ }
760
+
761
+ @ReactMethod
762
+ public void getIsInBackground(ReadableMap details, Promise promise) {
763
+ try {
764
+ String namespace = details.getString("tracker");
765
+ TrackerController trackerController = getTracker(namespace);
766
+
767
+ boolean isInBg = trackerController.getSession().isInBackground();
768
+ promise.resolve(isInBg);
769
+ } catch (Throwable t) {
770
+ promise.reject("ERROR", t.getMessage());
771
+ }
772
+ }
773
+
774
+ @ReactMethod
775
+ public void getBackgroundIndex(ReadableMap details, Promise promise) {
776
+ try {
777
+ String namespace = details.getString("tracker");
778
+ TrackerController trackerController = getTracker(namespace);
779
+
780
+ int bgIdx = trackerController.getSession().getBackgroundIndex();
781
+ promise.resolve(bgIdx);
782
+ } catch (Throwable t) {
783
+ promise.reject("ERROR", t.getMessage());
784
+ }
785
+ }
786
+
787
+ @ReactMethod
788
+ public void getForegroundIndex(ReadableMap details, Promise promise) {
789
+ try {
790
+ String namespace = details.getString("tracker");
791
+ TrackerController trackerController = getTracker(namespace);
792
+
793
+ int fgIdx = trackerController.getSession().getForegroundIndex();
794
+ promise.resolve(fgIdx);
795
+ } catch (Throwable t) {
796
+ promise.reject("ERROR", t.getMessage());
797
+ }
798
+ }
799
+
800
+ private TrackerController getTracker(String namespace) {
801
+ return namespace == null ? ConvivaAppAnalytics.getDefaultTracker() : ConvivaAppAnalytics.getTracker(namespace);
802
+ }
803
+
804
+ }