@bigcrunch/react-native-ads 0.3.1 → 0.5.0

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 (64) hide show
  1. package/README.md +5 -5
  2. package/android/bigcrunch-ads/com/bigcrunch/ads/BigCrunchAds.kt +434 -0
  3. package/android/bigcrunch-ads/com/bigcrunch/ads/BigCrunchBannerView.kt +484 -0
  4. package/android/bigcrunch-ads/com/bigcrunch/ads/BigCrunchInterstitial.kt +403 -0
  5. package/android/bigcrunch-ads/com/bigcrunch/ads/BigCrunchRewarded.kt +409 -0
  6. package/android/bigcrunch-ads/com/bigcrunch/ads/adapters/GoogleAdsAdapter.kt +592 -0
  7. package/android/bigcrunch-ads/com/bigcrunch/ads/core/AdOrchestrator.kt +623 -0
  8. package/android/bigcrunch-ads/com/bigcrunch/ads/core/AnalyticsClient.kt +719 -0
  9. package/android/bigcrunch-ads/com/bigcrunch/ads/core/BidRequestClient.kt +364 -0
  10. package/android/bigcrunch-ads/com/bigcrunch/ads/core/ConfigManager.kt +301 -0
  11. package/android/bigcrunch-ads/com/bigcrunch/ads/core/DeviceContext.kt +385 -0
  12. package/android/bigcrunch-ads/com/bigcrunch/ads/core/RewardedCallback.kt +42 -0
  13. package/android/bigcrunch-ads/com/bigcrunch/ads/core/SessionManager.kt +330 -0
  14. package/android/bigcrunch-ads/com/bigcrunch/ads/internal/DeviceHelper.kt +60 -0
  15. package/android/bigcrunch-ads/com/bigcrunch/ads/internal/HttpClient.kt +114 -0
  16. package/android/bigcrunch-ads/com/bigcrunch/ads/internal/Logger.kt +71 -0
  17. package/android/bigcrunch-ads/com/bigcrunch/ads/internal/PrivacyStore.kt +125 -0
  18. package/android/bigcrunch-ads/com/bigcrunch/ads/internal/Storage.kt +88 -0
  19. package/android/bigcrunch-ads/com/bigcrunch/ads/listeners/BannerAdListener.kt +55 -0
  20. package/android/bigcrunch-ads/com/bigcrunch/ads/listeners/InterstitialAdListener.kt +55 -0
  21. package/android/bigcrunch-ads/com/bigcrunch/ads/listeners/RewardedAdListener.kt +58 -0
  22. package/android/bigcrunch-ads/com/bigcrunch/ads/models/AdEvent.kt +880 -0
  23. package/android/bigcrunch-ads/com/bigcrunch/ads/models/AppConfig.kt +90 -0
  24. package/android/bigcrunch-ads/com/bigcrunch/ads/models/DeviceData.kt +18 -0
  25. package/android/bigcrunch-ads/com/bigcrunch/ads/models/PlacementConfig.kt +70 -0
  26. package/android/bigcrunch-ads/com/bigcrunch/ads/models/SessionInfo.kt +21 -0
  27. package/android/build.gradle +22 -10
  28. package/android/settings.gradle +2 -6
  29. package/android/src/main/java/com/bigcrunch/ads/react/BigCrunchAdsModule.kt +0 -23
  30. package/ios/BigCrunchAds/Sources/Adapters/GoogleAdsAdapter.swift +512 -0
  31. package/ios/BigCrunchAds/Sources/BigCrunchAds.swift +387 -0
  32. package/ios/BigCrunchAds/Sources/BigCrunchBannerView.swift +448 -0
  33. package/ios/BigCrunchAds/Sources/BigCrunchInterstitial.swift +412 -0
  34. package/ios/BigCrunchAds/Sources/BigCrunchRewarded.swift +523 -0
  35. package/ios/BigCrunchAds/Sources/Core/AdOrchestrator.swift +514 -0
  36. package/ios/BigCrunchAds/Sources/Core/AnalyticsClient.swift +874 -0
  37. package/ios/BigCrunchAds/Sources/Core/BidRequestClient.swift +344 -0
  38. package/ios/BigCrunchAds/Sources/Core/ConfigManager.swift +306 -0
  39. package/ios/BigCrunchAds/Sources/Core/DeviceContext.swift +284 -0
  40. package/ios/BigCrunchAds/Sources/Core/SessionManager.swift +392 -0
  41. package/ios/BigCrunchAds/Sources/Internal/HTTPClient.swift +146 -0
  42. package/ios/BigCrunchAds/Sources/Internal/Logger.swift +62 -0
  43. package/ios/BigCrunchAds/Sources/Internal/PrivacyStore.swift +129 -0
  44. package/ios/BigCrunchAds/Sources/Internal/Storage.swift +73 -0
  45. package/ios/BigCrunchAds/Sources/Models/AdEvent.swift +784 -0
  46. package/ios/BigCrunchAds/Sources/Models/AppConfig.swift +100 -0
  47. package/ios/BigCrunchAds/Sources/Models/DeviceData.swift +68 -0
  48. package/ios/BigCrunchAds/Sources/Models/PlacementConfig.swift +137 -0
  49. package/ios/BigCrunchAds/Sources/Models/SessionInfo.swift +48 -0
  50. package/ios/BigCrunchAdsModule.swift +5 -14
  51. package/ios/BigCrunchBannerViewManager.swift +0 -1
  52. package/lib/index.d.ts +1 -1
  53. package/lib/index.d.ts.map +1 -1
  54. package/lib/index.js +3 -2
  55. package/lib/types/config.d.ts +22 -9
  56. package/lib/types/config.d.ts.map +1 -1
  57. package/lib/types/events.d.ts +4 -4
  58. package/lib/types/events.d.ts.map +1 -1
  59. package/package.json +11 -4
  60. package/react-native-bigcrunch-ads.podspec +1 -3
  61. package/scripts/inject-version.js +55 -0
  62. package/src/index.ts +3 -2
  63. package/src/types/config.ts +23 -9
  64. package/src/types/events.ts +4 -4
@@ -0,0 +1,409 @@
1
+ package com.bigcrunch.ads
2
+
3
+ import android.app.Activity
4
+ import android.content.Context
5
+ import com.bigcrunch.ads.adapters.GoogleAdsAdapter
6
+ import com.bigcrunch.ads.core.AdOrchestrator
7
+ import com.bigcrunch.ads.core.RewardedCallback
8
+ import com.bigcrunch.ads.internal.BCLogger
9
+ import com.bigcrunch.ads.listeners.RewardedAdListener
10
+
11
+ /**
12
+ * BigCrunch Rewarded Ads - Static API for rewarded video ads
13
+ *
14
+ * Rewarded ads are full-screen video ads that reward users for watching.
15
+ * Users have the option to watch the ad in exchange for in-app rewards.
16
+ *
17
+ * Usage:
18
+ * ```kotlin
19
+ * // 1. Preload the ad
20
+ * BigCrunchRewarded.preload(
21
+ * context = applicationContext,
22
+ * placementId = "daily_reward",
23
+ * callback = object : BigCrunchRewarded.PreloadCallback {
24
+ * override fun onAdLoaded() { /* ad ready to show */ }
25
+ * override fun onAdFailedToLoad(error: String) { /* handle error */ }
26
+ * }
27
+ * )
28
+ *
29
+ * // 2. Check if ready
30
+ * if (BigCrunchRewarded.isReady("daily_reward")) {
31
+ * // Ad is ready to show
32
+ * }
33
+ *
34
+ * // 3. Show when user requests
35
+ * BigCrunchRewarded.show(
36
+ * activity = this,
37
+ * placementId = "daily_reward",
38
+ * callback = object : BigCrunchRewarded.ShowCallback {
39
+ * override fun onUserEarnedReward(type: String, amount: Int) {
40
+ * // Give user their reward
41
+ * }
42
+ * override fun onAdDismissed() { /* ad closed */ }
43
+ * override fun onAdFailedToShow(error: String) { /* handle error */ }
44
+ * }
45
+ * )
46
+ * ```
47
+ */
48
+ object BigCrunchRewarded {
49
+
50
+ private val TAG = "BigCrunchRewarded"
51
+ private var adOrchestrator: AdOrchestrator? = null
52
+ private val orchestratorLock = Any()
53
+
54
+ // Listeners for React Native compatibility
55
+ private val listeners = mutableMapOf<String, RewardedAdListener>()
56
+
57
+ /**
58
+ * Callback interface for preloading rewarded ads
59
+ */
60
+ interface PreloadCallback {
61
+ /**
62
+ * Called when the ad has been successfully loaded and is ready to show
63
+ */
64
+ fun onAdLoaded()
65
+
66
+ /**
67
+ * Called when the ad fails to load
68
+ * @param error Description of what went wrong
69
+ */
70
+ fun onAdFailedToLoad(error: String)
71
+ }
72
+
73
+ /**
74
+ * Callback interface for showing rewarded ads
75
+ */
76
+ interface ShowCallback {
77
+ /**
78
+ * Called when the user has earned a reward by watching the ad
79
+ * @param type The type of reward (e.g., "coins", "points")
80
+ * @param amount The amount of reward earned
81
+ */
82
+ fun onUserEarnedReward(type: String, amount: Int)
83
+
84
+ /**
85
+ * Called when the ad is dismissed (whether reward was earned or not)
86
+ */
87
+ fun onAdDismissed()
88
+
89
+ /**
90
+ * Called when the ad was shown successfully
91
+ */
92
+ fun onAdShowed() {}
93
+
94
+ /**
95
+ * Called when the user clicks on the ad
96
+ */
97
+ fun onAdClicked() {}
98
+
99
+ /**
100
+ * Called when the ad fails to show
101
+ * @param error Description of what went wrong
102
+ */
103
+ fun onAdFailedToShow(error: String)
104
+ }
105
+
106
+ /**
107
+ * Combined callback interface (for compatibility)
108
+ */
109
+ interface Callback : PreloadCallback, ShowCallback
110
+
111
+ /**
112
+ * Preload a rewarded ad with callback
113
+ *
114
+ * @param context Application or Activity context
115
+ * @param placementId The placement ID from BigCrunch dashboard
116
+ * @param callback Callback for load events
117
+ */
118
+ fun preload(
119
+ context: Context,
120
+ placementId: String,
121
+ callback: PreloadCallback? = null
122
+ ) {
123
+ BCLogger.d(TAG, "Preloading rewarded ad: $placementId")
124
+
125
+ try {
126
+ BigCrunchAds.requireInitialized()
127
+ } catch (e: IllegalStateException) {
128
+ BCLogger.e(TAG, "SDK not initialized", e)
129
+ callback?.onAdFailedToLoad("SDK not initialized")
130
+ return
131
+ }
132
+
133
+ val orchestrator = getOrCreateOrchestrator(context)
134
+
135
+ // Create internal callback
136
+ val rewardedCallback = object : RewardedCallback {
137
+ override fun onAdLoaded() {
138
+ BCLogger.d(TAG, "Rewarded ad loaded: $placementId")
139
+ callback?.onAdLoaded()
140
+ listeners[placementId]?.onAdLoaded()
141
+ }
142
+
143
+ override fun onAdFailedToLoad(error: String) {
144
+ BCLogger.w(TAG, "Rewarded ad failed to load: $placementId - $error")
145
+ callback?.onAdFailedToLoad(error)
146
+ listeners[placementId]?.onAdFailedToLoad("LOAD_ERROR", error)
147
+ }
148
+
149
+ override fun onAdShowed() {
150
+ BCLogger.d(TAG, "Rewarded ad showed: $placementId")
151
+ listeners[placementId]?.onAdShowed()
152
+ }
153
+
154
+ override fun onAdDismissed() {
155
+ BCLogger.d(TAG, "Rewarded ad dismissed: $placementId")
156
+ listeners[placementId]?.onAdDismissed()
157
+ }
158
+
159
+ override fun onAdClicked() {
160
+ BCLogger.d(TAG, "Rewarded ad clicked: $placementId")
161
+ listeners[placementId]?.onAdClicked()
162
+ }
163
+
164
+ override fun onUserEarnedReward(type: String, amount: Int) {
165
+ BCLogger.d(TAG, "User earned reward: $type x$amount for $placementId")
166
+ listeners[placementId]?.onUserEarnedReward(type, amount)
167
+ }
168
+ }
169
+
170
+ // Load through AdOrchestrator
171
+ orchestrator.preloadRewardedAd(placementId, rewardedCallback)
172
+ }
173
+
174
+ /**
175
+ * Preload a rewarded ad without callback
176
+ *
177
+ * @param placementId The placement ID from BigCrunch dashboard
178
+ */
179
+ fun preload(placementId: String) {
180
+ // Need context from somewhere - could get from last show() call
181
+ BCLogger.w(TAG, "Preload called without context - not implemented")
182
+ }
183
+
184
+ /**
185
+ * Load a rewarded ad with custom targeting
186
+ *
187
+ * @param placementId The placement ID for the ad
188
+ * @param customTargeting Optional custom targeting parameters
189
+ */
190
+ fun load(placementId: String, customTargeting: Map<String, String>? = null) {
191
+ BCLogger.d(TAG, "Loading rewarded ad: $placementId")
192
+ if (customTargeting != null) {
193
+ BCLogger.d(TAG, "Custom targeting requested: ${customTargeting.size} parameters")
194
+ }
195
+ // Need context - could store from initialization
196
+ preload(placementId)
197
+ }
198
+
199
+ /**
200
+ * Show a preloaded rewarded ad
201
+ *
202
+ * @param activity The activity to show the ad in
203
+ * @param placementId The placement ID
204
+ * @param callback Callback for ad events
205
+ * @return true if the ad was shown, false if not ready
206
+ */
207
+ fun show(
208
+ activity: Activity,
209
+ placementId: String,
210
+ callback: ShowCallback? = null
211
+ ): Boolean {
212
+ BCLogger.d(TAG, "Attempting to show rewarded ad: $placementId")
213
+
214
+ try {
215
+ BigCrunchAds.requireInitialized()
216
+ } catch (e: IllegalStateException) {
217
+ BCLogger.e(TAG, "SDK not initialized", e)
218
+ callback?.onAdFailedToShow("SDK not initialized")
219
+ listeners[placementId]?.onAdFailedToLoad("SDK_NOT_INITIALIZED", "SDK not initialized")
220
+ return false
221
+ }
222
+
223
+ if (!isReady(placementId)) {
224
+ val error = "Rewarded ad not ready: $placementId"
225
+ BCLogger.w(TAG, error)
226
+ callback?.onAdFailedToShow(error)
227
+ listeners[placementId]?.onAdFailedToLoad("NOT_READY", error)
228
+ return false
229
+ }
230
+
231
+ val orchestrator = getOrCreateOrchestrator(activity)
232
+
233
+ // Create internal callback
234
+ val rewardedCallback = object : RewardedCallback {
235
+ override fun onAdLoaded() {
236
+ // Not used during show
237
+ }
238
+
239
+ override fun onAdFailedToLoad(error: String) {
240
+ BCLogger.w(TAG, "Rewarded ad failed to show: $placementId - $error")
241
+ callback?.onAdFailedToShow(error)
242
+ listeners[placementId]?.onAdFailedToLoad("SHOW_ERROR", error)
243
+ }
244
+
245
+ override fun onAdShowed() {
246
+ BCLogger.d(TAG, "Rewarded ad showed: $placementId")
247
+ callback?.onAdShowed()
248
+ listeners[placementId]?.onAdShowed()
249
+ }
250
+
251
+ override fun onAdDismissed() {
252
+ BCLogger.d(TAG, "Rewarded ad dismissed: $placementId")
253
+ callback?.onAdDismissed()
254
+ listeners[placementId]?.onAdDismissed()
255
+ }
256
+
257
+ override fun onAdClicked() {
258
+ BCLogger.d(TAG, "Rewarded ad clicked: $placementId")
259
+ callback?.onAdClicked()
260
+ listeners[placementId]?.onAdClicked()
261
+ }
262
+
263
+ override fun onUserEarnedReward(type: String, amount: Int) {
264
+ BCLogger.d(TAG, "User earned reward: $type x$amount for $placementId")
265
+ callback?.onUserEarnedReward(type, amount)
266
+ listeners[placementId]?.onUserEarnedReward(type, amount)
267
+ }
268
+ }
269
+
270
+ return orchestrator.showRewardedAd(activity, placementId, rewardedCallback)
271
+ }
272
+
273
+ /**
274
+ * Show a preloaded rewarded ad with listener
275
+ *
276
+ * @param activity The activity to show the ad in
277
+ * @param placementId The placement ID
278
+ * @param listener Listener for ad events
279
+ * @return true if the ad was shown, false if not ready
280
+ */
281
+ fun show(
282
+ activity: Activity,
283
+ placementId: String,
284
+ listener: RewardedAdListener? = null
285
+ ): Boolean {
286
+ if (listener != null) {
287
+ listeners[placementId] = listener
288
+ }
289
+
290
+ // Convert listener to callback
291
+ val callback = if (listener != null) {
292
+ object : ShowCallback {
293
+ override fun onUserEarnedReward(type: String, amount: Int) {
294
+ listener.onUserEarnedReward(type, amount)
295
+ }
296
+ override fun onAdDismissed() {
297
+ listener.onAdDismissed()
298
+ }
299
+ override fun onAdShowed() {
300
+ listener.onAdShowed()
301
+ }
302
+ override fun onAdClicked() {
303
+ listener.onAdClicked()
304
+ }
305
+ override fun onAdFailedToShow(error: String) {
306
+ listener.onAdFailedToLoad("SHOW_ERROR", error)
307
+ }
308
+ }
309
+ } else null
310
+
311
+ return show(activity, placementId, callback)
312
+ }
313
+
314
+ /**
315
+ * Check if a rewarded ad is ready to show
316
+ *
317
+ * @param placementId The placement ID
318
+ * @return true if ad is loaded and ready
319
+ */
320
+ fun isReady(placementId: String): Boolean {
321
+ return synchronized(orchestratorLock) {
322
+ adOrchestrator?.isRewardedReady(placementId) ?: false
323
+ }
324
+ }
325
+
326
+ /**
327
+ * Check if a rewarded ad is loaded (alias for isReady)
328
+ *
329
+ * @param placementId The placement ID
330
+ * @return true if ad is loaded and ready
331
+ */
332
+ fun isLoaded(placementId: String): Boolean = isReady(placementId)
333
+
334
+ /**
335
+ * Destroy a specific rewarded ad
336
+ *
337
+ * @param placementId The placement ID to destroy
338
+ */
339
+ fun destroy(placementId: String) {
340
+ BCLogger.d(TAG, "Destroying rewarded ad: $placementId")
341
+ synchronized(orchestratorLock) {
342
+ adOrchestrator?.destroyRewardedAd(placementId)
343
+ listeners.remove(placementId)
344
+ }
345
+ }
346
+
347
+ /**
348
+ * Destroy all cached rewarded ads
349
+ */
350
+ fun destroyAll() {
351
+ BCLogger.d(TAG, "Destroying all rewarded ads")
352
+ synchronized(orchestratorLock) {
353
+ adOrchestrator?.clearCache()
354
+ listeners.clear()
355
+ }
356
+ }
357
+
358
+ /**
359
+ * Clear all cached rewarded ads
360
+ */
361
+ fun clearCache() {
362
+ destroyAll()
363
+ }
364
+
365
+ /**
366
+ * Set a listener for a placement
367
+ *
368
+ * @param placementId The placement ID
369
+ * @param listener The listener for events
370
+ */
371
+ fun setListener(placementId: String, listener: RewardedAdListener?) {
372
+ if (listener != null) {
373
+ listeners[placementId] = listener
374
+ } else {
375
+ listeners.remove(placementId)
376
+ }
377
+ }
378
+
379
+ private fun getOrCreateOrchestrator(context: Context?): AdOrchestrator {
380
+ synchronized(orchestratorLock) {
381
+ if (adOrchestrator == null) {
382
+ val ctx = context?.applicationContext
383
+ ?: throw IllegalStateException("Context required to create AdOrchestrator")
384
+
385
+ val configManager = BigCrunchAds.getConfigManager()
386
+ val analyticsClient = BigCrunchAds.getAnalyticsClient()
387
+ val googleAdsAdapter = GoogleAdsAdapter(ctx, analyticsClient)
388
+
389
+ val bidRequestClient = BigCrunchAds.bidRequestClient ?: com.bigcrunch.ads.core.BidRequestClient(
390
+ httpClient = com.bigcrunch.ads.internal.HttpClient(),
391
+ configManager = configManager,
392
+ privacyStore = BigCrunchAds.privacyStore,
393
+ s2sConfig = com.bigcrunch.ads.models.S2SConfig(enabled = false, serverUrl = "", timeoutMs = 0)
394
+ )
395
+
396
+ adOrchestrator = AdOrchestrator(
397
+ ctx,
398
+ configManager,
399
+ analyticsClient,
400
+ bidRequestClient,
401
+ googleAdsAdapter
402
+ )
403
+
404
+ BCLogger.d(TAG, "Created new AdOrchestrator for rewarded ads")
405
+ }
406
+ return adOrchestrator!!
407
+ }
408
+ }
409
+ }