@usercentrics/react-native-sdk 2.7.10 → 2.7.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,4 +1,31 @@
1
1
  [Release Notes](https://docs.usercentrics.com/cmp_in_app_sdk/latest/about/history/)
2
+ ### 2.7.13
3
+
4
+ ## Features
5
+
6
+ * Enabling PUR customisation properties
7
+
8
+ ## Improvements
9
+
10
+ * Improvements to stability and exception handling to solve edge cases.
11
+
12
+ ## Resolved Issues
13
+
14
+ * Solve issue with third party SDKs being included in POM file.
15
+ * UI improvements to CCPA Banner solution
16
+
17
+ ### 2.7.12
18
+
19
+ ## Improvements
20
+
21
+ * Several improvements on Consent Mediation
22
+ * Add support for Adjust and Crashlytics.
23
+ * Add support for Custom DPSs.
24
+
25
+ ## Resolved Issues
26
+
27
+ * Stability improvements and bug fixes.
28
+
2
29
  ### 2.7.10
3
30
 
4
31
  ## Improvements
@@ -1,4 +1,4 @@
1
- def usercentrics_version = "2.7.10"
1
+ def usercentrics_version = "2.7.13"
2
2
  version usercentrics_version
3
3
 
4
4
  buildscript {
@@ -1,5 +1,7 @@
1
1
  package com.usercentrics.reactnativemodule
2
2
 
3
+ import android.app.Activity
4
+ import android.content.Context
3
5
  import androidx.test.ext.junit.runners.AndroidJUnit4
4
6
  import androidx.test.platform.app.InstrumentationRegistry
5
7
  import com.facebook.react.bridge.*
@@ -8,6 +10,7 @@ import com.usercentrics.reactnativemodule.api.FakeUsercentricsProxy
8
10
  import com.usercentrics.reactnativemodule.fake.FakePromise
9
11
  import com.usercentrics.reactnativemodule.mock.*
10
12
  import com.usercentrics.reactnativeusercentrics.RNUsercentricsModule
13
+ import com.usercentrics.reactnativeusercentrics.ReactContextProvider
11
14
  import com.usercentrics.reactnativeusercentrics.extensions.serialize
12
15
  import com.usercentrics.reactnativeusercentrics.extensions.toWritableMap
13
16
  import com.usercentrics.sdk.*
@@ -30,6 +33,7 @@ import org.junit.runner.RunWith
30
33
  class RNUsercentricsModuleTest {
31
34
 
32
35
  companion object {
36
+
33
37
  private val usercentricsOptions = JavaOnlyMap().apply {
34
38
  putString("settingsId", "AAAAA")
35
39
  putString("ruleSetId", "BBBBB")
@@ -95,7 +99,7 @@ class RNUsercentricsModuleTest {
95
99
  fun testModuleName() {
96
100
  assertEquals(
97
101
  "RNUsercentricsModule",
98
- RNUsercentricsModule(mockk(relaxed = true), mockk()).name
102
+ RNUsercentricsModule(mockk(relaxed = true), mockk(), ReactContextProviderMock()).name
99
103
  )
100
104
  }
101
105
 
@@ -103,17 +107,14 @@ class RNUsercentricsModuleTest {
103
107
  fun testConfigure() {
104
108
  val usercentricsProxy = FakeUsercentricsProxy()
105
109
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
106
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
110
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
107
111
 
108
112
  module.configure(usercentricsOptions)
109
113
 
110
114
  assertEquals(1, usercentricsProxy.initializeCount)
111
115
  assertEquals("AAAAA", usercentricsProxy.initializeOptionsArgument?.settingsId)
112
116
  assertEquals("BBBBB", usercentricsProxy.initializeOptionsArgument?.ruleSetId)
113
- assertEquals(
114
- UsercentricsLoggerLevel.NONE,
115
- usercentricsProxy.initializeOptionsArgument?.loggerLevel
116
- )
117
+ assertEquals(UsercentricsLoggerLevel.NONE, usercentricsProxy.initializeOptionsArgument?.loggerLevel)
117
118
  assertEquals(1000L, usercentricsProxy.initializeOptionsArgument?.timeoutMillis)
118
119
  assertEquals("1.2.3", usercentricsProxy.initializeOptionsArgument?.version)
119
120
  assertEquals(NetworkMode.EU, usercentricsProxy.initializeOptionsArgument?.networkMode)
@@ -123,7 +124,7 @@ class RNUsercentricsModuleTest {
123
124
  fun testConfigureWithWrongValues() {
124
125
  val usercentricsProxy = FakeUsercentricsProxy()
125
126
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
126
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
127
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
127
128
 
128
129
  module.configure(JavaOnlyMap())
129
130
  assertEquals(UsercentricsOptions(), usercentricsProxy.initializeOptionsArgument)
@@ -133,7 +134,7 @@ class RNUsercentricsModuleTest {
133
134
  fun testIsReady() {
134
135
  val usercentricsProxy = FakeUsercentricsProxy(isReadyAnswer = usercentricsReadyStatus)
135
136
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
136
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
137
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
137
138
 
138
139
  val promise = FakePromise()
139
140
  module.isReady(promise)
@@ -156,7 +157,7 @@ class RNUsercentricsModuleTest {
156
157
 
157
158
  val usercentricsProxy = FakeUsercentricsProxy(isReadyAnswer = error)
158
159
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
159
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
160
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
160
161
 
161
162
  val promise = FakePromise()
162
163
  module.isReady(promise)
@@ -175,7 +176,7 @@ class RNUsercentricsModuleTest {
175
176
 
176
177
  val usercentricsProxy = FakeUsercentricsProxy(instanceAnswer = usercentricsSDK)
177
178
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
178
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
179
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
179
180
 
180
181
  val promise = FakePromise()
181
182
  module.restoreUserSession("abc", promise)
@@ -203,7 +204,7 @@ class RNUsercentricsModuleTest {
203
204
  }
204
205
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
205
206
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
206
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
207
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
207
208
 
208
209
  val promise = FakePromise()
209
210
  module.restoreUserSession("abc", promise)
@@ -218,7 +219,7 @@ class RNUsercentricsModuleTest {
218
219
  every { usercentricsSDK.getControllerId() }.returns("abc")
219
220
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
220
221
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
221
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
222
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
222
223
  val promise = FakePromise()
223
224
 
224
225
  module.getControllerId(promise)
@@ -233,7 +234,7 @@ class RNUsercentricsModuleTest {
233
234
  every { usercentricsSDK.getABTestingVariant() }.returns("variantA")
234
235
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
235
236
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
236
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
237
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
237
238
  val promise = FakePromise()
238
239
 
239
240
  module.getABTestingVariant(promise)
@@ -249,7 +250,7 @@ class RNUsercentricsModuleTest {
249
250
 
250
251
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
251
252
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
252
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
253
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
253
254
 
254
255
  val promise = FakePromise()
255
256
 
@@ -281,7 +282,7 @@ class RNUsercentricsModuleTest {
281
282
 
282
283
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
283
284
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
284
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
285
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
285
286
 
286
287
  val promise = FakePromise()
287
288
 
@@ -319,7 +320,7 @@ class RNUsercentricsModuleTest {
319
320
 
320
321
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
321
322
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
322
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
323
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
323
324
 
324
325
  module.setCMPId(123)
325
326
 
@@ -333,7 +334,7 @@ class RNUsercentricsModuleTest {
333
334
 
334
335
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
335
336
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
336
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
337
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
337
338
 
338
339
  module.setABTestingVariant("variantA")
339
340
 
@@ -349,7 +350,7 @@ class RNUsercentricsModuleTest {
349
350
 
350
351
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
351
352
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
352
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
353
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
353
354
  val promise = FakePromise()
354
355
 
355
356
  module.getTCFData(promise)
@@ -366,7 +367,7 @@ class RNUsercentricsModuleTest {
366
367
  every { usercentricsSDK.getUserSessionData() }.returns(GetUserSessionDataMock.fake)
367
368
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
368
369
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
369
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
370
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
370
371
  val promise = FakePromise()
371
372
 
372
373
  module.getUserSessionData(promise)
@@ -381,7 +382,7 @@ class RNUsercentricsModuleTest {
381
382
 
382
383
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
383
384
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
384
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
385
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
385
386
  val promise = FakePromise()
386
387
 
387
388
  module.getUSPData(promise)
@@ -400,7 +401,7 @@ class RNUsercentricsModuleTest {
400
401
  }
401
402
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
402
403
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
403
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
404
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
404
405
  val promise = FakePromise()
405
406
 
406
407
  module.changeLanguage("abc", promise)
@@ -427,7 +428,7 @@ class RNUsercentricsModuleTest {
427
428
 
428
429
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
429
430
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
430
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
431
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
431
432
  val promise = FakePromise()
432
433
 
433
434
  module.changeLanguage("abc", promise)
@@ -455,7 +456,7 @@ class RNUsercentricsModuleTest {
455
456
 
456
457
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
457
458
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
458
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
459
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
459
460
 
460
461
  val promise = FakePromise()
461
462
  module.acceptAllForTCF(0, 0, promise)
@@ -483,7 +484,7 @@ class RNUsercentricsModuleTest {
483
484
 
484
485
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
485
486
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
486
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
487
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
487
488
 
488
489
  val promise = FakePromise()
489
490
  module.denyAllForTCF(0, 0, promise)
@@ -510,7 +511,7 @@ class RNUsercentricsModuleTest {
510
511
 
511
512
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
512
513
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
513
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
514
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
514
515
 
515
516
  val promise = FakePromise()
516
517
  module.acceptAll(0, promise)
@@ -531,7 +532,7 @@ class RNUsercentricsModuleTest {
531
532
 
532
533
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
533
534
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
534
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
535
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
535
536
 
536
537
  val promise = FakePromise()
537
538
  module.denyAll(0, promise)
@@ -553,7 +554,7 @@ class RNUsercentricsModuleTest {
553
554
 
554
555
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
555
556
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
556
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
557
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
557
558
 
558
559
  val promise = FakePromise()
559
560
  module.saveDecisions(SaveDecisionsMock.callDecisions.serialize(), 0, promise)
@@ -577,7 +578,7 @@ class RNUsercentricsModuleTest {
577
578
 
578
579
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
579
580
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
580
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
581
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
581
582
 
582
583
  val promise = FakePromise()
583
584
  module.saveDecisionsForTCF(
@@ -604,7 +605,7 @@ class RNUsercentricsModuleTest {
604
605
 
605
606
  val usercentricsProxy = FakeUsercentricsProxy(usercentricsSDK)
606
607
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
607
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
608
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
608
609
 
609
610
  val promise = FakePromise()
610
611
  module.saveOptOutForCCPA(
@@ -622,7 +623,7 @@ class RNUsercentricsModuleTest {
622
623
  fun testResetMethod() {
623
624
  val usercentricsProxy = FakeUsercentricsProxy()
624
625
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
625
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
626
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
626
627
 
627
628
  module.reset()
628
629
 
@@ -633,7 +634,7 @@ class RNUsercentricsModuleTest {
633
634
  fun testShowFirstLayer() {
634
635
  val usercentricsProxy = FakeUsercentricsProxy()
635
636
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
636
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
637
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
637
638
  val promise = FakePromise()
638
639
  module.showFirstLayer(bannerSettingsMap.toWritableMap(), promise)
639
640
  promise.await()
@@ -644,10 +645,58 @@ class RNUsercentricsModuleTest {
644
645
  fun testShowSecondLayer() {
645
646
  val usercentricsProxy = FakeUsercentricsProxy()
646
647
  val contextMock = mockk<ReactApplicationContext>(relaxed = true)
647
- val module = RNUsercentricsModule(contextMock, usercentricsProxy)
648
+ val module = RNUsercentricsModule(contextMock, usercentricsProxy, ReactContextProviderMock())
648
649
  val promise = FakePromise()
649
650
  module.showSecondLayer(bannerSettingsMap.toWritableMap(), promise)
650
651
  promise.await()
651
652
  assertEquals(expectedBannerSettings, usercentricsProxy.showSecondLayerBannerSettings)
652
653
  }
654
+
655
+ @Test
656
+ fun testShowFirstLayerWithCustomLocalLogo() {
657
+ val context = InstrumentationRegistry.getInstrumentation().context
658
+ val reactContextProviderMock = object: ReactContextProviderMock() {
659
+
660
+ override fun context(): Context {
661
+ return context
662
+ }
663
+ }
664
+
665
+ val usercentricsProxy = FakeUsercentricsProxy()
666
+ val reactApplicationContext = mockk<ReactApplicationContext>(relaxed = true)
667
+ val module = RNUsercentricsModule(reactApplicationContext, usercentricsProxy, reactContextProviderMock)
668
+
669
+ val bannerSettingsMap = mapOf(
670
+ "variant" to null,
671
+ "firstLayerStyleSettings" to mapOf(
672
+ "layout" to "POPUP_CENTER",
673
+ ),
674
+ "secondLayerStyleSettings" to mapOf(
675
+ "showCloseButton" to true,
676
+ ),
677
+ "generalStyleSettings" to mapOf(
678
+ "logo" to mapOf(
679
+ "logoPath" to "some_local_image"
680
+ )
681
+ )
682
+ )
683
+
684
+ val promise = FakePromise()
685
+ module.showFirstLayer(bannerSettingsMap.toWritableMap(), promise)
686
+ promise.await()
687
+
688
+ val someLocalImageDrawableId = context.resources.getIdentifier("some_local_image", "drawable", context.packageName)
689
+ val expectedBannerSettings = BannerSettings(
690
+ firstLayerStyleSettings = FirstLayerStyleSettings(
691
+ layout = UsercentricsLayout.Popup(
692
+ PopupPosition.CENTER
693
+ )
694
+ ),
695
+ secondLayerStyleSettings = SecondLayerStyleSettings(showCloseButton = true),
696
+ generalStyleSettings = GeneralStyleSettings(
697
+ logo = UsercentricsImage.ImageDrawableId(someLocalImageDrawableId)
698
+ )
699
+ )
700
+ assertEquals(expectedBannerSettings, usercentricsProxy.showFirstLayerBannerSettings)
701
+ }
653
702
  }
@@ -0,0 +1,20 @@
1
+ package com.usercentrics.reactnativemodule.mock
2
+
3
+ import android.app.Activity
4
+ import android.content.Context
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+ import com.usercentrics.reactnativeusercentrics.ReactContextProvider
7
+ import io.mockk.mockk
8
+
9
+ internal open class ReactContextProviderMock : ReactContextProvider {
10
+
11
+ private val reactApplicationContext = mockk<ReactApplicationContext>(relaxed = true)
12
+
13
+ override fun context(): Context {
14
+ return reactApplicationContext
15
+ }
16
+
17
+ override fun activity(): Activity? {
18
+ return reactApplicationContext.currentActivity
19
+ }
20
+ }
@@ -8,9 +8,9 @@ import com.usercentrics.sdk.services.tcf.TCFDecisionUILayer
8
8
 
9
9
  internal class RNUsercentricsModule(
10
10
  reactContext: ReactApplicationContext,
11
- private val usercentricsProxy: UsercentricsProxy
12
- ) :
13
- ReactContextBaseJavaModule(reactContext) {
11
+ private val usercentricsProxy: UsercentricsProxy,
12
+ private val reactContextProvider: ReactContextProvider,
13
+ ) : ReactContextBaseJavaModule(reactContext) {
14
14
 
15
15
  override fun getName() = "RNUsercentricsModule"
16
16
 
@@ -33,11 +33,11 @@ internal class RNUsercentricsModule(
33
33
  fun showFirstLayer(options: ReadableMap, promise: Promise) {
34
34
  runOnUiThread {
35
35
  try {
36
- val assetManager = currentActivity!!.assets
37
-
38
- val bannerSettings = options.bannerSettingsFromMap(assetManager)
39
- usercentricsProxy.showFirstLayer(currentActivity!!, bannerSettings, promise)
36
+ val context = reactContextProvider.context()
37
+ val bannerSettings = options.bannerSettingsFromMap(context)
40
38
 
39
+ val activity = reactContextProvider.activity()!!
40
+ usercentricsProxy.showFirstLayer(activity, bannerSettings, promise)
41
41
  } catch (e: Exception) {
42
42
  promise.reject(e)
43
43
  }
@@ -48,10 +48,11 @@ internal class RNUsercentricsModule(
48
48
  fun showSecondLayer(options: ReadableMap, promise: Promise) {
49
49
  runOnUiThread {
50
50
  try {
51
- val assetManager = currentActivity!!.assets
51
+ val context = reactContextProvider.context()
52
+ val bannerSettings = options.bannerSettingsFromMap(context)
52
53
 
53
- val bannerSettings = options.bannerSettingsFromMap(assetManager)
54
- usercentricsProxy.showSecondLayer(currentActivity!!, bannerSettings, promise)
54
+ val activity = reactContextProvider.activity()!!
55
+ usercentricsProxy.showSecondLayer(activity, bannerSettings, promise)
55
56
  } catch (e: Exception) {
56
57
  promise.reject(e)
57
58
  }
@@ -127,8 +128,7 @@ internal class RNUsercentricsModule(
127
128
  fun acceptAllForTCF(fromLayer: Int, consentType: Int, promise: Promise) {
128
129
  promise.resolve(
129
130
  usercentricsProxy.instance.acceptAllForTCF(
130
- TCFDecisionUILayer.values()[fromLayer],
131
- UsercentricsConsentType.values()[consentType]
131
+ TCFDecisionUILayer.values()[fromLayer], UsercentricsConsentType.values()[consentType]
132
132
  ).toWritableArray()
133
133
  )
134
134
  }
@@ -146,8 +146,7 @@ internal class RNUsercentricsModule(
146
146
  fun denyAllForTCF(fromLayer: Int, consentType: Int, promise: Promise) {
147
147
  promise.resolve(
148
148
  usercentricsProxy.instance.denyAllForTCF(
149
- TCFDecisionUILayer.values()[fromLayer],
150
- UsercentricsConsentType.values()[consentType]
149
+ TCFDecisionUILayer.values()[fromLayer], UsercentricsConsentType.values()[consentType]
151
150
  ).toWritableArray()
152
151
  )
153
152
  }
@@ -163,11 +162,7 @@ internal class RNUsercentricsModule(
163
162
 
164
163
  @ReactMethod
165
164
  fun saveDecisionsForTCF(
166
- tcfDecisions: ReadableMap,
167
- fromLayer: Int,
168
- saveDecisions: ReadableArray,
169
- consentType: Int,
170
- promise: Promise
165
+ tcfDecisions: ReadableMap, fromLayer: Int, saveDecisions: ReadableArray, consentType: Int, promise: Promise
171
166
  ) {
172
167
  promise.resolve(
173
168
  usercentricsProxy.instance.saveDecisionsForTCF(
@@ -183,8 +178,7 @@ internal class RNUsercentricsModule(
183
178
  fun saveDecisions(decisions: ReadableArray, consentType: Int, promise: Promise) {
184
179
  promise.resolve(
185
180
  usercentricsProxy.instance.saveDecisions(
186
- decisions.deserializeUserDecision(),
187
- UsercentricsConsentType.values()[consentType]
181
+ decisions.deserializeUserDecision(), UsercentricsConsentType.values()[consentType]
188
182
  ).toWritableArray()
189
183
  )
190
184
  }
@@ -193,8 +187,7 @@ internal class RNUsercentricsModule(
193
187
  fun saveOptOutForCCPA(isOptedOut: Boolean, consentType: Int, promise: Promise) {
194
188
  promise.resolve(
195
189
  usercentricsProxy.instance.saveOptOutForCCPA(
196
- isOptedOut,
197
- UsercentricsConsentType.values()[consentType]
190
+ isOptedOut, UsercentricsConsentType.values()[consentType]
198
191
  ).toWritableArray()
199
192
  )
200
193
  }
@@ -8,15 +8,14 @@ import com.usercentrics.reactnativeusercentrics.api.UsercentricsProxyImpl
8
8
 
9
9
  class RNUsercentricsPackage : ReactPackage {
10
10
 
11
- private var usercentricsProxy = UsercentricsProxyImpl()
11
+ private val usercentricsProxy = UsercentricsProxyImpl()
12
12
 
13
- override fun createViewManagers(reactContext: ReactApplicationContext):
14
- MutableList<ViewManager<*, *>> {
13
+ override fun createViewManagers(reactContext: ReactApplicationContext): MutableList<ViewManager<*, *>> {
15
14
  return mutableListOf()
16
15
  }
17
16
 
18
- override fun createNativeModules(reactContext: ReactApplicationContext):
19
- MutableList<NativeModule> {
20
- return mutableListOf(RNUsercentricsModule(reactContext, usercentricsProxy))
17
+ override fun createNativeModules(reactContext: ReactApplicationContext): MutableList<NativeModule> {
18
+ val reactContextProvider = ReactContextProviderImpl(reactContext)
19
+ return mutableListOf(RNUsercentricsModule(reactContext, usercentricsProxy, reactContextProvider))
21
20
  }
22
21
  }
@@ -0,0 +1,10 @@
1
+ package com.usercentrics.reactnativeusercentrics
2
+
3
+ import android.app.Activity
4
+ import android.content.Context
5
+
6
+ internal interface ReactContextProvider {
7
+
8
+ fun context(): Context
9
+ fun activity(): Activity?
10
+ }
@@ -0,0 +1,18 @@
1
+ package com.usercentrics.reactnativeusercentrics
2
+
3
+ import android.app.Activity
4
+ import android.content.Context
5
+ import com.facebook.react.bridge.ReactApplicationContext
6
+
7
+ internal class ReactContextProviderImpl(
8
+ private val reactContext: ReactApplicationContext
9
+ ) : ReactContextProvider {
10
+
11
+ override fun context(): Context {
12
+ return reactContext
13
+ }
14
+
15
+ override fun activity(): Activity? {
16
+ return reactContext.currentActivity
17
+ }
18
+ }
@@ -1,26 +1,26 @@
1
1
  package com.usercentrics.reactnativeusercentrics.extensions
2
2
 
3
+ import android.content.Context
3
4
  import android.content.res.AssetManager
4
5
  import android.graphics.Typeface
5
6
  import com.facebook.react.bridge.ReadableMap
6
7
  import com.usercentrics.sdk.BannerFont
7
8
 
8
-
9
- internal fun ReadableMap.bannerFontFromMap(assetManager: AssetManager): BannerFont? {
9
+ internal fun ReadableMap.bannerFontFromMap(context: Context): BannerFont? {
10
10
  val size = getDoubleOrNull("fontSize") ?: return null
11
+ val assetManager = context.assets
12
+
11
13
  val regularTypeface = assetManager.createFontFromName(getString("regularFont")) ?: return null
12
14
  val boldTypeface = assetManager.createFontFromName(getString("boldFont")) ?: return null
13
15
 
14
- return BannerFont(
15
- regularTypeface,
16
- boldTypeface,
17
- size.toFloat()
18
- )
16
+ return BannerFont(regularFont = regularTypeface, boldFont = boldTypeface, sizeInSp = size.toFloat())
19
17
  }
20
18
 
21
19
  internal fun AssetManager.createFontFromName(fontName: String?): Typeface? {
22
- if (fontName == null) { return null }
20
+ if (fontName == null) {
21
+ return null
22
+ }
23
23
  val fontsFolder = this.list("fonts")
24
24
  val regularFontName = fontsFolder?.firstOrNull { it.startsWith(fontName) } ?: return null
25
25
  return Typeface.createFromAsset(this, "fonts/$regularFontName")
26
- }
26
+ }
@@ -1,6 +1,6 @@
1
1
  package com.usercentrics.reactnativeusercentrics.extensions
2
2
 
3
- import android.content.res.AssetManager
3
+ import android.content.Context
4
4
  import android.graphics.Color
5
5
  import androidx.annotation.ColorInt
6
6
  import com.facebook.react.bridge.ReadableMap
@@ -16,48 +16,51 @@ internal fun String.usercentricsLayoutFromEnumString(): UsercentricsLayout? {
16
16
  }
17
17
  }
18
18
 
19
- internal fun ReadableMap.bannerSettingsFromMap(assetManager: AssetManager): BannerSettings {
19
+ internal fun ReadableMap.bannerSettingsFromMap(context: Context): BannerSettings {
20
20
  val rawFirstLayerStyleSettings = getMap("firstLayerStyleSettings")
21
21
  val rawSecondLayerStyleSettings = getMap("secondLayerStyleSettings")
22
22
  val rawGeneralStyleSettings = getMap("generalStyleSettings")
23
23
 
24
24
  return BannerSettings(
25
- firstLayerStyleSettings =
26
- rawFirstLayerStyleSettings?.firstLayerStyleSettingsFromMap(assetManager),
27
- secondLayerStyleSettings =
28
- rawSecondLayerStyleSettings?.secondLayerStyleSettingsFromMap(assetManager),
29
- generalStyleSettings = rawGeneralStyleSettings?.generalStyleSettingsFromMap(assetManager),
25
+ firstLayerStyleSettings = rawFirstLayerStyleSettings?.firstLayerStyleSettingsFromMap(context),
26
+ secondLayerStyleSettings = rawSecondLayerStyleSettings?.secondLayerStyleSettingsFromMap(context),
27
+ generalStyleSettings = rawGeneralStyleSettings?.generalStyleSettingsFromMap(context),
30
28
  variantName = getString("variantName"),
31
29
  )
32
30
  }
33
31
 
34
- internal fun ReadableMap.bannerLogoFromMap(): UsercentricsImage? {
32
+ internal fun ReadableMap.bannerLogoFromMap(context: Context): UsercentricsImage? {
35
33
  val logoPath = getString("logoPath") ?: return null
34
+
35
+ val drawableResId = context.resources.getIdentifier(logoPath, "drawable", context.packageName)
36
+ if (drawableResId != 0) {
37
+ return UsercentricsImage.ImageDrawableId(drawableResId)
38
+ }
36
39
  return UsercentricsImage.ImageUrl(logoPath)
37
40
  }
38
41
 
39
- internal fun ReadableMap.firstLayerStyleSettingsFromMap(assetManager: AssetManager): FirstLayerStyleSettings {
42
+ internal fun ReadableMap.firstLayerStyleSettingsFromMap(context: Context): FirstLayerStyleSettings {
40
43
  return FirstLayerStyleSettings(
41
44
  layout = getString("layout")?.usercentricsLayoutFromEnumString(),
42
- headerImage = getMap("headerImage")?.headerImageFromMap(),
43
- title = getMap("title")?.titleFromMap(assetManager),
44
- message = getMap("message")?.messageFromMap(assetManager),
45
- buttonLayout = getMap("buttonLayout")?.buttonLayoutFromMap(assetManager),
45
+ headerImage = getMap("headerImage")?.headerImageFromMap(context),
46
+ title = getMap("title")?.titleFromMap(context),
47
+ message = getMap("message")?.messageFromMap(context),
48
+ buttonLayout = getMap("buttonLayout")?.buttonLayoutFromMap(context),
46
49
  backgroundColor = getString("backgroundColorHex")?.deserializeColor(),
47
50
  overlayColor = getString("overlayColorHex")?.deserializeColor(),
48
51
  cornerRadius = getIntOrNull("cornerRadius")
49
52
  )
50
53
  }
51
54
 
52
- internal fun ReadableMap.headerImageFromMap(): HeaderImageSettings? {
55
+ internal fun ReadableMap.headerImageFromMap(context: Context): HeaderImageSettings? {
53
56
  val isHidden = getBooleanOrNull("isHidden") ?: false
54
57
  if (isHidden) {
55
58
  return HeaderImageSettings.Hidden
56
59
  }
57
60
 
58
- val image = getMap("image")?.bannerLogoFromMap() ?: return null
59
-
61
+ val image = getMap("image")?.bannerLogoFromMap(context) ?: return null
60
62
  val isExtended = getBooleanOrNull("isExtended") ?: false
63
+
61
64
  return if (isExtended) {
62
65
  HeaderImageSettings.ExtendedLogoSettings(image)
63
66
  } else {
@@ -69,7 +72,9 @@ internal fun ReadableMap.headerImageFromMap(): HeaderImageSettings? {
69
72
  }
70
73
  }
71
74
 
72
- internal fun ReadableMap.titleFromMap(assetManager: AssetManager): TitleSettings {
75
+ internal fun ReadableMap.titleFromMap(context: Context): TitleSettings {
76
+ val assetManager = context.assets
77
+
73
78
  return TitleSettings(
74
79
  alignment = getString("alignment")?.sectionAlignmentFromMap(),
75
80
  textColor = getString("textColorHex")?.deserializeColor(),
@@ -78,7 +83,9 @@ internal fun ReadableMap.titleFromMap(assetManager: AssetManager): TitleSettings
78
83
  )
79
84
  }
80
85
 
81
- internal fun ReadableMap.messageFromMap(assetManager: AssetManager): MessageSettings {
86
+ internal fun ReadableMap.messageFromMap(context: Context): MessageSettings {
87
+ val assetManager = context.assets
88
+
82
89
  return MessageSettings(
83
90
  font = assetManager.createFontFromName(getString("fontName")),
84
91
  textSizeInSp = getDoubleOrNull("textSize")?.toFloat(),
@@ -93,19 +100,19 @@ internal fun String.sectionAlignmentFromMap(): SectionAlignment {
93
100
  return SectionAlignment.valueOf(this)
94
101
  }
95
102
 
96
- internal fun ReadableMap.buttonLayoutFromMap(
97
- assetManager: AssetManager
98
- ): ButtonLayout? {
103
+ internal fun ReadableMap.buttonLayoutFromMap(context: Context): ButtonLayout? {
99
104
  val layout = getString("layout")
105
+
100
106
  val buttons: List<List<ButtonSettings>> = getArray("buttons")?.let { buttonsArray ->
101
- val buttonsList: MutableList<List<ButtonSettings>> = mutableListOf()
107
+ val buttonsList = mutableListOf<List<ButtonSettings>>()
102
108
 
103
109
  for (rowIndex in 0 until buttonsArray.size()) {
104
110
  val listRow = mutableListOf<ButtonSettings>()
105
111
  val row = buttonsArray.getArray(rowIndex)
112
+
106
113
  for (rowElement in 0 until row.size()) {
107
114
  val element = row.getMap(rowElement)
108
- listRow.add(element.buttonSettingsFromMap(assetManager))
115
+ listRow.add(element.buttonSettingsFromMap(context))
109
116
  }
110
117
  buttonsList.add(listRow)
111
118
  }
@@ -115,28 +122,21 @@ internal fun ReadableMap.buttonLayoutFromMap(
115
122
 
116
123
  when (layout) {
117
124
  "ROW" -> {
118
- return ButtonLayout.Row(
119
- buttons.flatten()
120
- )
125
+ return ButtonLayout.Row(buttons.flatten())
121
126
  }
122
127
  "COLUMN" -> {
123
- return ButtonLayout.Column(
124
- buttons.flatten()
125
- )
128
+ return ButtonLayout.Column(buttons.flatten())
126
129
  }
127
130
  "GRID" -> {
128
- return ButtonLayout.Grid(
129
- buttons
130
- )
131
+ return ButtonLayout.Grid(buttons)
131
132
  }
132
133
  }
133
-
134
134
  return null
135
135
  }
136
136
 
137
- internal fun ReadableMap.buttonSettingsFromMap(
138
- assetManager: AssetManager
139
- ): ButtonSettings {
137
+ internal fun ReadableMap.buttonSettingsFromMap(context: Context): ButtonSettings {
138
+ val assetManager = context.assets
139
+
140
140
  return ButtonSettings(
141
141
  type = getString("buttonType")!!.deserializeButtonType(),
142
142
  isAllCaps = getBooleanOrNull("isAllCaps"),
@@ -152,15 +152,16 @@ internal fun String.deserializeButtonType(): ButtonType {
152
152
  return ButtonType.valueOf(this)
153
153
  }
154
154
 
155
- internal fun ReadableMap.secondLayerStyleSettingsFromMap(assetManager: AssetManager): SecondLayerStyleSettings {
155
+ internal fun ReadableMap.secondLayerStyleSettingsFromMap(context: Context): SecondLayerStyleSettings {
156
156
  return SecondLayerStyleSettings(
157
- buttonLayout = getMap("buttonLayout")?.buttonLayoutFromMap(assetManager),
157
+ buttonLayout = getMap("buttonLayout")?.buttonLayoutFromMap(context),
158
158
  showCloseButton = getBoolean("showCloseButton"),
159
159
  )
160
160
  }
161
161
 
162
- internal fun ReadableMap.generalStyleSettingsFromMap(assetManager: AssetManager): GeneralStyleSettings {
162
+ internal fun ReadableMap.generalStyleSettingsFromMap(context: Context): GeneralStyleSettings {
163
163
  val rawToggleStyleSettings = getMap("toggleStyleSettings")
164
+
164
165
  return GeneralStyleSettings(
165
166
  textColor = getString("textColorHex")?.deserializeColor(),
166
167
  layerBackgroundColor = getString("layerBackgroundColorHex")?.deserializeColor(),
@@ -169,8 +170,8 @@ internal fun ReadableMap.generalStyleSettingsFromMap(assetManager: AssetManager)
169
170
  tabColor = getString("tabColorHex")?.deserializeColor(),
170
171
  bordersColor = getString("bordersColorHex")?.deserializeColor(),
171
172
  toggleStyleSettings = rawToggleStyleSettings?.toggleStyleSettingsFromMap(),
172
- font = getMap("font")?.bannerFontFromMap(assetManager),
173
- logo = getMap("logo")?.bannerLogoFromMap(),
173
+ font = getMap("font")?.bannerFontFromMap(context = context),
174
+ logo = getMap("logo")?.bannerLogoFromMap(context = context),
174
175
  links = getString("links")?.legalLinksFromEnumString(),
175
176
  disableSystemBackButton = getBooleanOrNull("disableSystemBackButton")
176
177
  )
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@usercentrics/react-native-sdk",
3
- "version": "2.7.10",
3
+ "version": "2.7.13",
4
4
  "description": "Usercentrics SDK",
5
5
  "homepage": "https://usercentrics.com",
6
6
  "main": "lib/index.js",
7
7
  "types": "lib/index.d.ts",
8
8
  "author": "Usercentrics <developer@usercentrics.com>",
9
9
  "iosPackageName": "react-native-usercentrics",
10
- "iosPackageVersion": "2.7.10",
10
+ "iosPackageVersion": "2.7.13",
11
11
  "license": "SEE LICENSE IN LICENSE",
12
12
  "files": [
13
13
  "android",
@@ -77,8 +77,5 @@
77
77
  },
78
78
  "bugs": {
79
79
  "url": "https://github.com/Usercentrics/react-native-sdk/issues"
80
- },
81
- "dependencies": {
82
- "@usercentrics/react-native-sdk": "^2.7.8"
83
80
  }
84
81
  }
@@ -1,5 +0,0 @@
1
- distributionBase=GRADLE_USER_HOME
2
- distributionPath=wrapper/dists
3
- distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
4
- zipStoreBase=GRADLE_USER_HOME
5
- zipStorePath=wrapper/dists