diff --git a/app/build.gradle b/app/build.gradle index bc14ecc..1d8f6cb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ android { compileSdkVersion 31 defaultConfig { - applicationId = "com.black.years.camera" + applicationId = "com.espoir.easyadvapp" minSdkVersion 21 targetSdkVersion 31 versionCode 1 @@ -35,5 +35,5 @@ dependencies { implementation "com.pangle.cn:mediation-sdk:5.7.0.5" implementation "com.pangle.cn:mediation-ks-adapter:3.3.44.1"//ks adapter implementation "com.pangle.cn:mediation-gdt-adapter:4.530.1400.1" //gdt adapter - implementation project(":easyadv") +// implementation project(":easyadv") } \ No newline at end of file diff --git a/app/src/main/java/com/espoir/easyadvapp/MainActivity.kt b/app/src/main/java/com/espoir/easyadvapp/MainActivity.kt index 2cdb918..3aeca70 100644 --- a/app/src/main/java/com/espoir/easyadvapp/MainActivity.kt +++ b/app/src/main/java/com/espoir/easyadvapp/MainActivity.kt @@ -1,11 +1,35 @@ package com.espoir.easyadvapp import android.os.Bundle +import android.widget.FrameLayout import androidx.appcompat.app.AppCompatActivity class MainActivity : AppCompatActivity() { + + private var container: FrameLayout? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + container = findViewById(R.id.container) +// +// //显示插屏广告 +// EasyAdv.fullVideoConfig() +// .setCodeId("KFC_V_WO_50") +// .setActivity(this) +// .showFullScreenVideoAdv() +// +// //banner广告 +// EasyAdv.bannerConfig() +// .setCodeId("KFC_V_WO_50") +// .setActivity(this) +// .showBannerAdv() +// +// //信息流广告 +// EasyAdv.feedConfig() +// .setCodeId("KFC_V_WO_50") +// .setActivity(this) +// .setContainer(container) +// .showFeedAdv() } } diff --git a/app/src/main/java/com/espoir/easyadvapp/MyApp.kt b/app/src/main/java/com/espoir/easyadvapp/MyApp.kt index 06dab2c..aba451d 100644 --- a/app/src/main/java/com/espoir/easyadvapp/MyApp.kt +++ b/app/src/main/java/com/espoir/easyadvapp/MyApp.kt @@ -1,30 +1,26 @@ package com.espoir.easyadvapp import android.app.Application -import com.espoir.easyadv.EasyAdv -import com.espoir.easyadvapp.ad.TTAdSdkPlatform -import com.espoir.easyadvapp.ad.TTHotSplashAdvStrategy -import com.espoir.easyadvapp.ad.TTSplashAdvEngine class MyApp : Application() { override fun onCreate() { super.onCreate() - EasyAdv.init(this) - .sdkConfig { - context = this@MyApp - appId = "5421722" - appName = "EasyAdvApp" - userId = "123456" - debug = true - } - .setGlobalAdvConfig { - enableHotSplashAdv = true - hotSplashAdvStrategy = TTHotSplashAdvStrategy() - } - .setPlatform(TTAdSdkPlatform()) - .setSplashAdvEngine(TTSplashAdvEngine()) - .apply() +// EasyAdv.init(this) +// .sdkConfig { +// context = this@MyApp +// appId = "5421722" +// appName = "EasyAdvApp" +// userId = "123456" +// debug = true +// } +// .setGlobalAdvConfig { +// enableHotSplashAdv = true +// hotSplashAdvStrategy = TTHotSplashAdvStrategy() +// } +// .setPlatform(TTAdSdkPlatform()) +// .setSplashAdvEngine(TTSplashAdvEngine()) +// .apply() } } \ No newline at end of file diff --git a/app/src/main/java/com/espoir/easyadvapp/SplashActivity.kt b/app/src/main/java/com/espoir/easyadvapp/SplashActivity.kt index f0a0324..b5312e0 100644 --- a/app/src/main/java/com/espoir/easyadvapp/SplashActivity.kt +++ b/app/src/main/java/com/espoir/easyadvapp/SplashActivity.kt @@ -2,17 +2,9 @@ package com.espoir.easyadvapp import android.content.Intent import android.os.Bundle -import android.widget.FrameLayout import android.widget.ImageView import androidx.appcompat.app.AppCompatActivity -import androidx.lifecycle.lifecycleScope -import com.espoir.easyadv.EasyAdv -import com.espoir.easyadv.setSplashAdvListener import com.espoir.glidedslib.loadImage -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.delay -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext class SplashActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { @@ -21,31 +13,26 @@ class SplashActivity : AppCompatActivity() { findViewById(R.id.bgView).loadImage("https://img-blog.csdnimg.cn/3731d157c66a4ab681f78580456f4b4f.png") - lifecycleScope.launch(Dispatchers.IO) { - delay(3000) - withContext(Dispatchers.Main) { - initSplashAdv() - } - } + initSplashAdv() } private fun initSplashAdv() { - EasyAdv.splashConfig() - .setCodeId("KFC_V_WO_50") - .setActivity(this) - .setWidth(getScreenWidth()) - .setHeight(getScreenHeight()) - .setContainer(findViewById(R.id.adLayout)) - .setSplashAdvListener(onError = { _, _ -> - toMain() - }, onAdClicked = { _, _ -> - toMain() - }, onAdSkip = { - toMain() - }, onAdTimeOver = { - toMain() - }) - .showSplashAdv() +// EasyAdv.splashConfig() +// .setCodeId("KFC_V_WO_50") +// .setActivity(this) +// .setWidth(getScreenWidth()) +// .setHeight(getScreenHeight()) +// .setContainer(findViewById(R.id.adLayout)) +// .setSplashAdvListener(onError = { _, _ -> +// toMain() +// }, onAdClicked = { _, _ -> +// toMain() +// }, onAdSkip = { +// toMain() +// }, onAdTimeOver = { + toMain() +// }) +// .showSplashAdv() } private fun toMain() { diff --git a/app/src/main/java/com/espoir/easyadvapp/ad/TTAdSdkPlatform.kt b/app/src/main/java/com/espoir/easyadvapp/ad/TTAdSdkPlatform.kt index a1f4a09..5b5fd64 100644 --- a/app/src/main/java/com/espoir/easyadvapp/ad/TTAdSdkPlatform.kt +++ b/app/src/main/java/com/espoir/easyadvapp/ad/TTAdSdkPlatform.kt @@ -1,45 +1,36 @@ package com.espoir.easyadvapp.ad -import com.bytedance.sdk.openadsdk.TTAdConfig -import com.bytedance.sdk.openadsdk.TTAdConstant -import com.bytedance.sdk.openadsdk.TTAdSdk -import com.bytedance.sdk.openadsdk.mediation.init.MediationConfig -import com.bytedance.sdk.openadsdk.mediation.init.MediationConfigUserInfoForSegment -import com.espoir.easyadv.AdvSDKBuilder -import com.espoir.easyadv.AdvSdkInitCallback -import com.espoir.easyadv.ISdkPlatform - -class TTAdSdkPlatform : ISdkPlatform { - override fun initAdvSdk(builder: AdvSDKBuilder, callback: AdvSdkInitCallback) { - TTAdSdk.init( - builder.context, TTAdConfig.Builder() - .appId(builder.appId) - .useTextureView(true) - .appName(builder.appName) - .supportMultiProcess(true) - .titleBarTheme(TTAdConstant.TITLE_BAR_THEME_NO_TITLE_BAR) - .allowShowNotify(false) - .useMediation(true) - .setMediationConfig( - MediationConfig.Builder() - .setMediationConfigUserInfoForSegment( - object : MediationConfigUserInfoForSegment() { - override fun getUserId(): String { - return builder.userId.orEmpty() - } - }).build() - ) - .debug(builder.debug) - .build() - ) - TTAdSdk.start(object : TTAdSdk.Callback { - override fun success() { - callback.onInitSuccess() - } - - override fun fail(code: Int, msg: String?) { - callback.onInitFail(code, msg) - } - }) - } -} \ No newline at end of file +//class TTAdSdkPlatform : ISdkPlatform { +// override fun initAdvSdk(builder: AdvSDKBuilder, callback: AdvSdkInitCallback) { +// TTAdSdk.init( +// builder.context, TTAdConfig.Builder() +// .appId(builder.appId) +// .useTextureView(true) +// .appName(builder.appName) +// .supportMultiProcess(true) +// .titleBarTheme(TTAdConstant.TITLE_BAR_THEME_NO_TITLE_BAR) +// .allowShowNotify(false) +// .useMediation(true) +// .setMediationConfig( +// MediationConfig.Builder() +// .setMediationConfigUserInfoForSegment( +// object : MediationConfigUserInfoForSegment() { +// override fun getUserId(): String { +// return builder.userId.orEmpty() +// } +// }).build() +// ) +// .debug(builder.debug) +// .build() +// ) +// TTAdSdk.start(object : TTAdSdk.Callback { +// override fun success() { +// callback.onInitSuccess() +// } +// +// override fun fail(code: Int, msg: String?) { +// callback.onInitFail(code, msg) +// } +// }) +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/espoir/easyadvapp/ad/TTBannerAdvEngine.kt b/app/src/main/java/com/espoir/easyadvapp/ad/TTBannerAdvEngine.kt index ff9c55d..af9cd6c 100644 --- a/app/src/main/java/com/espoir/easyadvapp/ad/TTBannerAdvEngine.kt +++ b/app/src/main/java/com/espoir/easyadvapp/ad/TTBannerAdvEngine.kt @@ -1,78 +1,65 @@ package com.espoir.easyadvapp.ad -import android.view.View -import androidx.core.view.isVisible -import com.bytedance.sdk.openadsdk.AdSlot -import com.bytedance.sdk.openadsdk.TTAdDislike -import com.bytedance.sdk.openadsdk.TTAdNative -import com.bytedance.sdk.openadsdk.TTAdSdk -import com.bytedance.sdk.openadsdk.TTNativeExpressAd -import com.espoir.easyadv.CallbackType -import com.espoir.easyadv.EasyAdv -import com.espoir.easyadv.IBannerAdvEngine -import com.espoir.easyadv.config.BannerAdvConfig -import com.espoir.easyadv.config.listener - -class TTBannerAdvEngine : IBannerAdvEngine { - override fun showBannerAdv(config: BannerAdvConfig) { - if (config.activity == null) { - config.listener(CallbackType.ERROR, EasyAdv.ERROR_ACT, "activity is null") - return - } - if (config.codeId.isEmpty()) { - config.listener(CallbackType.ERROR, EasyAdv.ERROR_PARAM, "codeId is null") - return - } - val act = config.activity?.get() ?: return - val adNativeLoader = TTAdSdk.getAdManager().createAdNative(act) - val adSlot = AdSlot.Builder() - .setAdCount(config.adCount) - .setCodeId(config.codeId) - .setImageAcceptedSize(config.width, config.height) // 单位px - .build() - adNativeLoader.loadBannerExpressAd(adSlot, object : TTAdNative.NativeExpressAdListener { - override fun onError(code: Int, msg: String?) { - config.listener(CallbackType.ERROR, code, msg) - } - - override fun onNativeExpressAdLoad(list: MutableList?) { - config.listener(CallbackType.AD_LOAD, config.codeId, list?.getOrNull(0)) - list?.getOrNull(0)?.let { - showBannerAdImpl(config, it) - } - } - }) - } - - private fun showBannerAdImpl(config: BannerAdvConfig, bannerAd: TTNativeExpressAd?) { - bannerAd?.setExpressInteractionListener(object : TTNativeExpressAd.ExpressAdInteractionListener { - override fun onAdClicked(view: View?, i: Int) { - config.listener(CallbackType.AD_CLICK, config.codeId, bannerAd) - } - - override fun onAdShow(view: View?, i: Int) { - config.listener(CallbackType.AD_SHOW, config.codeId, bannerAd) - } - - override fun onRenderFail(view: View?, s: String, i: Int) { - } - - override fun onRenderSuccess(view: View?, v: Float, v1: Float) { - } - }) - bannerAd?.setDislikeCallback(config.activity?.get(), object : TTAdDislike.DislikeInteractionCallback { - override fun onShow() { - } - - override fun onSelected(i: Int, s: String, b: Boolean) { - } - - override fun onCancel() {} - }) - config.container?.let { - it.isVisible = true - it.removeAllViews() - it.addView(bannerAd?.expressAdView) - } - } -} \ No newline at end of file +//class TTBannerAdvEngine : IBannerAdvEngine { +// override fun showBannerAdv(config: BannerAdvConfig) { +// if (config.activity == null) { +// config.listener(CallbackType.ERROR, EasyAdv.ERROR_ACT, "activity is null") +// return +// } +// if (config.codeId.isEmpty()) { +// config.listener(CallbackType.ERROR, EasyAdv.ERROR_PARAM, "codeId is null") +// return +// } +// val act = config.activity?.get() ?: return +// val adNativeLoader = TTAdSdk.getAdManager().createAdNative(act) +// val adSlot = AdSlot.Builder() +// .setAdCount(config.adCount) +// .setCodeId(config.codeId) +// .setImageAcceptedSize(config.width, config.height) // 单位px +// .build() +// adNativeLoader.loadBannerExpressAd(adSlot, object : TTAdNative.NativeExpressAdListener { +// override fun onError(code: Int, msg: String?) { +// config.listener(CallbackType.ERROR, code, msg) +// } +// +// override fun onNativeExpressAdLoad(list: MutableList?) { +// config.listener(CallbackType.AD_LOAD, config.codeId, list?.getOrNull(0)) +// list?.getOrNull(0)?.let { +// showBannerAdImpl(config, it) +// } +// } +// }) +// } +// +// private fun showBannerAdImpl(config: BannerAdvConfig, bannerAd: TTNativeExpressAd?) { +// bannerAd?.setExpressInteractionListener(object : TTNativeExpressAd.ExpressAdInteractionListener { +// override fun onAdClicked(view: View?, i: Int) { +// config.listener(CallbackType.AD_CLICK, config.codeId, bannerAd) +// } +// +// override fun onAdShow(view: View?, i: Int) { +// config.listener(CallbackType.AD_SHOW, config.codeId, bannerAd) +// } +// +// override fun onRenderFail(view: View?, s: String, i: Int) { +// } +// +// override fun onRenderSuccess(view: View?, v: Float, v1: Float) { +// } +// }) +// bannerAd?.setDislikeCallback(config.activity?.get(), object : TTAdDislike.DislikeInteractionCallback { +// override fun onShow() { +// } +// +// override fun onSelected(i: Int, s: String, b: Boolean) { +// } +// +// override fun onCancel() {} +// }) +// config.container?.let { +// it.isVisible = true +// it.removeAllViews() +// it.addView(bannerAd?.expressAdView) +// } +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/espoir/easyadvapp/ad/TTFeedAdvStrategy.kt b/app/src/main/java/com/espoir/easyadvapp/ad/TTFeedAdvStrategy.kt new file mode 100644 index 0000000..5cfe08f --- /dev/null +++ b/app/src/main/java/com/espoir/easyadvapp/ad/TTFeedAdvStrategy.kt @@ -0,0 +1,77 @@ +package com.espoir.easyadvapp.ad + +//class TTFeedAdvStrategy : IFeedAdvEngine { +// override fun showFeedAdv(config: FeedAdConfig) { +// if (config.activity == null) { +// config.listener(CallbackType.ERROR, EasyAdv.ERROR_ACT, "activity is null") +// return +// } +// if (config.codeId.isEmpty()) { +// config.listener(CallbackType.ERROR, EasyAdv.ERROR_PARAM, "codeId is null") +// return +// } +// val act = config.activity?.get() ?: return +// val adNativeLoader = TTAdSdk.getAdManager().createAdNative(act) +// val adSlot = AdSlot.Builder() +// .setCodeId(config.codeId) +// .setImageAcceptedSize(config.width, config.height) // 单位px +// .setAdCount(config.adCount) +// .setUserID(config.userId) +// .build() +// adNativeLoader.loadFeedAd(adSlot, object : TTAdNative.FeedAdListener { +// override fun onError(code: Int, msg: String?) { +// config.listener(CallbackType.ERROR, code, msg) +// } +// +// override fun onFeedAdLoad(list: MutableList?) { +// config.listener(CallbackType.AD_LOAD, config.codeId, list) +// list?.getOrNull(0)?.let { +// showFeedAdImpl(config, act, it) +// } +// } +// }) +// } +// +// private fun showFeedAdImpl(config: FeedAdConfig, act: Activity, feedAd: TTFeedAd) { +// feedAd.setDislikeCallback(act, object : TTAdDislike.DislikeInteractionCallback { +// override fun onShow() { +// } +// +// override fun onSelected(p0: Int, p1: String?, p2: Boolean) { +// config.container?.removeAllViews() +// config.container?.visibility = View.GONE +// } +// +// override fun onCancel() { +// } +// }) +// feedAd.mediationManager?.let { +// if (it.isExpress) { +// feedAd.setExpressRenderListener(object : MediationExpressRenderListener { +// override fun onRenderSuccess(p0: View?, p1: Float, p2: Float, p3: Boolean) { +// feedAd.adView?.let { view -> +// if (view.parent != null) { +// (view.parent as ViewGroup).removeView(view) +// } +// config.container?.visibility = View.VISIBLE +// config.container?.removeAllViews() +// config.container?.addView(view) +// } +// } +// +// override fun onRenderFail(p0: View?, p1: String?, p2: Int) { +// } +// +// override fun onAdClick() { +// config.listener(CallbackType.AD_CLICK, config.codeId, feedAd.mediationManager.showEcpm) +// } +// +// override fun onAdShow() { +// config.listener(CallbackType.AD_SHOW, config.codeId, feedAd.mediationManager.showEcpm) +// } +// }) +// feedAd.render() +// } +// } +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/espoir/easyadvapp/ad/TTFullScreenVideoAdvEngine.kt b/app/src/main/java/com/espoir/easyadvapp/ad/TTFullScreenVideoAdvEngine.kt index ea221e3..665c140 100644 --- a/app/src/main/java/com/espoir/easyadvapp/ad/TTFullScreenVideoAdvEngine.kt +++ b/app/src/main/java/com/espoir/easyadvapp/ad/TTFullScreenVideoAdvEngine.kt @@ -1,94 +1,82 @@ package com.espoir.easyadvapp.ad -import com.bytedance.sdk.openadsdk.AdSlot -import com.bytedance.sdk.openadsdk.TTAdConstant -import com.bytedance.sdk.openadsdk.TTAdNative -import com.bytedance.sdk.openadsdk.TTAdSdk -import com.bytedance.sdk.openadsdk.TTFullScreenVideoAd -import com.bytedance.sdk.openadsdk.mediation.ad.MediationAdSlot -import com.espoir.easyadv.CallbackType -import com.espoir.easyadv.EasyAdv -import com.espoir.easyadv.IFullScreenVideoAdvEngine -import com.espoir.easyadv.config.FullScreenVideoAdvConfig -import com.espoir.easyadv.config.listener - -class TTFullScreenVideoAdvEngine : IFullScreenVideoAdvEngine { - override fun showFullScreenVideoAdv(config: FullScreenVideoAdvConfig) { - if (config.activity == null) { - config.listener(CallbackType.ERROR, EasyAdv.ERROR_ACT, "activity is null") - return - } - if (config.codeId.isEmpty()) { - config.listener(CallbackType.ERROR, EasyAdv.ERROR_PARAM, "codeId is null") - return - } - val act = config.activity?.get() ?: return - val adNativeLoader = TTAdSdk.getAdManager().createAdNative(act) - val adslot = AdSlot.Builder() - .setCodeId(config.codeId) - .setAdCount(config.adCount)//请求的广告数 - .setUserID(config.userId) - .setMediationAdSlot( - MediationAdSlot.Builder().setMuted(true).setVolume(0.7f) - .build() - ) - .setOrientation(TTAdConstant.ORIENTATION_VERTICAL) //设置横竖屏方向 - .build() - adNativeLoader.loadFullScreenVideoAd(adslot, object : TTAdNative.FullScreenVideoAdListener { - override fun onError(code: Int, message: String) { - config.listener(CallbackType.ERROR, code, message) - } - - override fun onFullScreenVideoAdLoad(ad: TTFullScreenVideoAd) { - config.listener(CallbackType.AD_LOAD, ad) - showFullScreenVideoAdImpl(config, ad) - } - - override fun onFullScreenVideoCached() { - } - - override fun onFullScreenVideoCached(ad: TTFullScreenVideoAd) { - config.listener(CallbackType.AD_CACHE, ad) - showFullScreenVideoAdImpl(config, ad) - } - }) - } - - private var fullScreenStartTime: Long = 0 - - private fun showFullScreenVideoAdImpl(config: FullScreenVideoAdvConfig, ad: TTFullScreenVideoAd?) { - ad?.setFullScreenVideoAdInteractionListener(object : - TTFullScreenVideoAd.FullScreenVideoAdInteractionListener { - override fun onAdShow() { - fullScreenStartTime = System.currentTimeMillis() - config.listener(CallbackType.AD_SHOW, config.codeId, ad) - } - - override fun onAdVideoBarClick() { - config.listener(CallbackType.AD_CLICK, config.codeId, ad) - } - - override fun onAdClose() { - config.listener(CallbackType.AD_CLOSE) - } - - override fun onVideoComplete() { - if (fullScreenStartTime > 0) { - val time = System.currentTimeMillis() - fullScreenStartTime - config.listener(CallbackType.VIDEO_COMPLETE, config.codeId, time, true, ad) - fullScreenStartTime = 0 - } - } - - override fun onSkippedVideo() { - config.listener(CallbackType.AD_SKIP, config.codeId, ad) - if (fullScreenStartTime > 0) { - val time = System.currentTimeMillis() - fullScreenStartTime - config.listener(CallbackType.VIDEO_COMPLETE, config.codeId, time, false, ad) - fullScreenStartTime = 0 - } - } - }) - ad?.showFullScreenVideoAd(config.activity?.get()) - } -} \ No newline at end of file +//class TTFullScreenVideoAdvEngine : IFullScreenVideoAdvEngine { +// override fun showFullScreenVideoAdv(config: FullScreenVideoAdvConfig) { +// if (config.activity == null) { +// config.listener(CallbackType.ERROR, EasyAdv.ERROR_ACT, "activity is null") +// return +// } +// if (config.codeId.isEmpty()) { +// config.listener(CallbackType.ERROR, EasyAdv.ERROR_PARAM, "codeId is null") +// return +// } +// val act = config.activity?.get() ?: return +// val adNativeLoader = TTAdSdk.getAdManager().createAdNative(act) +// val adslot = AdSlot.Builder() +// .setCodeId(config.codeId) +// .setAdCount(config.adCount)//请求的广告数 +// .setUserID(config.userId) +// .setMediationAdSlot( +// MediationAdSlot.Builder().setMuted(true).setVolume(0.7f) +// .build() +// ) +// .setOrientation(TTAdConstant.ORIENTATION_VERTICAL) //设置横竖屏方向 +// .build() +// adNativeLoader.loadFullScreenVideoAd(adslot, object : TTAdNative.FullScreenVideoAdListener { +// override fun onError(code: Int, message: String) { +// config.listener(CallbackType.ERROR, code, message) +// } +// +// override fun onFullScreenVideoAdLoad(ad: TTFullScreenVideoAd) { +// config.listener(CallbackType.AD_LOAD, ad) +// showFullScreenVideoAdImpl(config, ad) +// } +// +// override fun onFullScreenVideoCached() { +// } +// +// override fun onFullScreenVideoCached(ad: TTFullScreenVideoAd) { +// config.listener(CallbackType.AD_CACHE, ad) +// showFullScreenVideoAdImpl(config, ad) +// } +// }) +// } +// +// private var fullScreenStartTime: Long = 0 +// +// private fun showFullScreenVideoAdImpl(config: FullScreenVideoAdvConfig, ad: TTFullScreenVideoAd?) { +// ad?.setFullScreenVideoAdInteractionListener(object : +// TTFullScreenVideoAd.FullScreenVideoAdInteractionListener { +// override fun onAdShow() { +// fullScreenStartTime = System.currentTimeMillis() +// config.listener(CallbackType.AD_SHOW, config.codeId, ad) +// } +// +// override fun onAdVideoBarClick() { +// config.listener(CallbackType.AD_CLICK, config.codeId, ad) +// } +// +// override fun onAdClose() { +// config.listener(CallbackType.AD_CLOSE) +// } +// +// override fun onVideoComplete() { +// if (fullScreenStartTime > 0) { +// val time = System.currentTimeMillis() - fullScreenStartTime +// config.listener(CallbackType.VIDEO_COMPLETE, config.codeId, time, true, ad) +// fullScreenStartTime = 0 +// } +// } +// +// override fun onSkippedVideo() { +// config.listener(CallbackType.AD_SKIP, config.codeId, ad) +// if (fullScreenStartTime > 0) { +// val time = System.currentTimeMillis() - fullScreenStartTime +// config.listener(CallbackType.VIDEO_COMPLETE, config.codeId, time, false, ad) +// fullScreenStartTime = 0 +// } +// } +// }) +// ad?.showFullScreenVideoAd(config.activity?.get()) +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/espoir/easyadvapp/ad/TTHotSplashAdvStrategy.kt b/app/src/main/java/com/espoir/easyadvapp/ad/TTHotSplashAdvStrategy.kt index 417f842..a109042 100644 --- a/app/src/main/java/com/espoir/easyadvapp/ad/TTHotSplashAdvStrategy.kt +++ b/app/src/main/java/com/espoir/easyadvapp/ad/TTHotSplashAdvStrategy.kt @@ -1,45 +1,37 @@ package com.espoir.easyadvapp.ad -import android.app.Activity -import com.espoir.easyadv.EasyAdv -import com.espoir.easyadv.IHotSplashAdvStrategy -import com.espoir.easyadv.setSplashAdvListener -import com.espoir.easyadvapp.SplashActivity -import com.espoir.easyadvapp.getScreenHeight -import com.espoir.easyadvapp.getScreenWidth - -class TTHotSplashAdvStrategy : IHotSplashAdvStrategy { - - private var lastShowTime = 0L - private var ttHotSplashAdvDialog: TTHotSplashAdvDialog? = null - - override fun getCodeId(): String = "KFC_V_WO_50" - - override fun showRequirement(activity: Activity): Boolean { - return activity !is SplashActivity - && System.currentTimeMillis() - lastShowTime > 60 * 60 * 1000 - } - - override fun showHotSplashAdv(activity: Activity, codeId: String) { - lastShowTime = System.currentTimeMillis() - ttHotSplashAdvDialog = TTHotSplashAdvDialog(activity, onShow = { container -> - EasyAdv.splashConfig() - .setCodeId(codeId) - .setActivity(activity) - .setWidth(activity.getScreenWidth()) - .setHeight(activity.getScreenHeight()) - .setContainer(container) - .setSplashAdvListener(onError = { _, _ -> - ttHotSplashAdvDialog?.dismiss() - }, onAdClicked = { _, _ -> - ttHotSplashAdvDialog?.dismiss() - }, onAdSkip = { - ttHotSplashAdvDialog?.dismiss() - }, onAdTimeOver = { - ttHotSplashAdvDialog?.dismiss() - }) - .showSplashAdv() - }, onDismiss = {}) - ttHotSplashAdvDialog?.show() - } -} \ No newline at end of file +//class TTHotSplashAdvStrategy : IHotSplashAdvStrategy { +// +// private var lastShowTime = 0L +// private var ttHotSplashAdvDialog: TTHotSplashAdvDialog? = null +// +// override fun getCodeId(): String = "KFC_V_WO_50" +// +// override fun showRequirement(activity: Activity): Boolean { +// return activity !is SplashActivity +// && System.currentTimeMillis() - lastShowTime > 60 * 60 * 1000 +// } +// +// override fun showHotSplashAdv(activity: Activity, codeId: String) { +// lastShowTime = System.currentTimeMillis() +// ttHotSplashAdvDialog = TTHotSplashAdvDialog(activity, onShow = { container -> +// EasyAdv.splashConfig() +// .setCodeId(codeId) +// .setActivity(activity) +// .setWidth(activity.getScreenWidth()) +// .setHeight(activity.getScreenHeight()) +// .setContainer(container) +// .setSplashAdvListener(onError = { _, _ -> +// ttHotSplashAdvDialog?.dismiss() +// }, onAdClicked = { _, _ -> +// ttHotSplashAdvDialog?.dismiss() +// }, onAdSkip = { +// ttHotSplashAdvDialog?.dismiss() +// }, onAdTimeOver = { +// ttHotSplashAdvDialog?.dismiss() +// }) +// .showSplashAdv() +// }, onDismiss = {}) +// ttHotSplashAdvDialog?.show() +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/espoir/easyadvapp/ad/TTRewardVideoAdvStrategy.kt b/app/src/main/java/com/espoir/easyadvapp/ad/TTRewardVideoAdvStrategy.kt new file mode 100644 index 0000000..8032407 --- /dev/null +++ b/app/src/main/java/com/espoir/easyadvapp/ad/TTRewardVideoAdvStrategy.kt @@ -0,0 +1,152 @@ +package com.espoir.easyadvapp.ad + +//class TTRewardVideoAdvStrategy : IRewardVideoAdvEngine { +// +// private var playtime: Long = 0L +// +// override fun showRewardVideoAdv(config: RewardVideoAdvConfig) { +// if (config.activity == null) { +// config.listener(CallbackType.ERROR, EasyAdv.ERROR_ACT, "activity is null") +// return +// } +// if (config.codeId.isEmpty()) { +// config.listener(CallbackType.ERROR, EasyAdv.ERROR_PARAM, "codeId or container is null") +// return +// } +// val act = config.activity?.get() ?: return +// val adNativeLoader = TTAdSdk.getAdManager().createAdNative(act) +// val adslot = AdSlot.Builder() +// .setCodeId(config.codeId) +// .setOrientation(config.orientation) +// .setAdCount(config.adCount) +// .setUserID(config.userId) +// .setMediationAdSlot( +// MediationAdSlot.Builder() +// .setMuted(true).setVolume(0.7f).apply { +// config.extraMap.forEach { +// setExtraObject(it.key, it.value) +// } +// } +// .build() +// ) +// .build() +// adNativeLoader.loadRewardVideoAd(adslot, object : TTAdNative.RewardVideoAdListener { +// override fun onError(code: Int, msg: String) { +// config.listener(CallbackType.ERROR, code, msg) +// } +// +// override fun onRewardVideoAdLoad(ttRewardVideoAd: TTRewardVideoAd) { +// config.listener(CallbackType.AD_LOAD, config.codeId, ttRewardVideoAd.mediationManager?.showEcpm) +// } +// +// override fun onRewardVideoCached() { +// } +// +// override fun onRewardVideoCached(ttRewardVideoAd: TTRewardVideoAd) { +// showRewardVideoAdImpl(config, act, ttRewardVideoAd) +// } +// }) +// } +// +// private fun showRewardVideoAdImpl(config: RewardVideoAdvConfig, act: Activity, rewardAd: TTRewardVideoAd) { +// rewardAd.setRewardAdInteractionListener(object : TTRewardVideoAd.RewardAdInteractionListener { +// override fun onAdShow() { +// playtime = System.currentTimeMillis() +// config.listener(CallbackType.AD_SHOW, config.codeId, rewardAd.mediationManager.showEcpm) +// } +// +// /** +// * 注意Admob的激励视频不会回调该方法 +// */ +// override fun onAdVideoBarClick() { +// config.listener(CallbackType.AD_CLICK, config.codeId, rewardAd.mediationManager.showEcpm) +// } +// +// /** +// * 广告关闭的回调 +// */ +// override fun onAdClose() { +// if (playtime > 0) { +// val time = (System.currentTimeMillis() - playtime).toInt() +// config.listener( +// CallbackType.AD_CLOSE, +// config.codeId, +// rewardAd.mediationManager.showEcpm, +// time, +// false +// ) +// playtime = 0 +// } +// } +// +// /** +// * 视频播放完毕的回调 Admob广告不存在该回调 +// */ +// override fun onVideoComplete() { +// if (playtime > 0) { +// val time = (System.currentTimeMillis() - playtime).toInt() +// config.listener( +// CallbackType.VIDEO_COMPLETE, +// config.codeId, +// rewardAd.mediationManager.showEcpm, +// time, +// true +// ) +// playtime = 0 +// } +// } +// +// /** +// * 视频播放失败的回调 - Mintegral GDT Admob广告不存在该回调 +// */ +// override fun onVideoError() { +// config.listener(CallbackType.ERROR, -3870, "onVideoError") +// } +// +// /** +// * 激励视频播放完毕,验证是否有效发放奖励的回调 +// */ +// override fun onRewardVerify( +// rewardVerify: Boolean, +// rewardAmount: Int, +// rewardName: String?, +// errorCode: Int, +// errorMsg: String? +// ) { +// config.listener( +// CallbackType.REWARD_VERIFY, +// rewardVerify, +// rewardAmount, +// rewardName, +// errorCode, +// errorMsg +// ) +// } +// +// override fun onRewardArrived( +// isRewardValid: Boolean, +// rewardType: Int, +// extraInfo: Bundle? +// ) { +// config.listener( +// CallbackType.REWARD_ARRIVED, +// isRewardValid, +// rewardType, +// extraInfo +// ) +// } +// +// /** +// * - Mintegral GDT Admob广告不存在该回调 +// */ +// override fun onSkippedVideo() { +// config.listener( +// CallbackType.AD_SKIP, +// config.codeId, +// rewardAd.mediationManager.showEcpm +// ) +// } +// }) +// rewardAd.showRewardVideoAd(act) +// } +//} \ No newline at end of file diff --git a/app/src/main/java/com/espoir/easyadvapp/ad/TTSplashAdvEngine.kt b/app/src/main/java/com/espoir/easyadvapp/ad/TTSplashAdvEngine.kt index 305dc05..229ac2d 100644 --- a/app/src/main/java/com/espoir/easyadvapp/ad/TTSplashAdvEngine.kt +++ b/app/src/main/java/com/espoir/easyadvapp/ad/TTSplashAdvEngine.kt @@ -1,76 +1,64 @@ package com.espoir.easyadvapp.ad -import android.view.View -import androidx.core.view.isVisible -import com.bytedance.sdk.openadsdk.AdSlot -import com.bytedance.sdk.openadsdk.TTAdNative -import com.bytedance.sdk.openadsdk.TTAdSdk -import com.bytedance.sdk.openadsdk.TTSplashAd -import com.espoir.easyadv.CallbackType -import com.espoir.easyadv.EasyAdv -import com.espoir.easyadv.ISplashAdvEngine -import com.espoir.easyadv.config.SplashAdvConfig -import com.espoir.easyadv.config.listener - -class TTSplashAdvEngine : ISplashAdvEngine { - - override fun showSplashAdv(config: SplashAdvConfig) { - if (config.activity == null) { - config.listener(CallbackType.ERROR, EasyAdv.ERROR_ACT, "activity is null") - return - } - if (config.codeId.isEmpty() || config.container == null) { - config.listener(CallbackType.ERROR, EasyAdv.ERROR_PARAM, "codeId or container is null") - return - } - val act = config.activity?.get() ?: return - val adNativeLoader = TTAdSdk.getAdManager().createAdNative(act) - val adSlot = AdSlot.Builder() - .setCodeId(config.codeId) - .setImageAcceptedSize(config.width, config.height) - .build() - adNativeLoader.loadSplashAd(adSlot, object : TTAdNative.SplashAdListener { - override fun onError(code: Int, message: String?) { - config.listener(CallbackType.ERROR, code, message) - } - - override fun onTimeout() { - config.listener(CallbackType.TIME_OUT) - } - - override fun onSplashAdLoad(splashAd: TTSplashAd?) { - config.listener(CallbackType.AD_LOAD, splashAd) - showSplashAdvImpl(splashAd, config) - } - }) - } - - private fun showSplashAdvImpl(splashAd: TTSplashAd?, config: SplashAdvConfig) { - if (splashAd == null) { - config.listener(CallbackType.ERROR, EasyAdv.ERROR_AD_INFO, "splashAd is null") - return - } - splashAd.setSplashInteractionListener(object : TTSplashAd.AdInteractionListener { - override fun onAdClicked(view: View?, type: Int) { - config.listener(CallbackType.AD_CLICK, view, type) - } - - override fun onAdShow(view: View?, type: Int) { - config.listener(CallbackType.AD_SHOW, config.codeId, view, type) - } - - override fun onAdSkip() { - config.listener(CallbackType.AD_SKIP) - } - - override fun onAdTimeOver() { - config.listener(CallbackType.TIME_OVER) - } - }) - config.container?.let { - it.isVisible = true - it.removeAllViews() - it.addView(splashAd.splashView) - } - } -} \ No newline at end of file +//class TTSplashAdvEngine : ISplashAdvEngine { +// +// override fun showSplashAdv(config: SplashAdvConfig) { +// if (config.activity == null) { +// config.listener(CallbackType.ERROR, EasyAdv.ERROR_ACT, "activity is null") +// return +// } +// if (config.codeId.isEmpty() || config.container == null) { +// config.listener(CallbackType.ERROR, EasyAdv.ERROR_PARAM, "codeId or container is null") +// return +// } +// val act = config.activity?.get() ?: return +// val adNativeLoader = TTAdSdk.getAdManager().createAdNative(act) +// val adSlot = AdSlot.Builder() +// .setCodeId(config.codeId) +// .setImageAcceptedSize(config.width, config.height) +// .build() +// adNativeLoader.loadSplashAd(adSlot, object : TTAdNative.SplashAdListener { +// override fun onError(code: Int, message: String?) { +// config.listener(CallbackType.ERROR, code, message) +// } +// +// override fun onTimeout() { +// config.listener(CallbackType.TIME_OUT) +// } +// +// override fun onSplashAdLoad(splashAd: TTSplashAd?) { +// config.listener(CallbackType.AD_LOAD, splashAd) +// showSplashAdvImpl(splashAd, config) +// } +// }) +// } +// +// private fun showSplashAdvImpl(splashAd: TTSplashAd?, config: SplashAdvConfig) { +// if (splashAd == null) { +// config.listener(CallbackType.ERROR, EasyAdv.ERROR_AD_INFO, "splashAd is null") +// return +// } +// splashAd.setSplashInteractionListener(object : TTSplashAd.AdInteractionListener { +// override fun onAdClicked(view: View?, type: Int) { +// config.listener(CallbackType.AD_CLICK, view, type) +// } +// +// override fun onAdShow(view: View?, type: Int) { +// config.listener(CallbackType.AD_SHOW, config.codeId, view, type) +// } +// +// override fun onAdSkip() { +// config.listener(CallbackType.AD_SKIP) +// } +// +// override fun onAdTimeOver() { +// config.listener(CallbackType.TIME_OVER) +// } +// }) +// config.container?.let { +// it.isVisible = true +// it.removeAllViews() +// it.addView(splashAd.splashView) +// } +// } +//} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d829e29..81a7523 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,7 +1,19 @@ - + android:layout_height="match_parent" + android:orientation="vertical"> - \ No newline at end of file + + + + \ No newline at end of file diff --git a/easyadv/src/main/java/com/espoir/easyadv/AdvControl.kt b/easyadv/src/main/java/com/espoir/easyadv/AdvControl.kt index 2c036ae..1f50419 100644 --- a/easyadv/src/main/java/com/espoir/easyadv/AdvControl.kt +++ b/easyadv/src/main/java/com/espoir/easyadv/AdvControl.kt @@ -3,22 +3,57 @@ package com.espoir.easyadv import android.app.Activity import android.app.Application import android.os.Bundle -import android.util.Log +import com.bytedance.sdk.openadsdk.stub.activity.Stub_Standard_Portrait_Activity import com.espoir.easyadv.config.BannerAdvConfig +import com.espoir.easyadv.config.FeedAdConfig import com.espoir.easyadv.config.FullScreenVideoAdvConfig +import com.espoir.easyadv.config.RewardVideoAdvConfig import com.espoir.easyadv.config.SplashAdvConfig -import com.bytedance.sdk.openadsdk.stub.activity.Stub_Standard_Portrait_Activity +import com.espoir.easyadv.config.listener +import com.espoir.easyadv.interceptor.AdvInterceptCallback +import com.espoir.easyadv.interceptor.AdvInterceptorManager class AdvControl { + private var interceptorManager = AdvInterceptorManager() private var activityCount: Int = 0 private var showHotSplashAdv = false + @Volatile + private var splashAdvFlag = false + + @Volatile + private var showSplashAdvTime = 0L + + fun showSplashAdv(config: SplashAdvConfig, splashAdvEngine: ISplashAdvEngine?) { if (config.userId.isNullOrEmpty()) { config.setUserId(EasyAdv.globalConfig()?.userId.orEmpty()) } - splashAdvEngine?.showSplashAdv(config) + if (EasyAdv.isFinishSdkInit && !EasyAdv.isInitSdkSuccess) { //sdk初始化失败。回调失败 + config.listener(CallbackType.ERROR, EasyAdv.ERROR_SDK, "sdk init fail") + return + } + showSplashAdvTime = System.currentTimeMillis() + //等待sdk初始化完成 + while (!splashAdvFlag) { + if (EasyAdv.isFinishSdkInit) { + splashAdvFlag = if (EasyAdv.isInitSdkSuccess) { + splashAdvEngine?.showSplashAdv(config) + true + } else { + config.listener(CallbackType.ERROR, EasyAdv.ERROR_SDK, "sdk init fail") + true + } + } else { + if (EasyAdv.sdkTimeOutMillis > 0) { + if (System.currentTimeMillis() - showSplashAdvTime > EasyAdv.sdkTimeOutMillis) { + config.listener(CallbackType.ERROR, EasyAdv.ERROR_SDK, "sdk init time out") + splashAdvFlag = true + } + } + } + } } fun showFullScreenVideoAdv(config: FullScreenVideoAdvConfig, fullScreenVideoAdvEngine: IFullScreenVideoAdvEngine?) { @@ -35,6 +70,33 @@ class AdvControl { bannerAdvEngine?.showBannerAdv(config) } + fun showFeedAdv(config: FeedAdConfig, feedAdvEngine: IFeedAdvEngine?) { + if (config.userId.isNullOrEmpty()) { + config.setUserId(EasyAdv.globalConfig()?.userId.orEmpty()) + } + feedAdvEngine?.showFeedAdv(config) + } + + fun showRewardVideoAdv(config: RewardVideoAdvConfig, rewardVideoEngine: IRewardVideoAdvEngine?) { + if (config.userId.isNullOrEmpty()) { + config.setUserId(EasyAdv.globalConfig()?.userId.orEmpty()) + } + if (config.interceptors.size > 0) { + interceptorManager.attachInterceptors(config.interceptors) + interceptorManager.handlerInterceptor(config.extraMap, object : AdvInterceptCallback { + override fun onNext(map: HashMap?) { + rewardVideoEngine?.showRewardVideoAdv(config) + } + + override fun onInterrupt(msg: String?) { + config.listener(CallbackType.ERROR, -1, msg) + } + }) + } else { + rewardVideoEngine?.showRewardVideoAdv(config) + } + } + fun setUpHotSplashAdvStrategy(application: Application) { application.registerActivityLifecycleCallbacks(object : Application.ActivityLifecycleCallbacks { override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) { @@ -48,11 +110,12 @@ class AdvControl { } override fun onActivityResumed(activity: Activity) { - Log.i("XIAN","hotSplashAdvStrategy="+ EasyAdv.globalConfig()?.hotSplashAdvStrategy) - EasyAdv.globalConfig()?.hotSplashAdvStrategy?.let { - if (it.showRequirement(activity) && showHotSplashAdv) { - showHotSplashAdv = false - it.showHotSplashAdv(activity, it.getCodeId()) + if (EasyAdv.isFinishSdkInit && EasyAdv.isInitSdkSuccess) { + EasyAdv.globalConfig()?.hotSplashAdvStrategy?.let { + if (it.showRequirement(activity) && showHotSplashAdv) { + showHotSplashAdv = false + it.showHotSplashAdv(activity, it.getCodeId()) + } } } } diff --git a/easyadv/src/main/java/com/espoir/easyadv/AdvListener.kt b/easyadv/src/main/java/com/espoir/easyadv/AdvListener.kt index f5ab46f..b5d86af 100644 --- a/easyadv/src/main/java/com/espoir/easyadv/AdvListener.kt +++ b/easyadv/src/main/java/com/espoir/easyadv/AdvListener.kt @@ -1,12 +1,17 @@ package com.espoir.easyadv +import android.os.Bundle import android.view.View -import com.espoir.easyadv.config.BannerAdvConfig -import com.espoir.easyadv.config.FullScreenVideoAdvConfig -import com.espoir.easyadv.config.SplashAdvConfig +import com.bytedance.sdk.openadsdk.TTFeedAd import com.bytedance.sdk.openadsdk.TTFullScreenVideoAd import com.bytedance.sdk.openadsdk.TTNativeExpressAd import com.bytedance.sdk.openadsdk.TTSplashAd +import com.bytedance.sdk.openadsdk.mediation.manager.MediationAdEcpmInfo +import com.espoir.easyadv.config.BannerAdvConfig +import com.espoir.easyadv.config.FeedAdConfig +import com.espoir.easyadv.config.FullScreenVideoAdvConfig +import com.espoir.easyadv.config.RewardVideoAdvConfig +import com.espoir.easyadv.config.SplashAdvConfig interface SplashAdvListener { fun onError(code: Int, message: String?) @@ -36,6 +41,33 @@ interface BannerAdvListener { fun onAdShow(codeId: String, bannerAd: TTNativeExpressAd?) } +interface FeedAdvListener { + fun onError(code: Int, message: String?) + + fun onFeedAdLoad(codeId: String, list: MutableList?) + + fun onFeedAdClick(codeId: String, ecpm: MediationAdEcpmInfo?) + fun onFeedAdShow(codeId: String, ecpm: MediationAdEcpmInfo?) +} + +interface RewardVideoAdvListener { + fun onError(code: Int, message: String?) + + fun onRewardVideoAdLoad(codeId: String, ecpm: MediationAdEcpmInfo?) + + fun onRewardVideoAdShow(codeId: String, ecpm: MediationAdEcpmInfo?) + + fun onAdVideoBarClick(codeId: String, ecpm: MediationAdEcpmInfo?) + fun onRewardVideoAdClose(codeId: String, ecpm: MediationAdEcpmInfo?, duration: Long, isPlayOver: Boolean) + + fun onVideoComplete(codeId: String, ecpm: MediationAdEcpmInfo?, duration: Long, isPlayOver: Boolean) + + fun onRewardVerify(rewardVerify: Boolean, rewardAmount: Int, rewardName: String?, errorCode: Int, errorMsg: String?) + + fun onRewardArrived(isRewardValid: Boolean, rewardType: Int, extraInfo: Bundle?) + + fun onSkippedVideo(codeId: String, ecpm: MediationAdEcpmInfo?) +} inline fun SplashAdvConfig.setSplashAdvListener( crossinline onError: (code: Int, message: String?) -> Unit = { _, _ -> }, @@ -151,4 +183,106 @@ inline fun BannerAdvConfig.setBannerAdvListener( } setBannerAdvListener(listener) return this +} + +inline fun FeedAdConfig.setFeedAdvListener( + crossinline onError: (code: Int, message: String?) -> Unit = { _, _ -> }, + crossinline onFeedAdLoad: (codeId: String, list: MutableList?) -> Unit = { _, _ -> }, + crossinline onFeedAdClick: (codeId: String, ecpm: MediationAdEcpmInfo?) -> Unit = { _, _ -> }, + crossinline onFeedAdShow: (codeId: String, ecpm: MediationAdEcpmInfo?) -> Unit = { _, _ -> } +): FeedAdConfig { + val listener = object : FeedAdvListener { + override fun onError(code: Int, message: String?) { + onError(code, message) + } + + override fun onFeedAdLoad(codeId: String, list: MutableList?) { + onFeedAdLoad(codeId, list) + } + + override fun onFeedAdClick(codeId: String, ecpm: MediationAdEcpmInfo?) { + onFeedAdClick(codeId, ecpm) + } + + override fun onFeedAdShow(codeId: String, ecpm: MediationAdEcpmInfo?) { + onFeedAdShow(codeId, ecpm) + } + } + setFeedAdvListener(listener) + return this +} + + +inline fun RewardVideoAdvConfig.setRewardVideoAdvListener( + crossinline onError: (code: Int, message: String?) -> Unit = { _, _ -> }, + crossinline onRewardVideoAdLoad: (codeId: String, ecpm: MediationAdEcpmInfo?) -> Unit = { _, _ -> }, + crossinline onRewardVideoAdShow: (codeId: String, ecpm: MediationAdEcpmInfo?) -> Unit = { _, _ -> }, + crossinline onAdVideoBarClick: (codeId: String, ecpm: MediationAdEcpmInfo?) -> Unit = { _, _ -> }, + crossinline onRewardVideoAdClose: ( + codeId: String, + ecpm: MediationAdEcpmInfo?, + duration: Long, + isPlayOver: Boolean + ) -> Unit = { _, _, _, _ -> }, + crossinline onVideoComplete: (codeId: String, ecpm: MediationAdEcpmInfo?, duration: Long, isPlayOver: Boolean) -> Unit = { _, _, _, _ -> }, + crossinline onRewardVerify: ( + rewardVerify: Boolean, + rewardAmount: Int, + rewardName: String?, + errorCode: Int, + errorMsg: String? + ) -> Unit = { _, _, _, _, _ -> }, + crossinline onRewardArrived: (isRewardValid: Boolean, rewardType: Int, extraInfo: Bundle?) -> Unit = { _, _, _ -> }, + crossinline onSkippedVideo: (codeId: String, ecpm: MediationAdEcpmInfo?) -> Unit = { _, _ -> }, +): RewardVideoAdvConfig { + val listener = object : RewardVideoAdvListener { + override fun onError(code: Int, message: String?) { + onError(code, message) + } + + override fun onRewardVideoAdLoad(codeId: String, ecpm: MediationAdEcpmInfo?) { + onRewardVideoAdLoad(codeId, ecpm) + } + + override fun onRewardVideoAdShow(codeId: String, ecpm: MediationAdEcpmInfo?) { + onRewardVideoAdShow(codeId, ecpm) + } + + override fun onAdVideoBarClick(codeId: String, ecpm: MediationAdEcpmInfo?) { + onAdVideoBarClick(codeId, ecpm) + } + + override fun onRewardVideoAdClose( + codeId: String, + ecpm: MediationAdEcpmInfo?, + duration: Long, + isPlayOver: Boolean + ) { + onRewardVideoAdClose(codeId, ecpm, duration, isPlayOver) + } + + override fun onVideoComplete(codeId: String, ecpm: MediationAdEcpmInfo?, duration: Long, isPlayOver: Boolean) { + onVideoComplete(codeId, ecpm, duration, isPlayOver) + } + + override fun onRewardVerify( + rewardVerify: Boolean, + rewardAmount: Int, + rewardName: String?, + errorCode: Int, + errorMsg: String? + ) { + onRewardVerify(rewardVerify, rewardAmount, rewardName, errorCode, errorMsg) + } + + override fun onRewardArrived(isRewardValid: Boolean, rewardType: Int, extraInfo: Bundle?) { + onRewardArrived(isRewardValid, rewardType, extraInfo) + } + + override fun onSkippedVideo(codeId: String, ecpm: MediationAdEcpmInfo?) { + onSkippedVideo(codeId, ecpm) + } + } + setRewardVideoAdvListener(listener) + return this } \ No newline at end of file diff --git a/easyadv/src/main/java/com/espoir/easyadv/CallbackType.kt b/easyadv/src/main/java/com/espoir/easyadv/CallbackType.kt index ef165a6..9857397 100644 --- a/easyadv/src/main/java/com/espoir/easyadv/CallbackType.kt +++ b/easyadv/src/main/java/com/espoir/easyadv/CallbackType.kt @@ -10,5 +10,7 @@ enum class CallbackType { AD_SKIP, AD_CLOSE, VIDEO_COMPLETE, - TIME_OVER + TIME_OVER, + REWARD_VERIFY, + REWARD_ARRIVED } diff --git a/easyadv/src/main/java/com/espoir/easyadv/EasyAdv.kt b/easyadv/src/main/java/com/espoir/easyadv/EasyAdv.kt index bf76a11..435628d 100644 --- a/easyadv/src/main/java/com/espoir/easyadv/EasyAdv.kt +++ b/easyadv/src/main/java/com/espoir/easyadv/EasyAdv.kt @@ -3,8 +3,10 @@ package com.espoir.easyadv import android.annotation.SuppressLint import android.app.Application import com.espoir.easyadv.config.BannerAdvConfig +import com.espoir.easyadv.config.FeedAdConfig import com.espoir.easyadv.config.FullScreenVideoAdvConfig import com.espoir.easyadv.config.GlobalAdvConfig +import com.espoir.easyadv.config.RewardVideoAdvConfig import com.espoir.easyadv.config.SplashAdvConfig object EasyAdv { @@ -18,9 +20,18 @@ object EasyAdv { private var splashAdvEngine: ISplashAdvEngine? = null private var fullScreenVideoAdvEngine: IFullScreenVideoAdvEngine? = null private var bannerAdvEngine: IBannerAdvEngine? = null + private var feedAdvEngine: IFeedAdvEngine? = null + private var rewardVideoEngine: IRewardVideoAdvEngine? = null private var advControl: AdvControl? = null - private var isInitSdkSuccess = false + @Volatile + internal var isInitSdkSuccess = false + + @Volatile + internal var isFinishSdkInit = false + internal var sdkTimeOutMillis = 0L + + const val ERROR_SDK = -3866 const val ERROR_ACT = -3867 const val ERROR_PARAM = -3868 const val ERROR_AD_INFO = -3869 @@ -33,6 +44,7 @@ object EasyAdv { @JvmStatic fun sdkConfig(options: AdvSDKBuilder.() -> Unit) = apply { advSDKBuilder = AdvSDKBuilder().also { options(it) } + sdkTimeOutMillis = advSDKBuilder?.timeOutMillis ?: 0 } internal fun globalConfig() = globalAdvConfig @@ -62,15 +74,27 @@ object EasyAdv { bannerAdvEngine = engine } + @JvmStatic + fun setFeedAdvEngine(engine: IFeedAdvEngine) = apply { + feedAdvEngine = engine + } + + @JvmStatic + fun setRewardVideoEngine(engine: IRewardVideoAdvEngine) = apply { + this.rewardVideoEngine = engine + } + fun apply() { if (sInit) return advSDKBuilder?.let { builder -> sdkPlatform?.initAdvSdk(builder, object : AdvSdkInitCallback { override fun onInitSuccess() { + isFinishSdkInit = true isInitSdkSuccess = true } override fun onInitFail(code: Int, msg: String?) { + isFinishSdkInit = true isInitSdkSuccess = false } }) @@ -93,8 +117,13 @@ object EasyAdv { @JvmStatic fun bannerConfig() = BannerAdvConfig() + @JvmStatic + fun feedConfig() = FeedAdConfig() + + @JvmStatic + fun rewardVideoConfig() = RewardVideoAdvConfig() + internal fun showSplashAdv(config: SplashAdvConfig) { - if (!isInitSdkSuccess) return advControl?.showSplashAdv(config, splashAdvEngine) } @@ -107,6 +136,16 @@ object EasyAdv { if (!isInitSdkSuccess) return advControl?.showBannerAdv(config, bannerAdvEngine) } + + internal fun showFeedAdv(config: FeedAdConfig) { + if (!isInitSdkSuccess) return + advControl?.showFeedAdv(config, feedAdvEngine) + } + + internal fun showRewardVideoAdv(config: RewardVideoAdvConfig) { + if (!isInitSdkSuccess) return + advControl?.showRewardVideoAdv(config, rewardVideoEngine) + } } class Test { diff --git a/easyadv/src/main/java/com/espoir/easyadv/IAdvEngine.kt b/easyadv/src/main/java/com/espoir/easyadv/IAdvEngine.kt index ad74ff7..45aaf71 100644 --- a/easyadv/src/main/java/com/espoir/easyadv/IAdvEngine.kt +++ b/easyadv/src/main/java/com/espoir/easyadv/IAdvEngine.kt @@ -1,7 +1,9 @@ package com.espoir.easyadv import com.espoir.easyadv.config.BannerAdvConfig +import com.espoir.easyadv.config.FeedAdConfig import com.espoir.easyadv.config.FullScreenVideoAdvConfig +import com.espoir.easyadv.config.RewardVideoAdvConfig import com.espoir.easyadv.config.SplashAdvConfig interface ISplashAdvEngine { @@ -14,4 +16,12 @@ interface IFullScreenVideoAdvEngine { interface IBannerAdvEngine { fun showBannerAdv(config: BannerAdvConfig) +} + +interface IFeedAdvEngine { + fun showFeedAdv(config: FeedAdConfig) +} + +interface IRewardVideoAdvEngine { + fun showRewardVideoAdv(config: RewardVideoAdvConfig) } \ No newline at end of file diff --git a/easyadv/src/main/java/com/espoir/easyadv/IAdvPlatform.kt b/easyadv/src/main/java/com/espoir/easyadv/IAdvPlatform.kt index 9563679..cf7772d 100644 --- a/easyadv/src/main/java/com/espoir/easyadv/IAdvPlatform.kt +++ b/easyadv/src/main/java/com/espoir/easyadv/IAdvPlatform.kt @@ -15,6 +15,7 @@ class AdvSDKBuilder { var appName: String? = null var userId: String? = null var debug: Boolean = false + var timeOutMillis: Long = 0 //sdk超时时间,0就是没 } interface AdvSdkInitCallback { diff --git a/easyadv/src/main/java/com/espoir/easyadv/config/BannerAdvConfig.kt b/easyadv/src/main/java/com/espoir/easyadv/config/BannerAdvConfig.kt index 97ab5a2..6ef1dee 100644 --- a/easyadv/src/main/java/com/espoir/easyadv/config/BannerAdvConfig.kt +++ b/easyadv/src/main/java/com/espoir/easyadv/config/BannerAdvConfig.kt @@ -6,6 +6,7 @@ import com.bytedance.sdk.openadsdk.TTNativeExpressAd import com.espoir.easyadv.BannerAdvListener import com.espoir.easyadv.CallbackType import com.espoir.easyadv.EasyAdv +import com.espoir.easyadv.interceptor.AdvInterceptor import java.lang.ref.WeakReference open class BannerAdvConfig : BaseAdvConfig() { @@ -17,7 +18,7 @@ open class BannerAdvConfig : BaseAdvConfig() { this.codeId = codeId } - fun setContainer(container: ViewGroup) = apply { + fun setContainer(container: ViewGroup?) = apply { this.container = container } diff --git a/easyadv/src/main/java/com/espoir/easyadv/config/BaseAdvConfig.kt b/easyadv/src/main/java/com/espoir/easyadv/config/BaseAdvConfig.kt index e17a3e6..77144d8 100644 --- a/easyadv/src/main/java/com/espoir/easyadv/config/BaseAdvConfig.kt +++ b/easyadv/src/main/java/com/espoir/easyadv/config/BaseAdvConfig.kt @@ -1,6 +1,7 @@ package com.espoir.easyadv.config import android.app.Activity +import com.espoir.easyadv.interceptor.AdvInterceptor import java.lang.ref.WeakReference open class BaseAdvConfig { diff --git a/easyadv/src/main/java/com/espoir/easyadv/config/FeedAdConfig.kt b/easyadv/src/main/java/com/espoir/easyadv/config/FeedAdConfig.kt new file mode 100644 index 0000000..0380d2b --- /dev/null +++ b/easyadv/src/main/java/com/espoir/easyadv/config/FeedAdConfig.kt @@ -0,0 +1,86 @@ +package com.espoir.easyadv.config + +import android.app.Activity +import android.view.ViewGroup +import com.bytedance.sdk.openadsdk.TTFeedAd +import com.bytedance.sdk.openadsdk.mediation.manager.MediationAdEcpmInfo +import com.espoir.easyadv.CallbackType +import com.espoir.easyadv.EasyAdv +import com.espoir.easyadv.FeedAdvListener +import com.espoir.easyadv.interceptor.AdvInterceptor +import java.lang.ref.WeakReference + +class FeedAdConfig : BaseAdvConfig() { + var codeId: String = "" + var container: ViewGroup? = null + var feedAdvListener: FeedAdvListener? = null + + fun setCodeId(codeId: String) = apply { + this.codeId = codeId + } + + fun setContainer(container: ViewGroup?) = apply { + this.container = container + } + + fun setFeedAdvListener(listener: FeedAdvListener) = apply { + this.feedAdvListener = listener + } + + fun setActivity(activity: Activity?) = apply { + this.activity = WeakReference(activity) + } + + fun setWidth(width: Int) = apply { + this.width = width + } + + fun setHeight(height: Int) = apply { + this.height = height + } + + fun setUserId(userId: String) = apply { + this.userId = userId + } + + fun setAdCount(count: Int) = apply { + this.adCount = count + } + + fun showFeedAdv() { + EasyAdv.showFeedAdv(this) + } +} + +fun FeedAdConfig.listener(listenerType: CallbackType, vararg params: Any?) { + when (listenerType) { + CallbackType.ERROR -> { + feedAdvListener?.onError(params[0] as Int, params[1] as String) + EasyAdv.globalConfig()?.bannerAdvListener?.onError(params[0] as Int, params[1] as String) + } + + CallbackType.AD_LOAD -> { + val list = params[1] as MutableList? + feedAdvListener?.onFeedAdLoad(params[0] as String, list) + EasyAdv.globalConfig()?.feedAdvListener?.onFeedAdLoad(params[0] as String, list) + } + + CallbackType.AD_CLICK -> { + feedAdvListener?.onFeedAdClick(params[0] as String, params[1] as MediationAdEcpmInfo?) + EasyAdv.globalConfig()?.feedAdvListener?.onFeedAdClick( + params[0] as String, + params[1] as MediationAdEcpmInfo? + ) + } + + CallbackType.AD_SHOW -> { + feedAdvListener?.onFeedAdShow(params[0] as String, params[1] as MediationAdEcpmInfo?) + EasyAdv.globalConfig()?.feedAdvListener?.onFeedAdShow( + params[0] as String, + params[1] as MediationAdEcpmInfo? + ) + } + + else -> {} + } +} \ No newline at end of file diff --git a/easyadv/src/main/java/com/espoir/easyadv/config/FullScreenVideoAdvConfig.kt b/easyadv/src/main/java/com/espoir/easyadv/config/FullScreenVideoAdvConfig.kt index ca6ca88..ff85e3a 100644 --- a/easyadv/src/main/java/com/espoir/easyadv/config/FullScreenVideoAdvConfig.kt +++ b/easyadv/src/main/java/com/espoir/easyadv/config/FullScreenVideoAdvConfig.kt @@ -5,6 +5,7 @@ import com.bytedance.sdk.openadsdk.TTFullScreenVideoAd import com.espoir.easyadv.CallbackType import com.espoir.easyadv.EasyAdv import com.espoir.easyadv.FullScreenVideoAdvListener +import com.espoir.easyadv.interceptor.AdvInterceptor import java.lang.ref.WeakReference open class FullScreenVideoAdvConfig : BaseAdvConfig() { diff --git a/easyadv/src/main/java/com/espoir/easyadv/config/GlobalAdvConfig.kt b/easyadv/src/main/java/com/espoir/easyadv/config/GlobalAdvConfig.kt index f2fb9c5..ed1b16b 100644 --- a/easyadv/src/main/java/com/espoir/easyadv/config/GlobalAdvConfig.kt +++ b/easyadv/src/main/java/com/espoir/easyadv/config/GlobalAdvConfig.kt @@ -1,14 +1,18 @@ package com.espoir.easyadv.config import com.espoir.easyadv.BannerAdvListener +import com.espoir.easyadv.FeedAdvListener import com.espoir.easyadv.FullScreenVideoAdvListener import com.espoir.easyadv.IHotSplashAdvStrategy +import com.espoir.easyadv.RewardVideoAdvListener import com.espoir.easyadv.SplashAdvListener class GlobalAdvConfig { var splashAdvListener: SplashAdvListener? = null var fullScreenVideoAdvListener: FullScreenVideoAdvListener? = null var bannerAdvListener: BannerAdvListener? = null + var feedAdvListener: FeedAdvListener? = null + var rewardVideoAdvListener: RewardVideoAdvListener? = null var userId: String = "" var enableHotSplashAdv = false var hotSplashAdvStrategy: IHotSplashAdvStrategy? = null diff --git a/easyadv/src/main/java/com/espoir/easyadv/config/RewardVideoAdvConfig.kt b/easyadv/src/main/java/com/espoir/easyadv/config/RewardVideoAdvConfig.kt new file mode 100644 index 0000000..71ed6cd --- /dev/null +++ b/easyadv/src/main/java/com/espoir/easyadv/config/RewardVideoAdvConfig.kt @@ -0,0 +1,165 @@ +package com.espoir.easyadv.config + +import android.app.Activity +import android.os.Bundle +import com.bytedance.sdk.openadsdk.TTAdConstant +import com.bytedance.sdk.openadsdk.mediation.manager.MediationAdEcpmInfo +import com.espoir.easyadv.CallbackType +import com.espoir.easyadv.EasyAdv +import com.espoir.easyadv.RewardVideoAdvListener +import com.espoir.easyadv.interceptor.AdvInterceptor +import java.lang.ref.WeakReference + +class RewardVideoAdvConfig : BaseAdvConfig() { + var codeId: String = "" + var orientation: Int = TTAdConstant.VERTICAL + internal var interceptors = mutableListOf() + var extraMap = hashMapOf() + var rewardVideoAdvListener: RewardVideoAdvListener? = null + + fun setCodeId(codeId: String) = apply { + this.codeId = codeId + } + + fun setOrientation(orientation: Int) = apply { + this.orientation = orientation + } + + fun setRewardVideoAdvListener(listener: RewardVideoAdvListener) = apply { + this.rewardVideoAdvListener = listener + } + + fun setActivity(activity: Activity?) = apply { + this.activity = WeakReference(activity) + } + + fun setWidth(width: Int) = apply { + this.width = width + } + + fun setHeight(height: Int) = apply { + this.height = height + } + + fun setUserId(userId: String) = apply { + this.userId = userId + } + + fun setAdCount(count: Int) = apply { + this.adCount = count + } + + fun addInterceptor(interceptor: AdvInterceptor) = apply { + val noSame = interceptors.none { it.getTag() == interceptor.getTag() } + if (noSame) { //如果没有相同的才添加 + interceptors += interceptor + } + } + + fun showRewardVideoAdv() { + EasyAdv.showRewardVideoAdv(this) + } +} + +fun RewardVideoAdvConfig.listener(listenerType: CallbackType, vararg params: Any?) { + when (listenerType) { + CallbackType.ERROR -> { + rewardVideoAdvListener?.onError(params[0] as Int, params[1] as String) + EasyAdv.globalConfig()?.rewardVideoAdvListener?.onError(params[0] as Int, params[1] as String) + } + + CallbackType.AD_LOAD -> { + rewardVideoAdvListener?.onRewardVideoAdLoad(params[0] as String, params[1] as MediationAdEcpmInfo?) + EasyAdv.globalConfig()?.rewardVideoAdvListener?.onRewardVideoAdLoad( + params[0] as String, + params[1] as MediationAdEcpmInfo? + ) + } + + CallbackType.AD_CLICK -> { + rewardVideoAdvListener?.onAdVideoBarClick(params[0] as String, params[1] as MediationAdEcpmInfo?) + EasyAdv.globalConfig()?.rewardVideoAdvListener?.onAdVideoBarClick( + params[0] as String, + params[1] as MediationAdEcpmInfo? + ) + } + + CallbackType.AD_SHOW -> { + rewardVideoAdvListener?.onRewardVideoAdShow(params[0] as String, params[1] as MediationAdEcpmInfo?) + EasyAdv.globalConfig()?.rewardVideoAdvListener?.onRewardVideoAdShow( + params[0] as String, + params[1] as MediationAdEcpmInfo? + ) + } + + CallbackType.AD_CLOSE -> { + rewardVideoAdvListener?.onRewardVideoAdClose( + params[0] as String, + params[1] as MediationAdEcpmInfo?, + params[2] as Long, + params[3] as Boolean + ) + EasyAdv.globalConfig()?.rewardVideoAdvListener?.onRewardVideoAdClose( + params[0] as String, + params[1] as MediationAdEcpmInfo?, + params[2] as Long, + params[3] as Boolean + ) + } + + CallbackType.VIDEO_COMPLETE -> { + rewardVideoAdvListener?.onVideoComplete( + params[0] as String, + params[1] as MediationAdEcpmInfo?, + params[2] as Long, + params[3] as Boolean + ) + EasyAdv.globalConfig()?.rewardVideoAdvListener?.onVideoComplete( + params[0] as String, + params[1] as MediationAdEcpmInfo?, + params[2] as Long, + params[3] as Boolean + ) + } + + CallbackType.REWARD_VERIFY -> { + rewardVideoAdvListener?.onRewardVerify( + params[0] as Boolean, + params[1] as Int, + params[2] as String?, + params[3] as Int, + params[4] as String? + ) + EasyAdv.globalConfig()?.rewardVideoAdvListener?.onRewardVerify( + params[0] as Boolean, + params[1] as Int, + params[2] as String?, + params[3] as Int, + params[4] as String? + ) + } + + CallbackType.REWARD_ARRIVED -> { + rewardVideoAdvListener?.onRewardArrived( + params[0] as Boolean, + params[1] as Int, + params[2] as Bundle? + ) + EasyAdv.globalConfig()?.rewardVideoAdvListener?.onRewardArrived( + params[0] as Boolean, + params[1] as Int, + params[2] as Bundle? + ) + } + + CallbackType.AD_SKIP -> { + rewardVideoAdvListener?.onSkippedVideo(params[0] as String, params[1] as MediationAdEcpmInfo?) + EasyAdv.globalConfig()?.rewardVideoAdvListener?.onSkippedVideo( + params[0] as String, + params[1] as MediationAdEcpmInfo? + ) + } + + else -> {} + } +} \ No newline at end of file diff --git a/easyadv/src/main/java/com/espoir/easyadv/interceptor/AdvInterceptor.kt b/easyadv/src/main/java/com/espoir/easyadv/interceptor/AdvInterceptor.kt new file mode 100644 index 0000000..e6f3d9a --- /dev/null +++ b/easyadv/src/main/java/com/espoir/easyadv/interceptor/AdvInterceptor.kt @@ -0,0 +1,19 @@ +package com.espoir.easyadv.interceptor + +abstract class AdvInterceptor { + abstract fun getTag(): String + open fun process(map: HashMap?, callback: AdvInterceptCallback) {} +} + +interface AdvInterceptCallback { + /** + * 执行下一个 + */ + fun onNext(map: HashMap?) + + /** + * 中断 + * msg:可以添加 msg + */ + fun onInterrupt(msg: String?) +} \ No newline at end of file diff --git a/easyadv/src/main/java/com/espoir/easyadv/interceptor/AdvInterceptorManager.kt b/easyadv/src/main/java/com/espoir/easyadv/interceptor/AdvInterceptorManager.kt new file mode 100644 index 0000000..fdb6f2a --- /dev/null +++ b/easyadv/src/main/java/com/espoir/easyadv/interceptor/AdvInterceptorManager.kt @@ -0,0 +1,48 @@ +package com.espoir.easyadv.interceptor + +class AdvInterceptorManager { + private var interceptors = mutableListOf() + + fun attachInterceptors(interceptors: MutableList) { + this.interceptors.clear() + this.interceptors.addAll(interceptors) + } + + fun handlerInterceptor(map: HashMap?, callback: AdvInterceptCallback?) { + if (interceptors.isEmpty()) { + callback?.onNext(map) + } else { + runCatching { + doInterceptor(0, map, callback) + }.onFailure { + callback?.onInterrupt(it.message) + } + } + } + + private fun doInterceptor(index: Int, map: HashMap?, callback: AdvInterceptCallback?) { + if (index < interceptors.size) { + val interceptor = interceptors[index] + doInterceptImpl(interceptor, index, map, callback) + } else { + callback?.onNext(map) + } + } + + private fun doInterceptImpl( + interceptor: AdvInterceptor, + index: Int, + map: HashMap?, + callback: AdvInterceptCallback? + ) { + interceptor.process(map, object : AdvInterceptCallback { + override fun onNext(map: HashMap?) { + doInterceptor(index + 1, map, callback) + } + + override fun onInterrupt(msg: String?) { + callback?.onInterrupt(msg) + } + }) + } +} \ No newline at end of file