@bigcrunch/react-native-ads 0.1.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.
- package/README.md +417 -0
- package/android/build.gradle +70 -0
- package/android/settings.gradle +6 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/java/com/bigcrunch/ads/react/BigCrunchAdsModule.kt +653 -0
- package/android/src/main/java/com/bigcrunch/ads/react/BigCrunchAdsPackage.kt +20 -0
- package/android/src/main/java/com/bigcrunch/ads/react/BigCrunchBannerViewManager.kt +296 -0
- package/ios/BigCrunchAdsModule.swift +588 -0
- package/ios/BigCrunchBannerViewManager.swift +270 -0
- package/ios/react-native-bigcrunch-ads-Bridging-Header.h +8 -0
- package/lib/BigCrunchAds.d.ts +168 -0
- package/lib/BigCrunchAds.d.ts.map +1 -0
- package/lib/BigCrunchAds.js +241 -0
- package/lib/BigCrunchBannerView.d.ts +21 -0
- package/lib/BigCrunchBannerView.d.ts.map +1 -0
- package/lib/BigCrunchBannerView.js +176 -0
- package/lib/BigCrunchInterstitial.d.ts +66 -0
- package/lib/BigCrunchInterstitial.d.ts.map +1 -0
- package/lib/BigCrunchInterstitial.js +222 -0
- package/lib/BigCrunchRewarded.d.ts +85 -0
- package/lib/BigCrunchRewarded.d.ts.map +1 -0
- package/lib/BigCrunchRewarded.js +257 -0
- package/lib/NativeBigCrunchAds.d.ts +71 -0
- package/lib/NativeBigCrunchAds.d.ts.map +1 -0
- package/lib/NativeBigCrunchAds.js +54 -0
- package/lib/index.d.ts +28 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +32 -0
- package/lib/types/ads.d.ts +101 -0
- package/lib/types/ads.d.ts.map +1 -0
- package/lib/types/ads.js +4 -0
- package/lib/types/config.d.ts +137 -0
- package/lib/types/config.d.ts.map +1 -0
- package/lib/types/config.js +4 -0
- package/lib/types/events.d.ts +306 -0
- package/lib/types/events.d.ts.map +1 -0
- package/lib/types/events.js +4 -0
- package/lib/types/index.d.ts +175 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/index.js +23 -0
- package/package.json +88 -0
- package/react-native-bigcrunch-ads.podspec +27 -0
- package/src/BigCrunchAds.ts +298 -0
- package/src/BigCrunchBannerView.tsx +262 -0
- package/src/BigCrunchInterstitial.ts +266 -0
- package/src/BigCrunchRewarded.ts +307 -0
- package/src/NativeBigCrunchAds.ts +120 -0
- package/src/index.ts +71 -0
- package/src/types/ads.ts +112 -0
- package/src/types/config.ts +145 -0
- package/src/types/events.ts +337 -0
- package/src/types/index.ts +193 -0
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
package com.bigcrunch.ads.react
|
|
2
|
+
|
|
3
|
+
import android.view.View
|
|
4
|
+
import com.facebook.react.bridge.*
|
|
5
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
6
|
+
import com.facebook.react.uimanager.SimpleViewManager
|
|
7
|
+
import com.facebook.react.uimanager.ThemedReactContext
|
|
8
|
+
import com.facebook.react.uimanager.annotations.ReactProp
|
|
9
|
+
import com.bigcrunch.ads.BigCrunchAds
|
|
10
|
+
import com.bigcrunch.ads.BigCrunchBannerView
|
|
11
|
+
import com.bigcrunch.ads.listeners.BannerAdListener
|
|
12
|
+
import com.bigcrunch.ads.models.AdSize
|
|
13
|
+
import kotlinx.coroutines.*
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* View manager for BigCrunchBannerView React Native component
|
|
17
|
+
*/
|
|
18
|
+
class BigCrunchBannerViewManager : SimpleViewManager<BigCrunchBannerView>() {
|
|
19
|
+
|
|
20
|
+
companion object {
|
|
21
|
+
const val REACT_CLASS = "BigCrunchBannerView"
|
|
22
|
+
|
|
23
|
+
// Commands
|
|
24
|
+
const val COMMAND_LOAD_AD = 1
|
|
25
|
+
const val COMMAND_PAUSE_AD = 2
|
|
26
|
+
const val COMMAND_RESUME_AD = 3
|
|
27
|
+
const val COMMAND_DESTROY = 4
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
override fun getName(): String = REACT_CLASS
|
|
31
|
+
|
|
32
|
+
override fun createViewInstance(reactContext: ThemedReactContext): BigCrunchBannerView {
|
|
33
|
+
android.util.Log.d("BigCrunchBannerViewManager", """
|
|
34
|
+
=== CREATING VIEW INSTANCE ===
|
|
35
|
+
React Context: $reactContext
|
|
36
|
+
Activity: ${reactContext.currentActivity}
|
|
37
|
+
==============================
|
|
38
|
+
""".trimIndent())
|
|
39
|
+
|
|
40
|
+
val view = BigCrunchBannerView(reactContext)
|
|
41
|
+
// Set default layout params to ensure view is visible
|
|
42
|
+
view.layoutParams = android.widget.FrameLayout.LayoutParams(
|
|
43
|
+
android.widget.FrameLayout.LayoutParams.MATCH_PARENT,
|
|
44
|
+
android.widget.FrameLayout.LayoutParams.WRAP_CONTENT
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
android.util.Log.d("BigCrunchBannerViewManager", """
|
|
48
|
+
=== VIEW CREATED ===
|
|
49
|
+
View: $view
|
|
50
|
+
Layout params: ${view.layoutParams?.width}x${view.layoutParams?.height}
|
|
51
|
+
====================
|
|
52
|
+
""".trimIndent())
|
|
53
|
+
|
|
54
|
+
return view
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
private val autoLoadMap = mutableMapOf<BigCrunchBannerView, Boolean>()
|
|
58
|
+
|
|
59
|
+
@ReactProp(name = "placementId")
|
|
60
|
+
fun setPlacementId(view: BigCrunchBannerView, placementId: String) {
|
|
61
|
+
view.setPlacementId(placementId)
|
|
62
|
+
|
|
63
|
+
// Check if autoLoad was set to true before placementId
|
|
64
|
+
if (autoLoadMap[view] == true) {
|
|
65
|
+
view.loadAd()
|
|
66
|
+
autoLoadMap.remove(view)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@ReactProp(name = "size")
|
|
71
|
+
fun setSize(view: BigCrunchBannerView, size: String) {
|
|
72
|
+
android.util.Log.d("BigCrunchBannerViewManager", """
|
|
73
|
+
=== SET SIZE CALLED ===
|
|
74
|
+
Size string: $size
|
|
75
|
+
Current view dimensions: ${view.width}x${view.height}
|
|
76
|
+
Current minimums: ${view.minimumWidth}x${view.minimumHeight}
|
|
77
|
+
=======================
|
|
78
|
+
""".trimIndent())
|
|
79
|
+
|
|
80
|
+
val adSize = when (size) {
|
|
81
|
+
"BANNER" -> AdSize(320, 50)
|
|
82
|
+
"LARGE_BANNER" -> AdSize(320, 100)
|
|
83
|
+
"MEDIUM_RECTANGLE" -> AdSize(300, 250)
|
|
84
|
+
"FULL_BANNER" -> AdSize(468, 60)
|
|
85
|
+
"LEADERBOARD" -> AdSize(728, 90)
|
|
86
|
+
"ADAPTIVE" -> AdSize(320, 50) // Default for now
|
|
87
|
+
"SMART" -> AdSize(320, 50) // Default banner size
|
|
88
|
+
else -> AdSize(320, 50)
|
|
89
|
+
}
|
|
90
|
+
view.setAdSize(adSize)
|
|
91
|
+
|
|
92
|
+
// Set minimum height based on ad size to ensure visibility
|
|
93
|
+
val density = view.resources.displayMetrics.density
|
|
94
|
+
val minHeightPx = (adSize.height * density).toInt()
|
|
95
|
+
val minWidthPx = (adSize.width * density).toInt()
|
|
96
|
+
view.minimumHeight = minHeightPx
|
|
97
|
+
view.minimumWidth = minWidthPx
|
|
98
|
+
|
|
99
|
+
android.util.Log.d("BigCrunchBannerViewManager", """
|
|
100
|
+
=== SIZE SET ===
|
|
101
|
+
Ad size: ${adSize.width}x${adSize.height} dp
|
|
102
|
+
Density: $density
|
|
103
|
+
Minimum pixels: ${minWidthPx}x${minHeightPx}
|
|
104
|
+
View parent: ${view.parent?.javaClass?.simpleName}
|
|
105
|
+
================
|
|
106
|
+
""".trimIndent())
|
|
107
|
+
|
|
108
|
+
// Request layout to apply the new dimensions
|
|
109
|
+
view.requestLayout()
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
@ReactProp(name = "customWidth")
|
|
113
|
+
fun setCustomWidth(view: BigCrunchBannerView, width: Int?) {
|
|
114
|
+
width?.let {
|
|
115
|
+
val currentHeight = view.getAdSize()?.height ?: 50
|
|
116
|
+
view.setAdSize(AdSize(it, currentHeight))
|
|
117
|
+
|
|
118
|
+
// Apply minimum width in pixels
|
|
119
|
+
val density = view.resources.displayMetrics.density
|
|
120
|
+
val minWidthPx = (it * density).toInt()
|
|
121
|
+
view.minimumWidth = minWidthPx
|
|
122
|
+
view.requestLayout()
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
@ReactProp(name = "customHeight")
|
|
127
|
+
fun setCustomHeight(view: BigCrunchBannerView, height: Int?) {
|
|
128
|
+
height?.let {
|
|
129
|
+
val currentWidth = view.getAdSize()?.width ?: 320
|
|
130
|
+
view.setAdSize(AdSize(currentWidth, it))
|
|
131
|
+
|
|
132
|
+
// Apply minimum height in pixels
|
|
133
|
+
val density = view.resources.displayMetrics.density
|
|
134
|
+
val minHeightPx = (it * density).toInt()
|
|
135
|
+
view.minimumHeight = minHeightPx
|
|
136
|
+
view.requestLayout()
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
@ReactProp(name = "autoLoad")
|
|
141
|
+
fun setAutoLoad(view: BigCrunchBannerView, autoLoad: Boolean) {
|
|
142
|
+
android.util.Log.d("BigCrunchBannerViewManager", """
|
|
143
|
+
=== SET AUTO LOAD ===
|
|
144
|
+
AutoLoad: $autoLoad
|
|
145
|
+
PlacementId: ${view.getPlacementId()}
|
|
146
|
+
View dimensions: ${view.width}x${view.height}
|
|
147
|
+
View parent: ${view.parent?.javaClass?.simpleName}
|
|
148
|
+
=====================
|
|
149
|
+
""".trimIndent())
|
|
150
|
+
|
|
151
|
+
if (autoLoad) {
|
|
152
|
+
// Check if placementId is already set
|
|
153
|
+
if (view.getPlacementId() != null) {
|
|
154
|
+
android.util.Log.d("BigCrunchBannerViewManager", "AutoLoad triggered immediately - placementId already set")
|
|
155
|
+
|
|
156
|
+
// Add debug about view state before loading
|
|
157
|
+
view.post {
|
|
158
|
+
android.util.Log.d("BigCrunchBannerViewManager", """
|
|
159
|
+
=== BEFORE LOAD AD (autoLoad) ===
|
|
160
|
+
View dimensions: ${view.width}x${view.height}
|
|
161
|
+
Measured dimensions: ${view.measuredWidth}x${view.measuredHeight}
|
|
162
|
+
Minimum dimensions: ${view.minimumWidth}x${view.minimumHeight}
|
|
163
|
+
Parent: ${view.parent?.javaClass?.simpleName}
|
|
164
|
+
Parent dimensions: ${(view.parent as? android.view.View)?.let { "${it.width}x${it.height}" }}
|
|
165
|
+
==================================
|
|
166
|
+
""".trimIndent())
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
view.loadAd()
|
|
170
|
+
} else {
|
|
171
|
+
// Store for later when placementId is set
|
|
172
|
+
android.util.Log.d("BigCrunchBannerViewManager", "AutoLoad deferred - waiting for placementId")
|
|
173
|
+
autoLoadMap[view] = true
|
|
174
|
+
}
|
|
175
|
+
} else {
|
|
176
|
+
autoLoadMap.remove(view)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
@ReactProp(name = "refreshInterval")
|
|
181
|
+
fun setRefreshInterval(view: BigCrunchBannerView, interval: Int) {
|
|
182
|
+
view.setRefreshInterval(interval)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
@ReactProp(name = "customTargeting")
|
|
186
|
+
fun setCustomTargeting(view: BigCrunchBannerView, customTargeting: ReadableMap?) {
|
|
187
|
+
customTargeting?.let {
|
|
188
|
+
val targeting = mutableMapOf<String, String>()
|
|
189
|
+
val iterator = it.keySetIterator()
|
|
190
|
+
while (iterator.hasNextKey()) {
|
|
191
|
+
val key = iterator.nextKey()
|
|
192
|
+
it.getString(key)?.let { value ->
|
|
193
|
+
targeting[key] = value
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
view.setCustomTargeting(targeting)
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
@ReactProp(name = "viewId")
|
|
201
|
+
fun setViewId(view: BigCrunchBannerView, viewId: String) {
|
|
202
|
+
view.tag = viewId
|
|
203
|
+
setupEventListeners(view, viewId)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
override fun getCommandsMap(): Map<String, Int> {
|
|
207
|
+
return mapOf(
|
|
208
|
+
"loadAd" to COMMAND_LOAD_AD,
|
|
209
|
+
"pauseAd" to COMMAND_PAUSE_AD,
|
|
210
|
+
"resumeAd" to COMMAND_RESUME_AD,
|
|
211
|
+
"destroy" to COMMAND_DESTROY
|
|
212
|
+
)
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
override fun receiveCommand(root: BigCrunchBannerView, commandId: Int, args: ReadableArray?) {
|
|
216
|
+
when (commandId) {
|
|
217
|
+
COMMAND_LOAD_AD -> root.loadAd()
|
|
218
|
+
COMMAND_PAUSE_AD -> root.pause()
|
|
219
|
+
COMMAND_RESUME_AD -> root.resume()
|
|
220
|
+
COMMAND_DESTROY -> root.destroy()
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
override fun onDropViewInstance(view: BigCrunchBannerView) {
|
|
225
|
+
super.onDropViewInstance(view)
|
|
226
|
+
autoLoadMap.remove(view)
|
|
227
|
+
view.destroy()
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
private fun setupEventListeners(view: BigCrunchBannerView, viewId: String) {
|
|
231
|
+
val reactContext = view.context as ThemedReactContext
|
|
232
|
+
|
|
233
|
+
view.setBannerAdListener(object : BannerAdListener {
|
|
234
|
+
override fun onAdLoaded() {
|
|
235
|
+
sendEvent(reactContext, "BigCrunchBannerAdLoaded", Arguments.createMap().apply {
|
|
236
|
+
putString("viewId", viewId)
|
|
237
|
+
putString("placementId", view.getPlacementId())
|
|
238
|
+
})
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
override fun onAdFailedToLoad(errorCode: String, errorMessage: String) {
|
|
242
|
+
sendEvent(reactContext, "BigCrunchBannerAdFailedToLoad", Arguments.createMap().apply {
|
|
243
|
+
putString("viewId", viewId)
|
|
244
|
+
putString("placementId", view.getPlacementId())
|
|
245
|
+
putString("errorCode", errorCode)
|
|
246
|
+
putString("errorMessage", errorMessage)
|
|
247
|
+
})
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
override fun onAdImpression() {
|
|
251
|
+
sendEvent(reactContext, "BigCrunchBannerAdImpression", Arguments.createMap().apply {
|
|
252
|
+
putString("viewId", viewId)
|
|
253
|
+
putString("placementId", view.getPlacementId())
|
|
254
|
+
})
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
override fun onAdClicked() {
|
|
258
|
+
sendEvent(reactContext, "BigCrunchBannerAdClicked", Arguments.createMap().apply {
|
|
259
|
+
putString("viewId", viewId)
|
|
260
|
+
putString("placementId", view.getPlacementId())
|
|
261
|
+
})
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
override fun onAdOpened() {
|
|
265
|
+
sendEvent(reactContext, "BigCrunchBannerAdOpened", Arguments.createMap().apply {
|
|
266
|
+
putString("viewId", viewId)
|
|
267
|
+
putString("placementId", view.getPlacementId())
|
|
268
|
+
})
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
override fun onAdClosed() {
|
|
272
|
+
sendEvent(reactContext, "BigCrunchBannerAdClosed", Arguments.createMap().apply {
|
|
273
|
+
putString("viewId", viewId)
|
|
274
|
+
putString("placementId", view.getPlacementId())
|
|
275
|
+
})
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
override fun onAdRevenue(valueMicros: Long, currencyCode: String, adUnitId: String?, precision: String?) {
|
|
279
|
+
sendEvent(reactContext, "BigCrunchBannerAdRevenue", Arguments.createMap().apply {
|
|
280
|
+
putString("viewId", viewId)
|
|
281
|
+
putString("placementId", view.getPlacementId())
|
|
282
|
+
putDouble("valueMicros", valueMicros.toDouble())
|
|
283
|
+
putString("currencyCode", currencyCode)
|
|
284
|
+
adUnitId?.let { putString("adUnitId", it) }
|
|
285
|
+
precision?.let { putString("precision", it) }
|
|
286
|
+
})
|
|
287
|
+
}
|
|
288
|
+
})
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
private fun sendEvent(reactContext: ReactContext, eventName: String, params: WritableMap) {
|
|
292
|
+
reactContext
|
|
293
|
+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
294
|
+
.emit(eventName, params)
|
|
295
|
+
}
|
|
296
|
+
}
|