package com.adversport.rnaps
/*
* Copyright (c) 2022-present Adversport & Contributors
*
* This file is part of react-native-aps.
*
* react-native-aps is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, version 3 of the License.
*
* react-native-aps is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Foobar. If not, see .
*/
import android.util.SparseArray
import com.amazon.device.ads.*
import com.facebook.react.bridge.*
import com.facebook.react.module.annotations.ReactModule
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter
@ReactModule(name = RNAPSAdLoaderModule.MODULE_NAME)
class RNAPSAdLoaderModule(private val reactContext: ReactApplicationContext) :
ReactContextBaseJavaModule(reactContext) {
override fun getName() = MODULE_NAME
private fun sendEvent(eventName: String, params: WritableMap?) {
reactContext
.getJSModule(RCTDeviceEventEmitter::class.java)
.emit(eventName, params)
}
@ReactMethod
fun addListener(eventName: String) {
}
@ReactMethod
fun removeListeners(count: Int) {
}
private inner class AdCallback(private val loaderId: Int, private var promise: Promise?) : DTBAdCallback {
override fun onFailure(adError: AdError) {
val code = when (adError.code ?: AdError.ErrorCode.NO_ERROR) {
AdError.ErrorCode.NO_ERROR -> "no_error"
AdError.ErrorCode.NETWORK_ERROR -> "network_error"
AdError.ErrorCode.NETWORK_TIMEOUT -> "network_timeout"
AdError.ErrorCode.NO_FILL -> "no_fill"
AdError.ErrorCode.INTERNAL_ERROR -> "internal_error"
AdError.ErrorCode.REQUEST_ERROR -> "request_error"
}
val userInfoMap = Arguments.createMap()
userInfoMap.putString("code", code)
userInfoMap.putString("message", adError.message)
val payload = Arguments.createMap()
payload.putInt("loaderId", loaderId)
payload.putMap("userInfo", userInfoMap.copy())
sendEvent(EVENT_FAILURE, payload)
promise?.reject(code, adError.message, userInfoMap)
promise = null
}
override fun onSuccess(response: DTBAdResponse) {
val responseMap = Arguments.createMap()
response.defaultDisplayAdsRequestCustomParams.forEach {
responseMap.putString(it.key, it.value.joinToString(postfix = ","))
}
val payload = Arguments.createMap()
payload.putInt("loaderId", loaderId)
payload.putMap("response", responseMap.copy())
sendEvent(EVENT_SUCCESS, payload)
promise?.resolve(responseMap)
promise = null
}
}
@ReactMethod
fun loadAd(loaderId: Int, adType: String, options: ReadableMap, promise: Promise) {
stopAutoRefresh(loaderId)
val adLoader = DTBAdRequest()
val slotUUID = options.getString("slotUUID")!!
val size = options.getString("size")
val adSize = when (adType) {
AD_TYPE_BANNER -> {
size!!.split("x").let {
DTBAdSize(it[0].toInt(), it[1].toInt(), slotUUID)
}
}
AD_TYPE_INTERSTITIAL -> DTBAdSize.DTBInterstitialAdSize(slotUUID)
else -> return
}
adLoader.setSizes(adSize)
options.getMap("customTargeting")?.let {
for ((key, value) in it.toHashMap()) {
adLoader.putCustomTarget(key, value as String)
}
}
val autoRefresh = options.hasKey("autoRefresh").let {
if (it) {
options.getBoolean("autoRefresh")
} else {
false
}
}
val refreshInterval = options.hasKey("refreshInterval").let {
if (it) {
options.getInt("refreshInterval")
} else {
60
}
}
if (autoRefresh) {
adLoader.setAutoRefresh(refreshInterval)
adLoaders.put(loaderId, adLoader)
}
adLoader.loadAd(AdCallback(loaderId, promise))
}
@ReactMethod
fun stopAutoRefresh(loaderId: Int) {
adLoaders.get(loaderId)?.stop()
adLoaders.remove(loaderId)
}
companion object {
const val MODULE_NAME = "RNAPSAdLoaderModule"
const val AD_TYPE_BANNER = "banner"
const val AD_TYPE_INTERSTITIAL = "interstitial"
const val EVENT_SUCCESS = "onSuccess"
const val EVENT_FAILURE = "onFailure"
val adLoaders = SparseArray()
}
}